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/kpilot/main-test.cc

438 lines
10 KiB

/* KPilot
**
** Copyright (C) 2001 by Dan Pilone
** Copyright (C) 2001,2002,2003,2004 by Adriaan de Groot
**
** This is the main program for kpilotTest, which shows a SyncLog and
** exercises the KPilotDeviceLink class. It's intended to test if the
** Palm hardware and the KPilot software are functioning correctly to
** some extent.
*/
/*
** 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 <stdlib.h>
#include <time.h>
#include <iostream>
#include <tqpushbutton.h>
#include <tqhbox.h>
#include <tqtimer.h>
#include <kapplication.h>
#include <klocale.h>
#include <kaboutdata.h>
#include <kcmdlineargs.h>
#include <kservice.h>
#include <kservicetype.h>
#include <kuserprofile.h>
#include <pi-version.h>
#include "actionQueue.h"
#include "actions.h"
#include "kpilotdevicelink.h"
#include "kpilotlocallink.h"
#include "pilot.h"
#include "kpilotConfig.h"
#include "hotSync.h"
static KCmdLineOptions generalOptions[] = {
{"p",0,0},
{"port <device>",
I18N_NOOP("Path to Pilot device node"),
"/dev/pilot"},
{"l",0,0},
{"list", I18N_NOOP("List DBs"), 0},
{"b",0,0},
{"backup <dest dir>", I18N_NOOP("Backup Pilot to <dest dir>"), 0},
{"r",0,0},
{"restore <src dir>", I18N_NOOP("Restore Pilot from backup"), 0},
{"e",0,0},
{ "exec <filename>",
I18N_NOOP("Run conduit from desktop file <filename>"),
0 },
{"c",0,0},
{ "check <what>",
I18N_NOOP("Run a specific check (with the device)"), "help"},
{"s",0,0},
{ "show <what>",
I18N_NOOP("Show KPilot configuration information"), "help"},
#ifdef DEBUG
{ "debug <level>",
I18N_NOOP("Set the debug level"), "1" },
#endif
KCmdLineLastOption
} ;
static KCmdLineOptions conduitOptions[] = {
{ "T",0,0},
{ "notest",
I18N_NOOP("*Really* run the conduit, not in test mode."),
0 } ,
{ "F",0,0},
{ "local",
I18N_NOOP("Run the conduit in file-test mode."),
0 } ,
{ "HHtoPC",
I18N_NOOP("Copy Pilot to Desktop."),
0 } ,
{ "PCtoHH",
I18N_NOOP("Copy Desktop to Pilot."),
0 } ,
{ "loop",
I18N_NOOP("Repeated perform action - only useful for --list"),
0 } ,
KCmdLineLastOption
} ;
/**
*** Conduits - sync actions - for testing specific scenarios.
**/
KPilotLink *createLink( bool local )
{
FUNCTIONSETUP;
if (!local)
{
return new KPilotDeviceLink(0, "deviceLink");
}
else
{
return new KPilotLocalLink(0, "localLink");
}
}
/** If @p loop is true, then instead of quitting at end of
* sync, wait for a new sync just like the real daemon does.
*/
void connectStack( KPilotLink *l, ActionQueue *a, bool loop = false )
{
FUNCTIONSETUP;
if (l && a)
{
TQObject::connect(a, TQT_SIGNAL(syncDone(SyncAction *)),
l, TQT_SLOT(close()));
if (!loop)
{
TQObject::connect(a, TQT_SIGNAL(syncDone(SyncAction *)),
kapp, TQT_SLOT(quit()));
}
else
{
TQObject::connect(a, TQT_SIGNAL(syncDone(SyncAction *)),
l, TQT_SLOT(reset()));
}
TQObject::connect(l, TQT_SIGNAL(deviceReady(KPilotLink*)),
a, TQT_SLOT(execConduit()));
}
}
int exec(const TQString &device, const TQString &what, KCmdLineArgs *p)
{
FUNCTIONSETUP;
// get --exec-conduit value
if (what.isEmpty()) return 1;
TQStringList l;
l.append(what);
SyncAction::SyncMode::Mode syncMode = SyncAction::SyncMode::eHotSync;
if (p->isSet("HHtoPC")) syncMode = SyncAction::SyncMode::eCopyHHToPC;
if (p->isSet("PCtoHH")) syncMode = SyncAction::SyncMode::eCopyPCToHH;
SyncAction::SyncMode mode(syncMode,p->isSet("test"),p->isSet("local"));
KPilotLink *link = createLink( p->isSet("local") );
ActionQueue *syncStack = new ActionQueue( link );
syncStack->queueInit();
syncStack->addAction(new CheckUser( link ));
syncStack->queueConduits(l,mode);
syncStack->queueCleanup();
connectStack(link,syncStack);
link->reset(device);
return kapp->exec();
}
int backup(const TQString &device, const TQString &what, KCmdLineArgs *p)
{
FUNCTIONSETUP;
KPilotLink *link = createLink( p->isSet("local") );
ActionQueue *syncStack = new ActionQueue( link );
syncStack->queueInit();
BackupAction *ba = new BackupAction( link, true /* full backup */ );
ba->setDirectory( what );
syncStack->addAction( ba );
syncStack->queueCleanup();
connectStack(link,syncStack);
link->reset(device);
return kapp->exec();
}
int restore(const TQString &device, const TQString &what, KCmdLineArgs *p)
{
FUNCTIONSETUP;
KPilotLink *link = createLink( p->isSet("local") );
ActionQueue *syncStack = new ActionQueue( link );
syncStack->queueInit();
RestoreAction *ra = new RestoreAction( link );
ra->setDirectory( what );
syncStack->addAction( ra );
syncStack->queueCleanup();
connectStack(link,syncStack);
link->reset(device);
return kapp->exec();
}
int listDB(const TQString &device, KCmdLineArgs *p)
{
FUNCTIONSETUP;
KPilotLink *link = createLink( p->isSet("local") );
ActionQueue *syncStack = new ActionQueue( link );
syncStack->queueInit();
syncStack->addAction( new TestLink( link ) );
syncStack->queueCleanup();
connectStack(link,syncStack, p->isSet("loop") );
link->reset(device);
return kapp->exec();
}
int check( const TQString &device, const TQString &what, KCmdLineArgs *p )
{
FUNCTIONSETUP;
if ( "help" == what )
{
std::cout <<
"You can use the --check option to kpilotTest to run various\n"
"small checks that require the use of the device. These are:\n"
"\thelp - show this help\n"
"\tuser - check the user name on the handheld\n"
<< std::endl;
return 0;
}
if ( "user" == what )
{
KPilotLink *link = createLink( p->isSet("local") );
ActionQueue *syncStack = new ActionQueue( link );
syncStack->queueInit();
syncStack->addAction( new CheckUser( link ) );
syncStack->queueCleanup();
connectStack(link,syncStack);
link->reset(device);
return kapp->exec();
}
return 0;
}
void listConduits()
{
FUNCTIONSETUP;
KServiceTypeProfile::OfferList offers =
KServiceTypeProfile::offers(CSL1("KPilotConduit"));
// Now actually fill the two list boxes, just make
// sure that nothing gets listed in both.
//
//
TQValueListIterator < KServiceOffer > availList(offers.begin());
while (availList != offers.end())
{
KSharedPtr < KService > o = (*availList).service();
std::cout << "File: " << o->desktopEntryName() << std::endl;
std::cout << " Desc: " << o->name() << std::endl;
if (!o->library().isEmpty())
{
std::cout << " Lib : "
<< o->library()
<< std::endl;
}
++availList;
}
}
int show( const TQString &what )
{
FUNCTIONSETUP;
if ( "help" == what )
{
std::cout <<
"Displays various bits of KPilot's internal settings. This\n"
"does not require a device connection or a running KDE desktop.\n"
"No change to data takes place. The following options are available\n"
"for display:\n"
"\thelp - displays this help\n"
"\tconduits - displays the list of available conduits\n"
"\tuser - displays the user name KPilot expects\n"
"\tdevice - displays the device settings in KPilot\n"
"\tdebug - displays internal numbers\n"
<< std::endl;
return 0;
}
if ( "conduits" == what )
{
listConduits();
return 0;
}
if ( "user" == what )
{
std::cout << "User: " << KPilotSettings::userName() << std::endl;
return 0;
}
if ( "device" == what )
{
std::cout << "Device: " << KPilotSettings::pilotDevice()
<< "\nSpeed: " << KPilotSettings::pilotSpeed()
<< "\nEncoding: " << KPilotSettings::encoding()
<< "\nQuirks: " << KPilotSettings::workarounds()
<< std::endl;
return 0;
}
if ( "debug" == what )
{
std::cout << "Debug: " << KPilotSettings::debug()
<< "\nConfig: " << KPilotSettings::configVersion()
<< std::endl;
return 0;
}
std::cerr << "Unknown --show argument, use --show help for help.\n";
return 1;
}
int main(int argc, char **argv)
{
#ifdef DEBUG
debug_level = 1;
#endif
FUNCTIONSETUP;
KAboutData about("kpilotTest",
I18N_NOOP("KPilotTest"),
KPILOT_VERSION,
"KPilot Tester",
KAboutData::License_GPL, "(C) 2001-2004, Adriaan de Groot");
about.addAuthor("Adriaan de Groot",
I18N_NOOP("KPilot Maintainer"),
"groot@kde.org", "http://www.kpilot.org/");
KCmdLineArgs::init(argc, argv, &about);
KCmdLineArgs::addCmdLineOptions(generalOptions,
I18N_NOOP("General"));
KCmdLineArgs::addCmdLineOptions(conduitOptions,
I18N_NOOP("Conduit Actions"),"conduit");
KApplication::addCmdLineOptions();
KCmdLineArgs *p = KCmdLineArgs::parsedArgs();
bool needGUI = false;
// Some versions need a GUI
needGUI |= (p->isSet("check"));
needGUI |= (p->isSet("exec")); // assume worst wrt. conduits
needGUI |= (p->isSet("restore"));
KApplication a(needGUI,needGUI);
#ifdef DEBUG
KPilotConfig::getDebugLevel(p);
DEBUGKPILOT << fname << "Created KApplication." << endl;
#endif
Pilot::setupPilotCodec(KPilotSettings::encoding());
TQString device( "/dev/pilot" );
if ( p->isSet("port") )
{
device = p->getOption("port");
}
if ( p->isSet("check") )
{
return check( device, p->getOption("check"),
KCmdLineArgs::parsedArgs("conduit") );
}
if ( p->isSet("show") )
{
return show( p->getOption("show") );
}
if ( p->isSet("exec") )
{
return exec( device, p->getOption("exec"),
KCmdLineArgs::parsedArgs("conduit") );
}
if ( p->isSet("list") )
{
return listDB( device,
KCmdLineArgs::parsedArgs("conduit") );
}
if ( p->isSet("backup") )
{
return backup( device, p->getOption("backup"),
KCmdLineArgs::parsedArgs("conduit") );
}
if ( p->isSet("restore") )
{
return restore( device, p->getOption("restore"),
KCmdLineArgs::parsedArgs("conduit") );
}
std::cout <<
"Usage: kpilotTest [--port devicename] action\n\n"
"Where action can be one of:\n"
"\t--list - list the databases on the handheld\n"
"\t--show (help | conduits | ...) - show configuration\n"
"\t--check (help | user | ...) - check device\n"
"\t--exec conduit - run a single conduit\n"
"\t--backup - backup the device\n"
"\t--restore - restore the device from backup\n"
<< std::endl;
return 1;
}