00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include "engine.h"
00023
00024
#include "actionpart.h"
00025
00026
#include <konnector.h>
00027
#include <konnectormanager.h>
00028
#include <konnectorinfo.h>
00029
#include <klocale.h>
00030
00031
#include <qdatetime.h>
00032
00033
using namespace KSync;
00034
00035 Engine::Engine(
QPtrList<ActionPart> &parts )
00036 : mParts( parts )
00037 {
00038 }
00039
00040 Engine::~Engine()
00041 {
00042 }
00043
00044
void Engine::slotProgress(
Konnector *k,
const Progress &p )
00045 {
00046 logMessage( i18n(
"Got Progress from Konnector at address %1: %2").arg( (
long)k ).arg( p.text() ) );
00047 }
00048
00049
void Engine::slotError(
Konnector *k,
const Error &e )
00050 {
00051 logMessage( i18n(
"Got Progress from Konnector at address %1: %2").arg( (
long)k ).arg( e.
text() ) );
00052 }
00053
00054
void Engine::logMessage(
const QString &message )
00055 {
00056
QString text = QTime::currentTime().toString() +
": ";
00057 text += message;
00058
00059 kdDebug() <<
"LOG: " << text << endl;
00060 }
00061
00062 Konnector::List Engine::konnectors()
00063 {
00064
return mKonnectors;
00065 }
00066
00067 void Engine::go()
00068 {
00069 kdDebug() <<
"Engine::go():" << endl;
00070
00071 logMessage( i18n(
"Sync Action triggered") );
00072
00073 mOpenedKonnectors.clear();
00074 mProcessedKonnectors.clear();
00075 mKonnectorCount = 0;
00076
00077 mKonnectors.clear();
00078
00079 KRES::Manager<Konnector> *manager = KonnectorManager::self();
00080 KRES::Manager<Konnector>::ActiveIterator it;
00081
for( it = manager->activeBegin(); it != manager->activeEnd(); ++it ) {
00082 kdDebug() <<
" Engine::go(): Konnector: id: " << (*it)->identifier()
00083 <<
" name: " << (*it)->resourceName() << endl;
00084 mKonnectors.append( *it );
00085 }
00086
00087
bool needsRead =
false;
00088
00089
ActionPart *part;
00090
for ( part = mParts.first(); part; part = mParts.next() ) {
00091 part->
filterKonnectors( mKonnectors );
00092
if ( part->
needsKonnectorRead() ) needsRead =
true;
00093 }
00094
00095
if ( needsRead ) {
00096
Konnector *k;
00097
for( k = mKonnectors.first(); k; k = mKonnectors.next() ) {
00098 logMessage( i18n(
"Connecting '%1'").arg( k->resourceName() ) );
00099
if ( !k->
connectDevice() ) {
00100 logMessage( i18n(
"Error connecting device.") );
00101 }
else {
00102 mOpenedKonnectors.append( k );
00103 ++mKonnectorCount;
00104 }
00105 }
00106
00107
for ( k = mOpenedKonnectors.first(); k; k = mOpenedKonnectors.next() ) {
00108 logMessage( i18n(
"Request Syncees") );
00109
if ( !k->
readSyncees() ) {
00110 logMessage( i18n(
"Request failed.") );
00111 }
00112 }
00113 }
else {
00114 executeActions();
00115 }
00116 }
00117
00118
void Engine::slotSynceesRead(
Konnector *k )
00119 {
00120 logMessage( i18n(
"Syncees read from '%1'").arg( k->resourceName() ) );
00121
00122 mProcessedKonnectors.append( k );
00123
00124
SynceeList syncees = k->
syncees();
00125
00126
if ( syncees.count() == 0 ) {
00127 logMessage( i18n(
"Syncee list is empty.") );
00128
return;
00129 }
00130
00131 tryExecuteActions();
00132 }
00133
00134
void Engine::tryExecuteActions()
00135 {
00136 kdDebug() <<
"Engine::tryExecuteActions()" << endl;
00137
00138 kdDebug() <<
" konnectorCount: " << mKonnectorCount << endl;
00139 kdDebug() <<
" processedKonnectorsCount: " << mProcessedKonnectors.count()
00140 << endl;
00141
00142
if ( mKonnectorCount == mProcessedKonnectors.count() ) {
00143 executeActions();
00144 }
00145 }
00146
00147
void Engine::executeActions()
00148 {
00149 logMessage( i18n(
"Execute Actions") );
00150
00151
bool needsWrite =
false;
00152
00153
ActionPart *part;
00154
for ( part = mParts.first(); part; part = mParts.next() ) {
00155 part->
executeAction();
00156
if ( part->
needsKonnectorWrite() ) needsWrite =
true;
00157 }
00158
00159
if ( needsWrite ) {
00160 mProcessedKonnectors.clear();
00161
00162
Konnector *konnector;
00163
for( konnector = mOpenedKonnectors.first(); konnector;
00164 konnector = mOpenedKonnectors.next() ) {
00165
if ( konnector->
writeSyncees() ) {
00166 kdDebug() <<
"writeSyncees(): " << konnector->resourceName() << endl;
00167 }
else {
00168 kdError() <<
"Error requesting to write Syncee: "
00169 << konnector->resourceName() << endl;
00170 }
00171 }
00172 }
else {
00173 finish();
00174 }
00175 }
00176
00177
void Engine::slotSynceeReadError(
Konnector *k )
00178 {
00179 logMessage( i18n(
"Error reading Syncees from '%1'")
00180 .arg( k->resourceName() ) );
00181
00182 --mKonnectorCount;
00183
00184 tryExecuteActions();
00185 }
00186
00187
void Engine::slotSynceesWritten(
Konnector *k )
00188 {
00189 logMessage( i18n(
"Syncees written to '%1'").arg( k->resourceName() ) );
00190
00191 mProcessedKonnectors.append( k );
00192
00193 disconnectDevice( k );
00194
00195 tryFinish();
00196 }
00197
00198
void Engine::slotSynceeWriteError(
Konnector *k )
00199 {
00200 logMessage( i18n(
"Error writing Syncees to '%1'")
00201 .arg( k->resourceName() ) );
00202
00203 --mKonnectorCount;
00204
00205 disconnectDevice( k );
00206
00207 tryFinish();
00208 }
00209
00210
void Engine::disconnectDevice(
Konnector *k )
00211 {
00212
if ( !k->
disconnectDevice() ) {
00213 logMessage( i18n(
"Error disconnecting device") );
00214 }
00215 }
00216
00217
void Engine::tryFinish()
00218 {
00219
if ( mKonnectorCount == mProcessedKonnectors.count() ) {
00220 finish();
00221 }
00222 }
00223
00224
void Engine::finish()
00225 {
00226 logMessage( i18n(
"Synchronization finished.") );
00227 }
00228
00229
#include "engine.moc"