void MrwDecoder::parseHeader() { const unsigned char* data = mFile->getData(0); if (mFile->getSize() < 30) ThrowRDE("Not a valid MRW file (size too small)"); if (!isMRW(mFile)) ThrowRDE("This isn't actually a MRW file, why are you calling me?"); data_offset = get4BE(data,4)+8; if (!mFile->isValid(data_offset)) ThrowRDE("MRW: Data offset is invalid"); // Make sure all values have at least been initialized raw_width = raw_height = packed = 0; wb_coeffs[0] = wb_coeffs[1] = wb_coeffs[2] = wb_coeffs[3] = NAN; uint32 currpos = 8; while (currpos < data_offset) { uint32 tag = get4BE(data,currpos); uint32 len = get4BE(data,currpos+4); switch(tag) { case 0x505244: // PRD raw_height = get2BE(data,currpos+16); raw_width = get2BE(data,currpos+18); packed = (data[currpos+24] == 12); case 0x574247: // WBG for(uint32 i=0; i<4; i++) wb_coeffs[i] = (float)get2BE(data, currpos+12+i*2); break; case 0x545457: // TTW // Base value for offsets needs to be at the beginning of the TIFF block, not the file FileMap *f = new FileMap(mFile->getDataWrt(currpos+8), mFile->getSize()-currpos-8); if (little == getHostEndianness()) tiff_meta = new TiffIFDBE(f, 8); else tiff_meta = new TiffIFD(f, 8); delete f; break; } currpos += MAX(len+8,1); // MAX(,1) to make sure we make progress } }
/* * Dump the contents of a packet to stdout. */ static void dumpPacket(const unsigned char* packetBuf, const char* srcName, const char* dstName) { const unsigned char* buf = packetBuf; char prefix[3]; u4 length, id; u1 flags, cmdSet=0, cmd=0; JdwpError error = ERR_NONE; bool reply; int dataLen; length = get4BE(buf+0); id = get4BE(buf+4); flags = get1(buf+8); if ((flags & kJDWPFlagReply) != 0) { reply = true; error = static_cast<JdwpError>(get2BE(buf+9)); } else { reply = false; cmdSet = get1(buf+9); cmd = get1(buf+10); } buf += kJDWPHeaderLen; dataLen = length - (buf - packetBuf); if (!reply) { prefix[0] = srcName[0]; prefix[1] = '>'; } else { prefix[0] = dstName[0]; prefix[1] = '<'; } prefix[2] = '\0'; int min, sec; getCurrentTime(&min, &sec); if (!reply) { printf("%s REQUEST dataLen=%-5u id=0x%08x flags=0x%02x cmd=%d/%d [%02d:%02d]\n", prefix, dataLen, id, flags, cmdSet, cmd, min, sec); printf("%s --> %s\n", prefix, getCommandName(cmdSet, cmd)); } else { printf("%s REPLY dataLen=%-5u id=0x%08x flags=0x%02x err=%d (%s) [%02d:%02d]\n", prefix, dataLen, id, flags, error, dvmJdwpErrorStr(error), min,sec); } if (dataLen > 0) printHexDump2(buf, dataLen, prefix); printf("%s ----------\n", prefix); }