char * chxj_css_rgb_func_to_value(apr_pool_t *pool, const char *rgb_func_string) { char *s = apr_pstrdup(pool, rgb_func_string); if (chxj_starts_with(s, "rgb")) { s += 3; s = qs_trim_string(pool, s); if (*s == '(') s++; int len = strlen(s); if (s[len - 1] == ')') s[len-1] = 0; char *pstat; char *red = qs_trim_string(pool, apr_strtok(s, ",", &pstat)); char *green = qs_trim_string(pool, apr_strtok(NULL, ",", &pstat)); char *blue = qs_trim_string(pool, apr_strtok(NULL, ",", &pstat)); int red_per_flag = 0; int green_per_flag = 0; int blue_per_flag = 0; if (red && (pstat = strchr(red, '%'))) { *pstat = 0; red_per_flag = 1; } else { red = "0"; } if (green && (pstat = strchr(green, '%'))) { *pstat = 0; green_per_flag = 1; } else { green = "0"; } if (blue && (pstat = strchr(blue, '%'))) { *pstat = 0; blue_per_flag = 1; } else { blue = "0"; } double d_red = (double)chxj_atoi(red); double d_green = (double)chxj_atoi(green); double d_blue = (double)chxj_atoi(blue); if (red_per_flag) { d_red /= 100.0; d_red *= 255; } if (green_per_flag) { d_green /= 100.0; d_green *= 255; } if (blue_per_flag) { d_blue /= 100.0; d_blue *= 255; } char *ret = apr_psprintf(pool, "#%02x%02x%02x", (int)d_red, (int)d_green, (int)d_blue); return ret; } else if (s[0] == '#') { if (strlen(&s[1]) == 3) { char red[2]; char green[2]; char blue[2]; red[0] = s[1]; green[0] = s[2]; blue[0] = s[3]; red[1] = 0; green[1] = 0; blue[1] = 0; int ired = chxj_axtoi(red); int igreen = chxj_axtoi(green); int iblue = chxj_axtoi(blue); return apr_psprintf(pool, "#%02x%02x%02x", ired * 0x10 + ired, igreen * 0x10 + igreen, iblue * 0x10 + iblue); } } else { switch(*s) { case 'a': case 'A': if (STRCASEEQ('q','Q', &s[1], "qua")) { /* aqua */ return apr_pstrdup(pool, "#00ffff"); } break; case 'b': case 'B': if (s[1] == 'l' || s[1] == 'L') { if (s[2] == 'a' || s[2] == 'A') { if (STRCASEEQ('c','C',&s[3], "ck")) { /* black */ return apr_pstrdup(pool, "#000000"); } } else if (s[2] == 'u' || s[2] == 'U') { if (s[3] == 'e' || s[3] == 'E') { /* blue */ return apr_pstrdup(pool, "#0000ff"); } } } break; case 'f': case 'F': if (STRCASEEQ('u','U',&s[1], "uchsia")) { /* fuchsia */ return apr_pstrdup(pool, "#ff00ff"); } break; case 'g': case 'G': if (s[1] == 'r'||s[1] == 'R') { if (STRCASEEQ('a','A', &s[2], "ay")) { /* gray */ return apr_pstrdup(pool, "#808080"); } else if (STRCASEEQ('e','E',&s[2], "een")) { /* green */ return apr_pstrdup(pool, "#008000"); } } break; case 'l': case 'L': if (STRCASEEQ('i','I', &s[1], "ime")) { /* lime */ return apr_pstrdup(pool, "#00ff00"); } break; case 'm': case 'M': if (STRCASEEQ('a','A', &s[1], "aroon")) { /* maroon */ return apr_pstrdup(pool, "#800000"); } break; case 'n': case 'N': if (STRCASEEQ('a','A', &s[1], "avy")) { /* navy */ return apr_pstrdup(pool, "#000080"); } break; case 'o': case 'O': if (STRCASEEQ('l','L', &s[1], "live")) { /* olive */ return apr_pstrdup(pool, "#808000"); } break; case 'p': case 'P': if (STRCASEEQ('u','U', &s[1], "urple")) { /* purple */ return apr_pstrdup(pool, "#800080"); } break; case 'r': case 'R': if (STRCASEEQ('e','E', &s[1], "ed")) { /* red */ return apr_pstrdup(pool, "#ff0000"); } break; case 's': case 'S': if (STRCASEEQ('i','I', &s[1], "ilver")) { /* silver */ return apr_pstrdup(pool, "#c0c0c0"); } break; case 't': case 'T': if (STRCASEEQ('e','E', &s[1], "eal")) { /* teal */ return apr_pstrdup(pool, "#008080"); } break; case 'w': case 'W': if (STRCASEEQ('h','H', &s[1], "hite")) { /* white */ return apr_pstrdup(pool, "#ffffff"); } break; case 'y': case 'Y': if (STRCASEEQ('y','Y', &s[1], "ellow")) { /* yellow */ return apr_pstrdup(pool, "#ffff00"); } break; default: break; } } return s; }
/** * The device is specified from TSV file. * @param r Request_rec is appointed. * @param userAgent UserAgent is appointed here, * @return The style which corresponds is returned. */ static device_table * s_specified_device_from_tsv(request_rec *r,device_table *spec,const char *user_agent) { if(spec->device_id == NULL){ return spec; } DBG(r, "REQ[%X] start %s() device_id:[%s]", TO_ADDR(r), __func__,spec->device_id); mod_chxj_config *conf; conf = chxj_get_module_config(r->per_dir_config, &chxj_module); if(conf->device_hash == NULL){ DBG(r, "REQ[%X] end %s()", TO_ADDR(r),__func__); return spec; } char *key = apr_psprintf(r->pool,"%d.%s",spec->provider,spec->device_id); apr_table_t *ht = apr_hash_get(conf->device_hash,key,APR_HASH_KEY_STRING); if(ht != NULL){ DBG(r, "REQ[%X] found ! %s() %s", TO_ADDR(r), __func__,key); int i; for ( i=0; i< conf->device_keys->nelts; i++){ const char *k = ((const char**)conf->device_keys->elts)[i]; char *val = (char *)apr_table_get(ht,k); if(val == NULL){ continue; } DBG(r, "REQ[%X] start chxj_specified_device_from_tsv() [%s] = [%s]:[%s]",TO_ADDR(r),spec->device_id,k,val); if (STRCASEEQ('d','D',"device_name",k)){ spec->device_name = apr_pstrdup(r->pool,val); } if (STRCASEEQ('w','W',"width",k)){ if(chxj_chk_numeric(val) == 0){ spec->width = chxj_atoi(val); } } else if (STRCASEEQ('h','H',"heigh",k)){ if(chxj_chk_numeric(val) == 0){ spec->heigh = chxj_atoi(val); } } else if (STRCASEEQ('h','H',"height",k)){ if(chxj_chk_numeric(val) == 0){ spec->heigh = chxj_atoi(val); } } else if (STRCASEEQ('w','W',"wp_width",k)){ if(chxj_chk_numeric(val) == 0){ spec->wp_width = chxj_atoi(val); } } else if (STRCASEEQ('w','W',"wp_heigh",k)){ if(chxj_chk_numeric(val) == 0){ spec->wp_heigh = chxj_atoi(val); } } else if (STRCASEEQ('w','W',"wp_height",k)){ if(chxj_chk_numeric(val) == 0){ spec->wp_heigh = chxj_atoi(val); } } else if (STRCASEEQ('c','C',"cache",k)){ if(chxj_chk_numeric(val) == 0){ spec->cache = chxj_atoi(val); } } else if (STRCASEEQ('g','G',"gif",k)){ int tmp = get_boolean_value(r,val); if(tmp > -1 ){ spec->available_gif = tmp; } } else if (STRCASEEQ('j','J',"jpeg",k)){ int tmp = get_boolean_value(r,val); if(tmp > -1 ){ spec->available_jpeg = tmp; } } else if (STRCASEEQ('p','P',"png",k)){ int tmp = get_boolean_value(r,val); if(tmp > -1 ){ spec->available_png = tmp; } } else if (STRCASEEQ('b','B',"bmp2",k)){ int tmp = get_boolean_value(r,val); if(tmp > -1 ){ spec->available_bmp2 = tmp; } } else if (STRCASEEQ('b','B',"bmp4",k)){ int tmp = get_boolean_value(r,val); if(tmp > -1 ){ spec->available_bmp4 = tmp; } } else if (STRCASEEQ('c','C',"color",k)){ if(chxj_chk_numeric(val) == 0){ spec->color = chxj_atoi(val); } } else if (STRCASEEQ('e','E',"emoji_type",k)){ spec->emoji_type = apr_pstrdup(r->pool,val); } else if (STRCASEEQ('h','H',"html_spec_type",k)){ if (STRCASEEQ('x','X',"xhtml_mobile_1_0",val)) { spec->html_spec_type = CHXJ_SPEC_XHtml_Mobile_1_0; } else if (STRCASEEQ('c','C',"chtml_1_0",val)) { spec->html_spec_type = CHXJ_SPEC_Chtml_1_0; } else if (STRCASEEQ('c','C',"chtml_2_0",val)) { spec->html_spec_type = CHXJ_SPEC_Chtml_2_0; } else if (STRCASEEQ('c','C',"chtml_3_0",val)) { spec->html_spec_type = CHXJ_SPEC_Chtml_3_0; } else if (STRCASEEQ('c','C',"chtml_4_0",val)) { spec->html_spec_type = CHXJ_SPEC_Chtml_4_0; } else if (STRCASEEQ('c','C',"chtml_5_0",val)) { spec->html_spec_type = CHXJ_SPEC_Chtml_5_0; } else if (STRCASEEQ('c','C',"chtml_6_0",val)) { spec->html_spec_type = CHXJ_SPEC_Chtml_6_0; } else if (STRCASEEQ('c','C',"chtml_7_0",val)) { spec->html_spec_type = CHXJ_SPEC_Chtml_7_0; } else if (STRCASEEQ('h','H',"hdml",val)) { spec->html_spec_type = CHXJ_SPEC_Hdml; } else if (STRCASEEQ('i','I',"ixhtml",val)) { spec->html_spec_type = CHXJ_SPEC_Chtml_7_0; } else if (STRCASEEQ('j','J',"jhtml",val)) { spec->html_spec_type = CHXJ_SPEC_Jhtml; } else if (STRCASEEQ('j','J',"jxhtml",val)) { spec->html_spec_type = CHXJ_SPEC_Jxhtml; } else if (STRCASEEQ('i','I',"iphone2",val)) { spec->html_spec_type = CHXJ_SPEC_iPhone2; } else if (STRCASEEQ('i','I',"iphone3",val)) { spec->html_spec_type = CHXJ_SPEC_iPhone3; } else if (STRCASEEQ('i','I',"iphone4",val)) { spec->html_spec_type = CHXJ_SPEC_iPhone4; } else if (STRCASEEQ('a','A',"android_s",val)) { spec->html_spec_type = CHXJ_SPEC_softbank_android; } else if (STRCASEEQ('a','A',"android_a",val)) { spec->html_spec_type = CHXJ_SPEC_au_android; } else if (STRCASEEQ('a','A',"android_d",val)) { spec->html_spec_type = CHXJ_SPEC_docomo_android; } else if (STRCASEEQ('a','A',"android",val)) { spec->html_spec_type = CHXJ_SPEC_android; } } else if (STRCASEEQ('o','O',"output_encoding",k)){ spec->output_encoding = apr_pstrdup(r->pool,val); } } } DBG(r, "REQ[%X] end %s() [%d]",TO_ADDR(r),__func__,spec->provider); return spec; }
static void s_set_device_data(Doc *doc, apr_pool_t *p, device_table_list *dtl, Node *node) { Node *child; device_table *dt; dt = apr_pcalloc(p, sizeof(device_table)); dt->next = NULL; dt->device_id = NULL; dt->device_name = NULL; dt->html_spec_type = CHXJ_SPEC_Chtml_3_0; dt->width = 0; dt->heigh = 0; dt->wp_width = 0; dt->wp_heigh = 0; dt->cache = 5; dt->emoji_type = NULL; dt->color = 256; dt->dpi_width = 96; dt->dpi_heigh = 96; for (child = qs_get_child_node(doc,node); child ; child = qs_get_next_node(doc,child)) { char *name = qs_get_node_name(doc,child); switch (*name) { case 'd': case 'D': if (strcasecmp(name, "device") == 0) { s_set_device_data(doc,p, dtl, child); } else if (strcasecmp(name, "device_id") == 0) { Node* ch = qs_get_child_node(doc, child); if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) { dt->device_id = apr_pstrdup(p, qs_get_node_value(doc, ch)); } } else if (strcasecmp(name, "device_name") == 0) { Node* ch = qs_get_child_node(doc, child); if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) { dt->device_name = apr_pstrdup(p, qs_get_node_value(doc, ch)); } } else if (strcasecmp(name, "dpi_width") == 0) { 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; for (ii=0; ii<strlen(vv); ii++) { if ((vv[ii] >= '1' && vv[ii] <= '9') || vv[ii] == '0') continue; break; } if (ii == strlen(vv)) dt->dpi_width = atoi(qs_get_node_value(doc,ch)); else dt->dpi_width = 0; } } else if (strcasecmp(name, "dpi_heigh") == 0) { 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; for (ii=0; ii<strlen(vv); ii++) { if ((vv[ii] >= '1' && vv[ii] <= '9') || vv[ii] == '0') continue; break; } if (ii == strlen(vv)) dt->dpi_heigh = atoi(qs_get_node_value(doc,ch)); else dt->dpi_heigh = 0; } } break; case 'h': case 'H': if (strcasecmp(name, "html_spec_type") == 0) { 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 (STRCASEEQ('x','X',"xhtml_mobile_1_0",vv)) { dt->html_spec_type = CHXJ_SPEC_XHtml_Mobile_1_0; } else if (STRCASEEQ('c','C',"chtml_1_0",vv)) { dt->html_spec_type = CHXJ_SPEC_Chtml_1_0; } else if (STRCASEEQ('c','C',"chtml_2_0",vv)) { dt->html_spec_type = CHXJ_SPEC_Chtml_2_0; } else if (STRCASEEQ('c','C',"chtml_3_0",vv)) { dt->html_spec_type = CHXJ_SPEC_Chtml_3_0; } else if (STRCASEEQ('c','C',"chtml_4_0",vv)) { dt->html_spec_type = CHXJ_SPEC_Chtml_4_0; } else if (STRCASEEQ('c','C',"chtml_5_0",vv)) { dt->html_spec_type = CHXJ_SPEC_Chtml_5_0; } else if (STRCASEEQ('c','C',"chtml_6_0",vv)) { dt->html_spec_type = CHXJ_SPEC_Chtml_6_0; } else if (STRCASEEQ('c','C',"chtml_7_0",vv)) { dt->html_spec_type = CHXJ_SPEC_Chtml_7_0; } else if (STRCASEEQ('h','H',"hdml",vv)) { dt->html_spec_type = CHXJ_SPEC_Hdml; } else if (STRCASEEQ('j','J',"jhtml",vv)) { dt->html_spec_type = CHXJ_SPEC_Jhtml; } else if (STRCASEEQ('j','J',"jxhtml",vv)) { dt->html_spec_type = CHXJ_SPEC_Jxhtml; } } } else if (strcasecmp(name, "heigh") == 0) { 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; for (ii=0; ii<strlen(vv); ii++) { if ((vv[ii] >= '1' && vv[ii] <= '9') || vv[ii] == '0') continue; break; } if (ii == strlen(vv)) dt->heigh = atoi(qs_get_node_value(doc,ch)); else dt->heigh = 0; } } break; case 'w': case 'W': if (strcasecmp(name, "width") == 0) { 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; for (ii=0; ii<strlen(vv); ii++) { if ((vv[ii] >= '1' && vv[ii] <= '9') || vv[ii] == '0') continue; break; } if (ii == strlen(vv)) dt->width = atoi(qs_get_node_value(doc,ch)); else dt->width = 0; } } else if (strcasecmp(name, "wp_width") == 0) { 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; for (ii=0; ii<strlen(vv); ii++) { if ((vv[ii] >= '1' && vv[ii] <= '9') || vv[ii] == '0') continue; break; } if (ii == strlen(vv)) dt->wp_width = atoi(qs_get_node_value(doc,ch)); else dt->wp_width = 0; } } else if (strcasecmp(name, "wp_heigh") == 0) { 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; for (ii=0; ii<strlen(vv); ii++) { if ((vv[ii] >= '1' && vv[ii] <= '9') || vv[ii] == '0') continue; break; } if (ii == strlen(vv)) dt->wp_heigh = atoi(qs_get_node_value(doc,ch)); else dt->wp_heigh = 0; } } break; case 'g': case 'G': if (strcasecmp(name, "gif") == 0) { 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, "true") == 0) dt->available_gif = 1; else dt->available_gif = 0; } } break; case 'j': case 'J': if (strcasecmp(name, "jpeg") == 0 || strcasecmp(name, "jpg") == 0) { 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); if (strcasecmp(vv, "true") == 0) dt->available_jpeg = 1; else dt->available_jpeg = 0; } } break; case 'p': case 'P': if (strcasecmp(name, "png") == 0) { 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, "true") == 0) dt->available_png = 1; else dt->available_png = 0; } } break; case 'b': case 'B': if (strcasecmp(name, "bmp2") == 0) { 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, "true") == 0) dt->available_bmp2 = 1; else dt->available_bmp2 = 0; } } else if (strcasecmp(name, "bmp4") == 0) { 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, "true") == 0) dt->available_bmp4 = 1; else dt->available_bmp4 = 0; } } break; case 'c': case 'C': if (strcasecmp(name, "color") == 0) { 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 (chxj_chk_numeric(vv) != 0) dt->color = 0; else dt->color = chxj_atoi(vv); } } else if (strcasecmp(name, "cache") == 0) { 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; for (ii=0; ii<strlen(vv); ii++) { if ((vv[ii] >= '1' && vv[ii] <= '9') || vv[ii] == '0') continue; break; } if (ii == strlen(vv)) dt->cache = atoi(qs_get_node_value(doc,ch)); else dt->cache = 0; } } break; case 'e': case 'E': if (strcasecmp(name, "emoji_type") == 0) { 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)); } break; default: break; } } if (dt->device_id) { if (! dtl->table) { dtl->table = dt; dtl->tail = dt; } else { dtl->tail->next = dt; dtl->tail = dt; } } }