OSDN Git Service

Some Y! phone doesn't support istyle, So write both ( "istyle" and "-wap-input-style" )
[modchxj/mod_chxj.git] / src / chxj_load_device_data.c
old mode 100644 (file)
new mode 100755 (executable)
index b4b3d8b..980d43d
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005-2008 Atsushi Konno All rights reserved.
+ * Copyright (C) 2005-2009 Atsushi Konno All rights reserved.
  * Copyright (C) 2005 QSDN,Inc. All rights reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
 
 
 static void s_set_devices_data(
-  Doc*             doc, 
-  apr_pool_t*      p, 
-  mod_chxj_configconf, 
-  Node*            node) ;
+  Doc              *doc, 
+  apr_pool_t       *p, 
+  mod_chxj_config  *conf, 
+  Node             *node) ;
 
 static void s_set_user_agent_data(
-  Doc*             doc, 
-  apr_pool_t*      p, 
-  mod_chxj_configconf, 
-  Node*            node);
+  Doc              *doc, 
+  apr_pool_t       *p, 
+  mod_chxj_config  *conf, 
+  Node             *node);
 
 static void s_set_device_data(
-  Doc*        doc, 
-  apr_pool_tp, 
-  device_table_listdtl, 
-  Nodenode) ;
+  Doc               *doc, 
+  apr_pool_t        *p, 
+  device_table_list *dtl, 
+  Node              *node) ;
 
 
 /**
  * load device_data.xml
  */
 void
-chxj_load_device_data(Doc* doc, apr_pool_t *p, mod_chxj_config* conf) 
+chxj_load_device_data(Doc *doc, apr_pool_t *p, mod_chxj_config *conf) 
 {
   conf->devices = NULL;
   s_set_devices_data(doc, p, conf,qs_get_root(doc));
@@ -60,20 +60,17 @@ chxj_load_device_data(Doc* doc, apr_pool_t *p, mod_chxj_config* conf)
  * <devices>
  */
 static void
-s_set_devices_data(Doc* doc, apr_pool_t* p, mod_chxj_config* conf, Node* node) 
+s_set_devices_data(Doc *doc, apr_pool_t *p, mod_chxj_config *conf, Node *node) 
 {
-  Nodechild;
+  Node *child;
 
   for (child = qs_get_child_node(doc,node); 
        child ; 
        child = qs_get_next_node(doc,child)) {
-
-    char* name;
-
-    name = qs_get_node_name(doc,child);
-
-    if ((*name == 'd' || *name == 'D') && strcasecmp(name, "devices") == 0)
+    char *name = qs_get_node_name(doc,child);
+    if (STRCASEEQ('d','D',"devices",name)) {
       s_set_user_agent_data(doc, p, conf, child);
+    }
   }
 }
 
@@ -81,22 +78,18 @@ s_set_devices_data(Doc* doc, apr_pool_t* p, mod_chxj_config* conf, Node* node)
  * <user_agent>
  */
 static void
-s_set_user_agent_data(Doc* doc, apr_pool_t* p, mod_chxj_config* conf, Node* node) 
+s_set_user_agent_data(Doc *doc, apr_pool_t *p, mod_chxj_config *conf, Node *node) 
 {
-  Node*              child;
-  device_table_listt;
+  Node              *child;
+  device_table_list *t;
 
   for (child = qs_get_child_node(doc,node);
        child ;
        child = qs_get_next_node(doc,child)) {
-
-    char* name;
-
-    name = qs_get_node_name(doc,child);
-
-    if ((*name == 'u' || *name == 'U') && strcasecmp(name, "user_agent") == 0 ) {
-      Attr* attr;
-      device_table_list* dtl;
+    char *name = qs_get_node_name(doc,child);
+    if (STRCASEEQ('u','U',"user_agent",name)) {
+      Attr *attr;
+      device_table_list *dtl;
 
       if (! conf->devices) {
         conf->devices = apr_pcalloc(p, sizeof(device_table_list));
@@ -122,10 +115,9 @@ s_set_user_agent_data(Doc* doc, apr_pool_t* p, mod_chxj_config* conf, Node* node
       for (attr = qs_get_attr(doc,child); 
            attr ; 
            attr = qs_get_next_attr(doc,attr)) {
+        char *attr_name = qs_get_attr_name(doc,attr);
 
-        char* attr_name = qs_get_attr_name(doc,attr);
-
-        if ((*attr_name == 'p' || *attr_name == 'P') && strcasecmp(attr_name, "pattern") == 0) {
+        if (STRCASEEQ('p','P',"pattern",attr_name)) {
             dtl->pattern = apr_pstrdup(p, qs_get_attr_value(doc,attr));
             dtl->regexp = ap_pregcomp(p, (const char *)dtl->pattern, AP_REG_EXTENDED|AP_REG_ICASE);
         }
@@ -135,14 +127,16 @@ s_set_user_agent_data(Doc* doc, apr_pool_t* p, mod_chxj_config* conf, Node* node
   }
 }
 
+
 static void
-s_set_device_data(Doc* doc, apr_pool_t* p, device_table_list* dtl, Node* node) 
+s_set_device_data(Doc *doc, apr_pool_t *p, device_table_list *dtl, Node *node) 
 {
-  Nodechild;
-  device_tabledt;
+  Node         *child;
+  device_table *dt;
 
   dt = apr_pcalloc(p, sizeof(device_table));
   dt->next           = NULL;
+  dt->provider       = CHXJ_PROVIDER_UNKNOWN;
   dt->device_id      = NULL;
   dt->device_name    = NULL;
   dt->html_spec_type = CHXJ_SPEC_Chtml_3_0;
@@ -159,8 +153,7 @@ s_set_device_data(Doc* doc, apr_pool_t* p, device_table_list* dtl, Node* node)
   for (child = qs_get_child_node(doc,node); 
        child ;
        child = qs_get_next_node(doc,child)) {
-    char* name = qs_get_node_name(doc,child);
-
+    char *name = qs_get_node_name(doc,child);
     switch (*name) {
     case 'd':
     case 'D':
@@ -221,47 +214,52 @@ s_set_device_data(Doc* doc, apr_pool_t* p, device_table_list* dtl, Node* node)
     case 'h':
     case 'H':
       if (strcasecmp(name, "html_spec_type") == 0) {
-        Nodech = qs_get_child_node(doc, child);
+        Node *ch = qs_get_child_node(doc, child);
         if (ch &&  strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
-          charvv = qs_get_node_value(doc, ch);
-          if (strcasecmp(vv, "xhtml_mobile_1_0") == 0) {
+          char *vv = qs_get_node_value(doc, ch);
+          if (STRCASEEQ('x','X',"xhtml_mobile_1_0",vv)) {
             dt->html_spec_type = CHXJ_SPEC_XHtml_Mobile_1_0;
+            dt->provider       = CHXJ_PROVIDER_AU;
           }
-          else
-          if (strcasecmp(vv, "chtml_1_0") == 0) {
+          else if (STRCASEEQ('c','C',"chtml_1_0",vv)) {
             dt->html_spec_type = CHXJ_SPEC_Chtml_1_0;
+            dt->provider       = CHXJ_PROVIDER_DOCOMO;
           }
-          else
-          if (strcasecmp(vv, "chtml_2_0") == 0) {
+          else if (STRCASEEQ('c','C',"chtml_2_0",vv)) {
             dt->html_spec_type = CHXJ_SPEC_Chtml_2_0;
+            dt->provider       = CHXJ_PROVIDER_DOCOMO;
           }
-          else
-          if (strcasecmp(vv, "chtml_3_0") == 0) {
+          else if (STRCASEEQ('c','C',"chtml_3_0",vv)) {
             dt->html_spec_type = CHXJ_SPEC_Chtml_3_0;
+            dt->provider       = CHXJ_PROVIDER_DOCOMO;
           }
-          else
-          if (strcasecmp(vv, "chtml_4_0") == 0) {
+          else if (STRCASEEQ('c','C',"chtml_4_0",vv)) {
             dt->html_spec_type = CHXJ_SPEC_Chtml_4_0;
+            dt->provider       = CHXJ_PROVIDER_DOCOMO;
           }
-          else
-          if (strcasecmp(vv, "chtml_5_0") == 0) {
+          else if (STRCASEEQ('c','C',"chtml_5_0",vv)) {
             dt->html_spec_type = CHXJ_SPEC_Chtml_5_0;
+            dt->provider       = CHXJ_PROVIDER_DOCOMO;
           }
-          else
-          if (strcasecmp(vv, "chtml_6_0") == 0) {
+          else if (STRCASEEQ('c','C',"chtml_6_0",vv)) {
             dt->html_spec_type = CHXJ_SPEC_Chtml_6_0;
+            dt->provider       = CHXJ_PROVIDER_DOCOMO;
           }
-          else
-          if (strcasecmp(vv, "chtml_7_0") == 0) {
+          else if (STRCASEEQ('c','C',"chtml_7_0",vv)) {
             dt->html_spec_type = CHXJ_SPEC_Chtml_7_0;
+            dt->provider       = CHXJ_PROVIDER_DOCOMO;
           }
-          else
-          if (strcasecmp(vv, "hdml") == 0) {
+          else if (STRCASEEQ('h','H',"hdml",vv)) {
             dt->html_spec_type = CHXJ_SPEC_Hdml;
+            dt->provider       = CHXJ_PROVIDER_AU;
           }
-          else
-          if (strcasecmp(vv, "jhtml") == 0) {
+          else if (STRCASEEQ('j','J',"jhtml",vv)) {
             dt->html_spec_type = CHXJ_SPEC_Jhtml;
+            dt->provider       = CHXJ_PROVIDER_SOFTBANK;
+          }
+          else if (STRCASEEQ('j','J',"jxhtml",vv)) {
+            dt->html_spec_type = CHXJ_SPEC_Jxhtml;
+            dt->provider       = CHXJ_PROVIDER_SOFTBANK;
           }
         }
       }
@@ -288,7 +286,7 @@ s_set_device_data(Doc* doc, apr_pool_t* p, device_table_list* dtl, Node* node)
     case 'w':
     case 'W':
       if (strcasecmp(name, "width") == 0) {
-        Nodech = qs_get_child_node(doc, child);
+        Node *ch = qs_get_child_node(doc, child);
         if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
           char *vv = qs_get_node_value(doc,ch);
           unsigned int ii;
@@ -305,7 +303,7 @@ s_set_device_data(Doc* doc, apr_pool_t* p, device_table_list* dtl, Node* node)
       }
       else
       if (strcasecmp(name, "wp_width") == 0) {
-        Nodech = qs_get_child_node(doc, child);
+        Node *ch = qs_get_child_node(doc, child);
         if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
           char *vv = qs_get_node_value(doc,ch);
           unsigned int ii;
@@ -323,7 +321,7 @@ s_set_device_data(Doc* doc, apr_pool_t* p, device_table_list* dtl, Node* node)
       }
       else
       if (strcasecmp(name, "wp_heigh") == 0) {
-        Nodech = qs_get_child_node(doc, child);
+        Node *ch = qs_get_child_node(doc, child);
         if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
           char *vv = qs_get_node_value(doc,ch);
           unsigned int ii;
@@ -344,7 +342,7 @@ s_set_device_data(Doc* doc, apr_pool_t* p, device_table_list* dtl, Node* node)
     case 'g':
     case 'G':
       if (strcasecmp(name, "gif") == 0) {
-        Nodech = qs_get_child_node(doc, child);
+        Node *ch = qs_get_child_node(doc, child);
         if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
           char *vv = qs_get_node_value(doc,ch);
   
@@ -359,7 +357,7 @@ s_set_device_data(Doc* doc, apr_pool_t* p, device_table_list* dtl, Node* node)
     case 'j':
     case 'J':
       if (strcasecmp(name, "jpeg") == 0 || strcasecmp(name, "jpg") == 0) {
-        Nodech = qs_get_child_node(doc, child);
+        Node *ch = qs_get_child_node(doc, child);
         if (ch != NULL && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
           char *vv = qs_get_node_value(doc,ch);
   
@@ -374,7 +372,7 @@ s_set_device_data(Doc* doc, apr_pool_t* p, device_table_list* dtl, Node* node)
     case 'p':
     case 'P':
       if (strcasecmp(name, "png") == 0) {
-        Nodech = qs_get_child_node(doc, child);
+        Node *ch = qs_get_child_node(doc, child);
         if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
           char *vv = qs_get_node_value(doc,ch);
   
@@ -389,7 +387,7 @@ s_set_device_data(Doc* doc, apr_pool_t* p, device_table_list* dtl, Node* node)
     case 'b':
     case 'B':
       if (strcasecmp(name, "bmp2") == 0) {
-        Nodech = qs_get_child_node(doc, child);
+        Node *ch = qs_get_child_node(doc, child);
         if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
           char *vv = qs_get_node_value(doc,ch);
   
@@ -401,7 +399,7 @@ s_set_device_data(Doc* doc, apr_pool_t* p, device_table_list* dtl, Node* node)
       }
       else
       if (strcasecmp(name, "bmp4") == 0) {
-        Nodech = qs_get_child_node(doc, child);
+        Node *ch = qs_get_child_node(doc, child);
         if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
           char *vv = qs_get_node_value(doc,ch);
   
@@ -416,7 +414,7 @@ s_set_device_data(Doc* doc, apr_pool_t* p, device_table_list* dtl, Node* node)
     case 'c':
     case 'C':
       if (strcasecmp(name, "color") == 0) {
-        Nodech = qs_get_child_node(doc, child);
+        Node *ch = qs_get_child_node(doc, child);
         if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
           char *vv = qs_get_node_value(doc,ch);
   
@@ -428,7 +426,7 @@ s_set_device_data(Doc* doc, apr_pool_t* p, device_table_list* dtl, Node* node)
       }
       else
       if (strcasecmp(name, "cache") == 0) {
-        Nodech = qs_get_child_node(doc, child);
+        Node *ch = qs_get_child_node(doc, child);
         if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
           char *vv = qs_get_node_value(doc,ch);
           unsigned int ii;
@@ -449,7 +447,7 @@ s_set_device_data(Doc* doc, apr_pool_t* p, device_table_list* dtl, Node* node)
     case 'e':
     case 'E':
       if (strcasecmp(name, "emoji_type") == 0) {
-        Nodech = qs_get_child_node(doc, child);
+        Node *ch = qs_get_child_node(doc, child);
         if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) 
           dt->emoji_type = apr_pstrdup(p, qs_get_node_value(doc, ch));
       }
@@ -470,6 +468,87 @@ s_set_device_data(Doc* doc, apr_pool_t* p, device_table_list* dtl, Node* node)
     }
   }
 }
+
+/**
+ * load device_data.xml
+ */
+void
+chxj_load_device_tsv_data(apr_file_t *fp,apr_pool_t *p, mod_chxj_config *conf) 
+{
+  apr_status_t st;
+  
+  char *pstat;
+  char *pair;
+  
+  char *line = apr_palloc(p,256);
+  
+  int is_header = 1;
+  int keynum = 0;
+  int valnum = 0;
+  
+  conf->device_keys = apr_array_make(p,2, sizeof(const char*));
+  conf->device_hash = apr_hash_make(p);
+  
+  while(APR_EOF != (st=apr_file_eof(fp))){
+    st = apr_file_gets(line,1024,fp);
+    if(st == APR_SUCCESS){
+      if(is_header){
+        keynum=0;
+        
+        for(pair = apr_strtok(line,"\t",&pstat); pair != NULL; pair = apr_strtok(NULL,"\t",&pstat)){
+          apr_collapse_spaces(pair,pair);
+          if(keynum < 128){
+            *(const char**)apr_array_push(conf->device_keys) = apr_pstrdup(p,pair);
+          }
+          
+          //ap_log_error(APLOG_MARK, APLOG_CRIT, 0, NULL, "V[[%s]]", pair);
+          keynum++;
+        }
+        is_header = 0;
+      }
+      else{
+        apr_table_t *tsv_table = apr_table_make(p,keynum);
+        valnum = 0;
+        char *uid = NULL;
+        char *provider = NULL;
+        for(pair = apr_strtok(line,"\t",&pstat); pair != NULL; pair = apr_strtok(NULL,"\t",&pstat)){
+          apr_collapse_spaces(pair,pair);
+          if(valnum < keynum){
+            const char *kn = ((const char**)conf->device_keys->elts)[valnum];
+            if(strcasecmp("-",pair) != 0){
+              apr_table_set(tsv_table,kn,pair);
+              if(strcasecmp(kn,"device_id") == 0){
+                uid = apr_pstrdup(p,pair);
+              }
+              else if(strcasecmp(kn,"provider") == 0){
+                if(strcasecmp(pair,"docomo") == 0){
+                  provider = "1";
+                }
+                else if(strcasecmp(pair,"au") == 0){
+                  provider = "2";
+                }
+                else if(strcasecmp(pair,"softbank") == 0){
+                  provider = "3";
+                }
+                else{
+                  provider = apr_pstrdup(p,pair);
+                }
+              }
+              //ap_log_error(APLOG_MARK, APLOG_CRIT, 0, NULL, "[%s] %d:V[%s] = [%s]", uid,valnum,kn,pair);
+            }
+          }
+          valnum++;
+        }
+        if(uid != NULL && *uid && provider != NULL && *provider){
+          char *key = apr_psprintf(p,"%s.%s",provider,uid);
+          //ap_log_error(APLOG_MARK, APLOG_CRIT, 0, NULL, "save hash [%s]",key );
+          apr_hash_set(conf->device_hash,key,APR_HASH_KEY_STRING,tsv_table);
+        }
+      }
+    }
+  }
+}
+
 /*
  * vim:ts=2 et
  */