summaryrefslogtreecommitdiffstats
path: root/conduits/sysinfoconduit
diff options
context:
space:
mode:
Diffstat (limited to 'conduits/sysinfoconduit')
-rw-r--r--conduits/sysinfoconduit/CMakeLists.txt50
-rw-r--r--conduits/sysinfoconduit/Makefile.am24
-rw-r--r--conduits/sysinfoconduit/Template.html184
-rw-r--r--conduits/sysinfoconduit/Template.txt76
-rw-r--r--conduits/sysinfoconduit/sysinfo-conduit.cc611
-rw-r--r--conduits/sysinfoconduit/sysinfo-conduit.h79
-rw-r--r--conduits/sysinfoconduit/sysinfo-factory.cc43
-rw-r--r--conduits/sysinfoconduit/sysinfo-factory.h36
-rw-r--r--conduits/sysinfoconduit/sysinfo-setup.cc198
-rw-r--r--conduits/sysinfoconduit/sysinfo-setup.h47
-rw-r--r--conduits/sysinfoconduit/sysinfo-setup_dialog.ui214
-rw-r--r--conduits/sysinfoconduit/sysinfoSettings.kcfgc7
-rw-r--r--conduits/sysinfoconduit/sysinfo_conduit.desktop108
-rw-r--r--conduits/sysinfoconduit/sysinfoconduit.kcfg64
14 files changed, 1741 insertions, 0 deletions
diff --git a/conduits/sysinfoconduit/CMakeLists.txt b/conduits/sysinfoconduit/CMakeLists.txt
new file mode 100644
index 0000000..cae6d89
--- /dev/null
+++ b/conduits/sysinfoconduit/CMakeLists.txt
@@ -0,0 +1,50 @@
+include_directories(
+ ${CMAKE_CURRENT_BINARY_DIR}
+)
+
+set(conduit_sysinfo_SRCS
+ sysinfo-setup.cc
+ sysinfo-factory.cc
+ sysinfo-conduit.cc
+)
+
+set(conduit_sysinfo_UIS
+ sysinfo-setup_dialog.ui
+)
+
+set(conduit_sysinfo_KCFGS
+ sysinfoSettings.kcfgc
+)
+
+kde3_add_kcfg_files(conduit_sysinfo_SRCS ${conduit_sysinfo_KCFGS})
+kde3_add_ui_files(conduit_sysinfo_SRCS ${conduit_sysinfo_UIS})
+kde3_automoc(${conduit_sysinfo_SRCS})
+add_library(conduit_sysinfo SHARED ${conduit_sysinfo_SRCS})
+
+set_target_properties(
+ conduit_sysinfo PROPERTIES LOCATION ${KDE3_PLUGIN_INSTALL_DIR}
+ INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/lib
+ PREFIX ""
+)
+
+kde3_install_libtool_file(conduit_sysinfo)
+
+install(
+ TARGETS conduit_sysinfo
+ LIBRARY DESTINATION ${KDE3_PLUGIN_INSTALL_DIR}
+)
+
+install(
+ FILES sysinfo_conduit.desktop DESTINATION ${KDE3_SERVICES_DIR}
+)
+
+install(
+ FILES sysinfoSettings.kcfgc sysinfoconduit.kcfg
+ DESTINATION ${KDE3_KCFG_DIR}
+)
+
+install(
+ FILES Template.html Template.txt
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/apps/kpilot/sysinfoconduit
+)
+
diff --git a/conduits/sysinfoconduit/Makefile.am b/conduits/sysinfoconduit/Makefile.am
new file mode 100644
index 0000000..eb7f7aa
--- /dev/null
+++ b/conduits/sysinfoconduit/Makefile.am
@@ -0,0 +1,24 @@
+### Makefile for the sysinfo conduit
+###
+### The sysinfo conduit is Copyright (C) 2003 by Reinhold Kainhofer
+
+INCLUDES= $(PISOCK_INCLUDE) -I$(top_srcdir)/kpilot/lib $(all_includes)
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = sysinfo_conduit.desktop
+
+kde_module_LTLIBRARIES = conduit_sysinfo.la
+
+conduit_sysinfo_la_SOURCES = sysinfoSettings.kcfgc \
+ sysinfo-factory.cc \
+ sysinfo-setup.cc \
+ sysinfo-conduit.cc \
+ sysinfo-setup_dialog.ui
+conduit_sysinfo_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+conduit_sysinfo_la_LIBADD = ../../lib/libkpilot.la $(LIB_KDEUI) $(LIB_KIO)
+
+kpilot_sysinfo_data_DATA = Template.html Template.txt
+kpilot_sysinfo_datadir = $(kde_datadir)/kpilot/sysinfoconduit
+EXTRA_DIST = $(kpilot_sysinfo_data_DATA)
+kde_kcfg_DATA = sysinfoconduit.kcfg
diff --git a/conduits/sysinfoconduit/Template.html b/conduits/sysinfoconduit/Template.html
new file mode 100644
index 0000000..e5a33e0
--- /dev/null
+++ b/conduits/sysinfoconduit/Template.html
@@ -0,0 +1,184 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<head>
+ <title>KPilot System Information Page</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15">
+ <meta name="GENERATOR" content="KPilot SysInfo conduit">
+ <style type="text/css">
+ h1 {
+ font-family: sans-serif;
+ font-size: xx-large;
+ font-style: italic;
+ font-variant: small-caps;
+ font-weight: bolder;
+ color: darkBlue;
+ border-bottom: thick solid darkBlue;
+ margin: 30;
+ }
+ h2 {
+ font-family: sans-serif;
+ font-size: large;
+ color: darkRed;
+ margin-top: 40;
+ border-top: thin solid darkRed;
+ display: list-item;
+ list-style-type: circle;
+ margin: 40;
+ }
+ th {
+ font-style: italic;
+ font-weight: bold;
+ background-color: #DFC370;
+ text-align: center;
+ }
+ </style>
+</head>
+<body bgcolor="#FFE080">
+ <h1>KPilot System Information</h1>
+ <center>
+<p><!--#ifhardware#<a href="#Hardware">Hardware info</a> - #endifhardware#-->
+<!--#ifuser#<a href="#User">User info</a> - #endifuser#-->
+<!--#ifmemory#<a href="#Memory">Memory info</a> - #endifmemory#-->
+<!--#ifstorage#<a href="#Storage">Storage info</a> - #endifstorage#-->
+<!--#ifdblist#<a href="#DBList">Database list</a> - #endifdblist#-->
+<!--#ifrecords#<a href="#Records">Addresses, to-dos, events, and memos</a> - #endifrecords#-->
+<!--#ifsync#<a href="#Sync">Sync info</a> - #endifsync#-->
+<!--#ifpcversion#<a href="#Version">PC Version info</a> - #endifpcversion#-->
+<!--#ifpalmversion#<a href="#PalmVersion">Palm Version info</a> - #endifpalmversion#-->
+<!--#ifdebug#<a href="#Debug">Debug info</a>#endifdebug#--></p>
+ </center>
+
+
+<!--#ifhardware#<h2><a name="Hardware">Hardware Information</a></h2>
+ <center>
+ <table border=1>
+ <tbody>
+ <tr><td><b>DeviceID:</b></td><td>#deviceid#</td></tr>
+ <tr><td><b>Device name:</b></td><td>#devicename#</td></tr>
+ <tr><td><b>Device model:</b></td><td>#devicemodel#</td></tr>
+ <tr><td><b>Manufacturer:</b></td><td>#manufacturer#</td></tr>
+ <tr><td><b>Connected via:</b></td><td>#devicetype#</td></tr>
+ </tbody>
+ </table>
+ </center>#endifhardware#-->
+
+
+<!--#ifuser#<h2><a name="User">User Information</a></h2>
+ <center>
+ <table border=1>
+ <tbody>
+ <tr><td><b>Handheld User Name:</b></td><td>#username#</td></tr>
+ <tr><td><b>Handheld Password:</b></td><td>#pw#</td></tr>
+ <tr><td><b>Handheld User ID:</b></td><td>#uid#</td></tr>
+ <tr><td><b>Viewer ID:</b></td><td>#viewerid#</td></tr>
+ </tbody>
+ </table>
+ </center>#endifuser#-->
+
+
+<!--#ifmemory#<h2><a name="Memory">Memory Information</a></h2>
+ <center>
+ <table border=1>
+ <tbody>
+ <tr><td><b>ROM:</b></td><td>#rom# kB total</td></tr>
+ <tr><td><b>Total RAM:</b></td><td>#totalmem# kB total</td></tr>
+ <tr><td><b>Free RAM:</b></td><td>#freemem# kB free</td></tr>
+ </tbody>
+ </table>
+ </center>#endifmemory#-->
+
+
+<!--#ifstorage#<h2><a name="Storage">Storage Information</a></h2>
+ <center>
+ <table border=1>
+ <tbody>
+ <tr><td><b>Cards:</b></td><td>#cards#</td></tr>
+ </tbody>
+ </table>
+ </center>#endifstorage#-->
+
+
+<!--#ifdblist#<h2><a name="DBList">List of Databases on Handheld</a></h2>
+ <center>
+ <table border=1>
+ <tr><th>DB name</th><th>type, creator</th><th>index</th><th>flags</th>
+ <th>created</th><th>modified</th><th>version</th></tr>
+ #dblist[<tr><td>%0</td><td>%1,%2</td><td>%3</td><td>%4/%5</td>
+ <td>%7</td><td>%8</td><td>%6</td></tr>
+ ]#
+ </table>
+ </center>#endifdblist#-->
+
+
+
+<!--#ifrecords#<h2><a name="Records">Number of addresses, to-dos, events, and memos</a></h2>
+ <center>
+ <table border=1>
+ <thead>
+ <tr><th scope=col>Record type</th><th scope=col># of recs</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><b>Addresses:</b></td><td>#addresses# entries in Addressbook</td></tr>
+ <tr><td><b>Events:</b></td><td>#events# entries in Calendar</td></tr>
+ <tr><td><b>To-dos:</b></td><td>#todos# entries in To-do list</td></tr>
+ <tr><td><b>Memos:</b></td><td>#memos# memos</td></tr>
+ </tbody>
+ </table>
+ </center>#endifrecords#-->
+
+
+<!--#ifsync#<h2><a name="Sync">Synchronization Information</a></h2>
+ <center>
+ <table border=1>
+ <tbody>
+ <tr><td><b>Last sync attempt:</b></td><td>#lastsync#</td></tr>
+ <tr><td><b>Last successful sync:</b></td><td>#lastsuccsync#</td></tr>
+ <tr><td><b>Last sync with PC (ID):</b></td><td>#lastsyncpc#</td></tr>
+ </tbody>
+ </table>
+ </center>#endifsync#-->
+
+
+<!--#ifpcversion#<h2><a name="Version">Version Information (Desktop)</a></h2>
+ <center>
+ <table border=1>
+ <thead>
+ <tr><th scope=col>Application</th><th scope=col>Version</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><b>Operating System:</b></td><td>#os#</td></tr>
+ <tr><td><b>Hostname:</b></td><td>#hostname#</td></tr>
+ <tr><td><b>Qt Version:</b></td><td>#qt#</td></tr>
+ <tr><td><b>KDE Libraries Version:</b></td><td>#kde#</td></tr>
+ <tr><td><b>KPilot Version:</b></td><td>#kpilot#</td></tr>
+ <tr><td><b>Pilot-Link Version:</b></td><td>#pilotlink#</td></tr>
+ </tbody>
+ </table>
+ </center>#endifpcversion#-->
+
+
+<!--#ifpalmversion#<h2><a name="PalmVersion">Version Information (Handheld)</a></h2>
+ <center>
+ <table border=1>
+ <thead>
+ <tr><th scope=col>Application</th><th scope=col>Version</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><b>PalmOS:</b></td><td>#palmos#</td></tr>
+ </tbody>
+ </table>
+ </center>#endifpalmversion#-->
+
+
+<!--#ifdebug#<h2><a name="Debug">Debug Information</a></h2>
+ <center>
+ <table border=1>
+ <tr><td><pre>#debug#</pre></td></tr>
+ </table>
+ </center>#endifdebug#-->
+
+
+ <p>&nbsp;</p>
+ <hr>
+ <font size="-1">Page created #date# by the SysInfo conduit of <a href="http://www.kpilot.org/">KPilot</a>.</font>
+</body>
+</html>
diff --git a/conduits/sysinfoconduit/Template.txt b/conduits/sysinfoconduit/Template.txt
new file mode 100644
index 0000000..8796e44
--- /dev/null
+++ b/conduits/sysinfoconduit/Template.txt
@@ -0,0 +1,76 @@
+KPilot System Information Page
+==============================
+
+<!--#ifhardware#
+-) Hardware Information
+ DeviceID: #deviceid#
+ Device name: #devicename#
+ Device model: #devicemodel#
+ Manufacturer: #manufacturer#
+ Connected via: #devicetype#
+#endifhardware#-->
+
+<!--#ifuser#
+-) User Information
+ Handheld User Name: #username#
+ Handheld Password: #pw#
+ Handheld User ID: #uid#
+ Viewer ID: #viewerid#
+#endifuser#-->
+
+<!--#ifmemory#
+-) Memory Information
+ ROM: #rom# kB total
+ Total RAM: #totalmem# kB total
+ Free RAM: #freemem# kB fre
+#endifmemory#-->
+
+<!--#ifstorage#
+-) Storage Information
+ Cards: #cards#
+#endifstorage#-->
+
+<!--#ifdblist#
+-) List of Databases on Handheld
+ Available Databases: #dblist[
+ %0 (%1, %2)]#
+#endifdblist#-->
+
+<!--#ifrecords#
+-) Number of addresses, todos, events, and memos
+ Addresses: #addresses# entries in Addressbook
+ Events: #events# entries in Calendar
+ Todos: #todos# entries in ToDo list
+ Memos: #memos# memos
+#endifrecords#-->
+
+<!--#ifsync#
+-) Synchronization Information
+ Last sync attempt: #lastsync#
+ Last successful sync: #lastsuccsync#
+ Last sync with PC (ID): #lastsyncpc#
+#endifsync#-->
+
+<!--#ifpcversion#
+-) Version Information (Desktop)
+ Operating System: #os#
+ Hostname: #hostname#
+ Qt Version: #qt#
+ KDE Version: #kde#
+ KPilot Version: #kpilot#
+ Pilot-Link Version: #pilotlink#
+#endifpcversion#-->
+
+<!--#ifpalmversion#
+-) Version Information (Handheld)
+ PalmOS: #palmos#
+#endifpalmversion#-->
+
+<!--#ifdebug#
+-) Debug Information
+ #debug#
+#endifdebug#-->
+
+
+------------------------------------------------------------
+Page created #date# by the SysInfo conduit of KPilot.
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 <pi-version.h>
+
+#include <tqtimer.h>
+#include <tqdir.h>
+#include <tqfileinfo.h>
+#include <tqregexp.h>
+#include <kconfig.h>
+#include <kdebug.h>
+
+#include <pilotSysInfo.h>
+#include <pilotUser.h>
+#include <pilotCard.h>
+#include <kpilotlink.h>
+#include <kstandarddirs.h>
+#include <pilotSerialDatabase.h>
+
+#include <sys/utsname.h>
+
+#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"
+"<!--#ifhardware#\n"
+"-) Hardware Information\n"
+" DeviceID: #deviceid#\n"
+" Device name: #devicename#\n"
+" Device model: #devicemodel#\n"
+" Manufacturer: #manufacturer#\n"
+" Connected via: #devicetype#\n"
+"#endifhardware#-->\n"
+"\n"
+"<!--#ifuser#\n"
+"-) User Information\n"
+" Handheld User Name: #username#\n"
+" Handheld Password: #pw#\n"
+" Handheld User ID: #uid#\n"
+" Viewer ID: #viewerid#\n"
+"#endifuser#-->\n"
+"\n"
+"<!--#ifmemory#\n"
+"-) Memory Information\n"
+" ROM: #rom# kB total\n"
+" Total RAM: #totalmem# kB total\n"
+" Free RAM: #freemem# kB free\n"
+"#endifmemory#-->\n"
+"\n"
+"<!--#ifstorage#\n"
+"-) Storage Information\n"
+" Number of cards: #cards#\n"
+" Memory on cards: #storagemem#\n"
+"#endifstorage#-->\n"
+"\n"
+"<!--#ifdblist#\n"
+"-) List of Databases on Handheld\n"
+" Available Databases: #dblist(%1,)#\n"
+"#endifdblist#-->\n"
+"\n"
+"<!--#ifrecords#\n"
+"-) Number of addresses, to-dos, events, and memos\n"
+" Addresses: #addresses# entries in Addressbook\n"
+" Events: #events# entries in Calendar\n"
+" To-dos: #todos# entries in To-do list\n"
+" Memos: #memos# memos\n"
+"#endifrecords#-->\n"
+"\n"
+"<!--#ifsync#\n"
+"-) Synchronization Information\n"
+" Last sync attempt: #lastsync#\n"
+" Last successful sync: #lastsuccsync#\n"
+" Last sync with PC (ID): #lastsyncpc#\n"
+"#endifsync#-->\n"
+"\n"
+"<!--#ifpcversion#\n"
+"-) Version Information (Desktop)\n"
+" Operating System: #os#\n"
+" Hostname: #hostname#\n"
+" Qt Version: #qt#\n"
+" KDE Version: #kde#\n"
+" KPilot Version: #kpilot#\n"
+" Pilot-Link Version: #pilotlink#\n"
+"#endifpcversion#-->\n"
+"\n"
+"<!--#ifpalmversion#\n"
+"-) Version Information (Handheld)\n"
+" PalmOS: #palmos#\n"
+"#endifpalmversion#-->\n"
+"\n"
+"<!--#ifdebug#\n"
+"-) Debug Information\n"
+" #debug#\n"
+"#endifdebug#-->\n"
+"\n"
+"------------------------------------------------------------\n"
+"Page created <!--#date#--> 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 "<<templatefile<<endl;
+#endif
+ TQFile infile(templatefile);
+ if (infile.open(IO_ReadOnly)) {
+ TQTextStream instream(&infile);
+ output = instream.read();
+ infile.close();
+ loaded=true;
+ }
+ }
+
+ if (!loaded)
+ {
+ WARNINGKPILOT << "Loading template file " << templatefile
+ <<" failed. Using default template instead." << endl;
+ output=defaultpage;
+ }
+
+ // Remove all parts not extracted
+ for ( TQStringList::Iterator it = removeParts.begin(); it != removeParts.end(); ++it ) {
+ TQRegExp re(CSL1("<!--#if%1#.*#endif%1#-->").arg(*it).arg(*it));
+ re.setMinimal(true);
+ output.remove(re);
+ }
+ for ( TQStringList::Iterator it = keepParts.begin(); it != keepParts.end(); ++it ) {
+ TQRegExp re(CSL1("<!--#if%1#(.*)#endif%1#-->").arg(*it).arg(*it));
+ re.setMinimal(true);
+ output.tqreplace(re, CSL1("\\1"));
+ }
+
+ // Do a loop through all keys in fValues
+ TQMap<TQString,TQString>::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<<output;
+ outfile.close();
+
+ emit logMessage(i18n("Handheld system information written to the file %1").arg(fOutputFile));
+ TQTimer::singleShot(0, this, TQT_SLOT(cleanup()));
+}
+
+void SysInfoConduit::cleanup()
+{
+ FUNCTIONSETUP;
+ // Nothing to clean up so far (Do I have memory leaks somewhere?)
+ emit syncDone(this);
+}
diff --git a/conduits/sysinfoconduit/sysinfo-conduit.h b/conduits/sysinfoconduit/sysinfo-conduit.h
new file mode 100644
index 0000000..803bc73
--- /dev/null
+++ b/conduits/sysinfoconduit/sysinfo-conduit.h
@@ -0,0 +1,79 @@
+#ifndef _SysInfo_CONDUIT_H
+#define _SysInfo_CONDUIT_H
+/* sysinfo-conduit.h 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 <plugin.h>
+
+class SysInfoConduit : public ConduitAction
+{
+ Q_OBJECT
+public:
+ SysInfoConduit(
+ KPilotLink *o,
+ const char *n = 0L,
+ const TQStringList &a = TQStringList() );
+ virtual ~SysInfoConduit();
+ virtual bool exec();
+
+public slots:
+ void hardwareInfo();
+ void userInfo();
+ void memoryInfo();
+ void storageInfo();
+ void dbListInfo();
+ void recNumberInfo();
+ void syncInfo();
+ void pcVersionInfo();
+ void palmVersionInfo();
+ void debugInfo();
+ void writeFile();
+ void cleanup();
+
+protected:
+ void readConfig();
+private:
+ TQMap<TQString,TQString> fValues;
+
+ bool fHardwareInfo, fUserInfo, fMemoryInfo, fStorageInfo,
+ fDBList, fRecordNumber, fSyncInfo,
+ fKDEVersion, fPalmOSVersion, fDebugInfo;
+ TQString fOutputFile, fTemplateFile;
+ enum eOutputTypeEnum {
+ eOutputHTML=0,
+ eOutputText,
+ eOutputTemplate
+ } fOutputType;
+
+ KPilotLink::DBInfoList dblist;
+ TQStringList removeParts;
+ TQStringList keepParts;
+ static const TQString defaultpage;
+} ;
+
+#endif
diff --git a/conduits/sysinfoconduit/sysinfo-factory.cc b/conduits/sysinfoconduit/sysinfo-factory.cc
new file mode 100644
index 0000000..d03dc0b
--- /dev/null
+++ b/conduits/sysinfoconduit/sysinfo-factory.cc
@@ -0,0 +1,43 @@
+/* SysInfo-factory.cc KPilot
+**
+** Copyright (C) 2003 by Reinhold Kainhofer
+**
+** This file defines the factory for the SysInfo-conduit plugin.
+*/
+
+/*
+** 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 "pluginfactory.h"
+
+#include "sysinfo-conduit.h"
+#include "sysinfo-setup.h"
+
+extern "C"
+{
+
+void *init_conduit_sysinfo()
+{
+ return new ConduitFactory<SysInfoWidgetConfig,SysInfoConduit>;
+}
+
+}
diff --git a/conduits/sysinfoconduit/sysinfo-factory.h b/conduits/sysinfoconduit/sysinfo-factory.h
new file mode 100644
index 0000000..66ae5ae
--- /dev/null
+++ b/conduits/sysinfoconduit/sysinfo-factory.h
@@ -0,0 +1,36 @@
+#ifndef _SYSINFO_FACTORY_H
+#define _SYSINFO_FACTORY_H
+/* SysInfo-factory.h KPilot
+**
+** Copyright (C) 2003 by Reinhold Kainhofer
+**
+** This file defines the factory for the SysInfo-conduit plugin.
+*/
+
+/*
+** 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
+*/
+
+extern "C"
+{
+ void *init_libsysinfoconduit();
+}
+
+#endif
diff --git a/conduits/sysinfoconduit/sysinfo-setup.cc b/conduits/sysinfoconduit/sysinfo-setup.cc
new file mode 100644
index 0000000..271db65
--- /dev/null
+++ b/conduits/sysinfoconduit/sysinfo-setup.cc
@@ -0,0 +1,198 @@
+/* SysInfo-setup.cc KPilot
+**
+** Copyright (C) 2003 by Reinhold Kainhofer
+**
+** This file defines the setup dialog for the SysInfo-conduit plugin.
+*/
+
+/*
+** 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 <tqtabwidget.h>
+#include <tqradiobutton.h>
+#include <tqcheckbox.h>
+#include <tqbuttongroup.h>
+#include <tqlistview.h>
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kurlrequester.h>
+
+#include "sysinfo-setup_dialog.h"
+
+#include "sysinfo-factory.h"
+#include "sysinfo-setup.h"
+#include "sysinfoSettings.h"
+
+
+typedef struct { const char *name; bool (*accessor)(); void (*mutator)(bool); } sysinfoEntry_t;
+
+const sysinfoEntry_t sysinfoEntries[] =
+{
+ { I18N_NOOP("HardwareInfo"), SysinfoSettings::hardwareInfo, SysinfoSettings::setHardwareInfo },
+ { I18N_NOOP("UserInfo"), SysinfoSettings::userInfo, SysinfoSettings::setUserInfo },
+ { I18N_NOOP("MemoryInfo"), SysinfoSettings::memoryInfo, SysinfoSettings::setMemoryInfo },
+ { I18N_NOOP("StorageInfo"), SysinfoSettings::storageInfo, SysinfoSettings::setStorageInfo },
+ { I18N_NOOP("DatabaseList"), SysinfoSettings::databaseList, SysinfoSettings::setDatabaseList },
+ { I18N_NOOP("RecordNumbers"), SysinfoSettings::recordNumbers, SysinfoSettings::setRecordNumbers},
+ { I18N_NOOP("SyncInfo"), SysinfoSettings::syncInfo, SysinfoSettings::setSyncInfo },
+ { I18N_NOOP("KDEVersion"), SysinfoSettings::kDEVersion, SysinfoSettings::setKDEVersion },
+ { I18N_NOOP("PalmOSVersion"), SysinfoSettings::palmOSVersion, SysinfoSettings::setPalmOSVersion },
+ { I18N_NOOP("DebugInformation"), SysinfoSettings::debugInformation, SysinfoSettings::setDebugInformation },
+ { 0L, 0L, 0L }
+} ;
+
+
+/*
+** The QCheckListItems used in the list of parts to print have
+** several text fields with special meanings.
+** 0: The text displayed in the list.
+** 1: The index of the item in the sysinfoEntries array.
+** 2: This string is empty if the part was originally not checked,
+** and non-empty (probably "1") if the part was originally checked.
+** This is used to detect changes in the configuration.
+** We introduce some defines for these numbers.
+*/
+
+#define PART_NAME (0)
+#define PART_KEY (1)
+#define PART_SETTING (2)
+
+/*
+** This is a convenience define to update an item's "original setting".
+*/
+#define updateSetting(i) { TQCheckListItem *ubbu=(i); \
+ ubbu->setText(PART_SETTING,(ubbu->isOn() ? CSL1("1") : TQString::null)); }
+
+
+SysInfoWidgetConfig::SysInfoWidgetConfig(TQWidget *w, const char *n) :
+ ConduitConfigBase(w,n),
+ fConfigWidget(new SysInfoWidget(w))
+{
+ FUNCTIONSETUP;
+
+ KAboutData *fAbout = new KAboutData("SysInfoConduit",
+ I18N_NOOP("KPilot System Information conduit"),
+ KPILOT_VERSION,
+ I18N_NOOP("Retrieves System, Hardware, and User Info from the Handheld and stores them to a file."),
+ KAboutData::License_GPL,
+ "(C) 2003, Reinhold Kainhofer");
+ fAbout->addAuthor("Reinhold Kainhofer",
+ I18N_NOOP("Primary Author"), "reinhold@kainhofer.com", "http://reinhold.kainhofer.com/");
+
+ ConduitConfigBase::addAboutPage(fConfigWidget->tabWidget,fAbout);
+ fWidget=fConfigWidget;
+
+ TQObject::connect(fConfigWidget->fOutputFile,TQT_SIGNAL(textChanged(const TQString&)),
+ this,TQT_SLOT(modified()));
+ TQObject::connect(fConfigWidget->fTemplateFile,TQT_SIGNAL(textChanged(const TQString&)),
+ this,TQT_SLOT(modified()));
+ TQObject::connect(fConfigWidget->fOutputType,TQT_SIGNAL(clicked(int)),
+ this,TQT_SLOT(modified()));
+ fConduitName=i18n("System Information");
+}
+
+void SysInfoWidgetConfig::commit()
+{
+ FUNCTIONSETUP;
+
+ SysinfoSettings::setOutputFile(
+ fConfigWidget->fOutputFile->url() );
+ SysinfoSettings::setTemplateFile(
+ fConfigWidget->fTemplateFile->url() );
+ SysinfoSettings::setOutputFormat(
+ fConfigWidget->fOutputType->id(fConfigWidget->fOutputType->selected()));
+
+ TQListViewItem *i = fConfigWidget->fPartsList->firstChild();
+ TQCheckListItem *ci = dynamic_cast<TQCheckListItem *>(i);
+ while(ci)
+ {
+#ifdef DEBUG
+ DEBUGKPILOT << fname << ": Saving " << ci->text(PART_NAME)
+ << (ci->isOn() ? " on" : " off") << endl;
+#endif
+ int index=ci->text(PART_KEY).toInt();
+ if (0<=index && index<=10)
+ {
+ const sysinfoEntry_t *p = sysinfoEntries+index;
+ p->mutator(ci->isOn());
+ }
+ updateSetting(ci);
+ i=i->nextSibling();
+ ci = dynamic_cast<TQCheckListItem *>(i);
+ }
+ SysinfoSettings::self()->writeConfig();
+ unmodified();
+}
+
+void SysInfoWidgetConfig::load()
+{
+ FUNCTIONSETUP;
+ SysinfoSettings::self()->readConfig();
+
+ const sysinfoEntry_t *p = sysinfoEntries;
+ TQCheckListItem *i = 0L;
+ while (p && p->name)
+ {
+ i = new TQCheckListItem(fConfigWidget->fPartsList,i18n(p->name),TQCheckListItem::CheckBox);
+ // by default let the sysinfo conduit write out all available information
+ i->setOn( p->accessor() );
+ i->setText(PART_KEY, TQString::number(p-sysinfoEntries)); // store index there
+ updateSetting(i);
+#ifdef DEBUG
+ DEBUGKPILOT << fname << ": Loaded " << p->name
+ << (i->isOn() ? " on" : " off") << endl;
+#endif
+
+ p++;
+ }
+ fConfigWidget->fOutputFile->setURL( SysinfoSettings::outputFile() );
+ fConfigWidget->fTemplateFile->setURL( SysinfoSettings::templateFile() );
+ fConfigWidget->fOutputType->setButton( SysinfoSettings::outputFormat() );
+ unmodified();
+}
+
+/* virtual */ bool SysInfoWidgetConfig::isModified() const
+{
+ FUNCTIONSETUP;
+ if (fModified) return true;
+
+ TQListViewItem *i = fConfigWidget->fPartsList->firstChild();
+ TQCheckListItem *ci = dynamic_cast<TQCheckListItem *>(i);
+
+ while(ci)
+ {
+ bool current = ci->isOn();
+ bool original = !ci->text(PART_SETTING).isEmpty();
+#ifdef DEBUG
+ DEBUGKPILOT << fname << ": Checking " << ci->text(PART_KEY)
+ << " was " << (original ? " on" : " off")
+ << " now " << (current ? " on" : " off") << endl;
+#endif
+
+ if (current!=original) return true;
+ i=i->nextSibling();
+ ci = dynamic_cast<TQCheckListItem *>(i);
+ }
+ return false;
+}
diff --git a/conduits/sysinfoconduit/sysinfo-setup.h b/conduits/sysinfoconduit/sysinfo-setup.h
new file mode 100644
index 0000000..400dea3
--- /dev/null
+++ b/conduits/sysinfoconduit/sysinfo-setup.h
@@ -0,0 +1,47 @@
+#ifndef _SysInfo_SysInfo_SETUP_H
+#define _SysInfo_SysInfo_SETUP_H
+/* sysinfo-setup.h KPilot
+**
+** Copyright (C) 2003 by Reinhold Kainhofer
+**
+** This file defines the widget and behavior for the config dialog
+** of the KNotes conduit.
+*/
+
+/*
+** 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 "plugin.h"
+
+class SysInfoWidget;
+
+class SysInfoWidgetConfig : public ConduitConfigBase
+{
+public:
+ SysInfoWidgetConfig(TQWidget *parent, const char *);
+ virtual void commit();
+ virtual void load();
+ virtual bool isModified() const;
+protected:
+ SysInfoWidget *fConfigWidget;
+} ;
+
+#endif
diff --git a/conduits/sysinfoconduit/sysinfo-setup_dialog.ui b/conduits/sysinfoconduit/sysinfo-setup_dialog.ui
new file mode 100644
index 0000000..70bd896
--- /dev/null
+++ b/conduits/sysinfoconduit/sysinfo-setup_dialog.ui
@@ -0,0 +1,214 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>SysInfoWidget</class>
+<author>Reinhold Kainhofer</author>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Form2</cstring>
+ </property>
+ <property name="tqgeometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>330</width>
+ <height>232</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QTabWidget" row="0" column="0">
+ <property name="name">
+ <cstring>tabWidget</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>General</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="3" column="1">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="tqsizeHint">
+ <size>
+ <width>20</width>
+ <height>51</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KURLRequester" row="0" column="1">
+ <property name="name">
+ <cstring>fOutputFile</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;Enter here, or select by clicking the file picker button, the location and file name of the output file used to store the handheld's system information.&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>Output &amp;file:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>fOutputFile</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;Enter here, or select by clicking the file picker button, the location and file name of the output file used to store the handheld's system information.&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QButtonGroup" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>fOutputType</cstring>
+ </property>
+ <property name="title">
+ <string>Type of Output</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>radioButton3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;HTML</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;Select this option to output the system information data as a HTML document.&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>radioButton4</cstring>
+ </property>
+ <property name="text">
+ <string>Te&amp;xt file</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;Select this option to output the system information data as a text document.&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="2" column="1">
+ <property name="name">
+ <cstring>fTemplateFile</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;Enter here, or select by clicking on the file picker button, the location of the template to be used if you select the Custom template option.&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="2" column="0">
+ <property name="name">
+ <cstring>radioButton5</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Custom template:</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;Select this option to output the system information data as defined by a custom template. Enter the location of the template in the edit box, or select it clicking on the file picker button.&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Parts Included</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="tqsizeHint">
+ <size>
+ <width>21</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QListView" row="0" column="0">
+ <column>
+ <property name="text">
+ <string>Output Type</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>fPartsList</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;Check on this list the types of information about your system and handheld you want to display in the output file.&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>radioButton5</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>fTemplateFile</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>tabWidget</tabstop>
+</tabstops>
+<tqlayoutdefaults spacing="6" margin="11"/>
+<includes>
+ <include location="global" impldecl="in implementation">kurlrequester.h</include>
+ <include location="global" impldecl="in implementation">klineedit.h</include>
+ <include location="global" impldecl="in implementation">kpushbutton.h</include>
+</includes>
+</UI>
diff --git a/conduits/sysinfoconduit/sysinfoSettings.kcfgc b/conduits/sysinfoconduit/sysinfoSettings.kcfgc
new file mode 100644
index 0000000..09337f3
--- /dev/null
+++ b/conduits/sysinfoconduit/sysinfoSettings.kcfgc
@@ -0,0 +1,7 @@
+File=sysinfoconduit.kcfg
+ClassName=SysinfoSettings
+Singleton=true
+ItemAccessors=true
+Mutators=true
+GlobalEnums=true
+SetUserTexts=true
diff --git a/conduits/sysinfoconduit/sysinfo_conduit.desktop b/conduits/sysinfoconduit/sysinfo_conduit.desktop
new file mode 100644
index 0000000..f31bd06
--- /dev/null
+++ b/conduits/sysinfoconduit/sysinfo_conduit.desktop
@@ -0,0 +1,108 @@
+[Desktop Entry]
+Type=Service
+Comment=This conduit writes information about your handheld and the sync to a file.
+Comment[af]=Hierdie pad skryf informasie aangaande die draagbare toestel en sinkronisasie na 'n lêer.
+Comment[bg]=Запис на информацията относно мобилното устройство във файл
+Comment[bs]=Ovaj conduit ispisuje informacije o ručnom računaru i sinhronizuje ih sa datotekom.
+Comment[ca]=Aquest conducte escriu informació a un fitxer a sobre de la vostra agenda electrònica i la sincronització.
+Comment[cs]=Toto propojení zapisuje informace o vašem handheldu a synchronizaci do souboru.
+Comment[cy]=Mae'r cwndid yma yn ysgrifennu gwybodaeth ynglyn â'ch llawiadur a'r cydamseriad i ffeil.
+Comment[da]=Denne kanal skriver information om din håndholdte og synkroniseringen til en fil.
+Comment[de]=Schreibt Daten zum Taschencomputer und den Abgleich in eine Datei
+Comment[el]=Αυτός ο σύνδεσμος γράφει πληροφορίες σχετικά με τον υπολογιστή παλάμης σας και το συγχρονισμό προς ένα αρχείο.
+Comment[es]=Este conducto escribe la información subre su agenda electrónica y la sincronización a un archivo.
+Comment[et]=See kanal salvestab info pihuarvuti kohta failina.
+Comment[eu]=Kanal honek zure agenda elektronikoari buruzko informazioa eta sinkronizazio fitxategi batean gordetzen ditu.
+Comment[fa]=این لوله، اطلاعات دربارۀ دستی شما و ترکیب‌دهی به پرونده را می‌نویسد.
+Comment[fi]=Tämä yhdyskäytävä kirjoittaa tietoja taskutietokoneelta ja synkronoi ne tiedostoon.
+Comment[fr]=Ce canal écrit des informations sur votre périphérique et la synchronisation dans un fichier.
+Comment[fy]=Dit conduit bewarret ynformaasje oer jo handheld en syngronosaasje yn in triem.
+Comment[gl]=Este conducto escribe a información sobre o seu aparello portátil e a sincronización a un ficheiro.
+Comment[hi]=यह कन्ड्यूइट आपके हैंण्डहेल्ड के बारे में जानकारी लिखता है तथा एक फ़ाइल में सिंक करता है.
+Comment[hu]=Ezzel a csatolóval fájlba lehet kiíratni a kéziszámítógép és a szinkronizálás jellemzőit
+Comment[is]=Þessi rás skrifar upplýsingar um lófatölvuna þína og samstillinguna í skrá.
+Comment[it]=Questo conduit scrive in un file informazioni sul tuo palmare.
+Comment[ja]=このコンジットはあなたのハンドヘルドの情報を書き出し、ファイルに同期します。
+Comment[kk]=Қалта құрылғыңыз туралы мәліметті файла жазу арнасы.
+Comment[km]=បំពង់​នេះ​សរសេរ​ព័ត៌មាន​អំពី​ឧបករណ៍​យួរដៃ​របស់​អ្នក និង​ការ​ធ្វើ​សមកាលកម្ម ទៅ​ឯកសារ​មួយ ។
+Comment[lt]=Šis kanalas įrašo informaciją apie delninuką ir sinchronizavimą į bylą.
+Comment[ms]=Saluran ini menulis maklumat tentang komputer telapak dan segerakan ke fail.
+Comment[nb]=Denne kanalen skriver informasjon om PDA-en og synkroniseringen til en fil.
+Comment[nds]=De Kanaal schrifft Informatschonen över den Handreekner un de Synkroniseren na en Datei.
+Comment[ne]=यो कन्ड्युटले ह्यान्डहेल्ड बारेमा सूचना लेख्दछ र फाइलमा सिन्क गर्दछ ।
+Comment[nl]=Dit conduit slaat informatie over uw handheld en de synchronisatie op in een bestand.
+Comment[nn]=Denne koplinga skriv informasjon om den handheldte eininga di og synkroniseringa til ei fil.
+Comment[pl]=Ten łącznik zapisuje informacje o twoim palmtopie i przebiegu synchronizacji do pliku.
+Comment[pt]=Esta conduta escreve informações sobre o seu dispositivo e a sincronização para um ficheiro.
+Comment[pt_BR]=Este conduíte escreve informação sobre o seu handheld e a sincronização em um arquivo.
+Comment[ru]=Канал передачи системной информации с КПК и записи в файл.
+Comment[sk]=Táto spojka zobrazuje informácie o vašom prenosnom zariadení a ukladá ich do súboru.
+Comment[sl]=Ta veznik zapiše podatke o vašem ročnem računalniku in usklajevanju v datoteko.
+Comment[sr]=Овај провод записује информације о вашем ручном рачунару и синхронизује са фајлом.
+Comment[sr@Latn]=Ovaj provod zapisuje informacije o vašem ručnom računaru i sinhronizuje sa fajlom.
+Comment[sv]=Den här kanalen skriver information om handdatorn och synkroniseringen till en fil.
+Comment[ta]=இந்த காப்புக் குழாய் உங்கள் கையேட்டைப் பற்றிய தகவல்களையும் ஒத்திசைவையும் கோப்புக்கு எழுதுகிறது
+Comment[tg]=Канали таҳвили иттилооти системавӣ аз Pilot ва қайдкунӣ ба файл
+Comment[tr]=Bu bileşen, el bilgisayarınızın bilgilerini bir dosyaya yazar.
+Comment[uk]=Цей акведук записує інформацію про кишеньковий пристрій і синхронізацію у файл.
+Comment[zh_CN]=此管道写入您手持设备的信息,并同步至一文件。
+Comment[zh_TW]=此軟體將您的 handheld 資訊寫入檔案。
+Name=System Information
+Name[af]=Stelsel informasie
+Name[ar]=معلومات عن النظام
+Name[be]=Сыстэмная інфармацыя
+Name[bg]=Системна информация
+Name[br]=Titouroù diwar-benn ar reizhiad
+Name[bs]=Sistemske informacije
+Name[ca]=Sistema d'informació
+Name[cs]=Informace o systému
+Name[cy]=Gwybodaeth Gysawd
+Name[da]=Systeminformation
+Name[de]=System-Information
+Name[el]=Πληροφορίες συστήματος
+Name[eo]=Sisteminformoj
+Name[es]=Información del sistema
+Name[et]=Süsteemi info
+Name[eu]=Sistemaren informazioa
+Name[fa]=اطلاعات سیستم
+Name[fi]=Järjestelmätiedot
+Name[fr]=Informations sur le système
+Name[fy]=Systeemynformaasje
+Name[ga]=Faisnéis Córais
+Name[gl]=Información do Sistema
+Name[hi]=तंत्र जानकारी
+Name[hu]=Rendszerinformáció
+Name[is]=Kerfisupplýsingar
+Name[it]=Informazioni di sistema
+Name[ja]=システム情報
+Name[kk]=Жүйелік мәлімет
+Name[km]=ព័ត៌មាន​អំពី​ប្រព័ន្ធ
+Name[lt]=Sistemos informacija
+Name[mk]=Информации за системот
+Name[ms]=Maklumat Sistem
+Name[nb]=Systeminformasjon
+Name[nds]=Systeem-Informatschoon
+Name[ne]=प्रणाली सूचना
+Name[nl]=Systeeminformatie
+Name[nn]=Systeminformasjon
+Name[pl]=Informacja systemowa
+Name[pt]=Informação do Sistema
+Name[pt_BR]=Informação do Sistema
+Name[ro]=Informaţii de sistem
+Name[ru]=Информация о системе
+Name[se]=Vuogádatdieđut
+Name[sk]=Informácie o systéme
+Name[sl]=Sistemske informacije
+Name[sr]=Информације о систему
+Name[sr@Latn]=Informacije o sistemu
+Name[sv]=Systeminformation
+Name[ta]=அமைப்பு தகவல்
+Name[tg]=Иттилоот дар бораи система
+Name[tr]=Sistem Bilgisi
+Name[uk]=Системна інформація
+Name[uz]=Тизим ҳақида маълумот
+Name[zh_CN]=系统信息
+Name[zh_TW]=系統資訊
+Implemented=file
+ServiceTypes=KPilotConduit
+X-KDE-Library=conduit_sysinfo
diff --git a/conduits/sysinfoconduit/sysinfoconduit.kcfg b/conduits/sysinfoconduit/sysinfoconduit.kcfg
new file mode 100644
index 0000000..20d8cc2
--- /dev/null
+++ b/conduits/sysinfoconduit/sysinfoconduit.kcfg
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <kcfgfile name="kpilot_sysinfoconduitrc"/>
+ <group name="General">
+ <entry name="OutputFile" key="Output file" type="Path">
+ <default>$HOME/kpilot-syslog.html</default>
+ </entry>
+ <entry name="OutputFormat" key="Output format" type="Enum">
+ <choices>
+ <choice name="eSysInfoHTML"/>
+ <choice name="eSysInfoText"/>
+ <choice name="eSysInfoTemplate"/>
+ </choices>
+ <default>eSysInfoHTML</default>
+ </entry>
+ <entry name="TemplateFile" key="Template file" type="Path">
+ <default></default>
+ </entry>
+ <entry name="DebugInformation" key="Debug Information" type="Bool">
+ <label>Debug information (for KPilot developers)</label>
+ <default>true</default>
+ </entry>
+ <entry name="HardwareInfo" key="Hardware Info" type="Bool">
+ <label>Hardware information</label>
+ <default>true</default>
+ </entry>
+ <entry name="DatabaseList" key="Database List" type="Bool">
+ <label>List of databases on handheld (takes long!)</label>
+ <default>true</default>
+ </entry>
+ <entry name="MemoryInfo" key="Memory Info" type="Bool">
+ <label>Memory information</label>
+ <default>true</default>
+ </entry>
+ <entry name="RecordNumbers" key="Record Numbers" type="Bool">
+ <label>Number of addresses, todos, events and memos</label>
+ <default>true</default>
+ </entry>
+ <entry name="PalmOSVersion" key="PalmOS Version" type="Bool">
+ <label>PalmOS version</label>
+ <default>true</default>
+ </entry>
+ <entry name="StorageInfo" key="Storage Info" type="Bool">
+ <label>Storage info (SD card, memory stick, ...)</label>
+ <default>true</default>
+ </entry>
+ <entry name="SyncInfo" key="Sync Info" type="Bool">
+ <label>Synchronization information</label>
+ <default>true</default>
+ </entry>
+ <entry name="UserInfo" key="User Info" type="Bool">
+ <label>User information</label>
+ <default>true</default>
+ </entry>
+ <entry name="KDEVersion" key="KDE Version" type="Bool">
+ <label>Version of KPilot, pilot-link and KDE</label>
+ <default>true</default>
+ </entry>
+ </group>
+
+</kcfg>