/*
- * 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_config* conf,
- 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_config* conf,
- Node* node);
+ 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) ;
+ 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));
* <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)
{
- Node* child;
+ 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);
+ }
}
}
* <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_list* t;
+ 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));
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);
}
}
}
+
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)
{
- Node* child;
- device_table* dt;
+ 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;
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':
case 'h':
case 'H':
if (strcasecmp(name, "html_spec_type") == 0) {
- Node* ch = 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);
- 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;
}
}
}
case 'w':
case 'W':
if (strcasecmp(name, "width") == 0) {
- Node* ch = 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;
}
else
if (strcasecmp(name, "wp_width") == 0) {
- Node* ch = 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;
}
else
if (strcasecmp(name, "wp_heigh") == 0) {
- Node* ch = 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;
case 'g':
case 'G':
if (strcasecmp(name, "gif") == 0) {
- Node* ch = 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);
case 'j':
case 'J':
if (strcasecmp(name, "jpeg") == 0 || strcasecmp(name, "jpg") == 0) {
- Node* ch = 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);
case 'p':
case 'P':
if (strcasecmp(name, "png") == 0) {
- Node* ch = 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);
case 'b':
case 'B':
if (strcasecmp(name, "bmp2") == 0) {
- Node* ch = 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);
}
else
if (strcasecmp(name, "bmp4") == 0) {
- Node* ch = 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);
case 'c':
case 'C':
if (strcasecmp(name, "color") == 0) {
- Node* ch = 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);
}
else
if (strcasecmp(name, "cache") == 0) {
- Node* ch = 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;
case 'e':
case 'E':
if (strcasecmp(name, "emoji_type") == 0) {
- Node* ch = 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));
}
}
}
}
+
+/**
+ * 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
*/