You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdepim/kpilot/lib/kpilotlink.cc

273 lines
5.5 KiB

/* KPilot
**
** Copyright (C) 1998-2001 by Dan Pilone
** Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
** Copyright (C) 2006-2007 Adriaan de Groot <groot@kde.org>
** Copyright (C) 2007 Jason 'vanRijn' Kasper <vR@movingparts.net>
**
*/
/*
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU Lesser General Public License as published by
** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser 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 <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <iostream>
#include <pi-source.h>
#include <pi-socket.h>
#include <pi-dlp.h>
#include <pi-file.h>
#include <pi-buffer.h>
#include <qdir.h>
#include <qtimer.h>
#include <qdatetime.h>
#include <qthread.h>
#include <kconfig.h>
#include <kmessagebox.h>
#include <kstandarddirs.h>
#include <kurl.h>
#include <kio/netaccess.h>
#include "pilotUser.h"
#include "pilotSysInfo.h"
#include "pilotCard.h"
#include "pilotSerialDatabase.h"
#include "pilotLocalDatabase.h"
#include "kpilotlink.moc"
/** Class that handles periodically tickling the handheld through
* the virtual tickle() method; deals with cancels through the
* shared fDone variable.
*/
class TickleThread : public QThread
{
public:
TickleThread(KPilotLink *d, bool *done, int timeout) :
QThread(),
fHandle(d),
fDone(done),
fTimeout(timeout)
{ };
virtual ~TickleThread();
virtual void run();
static const int ChecksPerSecond = 5;
static const int SecondsPerTickle = 5;
private:
KPilotLink *fHandle;
bool *fDone;
int fTimeout;
} ;
TickleThread::~TickleThread()
{
}
void TickleThread::run()
{
FUNCTIONSETUP;
int subseconds = ChecksPerSecond;
int ticktock = SecondsPerTickle;
int timeout = fTimeout;
DEBUGKPILOT << fname << ": Running for "
<< timeout << " seconds." << endl;
DEBUGKPILOT << fname << ": Done @" << (void *) fDone << endl;
while (!(*fDone))
{
QThread::msleep(1000/ChecksPerSecond);
if (!(--subseconds))
{
if (timeout)
{
if (!(--timeout))
{
QApplication::postEvent(fHandle, new QEvent(static_cast<QEvent::Type>(KPilotLink::EventTickleTimeout)));
break;
}
}
subseconds=ChecksPerSecond;
if (!(--ticktock))
{
ticktock=SecondsPerTickle;
fHandle->tickle();
}
}
}
}
KPilotLink::KPilotLink( QObject *parent, const char *name ) :
QObject( parent, name ),
fPilotPath(QString::null),
fPilotUser(0L),
fPilotSysInfo(0L),
fTickleDone(true),
fTickleThread(0L)
{
FUNCTIONSETUP;
fPilotUser = new KPilotUser();
strncpy( fPilotUser->data()->username, "Henk Westbroek",
sizeof(fPilotUser->data()->username)-1);
fPilotUser->setLastSuccessfulSyncDate( 1139171019 );
fPilotSysInfo = new KPilotSysInfo();
memset(fPilotSysInfo->sysInfo()->prodID, 0,
sizeof(fPilotSysInfo->sysInfo()->prodID));
strncpy(fPilotSysInfo->sysInfo()->prodID, "LocalLink",
sizeof(fPilotSysInfo->sysInfo()->prodID)-1);
fPilotSysInfo->sysInfo()->prodIDLength =
strlen(fPilotSysInfo->sysInfo()->prodID);
}
KPilotLink::~KPilotLink()
{
FUNCTIONSETUP;
KPILOT_DELETE(fPilotUser);
KPILOT_DELETE(fPilotSysInfo);
}
/* virtual */ bool KPilotLink::event(QEvent *e)
{
if ((int)e->type() == EventTickleTimeout)
{
stopTickle();
emit timeout();
return true;
}
else return QObject::event(e);
}
/*
Start a tickle thread with the indicated timeout.
*/
void KPilotLink::startTickle(unsigned int timeout)
{
FUNCTIONSETUP;
Q_ASSERT(fTickleDone);
/*
** We've told the thread to finish up, but it hasn't
** done so yet - so wait for it to do so, should be
** only 200ms at most.
*/
if (fTickleDone && fTickleThread)
{
fTickleThread->wait();
KPILOT_DELETE(fTickleThread);
}
DEBUGKPILOT << fname << ": Done @" << (void *) (&fTickleDone) << endl;
fTickleDone = false;
fTickleThread = new TickleThread(this,&fTickleDone,timeout);
fTickleThread->start();
}
void KPilotLink::stopTickle()
{
FUNCTIONSETUP;
fTickleDone = true;
if (fTickleThread)
{
fTickleThread->wait();
KPILOT_DELETE(fTickleThread);
}
}
unsigned int KPilotLink::installFiles(const QStringList & l, const bool deleteFiles)
{
FUNCTIONSETUP;
QStringList::ConstIterator i,e;
unsigned int k = 0;
unsigned int n = 0;
unsigned int total = l.count();
for (i = l.begin(), e = l.end(); i != e; ++i)
{
emit logProgress(QString::null,
(int) ((100.0 / total) * (float) n));
if (installFile(*i, deleteFiles))
k++;
n++;
}
emit logProgress(QString::null, 100);
return k;
}
void KPilotLink::addSyncLogEntry(const QString & entry, bool log)
{
FUNCTIONSETUP;
if (entry.isEmpty()) return;
addSyncLogEntryImpl(entry);
if (log)
{
emit logMessage(entry);
}
}
/* virtual */ int KPilotLink::openConduit()
{
return 0;
}
/* virtual */ int KPilotLink::pilotSocket() const
{
return -1;
}
/* virtual */ PilotDatabase *KPilotLink::database( const DBInfo *info )
{
FUNCTIONSETUP;
return database( Pilot::fromPilot( info->name ) );
}