/*
- * Copyright (C) 2005-2008 Atsushi Konno All rights reserved.
+ * Copyright (C) 2005-2011 Atsushi Konno All rights reserved.
* Copyright (C) 2005 QSDN,Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* limitations under the License.
*/
#include "mod_chxj.h"
+#include "chxj_add_device_env.h"
static device_table UNKNOWN_DEVICE = {
- .next = NULL,
- .device_id = "",
- .device_name = "UNKNOWN",
- .html_spec_type = CHXJ_SPEC_UNKNOWN,
- .width = 640,
- .heigh = 480,
+ .next = NULL,
+ .device_id = "",
+ .device_name = "UNKNOWN",
+ .html_spec_type = CHXJ_SPEC_UNKNOWN,
+ .width = 640,
+ .heigh = 480,
/*--------------------------------------------------------------------------*/
/* Walll Paper Size */
/*--------------------------------------------------------------------------*/
- .wp_width = 640,
- .wp_heigh = 480,
+ .wp_width = 640,
+ .wp_heigh = 480,
/*--------------------------------------------------------------------------*/
/* Cache Size */
/*--------------------------------------------------------------------------*/
- .cache = 10000000,
+ .cache = 10000000,
/*--------------------------------------------------------------------------*/
/* Correspondence image format */
/* 1: It is possible to display it. */
/* 0: It is not possible to display it. */
/*--------------------------------------------------------------------------*/
- .available_gif = 1,
- .available_jpeg = 1,
- .available_png = 1,
- .available_bmp2 = 1,
- .available_bmp4 = 1,
- .dpi_width = 96,
- .dpi_heigh = 96,
+ .available_gif = 1,
+ .available_jpeg = 1,
+ .available_png = 1,
+ .available_bmp2 = 1,
+ .available_bmp4 = 1,
+ .dpi_width = 96,
+ .dpi_heigh = 96,
/*--------------------------------------------------------------------------*/
/* Color number type */
/* 2 : 2 Colors */
/* 262144 : 262144 Colors */
/* 15680000: 15680000 over colors */
/*--------------------------------------------------------------------------*/
- .color = 15680000,
- .emoji_type = NULL,
+ .color = 15680000,
+ .emoji_type = NULL,
};
+static device_table * s_get_device_data(request_rec *r, const char *device_id, device_table_list *dtl);
/**
* The device is specified from UserAgent.
ap_regmatch_t match[10];
device_table *returnType = &UNKNOWN_DEVICE;
device_table_list *dtl;
- device_table *dt;
mod_chxj_config *conf;
+ mod_chxj_req_config *request_conf;
char *device_id;
- if (! user_agent)
+ DBG(r,"REQ[%x] start %s()", TO_ADDR(r), __func__ );
+
+ if (! user_agent) {
+ DBG(r,"REQ[%x] end %s() (User-Agent is NULL)", TO_ADDR(r),__func__);
return returnType;
-
+ }
- DBG(r, "start chxj_specified_device()");
+ /*
+ * Get per request config.
+ */
+ request_conf = (mod_chxj_req_config *)chxj_get_module_config(r->request_config, &chxj_module);
+ if (!request_conf) {
+ request_conf = apr_pcalloc(r->pool, sizeof(mod_chxj_req_config));
+ request_conf->spec = NULL;
+ request_conf->user_agent = NULL;
+ request_conf->f = NULL;
+ request_conf->entryp = NULL;
+ chxj_set_module_config(r->request_config, &chxj_module, request_conf);
+ }
+ if (user_agent) {
+ request_conf->user_agent = apr_pstrdup(r->pool, user_agent);
+ }
+ else {
+ request_conf->user_agent = "";
+ }
- conf = ap_get_module_config(r->per_dir_config, &chxj_module);
+ conf = chxj_get_module_config(r->per_dir_config, &chxj_module);
if (! conf->devices) {
- DBG(r, "device_data.xml load failure");
+ ERR(r,"REQ[%X] device_data.xml load failure", TO_ADDR(r));
+ DBG(r,"REQ[%x] end %s()", TO_ADDR(r),__func__);
return returnType;
}
for (dtl = conf->devices; dtl; dtl = dtl->next) {
if (! dtl->pattern) {
- DBG(r, "pattern is null");
+ /* DBG(r, "REQ[%X] pattern is null", TO_ADDR(r)); */
continue;
}
- DBG1(r, "pattern is [%s]", dtl->pattern);
+ /* DBG(r, "REQ[%X] pattern is [%s]", TO_ADDR(r), dtl->pattern); */
if (! dtl->regexp) {
- DBG(r,"compile failed.");
+ ERR(r,"REQ[%X] compile failed.", TO_ADDR(r));
+ DBG(r,"REQ[%x] end %s()", TO_ADDR(r),__func__);
return returnType;
}
if (ap_regexec((const ap_regex_t *)dtl->regexp, user_agent, (apr_size_t)dtl->regexp->re_nsub + 1, match, 0) == 0) {
device_id = ap_pregsub(r->pool, "$1", user_agent, dtl->regexp->re_nsub + 1, match);
- DBG1(r, "device_id:[%s]", device_id);
- for (dt = dtl->table; dt; dt = dt->next) {
- if (strcasecmp(device_id, dt->device_id) == 0) {
- DBG1(r, "device_name:[%s]", dt->device_name);
- returnType = dt;
- break;
+ DBG(r,"REQ[%X] device_id:[%s]", TO_ADDR(r), device_id);
+ returnType = s_get_device_data(r, device_id, dtl);
+ if (! returnType) {
+ if (dtl->tail) {
+ returnType = dtl->tail;
}
- }
-
- if (! dt) {
- for (dt = dtl->table; dt; dt = dt->next) {
- if (dt->next == NULL)
- break;
+ else {
+ returnType = &UNKNOWN_DEVICE;
}
-
- if (dt)
- returnType = dt;
}
- }
-
- if (returnType != &UNKNOWN_DEVICE) {
- DBG(r,"end chxj_specified_device()");
+ request_conf->spec = returnType;
+ DBG(r,"REQ[%X] end %s() (Found User-Agent Type)", TO_ADDR(r),__func__);
return returnType;
}
}
- DBG(r,"end chxj_specified_device()");
+ request_conf->spec = &UNKNOWN_DEVICE;
+ DBG(r,"REQ[%X] end %s() (Not Found User-Agent Type) [%s]",TO_ADDR(r), __func__,user_agent);
+
+ return &UNKNOWN_DEVICE;
+}
- return returnType;
+
+#include <stdlib.h>
+static int
+s_compar(const void *a, const void *b)
+{
+ device_table *aa = *(device_table **)a;
+ device_table *bb = *(device_table **)b;
+ /* Not strcasecmp. for LOAD */
+ return strcmp(aa->device_id, bb->device_id);
+}
+static device_table *
+s_get_device_data(request_rec *r, const char *device_id, device_table_list *dtl)
+{
+ device_table dt;
+ device_table *_dt;
+ dt.device_id = device_id;
+ _dt = &dt;
+ device_table **ret = bsearch(&_dt, dtl->sort_table, dtl->table_count, sizeof(device_table *), s_compar);
+ if (ret && *ret) {
+ return *ret;
+ }
+ return NULL;
}
/*
* vim:ts=2 et
*/
+