diff --git a/applications/jpip/CHANGES b/applications/jpip/CHANGES index 94d0359f..6c5334bd 100644 --- a/applications/jpip/CHANGES +++ b/applications/jpip/CHANGES @@ -5,6 +5,9 @@ What's New for OpenJPIP ! : changed + : added +August 24, 2011 ++ [kaori] added cachemodel_manager, which had been managed in target_manager previously + August 16, 2011 * [antonin] fixed cmake support for openjpip diff --git a/applications/jpip/libopenjpip/cachemodel_manager.c b/applications/jpip/libopenjpip/cachemodel_manager.c new file mode 100644 index 00000000..fdd1b832 --- /dev/null +++ b/applications/jpip/libopenjpip/cachemodel_manager.c @@ -0,0 +1,151 @@ +/* + * $Id$ + * + * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2011, Professor Benoit Macq + * Copyright (c) 2010-2011, Kaori Hagihara + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include "cachemodel_manager.h" +#include "faixbox_manager.h" + +#ifdef SERVER +#include "fcgi_stdio.h" +#define logstream FCGI_stdout +#else +#define FCGI_stdout stdout +#define FCGI_stderr stderr +#define logstream stderr +#endif //SERVER + + +cachemodellist_param_t * gene_cachemodellist() +{ + cachemodellist_param_t *cachemodellist; + + cachemodellist = (cachemodellist_param_t *)malloc( sizeof(cachemodellist_param_t)); + + cachemodellist->first = NULL; + cachemodellist->last = NULL; + + return cachemodellist; +} + +cachemodel_param_t * gene_cachemodel( cachemodellist_param_t *cachemodellist, target_param_t *target) +{ + cachemodel_param_t *cachemodel; + faixbox_param_t *tilepart; + size_t numOfelem; + + cachemodel = (cachemodel_param_t *)malloc( sizeof(cachemodel_param_t)); + + refer_target( target, &cachemodel->target); + cachemodel->mhead_model = false; + + tilepart = target->codeidx->tilepart; + numOfelem = get_nmax( tilepart)*get_m( tilepart); + cachemodel->tp_model = (bool *)calloc( 1, numOfelem*sizeof(bool)); + + cachemodel->next = NULL; + + if( cachemodellist){ + if( cachemodellist->first) // there are one or more entries + cachemodellist->last->next = cachemodel; + else // first entry + cachemodellist->first = cachemodel; + cachemodellist->last = cachemodel; + } + +#ifndef SERVER + fprintf( logstream, "local log: cachemodel generated\n"); +#endif + + return cachemodel; +} + +void print_cachemodel( cachemodel_param_t cachemodel) +{ + Byte8_t TPnum; // num of tile parts in each tile + int i, j, k, n; + + fprintf( logstream, "target: %s\n", cachemodel.target->filename); + fprintf( logstream, "\t main header model: %d\n", cachemodel.mhead_model); + + fprintf( logstream, "\t tile part model:\n"); + + TPnum = get_nmax( cachemodel.target->codeidx->tilepart); + + for( i=0, n=0; icodeidx->YTnum; i++){ + for( j=0; jcodeidx->XTnum; j++){ + for( k=0; kfirst; + + while( foundcachemodel != NULL){ + + if( foundcachemodel->target == target) + return foundcachemodel; + + foundcachemodel = foundcachemodel->next; + } + return NULL; +} + +void delete_cachemodellist( cachemodellist_param_t **cachemodellist) +{ + cachemodel_param_t *cachemodelPtr, *cachemodelNext; + + cachemodelPtr = (*cachemodellist)->first; + while( cachemodelPtr != NULL){ + cachemodelNext=cachemodelPtr->next; + delete_cachemodel( &cachemodelPtr); + cachemodelPtr=cachemodelNext; + } + free(*cachemodellist); +} + +void delete_cachemodel( cachemodel_param_t **cachemodel) +{ + unrefer_target( (*cachemodel)->target); + + free( (*cachemodel)->tp_model); + +#ifndef SERVER + fprintf( logstream, "local log: cachemodel deleted\n"); +#endif + free( *cachemodel); +} diff --git a/applications/jpip/libopenjpip/cachemodel_manager.h b/applications/jpip/libopenjpip/cachemodel_manager.h new file mode 100644 index 00000000..efc6927e --- /dev/null +++ b/applications/jpip/libopenjpip/cachemodel_manager.h @@ -0,0 +1,102 @@ +/* + * $Id$ + * + * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2011, Professor Benoit Macq + * Copyright (c) 2010-2011, Kaori Hagihara + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef CACHEMODEL_MANAGER_H_ +# define CACHEMODEL_MANAGER_H_ + +#include "bool.h" +#include "target_manager.h" + +//! Cache model parameters +typedef struct cachemodel_param{ + target_param_t *target; //!< reference pointer to the target + bool mhead_model; //!< main header model, if sent, 1, else 0 + bool *tp_model; //!< dynamic array pointer of tile part model, if sent, 1, else 0 + struct cachemodel_param *next; //!< pointer to the next cache model +} cachemodel_param_t; + +//! Cache model list parameters +typedef struct cachemodellist_param{ + cachemodel_param_t *first; //!< first cache model pointer of the list + cachemodel_param_t *last; //!< last cache model pointer of the list +} cachemodellist_param_t; + + +/** + * generate a cache model list + * + * @return pointer to the generated cache model list + */ +cachemodellist_param_t * gene_cachemodellist(); + +/** + * generate a session under the sesion list + * + * @param[in] cachemodellist cachemodel list to insert the generated cache model + * @param[in] target pointer the reference target + * @return pointer to the generated cache model + */ +cachemodel_param_t * gene_cachemodel( cachemodellist_param_t *cachemodellist, target_param_t *target); + + +/** + * print cache model + * + * @param[in] cachemodel cache model + */ +void print_cachemodel( cachemodel_param_t cachemodel); + + +/** + * search a cache model of a target + * + * @param[in] target refering target + * @param[in] cachemodellist cache model list + * @return found cache model pointer + */ +cachemodel_param_t * search_cachemodel( target_param_t *target, cachemodellist_param_t *cachemodellist); + + +/** + * delete a cache model + * + * @param[in] cachemodel address of the cachemodel pointer + */ +void delete_cachemodel( cachemodel_param_t **cachemodel); + +/** + * delete cachemodel list + * + * @param[in,out] cachemodellist address of the cachemodel list pointer + */ +void delete_cachemodellist( cachemodellist_param_t **cachemodellist); + + +#endif /* !CACHEMODEL_MANAGER_H_ */ diff --git a/applications/jpip/libopenjpip/comMakefile.mk b/applications/jpip/libopenjpip/comMakefile.mk index de54ee0a..bee0d617 100644 --- a/applications/jpip/libopenjpip/comMakefile.mk +++ b/applications/jpip/libopenjpip/comMakefile.mk @@ -10,7 +10,7 @@ all: $(LIBNAME) $(LIBNAME): target_manager.o byte_manager.o box_manager.o boxheader_manager.o manfbox_manager.o \ mhixbox_manager.o marker_manager.o codestream_manager.o faixbox_manager.o index_manager.o \ - msgqueue_manager.o metadata_manager.o placeholder_manager.o ihdrbox_manager.o imgreg_manager.o + msgqueue_manager.o metadata_manager.o placeholder_manager.o ihdrbox_manager.o imgreg_manager.o cachemodel_manager.o ar r $@ $^ clean: diff --git a/applications/jpip/libopenjpip/index_manager.c b/applications/jpip/libopenjpip/index_manager.c index 847fd528..5a9d187a 100644 --- a/applications/jpip/libopenjpip/index_manager.c +++ b/applications/jpip/libopenjpip/index_manager.c @@ -35,6 +35,7 @@ #include #include +#include "bool.h" #include "index_manager.h" #include "box_manager.h" #include "manfbox_manager.h" @@ -145,31 +146,10 @@ void print_index( index_param_t index) print_allmetadata( index.metadatalist); } -void print_cachemodel( index_param_t index) -{ - Byte8_t TPnum; // num of tile parts in each tile - int i, j, k, n; - - TPnum = get_nmax( index.tilepart); - - fprintf( logstream, "\t main header model: %d\n", index.mhead_model); - - fprintf( logstream, "\t tile part model:\n"); - for( i=0, n=0; imetadatalist)); delete_faixbox( &((*index)->tilepart)); - free( (*index)->tp_model); free(*index); } @@ -365,7 +345,6 @@ bool set_mainmhixdata( box_param_t *cidx_box, codestream_param_t codestream, ind if( !(mhix_box = gene_boxbyType( cidx_box->fd, get_DBoxoff( cidx_box), get_DBoxlen( cidx_box), "mhix"))) return false; - jp2idx->mhead_model = 0; jp2idx->mhead_length = fetch_DBox8bytebigendian( mhix_box, 0); mhix = gene_mhixbox( mhix_box); @@ -383,8 +362,6 @@ bool set_tpixdata( box_param_t *cidx_box, index_param_t *jp2idx) { box_param_t *tpix_box; //!< tpix box box_param_t *faix_box; //!< faix box - faixbox_param_t *faix; //!< faix - size_t numOfelem; if( !(tpix_box = gene_boxbyType( cidx_box->fd, get_DBoxoff( cidx_box), get_DBoxlen( cidx_box), "tpix"))) return false; @@ -392,14 +369,8 @@ bool set_tpixdata( box_param_t *cidx_box, index_param_t *jp2idx) if( !(faix_box = gene_boxbyType( tpix_box->fd, get_DBoxoff( tpix_box), get_DBoxlen( tpix_box), "faix"))) return false; - faix = gene_faixbox( faix_box); - jp2idx->tilepart = faix; - numOfelem = get_nmax( faix)*get_m( faix); + jp2idx->tilepart = gene_faixbox( faix_box); - jp2idx->tp_model = (bool *)malloc( numOfelem*sizeof(bool)); - memset( jp2idx->tp_model, 0, numOfelem*sizeof(bool)); - - //delete_faixbox( &faix); // currently the jp2idx element free( tpix_box); free( faix_box); diff --git a/applications/jpip/libopenjpip/index_manager.h b/applications/jpip/libopenjpip/index_manager.h index 5dd668c5..6f16f6cb 100644 --- a/applications/jpip/libopenjpip/index_manager.h +++ b/applications/jpip/libopenjpip/index_manager.h @@ -31,8 +31,6 @@ #ifndef INDEX_MANAGER_H_ # define INDEX_MANAGER_H_ -#include -#include "bool.h" #include "byte_manager.h" #include "faixbox_manager.h" #include "metadata_manager.h" @@ -72,9 +70,6 @@ typedef struct index_param{ Byte_t YRsiz[3]; //!< vertical separation of a sample of //!component with respect to the reference grid faixbox_param_t *tilepart; //!< tile part information from tpix box - bool mhead_model; //!< main header model, if sent, 1, else 0 - bool *tp_model; //!< dynamic array pointer of tile part - //!model, if sent, 1, else 0 } index_param_t; @@ -94,13 +89,6 @@ index_param_t * parse_jp2file( int fd); */ void print_index( index_param_t index); -/** - * print cache model - * - * @param[in] index index parameters - */ -void print_cachemodel( index_param_t index); - /** * delete index diff --git a/applications/jpip/libopenjpip/msgqueue_manager.c b/applications/jpip/libopenjpip/msgqueue_manager.c index 1e11041e..13845bb3 100644 --- a/applications/jpip/libopenjpip/msgqueue_manager.c +++ b/applications/jpip/libopenjpip/msgqueue_manager.c @@ -57,7 +57,7 @@ #define MAINHEADER_MSG 6 #define METADATA_MSG 8 -msgqueue_param_t * gene_msgqueue( bool stateless, target_param_t *target) +msgqueue_param_t * gene_msgqueue( bool stateless, cachemodel_param_t *cachemodel) { msgqueue_param_t *msgqueue; @@ -67,7 +67,7 @@ msgqueue_param_t * gene_msgqueue( bool stateless, target_param_t *target) msgqueue->last = NULL; msgqueue->stateless = stateless; - msgqueue->target = target; + msgqueue->cachemodel = cachemodel; return msgqueue; } @@ -86,8 +86,8 @@ void delete_msgqueue( msgqueue_param_t **msgqueue) free( ptr); ptr = next; } - if( (*msgqueue)->stateless && (*msgqueue)->target) - delete_target( &((*msgqueue)->target)); + if( (*msgqueue)->stateless && (*msgqueue)->cachemodel) + delete_cachemodel( &((*msgqueue)->cachemodel)); free(*msgqueue); } @@ -124,10 +124,12 @@ void enqueue_message( message_param_t *msg, msgqueue_param_t *msgqueue); void enqueue_mainheader( msgqueue_param_t *msgqueue) { + cachemodel_param_t *cachemodel; target_param_t *target; message_param_t *msg; - target = msgqueue->target; + cachemodel = msgqueue->cachemodel; + target = cachemodel->target; msg = (message_param_t *)malloc( sizeof(message_param_t)); @@ -144,11 +146,12 @@ void enqueue_mainheader( msgqueue_param_t *msgqueue) enqueue_message( msg, msgqueue); - target->codeidx->mhead_model = true; + cachemodel->mhead_model = true; } void enqueue_tile( int tile_id, int level, msgqueue_param_t *msgqueue) { + cachemodel_param_t *cachemodel; target_param_t *target; bool *tp_model; Byte8_t numOftparts; // num of tile parts par tile @@ -159,7 +162,8 @@ void enqueue_tile( int tile_id, int level, msgqueue_param_t *msgqueue) Byte8_t binOffset, binLength; int i; - target = msgqueue->target; + cachemodel = msgqueue->cachemodel; + target = cachemodel->target; codeidx = target->codeidx; tilepart = codeidx->tilepart; @@ -171,7 +175,7 @@ void enqueue_tile( int tile_id, int level, msgqueue_param_t *msgqueue) return; } - tp_model = &codeidx->tp_model[ tile_id*numOftparts]; + tp_model = &cachemodel->tp_model[ tile_id*numOftparts]; binOffset=0; for( i=0; itarget->codeidx->metadatalist; + metadatalist = msgqueue->cachemodel->target->codeidx->metadatalist; metadata = search_metadata( meta_id, metadatalist); if( !metadata){ @@ -243,7 +247,7 @@ void enqueue_box( int meta_id, boxlist_param_t *boxlist, msgqueue_param_t *msgqu box = boxlist->first; while( box){ - msg = gene_metamsg( meta_id, *binOffset, box->length, box->offset, NULL, msgqueue->target->csn); + msg = gene_metamsg( meta_id, *binOffset, box->length, box->offset, NULL, msgqueue->cachemodel->target->csn); enqueue_message( msg, msgqueue); *binOffset += box->length; @@ -258,7 +262,7 @@ void enqueue_phld( int meta_id, placeholderlist_param_t *phldlist, msgqueue_para phld = phldlist->first; while( phld){ - msg = gene_metamsg( meta_id, *binOffset, phld->LBox, 0, phld, msgqueue->target->csn); + msg = gene_metamsg( meta_id, *binOffset, phld->LBox, 0, phld, msgqueue->cachemodel->target->csn); enqueue_message( msg, msgqueue); *binOffset += phld->LBox; @@ -270,7 +274,7 @@ void enqueue_boxcontents( int meta_id, boxcontents_param_t *boxcontents, msgqueu { message_param_t *msg; - msg = gene_metamsg( meta_id, *binOffset, boxcontents->length, boxcontents->offset, NULL, msgqueue->target->csn); + msg = gene_metamsg( meta_id, *binOffset, boxcontents->length, boxcontents->offset, NULL, msgqueue->cachemodel->target->csn); enqueue_message( msg, msgqueue); *binOffset += boxcontents->length; @@ -357,7 +361,7 @@ void emit_stream_from_msgqueue( msgqueue_param_t *msgqueue) if( msg->phld) emit_placeholder( msg->phld); else - emit_body( msg, msgqueue->target->fd); + emit_body( msg, msgqueue->cachemodel->target->fd); msg = msg->next; } diff --git a/applications/jpip/libopenjpip/msgqueue_manager.h b/applications/jpip/libopenjpip/msgqueue_manager.h index 469194ab..d832958e 100644 --- a/applications/jpip/libopenjpip/msgqueue_manager.h +++ b/applications/jpip/libopenjpip/msgqueue_manager.h @@ -31,10 +31,9 @@ #ifndef MSGQUEUE_MANAGER_H_ # define MSGQUEUE_MANAGER_H_ -#include #include "bool.h" #include "byte_manager.h" -#include "target_manager.h" +#include "cachemodel_manager.h" #include "placeholder_manager.h" //! message parameters @@ -56,17 +55,17 @@ typedef struct msgqueue_param{ message_param_t *first; //!< first message pointer of the list message_param_t *last; //!< last message pointer of the list bool stateless; //!< if this is a stateless message queue - target_param_t *target; //!< reference target pointer + cachemodel_param_t *cachemodel; //!< reference cachemodel pointer } msgqueue_param_t; /** * generate message queue * - * @param[in] stateless if this is a stateless message queue - * @param[in] target reference target pointer - * @return generated message queue pointer + * @param[in] stateless if this is a stateless message queue + * @param[in] cachemodel cachemodel pointer + * @return generated message queue pointer */ -msgqueue_param_t * gene_msgqueue( bool stateless, target_param_t *target); +msgqueue_param_t * gene_msgqueue( bool stateless, cachemodel_param_t *cachemodel); /** * delete message queue diff --git a/applications/jpip/libopenjpip/target_manager.c b/applications/jpip/libopenjpip/target_manager.c index f0056e72..0f085442 100644 --- a/applications/jpip/libopenjpip/target_manager.c +++ b/applications/jpip/libopenjpip/target_manager.c @@ -68,14 +68,13 @@ targetlist_param_t * gene_targetlist() */ int open_jp2file( char filename[]); -target_param_t * gene_target( char *targetname) +target_param_t * gene_target( targetlist_param_t *targetlist, char *targetname) { target_param_t *target; int fd; index_param_t *jp2idx; static int last_csn = 0; - if( targetname[0]=='\0'){ fprintf( FCGI_stderr, "Error: exception, no targetname in gene_target()\n"); return NULL; @@ -96,12 +95,34 @@ target_param_t * gene_target( char *targetname) target->fd = fd; target->csn = last_csn++; target->codeidx = jp2idx; + target->num_of_use = 0; target->next=NULL; + if( targetlist->first) // there are one or more entries + targetlist->last->next = target; + else // first entry + targetlist->first = target; + targetlist->last = target; + +#ifndef SERVER + fprintf( logstream, "local log: target %s generated\n", targetname); +#endif + return target; } +void refer_target( target_param_t *reftarget, target_param_t **ptr) +{ + *ptr = reftarget; + reftarget->num_of_use++; +} + +void unrefer_target( target_param_t *target) +{ + target->num_of_use--; +} + void delete_target( target_param_t **target) { close( (*target)->fd); @@ -146,14 +167,20 @@ void delete_targetlist(targetlist_param_t **targetlist) free( *targetlist); } +void print_target( target_param_t *target) +{ + fprintf( logstream, "target:\n"); + fprintf( logstream, "\t csn=%d\n", target->csn); + fprintf( logstream, "\t target=%s\n\n", target->filename); +} + void print_alltarget( targetlist_param_t *targetlist) { target_param_t *ptr; ptr = targetlist->first; while( ptr != NULL){ - fprintf( logstream,"csn=%d\n", ptr->csn); - fprintf( logstream,"target=%s\n", ptr->filename); + print_target( ptr); ptr=ptr->next; } } diff --git a/applications/jpip/libopenjpip/target_manager.h b/applications/jpip/libopenjpip/target_manager.h index afe367e7..5de22ba6 100644 --- a/applications/jpip/libopenjpip/target_manager.h +++ b/applications/jpip/libopenjpip/target_manager.h @@ -42,6 +42,7 @@ typedef struct target_param{ int fd; //!< file descriptor int csn; //!< codestream number index_param_t *codeidx; //!< index information of codestream + int num_of_use; //!< numbers of sessions refering to this target struct target_param *next; //!< pointer to the next target } target_param_t; @@ -65,12 +66,29 @@ targetlist_param_t * gene_targetlist(); /** * generate a target * + * @param[in] targetlist target list to insert the generated target * @param[in] targetname target file name * @return pointer to the generated target */ -target_param_t * gene_target( char *targetname); +target_param_t * gene_target( targetlist_param_t *targetlist, char *targetname); +/** + * refer a target, used to make a new cache model + * + * @param[in] reftarget reference target pointer + * @param[out] ptr address of feeding target pointer + */ +void refer_target( target_param_t *reftarget, target_param_t **ptr); + + +/** + * refer a target, used to make a new cache model + * + * @param[in] target reference pointer to the target + */ +void unrefer_target( target_param_t *target); + /** * delete a target * @@ -95,6 +113,14 @@ void delete_target_in_list( target_param_t **target, targetlist_param_t *targetl */ void delete_targetlist(targetlist_param_t **targetlist); + +/** + * print target parameters + * + * @param[in] target target pointer + */ +void print_target( target_param_t *target); + /** * print all target parameters * diff --git a/applications/jpip/opj_client/opj_viewer/src/JPIPHttpClient.java b/applications/jpip/opj_client/opj_viewer/src/JPIPHttpClient.java index 3b8781af..c6bdb556 100644 --- a/applications/jpip/opj_client/opj_viewer/src/JPIPHttpClient.java +++ b/applications/jpip/opj_client/opj_viewer/src/JPIPHttpClient.java @@ -146,7 +146,7 @@ public class JPIPHttpClient urlconn.setRequestMethod("GET"); urlconn.setInstanceFollowRedirects(false); urlconn.connect(); - + Map> headers = urlconn.getHeaderFields(); java.util.List hvaluelist; @@ -177,10 +177,10 @@ public class JPIPHttpClient cid = hvalueline.substring( hvalueline.indexOf('=')+1, hvalueline.indexOf(',')); System.err.println("cid: " + cid); } - + InputStream input = urlconn.getInputStream(); buflen = input.available(); - + if( buflen > 0){ ByteArrayOutputStream tmpstream = new ByteArrayOutputStream(); byte[] buf = new byte[ 1024]; @@ -230,7 +230,7 @@ public class JPIPHttpClient } urlconn.disconnect(); - + return jpipstream; } diff --git a/applications/jpip/opj_server/Makefile.nix b/applications/jpip/opj_server/Makefile.nix index f4aa97b1..238a686b 100644 --- a/applications/jpip/opj_server/Makefile.nix +++ b/applications/jpip/opj_server/Makefile.nix @@ -1,4 +1,5 @@ LIBDIR = ../libopenjpip + LIBFNAME = $(LIBDIR)/libopenjpip_server.a CFLAGS = -O3 -Wall -m32 -DSERVER -I$(LIBDIR) LDFLAGS = -L$(LIBDIR) -lm -lfcgi -lopenjpip_server diff --git a/applications/jpip/opj_server/channel_manager.c b/applications/jpip/opj_server/channel_manager.c index cb2adc19..961c73c9 100644 --- a/applications/jpip/opj_server/channel_manager.c +++ b/applications/jpip/opj_server/channel_manager.c @@ -54,20 +54,18 @@ channellist_param_t * gene_channellist() return channellist; } - -channel_param_t * gene_channel( query_param_t query_param, target_param_t *target, channellist_param_t *channellist) +channel_param_t * gene_channel( query_param_t query_param, cachemodel_param_t *cachemodel, channellist_param_t *channellist) { channel_param_t *channel; - - // set the target - if( !target){ + + if( !cachemodel){ fprintf( FCGI_stdout, "Status: 404\r\n"); fprintf( FCGI_stdout, "Reason: cnew cancelled\r\n"); return NULL; } - + channel = (channel_param_t *)malloc( sizeof(channel_param_t)); - channel->target = target; + channel->cachemodel = cachemodel; // set channel ID and get present time snprintf( channel->cid, MAX_LENOFCID, "%x%x", (unsigned int)time( &channel->start_tm), (unsigned int)rand());; @@ -141,7 +139,7 @@ void print_allchannel( channellist_param_t *channellist) ptr = channellist->first; while( ptr != NULL){ - fprintf( logstream,"channel-ID=%s \t target=%s\n", ptr->cid, ptr->target->filename); + fprintf( logstream,"channel-ID=%s \t target=%s\n", ptr->cid, ptr->cachemodel->target->filename); ptr=ptr->next; } } diff --git a/applications/jpip/opj_server/channel_manager.h b/applications/jpip/opj_server/channel_manager.h index 5dd970a5..b42a2eb7 100644 --- a/applications/jpip/opj_server/channel_manager.h +++ b/applications/jpip/opj_server/channel_manager.h @@ -33,16 +33,15 @@ #include #include "query_parser.h" -#include "target_manager.h" +#include "cachemodel_manager.h" //! Channel parameters typedef struct channel_param{ - target_param_t *target; //!< reference pointer to the target - char cid[MAX_LENOFCID]; //!< channel identifier - // - a record of the client's capabilities and preferences - // - to the extent that the server queues requests - time_t start_tm; //!< starting time - struct channel_param *next; //!< pointer to the next channel + cachemodel_param_t *cachemodel; //!< reference pointer to the cache model + char cid[MAX_LENOFCID]; //!< channel identifier + // - a record of the client's capabilities and preferences to the extent that the server queues requests + time_t start_tm; //!< starting time + struct channel_param *next; //!< pointer to the next channel } channel_param_t; @@ -65,11 +64,11 @@ channellist_param_t * gene_channellist(); * generate a channel under the channel list * * @param[in] query_param query parameters - * @param[in] target reference target + * @param[in] cachemodel reference cachemodel * @param[in] channellist channel list pointer * @return pointer to the generated channel */ -channel_param_t * gene_channel( query_param_t query_param, target_param_t *target, channellist_param_t *channellist); +channel_param_t * gene_channel( query_param_t query_param, cachemodel_param_t *cachemodel, channellist_param_t *channellist); /** * set channel variable parameters diff --git a/applications/jpip/opj_server/opj_server.c b/applications/jpip/opj_server/opj_server.c index 45b43df5..a898b6da 100644 --- a/applications/jpip/opj_server/opj_server.c +++ b/applications/jpip/opj_server/opj_server.c @@ -70,11 +70,13 @@ * * @param[in] query_param structured query * @param[in] sessionlist session list pointer + * @param[in] targetlist target list pointer * @param[in,out] msgqueue address of the message queue pointer * @return if succeeded (true) or failed (false) */ bool parse_JPIPrequest( query_param_t query_param, sessionlist_param_t *sessionlist, + targetlist_param_t *targetlist, msgqueue_param_t **msgqueue); @@ -97,12 +99,14 @@ bool associate_channel( query_param_t query_param, * * @param[in] query_param structured query * @param[in] sessionlist session list pointer + * @param[in] target requested target pointer * @param[in,out] cursession address of the associated/opened session pointer * @param[in,out] curchannel address of the associated/opened channel pointer * @return if succeeded (true) or failed (false) */ bool open_channel( query_param_t query_param, sessionlist_param_t *sessionlist, + target_param_t *target, session_param_t **cursession, channel_param_t **curchannel); @@ -124,12 +128,14 @@ bool close_channel( query_param_t query_param, * REQUEST: view-window (fsiz) * * @param[in] query_param structured query + * @param[in] target requested target pointer * @param[in,out] cursession associated session pointer * @param[in,out] curchannel associated channel pointer * @param[in,out] msgqueue address of the message queue pointer * @return if succeeded (true) or failed (false) */ bool gene_JPTstream( query_param_t query_param, + target_param_t *target, session_param_t *cursession, channel_param_t *curchannel, msgqueue_param_t **msgqueue); @@ -137,10 +143,12 @@ bool gene_JPTstream( query_param_t query_param, int main(void) { sessionlist_param_t *sessionlist; + targetlist_param_t *targetlist; bool parse_status; sessionlist = gene_sessionlist(); - + targetlist = gene_targetlist(); + #ifdef SERVER char *query_string; @@ -168,8 +176,7 @@ int main(void) #endif msgqueue = NULL; - parse_status = parse_JPIPrequest( query_param, sessionlist, &msgqueue); - + parse_status = parse_JPIPrequest( query_param, sessionlist, targetlist, &msgqueue); fprintf( FCGI_stdout, "\r\n"); @@ -178,28 +185,38 @@ int main(void) // print_allsession( sessionlist); print_msgqueue( msgqueue); #endif + emit_stream_from_msgqueue( msgqueue); delete_msgqueue( &msgqueue); } + delete_sessionlist( &sessionlist); + delete_targetlist( &targetlist); return 0; } bool parse_JPIPrequest( query_param_t query_param, sessionlist_param_t *sessionlist, + targetlist_param_t *targetlist, msgqueue_param_t **msgqueue) { + target_param_t *target = NULL; session_param_t *cursession = NULL; channel_param_t *curchannel = NULL; - + + if( query_param.target[0] !='\0') + if( !( target = search_target( query_param.target, targetlist))) + if(!( target = gene_target( targetlist, query_param.target))) + return false; + if( query_param.cid[0] != '\0') if( !associate_channel( query_param, sessionlist, &cursession, &curchannel)) return false; if( query_param.cnew){ - if( !open_channel( query_param, sessionlist, &cursession, &curchannel)) + if( !open_channel( query_param, sessionlist, target, &cursession, &curchannel)) return false; } if( query_param.cclose[0][0] != '\0') @@ -207,7 +224,7 @@ bool parse_JPIPrequest( query_param_t query_param, return false; if( (query_param.fx > 0 && query_param.fy > 0) || query_param.box_type[0][0] != 0) - if( !gene_JPTstream( query_param, cursession, curchannel, msgqueue)) + if( !gene_JPTstream( query_param, target, cursession, curchannel, msgqueue)) return false; return true; @@ -232,36 +249,24 @@ bool associate_channel( query_param_t query_param, bool open_channel( query_param_t query_param, sessionlist_param_t *sessionlist, + target_param_t *target, session_param_t **cursession, channel_param_t **curchannel) { - target_param_t *target=NULL; + cachemodel_param_t *cachemodel = NULL; - if( query_param.target[0] !='\0'){ // target query specified - if( *cursession){ - if( !( target = search_target( query_param.target, (*cursession)->targetlist))){ - if((target = gene_target( query_param.target))) - insert_target_into_session( *cursession, target); - else - return false; - } - } - else{ - if((target = gene_target( query_param.target))){ - // new session - *cursession = gene_session( sessionlist); - insert_target_into_session( *cursession, target); - } - else + if( target){ + if( !(*cursession)) + *cursession = gene_session( sessionlist); + if( !( cachemodel = search_cachemodel( target, (*cursession)->cachemodellist))) + if( !(cachemodel = gene_cachemodel( (*cursession)->cachemodellist, target))) return false; - } } - else{ - if( *cursession) - target = (*curchannel)->target; - } - - *curchannel = gene_channel( query_param, target, (*cursession)->channellist); + else + if( *curchannel) + cachemodel = (*curchannel)->cachemodel; + + *curchannel = gene_channel( query_param, cachemodel, (*cursession)->channellist); if( *curchannel == NULL) return false; @@ -335,22 +340,25 @@ void enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadata bool gene_JPTstream( query_param_t query_param, + target_param_t *target, session_param_t *cursession, channel_param_t *curchannel, msgqueue_param_t **msgqueue) { - target_param_t *target; index_param_t *codeidx; + cachemodel_param_t *cachemodel; if( !cursession || !curchannel){ // stateless - if((target = gene_target( query_param.target))) - *msgqueue = gene_msgqueue( true, target); - else + if( !target) return false; + if( !(cachemodel = gene_cachemodel( NULL, target))) + return false; + *msgqueue = gene_msgqueue( true, cachemodel); } else{ // session - target = curchannel->target; - *msgqueue = gene_msgqueue( false, target); + cachemodel = curchannel->cachemodel; + target = cachemodel->target; + *msgqueue = gene_msgqueue( false, cachemodel); } codeidx = target->codeidx; @@ -359,13 +367,12 @@ bool gene_JPTstream( query_param_t query_param, if( query_param.box_type[0][0] != 0) enqueue_metabins( query_param, codeidx->metadatalist, *msgqueue); - // image code + // image codestream if( query_param.fx > 0 && query_param.fy > 0){ - if( !codeidx->mhead_model) + if( !cachemodel->mhead_model) enqueue_mainheader( *msgqueue); enqueue_tiles( query_param, codeidx, *msgqueue); } - return true; } diff --git a/applications/jpip/opj_server/session_manager.c b/applications/jpip/opj_server/session_manager.c index 74d5e065..1e44a041 100644 --- a/applications/jpip/opj_server/session_manager.c +++ b/applications/jpip/opj_server/session_manager.c @@ -32,6 +32,7 @@ #include #include #include "session_manager.h" +#include "target_manager.h" #ifdef SERVER #include "fcgi_stdio.h" @@ -62,7 +63,7 @@ session_param_t * gene_session( sessionlist_param_t *sessionlist) session = (session_param_t *)malloc( sizeof(session_param_t)); session->channellist = gene_channellist(); - session->targetlist = gene_targetlist(); + session->cachemodellist = gene_cachemodellist(); session->next = NULL; @@ -102,19 +103,19 @@ bool search_session_and_channel( char cid[], return false; } -void insert_target_into_session( session_param_t *session, target_param_t *target) +void insert_cachemodel_into_session( session_param_t *session, cachemodel_param_t *cachemodel) { - if(!target) + if(!cachemodel) return; #ifndef SERVER - fprintf( logstream, "local log: insert target into session %p\n", (void *)session); + fprintf( logstream, "local log: insert cachemodel into session\n"); #endif - if( session->targetlist->first != NULL) - session->targetlist->last->next = target; + if( session->cachemodellist->first != NULL) + session->cachemodellist->last->next = cachemodel; else - session->targetlist->first = target; - session->targetlist->last = target; + session->cachemodellist->first = cachemodel; + session->cachemodellist->last = cachemodel; } bool delete_session( session_param_t **session, sessionlist_param_t *sessionlist) @@ -138,7 +139,7 @@ bool delete_session( session_param_t **session, sessionlist_param_t *sessionlist } delete_channellist( &((*session)->channellist)); - delete_targetlist ( &((*session)->targetlist)); + delete_cachemodellist( &((*session)->cachemodellist)); #ifndef SERVER fprintf( logstream, "local log: session: %p deleted!\n", (void *)(*session)); @@ -157,7 +158,7 @@ void delete_sessionlist( sessionlist_param_t **sessionlist) sessionNext=sessionPtr->next; delete_channellist( &(sessionPtr->channellist)); - delete_targetlist ( &(sessionPtr->targetlist)); + delete_cachemodellist( &(sessionPtr->cachemodellist)); #ifndef SERVER fprintf( logstream, "local log: session: %p deleted!\n", (void *)sessionPtr); @@ -176,6 +177,7 @@ void delete_sessionlist( sessionlist_param_t **sessionlist) void print_allsession( sessionlist_param_t *sessionlist) { session_param_t *ptr; + cachemodel_param_t *cachemodel; int i=0; fprintf( logstream, "SESSIONS info:\n"); @@ -184,7 +186,11 @@ void print_allsession( sessionlist_param_t *sessionlist) while( ptr != NULL){ fprintf( logstream, "session No.%d\n", i++); print_allchannel( ptr->channellist); - print_alltarget( ptr->targetlist); + cachemodel = ptr->cachemodellist->first; + while( cachemodel){ + print_target( cachemodel->target); + cachemodel = cachemodel->next; + } ptr=ptr->next; } } diff --git a/applications/jpip/opj_server/session_manager.h b/applications/jpip/opj_server/session_manager.h index fba62ab1..d4d55e82 100644 --- a/applications/jpip/opj_server/session_manager.h +++ b/applications/jpip/opj_server/session_manager.h @@ -33,13 +33,13 @@ #include "bool.h" #include "channel_manager.h" -#include "target_manager.h" +#include "cachemodel_manager.h" //! Session parameters typedef struct session_param{ - channellist_param_t *channellist; //!< channel list pointer - targetlist_param_t *targetlist; //!< target list pointer - struct session_param *next; //!< pointer to the next session + channellist_param_t *channellist; //!< channel list pointer + cachemodellist_param_t *cachemodellist; //!< cache list pointer + struct session_param *next; //!< pointer to the next session } session_param_t; //! Session list parameters @@ -80,12 +80,12 @@ bool search_session_and_channel( char cid[], channel_param_t **foundchannel); /** - * insert a target into a session + * insert a cache model into a session * - * @param[in] session session pointer - * @param[in] target target pointer + * @param[in] session session pointer + * @param[in] cachemodel cachemodel pointer */ -void insert_target_into_session( session_param_t *session, target_param_t *target); +void insert_cachemodel_into_session( session_param_t *session, cachemodel_param_t *cachemodel); /**