//--------------------------------------------------------------------------- void PacketFile::atClose(void) { if(isOpen() && fileMode != READ) // update filesize { int32_t endPtr = getLength(); //seek(sizeof(int32_t)); //Move Past Version Marker //writeLong(endPtr); //Write File length int32_t tableEntry; currentPacket = numPackets; if(!seekTable) { while(--currentPacket >= 0) { seek(TABLE_ENTRY(currentPacket)); tableEntry = readLong(); if(GetPacketType(tableEntry) == STORAGE_TYPE_NUL) { seek(TABLE_ENTRY(currentPacket)); writeLong(SetPacketType(endPtr, STORAGE_TYPE_NUL)); } else { endPtr = GetPacketOffset(tableEntry); } } } else { while(--currentPacket >= 0) { tableEntry = seekTable[currentPacket]; if(GetPacketType(tableEntry) == STORAGE_TYPE_NUL) { seekTable[currentPacket] = SetPacketType(endPtr, STORAGE_TYPE_NUL); } else { endPtr = GetPacketOffset(tableEntry); } } } //----------------------------------------------------- // If seekTable was being used, write it back to file if(seekTable) { seek(sizeof(int32_t) * 2); //File Version & File Length write(puint8_t(seekTable), (numPackets * sizeof(int32_t))); } //------------------------------------------------------ // Is we were using a checkSum, calc it and write it to // the beginning of the file. if(usesCheckSum) { int32_t checkSum = checkSumFile(); seek(0); writeLong(checkSum); } } clear(); }
//--------------------------------------------------------------------------- int32_t PacketFile::readPacketOffset(int32_t packet, int32_t* lastType) { int32_t offset = -1; if(packet < numPackets) { if(seekTable) offset = seekTable[packet]; if(lastType) *lastType = GetPacketType(offset); offset = GetPacketOffset(offset); } return offset; }
//--------------------------------------------------------------------------- long PacketFile::readPacketOffset (long packet, long *lastType) { long offset = -1; if (packet < numPackets) { if (seekTable) offset = seekTable[packet]; if (lastType) *lastType = GetPacketType(offset); offset = GetPacketOffset(offset); } return offset; }