[1.5][JPIP] enabled the opj_server to reply the first query consisting with len reque...
authorKaori Hagihara <khagihara@users.noreply.github.com>
Tue, 28 Feb 2012 11:15:11 +0000 (11:15 +0000)
committerKaori Hagihara <khagihara@users.noreply.github.com>
Tue, 28 Feb 2012 11:15:11 +0000 (11:15 +0000)
applications/jpip/CHANGES
applications/jpip/libopenjpip/comMakefile.mk
applications/jpip/libopenjpip/jpip_parser.c
applications/jpip/libopenjpip/metadata_manager.c
applications/jpip/libopenjpip/openjpip.c
applications/jpip/libopenjpip/query_parser.c
applications/jpip/util/opj_server.c

index 33570d16e3e580a3f74f071d22319bcba9083b04..0a88697e4540971ffc2967d0a08ace966bf70569 100644 (file)
@@ -5,6 +5,9 @@ What's New for OpenJPIP
 ! : changed
 + : added
 
+Feburary 28, 2012
++ [kaori] enabled the opj_server to reply the first query consisting with len request from kakadu client
+
 February 9, 2012
 * [kaori] fixed Doxygen configuration file to document the utilities
 + [kaori] added execution argument to set port number for opj_dec_server, opj_viewer*
index e913c771aadb6992a4cb42d7c4889813881c8679..da479f47dc2fcb012c552660d7c2123a35d161f3 100644 (file)
@@ -2,7 +2,7 @@ ifdef jpipserver
 CFLAGS  = -O3 -Wall -m32 -DSERVER
 LIBNAME = libopenjpip_server.a
 else
-J2KINCDIR = ../../../libopenjpeg
+J2KINCDIR = ../../../bin
 CFLAGS  = -O3 -Wall  -I$(J2KINCDIR)
 LIBNAME = libopenjpip_local.a
 endif
index 7697297decb22d32648a2b29e2a9beb2d43dcec6..2215fd8fe582217f6812d264538c28421115c58d 100644 (file)
@@ -181,8 +181,9 @@ void enqueue_imagedata( query_param_t query_param, msgqueue_param_t *msgqueue);
  * @param[in]     query_param  structured query
  * @param[in]     metadatalist pointer to metadata bin list
  * @param[in,out] msgqueue     message queue pointer  
+ * @return                     if succeeded (true) or failed (false)
  */
-void enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue);
+bool enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue);
 
 
 bool gene_JPIPstream( query_param_t query_param,
@@ -223,14 +224,20 @@ bool gene_JPIPstream( query_param_t query_param,
 
   //meta
   if( query_param.box_type[0][0] != 0  && query_param.len != 0)
-    enqueue_metabins( query_param, codeidx->metadatalist, *msgqueue); 
+    if( !enqueue_metabins( query_param, codeidx->metadatalist, *msgqueue))
+      return false;
+  
+  if( query_param.metadata_only)
+    return true;
 
-  // image codestream
-  if( query_param.fx > 0 && query_param.fy > 0){
-    if( !cachemodel->mhead_model && query_param.len != 0)
+  // main header
+  if( !cachemodel->mhead_model && query_param.len != 0)
       enqueue_mainheader( *msgqueue);
+
+  // image codestream
+  if( (query_param.fx > 0 && query_param.fy > 0))
     enqueue_imagedata( query_param, *msgqueue);
-  }
+  
   return true;
 }
 
@@ -419,18 +426,26 @@ void enqueue_allprecincts( int tile_id, int level, int lastcomp, bool *comps, in
     }
 }
 
-void enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue)
+bool enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue)
 {
   int i;
   for( i=0; query_param.box_type[i][0]!=0 && i<MAX_NUMOFBOX; i++){
     if( query_param.box_type[i][0] == '*'){
-      // not implemented
+      fprintf( FCGI_stdout, "Status: 501\r\n");
+      fprintf( FCGI_stdout, "Reason: metareq with all box-property * not implemented\r\n");
+      return false;
     }
     else{
       int idx = search_metadataidx( query_param.box_type[i], metadatalist);
 
       if( idx != -1)
        enqueue_metadata( idx, msgqueue);
+      else{
+       fprintf( FCGI_stdout, "Status: 400\r\n");
+       fprintf( FCGI_stdout, "Reason: box-type %.4s not found\r\n", query_param.box_type[i]);
+       return false;
+      }
     }
   }
+  return true;
 }
index 5a831ceea9c3eefc93be47e4b224ad693a8cade0..09a753ba2820264076a947205ca0ca45197503aa 100644 (file)
@@ -77,10 +77,6 @@ metadatalist_param_t * const_metadatalist( int fd)
   phldlist = gene_placeholderlist();
   metadatalist = gene_metadatalist();
 
-  delete_box_in_list_by_type( "iptr", toplev_boxlist);
-  delete_box_in_list_by_type( "cidx", toplev_boxlist);
-  delete_box_in_list_by_type( "fidx", toplev_boxlist);
-  
   box = toplev_boxlist->first;
   idx = 0;
   while( box){
index ba0f5a7f7df9683907ea8eddbd356a4de5afa3bf..e51402a98242399aaa22242f564f0b03bb460b66 100644 (file)
@@ -115,7 +115,7 @@ bool process_JPIPrequest( server_record_t *rec, QR_t *qr)
     if( !close_channel( *(qr->query), rec->sessionlist, &cursession, &curchannel))
       return false;
   
-  if( (qr->query->fx > 0 && qr->query->fy > 0) || qr->query->box_type[0][0] != 0)
+  if( (qr->query->fx > 0 && qr->query->fy > 0) || qr->query->box_type[0][0] != 0 || qr->query->len > 0)
     if( !gene_JPIPstream( *(qr->query), target, cursession, curchannel, &qr->msgqueue))
       return false;
 
@@ -141,25 +141,29 @@ void send_responsedata( server_record_t *rec, QR_t *qr)
   recons_stream_from_msgqueue( qr->msgqueue, fd);
   
   add_EORmsg( fd, qr); /* needed at least for tcp and udp */
-
+  
   len_of_jpipstream = get_filesize( fd);
   jpipstream = fetch_bytes( fd, 0, len_of_jpipstream);
-
+  
   close( fd);
   remove( tmpfname);
 
   fprintf( FCGI_stdout, "\r\n");
 
-  if( qr->channel)
-    if( qr->channel->aux == tcp || qr->channel->aux == udp){
-      send_responsedata_on_aux( qr->channel->aux==tcp, rec->auxtrans, qr->channel->cid, jpipstream, len_of_jpipstream, 1000); /* 1KB per frame*/
-      return;
-    }
-  
-  if( fwrite( jpipstream, len_of_jpipstream, 1, FCGI_stdout) != 1)
-    fprintf( FCGI_stderr, "Error: failed to write jpipstream\n");
+  if( len_of_jpipstream){
+    
+    if( qr->channel)
+      if( qr->channel->aux == tcp || qr->channel->aux == udp){
+       send_responsedata_on_aux( qr->channel->aux==tcp, rec->auxtrans, qr->channel->cid, jpipstream, len_of_jpipstream, 1000); /* 1KB per frame*/
+       return;
+      }
+    
+    if( fwrite( jpipstream, len_of_jpipstream, 1, FCGI_stdout) != 1)
+      fprintf( FCGI_stderr, "Error: failed to write jpipstream\n");
+  }
 
   free( jpipstream);
+
   return;
 }
 
index 093f4955b7d89cb1c8921ec8803094e076d06dfe..1e8c657effc640cc6cd12bdb808ab2e008358a56 100644 (file)
@@ -141,8 +141,11 @@ query_param_t * parse_query( char *query_string)
          query_param->return_type = JPTstream;
       }
 
-      else if( strcasecmp( fieldname, "len") == 0)
+      else if( strcasecmp( fieldname, "len") == 0){
        sscanf( fieldval, "%d", &query_param->len);
+       if( query_param->len = 2000) /* for kakadu client*/
+         strncpy( query_param->box_type[0], "ftyp", 4);
+      }
     }
   }
   return query_param;
@@ -330,7 +333,7 @@ void parse_req_box_prop( char *req_box_prop, int idx, query_param_t *query_param
     query_param->box_type[idx][0]='*';
   else
     strncpy( query_param->box_type[idx], req_box_prop, 4);
-
+  
   if(( ptr = strchr( req_box_prop, ':'))){
     if( *(ptr+1)=='r')
       query_param->limit[idx] = -1;
index d66a2c65e08b43e29d1ff14bda5165495ea8c980..bed1be3528ed75f2bb7d11f7c760143070bf1fb2 100644 (file)
@@ -103,8 +103,10 @@ int main(void)
             
       if( parse_status)
        send_responsedata( server_record, qr);
-      else
+      else{
        fprintf( FCGI_stderr, "Error: JPIP request failed\n");
+       fprintf( FCGI_stdout, "\r\n");
+      }
       
       end_QRprocess( server_record, &qr);
     }