//--------------------------------------------------------------------------- int32_t PacketFile::afterOpen(void) { if(!numPackets && getLength() >= 12) { int32_t firstPacketOffset; int32_t firstCheck = readLong(); if(firstCheck == PACKET_FILE_VERSION && !usesCheckSum) { } else { //--------------------------------------- // This is probably a checksum. Check it int32_t checkSum = checkSumFile(); if(checkSum != firstCheck) return PACKET_OUT_OF_RANGE; } firstPacketOffset = readLong(); numPackets = (firstPacketOffset / sizeof(int32_t)) - 2; } currentPacket = -1; if(fileMode == READ || fileMode == RDWRITE) { if(numPackets && !seekTable) { seekTable = (int32_t*)systemHeap->Malloc(numPackets * sizeof(int32_t)); gosASSERT(seekTable != nullptr); seek(sizeof(int32_t) * 2); //File Version & File Length read(puint8_t(seekTable), (numPackets * sizeof(int32_t))); } } return(NO_ERROR); }
//--------------------------------------------------------------------------- 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(); }
//--------------------------------------------------------------------------- long PacketFile::afterOpen (void) { if (!numPackets && getLength() >= 12) { long firstPacketOffset; long firstCheck = readLong(); if (firstCheck == PACKET_FILE_VERSION && !usesCheckSum) { } else { //--------------------------------------- // This is probably a checksum. Check it long checkSum = checkSumFile(); if (checkSum != firstCheck) return PACKET_OUT_OF_RANGE; } firstPacketOffset = readLong(); numPackets = (firstPacketOffset/sizeof(long))-2; } currentPacket = -1; if (fileMode == READ || fileMode == RDWRITE) { if (numPackets && !seekTable) { //seekTable = (long *)systemHeap->Malloc(numPackets * sizeof(long)); seekTable = new long[numPackets]; //magic 02102011 gosASSERT(seekTable != NULL); seek(sizeof(long)*2); //File Version & File Length read(MemoryPtr(seekTable),(numPackets*sizeof(long))); } } return(NO_ERR); }