21 #include "kbookmarkimporter_crash.h" 23 #include <kfiledialog.h> 24 #include <kstringhandler.h> 27 #include <kapplication.h> 28 #include <kstandarddirs.h> 32 #include <tqtextcodec.h> 33 #include <dcopclient.h> 35 #include <sys/types.h> 40 typedef TQMap<TQString, TQString> ViewMap;
43 void KCrashBookmarkImporter::parseCrashLog( TQString ,
bool )
48 ViewMap KCrashBookmarkImporterImpl::parseCrashLog_noemit(
const TQString & filename,
bool del )
50 static const int g_lineLimit = 16*1024;
55 if ( !f.open( IO_ReadOnly ) )
58 TQCString s( g_lineLimit );
60 TQTextCodec * codec = TQTextCodec::codecForName(
"UTF-8" );
65 while ( f.readLine( s.data(), g_lineLimit ) >=0 )
67 if ( s[s.length()-1] !=
'\n' )
69 kdWarning() <<
"Crash bookmarks contain a line longer than " << g_lineLimit <<
". Skipping." << endl;
72 TQString t = codec->toUnicode( s.stripWhiteSpace() );
73 TQRegExp rx(
"(.*)\\((.*)\\):(.*)$" );
74 rx.setMinimal(
true );
75 if ( !rx.exactMatch( t ) )
77 if ( rx.cap(1) ==
"opened" )
78 views[rx.cap(2)] = rx.cap(3);
79 else if ( rx.cap(1) ==
"close" )
80 views.remove( rx.cap(2) );
91 TQStringList KCrashBookmarkImporter::getCrashLogs()
93 return KCrashBookmarkImporterImpl::getCrashLogs();
96 TQStringList KCrashBookmarkImporterImpl::getCrashLogs()
98 TQMap<TQString, bool> activeLogs;
100 DCOPClient* dcop = kapp->dcopClient();
102 QCStringList apps = dcop->registeredApplications();
103 for ( QCStringList::Iterator it = apps.begin(); it != apps.end(); ++it )
105 TQCString &clientId = *it;
107 if ( tqstrncmp(clientId,
"konqueror", 9) != 0 )
110 TQByteArray data, replyData;
112 TQDataStream arg( data, IO_WriteOnly );
114 if ( !dcop->call( clientId.data(),
"KonquerorIface",
115 "crashLogFile()", data, replyType, replyData) )
117 kdWarning() <<
"can't find dcop function KonquerorIface::crashLogFile()" << endl;
121 if ( replyType !=
"TQString" )
124 TQDataStream reply( replyData, IO_ReadOnly );
127 activeLogs[ret] =
true;
131 d.setSorting( TQDir::Time );
132 d.setFilter( TQDir::Files );
133 d.setNameFilter(
"konqueror-crash-*.log" );
135 const TQFileInfoList *list = d.entryInfoList();
136 TQFileInfoListIterator it( *list );
139 TQStringList crashFiles;
142 for ( ; (( fi = it.current() ) != 0) && (count < 20); ++it, ++count )
144 bool stillAlive = activeLogs.contains( fi->absFilePath() );
146 crashFiles << fi->absFilePath();
149 for ( ; ( fi = it.current() ) != 0; ++it )
151 TQFile::remove( fi->absFilePath() );
157 void KCrashBookmarkImporterImpl::parse()
159 TQDict<bool> signatureMap;
160 TQStringList crashFiles = KCrashBookmarkImporterImpl::getCrashLogs();
162 for ( TQStringList::Iterator it = crashFiles.begin(); it != crashFiles.end(); ++it )
165 views = parseCrashLog_noemit( *it, m_shouldDelete );
167 for ( ViewMap::Iterator vit = views.begin(); vit != views.end(); ++vit )
168 signature +=
"|"+vit.data();
169 if (signatureMap[signature])
176 signatureMap.insert(signature, (
bool *)
true);
178 int outerFolder = ( crashFiles.count() > 1 ) && (views.count() > 0);
180 emit newFolder( TQString(
"Konqueror Window %1").arg(count++),
false,
"" );
181 for ( ViewMap::Iterator vit = views.begin(); vit != views.end(); ++vit )
182 emit newBookmark( vit.data(), vit.data().latin1(), TQString(
"") );
188 TQString KCrashBookmarkImporter::crashBookmarksDir()
193 return p->findDefaultLocation();
196 void KCrashBookmarkImporterImpl::setShouldDelete(
bool shouldDelete )
198 m_shouldDelete = shouldDelete;
201 void KCrashBookmarkImporter::parseCrashBookmarks(
bool del )
204 importer.setFilename( m_fileName );
205 importer.setShouldDelete( del );
206 importer.setupSignalForwards( &importer,
this );
210 TQString KCrashBookmarkImporterImpl::findDefaultLocation(
bool )
const 212 return locateLocal(
"tmp",
"" );
215 #include "kbookmarkimporter_crash.moc" A class for importing all crash sessions as bookmarks.