kpilot Library API Documentation

mal-conduit.cc

00001 /*
00002 ** MAL-conduit.cc
00003 **
00004 ** Copyright (C) 2002 by Reinhold Kainhofer
00005 */
00006 
00007 /*
00008 ** This program is free software; you can redistribute it and/or modify
00009 ** it under the terms of the GNU General Public License as published by
00010 ** the Free Software Foundation; either version 2 of the License, or
00011 ** (at your option) any later version.
00012 **
00013 ** This program is distributed in the hope that it will be useful,
00014 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00016 ** GNU General Public License for more details.
00017 **
00018 ** You should have received a copy of the GNU General Public License
00019 ** along with this program in a file called COPYING; if not, write to
00020 ** the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
00021 ** MA 02111-1307, USA.
00022 **
00023 **
00024 ** Specific permission is granted for this code to be linked to libmal
00025 ** (this is necessary because the libmal license is not GPL-compatible).
00026 */
00027  
00028 /*
00029 ** Bug reports and questions can be sent to kde-pim@kde.org
00030 */
00031  
00032 
00033 
00034 
00035 #include "options.h"
00036 
00037 #include <qregexp.h>
00038 #include <kconfig.h>
00039 #include <kdebug.h>
00040 
00041 #include "mal-factory.h"
00042 #include "mal-conduit.moc"
00043 #include <libmal.h>
00044 
00045 
00046 // Something to allow us to check what revision
00047 // the modules are that make up a binary distribution.
00048 const char *MAL_conduit_id =
00049     "$Id: mal-conduit.cc,v 1.17 2003/10/13 13:43:38 kainhofe Exp $";
00050 
00051 
00052 static MALConduit *conduitInstance=0L;
00053 
00054 int malconduit_logf(const char *, ...) __attribute__ ((format (printf, 1, 2)));
00055 
00056 int malconduit_logf(const char *format, ...)
00057 {
00058     FUNCTIONSETUP;
00059     va_list val;
00060     int rval;
00061     va_start(val, format);
00062 #define WRITE_MAX_BUF   4096
00063     char msg[WRITE_MAX_BUF];
00064     msg[0]='\0';
00065     rval=vsnprintf(&msg[0], sizeof(msg), format, val);
00066     va_end(val);
00067     if (rval == -1) {
00068         msg[WRITE_MAX_BUF-1] = '\0';
00069         rval=WRITE_MAX_BUF-1;
00070     }
00071     if (conduitInstance)
00072     {
00073         conduitInstance->printLogMessage(msg);
00074     }
00075     else
00076     {
00077         // write out to stderr
00078         kdWarning()<<msg<<endl;
00079     }
00080     return rval;
00081 }
00082  
00083  
00084 MALConduit::MALConduit(KPilotDeviceLink * o,
00085     const char *n, 
00086     const QStringList & a) :
00087     ConduitAction(o, n, a)
00088 {
00089     FUNCTIONSETUP;
00090 #ifdef LIBMAL20
00091     register_printStatusHook(malconduit_logf);
00092     register_printErrorHook(malconduit_logf);
00093 #endif
00094     conduitInstance=this;
00095 #ifdef DEBUG
00096     DEBUGCONDUIT<<MAL_conduit_id<<endl;
00097 #endif
00098     fConduitName=i18n("MAL");
00099 }
00100 
00101 
00102 
00103 MALConduit::~MALConduit()
00104 {
00105     FUNCTIONSETUP;
00106 }
00107 
00108 
00109 
00110 void MALConduit::readConfig()
00111 {
00112     FUNCTIONSETUP;
00113     QDateTime dt;
00114     KConfigGroupSaver g(fConfig, MALConduitFactory::group());
00115     fLastSync = fConfig->readDateTimeEntry(MALConduitFactory::lastSync(), &dt);
00116 #ifdef DEBUG
00117     DEBUGCONDUIT<<"Last sync was "<<fLastSync.toString()<<endl;
00118 #endif
00119     
00120     eSyncTime=(eSyncTimeEnum) fConfig->readNumEntry(MALConduitFactory::syncTime(), (int) eEverySync );
00121     
00122     // Proxy settings
00123     eProxyType=(eProxyTypeEnum) fConfig->readNumEntry(MALConduitFactory::proxyType(), (int) eProxyNone );
00124     fProxyServer=fConfig->readEntry(MALConduitFactory::proxyServer());
00125     
00126     fProxyPort=fConfig->readNumEntry(MALConduitFactory::proxyPort(), 0);
00127     fProxyUser=fConfig->readEntry(MALConduitFactory::proxyUser());
00128     fProxyPassword=fConfig->readEntry(MALConduitFactory::proxyPassword());
00129 
00130     // MAL Server settings (not yet possible!!!)
00131     fMALServer=fConfig->readEntry(MALConduitFactory::malServer(), "sync.avantgo.com");
00132     fMALPort=fConfig->readNumEntry(MALConduitFactory::malPort(), 0);
00133     
00134     fMALUser=fConfig->readEntry(MALConduitFactory::malUser());
00135     fMALPassword=fConfig->readEntry(MALConduitFactory::malPassword());
00136 }
00137 
00138 
00139 
00140 void MALConduit::saveConfig()
00141 {
00142     FUNCTIONSETUP;
00143     KConfigGroupSaver g(fConfig, MALConduitFactory::group());
00144     
00145     fConfig->writeEntry(MALConduitFactory::lastSync(), QDateTime::currentDateTime());
00146 }
00147 
00148 
00149 
00150 bool MALConduit::skip() 
00151 {
00152     QDateTime now=QDateTime::currentDateTime();
00153     if (!fLastSync.isValid() || !now.isValid()) return false;
00154     
00155     switch (eSyncTime) 
00156     {
00157         case eEveryHour:
00158             if ( (fLastSync.secsTo(now)<=3600) && (fLastSync.time().hour()==now.time().hour()) ) return true;
00159             else return false;
00160         case eEveryDay:
00161             if ( fLastSync.date() == now.date() ) return true;
00162             else return false;
00163         case eEveryWeek:
00164             if ( (fLastSync.daysTo(now)<=7)  && ( fLastSync.date().dayOfWeek()<=now.date().dayOfWeek()) ) return true;
00165             else return false;
00166         case eEveryMonth:
00167             if ( (fLastSync.daysTo(now)<=31) && (fLastSync.date().month()==now.date().month()) ) return true;
00168             else return false;
00169         case eEverySync:
00170         default:
00171             return false;
00172     }
00173     return false;
00174 }
00175 
00176 
00177 
00178 /* virtual */ bool MALConduit::exec()
00179 {
00180     FUNCTIONSETUP;
00181     DEBUGCONDUIT<<MAL_conduit_id<<endl;
00182 
00183     if (!fConfig)
00184     {
00185         kdWarning() << k_funcinfo << ": No config file was set!" << endl;
00186         return false;
00187     }
00188 
00189     readConfig();
00190     
00191     // TODO: set the log/error message hooks of libmal here!!!
00192 
00193     if (skip()) 
00194     {
00195         emit logMessage(i18n("Skipping MAL sync, because last synchronization was not long enough ago."));
00196         emit syncDone(this);
00197         return true;
00198     }
00199     
00200     
00201     // Now initiate the sync.
00202     PalmSyncInfo* pInfo=syncInfoNew();
00203     if (!pInfo) {
00204         kdWarning() << k_funcinfo << ": Could not allocate SyncInfo!" << endl;
00205         emit logError(i18n("MAL synchronization failed (no SyncInfo)."));
00206         return false;
00207     }
00208 
00209     // Set all proxy settings
00210     switch (eProxyType) 
00211     {
00212         case eProxyHTTP:
00213             if (fProxyServer.isEmpty()) break;
00214 #ifdef DEBUG
00215             DEBUGCONDUIT<<" Using HTTP proxy server \""<<fProxyServer<<"\", Port "<<fProxyPort<<", User "<<fProxyUser<<", Password "<<( (fProxyPassword.isEmpty())?QString("not "):QString())<<"set"<<endl;
00216 #endif
00217 #ifdef LIBMAL20
00218             setHttpProxy(const_cast<char *>(fProxyServer.latin1()));
00219             if (fProxyPort>0 && fProxyPort<65536) setHttpProxyPort( fProxyPort );
00220             else setHttpProxyPort(80);
00221 #else
00222             pInfo->httpProxy = new char[ fProxyServer.length() + 1 ];
00223             strncpy( pInfo->httpProxy, fProxyServer.latin1(), fProxyServer.length() );
00224             if (fProxyPort>0 && fProxyPort<65536) pInfo->httpProxyPort = fProxyPort;
00225             else pInfo->httpProxyPort = 80;
00226 #endif
00227             
00228             if (!fProxyUser.isEmpty()) 
00229             {
00230 #ifdef LIBMAL20
00231                 setProxyUsername( const_cast<char *>(fProxyUser.latin1()) );
00232                 if (!fProxyPassword.isEmpty()) setProxyPassword( const_cast<char *>(fProxyPassword.latin1()) );
00233 #else
00234                 pInfo->proxyUsername = new char[ fProxyUser.length() + 1 ];
00235                 strncpy( pInfo->proxyUsername, fProxyUser.latin1(), fProxyUser.length() );
00236 //              pInfo->proxyUsername = fProxyUser.latin1();
00237                 if (!fProxyPassword.isEmpty()) {
00238 //                      pInfo->proxyPassword = fProxyPassword.latin1();
00239                     pInfo->proxyPassword = new char[ fProxyPassword.length() + 1 ];
00240                     strncpy( pInfo->proxyPassword, fProxyPassword.latin1(), fProxyPassword.length() );
00241                 }
00242 #endif
00243             }
00244             break;
00245         case eProxySOCKS:
00246 #ifdef DEBUG
00247             DEBUGCONDUIT<<" Using SOCKS proxy server \""<<fProxyServer<<"\",  Port "<<fProxyPort<<", User "<<fProxyUser<<", Password "<<( (fProxyPassword.isEmpty())?QString("not "):QString() )<<"set"<<endl;
00248 #endif
00249 #ifdef LIBMAL20
00250             setSocksProxy( const_cast<char *>(fProxyServer.latin1()) );
00251             if (fProxyPort>0 && fProxyPort<65536) setSocksProxyPort( fProxyPort );
00252             else setSocksProxyPort(1080);
00253 #else
00254 //          pInfo->socksProxy = fProxyServer.latin1();
00255             pInfo->socksProxy = new char[ fProxyServer.length() + 1 ];
00256             strncpy( pInfo->socksProxy, fProxyServer.latin1(), fProxyServer.length() );
00257             if (fProxyPort>0 && fProxyPort<65536) pInfo->socksProxyPort = fProxyPort;
00258             else pInfo->socksProxyPort = 1080;
00259 #endif
00260             break; 
00261         default:
00262             break;
00263     }
00264 
00265 #ifdef LIBMAL20
00266     malsync( pilotSocket(), pInfo);
00267 #else
00268 // TODO:
00269 //  register_printStatusHook(malconduit_logf);
00270 //  register_printErrorHook(malconduit_logf);
00271 
00272     pInfo->pilot_rHandle = pilotSocket();
00273     delete[] pInfo->httpProxy;
00274     delete[] pInfo->proxyUsername;
00275     delete[] pInfo->proxyPassword;
00276     delete[] pInfo->socksProxy;
00277     syncInfoFree(pInfo);
00278 #endif
00279 
00280     saveConfig();
00281     emit syncDone(this);
00282     return true;
00283 }
00284 
00285 void MALConduit::printLogMessage(QString msg)
00286 {
00287     FUNCTIONSETUP;
00288     // Remove the pseudo-progressbar:
00289     QString newmsg(msg);
00290     newmsg.replace( QRegExp("^\\s*\\.*\\s*"), "");
00291     newmsg.replace( QRegExp("\\s*\\.*\\s*$"), "");
00292     if (newmsg.length()>0)
00293     {
00294         emit logMessage(newmsg);
00295     }
00296 }
00297 
KDE Logo
This file is part of the documentation for kpilot Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat May 1 11:36:48 2004 by doxygen 1.2.15 written by Dimitri van Heesch, © 1997-2003