// Return the current Position in the File. VFS_LONG VFS_File_Tell( VFS_Handle hFile ) { // Not initialized yet? if( !IsInit() ) { SetLastError( VFS_ERROR_NOT_INITIALIZED_YET ); return VFS_INVALID_LONG_VALUE; } // Invalid Handle Value? if( hFile == VFS_INVALID_HANDLE_VALUE ) { SetLastError( VFS_ERROR_INVALID_PARAMETER ); return VFS_INVALID_LONG_VALUE; } // Get the File Pointer. IFile* pFile = ( IFile* )( VFS_DWORD )hFile; return pFile->Tell(); }
void SuiteFile::TestFunctionality(IFile& aFile, TUint32 aBytes) { Print("Testing File implementation functionality on %d byte file\n", aBytes); // We should be able to set the file cursor to all // bytes, from 0, up to /and including/ aBytes. // i.e. it is valid for the cursor to be pointing off // the end, but not to read data from here. // Test absolute seeking - ensure cursor is changed for // each test. aFile.Seek(0, eSeekFromStart); TEST(aFile.Tell() == 0); aFile.Seek(aBytes, eSeekFromStart); TEST(aFile.Tell() == aBytes); aFile.Seek(-(TInt) aBytes, eSeekFromEnd); TEST(aFile.Tell() == 0); aFile.Seek(0, eSeekFromEnd); TEST(aFile.Tell() == aBytes); // Test boundaries // Backwards at start. TEST_THROWS(aFile.Seek(-1, eSeekFromStart), FileSeekError); // Forwards at end //TEST_THROWS(aFile.Seek(+1, eSeekFromEnd), FileSeekError); // Forwards from start //TEST_THROWS(aFile.Seek(aBytes+1, eSeekFromStart), FileSeekError); // Backwards from end TEST_THROWS(aFile.Seek(-(TInt) (aBytes+1), eSeekFromEnd), FileSeekError); // Reading Bwh buffer(aBytes + 20); aFile.Seek(0, eSeekFromStart); aFile.Read(buffer); TEST(aFile.Tell() == aBytes); TEST(buffer.Bytes() == aBytes); const TUint readBytes = 10; aFile.Seek(0, eSeekFromStart); buffer.SetBytes(0); aFile.Read(buffer, readBytes); TEST(aFile.Tell() == readBytes); TEST(buffer.Bytes() == readBytes); aFile.Seek(-(TInt) (readBytes/2), eSeekFromEnd); buffer.SetBytes(0); aFile.Read(buffer); TEST(aFile.Tell() == aBytes); TEST(buffer.Bytes() == readBytes/2); aFile.Seek(0, eSeekFromEnd); buffer.SetBytes(0); TEST_THROWS(aFile.Read(buffer), FileReadError); // Writing buffer.SetBytes(aBytes/2); TEST_THROWS(aFile.Write(buffer), FileWriteError); Print("\n"); }
HRESULT KG3DTerrainRoad::SaveToFile(const char cszFileName[]) { // int nRetCode = false; HRESULT hr =E_FAIL; _RoadHead RoadHead; DWORD PosStart,PosEnd; IFile* pFile = NULL; RoadHead.dwNumOfNode = (DWORD)m_listNode.size(); RoadHead.dwNumOfPassage = (DWORD)m_listPassage.size(); D3DXVECTOR3* pNodePos = new D3DXVECTOR3[RoadHead.dwNumOfNode]; list<KG3DRepresentObjectNode*>::iterator iNode; DWORD k = 0; pFile = g_OpenFile(cszFileName,false,true); KG_PROCESS_ERROR(pFile); PosStart = pFile->Tell();//ftell(pFile); iNode = m_listNode.begin(); while(iNode != m_listNode.end()) { (*iNode)->GetTranslation(&pNodePos[k]);//pNodePos[i] = (*iNode)->vPosition; k++; ++iNode; } RoadHead.fBendModulus = m_fBendModulus; RoadHead.fBlendLength = m_fBlendLength; RoadHead.fEdgeModulus = m_fEdgeModulus; RoadHead.fWidth = m_fWidth; RoadHead.fTexDensity = m_fTexDensity; RoadHead.nID = m_nID; RoadHead.fNodeSize = m_fNodeSize; RoadHead.dwSegmentLength= m_nSegmentLength; RoadHead.dwNumParentBlock = (DWORD)m_vecParentTerrainBlock.size(); RoadHead.dwParentTerrainBlock = PosStart + sizeof(_RoadHead); RoadHead.dwNodePosBlock = PosStart + sizeof(_RoadHead) + sizeof(TerrainBlockInfo) * RoadHead.dwNumParentBlock ; RoadHead.dwPassageBlock = PosStart + sizeof(_RoadHead) + sizeof(TerrainBlockInfo) * RoadHead.dwNumParentBlock + sizeof(D3DXVECTOR3)*RoadHead.dwNumOfNode; strncpy(RoadHead.scName,m_scName.c_str(),sizeof(TCHAR)*32); strncpy(RoadHead.scTextureName,m_scTextureName.c_str(),sizeof(TCHAR)*MAX_PATH); pFile->Write(&RoadHead, sizeof(_RoadHead)); for (int nT= 0; nT < (int)RoadHead.dwNumParentBlock; nT++) { TerrainBlockInfo TBI = m_vecParentTerrainBlock[nT]; pFile->Write(&TBI,sizeof(TerrainBlockInfo)); } pFile->Write(pNodePos,sizeof(D3DXVECTOR3)*RoadHead.dwNumOfNode); { list<KG3DPassage*>::iterator i = m_listPassage.begin(); while ( i != m_listPassage.end()) { KG3DTerrainRoadPassage* pPassage = static_cast<KG3DTerrainRoadPassage*>(*i); pPassage->WriteDataToFile(pFile); ++i; } } PosEnd = pFile->Tell();//ftell(pFile); hr = S_OK; Exit0: KG_COM_RELEASE(pFile); SAFE_DELETE_ARRAY(pNodePos); return hr; }