Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
    }
}