OSDN Git Service

* Fixed Bug.
[modchxj/mod_chxj.git] / src / chxj_specified_device.c
index ea66b61..68a97a7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * 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                                                */
@@ -54,9 +55,10 @@ static device_table  UNKNOWN_DEVICE      = {
   /* 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. 
@@ -70,66 +72,104 @@ chxj_specified_device(request_rec *r, const char *user_agent)
   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
  */
+