/* * Wrap all 7z calls in this, so the physfs error state is set appropriately. */ static int lzma_err(SZ_RESULT rc) { switch (rc) { case SZ_OK: /* Same as LZMA_RESULT_OK */ break; case SZE_DATA_ERROR: /* Same as LZMA_RESULT_DATA_ERROR */ PHYSFS_setErrorCode(PHYSFS_ERR_CORRUPT); /*!!!FIXME: was "PHYSFS_ERR_DATA_ERROR" */ break; case SZE_OUTOFMEMORY: PHYSFS_setErrorCode(PHYSFS_ERR_OUT_OF_MEMORY); break; case SZE_CRC_ERROR: PHYSFS_setErrorCode(PHYSFS_ERR_CORRUPT); break; case SZE_NOTIMPL: PHYSFS_setErrorCode(PHYSFS_ERR_UNSUPPORTED); break; case SZE_FAIL: PHYSFS_setErrorCode(PHYSFS_ERR_OTHER_ERROR); /* !!! FIXME: right? */ break; case SZE_ARCHIVE_ERROR: PHYSFS_setErrorCode(PHYSFS_ERR_CORRUPT); /* !!! FIXME: right? */ break; default: PHYSFS_setErrorCode(PHYSFS_ERR_OTHER_ERROR); } /* switch */ return rc; } /* lzma_err */
char *__PHYSFS_platformCalcBaseDir(const char *argv0) { DWORD buflen = 64; LPWSTR modpath = NULL; char *retval = NULL; while (1) { DWORD rc; void *ptr; if ( (ptr = allocator.Realloc(modpath, buflen*sizeof(WCHAR))) == NULL ) { allocator.Free(modpath); BAIL_MACRO(PHYSFS_ERR_OUT_OF_MEMORY, NULL); } /* if */ modpath = (LPWSTR) ptr; rc = GetModuleFileNameW(NULL, modpath, buflen); if (rc == 0) { allocator.Free(modpath); BAIL_MACRO(errcodeFromWinApi(), NULL); } /* if */ if (rc < buflen) { buflen = rc; break; } /* if */ buflen *= 2; } /* while */ if (buflen > 0) /* just in case... */ { WCHAR *ptr = (modpath + buflen) - 1; while (ptr != modpath) { if (*ptr == '\\') break; ptr--; } /* while */ if ((ptr == modpath) && (*ptr != '\\')) PHYSFS_setErrorCode(PHYSFS_ERR_OTHER_ERROR); /* oh well. */ else { *(ptr+1) = '\0'; /* chop off filename. */ retval = unicodeToUtf8Heap(modpath); } /* else */ } /* else */ allocator.Free(modpath); return retval; /* w00t. */ } /* __PHYSFS_platformCalcBaseDir */
PHYSFS_sint64 __PHYSFS_platformFileLength(void *opaque) { HANDLE Handle = ((WinApiFile *)opaque)->handle; PHYSFS_sint64 retval; FILE_STANDARD_INFO file_info = { 0 }; const BOOL res = GetFileInformationByHandleEx(Handle, FileStandardInfo, &file_info, sizeof(file_info)); if (res) { retval = file_info.EndOfFile.QuadPart; assert(retval >= 0); } else { PHYSFS_setErrorCode(PHYSFS_ERR_NOT_FOUND); } return retval; } /* __PHYSFS_platformFileLength */