2 * Copyright (C) 2005-2011 Atsushi Konno All rights reserved.
3 * Copyright (C) 2005 QSDN,Inc. All rights reserved.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 #include "chxj_add_device_env.h"
19 #include "chxj_str_util.h"
22 chxj_add_device_env(request_rec *r, device_table *spec)
24 DBG(r, "REQ[%X] start chxj_add_device_env()", (unsigned int)(apr_size_t)r);
25 switch(spec->html_spec_type) {
26 case CHXJ_SPEC_Chtml_1_0:
27 case CHXJ_SPEC_Chtml_2_0:
28 case CHXJ_SPEC_Chtml_3_0:
29 case CHXJ_SPEC_Chtml_4_0:
30 case CHXJ_SPEC_Chtml_5_0:
31 case CHXJ_SPEC_Chtml_6_0:
32 case CHXJ_SPEC_Chtml_7_0:
33 case CHXJ_SPEC_docomo_android:
34 apr_table_setn(r->headers_in, HTTP_X_CHXJ_PROVIDER, "1");
35 apr_table_setn(r->headers_in, HTTP_X_CHXJ_PROVIDER_STRING, "docomo");
37 case CHXJ_SPEC_XHtml_Mobile_1_0:
39 case CHXJ_SPEC_au_android:
40 apr_table_setn(r->headers_in, HTTP_X_CHXJ_PROVIDER, "2");
41 apr_table_setn(r->headers_in, HTTP_X_CHXJ_PROVIDER_STRING, "au");
44 case CHXJ_SPEC_Jxhtml:
45 case CHXJ_SPEC_iPhone2:
46 case CHXJ_SPEC_iPhone3:
47 case CHXJ_SPEC_iPhone4:
48 case CHXJ_SPEC_softbank_android:
49 apr_table_setn(r->headers_in, HTTP_X_CHXJ_PROVIDER, "3");
50 apr_table_setn(r->headers_in, HTTP_X_CHXJ_PROVIDER_STRING, "SoftBank");
52 case CHXJ_SPEC_android:
54 apr_table_setn(r->headers_in, HTTP_X_CHXJ_PROVIDER, "0");
55 apr_table_setn(r->headers_in, HTTP_X_CHXJ_PROVIDER_STRING, "unknown");
59 apr_table_setn(r->headers_in, HTTP_X_CHXJ_DEVICEID, apr_pstrdup(r->pool, spec->device_id));
60 apr_table_setn(r->headers_in, HTTP_X_CHXJ_DEVICENAME, apr_pstrdup(r->pool, spec->device_name));
62 switch(spec->html_spec_type) {
63 case CHXJ_SPEC_Chtml_1_0: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "CHTML1.0"); break;
64 case CHXJ_SPEC_Chtml_2_0: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "CHTML2.0"); break;
65 case CHXJ_SPEC_Chtml_3_0: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "CHTML3.0"); break;
66 case CHXJ_SPEC_Chtml_4_0: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "CHTML4.0"); break;
67 case CHXJ_SPEC_Chtml_5_0: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "CHTML5.0"); break;
68 case CHXJ_SPEC_Chtml_6_0: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "CHTML6.0"); break;
69 case CHXJ_SPEC_Chtml_7_0: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "CHTML7.0"); break;
70 case CHXJ_SPEC_XHtml_Mobile_1_0: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "XHTML"); break;
71 case CHXJ_SPEC_Hdml: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "HDML"); break;
72 case CHXJ_SPEC_Jhtml: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "JHTML"); break;
73 case CHXJ_SPEC_Jxhtml: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "JXHTML"); break;
74 case CHXJ_SPEC_iPhone2: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "iPhone2"); break;
75 case CHXJ_SPEC_iPhone3: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "iPhone3"); break;
76 case CHXJ_SPEC_iPhone4: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "iPhone4"); break;
77 case CHXJ_SPEC_softbank_android: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "android"); break;
78 case CHXJ_SPEC_au_android: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "android"); break;
79 case CHXJ_SPEC_docomo_android: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "android"); break;
80 case CHXJ_SPEC_android: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "android"); break;
81 default: apr_table_setn(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE, "UNKNOWN"); break;
84 apr_table_setn(r->headers_in, HTTP_X_CHXJ_WIDTH, apr_psprintf(r->pool, "%d", spec->width));
85 apr_table_setn(r->headers_in, HTTP_X_CHXJ_HEIGHT, apr_psprintf(r->pool, "%d", spec->heigh));
86 apr_table_setn(r->headers_in, HTTP_X_CHXJ_GIF, (spec->available_gif == 0) ? "false" : "true");
87 apr_table_setn(r->headers_in, HTTP_X_CHXJ_JPEG, (spec->available_jpeg == 0) ? "false" : "true");
88 apr_table_setn(r->headers_in, HTTP_X_CHXJ_PNG, (spec->available_png == 0) ? "false" : "true");
89 apr_table_setn(r->headers_in, HTTP_X_CHXJ_BMP2, (spec->available_bmp2 == 0) ? "false" : "true");
90 apr_table_setn(r->headers_in, HTTP_X_CHXJ_BMP4, (spec->available_bmp4 == 0) ? "false" : "true");
91 apr_table_setn(r->headers_in, HTTP_X_CHXJ_COLOR, apr_psprintf(r->pool, "%d", spec->color));
92 apr_table_setn(r->headers_in, HTTP_X_CHXJ_WP_WIDTH, apr_psprintf(r->pool, "%d", spec->wp_width));
93 apr_table_setn(r->headers_in, HTTP_X_CHXJ_WP_HEIGHT,apr_psprintf(r->pool, "%d", spec->wp_heigh));
94 apr_table_setn(r->headers_in, HTTP_X_CHXJ_CACHE, apr_psprintf(r->pool, "%d", spec->cache));
95 apr_table_setn(r->headers_in, HTTP_X_CHXJ_DPI_WIDTH, apr_psprintf(r->pool, "%d", spec->dpi_width));
96 apr_table_setn(r->headers_in, HTTP_X_CHXJ_DPI_HEIGHT, apr_psprintf(r->pool, "%d", spec->dpi_heigh));
97 apr_table_setn(r->headers_in, HTTP_X_CHXJ_EMOJI_TYPE, (spec->emoji_type) ? spec->emoji_type : "");
99 apr_table_setn(r->headers_in, HTTP_X_CHXJ_VERSION, apr_pstrdup(r->pool, PACKAGE_VERSION));
101 mod_chxj_config* dconf;
102 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
103 if (dconf->detect_device_type == CHXJ_ADD_DETECT_DEVICE_TYPE_TSV ){
104 if (spec->device_id != NULL &&
105 dconf->device_hash != NULL){
106 char *key = apr_psprintf(r->pool,"%d.%s",spec->provider,spec->device_id);
107 apr_table_t *ht = apr_hash_get(dconf->device_hash,key,APR_HASH_KEY_STRING);
111 for ( i=0; i< dconf->device_keys->nelts; i++){
112 const char *k = ((const char**)dconf->device_keys->elts)[i];
113 char *val = (char *)apr_table_get(ht,k);
115 char *info_key = apr_psprintf(r->pool,"%s-%s",HTTP_X_CHXJ_INFO,k);
116 apr_table_setn(r->headers_in, info_key, val);
123 DBG(r, "REQ[%X] end chxj_add_device_env()", (unsigned int)(apr_size_t)r);
127 chxj_get_device_env(request_rec *r)
131 DBG(r, "REQ[%X] start chxj_get_device_env()", (unsigned int)(apr_size_t)r);
133 spec = apr_palloc(r->pool, sizeof(device_table));
134 tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE);
136 DBG(r, "REQ[%X] end chxj_get_device_env()", (unsigned int)(apr_size_t)r);
139 if (STRCASEEQ('c','C', "CHTML1.0", tmp)) {
140 spec->html_spec_type = CHXJ_SPEC_Chtml_1_0;
142 else if (STRCASEEQ('c','C', "CHTML2.0", tmp)) {
143 spec->html_spec_type = CHXJ_SPEC_Chtml_2_0;
145 else if (STRCASEEQ('c','C', "CHTML3.0", tmp)) {
146 spec->html_spec_type = CHXJ_SPEC_Chtml_3_0;
148 else if (STRCASEEQ('c','C', "CHTML4.0", tmp)) {
149 spec->html_spec_type = CHXJ_SPEC_Chtml_4_0;
151 else if (STRCASEEQ('c','C', "CHTML5.0", tmp)) {
152 spec->html_spec_type = CHXJ_SPEC_Chtml_5_0;
154 else if (STRCASEEQ('c','C', "CHTML6.0", tmp)) {
155 spec->html_spec_type = CHXJ_SPEC_Chtml_6_0;
157 else if (STRCASEEQ('c','C', "CHTML7.0", tmp)) {
158 spec->html_spec_type = CHXJ_SPEC_Chtml_7_0;
160 else if (STRCASEEQ('x','X', "XHTML", tmp)) {
161 spec->html_spec_type = CHXJ_SPEC_XHtml_Mobile_1_0;
163 else if (STRCASEEQ('h','H', "HDML", tmp)) {
164 spec->html_spec_type = CHXJ_SPEC_Hdml;
166 else if (STRCASEEQ('j','j', "JHTML", tmp)) {
167 spec->html_spec_type = CHXJ_SPEC_Jhtml;
169 else if (STRCASEEQ('j','j', "JXHTML", tmp)) {
170 spec->html_spec_type = CHXJ_SPEC_Jxhtml;
172 else if (STRCASEEQ('j','j', "iPhone2", tmp)) {
173 spec->html_spec_type = CHXJ_SPEC_iPhone2;
175 else if (STRCASEEQ('j','j', "iPhone3", tmp)) {
176 spec->html_spec_type = CHXJ_SPEC_iPhone3;
178 else if (STRCASEEQ('j','j', "iPhone4", tmp)) {
179 spec->html_spec_type = CHXJ_SPEC_iPhone4;
181 else if (STRCASEEQ('a','A', "android", tmp)) {
182 char *prov = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_PROVIDER);
183 if (prov && *prov == '1') {
184 spec->html_spec_type = CHXJ_SPEC_docomo_android;
186 else if (prov && *prov == '2') {
187 spec->html_spec_type = CHXJ_SPEC_au_android;
189 else if (prov && *prov == '3') {
190 spec->html_spec_type = CHXJ_SPEC_softbank_android;
193 spec->html_spec_type = CHXJ_SPEC_android;
197 spec->html_spec_type = CHXJ_SPEC_UNKNOWN;
200 tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_DEVICEID);
202 spec->device_id = apr_pstrdup(r->pool, tmp);
205 spec->device_id = apr_pstrdup(r->pool, "");
208 tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_DEVICENAME);
210 spec->device_name = apr_pstrdup(r->pool, tmp);
213 spec->device_name = apr_pstrdup(r->pool, "UNKNOWN");
216 tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_WIDTH);
218 spec->width = chxj_atoi(tmp);
224 tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_HEIGHT);
226 spec->heigh = chxj_atoi(tmp);
232 tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_GIF);
233 if (STRCASEEQ('t','T',"true",tmp)) {
234 spec->available_gif = 1;
237 spec->available_gif = 0;
240 tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_JPEG);
241 if (STRCASEEQ('t','T',"true",tmp)) {
242 spec->available_jpeg = 1;
245 spec->available_jpeg = 0;
248 tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_PNG);
249 if (STRCASEEQ('t','T',"true",tmp)) {
250 spec->available_png = 1;
253 spec->available_png = 0;
256 tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_BMP2);
257 if (STRCASEEQ('t','T',"true",tmp)) {
258 spec->available_bmp2 = 1;
261 spec->available_bmp2 = 0;
264 tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_BMP4);
265 if (STRCASEEQ('t','T',"true",tmp)) {
266 spec->available_bmp4 = 1;
269 spec->available_bmp4 = 0;
272 tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_COLOR);
274 spec->color = chxj_atoi(tmp);
277 spec->color = 15680000;
280 tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_WP_WIDTH);
282 spec->wp_width = chxj_atoi(tmp);
285 spec->wp_width = 640;
288 tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_WP_HEIGHT);
290 spec->wp_heigh = chxj_atoi(tmp);
293 spec->wp_heigh = 480;
296 tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_CACHE);
298 spec->cache = chxj_atoi(tmp);
301 spec->cache = 10000000;
304 tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_DPI_WIDTH);
306 spec->dpi_width = chxj_atoi(tmp);
309 spec->dpi_width = 96;
312 tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_DPI_HEIGHT);
314 spec->dpi_heigh = chxj_atoi(tmp);
317 spec->dpi_heigh = 96;
320 tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_EMOJI_TYPE);
322 spec->emoji_type = apr_pstrdup(r->pool, tmp);
325 spec->emoji_type = apr_pstrdup(r->pool, "");
328 DBG(r, "REQ[%X] end chxj_get_device_env()", (unsigned int)(apr_size_t)r);