diff options
Diffstat (limited to 'conduits/malconduit/mal-conduit.cpp')
-rw-r--r-- | conduits/malconduit/mal-conduit.cpp | 319 |
1 files changed, 319 insertions, 0 deletions
diff --git a/conduits/malconduit/mal-conduit.cpp b/conduits/malconduit/mal-conduit.cpp new file mode 100644 index 0000000..cddf09f --- /dev/null +++ b/conduits/malconduit/mal-conduit.cpp @@ -0,0 +1,319 @@ +/* +** MAL conduit for KPilot +** +** Copyright (C) 2002 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. +** +** +** Specific permission is granted for this code to be linked to libmal +** (this is necessary because the libmal license is not GPL-compatible). +*/ + +/* +** Bug reports and questions can be sent to kde-pim@kde.org +*/ + + + + +#include "options.h" + +#include <tqregexp.h> +#include <tdeconfig.h> +#include <kdebug.h> + +#include "mal-factory.h" +#include "mal-conduit.moc" +#include <libmal.h> +#include "malconduitSettings.h" + + +static MALConduit *conduitInstance=0L; + +int malconduit_logf(const char *, ...) __attribute__ ((format (printf, 1, 2))); + +int malconduit_logf(const char *format, ...) +{ + FUNCTIONSETUP; + va_list val; + int rval; + va_start(val, format); +#define WRITE_MAX_BUF 4096 + char msg[WRITE_MAX_BUF]; + msg[0]='\0'; + rval=vsnprintf(&msg[0], sizeof(msg), format, val); + va_end(val); + if (rval == -1) { + msg[WRITE_MAX_BUF-1] = '\0'; + rval=WRITE_MAX_BUF-1; + } + if (conduitInstance) + { + conduitInstance->printLogMessage(msg); + } + else + { + // write out to stderr + WARNINGKPILOT<< msg << endl; + } + return rval; +} + +#ifndef LIBMAL20 +int32 cbTask (void * /*out*/, + int32 * /*returnErrorCode*/, + char *currentTask, + AGBool /*bufferable*/) +{ + if (currentTask) { + malconduit_logf ("%s\n", currentTask); + } + + return AGCLIENT_CONTINUE; +} + +static int32 cbItem (void */*out*/, + int32 * /*returnErrorCode*/, + int32 /*currentItemNumber*/, + int32 /*totalItemCount*/, + char * /*currentItem*/) +{ +// The log widget only supports writing out whole lines. You just can't add a single character +// to the last line. Thus I completely remove the pseudo-percentbar. +/* malconduit_logf ("."); + + if (currentItemNumber == totalItemCount) { + malconduit_logf ("\n"); + } +*/ + return AGCLIENT_CONTINUE; +} +#endif + + +MALConduit::MALConduit(KPilotLink * o, + const char *n, + const TQStringList & a) : + ConduitAction(o, n, a) +{ + FUNCTIONSETUP; +#ifdef LIBMAL20 + register_prinStatusHook(malconduit_logf); + register_printErrorHook(malconduit_logf); +#endif + conduitInstance=this; + fConduitName=i18n("MAL"); +} + + + +MALConduit::~MALConduit() +{ + FUNCTIONSETUP; +} + + + +void MALConduit::readConfig() +{ + FUNCTIONSETUP; + MALConduitSettings::self()->readConfig(); +#ifdef DEBUG + DEBUGKPILOT<<"Last sync was "<<MALConduitSettings::lastMALSync().toString()<<endl; +#endif +} + + + +void MALConduit::saveConfig() +{ + FUNCTIONSETUP; + MALConduitSettings::setLastMALSync( TQDateTime::currentDateTime() ); + MALConduitSettings::self()->writeConfig(); +} + + + +bool MALConduit::skip() +{ + TQDateTime now=TQDateTime::currentDateTime(); + TQDateTime lastSync=MALConduitSettings::lastMALSync(); + + if (!lastSync.isValid() || !now.isValid()) return false; + + switch ( MALConduitSettings::syncFrequency() ) + { + case MALConduitSettings::eEveryHour: + if ( (lastSync.secsTo(now)<=3600) && (lastSync.time().hour()==now.time().hour()) ) return true; + else return false; + case MALConduitSettings::eEveryDay: + if ( lastSync.date() == now.date() ) return true; + else return false; + case MALConduitSettings::eEveryWeek: + if ( (lastSync.daysTo(now)<=7) && ( lastSync.date().dayOfWeek()<=now.date().dayOfWeek()) ) return true; + else return false; + case MALConduitSettings::eEveryMonth: + if ( (lastSync.daysTo(now)<=31) && (lastSync.date().month()==now.date().month()) ) return true; + else return false; + case MALConduitSettings::eEverySync: + default: + return false; + } + return false; +} + + + +/* virtual */ bool MALConduit::exec() +{ + FUNCTIONSETUP; + + readConfig(); + + // TODO: set the log/error message hooks of libmal here!!! + + if (skip()) + { + emit logMessage(i18n("Skipping MAL sync, because last synchronization was not long enough ago.")); + emit syncDone(this); + return true; + } + + // Now initiate the sync. + PalmSyncInfo* pInfo=syncInfoNew(); + if (!pInfo) { + WARNINGKPILOT << "Could not allocate SyncInfo!" << endl; + emit logError(i18n("MAL synchronization failed (no SyncInfo).")); + return false; + } + + TQString proxyServer( MALConduitSettings::proxyServer() ); + int proxyPort( MALConduitSettings::proxyPort() ); + TQString syncMessage; + bool canContinue = true; + // Set all proxy settings + switch (MALConduitSettings::proxyType()) + { + case MALConduitSettings::eProxyHTTP: + if (proxyServer.isEmpty()) + { + canContinue = false; + syncMessage = i18n("No proxy server is set."); + break; + } + syncMessage = i18n("Using proxy server: %1").arg(proxyServer); + +#ifdef DEBUG + DEBUGKPILOT<<" Using HTTP proxy server \""<<proxyServer<< + "\", Port "<<proxyPort<<", User "<<MALConduitSettings::proxyUser()<< + ", Password "<<( (MALConduitSettings::proxyPassword().isEmpty())?TQString("not "):TQString())<<"set" + <<endl; +#endif +#ifdef LIBMAL20 + setHttpProxy(const_cast<char *>(proxyServer.latin1())); + if (proxyPort>0 && proxyPort<65536) setHttpProxyPort( proxyPort ); + else setHttpProxyPort(80); +#else + pInfo->httpProxy = new char[ proxyServer.length() + 1 ]; + strlcpy( pInfo->httpProxy, proxyServer.latin1(), proxyServer.length() + 1); + if (proxyPort>0 && proxyPort<65536) pInfo->httpProxyPort = proxyPort; + else pInfo->httpProxyPort = 80; +#endif + + if (!MALConduitSettings::proxyUser().isEmpty()) + { +#ifdef LIBMAL20 + setProxyUsername( const_cast<char *>(MALConduitSettings::proxyUser().latin1()) ); + if (!MALConduitSettings::proxyPassword().isEmpty()) setProxyPassword( const_cast<char *>(MALConduitSettings::proxyPassword().latin1()) ); +#else + pInfo->proxyUsername = new char[ MALConduitSettings::proxyUser().length() + 1 ]; + strlcpy( pInfo->proxyUsername, MALConduitSettings::proxyUser().latin1(), MALConduitSettings::proxyUser().length() + 1); + if (!MALConduitSettings::proxyPassword().isEmpty()) { +// pInfo->proxyPassword = MALConduitSettings::proxyPassword().latin1(); + pInfo->proxyPassword = new char[ MALConduitSettings::proxyPassword().length() + 1 ]; + strlcpy( pInfo->proxyPassword, MALConduitSettings::proxyPassword().latin1(), MALConduitSettings::proxyPassword().length() + 1); + } +#endif + } + break; + case MALConduitSettings::eProxySOCKS: + if (proxyServer.isEmpty()) + { + canContinue = false; + syncMessage = i18n("No SOCKS proxy is set."); + break; + } + syncMessage = i18n("Using SOCKS proxy: %1").arg(proxyServer); +#ifdef DEBUG + DEBUGKPILOT<<" Using SOCKS proxy server \""<<proxyServer<<"\", Port "<<proxyPort<<", User "<<MALConduitSettings::proxyUser()<<", Password "<<( (MALConduitSettings::proxyPassword().isEmpty())?TQString("not "):TQString() )<<"set"<<endl; +#endif +#ifdef LIBMAL20 + setSocksProxy( const_cast<char *>(proxyServer.latin1()) ); + if (proxyPort>0 && proxyPort<65536) setSocksProxyPort( proxyPort ); + else setSocksProxyPort(1080); +#else +// pInfo->socksProxy = proxyServer.latin1(); + pInfo->socksProxy = new char[ proxyServer.length() + 1 ]; + strlcpy( pInfo->socksProxy, proxyServer.latin1(), proxyServer.length() + 1); + if (proxyPort>0 && proxyPort<65536) pInfo->socksProxyPort = proxyPort; + else pInfo->socksProxyPort = 1080; +#endif + break; + default: + break; + } + + logMessage(syncMessage); + + if (!canContinue) + { + return false; + } + +#ifdef LIBMAL20 + malsync( pilotSocket(), pInfo); +#else + pInfo->sd = pilotSocket(); + pInfo->taskFunc = cbTask; + pInfo->itemFunc = cbItem; + malsync( pInfo ); + delete[] pInfo->httpProxy; + delete[] pInfo->proxyUsername; + delete[] pInfo->proxyPassword; + delete[] pInfo->socksProxy; + syncInfoFree(pInfo); +#endif + + saveConfig(); + return delayDone(); +} + +void MALConduit::printLogMessage(TQString msg) +{ + FUNCTIONSETUP; + // Remove the pseudo-progressbar: + TQString newmsg(msg); + newmsg.replace( TQRegExp("^\\s*\\.*\\s*"), ""); + newmsg.replace( TQRegExp("\\s*\\.*\\s*$"), ""); + if (newmsg.length()>0) + { + emit logMessage(newmsg); + } +} + |