/* * menueditComponent.cpp * * Copyright (C) 2004 Waldo Bastian * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "menueditComponent.h" #include #include #include #include #include #include #include #include #include #include #include #include "kioskrun.h" #include "kiosksync.h" MenuEditComponent::MenuEditComponent( TQObject *parent) : Component(parent) { } MenuEditComponent::~MenuEditComponent() { } void MenuEditComponent::slotSetupPrepare() { (void) KioskRun::self()->locateLocal("xdgconf-menu", "applications-kmenuedit.menu"); // Create dir } void MenuEditComponent::slotSetupStarted() { } static TQDomDocument loadDoc(const TQString &fileName) { TQDomDocument doc; TQFile file( fileName ); if ( !file.open( IO_ReadOnly ) ) { kdWarning() << "Could not open " << fileName << endl; return doc; } TQString errorMsg; int errorRow; int errorCol; if ( !doc.setContent( &file, &errorMsg, &errorRow, &errorCol ) ) { kdWarning() << "Parse error in " << fileName << ", line " << errorRow << ", col " << errorCol << ": " << errorMsg << endl; file.close(); return doc; } file.close(); return doc; } static bool saveDoc(const TQString &fileName, TQDomDocument doc) { KSaveFile saveFile(fileName); TQTextStream *stream = saveFile.textStream(); if (!stream) { kdWarning() << "Could not write " << fileName << endl; return false; } (*stream) << doc.toString(); if (!saveFile.close()) { kdWarning() << "Could not write " << fileName << endl; return false; } return true; } bool MenuEditComponent::setupFinished() { bool result; TQString menuEditFile = KioskRun::self()->locateLocal("xdgconf-menu", "applications-kmenuedit.menu"); TQString menuFile = KioskRun::self()->locate("xdgconf-menu", "applications.menu"); TQString menuFileSave = KioskRun::self()->locateSave("xdgconf-menu", "applications.menu"); kdDebug() << "MenuEditComponent: menuEditFile = " << menuEditFile << endl; kdDebug() << "MenuEditComponent: menuFile = " << menuFile << endl; kdDebug() << "MenuEditComponent: menuFileSave = " << menuFileSave << endl; TQDomDocument docChanges = loadDoc(menuEditFile); if (docChanges.isNull()) { kdDebug() << "No menu changes." << endl; return true; } TQDomDocument doc = loadDoc(menuFile); if (doc.isNull()) { kdWarning() << "Can't find menu file!" << endl; return true; } TQDomElement docElem = doc.documentElement(); TQDomNode n = docElem.firstChild(); TQDomNode next; for(; !n.isNull(); n = next ) { TQDomElement e = n.toElement(); // try to convert the node to an element. next = n.nextSibling(); if ((e.tagName() == "MergeFile") && (e.text() == "applications-kmenuedit.menu")) break; } TQDomNode insertionPoint = n; if (insertionPoint.isNull()) { kdWarning() << "Application menu fails to include applications-kmenuedit.menu" << endl; return false; } TQDomElement docChangesElem = docChanges.documentElement(); n = docChangesElem.firstChild(); for(; !n.isNull(); n = next ) { TQDomElement e = n.toElement(); // try to convert the node to an element. next = n.nextSibling(); docElem.insertBefore(n, insertionPoint); } KTempFile tempFile; tempFile.close(); saveDoc(tempFile.name(), doc); result = KioskRun::self()->install(tempFile.name(), menuFileSave); if (!result) return false; // Install .desktop files { TQString legacyApplications = KioskRun::self()->locateLocal("apps", TQString()); TQString legacySaveApplications = KioskRun::self()->locateSave("apps", TQString()); KioskSync legacyDir(kapp->mainWidget()); legacyDir.addDir(legacyApplications, KURL()); TQStringList newLegacyApplications = legacyDir.listFiles(); for(TQStringList::ConstIterator it = newLegacyApplications.begin(); it != newLegacyApplications.end(); ++it) { if ((*it).endsWith(".desktop") || (*it).endsWith(".kdelnk") || (*it).endsWith(".directory")) { kdDebug() << "MenueditComponent: New legacy file %s" << (legacyApplications+(*it)) << endl; result = KioskRun::self()->install(legacyApplications+(*it), legacySaveApplications+(*it)); if (!result) return false; } } } // Install .desktop files { TQString xdgApplications = KioskRun::self()->locateLocal("xdgdata-apps", TQString()); TQString xdgSaveApplications = KioskRun::self()->locateSave("xdgdata-apps", TQString()); TQDir dir(xdgApplications); TQStringList newXdgApplications = dir.entryList(TQDir::All, TQDir::Unsorted); newXdgApplications.remove("."); newXdgApplications.remove(".."); for(TQStringList::ConstIterator it = newXdgApplications.begin(); it != newXdgApplications.end(); ++it) { if ((*it).endsWith(".desktop") || (*it).endsWith(".kdelnk")) { kdDebug() << "MenueditComponent: New .desktop file %s" << (xdgApplications+(*it)) << endl; result = KioskRun::self()->install(xdgApplications+(*it), xdgSaveApplications+(*it)); if (!result) return false; } } } // Install .directory files { TQString xdgDirectories = KioskRun::self()->locateLocal("xdgdata-dirs", TQString()); TQString xdgSaveDirectories = KioskRun::self()->locateSave("xdgdata-dirs", TQString()); TQDir dir(xdgDirectories); TQStringList newXdgDirectories = dir.entryList(TQDir::All, TQDir::Unsorted); newXdgDirectories.remove("."); newXdgDirectories.remove(".."); for(TQStringList::ConstIterator it = newXdgDirectories.begin(); it != newXdgDirectories.end(); ++it) { if ((*it).endsWith(".directory")) { kdDebug() << "MenueditComponent: New .directory file %s" << (xdgDirectories+(*it)) << endl; result = KioskRun::self()->install(xdgDirectories+(*it), xdgSaveDirectories+(*it)); if (!result) return false; } } } KioskRun::self()->forceSycocaUpdate(); return true; } void MenuEditComponent::slotPreviewStarted() { KioskRun::self()->dcopRef("kicker", "kicker").call("showKMenu"); } #include "menueditComponent.moc"