diff --git a/applications/jpip/CHANGES b/applications/jpip/CHANGES index 4ed52aa5..3e4141ee 100644 --- a/applications/jpip/CHANGES +++ b/applications/jpip/CHANGES @@ -5,6 +5,12 @@ What's New for OpenJPIP ! : changed + : added +September 16, 2011 ++ [kaori] enabled stateless requests from the opj_viewers + +Septempber 1, 2011 +* [kaori] changed terminating status of opj_server in debug/non-server mode + August 27, 2011 * [antonin] fixed missing include directory in opj_client/opj_dec_server/CMakeLists.txt diff --git a/applications/jpip/README b/applications/jpip/README index 0f053189..c35557f1 100644 --- a/applications/jpip/README +++ b/applications/jpip/README @@ -106,10 +106,11 @@ Client: % ../opj_dec_server 2. Open image viewers (as many as needed) - % java -jar opj_viewer.jar http://hostname/myFCGI JP2_filename.jp2 + % java -jar opj_viewer.jar http://hostname/myFCGI JP2_filename.jp2 [stateless] ( The arguments - http://hostname/myFCGI is the HTTP server URI (myFCGI refers to opj_server by the server setting) - - JP2_filename.jp2 is the name of a JP2 file available on the server.) + - JP2_filename.jp2 is the name of a JP2 file available on the server. + - stateless if stateless request is desired, otherwise session request is implemented Image viewer GUI instructions: Scale up request: Enlarge the window ROI request: Select a region by mouse click and drag, then click inside the red frame of the selected region diff --git a/applications/jpip/opj_client/opj_dec_server/cache_manager.c b/applications/jpip/opj_client/opj_dec_server/cache_manager.c index 6a7b92c9..597a5896 100644 --- a/applications/jpip/opj_client/opj_dec_server/cache_manager.c +++ b/applications/jpip/opj_client/opj_dec_server/cache_manager.c @@ -154,6 +154,20 @@ cache_param_t * search_cacheBycid( char cid[], cachelist_param_t *cachelist) return NULL; } +cache_param_t * search_cacheBytid( char tid[], cachelist_param_t *cachelist) +{ + cache_param_t *foundcache; + + foundcache = cachelist->first; + + while( foundcache != NULL){ + if( strcmp( tid, foundcache->tid) == 0) + return foundcache; + foundcache = foundcache->next; + } + return NULL; +} + void add_cachecid( char *cid, cache_param_t *cache) { char **tmp; diff --git a/applications/jpip/opj_client/opj_dec_server/cache_manager.h b/applications/jpip/opj_client/opj_dec_server/cache_manager.h index ad35de80..61c13815 100644 --- a/applications/jpip/opj_client/opj_dec_server/cache_manager.h +++ b/applications/jpip/opj_client/opj_dec_server/cache_manager.h @@ -121,7 +121,7 @@ cache_param_t * search_cacheBycsn( int csn, cachelist_param_t *cachelist); /** - * search codestream number (csn) by cid + * search a cache by cid * * @param[in] cid channel identifer * @param[in] cachelist cache list pointer @@ -129,6 +129,16 @@ cache_param_t * search_cacheBycsn( int csn, cachelist_param_t *cachelist); */ cache_param_t * search_cacheBycid( char cid[], cachelist_param_t *cachelist); + +/** + * search a cache by tid + * + * @param[in] tid target identifer + * @param[in] cachelist cache list pointer + * @return found cache pointer + */ +cache_param_t * search_cacheBytid( char tid[], cachelist_param_t *cachelist); + /** * add cid into a cache * diff --git a/applications/jpip/opj_client/opj_dec_server/imgsock_manager.c b/applications/jpip/opj_client/opj_dec_server/imgsock_manager.c index 19599a9a..4e6652ac 100644 --- a/applications/jpip/opj_client/opj_dec_server/imgsock_manager.c +++ b/applications/jpip/opj_client/opj_dec_server/imgsock_manager.c @@ -123,6 +123,7 @@ Byte_t * receive_JPIPstream( SOCKET connected_socket, char *target, char *tid, c target[0] = 0; cid[0] = 0; + tid[0] = 0; if((linelen = receive_line( connected_socket, buf)) == 0) return NULL; @@ -140,11 +141,13 @@ Byte_t * receive_JPIPstream( SOCKET connected_socket, char *target, char *tid, c if((linelen = receive_line( connected_socket, buf)) == 0) return NULL; - strcpy( tid, buf); + if( strcmp( buf, "0") != 0) + strcpy( tid, buf); if((linelen = receive_line( connected_socket, buf)) == 0) return NULL; - strcpy( cid, buf); + if( strcmp( buf, "0") != 0) + strcpy( cid, buf); if((linelen = receive_line( connected_socket, buf)) == 0) return NULL; diff --git a/applications/jpip/opj_client/opj_dec_server/imgsock_manager.h b/applications/jpip/opj_client/opj_dec_server/imgsock_manager.h index 7a76d619..713c099e 100644 --- a/applications/jpip/opj_client/opj_dec_server/imgsock_manager.h +++ b/applications/jpip/opj_client/opj_dec_server/imgsock_manager.h @@ -141,7 +141,7 @@ int receive_line(SOCKET connected_socket, char *buf); *\section sec2 PNM request * Get decoded PGM/PPM image * - * client -> server: PNM request\\n cidstring\\n fw\\n fh\\n \n + * client -> server: PNM request\\n [cid/tid]string\\n fw\\n fh\\n \n * server -> client: P6 or P5 (2Byte) width (2Byte Big endian) height (2Byte Big endian) maxval (1Byte) data * *\section sec3 XML request diff --git a/applications/jpip/opj_client/opj_dec_server/opj_dec_server.c b/applications/jpip/opj_client/opj_dec_server/opj_dec_server.c index c8c3c695..a2fe2143 100644 --- a/applications/jpip/opj_client/opj_dec_server/opj_dec_server.c +++ b/applications/jpip/opj_client/opj_dec_server/opj_dec_server.c @@ -247,10 +247,12 @@ void handle_JPIPstreamMSG( SOCKET connected_socket, cachelist_param_t *cachelist parse_metamsg( msgqueue, *jpipstream, *streamlen, metadatalist); // cid registration - if( target[0] != 0 && tid[0] != 0 && cid[0] != 0){ + if( target[0] != 0){ if((cache = search_cache( target, cachelist))){ - add_cachecid( cid, cache); - update_cachetid( tid, cache); + if( tid[0] != 0) + update_cachetid( tid, cache); + if( cid[0] != 0) + add_cachecid( cid, cache); } else{ cache = gene_cache( target, msgqueue->last->csn, tid, cid); @@ -277,7 +279,8 @@ void handle_PNMreqMSG( SOCKET connected_socket, Byte_t *jpipstream, msgqueue_par receive_line( connected_socket, cid); if(!(cache = search_cacheBycid( cid, cachelist))) - return; + if(!(cache = search_cacheBytid( cid, cachelist))) + return; receive_line( connected_socket, tmp); fw = atoi( tmp); diff --git a/applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110825.jar b/applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110825.jar deleted file mode 100644 index 67b68b67..00000000 Binary files a/applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110825.jar and /dev/null differ diff --git a/applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110916.jar b/applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110916.jar new file mode 100644 index 00000000..a492a2cb Binary files /dev/null and b/applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110916.jar differ diff --git a/applications/jpip/opj_client/opj_viewer/dist/opj_viewer.jar b/applications/jpip/opj_client/opj_viewer/dist/opj_viewer.jar index ce826b27..1553f3e0 120000 --- a/applications/jpip/opj_client/opj_viewer/dist/opj_viewer.jar +++ b/applications/jpip/opj_client/opj_viewer/dist/opj_viewer.jar @@ -1 +1 @@ -opj_viewer-20110825.jar \ No newline at end of file +opj_viewer-20110916.jar \ No newline at end of file diff --git a/applications/jpip/opj_client/opj_viewer/src/ImageManager.java b/applications/jpip/opj_client/opj_viewer/src/ImageManager.java index 62166f8a..f9e12441 100644 --- a/applications/jpip/opj_client/opj_viewer/src/ImageManager.java +++ b/applications/jpip/opj_client/opj_viewer/src/ImageManager.java @@ -43,22 +43,25 @@ public class ImageManager extends JPIPHttpClient public int getOrigWidth(){ return pnmimage.width;} public int getOrigHeight(){ return pnmimage.height;} - public Image getImage( String j2kfilename, int reqfw, int reqfh) + public Image getImage( String j2kfilename, int reqfw, int reqfh, boolean reqcnew) { System.err.println(); - String refcid = ImgdecClient.query_cid( j2kfilename); + String refcid = null; byte[] jpipstream; + if( reqcnew) + refcid = ImgdecClient.query_cid( j2kfilename); + if( refcid == null){ String reftid = ImgdecClient.query_tid( j2kfilename); if( reftid == null) - jpipstream = super.requestViewWindow( j2kfilename, reqfw, reqfh, true); + jpipstream = super.requestViewWindow( j2kfilename, reqfw, reqfh, reqcnew); else - jpipstream = super.requestViewWindow( j2kfilename, reftid, reqfw, reqfh, true); + jpipstream = super.requestViewWindow( j2kfilename, reftid, reqfw, reqfh, reqcnew); } else - jpipstream = super.requestViewWindow( reqfw, reqfh, refcid, true); + jpipstream = super.requestViewWindow( reqfw, reqfh, refcid, reqcnew); System.err.println( "decoding to PNM image"); pnmimage = ImgdecClient.decode_jpipstream( jpipstream, j2kfilename, tid, cid, fw, fh); @@ -70,11 +73,11 @@ public class ImageManager extends JPIPHttpClient public Image getImage( int reqfw, int reqfh, int reqrx, int reqry, int reqrw, int reqrh) { System.err.println(); - + byte[] jpipstream = super.requestViewWindow( reqfw, reqfh, reqrx, reqry, reqrw, reqrh); System.err.println( "decoding to PNM image"); - pnmimage = ImgdecClient.decode_jpipstream( jpipstream, cid, fw, fh); + pnmimage = ImgdecClient.decode_jpipstream( jpipstream, tid, cid, fw, fh); System.err.println( " done"); return pnmimage.createROIImage( rx, ry, rw, rh); @@ -96,7 +99,9 @@ public class ImageManager extends JPIPHttpClient } public void closeChannel() { - ImgdecClient.destroy_cid( cid); - super.closeChannel(); + if( cid != null){ + ImgdecClient.destroy_cid( cid); + super.closeChannel(); + } } } \ No newline at end of file diff --git a/applications/jpip/opj_client/opj_viewer/src/ImageViewer.java b/applications/jpip/opj_client/opj_viewer/src/ImageViewer.java index fe6f7eb4..8e0abe4a 100644 --- a/applications/jpip/opj_client/opj_viewer/src/ImageViewer.java +++ b/applications/jpip/opj_client/opj_viewer/src/ImageViewer.java @@ -55,7 +55,7 @@ public class ImageViewer extends JPanel private Rectangle roirect[] = null; private String roiname[] = null; - public ImageViewer( String j2kfilename, ImageManager manager) + public ImageViewer( String j2kfilename, ImageManager manager, boolean session) { String str; @@ -70,7 +70,7 @@ public class ImageViewer extends JPanel myRL = new ResizeListener(this); imgmanager = manager; - img = imgmanager.getImage( j2kfilename, vw, vh); + img = imgmanager.getImage( j2kfilename, vw, vh, session); addMouseListener(myMML); addMouseMotionListener(myMML); diff --git a/applications/jpip/opj_client/opj_viewer/src/ImageWindow.java b/applications/jpip/opj_client/opj_viewer/src/ImageWindow.java index f6fc98ee..5ffe9a5e 100644 --- a/applications/jpip/opj_client/opj_viewer/src/ImageWindow.java +++ b/applications/jpip/opj_client/opj_viewer/src/ImageWindow.java @@ -38,13 +38,13 @@ public class ImageWindow extends JFrame // private OptionPanel optpanel; private ImageManager imgmanager; - public ImageWindow( String uri, String j2kfilename) + public ImageWindow( String uri, String j2kfilename, boolean session) { super( j2kfilename); imgmanager = new ImageManager( uri); - imgviewer = new ImageViewer( j2kfilename, imgmanager); + imgviewer = new ImageViewer( j2kfilename, imgmanager, session); imgviewer.setOpaque(true); //content panes must be opaque // optpanel = new OptionPanel( imgmanager, imgviewer); @@ -71,16 +71,21 @@ public class ImageWindow extends JFrame public static void main(String s[]) { String j2kfilename, uri; + boolean session; if(s.length > 0){ uri = s[0]; j2kfilename = s[1]; + if( s.length > 2) + session = !s[2].equalsIgnoreCase( "stateless"); + else + session = true; } else{ - System.out.println("Usage: java -jar opj_viewer.jar HTTP_server_URI imagefile.jp2"); + System.out.println("Usage: java -jar opj_viewer.jar HTTP_server_URI imagefile.jp2 [stateless/session]"); return; } - ImageWindow frame = new ImageWindow( uri, j2kfilename); + ImageWindow frame = new ImageWindow( uri, j2kfilename, session); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); diff --git a/applications/jpip/opj_client/opj_viewer/src/ImgdecClient.java b/applications/jpip/opj_client/opj_viewer/src/ImgdecClient.java index 85fba612..6f1b3c30 100644 --- a/applications/jpip/opj_client/opj_viewer/src/ImgdecClient.java +++ b/applications/jpip/opj_client/opj_viewer/src/ImgdecClient.java @@ -33,17 +33,17 @@ import java.net.*; public class ImgdecClient{ - public static PnmImage decode_jpipstream( byte[] jpipstream, String cid, int fw, int fh) + public static PnmImage decode_jpipstream( byte[] jpipstream, String tid, String cid, int fw, int fh) { if( jpipstream != null) send_JPIPstream( jpipstream); - return get_PNMstream( cid, fw, fh); + return get_PNMstream( cid, tid, fw, fh); } public static PnmImage decode_jpipstream( byte[] jpipstream, String j2kfilename, String tid, String cid, int fw, int fh) { send_JPIPstream( jpipstream, j2kfilename, tid, cid); - return get_PNMstream( cid, fw, fh); + return get_PNMstream( cid, tid, fw, fh); } public static void send_JPIPstream( byte[] jpipstream) @@ -91,10 +91,13 @@ public class ImgdecClient{ os.writeBytes( "0\n"); else os.writeBytes( tid + "\n"); - os.writeBytes( cid + "\n"); + if( cid == null) + os.writeBytes( "0\n"); + else + os.writeBytes( cid + "\n"); os.writeBytes( length + "\n"); os.write( jpipstream, 0, length); - + byte signal = is.readByte(); if( signal == 0) @@ -106,7 +109,7 @@ public class ImgdecClient{ } } - public static PnmImage get_PNMstream( String cid, int fw, int fh) + public static PnmImage get_PNMstream( String cid, String tid, int fw, int fh) { PnmImage pnmstream = new PnmImage(); try { @@ -116,7 +119,13 @@ public class ImgdecClient{ byte []header = new byte[7]; os.writeBytes("PNM request\n"); - os.writeBytes( cid + "\n"); + if( cid != null) + os.writeBytes( cid + "\n"); + else + if( tid != null) + os.writeBytes( tid + "\n"); + else + os.writeBytes( "0\n"); os.writeBytes( fw + "\n"); os.writeBytes( fh + "\n"); diff --git a/applications/jpip/opj_client/opj_viewer/src/JPIPHttpClient.java b/applications/jpip/opj_client/opj_viewer/src/JPIPHttpClient.java index cfd3db4c..93d4ad5c 100644 --- a/applications/jpip/opj_client/opj_viewer/src/JPIPHttpClient.java +++ b/applications/jpip/opj_client/opj_viewer/src/JPIPHttpClient.java @@ -72,7 +72,11 @@ public class JPIPHttpClient if( cid != null) return requestViewWindow( reqfw, reqfh, reqrx, reqry, reqrw, reqrh, cid); else - return null; + // return null; + if( tid != null) + return requestViewWindow( null, tid, reqfw, reqfh, reqrx, reqry, reqrw, reqrh, null, false); + else + return null; } public byte[] requestViewWindow( int reqfw, int reqfh, String reqcid) diff --git a/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20110825.jar b/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20110916.jar similarity index 63% rename from applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20110825.jar rename to applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20110916.jar index 4028b664..e3eb2d62 100644 Binary files a/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20110825.jar and b/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20110916.jar differ diff --git a/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces.jar b/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces.jar index 0f5d3dc9..4036811e 120000 --- a/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces.jar +++ b/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces.jar @@ -1 +1 @@ -opj_viewer_xerces-20110825.jar \ No newline at end of file +opj_viewer_xerces-20110916.jar \ No newline at end of file diff --git a/applications/jpip/opj_server/opj_server.c b/applications/jpip/opj_server/opj_server.c index 936b54ce..deaaae3d 100644 --- a/applications/jpip/opj_server/opj_server.c +++ b/applications/jpip/opj_server/opj_server.c @@ -98,7 +98,7 @@ int main(void) #else char query_string[128]; - while((fgets( query_string, 128, stdin))[0] != '\n' ) + while( fgets( query_string, 128, stdin) && query_string[0]!='\n') #endif {