Exemplo n.º 1
0
// 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();
}
Exemplo n.º 2
0
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");
}
Exemplo n.º 3
0
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;
}