OSDN Git Service

* This is a test commit.
[modchxj/mod_chxj.git] / src / chxj_add_device_env.c
1 /*
2  * Copyright (C) 2005-2011 Atsushi Konno All rights reserved.
3  * Copyright (C) 2005 QSDN,Inc. All rights reserved.
4  *
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
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  */
17 #include "mod_chxj.h"
18 #include "chxj_add_device_env.h"
19 #include "chxj_str_util.h"
20
21 void
22 chxj_add_device_env(request_rec *r, device_table *spec)
23 {
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");
36     break;
37   case CHXJ_SPEC_XHtml_Mobile_1_0:
38   case CHXJ_SPEC_Hdml:
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");
42     break;
43   case CHXJ_SPEC_Jhtml:
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");
51     break;
52   case CHXJ_SPEC_android:
53   default:
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");
56     break;
57   }
58
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));
61
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;
82   }
83
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 : "");
98
99   apr_table_setn(r->headers_in, HTTP_X_CHXJ_VERSION,  apr_pstrdup(r->pool, PACKAGE_VERSION));
100   
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);
108   
109       if(ht != NULL){
110         int i;
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);
114           if(val != NULL){
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);
117           }
118         }
119       }
120     }
121   }
122
123   DBG(r, "REQ[%X] end chxj_add_device_env()", (unsigned int)(apr_size_t)r);
124 }
125
126 device_table *
127 chxj_get_device_env(request_rec *r)
128 {
129   device_table *spec;
130   char *tmp;
131   DBG(r, "REQ[%X] start chxj_get_device_env()", (unsigned int)(apr_size_t)r);
132
133   spec = apr_palloc(r->pool, sizeof(device_table));
134   tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_HTMLSPECTYPE);
135   if (! tmp) {
136     DBG(r, "REQ[%X] end chxj_get_device_env()", (unsigned int)(apr_size_t)r);
137     return NULL;
138   }
139   if (STRCASEEQ('c','C', "CHTML1.0", tmp)) {
140     spec->html_spec_type = CHXJ_SPEC_Chtml_1_0;
141   }
142   else if (STRCASEEQ('c','C', "CHTML2.0", tmp)) {
143     spec->html_spec_type = CHXJ_SPEC_Chtml_2_0;
144   }
145   else if (STRCASEEQ('c','C', "CHTML3.0", tmp)) {
146     spec->html_spec_type = CHXJ_SPEC_Chtml_3_0;
147   }
148   else if (STRCASEEQ('c','C', "CHTML4.0", tmp)) {
149     spec->html_spec_type = CHXJ_SPEC_Chtml_4_0;
150   }
151   else if (STRCASEEQ('c','C', "CHTML5.0", tmp)) {
152     spec->html_spec_type = CHXJ_SPEC_Chtml_5_0;
153   }
154   else if (STRCASEEQ('c','C', "CHTML6.0", tmp)) {
155     spec->html_spec_type = CHXJ_SPEC_Chtml_6_0;
156   }
157   else if (STRCASEEQ('c','C', "CHTML7.0", tmp)) {
158     spec->html_spec_type = CHXJ_SPEC_Chtml_7_0;
159   }
160   else if (STRCASEEQ('x','X', "XHTML", tmp)) {
161     spec->html_spec_type = CHXJ_SPEC_XHtml_Mobile_1_0;
162   }
163   else if (STRCASEEQ('h','H', "HDML", tmp)) {
164     spec->html_spec_type = CHXJ_SPEC_Hdml;
165   }
166   else if (STRCASEEQ('j','j', "JHTML", tmp)) {
167     spec->html_spec_type = CHXJ_SPEC_Jhtml;
168   }
169   else if (STRCASEEQ('j','j', "JXHTML", tmp)) {
170     spec->html_spec_type = CHXJ_SPEC_Jxhtml;
171   }
172   else if (STRCASEEQ('j','j', "iPhone2", tmp)) {
173     spec->html_spec_type = CHXJ_SPEC_iPhone2;
174   }
175   else if (STRCASEEQ('j','j', "iPhone3", tmp)) {
176     spec->html_spec_type = CHXJ_SPEC_iPhone3;
177   }
178   else if (STRCASEEQ('j','j', "iPhone4", tmp)) {
179     spec->html_spec_type = CHXJ_SPEC_iPhone4;
180   }
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;
185     }
186     else if (prov && *prov == '2') {
187       spec->html_spec_type = CHXJ_SPEC_au_android;
188     }
189     else if (prov && *prov == '3') {
190       spec->html_spec_type = CHXJ_SPEC_softbank_android;
191     }
192     else {
193       spec->html_spec_type = CHXJ_SPEC_android;
194     }
195   }
196   else {
197     spec->html_spec_type = CHXJ_SPEC_UNKNOWN;
198   }
199   
200   tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_DEVICEID);
201   if (tmp) {
202     spec->device_id = apr_pstrdup(r->pool, tmp);
203   }
204   else {
205     spec->device_id = apr_pstrdup(r->pool, "");
206   }
207
208   tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_DEVICENAME);
209   if (tmp) {
210     spec->device_name = apr_pstrdup(r->pool, tmp);
211   }
212   else {
213     spec->device_name = apr_pstrdup(r->pool, "UNKNOWN");
214   }
215
216   tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_WIDTH);
217   if (tmp) {
218     spec->width = chxj_atoi(tmp); 
219   }
220   else {
221     spec->width = 640;
222   }
223
224   tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_HEIGHT);
225   if (tmp) {
226     spec->heigh = chxj_atoi(tmp); 
227   }
228   else {
229     spec->heigh = 480; 
230   }
231
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;
235   }
236   else {
237     spec->available_gif = 0;
238   }
239
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;
243   }
244   else {
245     spec->available_jpeg = 0;
246   }
247
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;
251   }
252   else {
253     spec->available_png = 0;
254   }
255
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;
259   }
260   else {
261     spec->available_bmp2 = 0;
262   }
263
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;
267   }
268   else {
269     spec->available_bmp4 = 0;
270   }
271
272   tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_COLOR);
273   if (tmp) {
274     spec->color = chxj_atoi(tmp); 
275   }
276   else {
277     spec->color = 15680000; 
278   }
279
280   tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_WP_WIDTH);
281   if (tmp) {
282     spec->wp_width = chxj_atoi(tmp); 
283   }
284   else {
285     spec->wp_width = 640; 
286   }
287
288   tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_WP_HEIGHT);
289   if (tmp) {
290     spec->wp_heigh = chxj_atoi(tmp); 
291   }
292   else {
293     spec->wp_heigh = 480; 
294   }
295
296   tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_CACHE);
297   if (tmp) {
298     spec->cache = chxj_atoi(tmp); 
299   }
300   else {
301     spec->cache = 10000000; 
302   }
303
304   tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_DPI_WIDTH);
305   if (tmp) {
306     spec->dpi_width = chxj_atoi(tmp); 
307   }
308   else {
309     spec->dpi_width = 96;
310   }
311
312   tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_DPI_HEIGHT);
313   if (tmp) {
314     spec->dpi_heigh = chxj_atoi(tmp); 
315   }
316   else {
317     spec->dpi_heigh = 96;
318   }
319
320   tmp = (char *)apr_table_get(r->headers_in, HTTP_X_CHXJ_EMOJI_TYPE);
321   if (tmp) {
322     spec->emoji_type = apr_pstrdup(r->pool, tmp);
323   }
324   else {
325     spec->emoji_type = apr_pstrdup(r->pool, "");
326   }
327
328   DBG(r, "REQ[%X] end chxj_get_device_env()", (unsigned int)(apr_size_t)r);
329   return spec;
330 }