int LS_VirtualDrive_FileExtract(LuaState* state, LuaStackObject* args) { VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); const char* srcFileName = luaL_checkstring(*state, 2); const char* destFileName = luaL_checkstring(*state, 3); VirtualDrive::FileEntry* entry = drive->FindFileEntry(srcFileName); if (!entry) { state->PushBoolean(false); return 1; } VirtualFile file; if (!file.Open(*drive, srcFileName)) { state->PushBoolean(false); return 1; } bool ret = Copy(file, destFileName); /* FILETIME createTime; FILETIME accessTime; FILETIME writeTime; HANDLE handle = CreateFile(destFileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); GetFileTime(handle, &createTime, &accessTime, &writeTime); writeTime.dwLowDateTime = args[ 2 ].GetInteger(); writeTime.dwHighDateTime = args[ 3 ].GetInteger(); SetFileTime(handle, &createTime, &accessTime, &writeTime); CloseHandle(handle); */ state->PushBoolean(ret); return 1; }
int LS_VirtualDrive_FileOpen(LuaState* state, LuaStackObject* args) { VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); const char* fileName = NULL; int entryIndex = -1; if (args[2].IsString()) fileName = args[2].GetString(); else if (args[2].IsNumber()) entryIndex = args[2].GetInteger(); else luaL_error(*state, "Argument 2 is not a string or integer."); VirtualFileHandle* file = PushVirtualFileHandleObj(state); if (fileName) { if (!drive->FileOpen(fileName, *file)) return 0; } else { if (!drive->FileOpenIndex((size_t)entryIndex, *file)) return 0; } return 1; }
int LS_VirtualDrive_Pack(LuaState* state, LuaStackObject* args) { VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); VirtualDrive::FileOrderInfoArray fileOrder; if (args[2].IsTable()) { VirtualDrive::FileOrderInfo info; LuaObject tableObj = args[2]; int index = 1; while (true) { LuaObject entryNameObj = tableObj[index++]; if (!entryNameObj.IsString()) break; info.entryName = entryNameObj.GetString(); LuaObject srcPathObj = tableObj[index++]; if (srcPathObj.IsNil()) break; info.srcPath = srcPathObj.GetString(); info.compressionMethod = 8; LuaObject compressionMethodObj = tableObj[index]; if (compressionMethodObj.IsNumber()) { info.compressionMethod = compressionMethodObj.GetInteger(); index++; } fileOrder.Add(info); } } state->PushBoolean(drive->Pack(&fileOrder) != 0); return 1; }
BOOL VirtualFile::Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* /*pError*/) { // Open() only works if a VirtualDriveManager is present. VirtualDriveManager* manager = VirtualDriveManager::GetInstance(); if (!manager) { ASSERT(0); return FALSE; } m_strFileName = lpszFileName; // Parse the incoming filename. CString virtualDriveName; CString virtualFileName; manager->ParseFilename(lpszFileName, virtualDriveName, virtualFileName); VirtualDrive* drive = manager->Open(virtualDriveName, false); if (!drive) return FALSE; if (nOpenFlags & modeCreate) { if (drive->m_readOnly) return false; return drive->FileCreate(virtualFileName, *this); } return drive->FileOpen(virtualFileName, *this); }
int LS_VirtualDrive_FileGetFileName(LuaState* state) { LuaStack args(state); VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); VirtualFileHandle* fileHandle = VirtualFileHandleHandleFromLua(state, args[2]); state->PushString(drive->FileGetFileName(*fileHandle)); return 1; }
int LS_VirtualDrive_FileErase(LuaState* state) { LuaStack args(state); VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); const char* fileName = luaL_checkstring(*state, 2); state->PushBoolean(drive->FileErase(fileName) != 0); return 1; }
int LS_VirtualDrive_Open(LuaState* state, LuaStackObject* args) { VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); const char* fileName = luaL_checkstring(*state, 2); const char* defaultPassword = luaL_optstring(*state, 3, NULL); state->PushBoolean(drive->Open(fileName, false, defaultPassword) != 0); return 1; }
int LS_VirtualDrive_FileGetLength(LuaState* state) { LuaStack args(state); VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); VirtualFileHandle* fileHandle = VirtualFileHandleHandleFromLua(state, args[2]); state->PushNumber((lua_Number)drive->FileGetLength(*fileHandle)); return 1; }
int LS_VirtualDrive_GetFileEntryIndex(LuaState* state, LuaStackObject* args) { VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); const char* fileName = luaL_checkstring(*state, 2); state->PushNumber(drive->FindFileEntryIndex(fileName)); return 1; }
int LS_VirtualDrive_FileSetLength(LuaState* state) { LuaStack args(state); VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); VirtualFileHandle* fileHandle = VirtualFileHandleHandleFromLua(state, args[2]); long len = luaL_checklong(*state, 3); drive->FileSetLength(*fileHandle, len); return 0; }
int LS_VirtualDrive_FileCreate(LuaState* state, LuaStackObject* args) { VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); const char* fileName = luaL_checkstring(*state, 2); UINT compressionLevel = (UINT)luaL_optnumber(*state, 3, 8); time_t fileTime = (UINT)luaL_optnumber(*state, 4, (lua_Number)time(NULL)); VirtualFileHandle* fileHandle = PushVirtualFileHandleObj(state); if (!drive->FileCreate(fileName, *fileHandle, compressionLevel, &fileTime)) return 0; return 1; }
int LS_VirtualDrive_FileWrite(LuaState* state) { LuaStack args(state); VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); VirtualFileHandle* file = VirtualFileHandleHandleFromLua(state, args[2]); size_t len; const char* buffer = luaL_checklstring(*state, 3, &len); len = luaL_optlong(*state, 4, len); drive->FileWrite(*file, buffer, len); return 0; }
int LS_VirtualDrive_FindFileEntry(LuaState* state, LuaStackObject* args) { VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); const char* fileName = luaL_checkstring(*state, 2); VirtualDrive::FileEntry* entry = drive->FindFileEntry(fileName); if (!entry) return 0; BuildFileEntry(state, entry); return 1; }
int LS_VirtualDrive_FileRead(LuaState* state) { LuaStack args(state); VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); VirtualFileHandle* fileHandle = VirtualFileHandleHandleFromLua(state, args[2]); long len = luaL_optlong(*state, 3, -1); if (len == 0) len = (long)drive->FileGetLength(*fileHandle); char* buffer = new char[len]; UINT nr = (UINT)drive->FileRead(*fileHandle, buffer, len); state->PushLString(buffer, nr); delete[] buffer; return 1; }
int LS_VirtualDrive_GetFileEntry(LuaState* state, LuaStackObject* args) { VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); int entryIndex = (int)luaL_optlong(*state, 2, -1); VirtualDrive::FileEntry* entry; entry = drive->GetFileEntry(entryIndex - 1); if (!entry) return 0; BuildFileEntry(state, entry); return 1; }
int LS_VirtualDrive_FileInsert(LuaState* state, LuaStackObject* args) { VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); const char* srcFileName = luaL_checkstring(*state, 2); const char* destFileName = luaL_checkstring(*state, 3); int compressionMethod = (UINT)luaL_optnumber(*state, 4, VirtualDrive::COMPRESSED); DiskFile file; if (!file.Open(srcFileName, File::MODE_READONLY)) { state->PushBoolean(false); return 1; } time_t fileTime = (UINT)luaL_optnumber(*state, 5, (lua_Number)file.GetLastWriteTime()); state->PushBoolean(drive->FileCopy(file, destFileName, compressionMethod, &fileTime) != 0); return 1; }
int LS_VirtualDrive_GetFileEntryCount(LuaState* state, LuaStackObject* args) { VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); state->PushNumber(drive->GetFileEntryCount()); return 1; }
int LS_VirtualDrive_GetFileName(LuaState* state, LuaStackObject* args) { VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); state->PushString(drive->GetFileName()); return 1; }
int LS_VirtualDrive_FileCloseAll(LuaState* state, LuaStackObject* args) { VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); drive->FileCloseAll(); return 0; }
int LS_VirtualDrive_Flush(LuaState* state, LuaStackObject* args) { VirtualDrive* drive = VirtualDriveFromLua(state, args[1]); drive->Flush(); return 0; }