From cb7eddb91455a69cf66fcd717e91a51ca5e2cfef Mon Sep 17 00:00:00 2001 From: tpearson Date: Wed, 16 Feb 2011 20:17:18 +0000 Subject: Moved kpilot from kdepim to applications, as the core Trinity libraries should not contain hardware-dependent software git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kpilot@1221127 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- conduits/sysinfoconduit/sysinfo-conduit.cc | 611 +++++++++++++++++++++++++++++ 1 file changed, 611 insertions(+) create mode 100644 conduits/sysinfoconduit/sysinfo-conduit.cc (limited to 'conduits/sysinfoconduit/sysinfo-conduit.cc') diff --git a/conduits/sysinfoconduit/sysinfo-conduit.cc b/conduits/sysinfoconduit/sysinfo-conduit.cc new file mode 100644 index 0000000..64c53bc --- /dev/null +++ b/conduits/sysinfoconduit/sysinfo-conduit.cc @@ -0,0 +1,611 @@ +/* KPilot +** +** Copyright (C) 2003 by Reinhold Kainhofer +** +*/ + +/* +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** 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 in a file called COPYING; if not, write to +** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +** MA 02110-1301, USA. +*/ + +/* +** Bug reports and questions can be sent to kde-pim@kde.org. +*/ + +#include "options.h" + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include "sysinfo-factory.h" +#include "sysinfo-conduit.moc" +#include "sysinfoSettings.h" + +const TQString SysInfoConduit::defaultpage = CSL1("KPilot System Information Page\n" +"==============================\n" +"(Kpilot was unable to find the correct template file, \n" +"so this simple template was used.)\n\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"------------------------------------------------------------\n" +"Page created by the KPilot System Information conduit.\n" +""); + + + /** possible fields in the templates are: + * - hardware + * - user + * - memory + * - storage + * - dblist + * - recnumber + * - syncinfo + * - pcversion + * - palmversion + * - debug + */ + + +// Something to allow us to check what revision +// the modules are that make up a binary distribution. + +extern "C" +{ + +unsigned long version_conduit_sysinfo = Pilot::PLUGIN_API; + +} + + + +SysInfoConduit::SysInfoConduit(KPilotLink * o, + const char *n, + const TQStringList & a) : + ConduitAction(o, n, a) +{ + FUNCTIONSETUP; + fConduitName=i18n("System Information"); +} + + + +SysInfoConduit::~SysInfoConduit() +{ + FUNCTIONSETUP; +} + + + +void SysInfoConduit::readConfig() +{ + fOutputFile = SysinfoSettings::outputFile(); + fOutputType = (eOutputTypeEnum) SysinfoSettings::outputFormat(); + fTemplateFile = SysinfoSettings::templateFile(); + fHardwareInfo = SysinfoSettings::hardwareInfo(); + fUserInfo = SysinfoSettings::userInfo(); + fMemoryInfo = SysinfoSettings::memoryInfo(); + fStorageInfo = SysinfoSettings::storageInfo(); + fDBList = SysinfoSettings::databaseList(); + fRecordNumber = SysinfoSettings::recordNumbers(); + fSyncInfo = SysinfoSettings::syncInfo(); + fKDEVersion = SysinfoSettings::kDEVersion(); + fPalmOSVersion = SysinfoSettings::palmOSVersion(); + fDebugInfo = SysinfoSettings::debugInformation(); +} + + +/* virtual */ bool SysInfoConduit::exec() +{ + FUNCTIONSETUP; + + readConfig(); + + TQTimer::singleShot(0, this, TQT_SLOT(hardwareInfo())); + return true; +} + +void SysInfoConduit::hardwareInfo() +{ + FUNCTIONSETUP; + if (fHardwareInfo) { + TQString unknown = i18n("unknown"); + + /* Retrieve values for + * - #deviceid# + * - #devicename# + * - #devicemodel# + * - #manufactorer# + * - #devicetype# + */ + KPilotSysInfo sysinfo = fHandle->getSysInfo(); + fValues[CSL1("deviceid")] = TQString::tqfromLatin1(sysinfo.getProductID()); + + const KPilotCard *device = fHandle->getCardInfo(); + if (device) + { + fValues[CSL1("devicename")] = TQString::tqfromLatin1(device->getCardName()); + fValues[CSL1("devicemodel")] = unknown; // TODO + fValues[CSL1("manufacturer")] = TQString::tqfromLatin1(device->getCardManufacturer()); + } + else + { + fValues[CSL1("devicename")] = unknown; + fValues[CSL1("devicemodel")] = unknown; + fValues[CSL1("manufacturer")] = unknown; + } + + fValues[CSL1("devicetype")] = unknown; + + KPILOT_DELETE(device); + keepParts.append(CSL1("hardware")); + } else removeParts.append(CSL1("hardware")); + TQTimer::singleShot(0, this, TQT_SLOT(userInfo())); +} + +void SysInfoConduit::userInfo() +{ + FUNCTIONSETUP; + if (fUserInfo) + { + /* Retrieve values for + * - #username# + * - #uid# + */ + KPilotUser user=fHandle->getPilotUser(); + fValues[CSL1("username")] = user.name(); + if (user.passwordLength()>0) + { + fValues[CSL1("pw")] = i18n("Password set"); + } + else + { + fValues[CSL1("pw")] = i18n("No password set"); + } + fValues[CSL1("uid")] = TQString::number(user.data()->userID); + fValues[CSL1("viewerid")] = TQString::number(user.data()->viewerID); + keepParts.append(CSL1("user")); + } + else + { + removeParts.append(CSL1("user")); + } + TQTimer::singleShot(0, this, TQT_SLOT(memoryInfo())); +} + +void SysInfoConduit::memoryInfo() +{ + FUNCTIONSETUP; + if (fMemoryInfo) { + /* Retrieve values for + * - #rom# + * - #totalmem# + * - #freemem# + */ + const KPilotCard *device = fHandle->getCardInfo(); + if (device) + { + fValues[CSL1("rom")] = TQString::number(device->getRomSize()/1024); + fValues[CSL1("totalmem")] = TQString::number(device->getRamSize()/1024); + fValues[CSL1("freemem")] = TQString::number(device->getRamFree()/1024); + } + keepParts.append(CSL1("memory")); + } else removeParts.append(CSL1("memory")); + TQTimer::singleShot(0, this, TQT_SLOT(storageInfo())); +} + +void SysInfoConduit::storageInfo() +{ + FUNCTIONSETUP; + if (fStorageInfo) { + /* Retrieve values for + * - $cards$ + */ + const KPilotCard *device = fHandle->getCardInfo(1); + if (device) { + fValues[CSL1("cards")] = CSL1("%1 (%2, %3 kB of %3 kB free)") + .arg(TQString::tqfromLatin1(device->getCardName())) + .arg(TQString::tqfromLatin1(device->getCardManufacturer())) + .arg(device->getRamFree()/1024) + .arg(device->getRamSize()/1024); + KPILOT_DELETE(device); + } else { + fValues[CSL1("cards")] = i18n("No Cards available via pilot-link"); + } + keepParts.append(CSL1("storage")); + } else removeParts.append(CSL1("storage")); + TQTimer::singleShot(0, this, TQT_SLOT(dbListInfo())); +} + +void SysInfoConduit::dbListInfo() +{ + FUNCTIONSETUP; + if (fDBList) { + /* Retrieve values for + * - #dblist(structure)# + */ + dblist=deviceLink()->getDBList(); + keepParts.append(CSL1("dblist")); + } else removeParts.append(CSL1("dblist")); + TQTimer::singleShot(0, this, TQT_SLOT(recNumberInfo())); +} + +void SysInfoConduit::recNumberInfo() +{ + FUNCTIONSETUP; + if (fRecordNumber) { + /* Retrieve values for + * - #addresses# + * - #events# + * - #todos# + * - #memos# + */ + PilotDatabase *fDatabase = 0L; + TQString ERROR = CSL1("ERROR"); + fValues[CSL1("addresses")] = ERROR; + fValues[CSL1("events")] = ERROR; + fValues[CSL1("todos")] = ERROR; + fValues[CSL1("memos")] = ERROR; + fDatabase = deviceLink()->database(CSL1("AddressDB")); + if (fDatabase) { + fValues[CSL1("addresses")] = TQString::number(fDatabase->recordCount()); + KPILOT_DELETE(fDatabase); + } + fDatabase = deviceLink()->database(CSL1("DatebookDB")); + if (fDatabase) { + fValues[CSL1("events")] = TQString::number(fDatabase->recordCount()); + KPILOT_DELETE(fDatabase); + } + fDatabase = deviceLink()->database(CSL1("ToDoDB")); + if (fDatabase) { + fValues[CSL1("todos")] = TQString::number(fDatabase->recordCount()); + KPILOT_DELETE(fDatabase); + } + fDatabase = deviceLink()->database(CSL1("MemoDB")); + if (fDatabase) { + fValues[CSL1("memos")] = TQString::number(fDatabase->recordCount()); + KPILOT_DELETE(fDatabase); + } + keepParts.append(CSL1("records")); + } else removeParts.append(CSL1("records")); + TQTimer::singleShot(0, this, TQT_SLOT(syncInfo())); +} + +void SysInfoConduit::syncInfo() +{ + FUNCTIONSETUP; + if (fSyncInfo) { + /* Retrieve values for + * - #lastsync# + * - #lastsuccsync# + * - #lastsyncpc# + */ + KPilotUser user = deviceLink()->getPilotUser(); + time_t lastsync = user.getLastSyncDate(); + TQDateTime qlastsync; + qlastsync.setTime_t(lastsync); + fValues[CSL1("lastsync")] = qlastsync.toString(Qt::LocalDate); + lastsync = user.getLastSuccessfulSyncDate(); + qlastsync.setTime_t(lastsync); + fValues[CSL1("lastsuccsync")] = qlastsync.toString(Qt::LocalDate); + fValues[CSL1("lastsyncpc")] = TQString::number(user.getLastSyncPC()); + keepParts.append(CSL1("sync")); + } else removeParts.append(CSL1("sync")); + TQTimer::singleShot(0, this, TQT_SLOT(pcVersionInfo())); +} + +void SysInfoConduit::pcVersionInfo() +{ + FUNCTIONSETUP; + if (fKDEVersion) { + /* Retrieve values for + * - #os# + * - #qt# + * - #kde# + * - #kpilot# + * - #pilotlink# + */ + fValues[CSL1("kpilot")] = TQString::tqfromLatin1(KPILOT_VERSION); + fValues[CSL1("kde")] = i18n("unknown"); + fValues[CSL1("qt")] = i18n("unknown"); + fValues[CSL1("os")] = i18n("unknown"); + fValues[CSL1("hostname")] = i18n("unknown"); + struct utsname name; + if (uname (&name) >= 0) { + fValues[CSL1("os")] = CSL1("%1 %3, %5") + .arg(TQString::tqfromLatin1(name.sysname)) + .arg(TQString::tqfromLatin1(name.release)) + .arg(TQString::tqfromLatin1(name.machine)); + fValues[CSL1("hostname")] = CSL1("%2").arg(TQString::tqfromLatin1(name.nodename)); + } +#ifdef KDE_VERSION_STRING + fValues[CSL1("kde")] = TQString::tqfromLatin1(KDE_VERSION_STRING); +#endif +#ifdef QT_VERSION_STR + fValues[CSL1("qt")] = TQString::tqfromLatin1(QT_VERSION_STR); +#endif + fValues[CSL1("pilotlink")] = CSL1("%1.%2.%3%4") + .arg(PILOT_LINK_VERSION) + .arg(PILOT_LINK_MAJOR) + .arg(PILOT_LINK_MINOR) +#ifdef PILOT_LINK_PATCH + .arg(TQString::tqfromLatin1(PILOT_LINK_PATCH)); +#else + .arg(TQString()); +#endif + keepParts.append(CSL1("pcversion")); + } else removeParts.append(CSL1("pcversion")); + TQTimer::singleShot(0, this, TQT_SLOT(palmVersionInfo())); +} + +void SysInfoConduit::palmVersionInfo() +{ + FUNCTIONSETUP; + if (fPalmOSVersion) { + /* Retrieve values for + * - #palmos# + */ +/* fValues["palmos"] = TQString("PalmOS %1.%2 (compat %3.%4)") + .arg(fHandle->getSysInfo()->getMajorVersion()) + .arg(fHandle->getSysInfo()->getMinorVersion()) + .arg(fHandle->getSysInfo()->getCompatMajorVersion()) + .arg(fHandle->getSysInfo()->getCompatMinorVersion());*/ + KPilotSysInfo i = deviceLink()->getSysInfo(); + fValues[CSL1("palmos")] = CSL1("PalmOS %1.%2").arg(i.getMajorVersion()).arg(i.getMinorVersion()); + + keepParts.append(CSL1("palmversion")); + } else removeParts.append(CSL1("palmversion")); + TQTimer::singleShot(0, this, TQT_SLOT(debugInfo())); +} + +void SysInfoConduit::debugInfo() +{ + FUNCTIONSETUP; + if (fDebugInfo) { + /* Retrieve values for + * - #debug# + */ + fValues[CSL1("debug")] = i18n("No debug data"); + keepParts.append(CSL1("debug")); + } else removeParts.append(CSL1("debug")); + TQTimer::singleShot(0, this, TQT_SLOT(writeFile())); +} + +void SysInfoConduit::writeFile() +{ + FUNCTIONSETUP; + + fValues[CSL1("date")] = TQDateTime::tqcurrentDateTime().toString(Qt::LocalDate); + + TQString output; + // Open the template file + TQString templatefile; + switch(fOutputType) + { + case eOutputText: + templatefile=locate("data", CSL1("kpilot/sysinfoconduit/Template.txt")); + break; + case eOutputTemplate: + templatefile=fTemplateFile; + break; + case eOutputHTML: + default: + templatefile=locate("data", CSL1("kpilot/sysinfoconduit/Template.html")); + break; + } + + // Read in the template, close the file + bool loaded=false; + if (!templatefile.isEmpty()){ +#ifdef DEBUG + DEBUGKPILOT<<"Loading template file "<").arg(*it).arg(*it)); + re.setMinimal(true); + output.remove(re); + } + for ( TQStringList::Iterator it = keepParts.begin(); it != keepParts.end(); ++it ) { + TQRegExp re(CSL1("").arg(*it).arg(*it)); + re.setMinimal(true); + output.tqreplace(re, CSL1("\\1")); + } + + // Do a loop through all keys in fValues + TQMap::Iterator it; + for ( it = fValues.begin(); it != fValues.end(); ++it ) { + output.tqreplace(CSL1("#%1#").arg(it.key()), it.data()); + } + + // Insert the list of databases + TQRegExp re(CSL1("#dblist\\[(.*)\\]#")); + re.setMinimal(true); + while (re.search(output)>=0){ + TQString dbstring; + TQString subpatt=re.cap(1); + for (KPilotLink::DBInfoList::ConstIterator i = dblist.begin(); i != dblist.end(); ++i ) { + DBInfo dbi = *i; + TQString newpatt(subpatt); + char tmpchr[5]; + ::memset(&tmpchr[0], 0, 5); + /* Patterns for the dblist argument: + * %0 .. Database name + * %1 .. type + * %2 .. creator + * %3 .. index + * %4 .. flags + * %5 .. miscFlags + * %6 .. version + * %7 .. createDate + * %8 .. modifyDate + * %9 .. backupDate + */ + newpatt.tqreplace(CSL1("%0"), TQString::tqfromLatin1(dbi.name)); + set_long(&tmpchr[0],dbi.type); + newpatt.tqreplace(CSL1("%1"), TQString::tqfromLatin1(tmpchr)); + set_long(&tmpchr[0],dbi.creator); + newpatt.tqreplace(CSL1("%2"), TQString::tqfromLatin1(tmpchr)); + newpatt.tqreplace(CSL1("%3"), TQString::number(dbi.index)); + newpatt.tqreplace(CSL1("%4"), TQString::number(dbi.flags)); + newpatt.tqreplace(CSL1("%5"), TQString::number(dbi.miscFlags)); + newpatt.tqreplace(CSL1("%6"), TQString::number(dbi.version)); + TQDateTime tm; + tm.setTime_t(dbi.createDate); + newpatt.tqreplace(CSL1("%7"), tm.toString(Qt::LocalDate)); + tm.setTime_t(dbi.modifyDate); + newpatt.tqreplace(CSL1("%8"), tm.toString(Qt::LocalDate)); + tm.setTime_t(dbi.backupDate); + newpatt.tqreplace(CSL1("%9"), tm.toString(Qt::LocalDate)); + + dbstring.append(newpatt); + } + // Now, just tqreplace the whole found pattern by the string we just constructed. + output.tqreplace(re.cap(0), dbstring); + } + + // Write out the result + TQFile outfile(fOutputFile); +#ifdef DEBUG + DEBUGKPILOT << fname << ": Writing file <" << fOutputFile << ">" << endl; +#endif + if (fOutputFile.isEmpty() || (!outfile.open(IO_WriteOnly)) ) { + TQFileInfo fi(TQDir::home(), CSL1("KPilotSysInfo.")+TQFileInfo(templatefile).extension() ); + fOutputFile=fi.absFilePath(); + WARNINGKPILOT << "Unable to open output file, using " << fOutputFile << " instead." << endl; + emit logMessage(i18n("Unable to open output file, using %1 instead.").arg(fOutputFile)); + outfile.setName(fOutputFile); + if (!outfile.open(IO_WriteOnly)) { + WARNINGKPILOT<< "Unable to open " << fOutputFile << endl; + emit logError(i18n("Unable to open %1").arg(fOutputFile)); + TQTimer::singleShot(0, this, TQT_SLOT(cleanup())); + return; + } + } + + // Finally, write the actual text out to the file. + TQTextStream outstream(&outfile); + outstream<