/* static */ void wxPaintDCImpl::EndPaint(wxWindow *win) { wxPaintDCInfo *info = FindInCache(win); if ( info ) { gs_PaintDCInfos.erase(win); delete info; } }
QDateTime AssetCache::LastModified(const QString &assetRef) { QString absolutePath = FindInCache(assetRef); if (absolutePath.isEmpty()) return QDateTime(); #ifdef Q_WS_WIN HANDLE fileHandle = (HANDLE)OpenFileHandle(absolutePath); if (fileHandle == INVALID_HANDLE_VALUE) { LogError("AssetCache: Failed to open cache file to read last modified time: " + assetRef); return QDateTime(); } // Get last write time. FILETIME fileTime; BOOL success = GetFileTime(fileHandle, 0, 0, &fileTime); // http://msdn.microsoft.com/en-us/library/windows/desktop/ms724320(v=VS.85).aspx CloseHandle(fileHandle); if (!success) { LogError("AssetCache: Failed to read cache file last modified time: " + assetRef); return QDateTime(); } // Convert to UTC. SYSTEMTIME sysTime; if (!FileTimeToSystemTime(&fileTime, &sysTime)) // http://msdn.microsoft.com/en-us/library/windows/desktop/ms724280(v=VS.85).aspx { LogError("Win32 FileTimeToSystemTime failed for asset ref " + assetRef); return QDateTime(); } // Ignore msec QDateTime dateTime; dateTime.setTimeSpec(Qt::UTC); dateTime.setDate(QDate((int)sysTime.wYear, (int)sysTime.wMonth, (int)sysTime.wDay)); dateTime.setTime(QTime((int)sysTime.wHour, (int)sysTime.wMinute, (int)sysTime.wSecond, 0)); return dateTime; #else QDateTime dateTime; QString nativePath = QDir::toNativeSeparators(absolutePath); struct stat fileStats; if (stat(nativePath.toStdString().c_str(), &fileStats) == 0) { qint64 msecFromEpoch = (qint64)fileStats.st_mtime * 1000; dateTime.setMSecsSinceEpoch(msecFromEpoch); } else LogError("AssetCache: Failed to read cache file last modified time: " + assetRef); return dateTime; #endif }
/* static */ WXHDC wxPaintDCImpl::FindDCInCache(wxWindow* win) { wxPaintDCInfo* const info = FindInCache(win); return info ? info->GetHDC() : 0; }
wxIcon wxIconManager::GetIcon(const String &iconNameOrig) { String iconName = iconNameOrig; strutil_tolower(iconName); wxLogTrace(wxTraceIconLoading, _T("wxIconManager::GetIcon(%s) called..."), iconNameOrig.c_str()); wxIcon icon; // first always look in the cache if ( FindInCache(iconName, &icon) ) return icon; // next step: try to load the icon files .png,.xpm,.gif: if(m_GlobalDir.Length()) { PathFinder pf(READ_APPCONFIG(MP_ICONPATH)); #ifdef M_TOP_SOURCEDIR // look in the source directory to make it possible to use the program // without installing it pf.AddPaths(String(M_TOP_SOURCEDIR) + _T("/src/icons")); pf.AddPaths(String(M_TOP_SOURCEDIR) + _T("/res")); #endif // M_TOP_SOURCEDIR pf.AddPaths(m_GlobalDir, false); if(ms_IconPath.Length() > 0) pf.AddPaths(ms_IconPath,false, true /*prepend */); pf.AddPaths(m_LocalDir, false); if(m_SubDir.Length() > 1) // 1 == "/" == empty { pf.AddPaths(m_GlobalDir+m_SubDir, false, true); pf.AddPaths(m_LocalDir+m_SubDir, false, true); } String name; for ( int ext = 0; wxIconManagerFileExtensions[ext]; ext++ ) { // use iconNameOrig here to preserve the original case name = pf.FindFile(iconNameOrig + wxIconManagerFileExtensions[ext]); // but if it's not found, also fall back to the usual lower case if ( name.empty() ) { name = pf.FindFile(iconName + wxIconManagerFileExtensions[ext]); } if ( !name.empty() ) { ms_IconPath = name.BeforeLast('/'); if ( !icon.LoadFile(name, wxBITMAP_TYPE_ANY) ) { // try to load it via conversion to XPM char **ptr = LoadImageXpm(name); if(ptr) { icon = wxIcon(ptr); FreeImage(ptr); } } if ( icon.Ok() ) { IconData id; id.iconRef = icon; id.iconName = iconName; wxLogTrace(wxTraceIconLoading, _T("... icon found in '%s'"), name.c_str()); m_iconList.push_front(id); return icon; } } } // for all extensions } // if globaldir is not empty #ifdef OS_WIN // last, look in the resources { icon = wxIcon(iconNameOrig); if ( icon.Ok() ) { wxLogTrace(wxTraceIconLoading, _T("... icon found in the ressources.")); return icon; } // ok, it failed - now do all the usual stuff } #endif //Windows wxLogTrace(wxTraceIconLoading, _T("... icon not found.")); return m_unknownIcon; }
bool AssetCache::SetLastModified(const QString &assetRef, const QDateTime &dateTime) { if (!dateTime.isValid()) { LogError("AssetCache::SetLastModified() DateTime is invalid: " + assetRef); return false; } QString absolutePath = FindInCache(assetRef); if (absolutePath.isEmpty()) return false; QDate date = dateTime.date(); QTime time = dateTime.time(); #ifdef Q_WS_WIN HANDLE fileHandle = (HANDLE)OpenFileHandle(absolutePath); if (fileHandle == INVALID_HANDLE_VALUE) { LogError("AssetCache: Failed to open cache file to update last modified time: " + assetRef); return false; } // Notes: For SYSTEMTIME Sunday is 0 and ignore msec. SYSTEMTIME sysTime; sysTime.wDay = (WORD)date.day(); sysTime.wDayOfWeek = (WORD)date.dayOfWeek(); if (sysTime.wDayOfWeek == 7) sysTime.wDayOfWeek = 0; sysTime.wMonth = (WORD)date.month(); sysTime.wYear = (WORD)date.year(); sysTime.wHour = (WORD)time.hour(); sysTime.wMinute = (WORD)time.minute(); sysTime.wSecond = (WORD)time.second(); sysTime.wMilliseconds = 0; // Set last write time FILETIME fileTime; BOOL success = SystemTimeToFileTime(&sysTime, &fileTime); if (success) success = SetFileTime(fileHandle, 0, 0, &fileTime); CloseHandle(fileHandle); if (!success) { LogError("AssetCache: Failed to update cache file last modified time: " + assetRef); return false; } return true; #else QString nativePath = QDir::toNativeSeparators(absolutePath); utimbuf modTime; modTime.actime = (time_t)(dateTime.toMSecsSinceEpoch() / 1000); modTime.modtime = (time_t)(dateTime.toMSecsSinceEpoch() / 1000); if (utime(nativePath.toStdString().c_str(), &modTime) == -1) { LogError("AssetCache: Failed to read cache file last modified time: " + assetRef); return false; } else return true; #endif }