APIRET OS2ENTRY DosFindNext( HDIR hDir, PVOID pFindBuf, ULONG cbFindBuf, PULONG pcFileNames) { WIN32_FIND_DATA FindData; /* Win32 Find data (returned by FindFirstFile) */ APIRET rc; if (!VALIDPTR(pFindBuf)) { fprintf(stderr, "DosFindNext: pfindbuf - %p\n", pFindBuf); return ERROR_INVALID_PARAMETER; } if (cbFindBuf < sizeof(FILEFINDBUF3)) { fprintf(stderr, "DosFindNext: unsupported buffer size - %d\n", cbFindBuf); return ERROR_INVALID_PARAMETER; } if (!VALIDPTR(pcFileNames)) { fprintf(stderr, "DosFindNext: pcFileNames - %p\n", pcFileNames); return ERROR_INVALID_PARAMETER; } if (FindNextFile((HANDLE)hDir, &FindData)) { PFILEFINDBUF3 pfindbuf = (PFILEFINDBUF3)pFindBuf; memcpy(pfindbuf->achName, FindData.cFileName, pfindbuf->cchName = strlen(FindData.cFileName) + 1); pfindbuf->cbFile = pfindbuf->cbFileAlloc = FindData.nFileSizeHigh > 0 ? 0xffffffff : FindData.nFileSizeLow; pfindbuf->attrFile = ConvertAttributes(FindData.dwFileAttributes); *(PULONG)(&pfindbuf->fdateCreation) = ConvertFileTime(&FindData.ftCreationTime); *(PULONG)(&pfindbuf->fdateLastAccess) = ConvertFileTime(&FindData.ftLastAccessTime); *(PULONG)(&pfindbuf->fdateLastWrite) = ConvertFileTime(&FindData.ftLastWriteTime); pfindbuf->oNextEntryOffset = 0; *pcFileNames = 1; rc = NO_ERROR; } else rc = GetLastError(); return rc; }
ASM(LONG) sz_GetInfo(REG(a0, struct xadArchiveInfo *ai), REG(a6, struct xadMasterBase *xadMasterBase)) #endif { #ifdef __amigaos4__ IExec = (struct ExecIFace *)(*(struct ExecBase **)4)->MainInterface; newlibbase = OpenLibrary("newlib.library", 52); if(newlibbase) INewlib = GetInterface(newlibbase, "main", 1, NULL); #elif defined(__AROS__) if(!(aroscbase = OpenLibrary("arosc.library", 41))) return(XADERR_RESOURCE); #else SysBase = *(struct ExecBase **)4; #endif ai->xai_PrivateClient = xadAllocVec(sizeof(struct xad7zprivate),MEMF_PRIVATE | MEMF_CLEAR); struct xad7zprivate *xad7z = ai->xai_PrivateClient; struct xadFileInfo *fi; long err=XADERR_OK; long res=SZ_OK; size_t namelen; UBYTE *namebuf; // was UWORD CFileXadInStream *archiveStream = &xad7z->archiveStream; CSzArEx *db = &xad7z->db; /* 7z archive database structure */ ISzAlloc allocImp; /* memory functions for main pool */ ISzAlloc allocTempImp; /* memory functions for temporary pool */ CLookToRead *lookStream = &xad7z->lookStream; allocImp.Alloc = SzAlloc; allocImp.Free = SzFree; allocTempImp.Alloc = SzAllocTemp; allocTempImp.Free = SzFreeTemp; archiveStream->ai = ai; #ifdef __amigaos4__ archiveStream->IxadMaster = IxadMaster; #else archiveStream->xadMasterBase = xadMasterBase; #endif archiveStream->InStream.Read = SzFileReadImp; archiveStream->InStream.Seek = SzFileSeekImp; if(namebuf = AllocVec(1024, MEMF_PRIVATE)) { LookToRead_CreateVTable(lookStream, False); lookStream->realStream = (ISeekInStream *)&archiveStream->InStream; LookToRead_Init(lookStream); xad7z->blockIndex = 0xfffffff; xad7z->outBuffer = 0; xad7z->outBufferSize = 0; CrcGenerateTable(); SzArEx_Init(db); res = SzArEx_Open(db, &lookStream->s, &allocImp, &allocTempImp); if(res == SZ_OK) { UInt32 i; for (i = 0; i < db->db.NumFiles; i++) { fi = (struct xadFileInfo *) xadAllocObjectA(XADOBJ_FILEINFO, NULL); if (!fi) return(XADERR_NOMEMORY); CSzFileItem *f = db->db.Files + i; fi->xfi_DataPos = 0; //ai->xai_InPos; // i fi->xfi_Size = f->Size; namelen = SzArEx_GetFileNameUtf16(db, i, namebuf); // & if (!(fi->xfi_FileName = xadConvertName(CHARSET_HOST, #if defined(__AROS__) && (AROS_BIG_ENDIAN == 0) XAD_CHARACTERSET, CHARSET_UNICODE_UCS2_LITTLEENDIAN, #else XAD_CHARACTERSET, CHARSET_UNICODE_UCS2_BIGENDIAN, #endif XAD_STRINGSIZE, namelen, XAD_CSTRING, namebuf, // no * TAG_DONE))) return(XADERR_NOMEMORY); xadConvertDates(XAD_DATEAMIGA,ConvertFileTime(&f->MTime), XAD_GETDATEXADDATE,&fi->xfi_Date, TAG_DONE); fi->xfi_CrunchSize = 0; //(long) (db->Database.PackSizes[i] << 32); //fi->xfi_Size; fi->xfi_Flags = 0; if(f->IsDir) { fi->xfi_Flags |= XADFIF_DIRECTORY; } if ((err = xadAddFileEntryA(fi, ai, NULL))) return(XADERR_NOMEMORY); } } FreeVec(namebuf); } return(sztoxaderr(res)); }
APIRET OS2ENTRY DosQueryPathInfo( PCSZ pszPathName, ULONG ulInfoLevel, PVOID pInfoBuf, ULONG cbInfoBuf) { APIRET rc; /* Return code. */ if (!VALIDPTR(pszPathName)) { fprintf(stderr, "DosQueryPathInfo: pszPathName is an invalid pointer - %p\n", pszPathName); return ERROR_INVALID_PARAMETER; } if (!VALIDPTR(pInfoBuf)) { fprintf(stderr, "DosQueryPathInfo: pInfoBuf is an invalid pointer - %p\n", pInfoBuf); return ERROR_INVALID_PARAMETER; } rc = ERROR_INVALID_PARAMETER; switch (ulInfoLevel) { case FIL_QUERYFULLNAME: { LPTSTR lpDummy; if (GetFullPathName(pszPathName, cbInfoBuf, pInfoBuf, &lpDummy) > 0) rc = NO_ERROR; else rc = GetLastError(); break; } case FIL_STANDARD: if (cbInfoBuf == sizeof(FILESTATUS3)) { WIN32_FILE_ATTRIBUTE_DATA fad; if (GetFileAttributesEx(pszPathName, GetFileExInfoStandard, &fad)) //W98, NT4 and above. { PFILESTATUS3 pfst3 = (PFILESTATUS3)(pInfoBuf); if (fad.nFileSizeHigh > 0) rc = ERROR_BAD_LENGTH; pfst3->cbFile = pfst3->cbFileAlloc = fad.nFileSizeLow; pfst3->attrFile = ConvertAttributes(fad.dwFileAttributes); *(PULONG)(&pfst3->fdateCreation) = ConvertFileTime(&fad.ftCreationTime); *(PULONG)(&pfst3->fdateLastAccess) = ConvertFileTime(&fad.ftLastAccessTime); *(PULONG)(&pfst3->fdateLastWrite) = ConvertFileTime(&fad.ftLastWriteTime); rc = NO_ERROR; } else rc = GetLastError(); } else fprintf(stderr, "DosQueryPathInfo: FIL_STANDARD - invalid structure size (cbInfoBuf=%d)\n", cbInfoBuf); break; default: fprintf(stderr, "DosQueryPathInfo: ulInfoLevel=%d not supported\n", ulInfoLevel); } return rc; }
APIRET OS2ENTRY DosFindFirst( PCSZ pszFileSpec, PHDIR phdir, ULONG flAttribute, PVOID pFindBuf, ULONG cbFindBuf, PULONG pcFileNames, ULONG ulInfoLevel) { WIN32_FIND_DATA FindData; /* Win32 Find data (returned by FindFirstFile) */ APIRET rc; if (!VALIDPTR(pszFileSpec)) { fprintf(stderr, "DosFindFirst: pszFileSpec - %p\n", pszFileSpec); return ERROR_INVALID_PARAMETER; } if (!VALIDPTR(phdir)) { fprintf(stderr, "DosFindFirst: phdir - %p\n", phdir); return ERROR_INVALID_PARAMETER; } if (!VALIDPTR(pFindBuf)) { fprintf(stderr, "DosFindFirst: pfindbuf - %p\n", pFindBuf); return ERROR_INVALID_PARAMETER; } if (!VALIDPTR(pcFileNames)) { fprintf(stderr, "DosFindFirst: pcFileNames - %p\n", pcFileNames); return ERROR_INVALID_PARAMETER; } if (*phdir != HDIR_CREATE) { fprintf(stderr, "DosFindFirst: *phdir != HDIR_CREATE - 0x%08x\n", *phdir); return ERROR_INVALID_PARAMETER; } switch (ulInfoLevel) { case FIL_STANDARD: if (cbFindBuf < sizeof(FILEFINDBUF3)) { fprintf(stderr, "DosFindFirst: unsupported buffer size - %d\n", cbFindBuf); return ERROR_INVALID_PARAMETER; } break; default: fprintf(stderr, "DosFindFirst: invalid infolevel %d\n", ulInfoLevel); return ERROR_INVALID_PARAMETER; } *phdir = (HDIR)FindFirstFile(pszFileSpec, &FindData); if (*phdir != (HDIR)INVALID_HANDLE_VALUE) { PFILEFINDBUF3 pfindbuf = (PFILEFINDBUF3)pFindBuf; memcpy(pfindbuf->achName, FindData.cFileName, pfindbuf->cchName = strlen(FindData.cFileName) + 1); pfindbuf->cbFile = pfindbuf->cbFileAlloc = FindData.nFileSizeHigh > 0 ? 0xffffffff : FindData.nFileSizeLow; pfindbuf->attrFile = ConvertAttributes(FindData.dwFileAttributes); *(PULONG)(&pfindbuf->fdateCreation) = ConvertFileTime(&FindData.ftCreationTime); *(PULONG)(&pfindbuf->fdateLastAccess) = ConvertFileTime(&FindData.ftLastAccessTime); *(PULONG)(&pfindbuf->fdateLastWrite) = ConvertFileTime(&FindData.ftLastWriteTime); pfindbuf->oNextEntryOffset = 0; *pcFileNames = 1; rc = NO_ERROR; } else rc = GetLastError(); return rc; }