From 9e60c2f8e9a987c577411e51d0c7f357edf1838c Mon Sep 17 00:00:00 2001 From: Antonin Descampe Date: Mon, 10 Oct 2011 07:03:28 +0000 Subject: [PATCH] [1.5] backport r909, r922-925 to branch 1.5 (terminating status of opj_server in debug/non-server mode and stateless requests) --- applications/jpip/CHANGES | 6 +++++ applications/jpip/README | 5 ++-- .../opj_client/opj_dec_server/cache_manager.c | 14 +++++++++++ .../opj_client/opj_dec_server/cache_manager.h | 12 ++++++++- .../opj_dec_server/imgsock_manager.c | 7 ++++-- .../opj_dec_server/imgsock_manager.h | 2 +- .../opj_dec_server/opj_dec_server.c | 11 ++++++--- .../opj_viewer/dist/opj_viewer-20110825.jar | Bin 15278 -> 0 bytes .../opj_viewer/dist/opj_viewer-20110916.jar | Bin 0 -> 15482 bytes .../opj_client/opj_viewer/dist/opj_viewer.jar | 2 +- .../opj_viewer/src/ImageManager.java | 23 +++++++++++------- .../opj_viewer/src/ImageViewer.java | 4 +-- .../opj_viewer/src/ImageWindow.java | 13 +++++++--- .../opj_viewer/src/ImgdecClient.java | 23 ++++++++++++------ .../opj_viewer/src/JPIPHttpClient.java | 6 ++++- ...825.jar => opj_viewer_xerces-20110916.jar} | Bin 19788 -> 19896 bytes .../dist/opj_viewer_xerces.jar | 2 +- applications/jpip/opj_server/opj_server.c | 2 +- 18 files changed, 96 insertions(+), 36 deletions(-) delete mode 100644 applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110825.jar create mode 100644 applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110916.jar rename applications/jpip/opj_client/opj_viewer_xerces/dist/{opj_viewer_xerces-20110825.jar => opj_viewer_xerces-20110916.jar} (63%) 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 67b68b672c4da658c166efb875395745650e8e46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15278 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 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 0000000000000000000000000000000000000000..a492a2cb486ea23667c028ee0b50be177263e9c8 GIT binary patch literal 15482 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 literal 0 HcmV?d00001 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 4028b66446449b158c49ef1604bb3cfcf518b29a..e3eb2d622034647b06388f4fc03e388f854f1b4e 100644 GIT binary patch delta 6304 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 KF?3Y^RsA1tISnoV delta 6190 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