//Read a list contents request header: // first item to send, 4-byte network integer // last item+1 to send, 4-byte network integer // extra data length, 4-byte network integer // extra data, list-defined bytes // list path length, 4-byte network integer (character count) // list path name, null-terminated ASCII static CpdListAccessor *CpdListHeader_ccs_list_items(char *msg, CpdListItemsRequest &h) { int msgLen=CmiSize((void *)msg)-CmiReservedHeaderSize; CpdListAccessor *ret=NULL; const ChMessageInt_t *req=(const ChMessageInt_t *)(msg+CmiReservedHeaderSize); h.lo=ChMessageInt(req[0]); // first item to send h.hi=ChMessageInt(req[1]); // last item to send+1 h.extraLen=ChMessageInt(req[2]); // extra data length if (h.extraLen>=0 && ((int)(3*sizeof(ChMessageInt_t)+h.extraLen))<msgLen) { h.extra=(void *)(req+3); // extra data ret=CpdListLookup((ChMessageInt_t *)(h.extraLen+(char *)h.extra)); if (ret!=NULL) CpdListBoundsCheck(ret,h.lo,h.hi); } return ret; }
/* CCS handler "lvImage", taking a liveVizRequest, returning binary image data. A client requests an image from us. */ extern "C" void getImageHandler(char * msg) { int msgLen=CmiSize(msg); char *buf=(char *)(msg+CmiMsgHeaderSizeBytes); msgLen-=CmiMsgHeaderSizeBytes; liveVizRequest o; PUP_toNetwork_unpack up(buf); o.pupNetwork(up); buf+=up.size(); msgLen-=up.size(); int wid=o.wid,ht=o.ht; if (config.getVerbose(2)) CmiPrintf("CCS getImage> Request for (%d x %d) or (0x%x x 0x%x) pixel image.\n", wid,ht,wid,ht); if (msgLen<0) { CmiError("liveViz0 getImageHandler Rejecting too-short image request\n"); return; } o.replyToken = CcsDelayReply(); liveViz0Get(o,buf,msgLen); CmiFree(msg); //Throw away the client's request }