Skip to content

Commit

Permalink
Fixed #8157 [Request] fileGetPath
Browse files Browse the repository at this point in the history
  • Loading branch information
sbx320 committed Aug 22, 2015
1 parent 2ff9e9f commit 87697c4
Show file tree
Hide file tree
Showing 8 changed files with 146 additions and 28 deletions.
21 changes: 16 additions & 5 deletions MTA10/mods/shared_logic/CScriptFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,16 @@

#include <StdInc.h>

CScriptFile::CScriptFile ( const char* szFilename, unsigned long ulMaxSize ) : ClassInit ( this ), CClientEntity ( INVALID_ELEMENT_ID )
CScriptFile::CScriptFile( uint uiScriptId, const char* szFilename, unsigned long ulMaxSize, eAccessType accessType ) : ClassInit( this ), CClientEntity( INVALID_ELEMENT_ID )
{
// Init
SetTypeName ( "file" );
m_pFile = NULL;
m_strFilename = szFilename ? szFilename : "";
m_ulMaxSize = ulMaxSize;
m_uiScriptId = uiScriptId;
m_accessType = accessType;

}


Expand All @@ -30,30 +33,31 @@ CScriptFile::~CScriptFile ( void )
}


bool CScriptFile::Load ( eMode Mode )
bool CScriptFile::Load( CResource* pResourceForFilePath, eMode Mode )
{
// If we haven't already got a file
if ( !m_pFile )
{
m_bDoneResourceFileCheck = false;
m_pFile = g_pNet->AllocateBinaryFile ();
bool bOk = false;
SString strAbsPath = pResourceForFilePath->GetResourceDirectoryPath( m_accessType, m_strFilename );
switch ( Mode )
{
// Open file in read only binary mode
case MODE_READ:
bOk = m_pFile->FOpen ( m_strFilename.c_str (), "rb", true );
bOk = m_pFile->FOpen( strAbsPath.c_str( ), "rb", true );
break;

// Open file in read write binary mode.
case MODE_READWRITE:
// Try to load the file in rw mode. Use existing content.
bOk = m_pFile->FOpen ( m_strFilename.c_str (), "rb+", true );
bOk = m_pFile->FOpen( strAbsPath.c_str( ), "rb+", true );
break;

// Open file in read write binary mode. Truncate size to 0.
case MODE_CREATE:
bOk = m_pFile->FOpen ( m_strFilename.c_str (), "wb+", true );
bOk = m_pFile->FOpen( strAbsPath.c_str( ), "wb+", true );
break;
}

Expand All @@ -62,6 +66,8 @@ bool CScriptFile::Load ( eMode Mode )
SAFE_DELETE( m_pFile );
}

m_pResource = pResourceForFilePath;

// Return whether we successfully opened it or not
return m_pFile != NULL;
}
Expand Down Expand Up @@ -207,3 +213,8 @@ void CScriptFile::DoResourceFileCheck ( void )
g_pClientGame->GetResourceManager()->ValidateResourceFile( m_strFilename, buffer );
}
}

CResource* CScriptFile::GetResource( void )
{
return m_pResource;
}
13 changes: 10 additions & 3 deletions MTA10/mods/shared_logic/CScriptFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class CScriptFile : public CClientEntity
MODE_CREATE,
};

CScriptFile ( const char* szFilename, unsigned long ulMaxSize );
CScriptFile ( uint uiScriptId, const char* szFilename, unsigned long ulMaxSize, eAccessType accessType );
~CScriptFile ( void );

// Functions required for linking
Expand All @@ -42,9 +42,13 @@ class CScriptFile : public CClientEntity
bool ReadSpecialData ( void ) { return true; };

// Load and unload routines
bool Load ( eMode Mode );
bool Load ( CResource* pResourceForFilePath, eMode Mode );
void Unload ( void );
bool IsLoaded ( void ) { return m_pFile != NULL; };
const SString& GetFilePath ( void ) { return m_strFilename; };

// Get the owning resource
CResource* GetResource ( void );

// Only call functions belw this if you're sure that the file is loaded.
// Or you will crash.
Expand All @@ -62,9 +66,12 @@ class CScriptFile : public CClientEntity
void DoResourceFileCheck ( void );

CBinaryFileInterface* m_pFile;
std::string m_strFilename;
SString m_strFilename;
unsigned long m_ulMaxSize;
bool m_bDoneResourceFileCheck;
unsigned int m_uiScriptId;
CResource* m_pResource;
eAccessType m_accessType;
};

#endif
82 changes: 63 additions & 19 deletions MTA10/mods/shared_logic/luadefs/CLuaFileDefs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ void CLuaFileDefs::LoadFunctions ( void )
CLuaCFunctions::AddFunction ( "fileDelete", CLuaFileDefs::fileDelete );
CLuaCFunctions::AddFunction ( "fileRename", CLuaFileDefs::fileRename );
CLuaCFunctions::AddFunction ( "fileCopy", CLuaFileDefs::fileCopy );
CLuaCFunctions::AddFunction ( "fileGetPath", CLuaFileDefs::fileGetPath );
}


Expand All @@ -56,9 +57,11 @@ int CLuaFileDefs::fileCreate ( lua_State* luaVM )
else
if ( pLuaMain )
{
std::string strAbsPath;
CResource* pResource = pLuaMain->GetResource ();
if ( CResourceManager::ParseResourcePathInput ( filePath, pResource, strAbsPath ) )
SString strAbsPath;
SString strMetaPath;
CResource* pThisResource = pLuaMain->GetResource ();
CResource* pResource = pThisResource;
if ( CResourceManager::ParseResourcePathInput ( filePath, pResource, strAbsPath, strMetaPath ) )
{
// Inform file verifier
g_pClientGame->GetResourceManager()->FileModifedByScript( strAbsPath );
Expand All @@ -67,25 +70,21 @@ int CLuaFileDefs::fileCreate ( lua_State* luaVM )
MakeSureDirExists ( strAbsPath.c_str () );

// Create the file to create
CScriptFile* pFile = new CScriptFile ( strAbsPath.c_str (), DEFAULT_MAX_FILESIZE );
eAccessType accessType = filePath[0] == '@' ? eAccessType::ACCESS_PRIVATE : eAccessType::ACCESS_PUBLIC;
CScriptFile* pFile = new CScriptFile( pThisResource->GetScriptID( ), strMetaPath.c_str(), DEFAULT_MAX_FILESIZE, accessType);
assert ( pFile );

// Try to load it
if ( pFile->Load ( CScriptFile::MODE_CREATE ) )
if ( pFile->Load ( pResource, CScriptFile::MODE_CREATE ) )
{
// Make it a child of the resource's file root
pFile->SetParent ( pResource->GetResourceDynamicEntity () );

// Grab its owner resource
CResource* pParentResource = pLuaMain->GetResource ();
if ( pParentResource )
// Add it to the scrpt resource element group
CElementGroup* pGroup = pThisResource->GetElementGroup ();
if ( pGroup )
{
// Add it to the scrpt resource element group
CElementGroup* pGroup = pParentResource->GetElementGroup ();
if ( pGroup )
{
pGroup->Add ( pFile );
}
pGroup->Add ( pFile );
}

// Success. Return the file.
Expand Down Expand Up @@ -162,20 +161,23 @@ int CLuaFileDefs::fileOpen ( lua_State* luaVM )
CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine ( luaVM );
if ( pLuaMain )
{
std::string strAbsPath;
CResource* pResource = pLuaMain->GetResource ();
if ( CResourceManager::ParseResourcePathInput ( filePath, pResource, strAbsPath ) )
SString strAbsPath;
SString strMetaPath;
CResource* pThisResource = pLuaMain->GetResource ();
CResource* pResource = pThisResource;
if ( CResourceManager::ParseResourcePathInput ( filePath, pResource, strAbsPath, strMetaPath ) )
{
// Inform file verifier
if ( !readOnly )
g_pClientGame->GetResourceManager()->FileModifedByScript( strAbsPath );

// Create the file to create
CScriptFile* pFile = new CScriptFile ( strAbsPath.c_str (), DEFAULT_MAX_FILESIZE );
eAccessType accessType = filePath[0] == '@' ? eAccessType::ACCESS_PRIVATE : eAccessType::ACCESS_PUBLIC;
CScriptFile* pFile = new CScriptFile( pThisResource->GetScriptID( ), strMetaPath.c_str( ), DEFAULT_MAX_FILESIZE, accessType );
assert ( pFile );

// Try to load it
if ( pFile->Load ( readOnly ? CScriptFile::MODE_READ : CScriptFile::MODE_READWRITE ) )
if ( pFile->Load ( pResource, readOnly ? CScriptFile::MODE_READ : CScriptFile::MODE_READWRITE ) )
{
// Make it a child of the resource's file root
pFile->SetParent ( pResource->GetResourceDynamicEntity () );
Expand Down Expand Up @@ -730,3 +732,45 @@ int CLuaFileDefs::fileCopy ( lua_State* luaVM )
lua_pushboolean ( luaVM, false );
return 1;
}



int CLuaFileDefs::fileGetPath ( lua_State* luaVM )
{
// string fileGetPath ( file theFile )
CScriptFile* pFile;

CScriptArgReader argStream ( luaVM );
argStream.ReadUserData ( pFile );

if ( !argStream.HasErrors () )
{
// Grab our lua VM
CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine ( luaVM );
if ( pLuaMain )
{
// We have a resource argument?
CResource* pThisResource = pLuaMain->GetResource ();
CResource* pFileResource = pFile->GetResource ();

SString strFilePath = pFile->GetFilePath ();

// If the calling resource is not the resource the file resides in
// we need to prepend :resourceName to the path
if ( pThisResource != pFileResource )
{
SString strResourceName = pFileResource->GetName ();
strFilePath = ":" + strResourceName + "/" + strFilePath;
}

lua_pushlstring ( luaVM, strFilePath.c_str (), strFilePath.length () );
return 1;
}
}
else
m_pScriptDebugging->LogCustom ( luaVM, argStream.GetFullErrorMessage () );

// Failed
lua_pushboolean ( luaVM, false );
return 1;
}
1 change: 1 addition & 0 deletions MTA10/mods/shared_logic/luadefs/CLuaFileDefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class CLuaFileDefs: public CLuaDefs
static int fileDelete ( lua_State* luaVM );
static int fileRename ( lua_State* luaVM );
static int fileCopy ( lua_State* luaVM );
static int fileGetPath ( lua_State* luaVM );
};

#endif
8 changes: 8 additions & 0 deletions MTA10_Server/mods/deathmatch/logic/CScriptFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ CScriptFile::CScriptFile ( uint uiScriptId, const char* szFilename, unsigned lon
m_pFile = NULL;
m_strFilename = szFilename ? szFilename : "";
m_ulMaxSize = ulMaxSize;
m_pResource = nullptr;
}


Expand Down Expand Up @@ -67,6 +68,8 @@ bool CScriptFile::Load ( CResource* pResourceForFilePath, eMode Mode )
CResource* pResource = g_pGame->GetResourceManager ()->GetResourceFromScriptID( m_uiScriptId );
if ( pResource && pResource->GetVirtualMachine() )
pResource->GetVirtualMachine()->OnOpenFile( m_strFilename );

m_pResource = pResourceForFilePath;
}
return m_pFile != NULL;
}
Expand Down Expand Up @@ -196,3 +199,8 @@ long CScriptFile::Write ( unsigned long ulSize, const char* pData )
// Write the data into the given block. Return number of bytes we wrote.
return fwrite ( pData, 1, ulSize, m_pFile );
}

CResource* CScriptFile::GetResource( void )
{
return m_pResource;
}
7 changes: 6 additions & 1 deletion MTA10_Server/mods/deathmatch/logic/CScriptFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ class CScriptFile: public CElement
bool Load ( CResource* pResourceForFilePath, eMode Mode );
void Unload ( void );
bool IsLoaded ( void ) { return m_pFile != NULL; };
const SString& GetFilePath ( void ) { return m_strFilename; };

// Get the owning resource
CResource* GetResource ( void );

// Only call functions belw this if you're sure that the file is loaded.
// Or you will crash.
Expand All @@ -53,9 +57,10 @@ class CScriptFile: public CElement
long Write ( unsigned long ulSize, const char* pData );

private:
CResource* m_pResource;
FILE* m_pFile;
uint m_uiScriptId;
std::string m_strFilename;
SString m_strFilename;
unsigned long m_ulMaxSize;
};

Expand Down
41 changes: 41 additions & 0 deletions MTA10_Server/mods/deathmatch/logic/luadefs/CLuaFileDefs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ void CLuaFileDefs::LoadFunctions ( void )
CLuaCFunctions::AddFunction ( "fileDelete", CLuaFileDefs::fileDelete );
CLuaCFunctions::AddFunction ( "fileRename", CLuaFileDefs::fileRename );
CLuaCFunctions::AddFunction ( "fileCopy", CLuaFileDefs::fileCopy );
CLuaCFunctions::AddFunction ( "fileGetPath", CLuaFileDefs::fileGetPath );
}


Expand Down Expand Up @@ -751,3 +752,43 @@ int CLuaFileDefs::fileCopy ( lua_State* luaVM )
return 1;
}


int CLuaFileDefs::fileGetPath( lua_State* luaVM )
{
// string fileGetPath ( file theFile )
CScriptFile* pFile;

CScriptArgReader argStream( luaVM );
argStream.ReadUserData( pFile );

if ( !argStream.HasErrors( ) )
{
// Grab our lua VM
CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine( luaVM );
if ( pLuaMain )
{
// We have a resource argument?
CResource* pThisResource = pLuaMain->GetResource( );
CResource* pFileResource = pFile->GetResource( );

const SString& strFilePath = pFile->GetFilePath( );
SString outPath = strFilePath;

// If the calling resource is not the resource the file resides in
// we need to prepend :resourceName to the path
if ( pThisResource != pFileResource )
{
outPath = ":" + pFileResource->GetName() + "/" + outPath;
}

lua_pushlstring( luaVM, outPath.c_str( ), outPath.length( ) );
return 1;
}
}
else
m_pScriptDebugging->LogCustom( luaVM, argStream.GetFullErrorMessage( ) );

// Failed
lua_pushboolean( luaVM, false );
return 1;
}
1 change: 1 addition & 0 deletions MTA10_Server/mods/deathmatch/logic/luadefs/CLuaFileDefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ class CLuaFileDefs: public CLuaDefs
static int fileDelete ( lua_State* luaVM );
static int fileRename ( lua_State* luaVM );
static int fileCopy ( lua_State* luaVM );
static int fileGetPath ( lua_State* luaVM );
};

#endif

0 comments on commit 87697c4

Please sign in to comment.