summaryrefslogtreecommitdiff
authoralwin <alwin>2005-03-07 13:03:38 (UTC)
committer alwin <alwin>2005-03-07 13:03:38 (UTC)
commitc26df8eafe66bded4a4af4f95830fd2187bfa2ca (patch) (side-by-side diff)
tree561f0da611b70fe5c415bf636307289b9507e6e6
parent4515ff72db76ba63dcf3b29b19d930b7e083d508 (diff)
downloadopie-c26df8eafe66bded4a4af4f95830fd2187bfa2ca.zip
opie-c26df8eafe66bded4a4af4f95830fd2187bfa2ca.tar.gz
opie-c26df8eafe66bded4a4af4f95830fd2187bfa2ca.tar.bz2
fixed a very interesting crasher.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/launcher/documentlist.cpp4
1 files changed, 2 insertions, 2 deletions
diff --git a/core/launcher/documentlist.cpp b/core/launcher/documentlist.cpp
index d2b9afa..b8bf4e0 100644
--- a/core/launcher/documentlist.cpp
+++ b/core/launcher/documentlist.cpp
@@ -297,209 +297,209 @@ void DocumentList::linkChanged( QString arg )
const QList<DocLnk> &list = d->dls.children();
QListIterator<DocLnk> it( list );
while ( it.current() ) {
DocLnk *doc = it.current();
++it;
if ( ( doc->linkFileKnown() && doc->linkFile() == arg )
|| ( doc->fileKnown() && doc->file() == arg ) ) {
//odebug << "found old link" << oendl;
DocLnk* dl = new DocLnk( arg );
// add new one if it exists and matches the mimetype
if ( d->store( dl ) ) {
// Existing link has been changed, send old link ref and a ref
// to the new link
//odebug << "change case" << oendl;
if ( d->serverGui )
d->serverGui->documentChanged( *doc, *dl );
} else {
// Link has been removed or doesn't match the mimetypes any more
// so we aren't interested in it, so take it away from the list
//odebug << "removal case" << oendl;
if ( d->serverGui )
d->serverGui->documentRemoved( *doc );
}
d->dls.remove( doc ); // remove old link from docLnkSet
delete doc;
return;
}
}
// Didn't find existing link, must be new
DocLnk* dl = new DocLnk( arg );
if ( d->store( dl ) ) {
// Add if it's a link we are interested in
//odebug << "add case" << oendl;
add( *dl );
}
}
}
void DocumentList::restoreDone()
{
reloadAppLnks();
reloadDocLnks();
}
void DocumentList::DiffAppLnks()
{
static AppLnkSet *appLnkSet2;
appLnkSet2 = new AppLnkSet( MimeType::appsFolderName() );
if ( d->sendAppLnks && d->serverGui ) {
static QStringList prevTypeList = appLnkSet->types();
QStringList types = appLnkSet2->types();
for ( QStringList::Iterator ittypes=types.begin(); ittypes!=types.end(); ++ittypes) {
if ( !(*ittypes).isEmpty() ) {
if ( !prevTypeList.contains(*ittypes) ) {
QString name = appLnkSet2->typeName(*ittypes);
QPixmap pm = appLnkSet2->typePixmap(*ittypes);
QPixmap bgPm = appLnkSet2->typeBigPixmap(*ittypes);
if (pm.isNull()) {
QImage img( Resource::loadImage( "UnknownDocument" ) );
pm = img.smoothScale( AppLnk::smallIconSize(), AppLnk::smallIconSize() );
bgPm = img.smoothScale( AppLnk::bigIconSize(), AppLnk::bigIconSize() );
}
odebug << "adding type " << (*ittypes) << "" << oendl;
// ### our current launcher expects docs tab to be last
d->serverGui->typeAdded( *ittypes, name.isNull() ? (*ittypes) : name, pm, bgPm );
}
prevTypeList.remove(*ittypes);
}
}
for ( QStringList::Iterator ittypes=prevTypeList.begin(); ittypes!=prevTypeList.end(); ++ittypes) {
odebug << "removing type " << (*ittypes) << "" << oendl;
d->serverGui->typeRemoved(*ittypes);
}
prevTypeList = types;
}
QListIterator<AppLnk> it1( appLnkSet->children() );
QListIterator<AppLnk> it2( appLnkSet2->children() );
AppLnk *i;
AppLnk *j;
bool found;
while ( (j=it2.current()) ) {
it1 = appLnkSet->children();
found = false;
while ( (i=it1.current()) ){
- if (strcmp(i->name().ascii(),j->name().ascii()) == 0)
+ if (j->name().ascii() && i->name().ascii() && strcmp(i->name().ascii(),j->name().ascii()) == 0)
found = true;
++it1;
}
if (!found) {
odebug << "Item " << j->name().ascii() << " needs to be added" << oendl;
d->serverGui->applicationAdded( j->type(), *j );
}
++it2;
}
it1 = appLnkSet->children();
while ( (i=it1.current()) ) {
it2 = appLnkSet2->children();
found = false;
while ( (j=it2.current()) ){
- if (strcmp(i->name().ascii(),j->name().ascii()) == 0)
+ if (j->name().ascii() && i->name().ascii() && strcmp(i->name().ascii(),j->name().ascii()) == 0)
found = true;
++it2;
}
if (!found) {
odebug << "Item " << i->name().ascii() << " needs to be removed" << oendl;
d->serverGui->applicationRemoved( i->type(), *i );
}
++it1;
}
delete appLnkSet;
appLnkSet = appLnkSet2;
}
void DocumentList::storageChanged()
{
QTime t;
// ### can implement better
t.start();
DiffAppLnks();
// reloadAppLnks();
odebug << "Reload App links took " << t.elapsed() << " ms" << oendl;
reloadDocLnks();
// odebug << "Reload links took " << t.elapsed() << " ms " << oendl;
odebug << "Reload All links took " << t.elapsed() << " ms" << oendl;
// ### Optimization opportunity
// Could be a bit more intelligent and somehow work out which
// mtab entry has changed and then only scan that and add and remove
// links appropriately.
// rescan();
}
void DocumentList::sendAllDocLinks()
{
if ( d->tid != 0 ) {
// We are in the middle of scanning, set a flag so
// we do this when we finish our scanning
d->needToSendAllDocLinks = true;
return;
}
QString contents;
Categories cats;
for ( QListIterator<DocLnk> it( d->dls.children() ); it.current(); ++it ) {
DocLnk *doc = it.current();
QFileInfo fi( doc->file() );
if ( !fi.exists() )
continue;
bool fake = !doc->linkFileKnown();
if ( !fake ) {
QFile f( doc->linkFile() );
if ( f.open( IO_ReadOnly ) ) {
QTextStream ts( &f );
ts.setEncoding( QTextStream::UnicodeUTF8 );
QString docLnk = ts.read();
// Strip out the (stale) LinkFile entry
int start = docLnk.find( "\nLinkFile = " ) + 1;
if ( start > 0 ) {
int end = docLnk.find( "\n", start + 1 ) + 1;
contents += docLnk.left(start);
contents += docLnk.mid(end);
} else {
contents += docLnk;
}
contents += "LinkFile = " + doc->linkFile() + "\n";
f.close();
} else
fake = TRUE;
}
if (fake) {
contents += "[Desktop Entry]\n"; // No tr
contents += "Categories = " + // No tr
cats.labels("Document View",doc->categories()).join(";") + "\n"; // No tr
contents += "Name = "+doc->name()+"\n"; // No tr
contents += "Type = "+doc->type()+"\n"; // No tr
}
contents += "File = "+doc->file()+"\n"; // No tr // (resolves path)
contents += QString("Size = %1\n").arg( fi.size() ); // No tr
}
//odebug << "sending length " << contents.length() << "" << oendl;
#ifndef QT_NO_COP
QCopEnvelope e( "QPE/Desktop", "docLinks(QString)" );
e << contents;
#endif
//odebug << "================ \n\n" << contents << "\n\n===============" << oendl;
d->needToSendAllDocLinks = false;
}