/*
+ * Copyright (C) 2005-2009 Atsushi Konno All rights reserved.
* Copyright (C) 2005 QSDN,Inc. All rights reserved.
- * Copyright (C) 2005 Atsushi Konno All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-#if 0
-#include <wand/magick_wand.h>
-
-#undef PACKAGE_NAME
-#undef PACKAGE_STRING
-#undef PACKAGE_TARNAME
-#undef PACKAGE_VERSION
-
-#endif
-
#include <libgen.h>
+#include <limits.h>
#include "mod_chxj.h"
#include "chxj_img_conv_format.h"
#include "chxj_specified_device.h"
#include "chxj_str_util.h"
#include "chxj_qr_code.h"
#include "chxj_apply_convrule.h"
+#include "chxj_url_encode.h"
#include "qs_parse_string.h"
+#include "chxj_preg_replace.h"
#include "http_core.h"
-#if 1
#include <wand/magick_wand.h>
-#endif
#define EXIT_MAGICK_ERROR() \
ap_log_rerror(APLOG_MARK,APLOG_DEBUG, 0, r,"%s %s %d %s\n",__FILE__,(__func__),__LINE__,description); \
description=(char *) MagickRelinquishMemory(description); \
DestroyMagickWand(magick_wand); \
- }while(1)
+ } while(0)
typedef enum img_conv_mode_t {
IMG_CONV_MODE_NORMAL = 0,
/*----------------------------------------------------------------------------*/
/* Request parameter maintenance structure */
/*----------------------------------------------------------------------------*/
-typedef struct _query_string_param_t {
+typedef struct query_string_param_t query_string_param_t;
+
+struct query_string_param_t {
img_conv_mode_t mode;
- char* user_agent;
+ char *user_agent;
ua_use_flag_t ua_flag;
- char* name; /* for EZGET */
+ char *name; /* for EZGET */
long offset; /* for EZGET */
long count; /* for EZGET */
int width;
int height;
-} query_string_param_t;
+};
/*----------------------------------------------------------------------------*/
/* Device_spec when User-Agent is disregarded */
/*----------------------------------------------------------------------------*/
/* Download page for AU */
/*----------------------------------------------------------------------------*/
-static const char* HDML_FIRST_PAGE =
+static const char *HDML_FIRST_PAGE =
"<HDML VERSION=3.0 TTL=0 PUBLIC=TRUE>\r\n"
" <NODISPLAY>\r\n"
" <ACTION TYPE=ACCEPT TASK=GOSUB DEST=\"device:data/dnld?url=%s&name=%s%s&size=%ld&disposition=%s&title=%s\">\r\n"
" </NODISPLAY>\r\n"
"</HDML>\r\n";
-static const char* HDML_SUCCESS_PAGE =
+static const char *HDML_SUCCESS_PAGE =
"<HDML VERSION=3.0 TTL=0 PUBLIC=TRUE>\r\n"
" <DISPLAY>\r\n"
" <ACTION TYPE=ACCEPT TASK=RETURN>\r\n"
" </DISPLAY>\r\n"
"<HDML>\r\n";
-static const char* HDML_FAIL_PAGE =
+static const char *HDML_FAIL_PAGE =
"<HDML VERSION=3.0 TTL=0 PUBLIC=TRUE>\r\n"
" <DISPLAY>\r\n"
" <ACTION TYPE=ACCEPT TASK=RETURN>\r\n"
" </DISPLAY>\r\n"
"<HDML>\r\n";
+static ap_regex_t *v_docomo_serial_pattern1 = NULL;
+static ap_regex_t *v_docomo_serial_pattern2 = NULL;
+static ap_regex_t *v_docomo_serial_pattern3 = NULL;
+static ap_regex_t *v_softbank_serial_pattern1 = NULL;
+
/*----------------------------------------------------------------------------*/
/* Prototype declaration */
/*----------------------------------------------------------------------------*/
-static char* s_create_workfile( request_rec*, mod_chxj_config* ,
- const char*,
- query_string_param_t*);
-static apr_status_t s_create_cache_file(request_rec* r,
- const char* tmpfile,
- device_table* spec,
- apr_finfo_t* st,
- query_string_param_t *qsp);
-static apr_status_t s_send_cache_file( device_table* spec,
- query_string_param_t* query_string,
- request_rec* r,
- const char* tmpfile);
-static apr_status_t s_header_only_cache_file(
- device_table* spec,
- query_string_param_t* query_string,
- request_rec* r,
- const char* tmpfile);
-static query_string_param_t* s_get_query_string_param(request_rec *r);
-static unsigned short s_add_crc( const char* writedata,
- apr_size_t witebyte);
-static MagickWand* s_fixup_size(MagickWand* ,
- request_rec* r,
- device_table* spec,
- query_string_param_t *qsp);
-static MagickWand* s_fixup_color(MagickWand* magick_wand,
- request_rec* r,
- device_table* spec,
+static char *s_create_workfile_name(request_rec *,
+ mod_chxj_config *,
+ const char *,
+ query_string_param_t *);
+
+static apr_status_t s_create_cache_file(request_rec *r,
+ const char *tmpfile,
+ device_table *spec,
+ apr_finfo_t *st,
+ query_string_param_t *qsp,
+ mod_chxj_config *conf);
+
+static apr_status_t s_send_cache_file(device_table *spec,
+ query_string_param_t *query_string,
+ request_rec *r,
+ const char *tmpfile);
+
+static apr_status_t s_send_original_file(request_rec *r,
+ const char *originalfile);
+
+static apr_status_t s_header_only_cache_file(device_table *spec,
+ query_string_param_t *query_string,
+ request_rec *r,
+ const char *tmpfile);
+
+static query_string_param_t *s_get_query_string_param(request_rec *r);
+
+static unsigned short s_add_crc(const char *writedata, apr_size_t witebyte);
+
+static MagickWand *s_fixup_size(MagickWand *,
+ request_rec *r,
+ device_table *spec,
+ query_string_param_t *qsp);
+
+static MagickWand *s_fixup_color(MagickWand *magick_wand,
+ request_rec *r,
+ device_table *spec,
img_conv_mode_t mode);
-static MagickWand* s_fixup_depth(MagickWand* magick_wand,
+static MagickWand *s_fixup_depth(MagickWand* magick_wand,
request_rec* r, device_table* spec);
-static MagickWand* s_img_down_sizing(MagickWand* magick_wand,
- request_rec* r, device_table* spec);
-static MagickWand* s_add_copyright(
- MagickWand* magick_wand,
- request_rec* r,
- device_table* spec);
-static char* s_create_blob_data(request_rec* r,
- device_table* spec,
- query_string_param_t *qsp,
- char* indata,
- apr_size_t* len);
+static MagickWand *s_img_down_sizing(MagickWand *magick_wand,
+ request_rec *r, device_table *spec);
+
+static MagickWand *s_add_copyright(MagickWand *magick_wand,
+ request_rec *r,
+ device_table *spec);
+
+static char *s_create_blob_data(request_rec *r,
+ device_table *spec,
+ query_string_param_t *qsp,
+ char *indata,
+ apr_size_t *len);
+
+static int s_img_conv_format_from_file(request_rec *r,
+ mod_chxj_config *conf,
+ const char *user_agent,
+ query_string_param_t *qsp,
+ device_table *spec);
+static int s_convert_to_jpeg(MagickWand *magick_wand, request_rec *r, device_table *spec);
+static int s_convert_to_png(MagickWand *maigck_wand, request_rec *r, device_table *spec);
+static int s_convert_to_gif(MagickWand *magick_wand, request_rec *r, device_table *spec);
+static int s_convert_to_bmp(MagickWand *magick_wand, request_rec *r, device_table *spec);
+
-static int s_img_conv_format_from_file(
- request_rec* r,
- mod_chxj_config* conf,
- const char* user_agent,
- query_string_param_t* qsp,
- device_table* spec);
int
-chxj_img_conv_format_handler(request_rec* r)
+chxj_img_conv_format_handler(request_rec *r)
{
- mod_chxj_config* conf;
- query_string_param_t* qsp;
- char* user_agent;
- device_table* spec;
- chxjconvrule_entry* entryp;
+ mod_chxj_config *conf;
+ query_string_param_t *qsp;
+ char *user_agent;
+ device_table *spec;
+ chxjconvrule_entry *entryp;
DBG(r, "start chxj_img_conv_format_handler()");
- if ((*r->handler != 'c' && *r->handler != 'C')
- || (strcasecmp(r->handler, "chxj-picture")
- && strcasecmp(r->handler, "chxj-qrcode"))) {
+ if (r->handler && !STRCASEEQ('c','C',"chxj-picture",r->handler) && !STRCASEEQ('c','C',"chxj-qrcode",r->handler)) {
DBG(r, "end chxj_img_conv_format_handler()");
return DECLINED;
}
qsp = s_get_query_string_param(r);
- conf = ap_get_module_config(r->per_dir_config, &chxj_module);
+ conf = chxj_get_module_config(r->per_dir_config, &chxj_module);
if (conf == NULL) {
DBG(r, "end chxj_img_conv_format_handler() conf is null");
return DECLINED;
}
- if (strcasecmp(r->handler, "chxj-qrcode") == 0 && conf->image == CHXJ_IMG_OFF)
+ if (STRCASEEQ('c','C',"chxj-qrcode",r->handler) && conf->image == CHXJ_IMG_OFF) {
return DECLINED;
-
+ }
/*------------------------------------------------------------------------*/
/* get UserAgent from http header */
else {
entryp = chxj_apply_convrule(r, conf->convrules);
if (entryp && entryp->user_agent) {
- user_agent = (char*)apr_table_get(r->headers_in, "CHXJ_HTTP_USER_AGENT");
+ user_agent = (char*)apr_table_get(r->headers_in, CHXJ_HTTP_USER_AGENT);
}
else {
- user_agent = (char*)apr_table_get(r->headers_in, "User-Agent");
+ user_agent = (char*)apr_table_get(r->headers_in, HTTP_USER_AGENT);
}
}
else
spec = chxj_specified_device(r, user_agent);
- DBG1(r,"found device_name=[%s]", spec->device_name);
- DBG1(r,"User-Agent=[%s]", user_agent);
+ DBG(r,"found device_name=[%s]", spec->device_name);
+ DBG(r,"User-Agent=[%s]", user_agent);
- if (spec->width == 0 || spec->heigh == 0)
- return DECLINED;
return s_img_conv_format_from_file(r, conf, user_agent, qsp, spec);
}
* @param src [i] It is former image binary data.
* @param len [i/o] It is length of former image binary data.
*/
-char*
-chxj_exchange_image(request_rec *r, const char** src, apr_size_t* len)
+char *
+chxj_convert_image(request_rec *r, const char **src, apr_size_t *len)
{
- mod_chxj_config* conf;
- query_string_param_t* qsp;
- char* user_agent;
- device_table* spec;
- char* dst;
- chxjconvrule_entry* entryp;
-
- DBG(r, "start chxj_exchange_image()");
+ mod_chxj_config *conf;
+ query_string_param_t *qsp;
+ char *user_agent;
+ device_table *spec;
+ char *dst;
+ char *conv_check;
+ chxjconvrule_entry *entryp;
+
+ DBG(r, "start chxj_convert_image()");
+
+ conv_check = (char*)apr_table_get(r->headers_in, "CHXJ_IMG_CONV");
+ if (conv_check) {
+ DBG(r, "end chxj_exchnage_image() already convert.");
+ return NULL;
+ }
qsp = s_get_query_string_param(r);
- conf = ap_get_module_config(r->per_dir_config, &chxj_module);
+ conf = chxj_get_module_config(r->per_dir_config, &chxj_module);
if (conf == NULL) {
- DBG(r, "end chxj_exchange_image()");
+ DBG(r, "end chxj_convert_image()");
return NULL;
}
else {
entryp = chxj_apply_convrule(r, conf->convrules);
if (entryp && entryp->user_agent) {
- user_agent = (char*)apr_table_get(r->headers_in, "CHXJ_HTTP_USER_AGENT");
+ user_agent = (char*)apr_table_get(r->headers_in, CHXJ_HTTP_USER_AGENT);
}
else {
- user_agent = (char*)apr_table_get(r->headers_in, "User-Agent");
+ user_agent = (char*)apr_table_get(r->headers_in, HTTP_USER_AGENT);
}
}
else
spec = chxj_specified_device(r, user_agent);
- DBG1(r,"found device_name=[%s]", spec->device_name);
- DBG1(r, "User-Agent=[%s]", user_agent);
+ DBG(r,"found device_name=[%s]", spec->device_name);
+ DBG(r, "User-Agent=[%s]", user_agent);
if (spec->width == 0 || spec->heigh == 0)
return NULL;
if (dst == NULL)
*len = 0;
- DBG(r, "end chxj_exchange_image()");
+ DBG(r, "end chxj_convert_image()");
return dst;
}
+
static int
s_img_conv_format_from_file(
- request_rec* r,
- mod_chxj_config* conf,
- const char* user_agent,
- query_string_param_t* qsp,
- device_table* spec)
+ request_rec *r,
+ mod_chxj_config *conf,
+ const char *user_agent,
+ query_string_param_t *qsp,
+ device_table *spec)
{
apr_status_t rv;
apr_finfo_t st;
apr_finfo_t cache_st;
- char* tmpfile;
+ char *tmpfile;
+ int try_count;
+
+ if (spec->html_spec_type == CHXJ_SPEC_UNKNOWN) {
+ /*
+ * If ``ua'' parameter is specified, it must be CHXJ_SPEC_HTML.
+ */
+ return s_send_original_file(r, r->filename);
+ }
/*--------------------------------------------------------------------------*/
/* Create Workfile Name */
/*--------------------------------------------------------------------------*/
- tmpfile = s_create_workfile(r, conf, user_agent, qsp);
- DBG1(r,"workfile=[%s]", tmpfile);
+ tmpfile = s_create_workfile_name(r, conf, user_agent, qsp);
+ DBG(r,"workfile=[%s]", tmpfile);
rv = apr_stat(&st, r->filename, APR_FINFO_MIN, r->pool);
if (rv != APR_SUCCESS)
return HTTP_NOT_FOUND;
-
- DBG1(r,"found [%s]", r->filename);
- rv = apr_stat(&cache_st, tmpfile, APR_FINFO_MIN, r->pool);
- DBG1(r,"found [%s]", r->filename);
-
- if (rv != APR_SUCCESS || cache_st.ctime < st.mtime) {
- /*------------------------------------------------------------------------*/
- /* It tries to make the cash file when it doesn't exist or there is */
- /* change time later since the making time of the cash file. */
- /*------------------------------------------------------------------------*/
- rv = s_create_cache_file(r,tmpfile, spec, &st, qsp);
- if (rv != OK)
- return rv;
- }
-
- DBG1(r,"color=[%d]", spec->color);
- if (! r->header_only) {
- rv = s_send_cache_file(spec, qsp,r, tmpfile);
- if (rv != OK)
- return rv;
- }
- else {
- rv = s_header_only_cache_file(spec, qsp, r, tmpfile);
- if (rv != OK)
- return rv;
+ apr_table_setn(r->headers_in, "CHXJ_IMG_CONV", "done");
+ try_count = CACHE_RETRY_COUNT;
+ do {
+ rv = apr_stat(&cache_st, tmpfile, APR_FINFO_MIN, r->pool);
+
+ if (rv != APR_SUCCESS || cache_st.ctime < st.mtime) {
+ /*------------------------------------------------------------------------*/
+ /* It tries to make the cash file when it doesn't exist or there is */
+ /* change time later since the making time of the cash file. */
+ /*------------------------------------------------------------------------*/
+ rv = s_create_cache_file(r,tmpfile, spec, &st, qsp, conf);
+ if (rv != OK)
+ return rv;
+ }
+
+ DBG(r,"color=[%d]", spec->color);
+ if (! r->header_only) {
+ rv = s_send_cache_file(spec, qsp,r, tmpfile);
+ }
+ else {
+ rv = s_header_only_cache_file(spec, qsp, r, tmpfile);
+ }
+ if (rv == OK) break;
+ if (rv == HTTP_NOT_FOUND) {
+ DBG(r, "recheck wait... try_count[%d]", try_count);
+ apr_sleep(CACHE_RECHECK_WAIT);
+ }
+ } while (try_count--);
+ if (try_count <= 0) {
+ WRN(r, "cache retry failure....");
+ WRN(r, "cache file was deleted...");
}
DBG(r,"end chxj_img_conv_format");
- return OK;
+ return rv;
}
static apr_status_t
-s_create_cache_file(request_rec* r,
- const char* tmpfile,
- device_table* spec,
- apr_finfo_t* st,
- query_string_param_t *qsp)
+s_create_cache_file(request_rec *r,
+ const char *tmpfile,
+ device_table *spec,
+ apr_finfo_t *st,
+ query_string_param_t *qsp,
+ mod_chxj_config *conf)
{
apr_status_t rv;
apr_size_t readbyte;
unsigned short crc;
img_conv_mode_t mode = qsp->mode;
- char* writedata = NULL;
- char* readdata = NULL;
+ char *writedata = NULL;
+ char *readdata = NULL;
- apr_file_t* fout;
- apr_file_t* fin;
+ apr_file_t *fout;
+ apr_file_t *fin;
+ apr_finfo_t cache_dir_st;
- MagickWand* magick_wand;
+ MagickWand *magick_wand;
+ int img_count;
- if ((*r->handler == 'c' || *r->handler == 'C')
- && strcasecmp(r->handler, "chxj-qrcode") == 0) {
+ if (STRCASEEQ('c','C',"chxj-qrcode",r->handler)) {
/*------------------------------------------------------------------------*/
- /* QRCODEÍѤΥե¡¥¤¥ë¤Î¾ì¹ç */
+ /* QRCODE用のファイルの場合 */
/*------------------------------------------------------------------------*/
Doc doc;
- Node* root;
+ Node *root;
qr_code_t qrcode;
int sts;
}
else {
/*------------------------------------------------------------------------*/
- /* Ä̾ï¤Î¥¤¥á¡¼¥¸¥Õ¥¡¥¤¥ë¤Î¾ì¹ç */
+ /* 通常のイメージファイルの場合 */
/*------------------------------------------------------------------------*/
rv = apr_file_open(&fin,
r->filename,
APR_OS_DEFAULT,
r->pool);
if (rv != APR_SUCCESS) {
- DBG1(r,"file open failed.[%s]", r->filename);
+ DBG(r,"file open failed.[%s]", r->filename);
return HTTP_NOT_FOUND;
}
readdata = apr_palloc(r->pool, st->size);
rv = apr_file_read_full(fin, (void*)readdata, st->size, &readbyte);
if (rv != APR_SUCCESS || readbyte != st->size) {
- DBG1(r,"file read failed.[%s]", r->filename);
+ DBG(r,"file read failed.[%s]", r->filename);
apr_file_close(fin);
return HTTP_NOT_FOUND;
return HTTP_NOT_FOUND;
}
- /*
- * The size of the image is changed.
- */
- DBG(r,"call s_fixup_size()");
-
- if ((magick_wand = s_fixup_size(magick_wand, r, spec, qsp)) == NULL)
- return HTTP_NOT_FOUND;
-
- /*
- * The colors of the image is changed.
- */
- DBG(r,"call s_fixup_color()");
-
- if ((magick_wand = s_fixup_color(magick_wand, r,spec, mode)) == NULL)
- return HTTP_NOT_FOUND;
-
- /*
- * DEPTH of the image is changed.
- */
- DBG(r,"call s_fixup_depth()");
+ /*------------------*/
+ /* for AnimationGIF */
+ /*------------------*/
+ img_count = MagickGetNumberImages(magick_wand);
+ DBG(r, "REQ[%X] img_count is [%d]", (unsigned int)(apr_size_t)r, img_count);
+ if (img_count > 1) {
+ MagickSetImageIndex(magick_wand, 0);
+ MagickWand *magick_wand2 = MagickGetImage(magick_wand);
+ DestroyMagickWand(magick_wand);
+ magick_wand = magick_wand2;
+ }
- if ((magick_wand = s_fixup_depth(magick_wand, r, spec)) == NULL)
+ if (MagickStripImage(magick_wand) == MagickFalse) {
+ ERR(r, "mod_chxj: strip image failure.");
+ EXIT_MAGICK_ERROR();
return HTTP_NOT_FOUND;
-
-
-
- DBG(r,"start convert and compression");
-
- if (spec->available_jpeg) {
- if (MagickSetImageCompression(magick_wand,JPEGCompression) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return HTTP_NOT_FOUND;
- }
-
- if (MagickSetImageFormat(magick_wand, "jpg") == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return HTTP_NOT_FOUND;
- }
-
- if (MagickStripImage(magick_wand) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return HTTP_NOT_FOUND;
- }
-
- if ((magick_wand = s_img_down_sizing(magick_wand, r, spec)) == NULL)
- return HTTP_NOT_FOUND;
-
- r->content_type = apr_psprintf(r->pool, "image/jpeg");
- DBG(r,"convert to jpg");
}
- else
- if (spec->available_png) {
-
- if (MagickSetImageCompression(magick_wand,ZipCompression) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return HTTP_NOT_FOUND;
- }
- if (MagickSetImageFormat(magick_wand, "png") == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return HTTP_NOT_FOUND;
- }
+ if (spec->html_spec_type != CHXJ_SPEC_UNKNOWN) {
+ int oldw = MagickGetImageWidth(magick_wand);
+ int oldh = MagickGetImageHeight(magick_wand);
+ int done_fixup_size = 0;
+ if ((qsp->mode == IMG_CONV_MODE_WALLPAPER && spec->wp_width < oldw && spec->wp_heigh < oldh)
+ || (qsp->mode != IMG_CONV_MODE_WALLPAPER && spec->width < oldw && spec->heigh < oldh)) {
+ /*
+ * The size of the image is changed.
+ */
+ DBG(r,"call s_fixup_size()");
+
+ if ((magick_wand = s_fixup_size(magick_wand, r, spec, qsp)) == NULL)
+ return HTTP_NOT_FOUND;
- if (MagickStripImage(magick_wand) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return HTTP_NOT_FOUND;
+ done_fixup_size = 1;
}
-
- if ((magick_wand = s_img_down_sizing(magick_wand, r, spec)) == NULL)
+ /*
+ * The colors of the image is changed.
+ */
+ DBG(r,"call s_fixup_color()");
+
+ if ((magick_wand = s_fixup_color(magick_wand, r,spec, mode)) == NULL)
return HTTP_NOT_FOUND;
-
- r->content_type = apr_psprintf(r->pool, "image/png");
- DBG(r, "convert to png");
- }
- else
- if (spec->available_gif) {
-
- if (MagickSetImageCompression(magick_wand,LZWCompression) == MagickFalse) {
- EXIT_MAGICK_ERROR();
+
+ /*
+ * DEPTH of the image is changed.
+ */
+ DBG(r,"call s_fixup_depth()");
+
+ if ((magick_wand = s_fixup_depth(magick_wand, r, spec)) == NULL)
return HTTP_NOT_FOUND;
+
+
+ if (! done_fixup_size) {
+ /*
+ * The size of the image is changed.
+ */
+ DBG(r,"call s_fixup_size()");
+ if ((magick_wand = s_fixup_size(magick_wand, r, spec, qsp)) == NULL)
+ return HTTP_NOT_FOUND;
}
- if (MagickSetImageFormat(magick_wand, "gif") == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return HTTP_NOT_FOUND;
+ char *nowFormat = MagickGetImageFormat(magick_wand);
+ int fixFormatFlag = 0;
+ if (nowFormat) {
+ if (STRCASEEQ('g','G',"gif",nowFormat)) {
+ if (spec->available_gif) {
+ if (s_convert_to_gif(magick_wand, r, spec)) {
+ return HTTP_NOT_FOUND;
+ }
+ fixFormatFlag = 1;
+ }
+ }
+ else if (STRCASEEQ('j','J',"jpg",nowFormat)||STRCASEEQ('j','J',"jpeg",nowFormat)) {
+ if (spec->available_jpeg) {
+ if (s_convert_to_jpeg(magick_wand, r, spec)) {
+ return HTTP_NOT_FOUND;
+ }
+ fixFormatFlag = 1;
+ }
+ }
+ else if (STRCASEEQ('p','P',"png",nowFormat)) {
+ if (spec->available_png) {
+ if (s_convert_to_png(magick_wand, r, spec)) {
+ return HTTP_NOT_FOUND;
+ }
+ fixFormatFlag = 1;
+ }
+ }
}
- if (MagickStripImage(magick_wand) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return HTTP_NOT_FOUND;
+ DBG(r,"start convert and compression");
+
+ if (! fixFormatFlag) {
+ if (spec->available_jpeg) {
+ if (s_convert_to_jpeg(magick_wand, r, spec)) {
+ return HTTP_NOT_FOUND;
+ }
+ }
+ else if (spec->available_gif) {
+ if (s_convert_to_gif(magick_wand, r, spec)) {
+ return HTTP_NOT_FOUND;
+ }
+ }
+ else if (spec->available_png) {
+ if (s_convert_to_png(magick_wand, r, spec)) {
+ return HTTP_NOT_FOUND;
+ }
+
+ }
+ else
+ if (spec->available_bmp2 || spec->available_bmp4) {
+ if (s_convert_to_bmp(magick_wand, r, spec)) {
+ return HTTP_NOT_FOUND;
+ }
+ }
}
-
- if ((magick_wand = s_img_down_sizing(magick_wand, r, spec)) == NULL)
+
+ /*
+ * Add Comment (Copyright and so on.)
+ */
+ DBG(r, "call s_add_copyright()");
+
+ if ((magick_wand = s_add_copyright(magick_wand, r, spec)) == NULL)
return HTTP_NOT_FOUND;
-
- r->content_type = apr_psprintf(r->pool, "image/gif");
-
- DBG(r,"convert to gif");
}
- else
- if (spec->available_bmp2 || spec->available_bmp4) {
-
- if (MagickSetImageCompression(magick_wand,NoCompression) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return HTTP_NOT_FOUND;
- }
-
- if (MagickSetImageFormat(magick_wand, "bmp") == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return HTTP_NOT_FOUND;
+ else {
+ char* fmt;
+ fmt = MagickGetImageFormat(magick_wand);
+ if (fmt == NULL) {
+ if (MagickSetImageFormat(magick_wand, "jpg") == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return HTTP_NOT_FOUND;
+ }
+
+ r->content_type = apr_psprintf(r->pool, "image/jpeg");
}
-
- if (MagickStripImage(magick_wand) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return HTTP_NOT_FOUND;
+ else {
+ if (strcasecmp(fmt, "jpg") == 0) {
+ r->content_type = apr_psprintf(r->pool, "image/jpeg");
+ }
+ else
+ if (strcasecmp(fmt, "jpeg") == 0) {
+ r->content_type = apr_psprintf(r->pool, "image/jpeg");
+ }
+ else
+ if (strcasecmp(fmt, "gif") == 0) {
+ r->content_type = apr_psprintf(r->pool, "image/gif");
+ }
+ else
+ if (strcasecmp(fmt, "png") == 0) {
+ r->content_type = apr_psprintf(r->pool, "image/png");
+ }
}
-
- if ((magick_wand = s_img_down_sizing(magick_wand, r, spec)) == NULL)
- return HTTP_NOT_FOUND;
-
- r->content_type = apr_psprintf(r->pool, "image/bmp");
-
- DBG(r, "convert to bmp(unsupported)");
}
- /*
- * Add Comment (Copyright and so on.)
- */
- DBG(r, "call s_add_copyright()");
-
- if ((magick_wand = s_add_copyright(magick_wand, r, spec)) == NULL)
- return HTTP_NOT_FOUND;
-
writedata = (char*)MagickGetImageBlob(magick_wand, &writebyte);
if (! writebyte) {
DestroyMagickWand(magick_wand);
- ERR1(r,"convert failure to Jpeg [%s]", tmpfile);
+ ERR(r,"convert failure to Jpeg [%s]", tmpfile);
return HTTP_INTERNAL_SERVER_ERROR;
}
DBG(r, "end convert and compression");
+ /* check limit */
+ rv = apr_stat(&cache_dir_st, conf->image_cache_dir, APR_FINFO_MIN, r->pool);
+ if (rv != APR_SUCCESS) {
+ DestroyMagickWand(magick_wand);
+ ERR(r,"dir stat error.[%s]", conf->image_cache_dir);
+ if (writedata) free(writedata);
+ return HTTP_INTERNAL_SERVER_ERROR;
+ }
+
+ for (;;) {
+ /* delete candidate */
+ apr_finfo_t dcf;
+ /* get dir files size */
+ apr_dir_t *dir;
+ unsigned long total_size = 0;
+ int found_file = 0;
+ unsigned long max_size = (! conf->image_cache_limit) ? DEFAULT_IMAGE_CACHE_LIMIT : conf->image_cache_limit;
+ char *delete_file_name;
+
+ rv = apr_dir_open(&dir, conf->image_cache_dir, r->pool);
+ if (rv != APR_SUCCESS) {
+ DestroyMagickWand(magick_wand);
+ ERR(r,"dir open error.[%s]", conf->image_cache_dir);
+ if (writedata) free(writedata);
+ return HTTP_INTERNAL_SERVER_ERROR;
+ }
+ memset(&dcf, 0, sizeof(apr_finfo_t));
+ dcf.atime = (apr_time_t)LONG_LONG_MAX;
+ for (;;) {
+ apr_finfo_t dirf;
+ rv = apr_dir_read(&dirf, APR_FINFO_SIZE|APR_FINFO_NAME|APR_FINFO_DIRENT|APR_FINFO_ATIME , dir);
+ if (rv != APR_SUCCESS) {
+ break;
+ }
+ if (dirf.name && strcmp(dirf.name, ".") != 0 && strcmp(dirf.name, "..") != 0) {
+ total_size += (unsigned long)dirf.size;
+ DBG(r, "dirf.name=[%s] dirf.size=[%ld] dirf.atime=[%lld]", dirf.name, (long)dirf.size, (long long int)dirf.atime);
+ if (dcf.atime >= dirf.atime) {
+ memcpy(&dcf, &dirf, sizeof(apr_finfo_t));
+ }
+ found_file++;
+ }
+ }
+ apr_dir_close(dir);
+ if (total_size + writebyte < max_size) {
+ DBG(r, "There is an enough size in cache. total_size:[%lu] max_size:[%lu] found_file=[%d] max_size=[%lu]", total_size, max_size, found_file, max_size);
+ break;
+ }
+ if (found_file == 0 && writebyte >= max_size) {
+ ERR(r, "==========================================");
+ ERR(r, "cache space is too small...");
+ ERR(r, "At least the same size as %luByte is necessary for me.", (unsigned long)writebyte);
+ ERR(r, "Please specify the ChxjImageCacheLimit that is larger than now value. ");
+ ERR(r, "==========================================");
+ if (writedata) free(writedata);
+ return HTTP_INTERNAL_SERVER_ERROR;
+ }
+ DBG(r, "Image Cache dir is full. total_size:[%lu] max_size:[%lu]", total_size + writebyte, max_size);
+ /* search delete candidate */
+ delete_file_name = apr_psprintf(r->pool, "%s/%s", conf->image_cache_dir, dcf.name);
+ DBG(r, "delete image cache target:[%s] atime:[%lld]", delete_file_name, (long long int)dcf.atime);
+ rv = apr_file_remove(delete_file_name, r->pool);
+ if (rv != APR_SUCCESS) {
+ ERR(r, "cache file delete failure.[%s]", delete_file_name);
+ if (writedata) free(writedata);
+ return HTTP_INTERNAL_SERVER_ERROR;
+ }
+ DBG(r, "deleted image cache target:[%s]", delete_file_name);
+ if (total_size + writebyte - dcf.size < max_size) {
+ DBG(r, "OK, there is an enough size in cache.");
+ break;
+ }
+ }
+
/* to cache */
rv = apr_file_open(&fout, tmpfile,
APR_WRITE| APR_CREATE | APR_BINARY | APR_SHARELOCK ,APR_OS_DEFAULT,
r->pool);
if (rv != APR_SUCCESS) {
DestroyMagickWand(magick_wand);
- ERR1(r,"file open error.[%s]", tmpfile);
+ ERR(r,"file open error.[%s]", tmpfile);
+ if (writedata) free(writedata);
return HTTP_INTERNAL_SERVER_ERROR;
}
if (rv != APR_SUCCESS) {
DestroyMagickWand(magick_wand);
apr_file_close(fout);
+ if (writedata) free(writedata);
return HTTP_INTERNAL_SERVER_ERROR;
}
rv = apr_file_putc((crc >> 8) & 0xff, fout);
if (rv != APR_SUCCESS) {
DestroyMagickWand(magick_wand);
+ if (writedata) free(writedata);
return HTTP_INTERNAL_SERVER_ERROR;
}
rv = apr_file_putc( crc & 0xff, fout);
if (rv != APR_SUCCESS) {
DestroyMagickWand(magick_wand);
+ if (writedata) free(writedata);
return HTTP_INTERNAL_SERVER_ERROR;
}
}
DestroyMagickWand(magick_wand);
+ if (writedata) free(writedata);
rv = apr_file_close(fout);
if (rv != APR_SUCCESS) {
- DBG1(r,"file write error.[%s]", tmpfile);
+ DBG(r,"file write error.[%s]", tmpfile);
return HTTP_INTERNAL_SERVER_ERROR;
}
}
-static char*
-s_create_blob_data(request_rec* r,
- device_table* spec,
- query_string_param_t *qsp,
- char* indata,
- apr_size_t* len)
+static int
+s_convert_to_jpeg(MagickWand *magick_wand, request_rec *r, device_table *spec)
{
- apr_size_t writebyte;
- unsigned short crc;
- img_conv_mode_t mode = qsp->mode;
-
- char* writedata = NULL;
- char* dst = NULL;
-
- MagickWand* magick_wand;
-
- magick_wand = NewMagickWand();
-
- if (MagickReadImageBlob(magick_wand,indata, *len) == MagickFalse) {
+ if (MagickSetImageCompression(magick_wand,JPEGCompression) == MagickFalse) {
EXIT_MAGICK_ERROR();
- return NULL;
+ return -1;
}
-
- /*
- * The size of the image is changed.
- */
- DBG(r, "call s_fixup_size()");
-
- if ((magick_wand = s_fixup_size(magick_wand, r, spec, qsp)) == NULL)
- return NULL;
-
- /*
- * The colors of the image is changed.
- */
- DBG(r, "call s_fixup_color()");
-
- if ((magick_wand = s_fixup_color(magick_wand, r,spec, mode)) == NULL)
- return NULL;
-
- /*
- * DEPTH of the image is changed.
- */
-
- DBG(r,"call s_fixup_depth()");
-
- if ((magick_wand = s_fixup_depth(magick_wand, r, spec)) == NULL)
- return NULL;
+
+ if (MagickSetImageFormat(magick_wand, "jpg") == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return -1;
+ }
+
+ if (MagickStripImage(magick_wand) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return -1;
+ }
+
+ if ((magick_wand = s_img_down_sizing(magick_wand, r, spec)) == NULL)
+ return -1;
+
+ r->content_type = apr_psprintf(r->pool, "image/jpeg");
+ ap_set_content_type(r, "image/jpeg");
+ DBG(r,"convert to jpg");
+ return 0;
+}
+static int
+s_convert_to_png(MagickWand *magick_wand, request_rec *r, device_table *spec)
+{
+ if (MagickSetImageCompression(magick_wand,ZipCompression) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return -1;
+ }
+
+ if (MagickSetImageFormat(magick_wand, "png") == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return -1;
+ }
+
+ if (MagickStripImage(magick_wand) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return -1;
+ }
+
+ if ((magick_wand = s_img_down_sizing(magick_wand, r, spec)) == NULL)
+ return -1;
+
+ r->content_type = apr_psprintf(r->pool, "image/png");
+ ap_set_content_type(r, "image/png");
+ DBG(r, "convert to png");
+ return 0;
+}
- DBG(r,"start convert and compression");
- if (spec->available_jpeg) {
- if (MagickSetImageCompression(magick_wand,JPEGCompression) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
- }
+static int
+s_convert_to_gif(MagickWand *magick_wand, request_rec *r, device_table *spec)
+{
+ if (MagickSetImageCompression(magick_wand,LZWCompression) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return -1;
+ }
+
+ if (MagickSetImageFormat(magick_wand, "gif") == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return -1;
+ }
+
+ if (MagickStripImage(magick_wand) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return -1;
+ }
+
+ if ((magick_wand = s_img_down_sizing(magick_wand, r, spec)) == NULL)
+ return -1;
+
+ r->content_type = apr_psprintf(r->pool, "image/gif");
+ ap_set_content_type(r, "image/gif");
+
+ DBG(r,"convert to gif");
+ return 0;
+}
- if (MagickSetImageFormat(magick_wand, "jpg") == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
- }
- if (MagickStripImage(magick_wand) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
- }
+static int
+s_convert_to_bmp(MagickWand *magick_wand, request_rec *r, device_table *spec)
+{
+ if (MagickSetImageCompression(magick_wand,NoCompression) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return -1;
+ }
+
+ if (MagickSetImageFormat(magick_wand, "bmp") == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return -1;
+ }
+
+ if (MagickStripImage(magick_wand) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return -1;
+ }
+
+ if ((magick_wand = s_img_down_sizing(magick_wand, r, spec)) == NULL)
+ return -1;
+
+ r->content_type = apr_psprintf(r->pool, "image/bmp");
+ ap_set_content_type(r, "image/bmp");
+
+ DBG(r, "convert to bmp(unsupported)");
+ return 0;
+}
- if ((magick_wand = s_img_down_sizing(magick_wand, r, spec)) == NULL)
- return NULL;
- r->content_type = apr_psprintf(r->pool, "image/jpeg");
+static char *
+s_create_blob_data(request_rec *r,
+ device_table *spec,
+ query_string_param_t *qsp,
+ char *indata,
+ apr_size_t *len)
+{
+ apr_size_t writebyte;
+ unsigned short crc;
+ img_conv_mode_t mode = qsp->mode;
- DBG(r, "convert to jpg");
- }
- else
- if (spec->available_png) {
- if (MagickSetImageCompression(magick_wand,ZipCompression) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
- }
+ char *writedata = NULL;
+ char *dst = NULL;
+ MagickWand *magick_wand;
- if (MagickSetImageFormat(magick_wand, "png") == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
- }
+ magick_wand = NewMagickWand();
- if (MagickStripImage(magick_wand) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
- }
+ if (MagickReadImageBlob(magick_wand,indata, *len) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return NULL;
+ }
- if ((magick_wand = s_img_down_sizing(magick_wand, r, spec)) == NULL)
- return NULL;
+ if (MagickStripImage(magick_wand) == MagickFalse) {
+ ERR(r, "mod_chxj: strip image failure.");
+ EXIT_MAGICK_ERROR();
+ return NULL;
+ }
- r->content_type = apr_psprintf(r->pool, "image/png");
+ {
+ int oldw = MagickGetImageWidth(magick_wand);
+ int oldh = MagickGetImageHeight(magick_wand);
+ int done_fixup_size = 0;
+ if ((qsp->mode == IMG_CONV_MODE_WALLPAPER && spec->wp_width < oldw && spec->wp_heigh < oldh)
+ || (qsp->mode != IMG_CONV_MODE_WALLPAPER && spec->width < oldw && spec->heigh < oldh)) {
+ /*
+ * The size of the image is changed.
+ */
+ DBG(r,"call s_fixup_size()");
- DBG(r,"convert to png");
- }
- else
- if (spec->available_gif) {
+ if ((magick_wand = s_fixup_size(magick_wand, r, spec, qsp)) == NULL) {
+ EXIT_MAGICK_ERROR();
+ return NULL;
+ }
- if (MagickSetImageCompression(magick_wand,LZWCompression) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
+ done_fixup_size = 1;
}
+ /*
+ * The colors of the image is changed.
+ */
+ DBG(r,"call s_fixup_color()");
- if (MagickSetImageFormat(magick_wand, "gif") == MagickFalse) {
+ if ((magick_wand = s_fixup_color(magick_wand, r,spec, mode)) == NULL) {
EXIT_MAGICK_ERROR();
return NULL;
}
- if (MagickStripImage(magick_wand) == MagickFalse) {
+ /*
+ * DEPTH of the image is changed.
+ */
+ DBG(r,"call s_fixup_depth()");
+
+ if ((magick_wand = s_fixup_depth(magick_wand, r, spec)) == NULL) {
EXIT_MAGICK_ERROR();
return NULL;
}
- if ((magick_wand = s_img_down_sizing(magick_wand, r, spec)) == NULL)
- return NULL;
-
- r->content_type = apr_psprintf(r->pool, "image/gif");
- DBG(r,"convert to gif");
- }
- else
- if (spec->available_bmp2 || spec->available_bmp4) {
- if (MagickSetImageCompression(magick_wand,NoCompression) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
+ if (! done_fixup_size) {
+ /*
+ * The size of the image is changed.
+ */
+ DBG(r,"call s_fixup_size()");
+ if ((magick_wand = s_fixup_size(magick_wand, r, spec, qsp)) == NULL) {
+ EXIT_MAGICK_ERROR();
+ return NULL;
+ }
}
+ }
- if (MagickSetImageFormat(magick_wand, "bmp") == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
+ char *nowFormat = MagickGetImageFormat(magick_wand);
+ int fixFormatFlag = 0;
+ if (nowFormat) {
+ if (STRCASEEQ('g','G',"gif",nowFormat)) {
+ if (spec->available_gif) {
+ if (s_convert_to_gif(magick_wand, r, spec)) {
+ return NULL;
+ }
+ fixFormatFlag = 1;
+ }
}
-
- if (MagickStripImage(magick_wand) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
+ else if (STRCASEEQ('j','J',"jpg",nowFormat)||STRCASEEQ('j','J',"jpeg",nowFormat)) {
+ if (spec->available_jpeg) {
+ if (s_convert_to_jpeg(magick_wand, r, spec)) {
+ return NULL;
+ }
+ fixFormatFlag = 1;
+ }
}
+ else if (STRCASEEQ('p','P',"png",nowFormat)) {
+ if (spec->available_png) {
+ if (s_convert_to_png(magick_wand, r, spec)) {
+ return NULL;
+ }
+ fixFormatFlag = 1;
+ }
+ }
+ }
- if ((magick_wand = s_img_down_sizing(magick_wand, r, spec)) == NULL)
- return NULL;
-
- r->content_type = apr_psprintf(r->pool, "image/bmp");
+ DBG(r,"start convert and compression");
- DBG(r,"convert to bmp(unsupported)");
+ if (!fixFormatFlag) {
+ if (spec->available_jpeg) {
+ if (s_convert_to_jpeg(magick_wand, r, spec)) {
+ return NULL;
+ }
+ }
+ else if (spec->available_png) {
+ if (s_convert_to_png(magick_wand, r, spec)) {
+ return NULL;
+ }
+ }
+ else if (spec->available_gif) {
+ if (s_convert_to_gif(magick_wand, r, spec)) {
+ return NULL;
+ }
+ }
+ else if (spec->available_bmp2 || spec->available_bmp4) {
+ if (s_convert_to_bmp(magick_wand, r, spec)) {
+ return NULL;
+ }
+ }
}
/*--------------------------------------------------------------------------*/
/* Add Comment (Copyright and so on.) */
return dst;
}
-static MagickWand*
-s_fixup_size(MagickWand* magick_wand,
- request_rec* r,
- device_table* spec,
- query_string_param_t *qsp)
+
+static MagickWand *
+s_fixup_size(MagickWand *magick_wand,
+ request_rec *r,
+ device_table *spec,
+ query_string_param_t *qsp)
{
img_conv_mode_t mode = qsp->mode;
int oldw;
oldw = MagickGetImageWidth(magick_wand);
oldh = MagickGetImageHeight(magick_wand);
- DBG1(r,"detect width=[%d]", oldw);
- DBG1(r,"detect heigh=[%d]", oldh);
+ DBG(r,"detect width=[%d]", oldw);
+ DBG(r,"detect heigh=[%d]", oldh);
neww = oldw;
newh = oldh;
- DBG1(r,"detect spec width=[%d]", spec->width);
- DBG1(r,"detect spec heigh=[%d]", spec->heigh);
+ DBG(r,"detect spec width=[%d]", spec->width);
+ DBG(r,"detect spec heigh=[%d]", spec->heigh);
c_width = spec->width;
c_heigh = spec->heigh;
neww = (int)((double)neww * (double)((double)c_heigh / (double)newh));
newh = (int)((double)newh * (double)((double)c_heigh / (double)newh));
- DBG2(r,"newh = [%d] neww = [%d]", newh, neww);
+ DBG(r,"newh = [%d] neww = [%d]", newh, neww);
break;
default:
DBG(r,"**** detect normal mode ****");
- if (qsp->ua_flag != UA_IGN) {
+ if (qsp->ua_flag != UA_IGN && spec->html_spec_type != CHXJ_SPEC_UNKNOWN) {
if (neww > c_width) {
newh = (int)((double)newh * (double)((double)c_width / (double)neww));
neww = (int)((double)neww * (double)((double)c_width / (double)neww));
break;
}
- DBG2(r,"convert width=[%d --> %d]", oldw, neww);
- DBG2(r,"convert heigh=[%d --> %d]", oldh, newh);
-
- MagickResetIterator(magick_wand);
-
- while (MagickNextImage(magick_wand) != MagickFalse) {
- switch (mode) {
- case IMG_CONV_MODE_WALLPAPER:
- case IMG_CONV_MODE_EZGET:
-
- if (MagickResizeImage(magick_wand,neww,newh,LanczosFilter,1.0) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
- }
-
- if (MagickCropImage(magick_wand,
- (unsigned long)c_width,
- (unsigned long)c_heigh,
- (long)((neww - c_width) / 2),
- (long)((newh - c_heigh) / 2)) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
- }
- break;
+ if (neww == 0) neww = 1;
+ if (newh == 0) newh = 1;
- case IMG_CONV_MODE_NORMAL:
- if (qsp->width) {
- DBG2(r,"convert width=[%d --> %d]", neww, qsp->width);
- neww = qsp->width;
- }
- if (qsp->height) {
- DBG2(r,"convert heigh=[%d --> %d]", newh, qsp->height);
- newh = qsp->height;
+ if (spec->html_spec_type != CHXJ_SPEC_UNKNOWN) {
+ DBG(r,"convert width=[%d --> %d]", oldw, neww);
+ DBG(r,"convert heigh=[%d --> %d]", oldh, newh);
+
+ MagickResetIterator(magick_wand);
+
+ while (MagickNextImage(magick_wand) != MagickFalse) {
+ switch (mode) {
+ case IMG_CONV_MODE_WALLPAPER:
+ case IMG_CONV_MODE_EZGET:
+
+ if (MagickResizeImage(magick_wand,neww,newh,LanczosFilter,1.0) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return NULL;
+ }
+
+ if (MagickCropImage(magick_wand,
+ (unsigned long)c_width,
+ (unsigned long)c_heigh,
+ (long)((neww - c_width) / 2),
+ (long)((newh - c_heigh) / 2)) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return NULL;
+ }
+ break;
+
+ case IMG_CONV_MODE_NORMAL:
+ if (qsp->width) {
+ DBG(r,"convert width=[%d --> %d]", neww, qsp->width);
+ neww = qsp->width;
+ }
+ if (qsp->height) {
+ DBG(r,"convert heigh=[%d --> %d]", newh, qsp->height);
+ newh = qsp->height;
+ }
+
+ default:
+ if (MagickResizeImage(magick_wand,neww,newh,LanczosFilter,1.0) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return NULL;
+ }
+ break;
}
-
- default:
- if (MagickResizeImage(magick_wand,neww,newh,LanczosFilter,1.0) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
+
+ if (spec->html_spec_type != CHXJ_SPEC_UNKNOWN) {
+ if (MagickSetImageUnits(magick_wand, PixelsPerInchResolution) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return NULL;
+ }
+
+ if (MagickSetImageResolution(magick_wand,
+ (double)spec->dpi_width,
+ (double)spec->dpi_heigh) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return NULL;
+ }
+
+ if (MagickSetImageDispose(magick_wand, BackgroundDispose) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return NULL;
+ }
}
- break;
- }
-
- if (MagickSetImageUnits(magick_wand, PixelsPerInchResolution) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
- }
-
- if (MagickSetImageResolution(magick_wand,
- (double)spec->dpi_width,
- (double)spec->dpi_heigh) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
- }
-
- if (MagickSetImageDispose(magick_wand, BackgroundDispose) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
}
}
-
return magick_wand;
}
-static MagickWand*
-s_fixup_color(MagickWand* magick_wand, request_rec* r, device_table* spec, img_conv_mode_t mode)
+
+static MagickWand *
+s_fixup_color(MagickWand *magick_wand, request_rec *r, device_table *spec, img_conv_mode_t UNUSED(mode))
{
DBG(r,"start chxj_fixup_clor()");
+ if (spec->html_spec_type == CHXJ_SPEC_UNKNOWN) {
+ DBG(r, "Pass s_fixup_color proc");
+ return magick_wand;
+ }
+
+ unsigned long colors = MagickGetImageColors(magick_wand);
+ DBG(r, "now color:[%ld] spec->color:[%ld]", colors, (unsigned long)spec->color);
+ if (colors < (unsigned long)spec->color) {
+ DBG(r, "Pass s_fixup_color proc. color:[%ld] spec->color:[%d]", colors, spec->color);
+ return magick_wand;
+ }
+
if (spec->color >= 256) {
- DBG1(r,"call MagickQuantizeImage() spec->color=[%d]",spec->color);
+ DBG(r,"call MagickQuantizeImage() spec->color=[%d]",spec->color);
if (MagickQuantizeImage(magick_wand,
spec->color,
return NULL;
}
- DBG1(r,"call end MagickQuantizeImage() spec->color=[%d]",spec->color);
+ DBG(r,"call end MagickQuantizeImage() spec->color=[%d]",spec->color);
}
else {
- DBG1(r,"call MagickQuantizeImage() spec->color=[%d]",spec->color);
+ DBG(r,"call MagickQuantizeImage() spec->color=[%d]",spec->color);
if (MagickQuantizeImage(magick_wand,
spec->color,
return NULL;
}
- DBG1(r,"call end MagickQuantizeImage() spec->color=[%d]",spec->color);
+ DBG(r,"call end MagickQuantizeImage() spec->color=[%d]",spec->color);
}
-static MagickWand*
-s_fixup_depth(MagickWand* magick_wand, request_rec* r, device_table* spec)
+static MagickWand *
+s_fixup_depth(MagickWand *magick_wand, request_rec *r, device_table *spec)
{
+ if (spec->html_spec_type == CHXJ_SPEC_UNKNOWN) {
+ DBG(r, "Pass s_fixup_depth proc");
+ return magick_wand;
+ }
+
if (spec->color == 15680000) {
if (MagickSetImageDepth(magick_wand, 24) == MagickFalse) {
EXIT_MAGICK_ERROR();
}
-static MagickWand*
-s_add_copyright(MagickWand* magick_wand, request_rec* r, device_table* spec)
+static MagickWand *
+s_add_copyright(MagickWand *magick_wand, request_rec *r, device_table *spec)
{
- mod_chxj_config* conf = ap_get_module_config(r->per_dir_config, &chxj_module);
+ mod_chxj_config *conf = chxj_get_module_config(r->per_dir_config, &chxj_module);
+
+ if (spec->html_spec_type == CHXJ_SPEC_UNKNOWN) {
+ DBG(r, "Pass add_copiright proc");
+ return magick_wand;
+ }
if (conf->image_copyright) {
- DBG1(r, "Add COPYRIGHT [%s]", conf->image_copyright);
+ DBG(r, "Add COPYRIGHT [%s]", conf->image_copyright);
- if (spec->html_spec_type == CHXJ_SPEC_Jhtml) {
+ if (spec->html_spec_type == CHXJ_SPEC_Jhtml
+ || spec->html_spec_type == CHXJ_SPEC_Jxhtml) {
apr_table_setn(r->headers_out, "x-jphone-copyright", "no-transfer");
if (MagickCommentImage(magick_wand,
apr_psprintf(r->pool,
return NULL;
}
-static MagickWand*
-s_img_down_sizing(MagickWand* magick_wand, request_rec* r, device_table* spec)
+static MagickWand *
+s_img_down_sizing(MagickWand *magick_wand, request_rec *r, device_table *spec)
{
MagickBooleanType status;
- unsigned long quality = 70;
- apr_size_t writebyte = 0;
- char* writedata;
- apr_size_t prev_size = 0;
- int revers_flag = 0;
-
- writedata = (char*)MagickGetImageBlob(magick_wand, &writebyte);
+ unsigned long quality = 70;
+ apr_size_t writebyte = 0;
+ char *writedata;
+ apr_size_t prev_size = 0;
+ int revers_flag = 0;
+ char *fmt;
+ int fmt_type = 0;
+
+ writedata = (char *)MagickGetImageBlob(magick_wand, &writebyte);
prev_size = writebyte;
- do {
- if (MagickSetImageCompressionQuality(magick_wand, quality) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
- }
-
- writedata = (char*)MagickGetImageBlob(magick_wand, &writebyte);
- if (writebyte >= prev_size || revers_flag) {
- DBG2(r, "quality=[%ld] size=[%d]", (long)quality, writebyte);
- revers_flag = 1;
- quality += 10;
- if (quality > 100) {
- if (MagickSetImageCompression(magick_wand,NoCompression) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
+
+ fmt = MagickGetImageFormat(magick_wand);
+ if (fmt) {
+ if (STRCASEEQ('j','J',"jpg",fmt)) fmt_type = 1;
+ if (STRCASEEQ('p','P',"png",fmt)) fmt_type = 2;
+ if (STRCASEEQ('g','G',"gif",fmt)) fmt_type = 3;
+ if (STRCASEEQ('b','B',"bmp",fmt)) fmt_type = 4;
+ }
+ if (fmt_type == 1) {
+ do {
+ if (MagickSetImageCompressionQuality(magick_wand, quality) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return NULL;
+ }
+
+ writedata = (char*)MagickGetImageBlob(magick_wand, &writebyte);
+ if (writebyte >= prev_size || revers_flag) {
+ DBG(r, "quality=[%ld] size=[%d]", (long)quality, (int)writebyte);
+ revers_flag = 1;
+ quality += 10;
+ if (quality > 100) {
+ if (MagickSetImageCompression(magick_wand,NoCompression) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return NULL;
+ }
+ break;
}
- break;
+ prev_size = writebyte;
+ continue;
}
- prev_size = writebyte;
- continue;
+
+ DBG(r, "quality=[%ld] size=[%d]", (long)quality, (int)writebyte);
+
+ if (spec->cache == 0)
+ break;
+
+ if (writebyte <= (unsigned int)spec->cache)
+ break;
+
+ quality -= 10;
+
+ if (quality == 0 || quality > 100)
+ break;
+
}
-
- DBG2(r, "quality=[%ld] size=[%d]", (long)quality, writebyte);
-
- if (spec->cache == 0)
- break;
-
- if (writebyte <= spec->cache)
- break;
-
- quality -= 10;
-
- if (quality == 0 || quality > 100)
- break;
-
+ while (1);
}
- while (1);
if (spec->cache > 0
- && writebyte > spec->cache) {
+ && writebyte > (unsigned int)spec->cache) {
unsigned long now_color = spec->color;
unsigned long depth = 0;
do {
if (now_color <= 2) break;
+
if (now_color >= 8) {
status = MagickQuantizeImage(magick_wand,
now_color,
EXIT_MAGICK_ERROR();
return NULL;
}
-
- if (MagickSetImageDepth(magick_wand, depth) == MagickFalse) {
- EXIT_MAGICK_ERROR();
- return NULL;
+ if (fmt_type != 2) {
+ if (MagickSetImageDepth(magick_wand, depth) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return NULL;
+ }
}
-
writedata = (char*)MagickGetImageBlob(magick_wand, &writebyte);
- DBG2(r,"now_color=[%ld] size=[%d]", (long)now_color, writebyte);
+ DBG(r,"now_color=[%ld] size=[%d]", (long)now_color, (int)writebyte);
/* Once per request */
break;
return magick_wand;
}
+
static apr_status_t
-s_send_cache_file(device_table* spec, query_string_param_t* query_string, request_rec* r, const char* tmpfile)
+s_send_cache_file(device_table *UNUSED(spec), query_string_param_t *query_string, request_rec *r, const char *tmpfile)
{
apr_status_t rv;
apr_finfo_t st;
- apr_file_t* fout;
+ apr_file_t *fout;
apr_size_t sendbyte;
- char* contentLength;
+ char *contentLength;
rv = apr_stat(&st, tmpfile, APR_FINFO_MIN, r->pool);
if (rv != APR_SUCCESS)
return HTTP_NOT_FOUND;
- DBG1(r, "mode:[%d]", query_string->mode);
- DBG1(r, "name:[%s]", query_string->name);
- DBG1(r, "offset:[%ld]", query_string->offset);
- DBG1(r, "count:[%ld]", query_string->count);
-
- if (spec->available_jpeg) {
- r->content_type = apr_psprintf(r->pool, "image/jpeg");
- }
- else
- if (spec->available_png) {
- r->content_type = apr_psprintf(r->pool, "image/png");
- }
- else
- if (spec->available_gif) {
- r->content_type = apr_psprintf(r->pool, "image/gif");
- }
- else
- if (spec->available_bmp2 || spec->available_bmp4) {
- r->content_type = apr_psprintf(r->pool, "image/bmp");
- }
+ DBG(r, "mode:[%d]", query_string->mode);
+ DBG(r, "name:[%s]", query_string->name);
+ DBG(r, "offset:[%ld]", query_string->offset);
+ DBG(r, "count:[%ld]", query_string->count);
if (query_string->mode != IMG_CONV_MODE_EZGET && query_string->name == NULL) {
contentLength = apr_psprintf(r->pool, "%d", (int)st.size);
apr_table_setn(r->headers_out, "Content-Length", (const char*)contentLength);
- DBG1(r,"Content-Length:[%d]", (int)st.size);
-
+ DBG(r,"Content-Length:[%d]", (int)st.size);
+ MagickWand *magick_wand = NewMagickWand();
+ if (MagickReadImage(magick_wand,tmpfile) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return HTTP_NOT_FOUND;
+ }
+ if (MagickStripImage(magick_wand) == MagickFalse) {
+ ERR(r, "mod_chxj: strip image failure.");
+ EXIT_MAGICK_ERROR();
+ return HTTP_NOT_FOUND;
+ }
+ char *nowFormat = MagickGetImageFormat(magick_wand);
+ DestroyMagickWand(magick_wand);
+ if (nowFormat) {
+ if (STRCASEEQ('j','J',"jpeg",nowFormat) || STRCASEEQ('j','J',"jpg",nowFormat)) {
+ DBG(r, "detect cache file => jpg.");
+ ap_set_content_type(r, "image/jpeg");
+ }
+ else if (STRCASEEQ('p','P',"png", nowFormat)) {
+ DBG(r, "detect cache file => png.");
+ ap_set_content_type(r, "image/png");
+ }
+ else if (STRCASEEQ('g','G',"gif", nowFormat)) {
+ DBG(r, "detect cache file => gif.");
+ ap_set_content_type(r, "image/gif");
+ }
+ else if (STRCASEEQ('b','B',"bmp", nowFormat)) {
+ DBG(r, "detect cache file => bmp.");
+ ap_set_content_type(r, "image/bmp");
+ }
+ else {
+ ERR(r, "detect unknown file");
+ return HTTP_NOT_FOUND;
+ }
+ }
rv = apr_file_open(&fout, tmpfile,
APR_READ | APR_BINARY, APR_OS_DEFAULT, r->pool);
if (rv != APR_SUCCESS) {
- DBG1(r, "tmpfile open failed[%s]", tmpfile);
+ DBG(r, "cache file open failed[%s]", tmpfile);
return HTTP_NOT_FOUND;
}
-
ap_send_fd(fout, r, 0, st.size, &sendbyte);
apr_file_close(fout);
ap_rflush(r);
- DBG1(r, "send file data[%d]byte", sendbyte);
+ DBG(r, "send file data[%d]byte", (int)sendbyte);
}
else
if (query_string->mode == IMG_CONV_MODE_EZGET) {
- char* name = apr_pstrdup(r->pool, basename(r->filename));
+ char *name = apr_pstrdup(r->pool, basename(r->filename));
name[strlen(name)-4] = 0;
if (strcasecmp(r->content_type, "image/jpeg") == 0) {
- ap_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
+ chxj_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
ap_rprintf(r, HDML_FIRST_PAGE, r->uri, name, ".jpg", (long)st.size, "devjaww", name);
}
else
if (strcasecmp(r->content_type, "image/bmp") == 0) {
- ap_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
+ chxj_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
ap_rprintf(r, HDML_FIRST_PAGE, r->uri, name, ".bmp", (long)st.size, "devabm", name);
}
else
if (strcasecmp(r->content_type, "image/png") == 0) {
- ap_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
+ chxj_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
ap_rprintf(r, HDML_FIRST_PAGE, r->uri, name, ".png", (long)st.size, "dev8aww", name);
}
else
if (strcasecmp(r->content_type, "image/gif") == 0) {
- ap_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
+ chxj_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
ap_rprintf(r, HDML_FIRST_PAGE, r->uri, name, ".gif", (long)st.size, "devgi0z", name);
}
}
else
if (query_string->mode == IMG_CONV_MODE_WALLPAPER && query_string->name != NULL) {
if (query_string->count == -1 && query_string->offset == -1) {
- ap_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
+ chxj_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
ap_rprintf(r, HDML_SUCCESS_PAGE);
ap_rflush(r);
}
else
if (query_string->count == -2 && query_string->offset == -1) {
- ap_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
+ chxj_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
ap_rprintf(r, HDML_FAIL_PAGE);
ap_rflush(r);
}
else {
- ap_set_content_type(r, "application/x-up-download");
+ chxj_set_content_type(r, "application/x-up-download");
contentLength = apr_psprintf(r->pool, "%ld", query_string->count);
apr_table_setn(r->headers_out, "Content-Length", (const char*)contentLength);
- DBG1(r, "Content-Length:[%d]", (int)st.size);
+ DBG(r, "Content-Length:[%d]", (int)st.size);
rv = apr_file_open(&fout, tmpfile,
APR_READ | APR_BINARY, APR_OS_DEFAULT, r->pool);
if (rv != APR_SUCCESS) {
- DBG1(r,"tmpfile open failed[%s]", tmpfile);
+ DBG(r,"tmpfile open failed[%s]", tmpfile);
return HTTP_NOT_FOUND;
}
ap_send_fd(fout, r, query_string->offset, query_string->count, &sendbyte);
apr_file_close(fout);
ap_rflush(r);
- DBG1(r, "send file data[%d]byte", sendbyte);
+ DBG(r, "send file data[%d]byte", (int)sendbyte);
}
}
return OK;
}
+
static apr_status_t
-s_header_only_cache_file(device_table* spec, query_string_param_t* query_string, request_rec* r, const char* tmpfile)
+s_send_original_file(request_rec *r, const char *originalfile)
{
apr_status_t rv;
apr_finfo_t st;
- char* contentLength;
+ apr_file_t *fout;
+ apr_size_t sendbyte = 0;
- rv = apr_stat(&st, tmpfile, APR_FINFO_MIN, r->pool);
+ rv = apr_stat(&st, originalfile, APR_FINFO_MIN, r->pool);
if (rv != APR_SUCCESS)
return HTTP_NOT_FOUND;
- DBG1(r, "mode:[%d]", query_string->mode);
- DBG1(r, "name:[%s]", query_string->name);
- DBG1(r, "offset:[%ld]", query_string->offset);
- DBG1(r, "count:[%ld]", query_string->count);
-
- if (spec->available_jpeg) {
- r->content_type = apr_psprintf(r->pool, "image/jpeg");
- }
- else
- if (spec->available_png) {
- r->content_type = apr_psprintf(r->pool, "image/png");
- }
- else
- if (spec->available_gif) {
- r->content_type = apr_psprintf(r->pool, "image/gif");
- }
- else
- if (spec->available_bmp2 || spec->available_bmp4) {
- r->content_type = apr_psprintf(r->pool, "image/bmp");
+ rv = apr_file_open(&fout, originalfile,
+ APR_READ | APR_BINARY, APR_OS_DEFAULT, r->pool);
+ if (rv != APR_SUCCESS) {
+ DBG(r, "originalfile open failed[%s]", originalfile);
+ return HTTP_NOT_FOUND;
}
+ ap_send_fd(fout, r, 0, st.size, &sendbyte);
+ apr_file_close(fout);
+ ap_rflush(r);
+ DBG(r, "send file data[%d]byte", (int)sendbyte);
+
+ return OK;
+}
+
+
+static apr_status_t
+s_header_only_cache_file(device_table *UNUSED(spec), query_string_param_t *query_string, request_rec *r, const char *tmpfile)
+{
+ apr_status_t rv;
+ apr_finfo_t st;
+ char *contentLength;
+
+ rv = apr_stat(&st, tmpfile, APR_FINFO_MIN, r->pool);
+ if (rv != APR_SUCCESS)
+ return HTTP_NOT_FOUND;
+
+ DBG(r, "mode:[%d]", query_string->mode);
+ DBG(r, "name:[%s]", query_string->name);
+ DBG(r, "offset:[%ld]", query_string->offset);
+ DBG(r, "count:[%ld]", query_string->count);
+
if (query_string->mode != IMG_CONV_MODE_EZGET && query_string->name == NULL) {
contentLength = apr_psprintf(r->pool, "%d", (int)st.size);
apr_table_setn(r->headers_out, "Content-Length", (const char*)contentLength);
+
+ MagickWand *magick_wand = NewMagickWand();
+ if (MagickReadImage(magick_wand,tmpfile) == MagickFalse) {
+ EXIT_MAGICK_ERROR();
+ return HTTP_NOT_FOUND;
+ }
+ if (MagickStripImage(magick_wand) == MagickFalse) {
+ ERR(r, "mod_chxj: strip image failure.");
+ EXIT_MAGICK_ERROR();
+ return HTTP_NOT_FOUND;
+ }
+ char *nowFormat = MagickGetImageFormat(magick_wand);
+ DestroyMagickWand(magick_wand);
+ if (nowFormat) {
+ if (STRCASEEQ('j','J',"jpeg",nowFormat) || STRCASEEQ('j','J',"jpg",nowFormat)) {
+ DBG(r, "detect cache file => jpg.");
+ ap_set_content_type(r, "image/jpeg");
+ }
+ else if (STRCASEEQ('p','P',"png", nowFormat)) {
+ DBG(r, "detect cache file => png.");
+ ap_set_content_type(r, "image/png");
+ }
+ else if (STRCASEEQ('g','G',"gif", nowFormat)) {
+ DBG(r, "detect cache file => gif.");
+ ap_set_content_type(r, "image/gif");
+ }
+ else if (STRCASEEQ('b','B',"bmp", nowFormat)) {
+ DBG(r, "detect cache file => bmp.");
+ ap_set_content_type(r, "image/bmp");
+ }
+ else {
+ ERR(r, "detect unknown file");
+ return HTTP_NOT_FOUND;
+ }
+ }
- DBG1(r,"Content-Length:[%d]", (int)st.size);
+ DBG(r,"Content-Length:[%d]", (int)st.size);
}
else
if (query_string->mode == IMG_CONV_MODE_EZGET) {
- char* name = apr_pstrdup(r->pool, basename(r->filename));
+ char *name = apr_pstrdup(r->pool, basename(r->filename));
name[strlen(name)-4] = 0;
if (strcasecmp(r->content_type, "image/jpeg") == 0) {
- ap_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
+ chxj_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
}
else
if (strcasecmp(r->content_type, "image/bmp") == 0) {
- ap_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
+ chxj_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
}
else
if (strcasecmp(r->content_type, "image/png") == 0) {
- ap_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
+ chxj_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
}
else
if (strcasecmp(r->content_type, "image/gif") == 0) {
- ap_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
+ chxj_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
}
}
else
if (query_string->mode == IMG_CONV_MODE_WALLPAPER && query_string->name != NULL) {
if (query_string->count == -1 && query_string->offset == -1) {
- ap_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
+ chxj_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
}
else
if (query_string->count == -2 && query_string->offset == -1) {
- ap_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
+ chxj_set_content_type(r, "text/x-hdml; charset=Shift_JIS");
}
else {
- ap_set_content_type(r, "application/x-up-download");
+ chxj_set_content_type(r, "application/x-up-download");
contentLength = apr_psprintf(r->pool, "%ld", query_string->count);
apr_table_setn(r->headers_out, "Content-Length", (const char*)contentLength);
- DBG1(r, "Content-Length:[%d]", (int)st.size);
+ DBG(r, "Content-Length:[%d]", (int)st.size);
}
}
}
+static void
+s_init_serial_pattern(apr_pool_t *p)
+{
+ if (!v_docomo_serial_pattern1) {
+ v_docomo_serial_pattern1 = chxj_compile_for_preg_replace(p, "/ser[^;\\)]+");
+ }
+ if (!v_docomo_serial_pattern2) {
+ v_docomo_serial_pattern2 = chxj_compile_for_preg_replace(p, ";ser[^;\\)]+");
+ }
+ if (!v_docomo_serial_pattern3) {
+ v_docomo_serial_pattern3 = chxj_compile_for_preg_replace(p, ";icc[^;\\)]+");
+ }
+ if (!v_softbank_serial_pattern1) {
+ v_softbank_serial_pattern1 = chxj_compile_for_preg_replace(p, "/SN[0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z] ");
+ }
+}
+
-static char*
-s_create_workfile(
- request_rec* r,
- mod_chxj_config* conf,
- const char* user_agent,
+static char *
+s_create_workfile_name(
+ request_rec *r,
+ mod_chxj_config *conf,
+ const char *user_agent,
query_string_param_t *qsp)
{
- int ii;
- int jj;
- int len;
- char* w = apr_palloc(r->pool, 256);
- char* fname;
+ int ii;
+ int jj;
+ int len;
+ char *w = apr_palloc(r->pool, 256);
+ char *fname;
+ char *new_user_agent;
+
+ s_init_serial_pattern(r->server->process->pool);
+
+ /* for DoCoMo */
+ new_user_agent = chxj_preg_replace(r->pool, v_docomo_serial_pattern1, "", user_agent);
+ new_user_agent = chxj_preg_replace(r->pool, v_docomo_serial_pattern2, "", new_user_agent);
+ new_user_agent = chxj_preg_replace(r->pool, v_docomo_serial_pattern3, "", new_user_agent);
+
+ /* for SoftBank */
+ new_user_agent = chxj_preg_replace(r->pool, v_softbank_serial_pattern1, " ", new_user_agent);
+
+ DBG(r, "old user_agent:[%s] ==> new user_agent:[%s]", user_agent, new_user_agent);
+
memset(w, 0, 256);
switch (qsp->mode) {
case IMG_CONV_MODE_THUMBNAIL:
- fname = apr_psprintf(r->pool, "%s.%s.thumbnail", r->filename, user_agent);
- DBG1(r, "mode=thumbnail [%s]", fname);
+ fname = apr_psprintf(r->pool, "%s.%s.thumbnail", r->filename, new_user_agent);
+ DBG(r, "mode=thumbnail [%s]", fname);
break;
+
case IMG_CONV_MODE_WALLPAPER:
case IMG_CONV_MODE_EZGET:
- fname = apr_psprintf(r->pool, "%s.%s.wallpaper", r->filename, user_agent);
- DBG1(r, "mode=WallPaper [%s]", fname);
+ fname = apr_psprintf(r->pool, "%s.%s.wallpaper", r->filename, new_user_agent);
+ DBG(r, "mode=WallPaper [%s]", fname);
break;
+
case IMG_CONV_MODE_NORMAL:
default:
- fname = apr_psprintf(r->pool, "%s.%s", r->filename, user_agent);
+ fname = apr_psprintf(r->pool, "%s.%s", r->filename, new_user_agent);
if (qsp->width)
fname = apr_psprintf(r->pool, "%s.w%d", fname, qsp->width);
if (qsp->height)
fname = apr_psprintf(r->pool, "%s.h%d", fname, qsp->height);
- DBG1(r,"mode=normal [%s]", fname);
+ DBG(r,"mode=normal [%s]", fname);
break;
}
if (qsp->ua_flag == UA_IGN) {
return apr_psprintf(r->pool, "%s/%s", conf->image_cache_dir,w);
}
+
static unsigned short
-s_add_crc(const char* writedata, apr_size_t writebyte)
+s_add_crc(const char *writedata, apr_size_t writebyte)
{
unsigned short crc = 0xffff;
apr_size_t ii;
return crc;
}
+
int
chxj_trans_name(request_rec *r)
{
- const char* ccp;
- char* docroot;
- int len;
- apr_finfo_t st;
- apr_status_t rv;
- mod_chxj_config* conf;
- int ii;
- char* ext[] = {
+ const char *ccp;
+ char *docroot;
+ int len;
+ apr_finfo_t st;
+ apr_status_t rv;
+ mod_chxj_config *conf;
+ int ii;
+ char *ext[] = {
"jpg",
"jpeg",
"png",
"bmp",
"gif",
- "qrc", /* QRCode½ÐÎÏÍÑ¥Õ¥¡¥¤¥ë¤Î³ÈÄ¥»Ò */
+ "qrc", /* QRCode出力用ファイルの拡張子 */
"",
};
- char* fname;
- char* idx;
- char* filename_sv;
+ char *fname = NULL;
+ char *idx;
+ char *filename_sv;
int do_ext_check = TRUE;
int next_ok = FALSE;
DBG(r, "start chxj_trans_name()");
- conf = ap_get_module_config(r->per_dir_config, &chxj_module);
+ conf = chxj_get_module_config(r->per_dir_config, &chxj_module);
if (conf == NULL) {
- DBG1(r, "end chxj_trans_name() conf is null[%s]", r->uri);
+ DBG(r, "end chxj_trans_name() conf is null[%s]", r->uri);
return DECLINED;
}
}
- DBG1(r,"Match URI[%s]", r->uri);
+ DBG(r,"Match URI[%s]", r->uri);
if (r->filename == NULL)
else
filename_sv = r->filename;
- DBG1(r,"r->filename[%s]", filename_sv);
+ DBG(r,"r->filename[%s]", filename_sv);
ccp = ap_document_root(r);
if (ccp == NULL)
else
filename_sv = apr_pstrcat(r->pool, docroot, filename_sv, NULL);
- DBG1(r,"URI[%s]", filename_sv);
+ DBG(r,"URI[%s]", filename_sv);
do_ext_check = TRUE;
for (ii=0; ii<7-1; ii++) {
else
fname = apr_psprintf(r->pool, "%s.%s", filename_sv, ext[ii]);
- DBG1(r,"search [%s]", fname);
+ DBG(r,"search [%s]", fname);
rv = apr_stat(&st, fname, APR_FINFO_MIN, r->pool);
if (rv == APR_SUCCESS) {
}
}
if (fname == NULL) {
- DBG1(r,"NotFound [%s]", r->filename);
+ DBG(r,"NotFound [%s]", r->filename);
return DECLINED;
}
for (ii=0; ii<7-1; ii++) {
}
if (! next_ok) {
- DBG1(r,"NotFound [%s]", r->filename);
+ DBG(r,"NotFound [%s]", r->filename);
return DECLINED;
}
if (r->handler == NULL || strcasecmp(r->handler, "chxj-qrcode") != 0) {
- DBG1(r,"Found [%s]", fname);
+ DBG(r,"Found [%s]", fname);
r->filename = apr_psprintf(r->pool, "%s", fname);
*
* @param r [i]
*/
-static query_string_param_t*
+static query_string_param_t *
s_get_query_string_param(request_rec *r)
{
- char* pair;
- char* name;
- char* value;
- char* pstate;
- char* vstate;
- char* s;
- query_string_param_t* param;
+ char *pair;
+ char *name;
+ char *value;
+ char *pstate;
+ char *vstate;
+ char *s;
+ query_string_param_t *param;
s = apr_pstrdup(r->pool, r->parsed_uri.query);
param = apr_palloc(r->pool, sizeof(query_string_param_t));