bool POVMS_Object::ReadObject(POVMSStream *stream, int objectsize) { int err; if(stream == NULL) return false; if(objectsize == 0) return false; err = POVMSObject_Delete(&data); if(err != kNoErr) return false; err = POVMSStream_Read(&data, stream, &objectsize); if(err != kNoErr) return false; if(objectsize != 0) return false; return true; }
void POVMS_Object::Read(InputStream& stream, bool continued, bool headeronly) { POVMSStream headerstream[16]; POVMSStream *objectstream = nullptr; POVMSStream *compressedstream = nullptr; int err = pov_base::kNoErr; int maxheadersize = 0; int datasize = 0; try { err = POVMSObject_Delete(&data); if(err != pov_base::kNoErr) throw POV_EXCEPTION_CODE(err); if(continued == false) { char header[8]; POVMSInt version = 0; if(!stream.read((void *)headerstream, 12)) throw POV_EXCEPTION_CODE(pov_base::kFileDataErr); datasize = 0; maxheadersize = 12; // header datasize += POVMSStream_ReadString(header, headerstream + datasize, 8, &maxheadersize); // header 8 byte if(!((header[0] == 'P') && (header[1] == 'O') && (header[2] == 'V') && (header[3] == 'R') && (header[4] == 'A') && (header[5] == 'Y') && (header[6] == 'M') && (header[7] == 'S'))) throw POV_EXCEPTION_CODE(pov_base::kVersionErr); datasize += POVMSStream_ReadInt(&version, headerstream + datasize, &maxheadersize); // version 4 byte if(version != 0x0370) throw POV_EXCEPTION_CODE(pov_base::kVersionErr); } if(headeronly == false) { POVMSInt objectsize = 0; POVMSType encoding = kPOVMSRawStreamEncoding; if(!stream.read((void *)headerstream, 8)) throw POV_EXCEPTION_CODE(pov_base::kFileDataErr); datasize = 0; maxheadersize = 8; // header datasize += POVMSStream_ReadInt(&objectsize, headerstream + datasize, &maxheadersize); // data size 4 byte if(objectsize == 0) throw POV_EXCEPTION_CODE(pov_base::kFileDataErr); datasize += POVMSStream_ReadType(&encoding, headerstream + datasize, &maxheadersize); // encoding 4 byte if(encoding == kPOVMSRawStreamEncoding) { objectstream = new POVMSStream[objectsize]; if(!stream.read((void *)objectstream, objectsize)) // object x byte throw POV_EXCEPTION_CODE(pov_base::kFileDataErr); if(POVMSStream_Read(&data, objectstream, &objectsize) == 0) throw POV_EXCEPTION_CODE(pov_base::kFileDataErr); } else if(encoding == kPOVMSGZipStreamEncoding) { int compressedsize = objectsize; datasize = 0; maxheadersize = 4; // header if(!stream.read((void *)headerstream, 4)) throw POV_EXCEPTION_CODE(pov_base::kFileDataErr); datasize += POVMSStream_ReadInt(&objectsize, headerstream + datasize, &maxheadersize); // object size 4 byte if(objectsize == 0) throw POV_EXCEPTION_CODE(pov_base::kFileDataErr); compressedstream = new POVMSStream[compressedsize]; objectstream = new POVMSStream[objectsize]; if(!stream.read((void *)compressedstream, compressedsize)) // data x byte throw POV_EXCEPTION_CODE(pov_base::kFileDataErr); // uncompress stream data uLongf destlen = (uLongf)objectsize; if(uncompress((Bytef *)(objectstream), &destlen, (Bytef *)(compressedstream), (uLongf)(compressedsize)) != Z_OK) throw POV_EXCEPTION_CODE(pov_base::kCannotHandleDataErr); if(POVMSStream_Read(&data, objectstream, &objectsize) == 0) throw POV_EXCEPTION_CODE(pov_base::kFileDataErr); } else throw POV_EXCEPTION_CODE(pov_base::kCannotHandleDataErr); } if (objectstream != nullptr) delete[] objectstream; objectstream = nullptr; if (compressedstream != nullptr) delete[] compressedstream; compressedstream = nullptr; } catch(...) { if (objectstream != nullptr) delete[] objectstream; if (compressedstream != nullptr) delete[] compressedstream; throw; } }