/***************************************************************************** DWORD GetFileSizeQW(CONST TCHAR * szFilename, QWORD * qwSize) szFilename : (IN) filename of the file whose filesize we want qwSize : (OUT) filesize as QWORD Return Value: returns NOERROR if everything went fine. Otherwise GetLastError() is returned Notes: - gets size as QWORD from a string - is also used to validate the string as a legal, openable file (f.e. if szFilename is some blabla GetLastError() will return 2 => file not found) *****************************************************************************/ DWORD GetFileSizeQW(CONST TCHAR * szFilename, QWORD * qwSize) { DWORD dwErrorCode; HANDLE hFile; DWORD dwLo = 0, dwHi = 0; hFile = CreateFile(szFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0 , 0); if(hFile == INVALID_HANDLE_VALUE) return GetLastError(); dwLo = GetFileSize(hFile, &dwHi); dwErrorCode = GetLastError(); CloseHandle(hFile); if(dwLo == INVALID_FILE_SIZE){ if(dwErrorCode != NOERROR){ (*qwSize) = 0; return dwErrorCode; } } (*qwSize) = MAKEQWORD(dwHi, dwLo); return NO_ERROR; }
bool IncludesFile(const String& parent_path, const String& header_path) { LTIMING("IncludesFile"); int pi = sSrcFile.Find(parent_path); int i = sSrcFile.Find(header_path); return pi >= 0 && i >= 0 && sIncludes.Find(MAKEQWORD(pi, i)) >= 0; }
void *MMapFile::get(__int64 offset, int *sizep) const { if (!sizep) return NULL; assert(!m_pView); int size = *sizep; if (!m_iSize || offset + size > m_iSize) { extern void quit(); extern int g_display_errors; if (g_display_errors) { PrintColorFmtMsg_ERR(_T("\nInternal compiler error #12345: error mmapping file (%I64d, %d) is out of range.\n"), offset, size); } quit(); } // fix offset __int64 alignedoffset = offset - (offset % m_iAllocationGranularity); size += offset - alignedoffset; #ifdef _WIN32 assert(MAKEQWORD(LODWORD(alignedoffset),HIDWORD(alignedoffset)) == alignedoffset); m_pView = MapViewOfFile(m_hFileMap, m_bReadOnly ? FILE_MAP_READ : FILE_MAP_WRITE, HIDWORD(alignedoffset), LODWORD(alignedoffset), size); #else m_pView = mmap(0, size, m_bReadOnly ? PROT_READ : PROT_READ | PROT_WRITE, MAP_SHARED, m_hFileDesc, alignedoffset); m_iMappedSize = *sizep = size; #endif #ifdef _WIN32 if (!m_pView) #else if (m_pView == MAP_FAILED) #endif { extern void quit(); extern int g_display_errors; if (g_display_errors) { PrintColorFmtMsg_ERR(_T("\nInternal compiler error #12345: error mmapping datablock to %d.\n"), size); } quit(); } return (void *)((char *)m_pView + offset - alignedoffset); }
bool Ctrl::IsWaitingEvent() { GuiLock __; if(quit) { WhenDisconnect(); EndSession(); Exit(0); } while(socket.Timeout(0).WaitRead()) { socket.Timeout(20000); String s = websocket.Recieve(); if(s.IsVoid()) { // No data returned -> means EOF was reached WhenDisconnect(); EndSession(); Exit(0); } LLOG("Recieved data " << s); StringStream ss(s); while(!ss.IsEof()) { String s = ss.GetLine(); CParser p(s); try { if(p.Id("S")) { uint32 l = p.ReadNumber(); uint32 h = p.ReadNumber(); recieved_update_serial = MAKEQWORD(l, h); stat_client_ms = p.ReadNumber(); } else event_queue.AddTail(s); } catch(CParser::Error) {} } if(recieved_update_serial == serial_0) { serial_0 = 0; stat_roundtrip_ms = msecs() - serial_time0; serial_time0 = Null; } } socket.Timeout(20000); if(socket.IsError()) LLOG("ERROR: " << socket.GetErrorDesc()); return event_queue.GetCount(); }
void GatherSources(const String& master_path, const String& path_, Vector<int>& parents) { RHITCOUNT("GatherSources"); String path = NormalizeSourcePath(path_); if(sSrcFile.Find(path) >= 0) return; int ii = sSrcFile.GetCount(); for(int i = 0; i < parents.GetCount(); i++) sIncludes.Add(MAKEQWORD(parents[i], ii)); sSrcFile.Add(path, master_path); parents.Add(ii); const PPFile& f = GetPPFile(path); for(int i = 0; i < f.includes.GetCount(); i++) { String p = GetIncludePath(f.includes[i], GetFileFolder(path)); if(p.GetCount()) GatherSources(master_path, p, parents); } parents.Drop(); }
int MMapFile::setfile(int hFile, __int64 dwSize) #endif { clear(); #ifdef _WIN32 m_hFile = hFile; #else m_hFileDesc = hFile; #endif m_bTempHandle = FALSE; #ifdef _WIN32 if (m_hFile == INVALID_HANDLE_VALUE) #else if (m_hFileDesc == -1) #endif return 0; m_iSize = dwSize; if (m_iSize <= 0) return 0; #ifdef _WIN32 assert(MAKEQWORD(LODWORD(m_iSize),HIDWORD(m_iSize)) == m_iSize); m_hFileMap = CreateFileMapping(m_hFile, NULL, PAGE_READONLY, HIDWORD(m_iSize), LODWORD(m_iSize) , NULL); if (!m_hFileMap) return 0; #endif m_bReadOnly = TRUE; return 1; }
DWORD FileDetailsReadMap(const TCHAR* filePath, QWORD& qwSize, FILETIME& fileTime, DWORD& dwCheckSum , HANDLE evAbort) // bool volatile * pisAbort) { _ASSERTE(filePath); _ASSERTE(lstrlen(filePath)); DWORD dwCrc32; DWORD dwErrorCode = NO_ERROR; HANDLE hFile = NULL, hFilemap = NULL; dwCrc32 = 0x0; LPBYTE pCrc = (LPBYTE)&dwCrc32; FILETIME fileTime0; QWORD qwFileSize, qwFileSize0; try { // Open the file hFile = CreateFile(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if(hFile == INVALID_HANDLE_VALUE) throw GetLastErrorEx; QWORD qwFileOffset = 0; DWORD dwByteCount, dwViewSize; LPVOID dwBaseAddress; { DWORD dwLo = 0, dwHi = 0; dwLo = GetFileSize(hFile, &dwHi); if(dwLo == INVALID_FILE_SIZE && (dwErrorCode = GetLastError()) != NO_ERROR) throw ExitEx; qwFileSize = qwFileSize0 = MAKEQWORD(dwHi, dwLo); } if (!GetFileTime(hFile, &fileTime0, NULL, NULL)) throw GetLastErrorEx; // Get the file size //if(!GetFileSizeQW(hFile, qwFileSize)) // dwErrorCode = ERROR_BAD_LENGTH; //else if(0 != qwFileSize) // We cannot CRC zero byte files { // Create the file mapping hFilemap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); if(NULL == hFilemap) throw GetLastErrorEx; LPBYTE pByte; //LPDWORD pDWord; // Loop while we map a section of the file and CRC it while(0 < qwFileSize) { //if (*pisAbort) if (WaitForSingleObject(evAbort, 0) != WAIT_TIMEOUT) { dwErrorCode = ERROR_CANCELLED; throw ExitEx; } if(qwFileSize < MAX_VIEW_SIZE) dwViewSize = LODWORD(qwFileSize); else dwViewSize = MAX_VIEW_SIZE; dwBaseAddress = MapViewOfFile(hFilemap, FILE_MAP_READ, HIDWORD(qwFileOffset), LODWORD(qwFileOffset), dwViewSize); dwByteCount = dwViewSize; pByte = (LPBYTE)dwBaseAddress; BYTE checkSumOffset = 0; while(0 < dwByteCount--) { *(pCrc + checkSumOffset) ^= *pByte; pByte++; checkSumOffset++; if (4 <= checkSumOffset) checkSumOffset = 0; } UnmapViewOfFile((LPVOID)dwBaseAddress); qwFileOffset += dwViewSize; qwFileSize -= dwViewSize; } // while(qwFileSize > 0) } // if(qwFileSize != 0) } catch(char c) { if (GetLastErrorEx == c) dwErrorCode = GetLastError(); } catch(...) { // An unknown exception happened dwErrorCode = ERROR_CRC; } if(hFile != NULL) CloseHandle(hFile); if(hFilemap != NULL) CloseHandle(hFilemap); if (NO_ERROR == dwErrorCode) { qwSize = qwFileSize0; dwCheckSum = dwCrc32; fileTime = fileTime0; } return dwErrorCode; }
DWORD FileDetailsReadStd(const TCHAR* filePath, QWORD& qwSize, FILETIME& fileTime, DWORD& dwCheckSum , HANDLE evAbort) // bool volatile * pisAbort { _ASSERTE(filePath); _ASSERTE(lstrlen(filePath)); DWORD dwErrorCode = NO_ERROR; HANDLE hFile = NULL; DWORD dwCrc32 = 0x0; LPBYTE pCrc = (LPBYTE)&dwCrc32; QWORD qwFileSize; FILETIME fileTime0; try { // Open the file hFile = CreateFile(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_SEQUENTIAL_SCAN //| FILE_FLAG_NO_BUFFERING , NULL); if(hFile == INVALID_HANDLE_VALUE) dwErrorCode = GetLastError(); else { { DWORD dwLo = 0, dwHi = 0; dwLo = GetFileSize(hFile, &dwHi); if(dwLo == INVALID_FILE_SIZE && (dwErrorCode = GetLastError()) != NO_ERROR) throw ExitEx; qwFileSize = MAKEQWORD(dwHi, dwLo); } if (!GetFileTime(hFile, &fileTime0, NULL, NULL)) throw GetLastErrorEx; BYTE buf[MAX_BUFFER_SIZE]; //BYTE buf_max[2 * MAX_BUFFER_SIZE - 1], *buf; // // buf = (BYTE *) ((DWORD) (buf_max + MAX_BUFFER_SIZE - 1) & ~(MAX_BUFFER_SIZE - 1)); DWORD dwBytesRead, dwLoop; while(true) { //if (*pisAbort) if (WaitForSingleObject(evAbort, 0) != WAIT_TIMEOUT) { dwErrorCode = ERROR_CANCELLED; break; } BOOL bSuccess = ReadFile(hFile, buf, MAX_BUFFER_SIZE, &dwBytesRead, NULL); if (!dwBytesRead) break; if (!bSuccess) { dwErrorCode = GetLastError(); break; } BYTE checkSumOffset = 0; for(dwLoop = 0; dwLoop < dwBytesRead; dwLoop++) { *(pCrc + checkSumOffset) ^= buf[dwLoop]; checkSumOffset++; if (4 <= checkSumOffset) checkSumOffset = 0; //CalcCrc32(buffer[dwLoop], dwCrc32); } //bSuccess = ReadFile(hFile, buffer, sizeof(buffer), &dwBytesRead, NULL); } } } catch(...) { // An unknown exception happened dwErrorCode = ERROR_CRC; } if(hFile != NULL) CloseHandle(hFile); if (NO_ERROR == dwErrorCode) { qwSize = qwFileSize; dwCheckSum = dwCrc32; fileTime = fileTime0; } return dwErrorCode; }
BOOL CThumbCache::Load(LPCTSTR pszPath, CImageFile* pImage) { ASSERT( pszPath ); ASSERT( pImage ); // Load file info from disk WIN32_FIND_DATA fd = { 0 }; if ( ! GetFileAttributesEx( pszPath, GetFileExInfoStandard, &fd ) ) { // Deleted (or Ghost) file TRACE( "CThumbCache::Load : Can't load info for %s\n", (LPCSTR)CT2A( pszPath ) ); return FALSE; } // Load file info from database auto_ptr< CDatabase > db( theApp.GetDatabase( DB_THUMBS ) ); if ( ! *db ) { TRACE( "CThumbCache::InitDatabase : Database error: %s\n", (LPCSTR)CT2A( db->GetLastErrorMessage() ) ); return FALSE; } CString strPath( pszPath ); strPath.MakeLower(); if ( ! db->Prepare( _T("SELECT FileSize, LastWriteTime, Image FROM Files WHERE Filename == ?;") ) || ! db->Bind( 1, strPath ) || ! db->Step() || ! ( db->GetCount() == 0 || db->GetCount() == 3 ) ) { TRACE( "CThumbCache::Load : Database error: %s\n", (LPCSTR)CT2A( db->GetLastErrorMessage() ) ); return FALSE; } if ( db->GetCount() == 0 ) { TRACE( "CThumbCache::Load : No thumbnail for %s\n", (LPCSTR)CT2A( pszPath ) ); return FALSE; } QWORD nFileSize = (QWORD)db->GetInt64( _T("FileSize") ); QWORD nLastWriteTime = (QWORD)db->GetInt64( _T("LastWriteTime") ); int data_len; LPCVOID data = db->GetBlob( _T("Image"), &data_len ); if ( ! data ) { TRACE( "CThumbCache::Load : Database error: %s\n", (LPCSTR)CT2A( db->GetLastErrorMessage() ) ); return FALSE; } // Compare it BOOL loaded = FALSE; if ( nFileSize == MAKEQWORD( fd.nFileSizeLow, fd.nFileSizeHigh ) && nLastWriteTime == MAKEQWORD( fd.ftLastWriteTime.dwLowDateTime, fd.ftLastWriteTime.dwHighDateTime ) ) { // Load image loaded = pImage->LoadFromMemory( _T(".jpg"), data, data_len ); } if ( ! loaded ) Delete( pszPath ); // Remove outdated or bad thumbnail return loaded; }
BOOL CThumbCache::Store(LPCTSTR pszPath, CImageFile* pImage) { ASSERT( pszPath ); ASSERT( pImage ); ASSERT( pImage->m_nWidth >= 0 && pImage->m_nHeight >= 0 ); // Load file info from disk WIN32_FIND_DATA fd = { 0 }; if ( ! GetFileAttributesEx( pszPath, GetFileExInfoStandard, &fd ) ) { TRACE( "CThumbCache::Store : Can't load info for %s\n", (LPCSTR)CT2A( pszPath ) ); return FALSE; } auto_ptr< CDatabase > db( theApp.GetDatabase( DB_THUMBS ) ); if ( ! *db ) { TRACE( "CThumbCache::InitDatabase : Database error: %s\n", (LPCSTR)CT2A( db->GetLastErrorMessage() ) ); return FALSE; } CString strPath( pszPath ); strPath.MakeLower(); // Save to memory as JPEG image BYTE* buf = NULL; DWORD data_len = 0; if ( ! pImage->SaveToMemory( _T(".jpg"), Settings.Library.ThumbQuality, &buf, &data_len ) ) // ~75% JPEG { TRACE( "CThumbCache::Store : Can't save thumbnail to JPEG for %s\n", (LPCSTR)CT2A( pszPath ) ); return FALSE; } auto_array< BYTE > data( buf ); // Remove old image if ( ! db->Prepare( _T("DELETE FROM Files WHERE Filename == ?;") ) || ! db->Bind( 1, strPath ) ) { TRACE( "CThumbCache::Store : Database error: %s\n", (LPCSTR)CT2A( db->GetLastErrorMessage() ) ); return FALSE; } db->Step(); // Store new one if ( ! db->Prepare( _T("INSERT INTO Files ( Filename, FileSize, LastWriteTime, Image ) VALUES ( ?, ?, ?, ? );") ) || ! db->Bind( 1, strPath ) || ! db->Bind( 2, (__int64)MAKEQWORD( fd.nFileSizeLow, fd.nFileSizeHigh ) ) || ! db->Bind( 3, (__int64)MAKEQWORD( fd.ftLastWriteTime.dwLowDateTime, fd.ftLastWriteTime.dwHighDateTime ) ) || ! db->Bind( 4, data.get(), data_len ) || ! db->Step() ) { TRACE( "CThumbCache::Store : Database error: %s\n", (LPCSTR)CT2A( db->GetLastErrorMessage() ) ); return FALSE; } TRACE( "CThumbCache::Store : Thumbnail saved for %s\n", (LPCSTR)CT2A( pszPath ) ); CSingleLock oLock( &Library.m_pSection, FALSE ); if ( ! oLock.Lock( 300 ) ) return TRUE; if ( CLibraryFile* pFile = LibraryMaps.LookupFileByPath( pszPath ) ) { ASSERT( pFile->GetPath().MakeLower() == strPath ); pFile->m_bCachedPreview = TRUE; Library.Update(); } return TRUE; }