[trunk] another round of compilation fixes
[openjpeg.git] / applications / jpip / libopenjpip / jpip_parser.c
index 7697297decb22d32648a2b29e2a9beb2d43dcec6..663214e4f8afb6e6550750982d46af1e6b2e3184 100644 (file)
@@ -43,7 +43,7 @@
 #define FCGI_stdout stdout
 #define FCGI_stderr stderr
 #define logstream stderr
-#endif //SERVER
+#endif /*SERVER*/
 
 
 bool identify_target( query_param_t query_param, targetlist_param_t *targetlist, target_param_t **target)
@@ -132,35 +132,35 @@ bool close_channel( query_param_t query_param,
 #ifndef SERVER
     fprintf( logstream, "local log: close all\n");
 #endif
-    // all channels associatd with the session will be closed
+    /* all channels associatd with the session will be closed */
     if( !delete_session( cursession, sessionlist))
       return false;
   }
   else{
-    // check if all entry belonging to the same session
+    /* check if all entry belonging to the same session */
     
     for( i=0, cclose=query_param.cclose; i<query_param.numOfcclose; i++, cclose += (strlen(cclose)+1)){
       
-      // In case of the first entry of close cid
+      /* In case of the first entry of close cid */
       if( *cursession == NULL){
        if( !search_session_and_channel( cclose, sessionlist, cursession, curchannel))
          return false;
       }
-      else // second or more entry of close cid
+      else /* second or more entry of close cid */
        if( !(*curchannel=search_channel( cclose, (*cursession)->channellist))){
          fprintf( FCGI_stdout, "Reason: Cclose id %s is from another session\r\n", cclose); 
          return false;
        }
     }
 
-    // delete channels
+    /* delete channels */
     for( i=0, cclose=query_param.cclose; i<query_param.numOfcclose; i++, cclose += (strlen(cclose)+1)){
       *curchannel = search_channel( cclose, (*cursession)->channellist);
       delete_channel( curchannel, (*cursession)->channellist);
     }
     
     if( (*cursession)->channellist->first == NULL || (*cursession)->channellist->last == NULL)
-      // In case of empty session
+      /* In case of empty session */
       delete_session( cursession, sessionlist);
   }
   return true;
@@ -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,
@@ -194,14 +195,14 @@ bool gene_JPIPstream( query_param_t query_param,
   index_param_t *codeidx;
   cachemodel_param_t *cachemodel;
   
-  if( !cursession || !curchannel){ // stateless
+  if( !cursession || !curchannel){ /* stateless */
     if( !target)
       return false;
     if( !(cachemodel = gene_cachemodel( NULL, target, query_param.return_type==JPPstream)))
       return false;
     *msgqueue = gene_msgqueue( true, cachemodel);
   }
-  else{ // session
+  else{ /* session */
     cachemodel  = curchannel->cachemodel;
     target = cachemodel->target;
     *msgqueue = gene_msgqueue( false, cachemodel);
@@ -221,16 +222,22 @@ bool gene_JPIPstream( query_param_t query_param,
     }
   }
 
-  //meta
+  /*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;
 }
 
@@ -270,20 +277,20 @@ void enqueue_imagedata( query_param_t query_param, msgqueue_param_t *msgqueue)
   index_param_t *codeidx;
   imgreg_param_t imgreg;
   range_param_t tile_Xrange, tile_Yrange;
-  int u, v, tile_id;
+  Byte4_t u, v, tile_id;
   int xmin, xmax, ymin, ymax;
   int numOfreslev;
 
   codeidx = msgqueue->cachemodel->target->codeidx;
 
-  if( !(msgqueue->cachemodel->jppstream)  &&  get_nmax( codeidx->tilepart) == 1) // normally not the case
+  if( !(msgqueue->cachemodel->jppstream)  &&  get_nmax( codeidx->tilepart) == 1) /* normally not the case */
     numOfreslev = 1;
   else
     numOfreslev = codeidx->COD.numOfdecomp+1;
 
   imgreg  = map_viewin2imgreg( query_param.fx, query_param.fy, 
                               query_param.rx, query_param.ry, query_param.rw, query_param.rh,
-                              codeidx->SIZ.XOsiz, codeidx->SIZ.YOsiz, codeidx->SIZ.Xsiz, codeidx->SIZ.Ysiz, 
+                              (int)codeidx->SIZ.XOsiz, (int)codeidx->SIZ.YOsiz, (int)codeidx->SIZ.Xsiz, (int)codeidx->SIZ.Ysiz, 
                               numOfreslev );
 
   if( query_param.len == 0)
@@ -296,39 +303,40 @@ void enqueue_imagedata( query_param_t query_param, msgqueue_param_t *msgqueue)
       tile_Xrange = get_tile_Xrange( codeidx->SIZ, tile_id, imgreg.level);
        
       if( tile_Xrange.minvalue < tile_Xrange.maxvalue && tile_Yrange.minvalue < tile_Yrange.maxvalue){
-       if( tile_Xrange.maxvalue <= imgreg.xosiz + imgreg.ox || 
-           tile_Xrange.minvalue >= imgreg.xosiz + imgreg.ox + imgreg.sx ||
-           tile_Yrange.maxvalue <= imgreg.yosiz + imgreg.oy || 
-           tile_Yrange.minvalue >= imgreg.yosiz + imgreg.oy + imgreg.sy) {
-         //printf("Tile completely excluded from view-window %d\n", tile_id);
-         // Tile completely excluded from view-window
+       if( tile_Xrange.maxvalue <= (Byte4_t)(imgreg.xosiz + imgreg.ox) || 
+           tile_Xrange.minvalue >= (Byte4_t)(imgreg.xosiz + imgreg.ox + imgreg.sx) ||
+           tile_Yrange.maxvalue <= (Byte4_t)(imgreg.yosiz + imgreg.oy) || 
+           tile_Yrange.minvalue >= (Byte4_t)(imgreg.yosiz + imgreg.oy + imgreg.sy)) {
+         /*printf("Tile completely excluded from view-window %d\n", tile_id);*/
+         /* Tile completely excluded from view-window */
        }
-       else if( tile_Xrange.minvalue >= imgreg.xosiz + imgreg.ox && 
-                tile_Xrange.maxvalue <= imgreg.xosiz + imgreg.ox + imgreg.sx && 
-                tile_Yrange.minvalue >= imgreg.yosiz + imgreg.oy && 
-                tile_Yrange.maxvalue <= imgreg.yosiz + imgreg.oy + imgreg.sy) {
-         // Tile completely contained within view-window
-         // high priority
-         //printf("Tile completely contained within view-window %d\n", tile_id);
+       else if( tile_Xrange.minvalue >= (Byte4_t)(imgreg.xosiz + imgreg.ox) && 
+                      tile_Xrange.maxvalue <= (Byte4_t)(imgreg.xosiz + imgreg.ox + imgreg.sx) && 
+                      tile_Yrange.minvalue >= (Byte4_t)(imgreg.yosiz + imgreg.oy) && 
+                      tile_Yrange.maxvalue <= (Byte4_t)(imgreg.yosiz + imgreg.oy + imgreg.sy)) {
+         /* Tile completely contained within view-window */
+         /* high priority */
+         /*printf("Tile completely contained within view-window %d\n", tile_id);*/
          if( msgqueue->cachemodel->jppstream){
-           enqueue_tileheader( tile_id, msgqueue);
-           enqueue_allprecincts( tile_id, imgreg.level, query_param.lastcomp, query_param.comps, query_param.layers, msgqueue);
+           enqueue_tileheader( (int)tile_id, msgqueue);
+           enqueue_allprecincts( (int)tile_id, imgreg.level, query_param.lastcomp, query_param.comps, query_param.layers, msgqueue);
          }
          else
            enqueue_tile( tile_id, imgreg.level, msgqueue);
        }
        else{
-         // Tile partially overlaps view-window
-         // low priority
-         //printf("Tile partially overlaps view-window %d\n", tile_id);
+         /* Tile partially overlaps view-window */
+         /* low priority */
+         /*printf("Tile partially overlaps view-window %d\n", tile_id);*/
          if( msgqueue->cachemodel->jppstream){
-           enqueue_tileheader( tile_id, msgqueue);
-
-           xmin = tile_Xrange.minvalue >= imgreg.xosiz + imgreg.ox ? 0 : imgreg.xosiz + imgreg.ox - tile_Xrange.minvalue;
-           xmax = tile_Xrange.maxvalue <= imgreg.xosiz + imgreg.ox + imgreg.sx ? tile_Xrange.maxvalue - tile_Xrange.minvalue -1 : imgreg.xosiz + imgreg.ox + imgreg.sx - tile_Xrange.minvalue -1;
-           ymin = tile_Yrange.minvalue >= imgreg.yosiz + imgreg.oy ? 0 : imgreg.yosiz + imgreg.oy - tile_Yrange.minvalue;
-           ymax = tile_Yrange.maxvalue <= imgreg.yosiz + imgreg.oy + imgreg.sy ? tile_Yrange.maxvalue - tile_Yrange.minvalue -1 : imgreg.yosiz + imgreg.oy + imgreg.sy - tile_Yrange.minvalue -1;
-           enqueue_precincts( xmin, xmax, ymin, ymax, tile_id, imgreg.level, query_param.lastcomp, query_param.comps, query_param.layers, msgqueue);
+           enqueue_tileheader( (int)tile_id, msgqueue);
+
+      /* FIXME: The following code is suspicious it implicitely cast an unsigned int to int, which truncates values */
+           xmin = tile_Xrange.minvalue >= (Byte4_t)(imgreg.xosiz + imgreg.ox) ? 0 : imgreg.xosiz + imgreg.ox - (int)tile_Xrange.minvalue;
+           xmax = tile_Xrange.maxvalue <= (Byte4_t)(imgreg.xosiz + imgreg.ox + imgreg.sx) ? (int)(tile_Xrange.maxvalue - tile_Xrange.minvalue -1) : (int)(imgreg.xosiz + imgreg.ox + imgreg.sx - (int)tile_Xrange.minvalue - 1);
+           ymin = tile_Yrange.minvalue >= (Byte4_t)(imgreg.yosiz + imgreg.oy) ? 0 : imgreg.yosiz + imgreg.oy - (int)tile_Yrange.minvalue;
+           ymax = tile_Yrange.maxvalue <= (Byte4_t)(imgreg.yosiz + imgreg.oy + imgreg.sy) ? (int)(tile_Yrange.maxvalue - tile_Yrange.minvalue - 1) : (int)(imgreg.yosiz + imgreg.oy + imgreg.sy - (int)tile_Yrange.minvalue - 1);
+           enqueue_precincts( xmin, xmax, ymin, ymax, (int)tile_id, imgreg.level, query_param.lastcomp, query_param.comps, query_param.layers, msgqueue);
          }
          else
            enqueue_tile( tile_id, imgreg.level, msgqueue);
@@ -349,41 +357,47 @@ void enqueue_precincts( int xmin, int xmax, int ymin, int ymax, int tile_id, int
   Byte4_t xminP, xmaxP, yminP, ymaxP;
 
   codeidx  = msgqueue->cachemodel->target->codeidx;
+  /* MM: shouldnt xmin/xmax be Byte4_t instead ? */
+  if( xmin < 0 || xmax < 0 || ymin < 0 || ymax < 0)
+    return;
+  /* MM: I think the API should not really be int should it ? */
+  if( tile_id < 0 )
+    return;
 
   for( c=0; c<codeidx->SIZ.Csiz; c++)
     if( lastcomp == -1 /*all*/ || ( c<=lastcomp && comps[c])){
       seq_id = 0;
       for( res_lev=0, dec_lev=codeidx->COD.numOfdecomp; dec_lev>=level; res_lev++, dec_lev--){
        
-       XTsiz = get_tile_XSiz( codeidx->SIZ, tile_id, dec_lev);
-       YTsiz = get_tile_YSiz( codeidx->SIZ, tile_id, dec_lev);
+       XTsiz = get_tile_XSiz( codeidx->SIZ, (Byte4_t)tile_id, dec_lev);
+       YTsiz = get_tile_YSiz( codeidx->SIZ, (Byte4_t)tile_id, dec_lev);
        
        XPsiz = ( codeidx->COD.Scod & 0x01) ? codeidx->COD.XPsiz[ res_lev] : XTsiz;
        YPsiz = ( codeidx->COD.Scod & 0x01) ? codeidx->COD.YPsiz[ res_lev] : YTsiz;
          
        for( u=0; u<ceil((double)YTsiz/(double)YPsiz); u++){
-         yminP = u*YPsiz;
-         ymaxP = (u+1)*YPsiz-1;
+         yminP = (Byte4_t)u*YPsiz;
+         ymaxP = (Byte4_t)(u+1)*YPsiz-1;
          if( YTsiz <= ymaxP)
            ymaxP = YTsiz-1;
          
          for( v=0; v<ceil((double)XTsiz/(double)XPsiz); v++, seq_id++){
-           xminP = v*XPsiz;
-           xmaxP = (v+1)*XPsiz-1;
+           xminP = (Byte4_t)v*XPsiz;
+           xmaxP = (Byte4_t)(v+1)*XPsiz-1;
            if( XTsiz <= xmaxP)
              xmaxP = XTsiz-1;
            
-           if( xmaxP < xmin || xminP > xmax || ymaxP < ymin || yminP > ymax){
-             // Precinct completely excluded from view-window
+           if( xmaxP < (Byte4_t)xmin || xminP > (Byte4_t)xmax || ymaxP < (Byte4_t)ymin || yminP > (Byte4_t)ymax){
+             /* Precinct completely excluded from view-window */
            }
-           else if( xminP >= xmin && xmaxP <= xmax && yminP >= ymin && ymaxP <= ymax){
-             // Precinct completely contained within view-window
-             // high priority
+           else if( xminP >= (Byte4_t)xmin && xmaxP <= (Byte4_t)xmax && yminP >= (Byte4_t)ymin && ymaxP <= (Byte4_t)ymax){
+             /* Precinct completely contained within view-window
+              high priority */
              enqueue_precinct( seq_id, tile_id, c, (dec_lev>level)?-1:layers, msgqueue);
            }
            else{
-             // Precinct partially overlaps view-window
-             // low priority
+             /* Precinct partially overlaps view-window
+              low priority */
              enqueue_precinct( seq_id, tile_id, c, (dec_lev>level)?-1:layers, msgqueue);
            }
          }
@@ -401,14 +415,16 @@ void enqueue_allprecincts( int tile_id, int level, int lastcomp, bool *comps, in
   Byte4_t XPsiz, YPsiz;
 
   codeidx  = msgqueue->cachemodel->target->codeidx;
+  if( tile_id < 0 )
+    return;
 
   for( c=0; c<codeidx->SIZ.Csiz; c++)
     if( lastcomp == -1 /*all*/ || ( c<=lastcomp && comps[c])){
       seq_id = 0;
       for( res_lev=0, dec_lev=codeidx->COD.numOfdecomp; dec_lev>=level; res_lev++, dec_lev--){
        
-       XTsiz = get_tile_XSiz( codeidx->SIZ, tile_id, dec_lev);
-       YTsiz = get_tile_YSiz( codeidx->SIZ, tile_id, dec_lev);
+       XTsiz = get_tile_XSiz( codeidx->SIZ, (Byte4_t)tile_id, dec_lev);
+       YTsiz = get_tile_YSiz( codeidx->SIZ, (Byte4_t)tile_id, dec_lev);
        
        XPsiz = ( codeidx->COD.Scod & 0x01) ? codeidx->COD.XPsiz[ res_lev] : XTsiz;
        YPsiz = ( codeidx->COD.Scod & 0x01) ? codeidx->COD.YPsiz[ res_lev] : YTsiz;
@@ -419,18 +435,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);
+      Byte8_t idx = search_metadataidx( query_param.box_type[i], metadatalist);
 
-      if( idx != -1)
+      if( idx != (Byte8_t)-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;
 }