void LogViewWindow::deleteCurrent() { LogListViewItem * pItem = (LogListViewItem *)(m_pListView->currentItem()); if(!pItem) return; if(!pItem->childCount()) { if(!pItem->fileName().isNull()) { if(QMessageBox::question( this, __tr2qs_ctx("Confirm Current User Log Deletion","log"), __tr2qs_ctx("Do you really wish to delete this log?","log"), __tr2qs("Yes"),__tr2qs("No"),0,1) != 0) return; KviFileUtils::removeFile(pItem->fileName()); delete pItem; m_pIrcView->clearBuffer(); if(!pItem->parent()->childCount()) delete pItem->parent(); } return; } if(QMessageBox::question( this, __tr2qs_ctx("Confirm Current User Logs Deletion","log"), __tr2qs_ctx("Do you really wish to delete all these logs?","log"), __tr2qs("Yes"),__tr2qs("No"),0,1) != 0) return; KviPointerList<LogListViewItem> itemsList; itemsList.setAutoDelete(false); for(int i=0; i < pItem->childCount(); i++) { if(!pItem->child(i)->childCount()) { itemsList.append((LogListViewItem *)pItem->child(i)); continue; } LogListViewItem * pChild = (LogListViewItem *)pItem->child(i); for(int j=0; j < pChild->childCount(); j++) { if(!(LogListViewItem *)pChild->child(j)) { qDebug("Null pointer in logviewitem"); continue; } itemsList.append((LogListViewItem *)pChild->child(j)); } } for(unsigned int u=0; u < itemsList.count(); u++) { LogListViewItem * pCurItem = itemsList.at(u); if(!pCurItem->fileName().isNull()) KviFileUtils::removeFile(pCurItem->fileName()); } delete pItem; }
void LogViewWindow::exportLog(int iId) { LogListViewItem * pItem = (LogListViewItem *)(m_pListView->currentItem()); if(!pItem) return; if(!pItem->childCount()) { // Export the log createLog(pItem->log(), iId); return; } // We selected a node in the log list, scan the children KviPointerList<LogListViewItem> logList; logList.setAutoDelete(false); for(int i = 0; i < pItem->childCount(); i++) { if(!pItem->child(i)->childCount()) { // The child is a log file, append it to the list logList.append((LogListViewItem *)pItem->child(i)); continue; } // The child is a node, scan it LogListViewItem * pChild = (LogListViewItem *)pItem->child(i); for(int j=0; j < pChild->childCount(); j++) { if(!(LogListViewItem *)pChild->child(j)) { qDebug("Null pointer in logviewitem"); continue; } // Add the child to the list logList.append((LogListViewItem *)pChild->child(j)); } } // Scan the list for(unsigned int u = 0; u < logList.count(); u++) { LogListViewItem * pCurItem = logList.at(u); createLog(pCurItem->log(), iId); } }
bool packageThemes( const QString &szPackagePath, const QString &szPackageName, const QString &szPackageVersion, const QString &szPackageDescription, const QString &szPackageAuthor, const QString &szPackageImagePath, KviPointerList<KviThemeInfo> &lThemeInfoList, QString &szError ) { if(szPackagePath.isEmpty()) { szError = __tr2qs_ctx("Invalid empty package path","theme"); return false; } if(szPackageName.isEmpty()) { szError = __tr2qs_ctx("Invalid empty package name","theme"); return false; } QPixmap out; if(!szPackageImagePath.isEmpty()) { QImage pix(szPackageImagePath); if(pix.isNull()) { szError = __tr2qs_ctx("Failed to load the selected image: please fix it","theme"); return false; } if((pix.width() > 300) || (pix.height() > 225)) out = out.fromImage(pix.scaled(300,225,Qt::KeepAspectRatio)); else out=out.fromImage(pix); } KviPackageWriter f; f.addInfoField("PackageType","ThemePack"); f.addInfoField("ThemePackVersion",KVI_CURRENT_THEME_ENGINE_VERSION); f.addInfoField("Name",szPackageName); f.addInfoField("Version",szPackageVersion.isEmpty() ? "1.0.0" : szPackageVersion); f.addInfoField("Author",szPackageAuthor); f.addInfoField("Description",szPackageDescription); // this is the equivalent to an empty date.toString() call, but it's needed // to ensure qt4 will use the default() locale and not the system() one f.addInfoField("Date",QDateTime::currentDateTime().toString(Qt::ISODate)); f.addInfoField("Application","KVIrc " KVI_VERSION "." KVI_SOURCES_DATE); if(!out.isNull()) { QByteArray * pba = new QByteArray(); QBuffer buffer(pba,0); buffer.open(QIODevice::WriteOnly); out.save(&buffer,"PNG"); buffer.close(); f.addInfoField("Image",pba); // cool :) [no disk access needed] } QString szTmp; szTmp.setNum(lThemeInfoList.count()); f.addInfoField("ThemeCount",szTmp); int iIdx = 0; for(KviThemeInfo * pInfo = lThemeInfoList.first();pInfo;pInfo = lThemeInfoList.next()) { if(pInfo->name().isEmpty()) { szError = __tr2qs_ctx("Invalid theme name","theme"); return false; } if(pInfo->version().isEmpty()) { szError = __tr2qs_ctx("Invalid theme version","theme"); return false; } QString szSubdir = pInfo->name() + QString("-") + pInfo->version(); szSubdir.replace(QRegExp("[^a-zA-Z0-9_\\-.][^a-zA-Z0-9_\\-.]*"),"_"); szTmp = QString("Theme%1Name").arg(iIdx); f.addInfoField(szTmp,pInfo->name()); szTmp = QString("Theme%1Version").arg(iIdx); f.addInfoField(szTmp,pInfo->version()); szTmp = QString("Theme%1Description").arg(iIdx); f.addInfoField(szTmp,pInfo->description()); szTmp = QString("Theme%1Date").arg(iIdx); f.addInfoField(szTmp,pInfo->date()); szTmp = QString("Theme%1Subdirectory").arg(iIdx); f.addInfoField(szTmp,szSubdir); szTmp = QString("Theme%1Author").arg(iIdx); f.addInfoField(szTmp,pInfo->author()); szTmp = QString("Theme%1Application").arg(iIdx); f.addInfoField(szTmp,pInfo->application()); szTmp = QString("Theme%1ThemeEngineVersion").arg(iIdx); f.addInfoField(szTmp,pInfo->themeEngineVersion()); QPixmap pixScreenshot = pInfo->smallScreenshot(); if(!pixScreenshot.isNull()) { szTmp = QString("Theme%1Screenshot").arg(iIdx); QByteArray * pba = new QByteArray(); QBuffer bufferz(pba,0); bufferz.open(QIODevice::WriteOnly); pixScreenshot.save(&bufferz,"PNG"); bufferz.close(); f.addInfoField(szTmp,pba); } if(!f.addDirectory(pInfo->directory(),szSubdir)) { szError = __tr2qs_ctx("Packaging failed","theme"); szError += ": "; szError += f.lastError(); return false; } iIdx++; } if(!f.pack(szPackagePath)) { szError = __tr2qs_ctx("Packaging failed","theme"); szError += ": "; szError += f.lastError(); return false; } return true; }
void KviAvatarCache::cleanup() { // first do a quick run deleting the avatars really too old KviPointerHashTableIterator<QString,KviAvatarCacheEntry> it(*m_pAvatarDict); kvi_time_t tNow = kvi_unixTime(); KviPointerList<QString> l; l.setAutoDelete(false); KviAvatarCacheEntry * e; while((e = it.current())) { if((tNow - e->tLastAccess) > MAX_UNACCESSED_TIME) { l.append(new QString(it.currentKey())); } ++it; } for(QString *s = l.first();s;s = l.next())m_pAvatarDict->remove(*s); if(m_pAvatarDict->count() < CACHE_GUARD_LEVEL)return; // not done.. need to kill the last accessed :/ it.toFirst(); KviPointerList<KviAvatarCacheEntry> ll; ll.setAutoDelete(true); // here we use the cache entries in another way // szAvatar is the KEY instead of the avatar name while((e = it.current())) { KviAvatarCacheEntry * current = ll.first(); unsigned int idx = 0; while(current) { // if the current is newer than the inserted one // then stop searching and insert it just before if(current->tLastAccess > e->tLastAccess)break; // otherwise the current is older and the inserted // one goes after current = ll.next(); idx++; } KviAvatarCacheEntry * xx = new KviAvatarCacheEntry; xx->szIdString = it.currentKey(); xx->tLastAccess = e->tLastAccess; if(current)ll.insert(idx,xx); else ll.append(xx); ++it; } // the oldest keys are at the beginning int uRemove = ll.count() - CACHE_GUARD_LEVEL; if(uRemove < 1)return; // huh ? // remember that szAvatar contains the key! for(e = ll.first();e && (uRemove > 0);e = ll.next()) { m_pAvatarDict->remove(e->szIdString); uRemove--; } // now we should be ok }