BOOL FindNextFile(HANDLE hHandle, LPWIN32_FIND_DATA lpFindData) { if (lpFindData == NULL || hHandle == NULL || hHandle->GetType() != CXHandle::HND_FIND_FILE) return FALSE; if ((unsigned int) hHandle->m_nFindFileIterator >= hHandle->m_FindFileResults.size()) return FALSE; CStdString strFileName = hHandle->m_FindFileResults[hHandle->m_nFindFileIterator++]; CStdString strFileNameTest = hHandle->m_FindFileDir + strFileName; if (IsAliasShortcut(strFileNameTest)) TranslateAliasShortcut(strFileNameTest); struct stat64 fileStat; memset(&fileStat, 0, sizeof(fileStat)); if (stat64(strFileNameTest, &fileStat) == -1) return FALSE; bool bIsDir = false; if (S_ISDIR(fileStat.st_mode)) { bIsDir = true; } memset(lpFindData,0,sizeof(WIN32_FIND_DATA)); lpFindData->dwFileAttributes = FILE_ATTRIBUTE_NORMAL; strcpy(lpFindData->cFileName, strFileName.c_str()); if (bIsDir) lpFindData->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY; if (strFileName[0] == '.') lpFindData->dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN; if (access(strFileName, R_OK) == 0 && access(strFileName, W_OK) != 0) lpFindData->dwFileAttributes |= FILE_ATTRIBUTE_READONLY; TimeTToFileTime(fileStat.st_ctime, &lpFindData->ftCreationTime); TimeTToFileTime(fileStat.st_atime, &lpFindData->ftLastAccessTime); TimeTToFileTime(fileStat.st_mtime, &lpFindData->ftLastWriteTime); lpFindData->nFileSizeHigh = (DWORD)(fileStat.st_size >> 32); lpFindData->nFileSizeLow = (DWORD)fileStat.st_size; return TRUE; }
DWORD WINAPI WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ) { if (hHandle == NULL || hHandle == (HANDLE)-1) return WAIT_FAILED; DWORD dwRet = WAIT_FAILED; switch (hHandle->GetType()) { case CXHandle::HND_EVENT: case CXHandle::HND_THREAD: SDL_mutexP(hHandle->m_hMutex); // Perform the wait. dwRet = WaitForEvent(hHandle, dwMilliseconds); SDL_mutexV(hHandle->m_hMutex); break; case CXHandle::HND_MUTEX: SDL_mutexP(hHandle->m_hMutex); if (hHandle->OwningThread == pthread_self() && hHandle->RecursionCount > 0) { hHandle->RecursionCount++; dwRet = WAIT_OBJECT_0; SDL_mutexV(hHandle->m_hMutex); break; } // Perform the wait. dwRet = WaitForEvent(hHandle, dwMilliseconds); if (dwRet == WAIT_OBJECT_0) { hHandle->OwningThread = pthread_self(); hHandle->RecursionCount = 1; } SDL_mutexV(hHandle->m_hMutex); break; default: XXLog(ERROR, "cant wait for this type of object"); } return dwRet; }