summaryrefslogtreecommitdiffstats
path: root/kitchensync
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit460c52653ab0dcca6f19a4f492ed2c5e4e963ab0 (patch)
tree67208f7c145782a7e90b123b982ca78d88cc2c87 /kitchensync
downloadtdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.tar.gz
tdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kitchensync')
-rw-r--r--kitchensync/Makefile.am3
-rw-r--r--kitchensync/configure.in.bot8
-rw-r--r--kitchensync/configure.in.in68
-rw-r--r--kitchensync/libqopensync/Makefile.am19
-rw-r--r--kitchensync/libqopensync/callbackhandler.cpp191
-rw-r--r--kitchensync/libqopensync/callbackhandler.h90
-rw-r--r--kitchensync/libqopensync/conversion.cpp58
-rw-r--r--kitchensync/libqopensync/conversion.h56
-rw-r--r--kitchensync/libqopensync/engine.cpp67
-rw-r--r--kitchensync/libqopensync/engine.h72
-rw-r--r--kitchensync/libqopensync/environment.cpp172
-rw-r--r--kitchensync/libqopensync/environment.h199
-rw-r--r--kitchensync/libqopensync/filter.cpp55
-rw-r--r--kitchensync/libqopensync/filter.h64
-rw-r--r--kitchensync/libqopensync/group.cpp292
-rw-r--r--kitchensync/libqopensync/group.h217
-rw-r--r--kitchensync/libqopensync/member.cpp188
-rw-r--r--kitchensync/libqopensync/member.h129
-rw-r--r--kitchensync/libqopensync/plugin.cpp62
-rw-r--r--kitchensync/libqopensync/plugin.h67
-rw-r--r--kitchensync/libqopensync/result.cpp149
-rw-r--r--kitchensync/libqopensync/result.h126
-rw-r--r--kitchensync/libqopensync/syncchange.cpp159
-rw-r--r--kitchensync/libqopensync/syncchange.h116
-rw-r--r--kitchensync/libqopensync/syncmapping.cpp100
-rw-r--r--kitchensync/libqopensync/syncmapping.h59
-rw-r--r--kitchensync/libqopensync/syncupdates.cpp251
-rw-r--r--kitchensync/libqopensync/syncupdates.h157
-rw-r--r--kitchensync/opensyncdbus/Makefile.am10
-rw-r--r--kitchensync/opensyncdbus/README5
-rw-r--r--kitchensync/opensyncdbus/dbusclient.cpp273
-rw-r--r--kitchensync/opensyncdbus/dbusclient.h56
-rw-r--r--kitchensync/src/Makefile.am52
-rw-r--r--kitchensync/src/about/Makefile.am6
-rw-r--r--kitchensync/src/about/kitchensync.css30
-rw-r--r--kitchensync/src/about/main.html66
-rw-r--r--kitchensync/src/about/top-right-kitchensync.pngbin0 -> 17996 bytes
-rw-r--r--kitchensync/src/aboutpage.cpp141
-rw-r--r--kitchensync/src/aboutpage.h45
-rw-r--r--kitchensync/src/addresseediffalgo.cpp157
-rw-r--r--kitchensync/src/addresseediffalgo.h53
-rw-r--r--kitchensync/src/calendardiffalgo.cpp217
-rw-r--r--kitchensync/src/calendardiffalgo.h55
-rw-r--r--kitchensync/src/configgui.cpp135
-rw-r--r--kitchensync/src/configgui.h72
-rw-r--r--kitchensync/src/configguiblank.cpp44
-rw-r--r--kitchensync/src/configguiblank.h35
-rw-r--r--kitchensync/src/configguievo2.cpp91
-rw-r--r--kitchensync/src/configguievo2.h46
-rw-r--r--kitchensync/src/configguifile.cpp81
-rw-r--r--kitchensync/src/configguifile.h42
-rw-r--r--kitchensync/src/configguigcalendar.cpp103
-rw-r--r--kitchensync/src/configguigcalendar.h43
-rw-r--r--kitchensync/src/configguignokii.cpp223
-rw-r--r--kitchensync/src/configguignokii.h62
-rw-r--r--kitchensync/src/configguigpe.cpp103
-rw-r--r--kitchensync/src/configguigpe.h50
-rw-r--r--kitchensync/src/configguiirmc.cpp192
-rw-r--r--kitchensync/src/configguiirmc.h61
-rw-r--r--kitchensync/src/configguijescs.cpp98
-rw-r--r--kitchensync/src/configguijescs.h48
-rw-r--r--kitchensync/src/configguildap.cpp153
-rw-r--r--kitchensync/src/configguildap.h58
-rw-r--r--kitchensync/src/configguimoto.cpp71
-rw-r--r--kitchensync/src/configguimoto.h43
-rw-r--r--kitchensync/src/configguiopie.cpp135
-rw-r--r--kitchensync/src/configguiopie.h47
-rw-r--r--kitchensync/src/configguipalm.cpp200
-rw-r--r--kitchensync/src/configguipalm.h59
-rw-r--r--kitchensync/src/configguisunbird.cpp367
-rw-r--r--kitchensync/src/configguisunbird.h130
-rw-r--r--kitchensync/src/configguisynce.cpp93
-rw-r--r--kitchensync/src/configguisynce.h49
-rw-r--r--kitchensync/src/configguisyncmlhttp.cpp227
-rw-r--r--kitchensync/src/configguisyncmlhttp.h67
-rw-r--r--kitchensync/src/configguisyncmlobex.cpp320
-rw-r--r--kitchensync/src/configguisyncmlobex.h87
-rw-r--r--kitchensync/src/conflictdialog.cpp26
-rw-r--r--kitchensync/src/conflictdialog.h40
-rw-r--r--kitchensync/src/connectionwidgets.cpp227
-rw-r--r--kitchensync/src/connectionwidgets.h99
-rw-r--r--kitchensync/src/genericdiffalgo.cpp70
-rw-r--r--kitchensync/src/genericdiffalgo.h45
-rw-r--r--kitchensync/src/groupconfig.cpp179
-rw-r--r--kitchensync/src/groupconfig.h62
-rw-r--r--kitchensync/src/groupconfigcommon.cpp158
-rw-r--r--kitchensync/src/groupconfigcommon.h60
-rw-r--r--kitchensync/src/groupconfigdialog.cpp57
-rw-r--r--kitchensync/src/groupconfigdialog.h43
-rw-r--r--kitchensync/src/groupitem.cpp389
-rw-r--r--kitchensync/src/groupitem.h111
-rw-r--r--kitchensync/src/groupview.cpp99
-rw-r--r--kitchensync/src/groupview.h57
-rw-r--r--kitchensync/src/htmldiffalgodisplay.cpp97
-rw-r--r--kitchensync/src/htmldiffalgodisplay.h54
-rw-r--r--kitchensync/src/kitchensync.desktop61
-rw-r--r--kitchensync/src/kitchensync_part.rc22
-rw-r--r--kitchensync/src/kitchensyncui.rc22
-rw-r--r--kitchensync/src/kwidgetlist.cpp305
-rw-r--r--kitchensync/src/kwidgetlist.h90
-rw-r--r--kitchensync/src/main.cpp58
-rw-r--r--kitchensync/src/mainwidget.cpp191
-rw-r--r--kitchensync/src/mainwidget.h73
-rw-r--r--kitchensync/src/mainwindow.cpp61
-rw-r--r--kitchensync/src/mainwindow.h46
-rw-r--r--kitchensync/src/memberconfig.cpp79
-rw-r--r--kitchensync/src/memberconfig.h47
-rw-r--r--kitchensync/src/memberinfo.cpp99
-rw-r--r--kitchensync/src/memberinfo.h47
-rw-r--r--kitchensync/src/multiconflictdialog.cpp141
-rw-r--r--kitchensync/src/multiconflictdialog.h47
-rw-r--r--kitchensync/src/part.cpp89
-rw-r--r--kitchensync/src/part.h49
-rw-r--r--kitchensync/src/pics/Makefile.am4
-rw-r--r--kitchensync/src/pics/cr128-app-mobile_phone.pngbin0 -> 14177 bytes
-rw-r--r--kitchensync/src/pics/cr16-action-hotsync.pngbin0 -> 701 bytes
-rw-r--r--kitchensync/src/pics/cr16-app-mobile_phone.pngbin0 -> 1039 bytes
-rw-r--r--kitchensync/src/pics/cr22-action-hotsync.pngbin0 -> 984 bytes
-rw-r--r--kitchensync/src/pics/cr32-action-hotsync.pngbin0 -> 1647 bytes
-rw-r--r--kitchensync/src/pics/cr32-app-mobile_phone.pngbin0 -> 2760 bytes
-rw-r--r--kitchensync/src/pics/cr48-action-hotsync.pngbin0 -> 2769 bytes
-rw-r--r--kitchensync/src/pics/cr48-app-mobile_phone.pngbin0 -> 5024 bytes
-rw-r--r--kitchensync/src/pics/cr64-app-mobile_phone.pngbin0 -> 7219 bytes
-rw-r--r--kitchensync/src/pics/hi16-app-kitchensync.pngbin0 -> 701 bytes
-rw-r--r--kitchensync/src/pics/hi22-app-kitchensync.pngbin0 -> 984 bytes
-rw-r--r--kitchensync/src/pics/hi32-app-kitchensync.pngbin0 -> 1647 bytes
-rw-r--r--kitchensync/src/pics/hi48-app-kitchensync.pngbin0 -> 2769 bytes
-rw-r--r--kitchensync/src/pluginpicker.cpp136
-rw-r--r--kitchensync/src/pluginpicker.h80
-rw-r--r--kitchensync/src/singleconflictdialog.cpp123
-rw-r--r--kitchensync/src/singleconflictdialog.h54
-rw-r--r--kitchensync/src/syncprocess.cpp108
-rw-r--r--kitchensync/src/syncprocess.h64
-rw-r--r--kitchensync/src/syncprocessmanager.cpp172
-rw-r--r--kitchensync/src/syncprocessmanager.h100
135 files changed, 12236 insertions, 0 deletions
diff --git a/kitchensync/Makefile.am b/kitchensync/Makefile.am
new file mode 100644
index 000000000..f2bf61b45
--- /dev/null
+++ b/kitchensync/Makefile.am
@@ -0,0 +1,3 @@
+SUBDIRS = libqopensync src
+
+include $(top_srcdir)/admin/Doxyfile.am
diff --git a/kitchensync/configure.in.bot b/kitchensync/configure.in.bot
new file mode 100644
index 000000000..a612d1b78
--- /dev/null
+++ b/kitchensync/configure.in.bot
@@ -0,0 +1,8 @@
+if test "$HAVE_OPENSYNC" = 0 -o "$HAVE_OPENSYNC_ENGINE" = 0; then
+ echo ""
+ echo "You're missing a compatible version of libopensync."
+ echo "Version 0.19 or greater is needed."
+ echo "kitchensync will not be built."
+ echo ""
+ all_tests=bad
+fi
diff --git a/kitchensync/configure.in.in b/kitchensync/configure.in.in
new file mode 100644
index 000000000..31bb902c6
--- /dev/null
+++ b/kitchensync/configure.in.in
@@ -0,0 +1,68 @@
+dnl configure.in.in for OpenSync based KitchenSync
+dnl
+dnl Copyright (C) 2005 Holger Hans Peter Freyther
+dnl
+dnl Based on KPilot's configure.in
+dnl Copyright (C) 2000,2001 Adriaan de Groot
+dnl
+dnl This file is released under the terms of the GNU General Public
+dnl Licence (GPL) Version 2.
+
+
+
+dnl we need PKG_CONFIG for doing these tests
+AC_DEFUN([KITCHENSYNC_CHECK_OPENSYNC],[
+dnl AC_REQUIRE([PKG_CHECK_MODULES])
+
+dnl Say what we're doing
+AC_MSG_CHECKING(for opensync (for KitchenSync))
+AC_ARG_WITH(opensync,
+[ --with-opensync=PATH set prefix for opensync files],
+)dnl
+
+dnl change pkg_config_path if we have a OpenSync prefix
+dnl and also set it to our prefix
+if test -d "$with_opensync"; then
+ export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/usr/lib/pkgconfig:$with_opensync/lib/pkgconfig
+fi
+export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:$prefix/lib/pkgconfig:/usr/local/lib/pkgconfig
+
+
+HAVE_OPENSYNC=0
+HAVE_OPENSYNC_ENGINE=0
+PKG_CHECK_MODULES(OPENSYNC, opensync-1.0 >= 0.19, HAVE_OPENSYNC=1,HAVE_OPENSYNC=0)
+PKG_CHECK_MODULES(OPENSYNCENGINE, osengine-1.0 >= 0.19, HAVE_OPENSYNC_ENGINE=1, HAVE_OPENSYNC_ENGINE=0)
+PKG_CHECK_MODULES(LIBXML, libxml-2.0, , HAVE_OPENSYNC=0)
+PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.6, , HAVE_OPENSYNC=0)
+
+if test -z "PKG_CONFIG"; then
+ AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+fi
+
+if test "$PKG_CONFIG" != "no"; then
+ OPENSYNC_CONFIGDIR=`$PKG_CONFIG --variable=configdir "opensync-1.0"`
+ OPENSYNC_PLUGINDIR=`$PKG_CONFIG --variable=plugindir "opensync-1.0"`
+ OPENSYNC_FORMATSDIR=`$PKG_CONFIG --variable=formatsdir "opensync-1.0"`
+ OPENSYNC_HEADERDIR=`$PKG_CONFIG --variable=headerdir "opensync-1.0"`
+fi
+
+AC_SUBST(OPENSYNC_CONFIGDIR)
+AC_SUBST(OPENSYNC_PLUGINDIR)
+AC_SUBST(OPENSYNC_FORMATSDIR)
+AC_SUBST(OPENSYNC_HEADERDIR)
+
+dnl Check if we can compile KitchenSync
+AM_CONDITIONAL(compile_kitchensync, test "$HAVE_OPENSYNC" = 1 -a "$HAVE_OPENSYNC_ENGINE" = 1)
+
+if test "$HAVE_OPENSYNC" = 1 -a "$HAVE_OPENSYNC_ENGINE" = 1 ; then
+ AC_MSG_RESULT([found])
+else
+ AC_MSG_RESULT([not found])
+ DO_NOT_COMPILE="$DO_NOT_COMPILE kitchensync"
+fi
+
+])
+
+
+dnl Check For OpenSync support
+KITCHENSYNC_CHECK_OPENSYNC
diff --git a/kitchensync/libqopensync/Makefile.am b/kitchensync/libqopensync/Makefile.am
new file mode 100644
index 000000000..2e12df6ca
--- /dev/null
+++ b/kitchensync/libqopensync/Makefile.am
@@ -0,0 +1,19 @@
+INCLUDES = -I$(top_srcdir)/kitchensync/src \
+ -I$(top_srcdir)/kitchensync \
+ -I$(top_srcdir) \
+ $(OPENSYNC_CFLAGS) \
+ $(OPENSYNCENGINE_CFLAGS) \
+ $(all_includes)
+
+lib_LTLIBRARIES = libqopensync.la
+
+libqopensync_la_SOURCES = callbackhandler.cpp conversion.cpp engine.cpp environment.cpp filter.cpp group.cpp \
+ member.cpp plugin.cpp result.cpp syncmapping.cpp syncupdates.cpp \
+ syncchange.cpp
+libqopensync_la_LDFLAGS = $(all_libraries) $(KDE_RPATH) -no-undefined
+libqopensync_la_LIBADD = $(LIB_KDEUI) $(OPENSYNC_LIBS) $(OPENSYNCENGINE_LIBS)
+
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/libqopensync.pot
diff --git a/kitchensync/libqopensync/callbackhandler.cpp b/kitchensync/libqopensync/callbackhandler.cpp
new file mode 100644
index 000000000..86f279f14
--- /dev/null
+++ b/kitchensync/libqopensync/callbackhandler.cpp
@@ -0,0 +1,191 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <osengine/engine.h>
+
+#include <libqopensync/engine.h>
+
+#include <qapplication.h>
+
+#include "callbackhandler.h"
+
+using namespace QSync;
+
+class CallbackHandler::ConflictEvent : public QCustomEvent
+{
+ public:
+ ConflictEvent( const SyncMapping& mapping )
+ : QCustomEvent( ConflictEventType ), mMapping( mapping )
+ {
+ }
+
+ SyncMapping mapping() const { return mMapping; }
+
+ private:
+ SyncMapping mMapping;
+};
+
+class CallbackHandler::ChangeEvent : public QCustomEvent
+{
+ public:
+ ChangeEvent( const SyncChangeUpdate& change )
+ : QCustomEvent( ChangeEventType ), mChange( change )
+ {
+ }
+
+ SyncChangeUpdate change() const { return mChange; }
+
+ private:
+ SyncChangeUpdate mChange;
+};
+
+class CallbackHandler::MappingEvent : public QCustomEvent
+{
+ public:
+ MappingEvent( const SyncMappingUpdate& mapping )
+ : QCustomEvent( MappingEventType ), mMapping( mapping )
+ {
+ }
+
+ SyncMappingUpdate mapping() const { return mMapping; }
+
+ private:
+ SyncMappingUpdate mMapping;
+};
+
+class CallbackHandler::EngineEvent : public QCustomEvent
+{
+ public:
+ EngineEvent( const SyncEngineUpdate& engine )
+ : QCustomEvent( EngineEventType ), mEngine( engine )
+ {
+ }
+
+ SyncEngineUpdate engine() const { return mEngine; }
+
+ private:
+ SyncEngineUpdate mEngine;
+};
+
+class CallbackHandler::MemberEvent : public QCustomEvent
+{
+ public:
+ MemberEvent( const SyncMemberUpdate& member )
+ : QCustomEvent( MemberEventType ), mMember( member )
+ {
+ }
+
+ SyncMemberUpdate member() const { return mMember; }
+
+ private:
+ SyncMemberUpdate mMember;
+};
+
+CallbackHandler::CallbackHandler()
+{
+}
+
+CallbackHandler::~CallbackHandler()
+{
+}
+
+void CallbackHandler::setEngine( Engine *engine )
+{
+ mEngine = engine;
+
+ osengine_set_conflict_callback( engine->mEngine, &conflict_callback, this );
+ osengine_set_changestatus_callback( engine->mEngine, &change_callback, this );
+ osengine_set_mappingstatus_callback( engine->mEngine, &mapping_callback, this );
+ osengine_set_enginestatus_callback( engine->mEngine, &engine_callback, this );
+ osengine_set_memberstatus_callback( engine->mEngine, &member_callback, this );
+}
+
+Engine* CallbackHandler::engine() const
+{
+ return mEngine;
+}
+
+void CallbackHandler::customEvent( QCustomEvent *event )
+{
+ if ( event->type() == static_cast<QEvent::Type>( ConflictEventType ) ) {
+ ConflictEvent *conflictEvent = static_cast<ConflictEvent*>( event );
+ emit conflict( conflictEvent->mapping() );
+ } else if ( event->type() == static_cast<QEvent::Type>( ChangeEventType ) ) {
+ ChangeEvent *changeEvent = static_cast<ChangeEvent*>( event );
+ emit change( changeEvent->change() );
+ } else if ( event->type() == static_cast<QEvent::Type>( MappingEventType ) ) {
+ MappingEvent *mappingEvent = static_cast<MappingEvent*>( event );
+ emit mapping( mappingEvent->mapping() );
+ } else if ( event->type() == static_cast<QEvent::Type>( EngineEventType ) ) {
+ EngineEvent *engineEvent = static_cast<EngineEvent*>( event );
+ emit engine( engineEvent->engine() );
+ } else if ( event->type() == static_cast<QEvent::Type>( MemberEventType ) ) {
+ MemberEvent *memberEvent = static_cast<MemberEvent*>( event );
+ emit member( memberEvent->member() );
+ }
+}
+
+void CallbackHandler::conflict_callback( OSyncEngine *engine, OSyncMapping *omapping, void *data )
+{
+ SyncMapping mapping( omapping, engine );
+
+ CallbackHandler *handler = static_cast<CallbackHandler*>( data );
+
+ QApplication::postEvent( handler, new ConflictEvent( mapping ) );
+}
+
+void CallbackHandler::change_callback( OSyncEngine*, OSyncChangeUpdate *update, void *data )
+{
+ SyncChangeUpdate change( update );
+
+ CallbackHandler *handler = static_cast<CallbackHandler*>( data );
+
+ QApplication::postEvent( handler, new ChangeEvent( change ) );
+}
+
+void CallbackHandler::mapping_callback( OSyncMappingUpdate *update, void *data )
+{
+ CallbackHandler *handler = static_cast<CallbackHandler*>( data );
+
+ SyncMappingUpdate mapping( update, handler->engine()->mEngine );
+
+ QApplication::postEvent( handler, new MappingEvent( mapping ) );
+}
+
+void CallbackHandler::engine_callback( OSyncEngine*, OSyncEngineUpdate *update, void *data )
+{
+ SyncEngineUpdate engine( update );
+
+ CallbackHandler *handler = static_cast<CallbackHandler*>( data );
+
+ QApplication::postEvent( handler, new EngineEvent( engine ) );
+}
+
+void CallbackHandler::member_callback( OSyncMemberUpdate *update, void *data )
+{
+ SyncMemberUpdate member( update );
+
+ CallbackHandler *handler = static_cast<CallbackHandler*>( data );
+
+ QApplication::postEvent( handler, new MemberEvent( member ) );
+}
+
+#include "callbackhandler.moc"
diff --git a/kitchensync/libqopensync/callbackhandler.h b/kitchensync/libqopensync/callbackhandler.h
new file mode 100644
index 000000000..a31132559
--- /dev/null
+++ b/kitchensync/libqopensync/callbackhandler.h
@@ -0,0 +1,90 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef QSYNC_CALLBACKHANDLER_H
+#define QSYNC_CALLBACKHANDLER_H
+
+#include <libqopensync/syncmapping.h>
+#include <libqopensync/syncupdates.h>
+
+#include <qobject.h>
+
+class OSyncEngine;
+class OSyncMapping;
+class OSyncChangeUpdate;
+class OSyncMappingUpdate;
+class OSyncEngineUpdate;
+class OSyncMemberUpdate;
+
+class QCustomEvent;
+
+namespace QSync {
+
+class Engine;
+
+class CallbackHandler : public QObject
+{
+ Q_OBJECT
+
+ public:
+ CallbackHandler();
+ ~CallbackHandler();
+
+ void setEngine( Engine *engine );
+ Engine* engine() const;
+
+ signals:
+ void conflict( QSync::SyncMapping mapping );
+ void change( const QSync::SyncChangeUpdate &update );
+ void mapping( const QSync::SyncMappingUpdate &update );
+ void engine( const QSync::SyncEngineUpdate &update );
+ void member( const QSync::SyncMemberUpdate &update );
+
+ protected:
+ virtual void customEvent( QCustomEvent *event );
+
+ private:
+ enum EventType {
+ ConflictEventType = 4044,
+ ChangeEventType,
+ MappingEventType,
+ EngineEventType,
+ MemberEventType
+ };
+
+ class ConflictEvent;
+ class ChangeEvent;
+ class MappingEvent;
+ class EngineEvent;
+ class MemberEvent;
+
+ static void conflict_callback( OSyncEngine*, OSyncMapping*, void* );
+ static void change_callback( OSyncEngine*, OSyncChangeUpdate*, void* );
+ static void mapping_callback( OSyncMappingUpdate*, void* );
+ static void engine_callback( OSyncEngine*, OSyncEngineUpdate*, void* );
+ static void member_callback( OSyncMemberUpdate*, void* );
+
+ Engine* mEngine;
+};
+
+}
+
+#endif
diff --git a/kitchensync/libqopensync/conversion.cpp b/kitchensync/libqopensync/conversion.cpp
new file mode 100644
index 000000000..bf4eb948a
--- /dev/null
+++ b/kitchensync/libqopensync/conversion.cpp
@@ -0,0 +1,58 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2006 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <opensync/opensync.h>
+
+#include "conversion.h"
+
+using namespace QSync;
+
+Conversion::Conversion()
+ : mEnvironment( 0 )
+{
+}
+
+Conversion::~Conversion()
+{
+}
+
+bool Conversion::isValid() const
+{
+ return mEnvironment != 0;
+}
+
+QStringList Conversion::objectTypes() const
+{
+ Q_ASSERT( mEnvironment );
+
+ OSyncFormatEnv *formatEnv = osync_conv_env_new( mEnvironment );
+ Q_ASSERT( formatEnv );
+
+ QStringList types;
+ for ( int i = 0; i < osync_conv_num_objtypes( formatEnv ); i++ ) {
+ OSyncObjType *type = osync_conv_nth_objtype( formatEnv, i );
+ types.append( QString::fromUtf8( osync_objtype_get_name( type ) ) );
+ }
+
+ osync_conv_env_free( formatEnv );
+
+ return types;
+}
diff --git a/kitchensync/libqopensync/conversion.h b/kitchensync/libqopensync/conversion.h
new file mode 100644
index 000000000..327f8b475
--- /dev/null
+++ b/kitchensync/libqopensync/conversion.h
@@ -0,0 +1,56 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2006 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef QSYNC_CONVERSION_H
+#define QSYNC_CONVERSION_H
+
+#include <qstringlist.h>
+
+class OSyncEnv;
+
+namespace QSync {
+
+class Conversion
+{
+ friend class Environment;
+
+ public:
+ Conversion();
+ ~Conversion();
+
+ /**
+ Returns whether the object is a valid conversion.
+ */
+ bool isValid() const;
+
+ /**
+ Returns the list of names of supported object types.
+ */
+ QStringList objectTypes() const;
+
+ private:
+ OSyncEnv *mEnvironment;
+};
+
+}
+
+#endif
+
diff --git a/kitchensync/libqopensync/engine.cpp b/kitchensync/libqopensync/engine.cpp
new file mode 100644
index 000000000..6d48c72ff
--- /dev/null
+++ b/kitchensync/libqopensync/engine.cpp
@@ -0,0 +1,67 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <opensync/opensync.h>
+#include <osengine/engine.h>
+
+#include "engine.h"
+
+using namespace QSync;
+
+Engine::Engine( const Group &group )
+{
+ OSyncError *error = 0;
+ mEngine = osengine_new( group.mGroup, &error );
+}
+
+Engine::~Engine()
+{
+ osengine_free( mEngine );
+ mEngine = 0;
+}
+
+Result Engine::initialize()
+{
+ OSyncError *error = 0;
+ if ( !osengine_init( mEngine, &error ) )
+ return Result( &error );
+ else
+ return Result();
+}
+
+void Engine::finalize()
+{
+ osengine_finalize( mEngine );
+}
+
+Result Engine::synchronize()
+{
+ OSyncError *error = 0;
+ if ( !osengine_synchronize( mEngine, &error ) )
+ return Result( &error );
+ else
+ return Result();
+}
+
+void Engine::abort()
+{
+ osengine_abort( mEngine );
+}
diff --git a/kitchensync/libqopensync/engine.h b/kitchensync/libqopensync/engine.h
new file mode 100644
index 000000000..e62a5f689
--- /dev/null
+++ b/kitchensync/libqopensync/engine.h
@@ -0,0 +1,72 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef QSYNC_ENGINE_H
+#define QSYNC_ENGINE_H
+
+#include <libqopensync/group.h>
+
+class OSyncEngine;
+
+namespace QSync {
+
+class Engine
+{
+ friend class CallbackHandler;
+
+ public:
+ /**
+ Constructs an engine .
+ */
+ Engine( const Group &group );
+
+ /**
+ Destroys the engine.
+ */
+ ~Engine();
+
+ /**
+ Initializes the engine.
+ */
+ Result initialize();
+
+ /**
+ Finalizes the engine.
+ */
+ void finalize();
+
+ /**
+ Starts the synchronization process.
+ */
+ Result synchronize();
+
+ /**
+ Stops the synchronization process.
+ */
+ void abort();
+
+ private:
+ OSyncEngine *mEngine;
+};
+
+}
+
+#endif
diff --git a/kitchensync/libqopensync/environment.cpp b/kitchensync/libqopensync/environment.cpp
new file mode 100644
index 000000000..d878c61d5
--- /dev/null
+++ b/kitchensync/libqopensync/environment.cpp
@@ -0,0 +1,172 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "environment.h"
+
+#include <opensync/opensync.h>
+
+using namespace QSync;
+
+Environment::Environment()
+{
+ mEnvironment = osync_env_new();
+}
+
+Environment::~Environment()
+{
+ osync_env_free( mEnvironment );
+}
+
+Environment::GroupIterator Environment::groupBegin()
+{
+ GroupIterator it( this );
+ it.mPos = 0;
+
+ return it;
+}
+
+Environment::GroupIterator Environment::groupEnd()
+{
+ GroupIterator it( this );
+ it.mPos = groupCount();
+
+ return it;
+}
+
+Environment::PluginIterator Environment::pluginBegin()
+{
+ PluginIterator it( this );
+ it.mPos = 0;
+
+ return it;
+}
+
+Environment::PluginIterator Environment::pluginEnd()
+{
+ PluginIterator it( this );
+ it.mPos = pluginCount();
+
+ return it;
+}
+
+Result Environment::initialize()
+{
+ OSyncError *error = 0;
+ if ( !osync_env_initialize( mEnvironment, &error ) )
+ return Result( &error );
+ else
+ return Result();
+}
+
+Result Environment::finalize()
+{
+ OSyncError *error = 0;
+ if ( !osync_env_finalize( mEnvironment, &error ) )
+ return Result( &error);
+ else
+ return Result();
+}
+
+int Environment::groupCount() const
+{
+ return osync_env_num_groups( mEnvironment );
+}
+
+Group Environment::groupAt( int pos ) const
+{
+ Group group;
+
+ if ( pos < 0 || pos >= groupCount() )
+ return group;
+
+ OSyncGroup *ogroup = osync_env_nth_group( mEnvironment, pos );
+ group.mGroup = ogroup;
+
+ return group;
+}
+
+Group Environment::groupByName( const QString &name ) const
+{
+ Group group;
+
+ OSyncGroup *ogroup = osync_env_find_group( mEnvironment, name.latin1() );
+ if ( ogroup )
+ group.mGroup = ogroup;
+
+ return group;
+}
+
+Group Environment::addGroup()
+{
+ Group group;
+
+ OSyncGroup *ogroup = osync_group_new( mEnvironment );
+ if ( ogroup )
+ group.mGroup = ogroup;
+
+ return group;
+}
+
+Result Environment::removeGroup( const Group &group )
+{
+ OSyncError *error = 0;
+ if ( !osync_group_delete( group.mGroup, &error ) )
+ return Result( &error );
+ else
+ return Result();
+}
+
+int Environment::pluginCount() const
+{
+ return osync_env_num_plugins( mEnvironment );
+}
+
+Plugin Environment::pluginAt( int pos ) const
+{
+ Plugin plugin;
+
+ if ( pos < 0 || pos >= pluginCount() )
+ return plugin;
+
+ OSyncPlugin *oplugin = osync_env_nth_plugin( mEnvironment, pos );
+ plugin.mPlugin = oplugin;
+
+ return plugin;
+}
+
+Plugin Environment::pluginByName( const QString &name ) const
+{
+ Plugin plugin;
+
+ OSyncPlugin *oplugin = osync_env_find_plugin( mEnvironment, name.latin1() );
+ if ( oplugin )
+ plugin.mPlugin = oplugin;
+
+ return plugin;
+}
+
+Conversion Environment::conversion() const
+{
+ Conversion conversion;
+ conversion.mEnvironment = mEnvironment;
+
+ return conversion;
+}
diff --git a/kitchensync/libqopensync/environment.h b/kitchensync/libqopensync/environment.h
new file mode 100644
index 000000000..f412a32c0
--- /dev/null
+++ b/kitchensync/libqopensync/environment.h
@@ -0,0 +1,199 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef OSYNC_ENVIRONMENT_H
+#define OSYNC_ENVIRONMENT_H
+
+#include <qstring.h>
+
+#include <libqopensync/group.h>
+#include <libqopensync/plugin.h>
+#include <libqopensync/result.h>
+#include <libqopensync/conversion.h>
+
+struct OSyncEnv;
+
+namespace QSync {
+
+class Environment
+{
+ public:
+ Environment();
+ ~Environment();
+
+ class GroupIterator
+ {
+ friend class Environment;
+
+ public:
+ GroupIterator( Environment *environment )
+ : mEnvironment( environment ), mPos( -1 )
+ {
+ }
+
+ GroupIterator( const GroupIterator &it )
+ {
+ mEnvironment = it.mEnvironment;
+ mPos = it.mPos;
+ }
+
+ Group operator*()
+ {
+ return mEnvironment->groupAt( mPos );
+ }
+
+ GroupIterator &operator++() { mPos++; return *this; }
+ GroupIterator &operator++( int ) { mPos++; return *this; }
+ GroupIterator &operator--() { mPos--; return *this; }
+ GroupIterator &operator--( int ) { mPos--; return *this; }
+ bool operator==( const GroupIterator &it ) { return mEnvironment == it.mEnvironment && mPos == it.mPos; }
+ bool operator!=( const GroupIterator &it ) { return mEnvironment == it.mEnvironment && mPos != it.mPos; }
+
+ private:
+ Environment *mEnvironment;
+ int mPos;
+ };
+
+ class PluginIterator
+ {
+ friend class Environment;
+
+ public:
+ PluginIterator( Environment *environment )
+ : mEnvironment( environment ), mPos( -1 )
+ {
+ }
+
+ PluginIterator( const PluginIterator &it )
+ {
+ mEnvironment = it.mEnvironment;
+ mPos = it.mPos;
+ }
+
+ Plugin operator*()
+ {
+ return mEnvironment->pluginAt( mPos );
+ }
+
+ PluginIterator &operator++() { mPos++; return *this; }
+ PluginIterator &operator++( int ) { mPos++; return *this; }
+ PluginIterator &operator--() { mPos--; return *this; }
+ PluginIterator &operator--( int ) { mPos--; return *this; }
+ bool operator==( const PluginIterator &it ) { return mEnvironment == it.mEnvironment && mPos == it.mPos; }
+ bool operator!=( const PluginIterator &it ) { return mEnvironment == it.mEnvironment && mPos != it.mPos; }
+
+ private:
+ Environment *mEnvironment;
+ int mPos;
+ };
+
+ /**
+ Returns an iterator pointing to the first item in the group list.
+ This iterator equals groupEnd() if the group list is empty.
+ */
+ GroupIterator groupBegin();
+
+ /**
+ Returns an iterator pointing past the last item in the group list.
+ This iterator equals groupBegin() if the group list is empty.
+ */
+ GroupIterator groupEnd();
+
+ /**
+ Returns an iterator pointing to the first item in the plugin list.
+ This iterator equals pluginEnd() if the group list is empty.
+ */
+ PluginIterator pluginBegin();
+
+ /**
+ Returns an iterator pointing past the last item in the plugin list.
+ This iterator equals pluginBegin() if the plugin list is empty.
+ */
+ PluginIterator pluginEnd();
+
+ /**
+ Initializes the environment ( e.g. loads the groups and plugins ).
+ Has to be called before the groups or plugins can be accessed.
+ */
+ Result initialize();
+
+ /**
+ Finalizes the environment ( e.g. unloads the groups and plugins ).
+ Should be the last call before the object is deleted.
+ */
+ Result finalize();
+
+ /**
+ Returns the number of groups.
+ */
+ int groupCount() const;
+
+ /**
+ Returns the group at position @param pos.
+ */
+ Group groupAt( int pos ) const;
+
+ /**
+ Returns a group by name or an invalid group when the group with this
+ name doesn't exists.
+ */
+ Group groupByName( const QString &name ) const;
+
+ /**
+ Adds a new group to the environment.
+
+ @returns the new group.
+ */
+ Group addGroup();
+
+ /**
+ Removes a group from the environment.
+ */
+ Result removeGroup( const Group &group );
+
+ /**
+ Returns the number of plugins.
+ */
+ int pluginCount() const;
+
+ /**
+ Returns the plugin at position @param pos.
+ */
+ Plugin pluginAt( int pos ) const;
+
+ /**
+ Returns a plugin by name or an invalid plugin when the plugin with this
+ name doesn't exists.
+ */
+ Plugin pluginByName( const QString &name ) const;
+
+ /**
+ Returns the conversion object of this environment.
+ */
+ Conversion conversion() const;
+
+ private:
+ OSyncEnv *mEnvironment;
+};
+
+}
+
+#endif
diff --git a/kitchensync/libqopensync/filter.cpp b/kitchensync/libqopensync/filter.cpp
new file mode 100644
index 000000000..fdfcf032f
--- /dev/null
+++ b/kitchensync/libqopensync/filter.cpp
@@ -0,0 +1,55 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <opensync/opensync.h>
+
+#include "filter.h"
+
+using namespace QSync;
+
+Filter::Filter()
+ : mFilter( 0 )
+{
+}
+
+Filter::~Filter()
+{
+}
+
+bool Filter::isValid() const
+{
+ return (mFilter != 0);
+}
+
+void Filter::setConfiguration( const QString &configuration )
+{
+ Q_ASSERT( mFilter );
+
+ osync_filter_set_config( mFilter, (const char*)configuration.utf8() );
+}
+
+QString Filter::configuration() const
+{
+ Q_ASSERT( mFilter );
+
+ return QString::fromUtf8( osync_filter_get_config( mFilter ) );
+}
+
diff --git a/kitchensync/libqopensync/filter.h b/kitchensync/libqopensync/filter.h
new file mode 100644
index 000000000..55e3099e1
--- /dev/null
+++ b/kitchensync/libqopensync/filter.h
@@ -0,0 +1,64 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef QSYNC_FILTER_H
+#define QSYNC_FILTER_H
+
+#include <qstring.h>
+
+class OSyncFilter;
+
+namespace QSync {
+
+class Filter
+{
+ friend class Group;
+
+ public:
+ Filter();
+ ~Filter();
+
+ /**
+ Returns whether the object is a valid filter.
+ */
+ bool isValid() const;
+
+ /**
+ Sets the configuration string of this filter. The format of
+ string is filter specific.
+ */
+ void setConfiguration( const QString &configuration );
+
+ /**
+ Returns the configuration string of this filter.
+ */
+ QString configuration() const;
+
+ bool operator==( const Filter &filter ) const { return mFilter == filter.mFilter; }
+
+ private:
+ OSyncFilter *mFilter;
+};
+
+}
+
+#endif
+
diff --git a/kitchensync/libqopensync/group.cpp b/kitchensync/libqopensync/group.cpp
new file mode 100644
index 000000000..75beab90c
--- /dev/null
+++ b/kitchensync/libqopensync/group.cpp
@@ -0,0 +1,292 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/** hack includes **/
+#include <qdom.h>
+#include <qfile.h>
+/** hack includes **/
+
+#include <opensync/opensync.h>
+
+#include "conversion.h"
+#include "group.h"
+
+using namespace QSync;
+
+/**
+ This class is a quick hack for OpenSync 0.19 and 0.20 because
+ the engine doesn't stores the filter settings itself when calling
+ osync_group_set_objtype_enabled(), so we have to store it for every
+ group in a separated config file. This class encapsulates it.
+ */
+GroupConfig::GroupConfig()
+ : mGroup( 0 )
+{
+}
+
+QStringList GroupConfig::activeObjectTypes() const
+{
+ Q_ASSERT( mGroup );
+
+ const QString fileName = QString( "%1/filter.conf" ).arg( osync_group_get_configdir( mGroup ) );
+
+ QFile file( fileName );
+ if ( !file.open( IO_ReadOnly ) )
+ return QStringList();
+
+ QDomDocument document;
+
+ QString message;
+ if ( !document.setContent( &file, &message ) ) {
+ qDebug( "Error on loading %s: %s", fileName.latin1(), message.latin1() );
+ return QStringList();
+ }
+ file.close();
+
+ QStringList objectTypes;
+
+ QDomElement element = document.documentElement();
+ QDomNode node = element.firstChild();
+ while ( !node.isNull() ) {
+ QDomElement childElement = node.toElement();
+ if ( !childElement.isNull() )
+ objectTypes.append( childElement.tagName() );
+
+ node = node.nextSibling();
+ }
+
+ return objectTypes;
+}
+
+void GroupConfig::setActiveObjectTypes( const QStringList &objectTypes )
+{
+ Q_ASSERT( mGroup );
+
+ QDomDocument document( "Filter" );
+ document.appendChild( document.createProcessingInstruction(
+ "xml", "version=\"1.0\" encoding=\"UTF-8\"" ) );
+
+ QDomElement element = document.createElement( "filter" );
+ document.appendChild( element );
+
+ for ( uint i = 0; i < objectTypes.count(); ++i ) {
+ QDomElement entry = document.createElement( objectTypes[ i ] );
+ element.appendChild( entry );
+ }
+
+ const QString fileName = QString( "%1/filter.conf" ).arg( osync_group_get_configdir( mGroup ) );
+
+ QFile file( fileName );
+ if ( !file.open( IO_WriteOnly ) )
+ return;
+
+ QTextStream s( &file );
+ s.setEncoding( QTextStream::UnicodeUTF8 );
+ s << document.toString();
+ file.close();
+}
+
+
+Group::Group()
+ : mGroup( 0 )
+{
+}
+
+Group::~Group()
+{
+}
+
+bool Group::isValid() const
+{
+ return ( mGroup != 0 );
+}
+
+Group::Iterator Group::begin()
+{
+ Iterator it( this );
+ it.mPos = 0;
+
+ return it;
+}
+
+Group::Iterator Group::end()
+{
+ Iterator it( this );
+ it.mPos = memberCount();
+
+ return it;
+}
+
+void Group::setName( const QString &name )
+{
+ Q_ASSERT( mGroup );
+
+ osync_group_set_name( mGroup, name.latin1() );
+}
+
+QString Group::name() const
+{
+ Q_ASSERT( mGroup );
+
+ return QString::fromLatin1( osync_group_get_name( mGroup ) );
+}
+
+void Group::setLastSynchronization( const QDateTime &dateTime )
+{
+ Q_ASSERT( mGroup );
+
+ if ( dateTime.isValid() )
+ osync_group_set_last_synchronization( mGroup, dateTime.toTime_t() );
+}
+
+QDateTime Group::lastSynchronization() const
+{
+ Q_ASSERT( mGroup );
+
+ QDateTime dateTime;
+ time_t time = osync_group_get_last_synchronization( mGroup );
+ if ( time != 0 )
+ dateTime.setTime_t( time );
+
+ return dateTime;
+}
+
+Group::LockType Group::lock()
+{
+ Q_ASSERT( mGroup );
+
+ OSyncLockState state = osync_group_lock( mGroup );
+ switch ( state ) {
+ default:
+ case OSYNC_LOCK_OK:
+ return LockOk;
+ break;
+ case OSYNC_LOCKED:
+ return Locked;
+ break;
+ case OSYNC_LOCK_STALE:
+ return LockStale;
+ break;
+ }
+}
+
+void Group::unlock( bool removeFile )
+{
+ Q_ASSERT( mGroup );
+
+ osync_group_unlock( mGroup, removeFile );
+}
+
+Member Group::addMember()
+{
+ Q_ASSERT( mGroup );
+
+ OSyncMember *omember = osync_member_new( mGroup );
+
+ Member member;
+ member.mMember = omember;
+
+ save();
+
+ return member;
+}
+
+void Group::removeMember( const Member &member )
+{
+ Q_ASSERT( mGroup );
+
+ osync_group_remove_member( mGroup, member.mMember );
+}
+
+int Group::memberCount() const
+{
+ Q_ASSERT( mGroup );
+
+ return osync_group_num_members( mGroup );
+}
+
+Member Group::memberAt( int pos ) const
+{
+ Q_ASSERT( mGroup );
+
+ Member member;
+
+ if ( pos < 0 || pos >= memberCount() )
+ return member;
+
+ member.mMember = osync_group_nth_member( mGroup, pos );
+
+ return member;
+}
+
+int Group::filterCount() const
+{
+ Q_ASSERT( mGroup );
+
+ return osync_group_num_filters( mGroup );
+}
+
+Filter Group::filterAt( int pos )
+{
+ Q_ASSERT( mGroup );
+
+ Filter filter;
+
+ if ( pos < 0 || pos >= filterCount() )
+ return filter;
+
+ filter.mFilter = osync_group_nth_filter( mGroup, pos );
+
+ return filter;
+}
+
+Result Group::save()
+{
+ Q_ASSERT( mGroup );
+
+ OSyncError *error = 0;
+ if ( !osync_group_save( mGroup, &error ) )
+ return Result( &error );
+ else
+ return Result();
+}
+
+void Group::setObjectTypeEnabled( const QString &objectType, bool enabled )
+{
+ Q_ASSERT( mGroup );
+
+ osync_group_set_objtype_enabled( mGroup, objectType.utf8(), enabled );
+}
+
+bool Group::isObjectTypeEnabled( const QString &objectType ) const
+{
+ return osync_group_objtype_enabled( mGroup, objectType.utf8() );
+}
+
+GroupConfig Group::config() const
+{
+ Q_ASSERT( mGroup );
+
+ GroupConfig config;
+ config.mGroup = mGroup;
+
+ return config;
+}
diff --git a/kitchensync/libqopensync/group.h b/kitchensync/libqopensync/group.h
new file mode 100644
index 000000000..e03365dfe
--- /dev/null
+++ b/kitchensync/libqopensync/group.h
@@ -0,0 +1,217 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef QSYNC_GROUP_H
+#define QSYNC_GROUP_H
+
+#include <qdatetime.h>
+#include <qstringlist.h>
+
+#include <libqopensync/filter.h>
+#include <libqopensync/member.h>
+
+class OSyncGroup;
+
+namespace QSync {
+
+/**
+ @internal
+ */
+class GroupConfig
+{
+ friend class Group;
+
+ public:
+ GroupConfig();
+
+ QStringList activeObjectTypes() const;
+ void setActiveObjectTypes( const QStringList &objectTypes );
+
+ private:
+ OSyncGroup *mGroup;
+};
+
+
+class Group
+{
+ friend class Engine;
+ friend class Environment;
+
+ public:
+ enum LockType
+ {
+ LockOk,
+ Locked,
+ LockStale
+ };
+
+ Group();
+ ~Group();
+
+ /**
+ Returns whether the object is a valid group.
+ */
+ bool isValid() const;
+
+ class Iterator
+ {
+ friend class Group;
+
+ public:
+ Iterator( Group *group )
+ : mGroup( group ), mPos( -1 )
+ {
+ }
+
+ Iterator( const Iterator &it )
+ {
+ mGroup = it.mGroup;
+ mPos = it.mPos;
+ }
+
+ Member operator*()
+ {
+ return mGroup->memberAt( mPos );
+ }
+
+ Iterator &operator++() { mPos++; return *this; }
+ Iterator &operator++( int ) { mPos++; return *this; }
+ Iterator &operator--() { mPos--; return *this; }
+ Iterator &operator--( int ) { mPos--; return *this; }
+ bool operator==( const Iterator &it ) { return mGroup == it.mGroup && mPos == it.mPos; }
+ bool operator!=( const Iterator &it ) { return mGroup == it.mGroup && mPos != it.mPos; }
+
+ private:
+ Group *mGroup;
+ int mPos;
+ };
+
+ /**
+ Returns an iterator pointing to the first item in the member list.
+ This iterator equals end() if the member list is empty.
+ */
+ Iterator begin();
+
+ /**
+ Returns an iterator pointing past the last item in the member list.
+ This iterator equals begin() if the member list is empty.
+ */
+ Iterator end();
+
+ /**
+ Sets the name of the group.
+ */
+ void setName( const QString &name );
+
+ /**
+ Returns the name of the group.
+ */
+ QString name() const;
+
+ /**
+ Sets the time of the last successfull synchronization.
+ */
+ void setLastSynchronization( const QDateTime &dateTime );
+
+ /**
+ Returns the time of the last successfull synchronization.
+ */
+ QDateTime lastSynchronization() const;
+
+ /**
+ Locks the group.
+
+ @returns The the result of the locking request.
+ */
+ LockType lock();
+
+ /**
+ Unlocks the group.
+
+ @param removeFile Whether the lock file shall be removed.
+ */
+ void unlock( bool removeFile = true );
+
+ /**
+ Adds a new member to the group.
+
+ @returns the new member.
+ */
+ Member addMember();
+
+ /**
+ Removes a member from the group.
+ */
+ void removeMember( const Member &member );
+
+ /**
+ Returns the number of members.
+ */
+ int memberCount() const;
+
+ /**
+ Returns the member at position @param pos.
+ */
+ Member memberAt( int pos ) const;
+
+ /**
+ Returns the number of filters.
+ */
+ int filterCount() const;
+
+ /**
+ Returns the filter at position @param pos.
+ */
+ Filter filterAt( int pos );
+
+ /**
+ Set, if the object type with given name is enabled for synchronisation for
+ this group.
+ */
+ void setObjectTypeEnabled( const QString &objectType, bool enabled );
+
+ /**
+ Returns whether the object type with given name is enabled for synchronisation for
+ this group.
+ */
+ bool isObjectTypeEnabled( const QString &objectType ) const;
+
+ /**
+ Saves the configuration to hard disc.
+ */
+ Result save();
+
+ /**
+ Returns the config object of this group.
+
+ Note: This method is only available for OpenSync 0.19 and 0.20.
+ */
+ GroupConfig config() const;
+
+ bool operator==( const Group &group ) const { return mGroup == group.mGroup; }
+
+ private:
+ OSyncGroup *mGroup;
+};
+
+}
+
+#endif
diff --git a/kitchensync/libqopensync/member.cpp b/kitchensync/libqopensync/member.cpp
new file mode 100644
index 000000000..3ac24f0dc
--- /dev/null
+++ b/kitchensync/libqopensync/member.cpp
@@ -0,0 +1,188 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <opensync/opensync.h>
+#include <stdlib.h>
+
+#include "member.h"
+
+using namespace QSync;
+
+Member::Member()
+ : mMember( 0 )
+{
+}
+
+Member::~Member()
+{
+}
+
+bool Member::isValid() const
+{
+ OSyncError *error = 0;
+
+ if ( !mMember )
+ return false;
+
+ if ( !osync_member_instance_plugin( mMember, pluginName().utf8(), &error ) ) {
+ qDebug( "Plugin %s is not valid: %s", pluginName().latin1(), osync_error_print( &error ) );
+ osync_error_free( &error );
+ return false;
+ }
+
+ return true;
+}
+
+QString Member::configurationDirectory() const
+{
+ Q_ASSERT( mMember );
+
+ return QString::fromLatin1( osync_member_get_configdir( mMember ) );
+}
+
+QString Member::pluginName() const
+{
+ Q_ASSERT( mMember );
+
+ return QString::fromLatin1( osync_member_get_pluginname( mMember ) );
+}
+
+Plugin Member::plugin() const
+{
+ Q_ASSERT( mMember );
+
+ Plugin plugin;
+
+ OSyncPlugin *oplugin = osync_member_get_plugin( mMember );
+ if ( oplugin )
+ plugin.mPlugin = oplugin;
+
+ return plugin;
+}
+
+int Member::id() const
+{
+ Q_ASSERT( mMember );
+
+ return osync_member_get_id( mMember );
+}
+
+void Member::setName( const QString &name )
+{
+ Q_ASSERT( mMember );
+
+ osync_member_set_name( mMember, (const char*)name.utf8() );
+}
+
+QString Member::name() const
+{
+ Q_ASSERT( mMember );
+
+ return QString::fromUtf8( osync_member_get_name( mMember ) );
+}
+
+void Member::setConfiguration( const QByteArray &configurationData )
+{
+ Q_ASSERT( mMember );
+
+ osync_member_set_config( mMember, configurationData.data(), configurationData.size() );
+}
+
+Result Member::configuration( QByteArray &configurationData, bool useDefault )
+{
+ Q_ASSERT( mMember );
+
+ char *data;
+ int size;
+
+ OSyncError *error = 0;
+ osync_bool ok = false;
+ if ( useDefault )
+ ok = osync_member_get_config_or_default( mMember, &data, &size, &error );
+ else
+ ok = osync_member_get_config( mMember, &data, &size, &error );
+
+ if ( !ok ) {
+ return Result( &error );
+ } else {
+ configurationData.resize( size );
+ memcpy( configurationData.data(), data, size );
+
+ return Result();
+ }
+}
+
+Result Member::save()
+{
+ Q_ASSERT( mMember );
+
+ OSyncError *error = 0;
+ if ( !osync_member_save( mMember, &error ) )
+ return Result( &error );
+ else
+ return Result();
+}
+
+Result Member::instance( const Plugin &plugin )
+{
+ OSyncError *error = 0;
+ if ( !osync_member_instance_plugin( mMember, plugin.name().utf8(), &error ) )
+ return Result( &error );
+ else
+ return Result();
+}
+
+bool Member::operator==( const Member &member ) const
+{
+ return mMember == member.mMember;
+}
+
+QString Member::scanDevices( const QString &query )
+{
+ Q_ASSERT( mMember );
+
+ OSyncError *error = 0;
+ char *data = (char*)osync_member_call_plugin( mMember, "scan_devices", const_cast<char*>( query.utf8().data() ), &error );
+ if ( error != 0 ) {
+ osync_error_free( &error );
+ return QString();
+ } else {
+ QString xml = QString::fromUtf8( data );
+ free( data );
+ return xml;
+ }
+}
+
+bool Member::testConnection( const QString &configuration )
+{
+ Q_ASSERT( mMember );
+
+ OSyncError *error = 0;
+ int *result = (int*)osync_member_call_plugin( mMember, "test_connection", const_cast<char*>( configuration.utf8().data() ), &error );
+ if ( error != 0 ) {
+ osync_error_free( &error );
+ return false;
+ } else {
+ bool value = ( *result == 1 ? true : false );
+ free( result );
+ return value;
+ }
+}
diff --git a/kitchensync/libqopensync/member.h b/kitchensync/libqopensync/member.h
new file mode 100644
index 000000000..d0d883db3
--- /dev/null
+++ b/kitchensync/libqopensync/member.h
@@ -0,0 +1,129 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef QSYNC_MEMBER_H
+#define QSYNC_MEMBER_H
+
+#include <libqopensync/plugin.h>
+#include <libqopensync/result.h>
+#include <libqopensync/plugin.h>
+
+class OSyncMember;
+
+namespace QSync {
+
+class Member
+{
+ friend class Group;
+ friend class SyncChange;
+ friend class SyncMemberUpdate;
+
+ public:
+ Member();
+ ~Member();
+
+ /**
+ Returns whether the member object is valid.
+ */
+ bool isValid() const;
+
+ /**
+ Returns the configuration directory.
+ */
+ QString configurationDirectory() const;
+
+ /**
+ Returns the name of the plugin, the member belongs to.
+ */
+ QString pluginName() const;
+
+ /**
+ Returns the plugin, the member belongs to.
+ */
+ Plugin plugin() const;
+
+ /**
+ Returns the id of the plugin.
+ */
+ int id() const;
+
+ /**
+ Sets the name of this member.
+ */
+ void setName( const QString &name );
+
+ /**
+ Returns the name of this member.
+ */
+ QString name() const;
+
+ /**
+ Sets the configuration data as byte array. The developer has to decide the
+ type of the data ( e.g. xml, plain text, binary ).
+ */
+ void setConfiguration( const QByteArray &configurationData );
+
+ /**
+ Gets the configuration data as byte array. The developer has to decide the
+ type of the data ( e.g. xml, plain text, binary ).
+
+ @param useDefault If set to true, return default config, if no config
+ exists. If set to false, return error when no config
+ exists.
+
+ @returns The result of this operation.
+ */
+ Result configuration( QByteArray &configurationData,
+ bool useDefault = true );
+
+ /**
+ Saves the changes to the configuration to hard disc.
+ */
+ Result save();
+
+ /**
+ Make this member an instance of the given plugin.
+ */
+ Result instance( const Plugin & );
+
+ bool operator==( const Member& ) const;
+
+ /**
+ This method can be used to query the plugin for scanning devices.
+ The @param query is a plugin specific xml document as well as
+ the return value.
+ */
+ QString scanDevices( const QString &query );
+
+ /**
+ This method can be used to test whether the plugin can connect
+ to the device with the given configuration.
+ */
+ bool testConnection( const QString &configuration );
+
+ private:
+ OSyncMember *mMember;
+};
+
+}
+
+#endif
+
diff --git a/kitchensync/libqopensync/plugin.cpp b/kitchensync/libqopensync/plugin.cpp
new file mode 100644
index 000000000..d22a5f344
--- /dev/null
+++ b/kitchensync/libqopensync/plugin.cpp
@@ -0,0 +1,62 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <opensync/opensync.h>
+
+#include "plugin.h"
+
+using namespace QSync;
+
+Plugin::Plugin()
+ : mPlugin( 0 )
+{
+}
+
+Plugin::~Plugin()
+{
+}
+
+bool Plugin::isValid() const
+{
+ return ( mPlugin != 0 );
+}
+
+QString Plugin::name() const
+{
+ Q_ASSERT( mPlugin );
+
+ return QString::fromLatin1( osync_plugin_get_name( mPlugin ) );
+}
+
+QString Plugin::longName() const
+{
+ Q_ASSERT( mPlugin );
+
+ return QString::fromLatin1( osync_plugin_get_longname( mPlugin ) );
+}
+
+QString Plugin::description() const
+{
+ Q_ASSERT( mPlugin );
+
+ return QString::fromLatin1( osync_plugin_get_description( mPlugin ) );
+}
+
diff --git a/kitchensync/libqopensync/plugin.h b/kitchensync/libqopensync/plugin.h
new file mode 100644
index 000000000..e951dfffa
--- /dev/null
+++ b/kitchensync/libqopensync/plugin.h
@@ -0,0 +1,67 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef QSYNC_PLUGIN_H
+#define QSYNC_PLUGIN_H
+
+#include <qstring.h>
+
+class OSyncPlugin;
+
+namespace QSync {
+
+class Plugin
+{
+ friend class Environment;
+ friend class Member;
+
+ public:
+ Plugin();
+ ~Plugin();
+
+ /**
+ Returns whether the object is a valid plugin.
+ */
+ bool isValid() const;
+
+ /**
+ Returns the name of the plugin.
+ */
+ QString name() const;
+
+ /**
+ Returns the long name of the plugin.
+ */
+ QString longName() const;
+
+ /**
+ Returns the description of the plugin.
+ */
+ QString description() const;
+
+ private:
+ OSyncPlugin *mPlugin;
+};
+
+}
+
+#endif
+
diff --git a/kitchensync/libqopensync/result.cpp b/kitchensync/libqopensync/result.cpp
new file mode 100644
index 000000000..b46040418
--- /dev/null
+++ b/kitchensync/libqopensync/result.cpp
@@ -0,0 +1,149 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "result.h"
+
+#include <opensync/opensync.h>
+
+using namespace QSync;
+
+Result::Result()
+ : mType( NoError )
+{
+}
+
+Result::Result( Type type )
+ : mType( type )
+{
+}
+
+Result::Result( OSyncError **error, bool deleteError )
+{
+ OSyncErrorType otype = osync_error_get_type( error );
+ Type type;
+
+ switch ( otype ) {
+ case OSYNC_NO_ERROR:
+ type = NoError;
+ break;
+ default:
+ case OSYNC_ERROR_GENERIC:
+ type = GenericError;
+ break;
+ case OSYNC_ERROR_IO_ERROR:
+ type = IOError;
+ break;
+ case OSYNC_ERROR_NOT_SUPPORTED:
+ type = NotSupported;
+ break;
+ case OSYNC_ERROR_TIMEOUT:
+ type = Timeout;
+ break;
+ case OSYNC_ERROR_DISCONNECTED:
+ type = Disconnected;
+ break;
+ case OSYNC_ERROR_FILE_NOT_FOUND:
+ type = FileNotFound;
+ break;
+ case OSYNC_ERROR_EXISTS:
+ type = Exists;
+ break;
+ case OSYNC_ERROR_CONVERT:
+ type = Convert;
+ break;
+ case OSYNC_ERROR_MISCONFIGURATION:
+ type = Misconfiguration;
+ break;
+ case OSYNC_ERROR_INITIALIZATION:
+ type = Initialization;
+ break;
+ case OSYNC_ERROR_PARAMETER:
+ type = Parameter;
+ break;
+ case OSYNC_ERROR_EXPECTED:
+ type = Expected;
+ break;
+ case OSYNC_ERROR_NO_CONNECTION:
+ type = NoConnection;
+ break;
+ case OSYNC_ERROR_TEMPORARY:
+ type = Temporary;
+ break;
+ case OSYNC_ERROR_LOCKED:
+ type = Locked;
+ break;
+ case OSYNC_ERROR_PLUGIN_NOT_FOUND:
+ type = PluginNotFound;
+ break;
+ }
+
+ mType = type;
+ mName = QString::fromUtf8( osync_error_get_name( error ) );
+ mMessage = QString::fromUtf8( osync_error_print( error ) );
+
+ if ( deleteError )
+ osync_error_free( error );
+}
+
+Result::~Result()
+{
+}
+
+void Result::setName( const QString &name )
+{
+ mName = name;
+}
+
+QString Result::name() const
+{
+ return mName;
+}
+
+void Result::setMessage( const QString &message )
+{
+ mMessage = message;
+}
+
+QString Result::message() const
+{
+ return mMessage;
+}
+
+void Result::setType( Type type )
+{
+ mType = type;
+}
+
+Result::Type Result::type() const
+{
+ return mType;
+}
+
+bool Result::isError() const
+{
+ return mType != NoError;
+}
+
+Result::operator bool () const
+{
+ return ( mType != NoError );
+}
+
diff --git a/kitchensync/libqopensync/result.h b/kitchensync/libqopensync/result.h
new file mode 100644
index 000000000..c7cf13d70
--- /dev/null
+++ b/kitchensync/libqopensync/result.h
@@ -0,0 +1,126 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef QSYNC_RESULT_H
+#define QSYNC_RESULT_H
+
+#include <qstring.h>
+
+struct OSyncError;
+
+namespace QSync {
+
+class Result
+{
+ public:
+ /**
+ Result types.
+ */
+ enum Type {
+ NoError,
+ GenericError,
+ IOError,
+ NotSupported,
+ Timeout,
+ Disconnected,
+ FileNotFound,
+ Exists,
+ Convert,
+ Misconfiguration,
+ Initialization,
+ Parameter,
+ Expected,
+ NoConnection,
+ Temporary,
+ Locked,
+ PluginNotFound
+ };
+
+ /**
+ Constructs a NoError result.
+ */
+ Result();
+
+ /**
+ Constructs a result of the given type.
+ */
+ Result( Type type );
+
+ /**
+ Construct Result from OpenSync error object. Deletes the OpenSync error
+ object.
+ */
+ Result( OSyncError **, bool deleteError = true );
+
+ /**
+ Destroys the result.
+ */
+ ~Result();
+
+ /**
+ Sets the name of the result.
+ */
+ void setName( const QString &name );
+
+ /**
+ Returns the name of the result.
+ */
+ QString name() const;
+
+ /**
+ Sets the message text of the result.
+ */
+ void setMessage( const QString &message );
+
+ /**
+ Returns the message text of the result.
+ */
+ QString message() const;
+
+ /**
+ Sets the type of the result.
+ */
+ void setType( Type type );
+
+ /**
+ Returns the type of the result.
+ */
+ Type type() const;
+
+ /**
+ Reimplemented boolean operator.
+ */
+ operator bool () const;
+
+ /**
+ Return true, if this Result is an error, return false otherwise.
+ */
+ bool isError() const;
+
+ private:
+ QString mName;
+ QString mMessage;
+ Type mType;
+};
+
+}
+
+#endif
diff --git a/kitchensync/libqopensync/syncchange.cpp b/kitchensync/libqopensync/syncchange.cpp
new file mode 100644
index 000000000..f64ef6493
--- /dev/null
+++ b/kitchensync/libqopensync/syncchange.cpp
@@ -0,0 +1,159 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <opensync/file.h>
+#include <opensync/opensync.h>
+
+#include "syncchange.h"
+
+using namespace QSync;
+
+SyncChange::SyncChange()
+{
+}
+
+SyncChange::SyncChange( OSyncChange *change )
+{
+ mSyncChange = change;
+}
+
+SyncChange::~SyncChange()
+{
+}
+
+bool SyncChange::isValid() const
+{
+ return ( mSyncChange != 0 );
+}
+
+void SyncChange::setUid( const QString &uid )
+{
+ osync_change_set_uid( mSyncChange, uid.utf8() );
+}
+
+QString SyncChange::uid() const
+{
+ return QString::fromUtf8( osync_change_get_uid( mSyncChange ) );
+}
+
+void SyncChange::setHash( const QString &hash )
+{
+ osync_change_set_hash( mSyncChange, hash.utf8() );
+}
+
+QString SyncChange::hash() const
+{
+ return QString::fromUtf8( osync_change_get_hash( mSyncChange ) );
+}
+
+void SyncChange::setData( const QString &data )
+{
+ osync_change_set_data( mSyncChange, const_cast<char*>( data.utf8().data() ), data.utf8().size(), true );
+}
+
+QString SyncChange::data() const
+{
+ int size = osync_change_get_datasize( mSyncChange );
+
+ QString content;
+ if ( objectFormatName() == "file" ) {
+ fileFormat *format = (fileFormat*)osync_change_get_data( mSyncChange );
+ if ( format )
+ content = QString::fromUtf8( format->data, format->size );
+ } else
+ content = QString::fromUtf8( osync_change_get_data( mSyncChange ), size );
+
+ return content;
+}
+
+bool SyncChange::hasData() const
+{
+ return osync_change_has_data( mSyncChange );
+}
+
+QString SyncChange::objectFormatName() const
+{
+ OSyncObjFormat *format = osync_change_get_objformat( mSyncChange );
+ Q_ASSERT( format );
+
+ return QString::fromUtf8( osync_objformat_get_name( format ) );
+}
+
+Member SyncChange::member() const
+{
+ OSyncMember *omember = osync_change_get_member( mSyncChange );
+
+ Member m;
+ m.mMember = omember;
+
+ return m;
+}
+
+void SyncChange::setChangeType( Type changeType )
+{
+ OSyncChangeType ochangeType;
+
+ switch ( changeType ) {
+ case AddedChange:
+ ochangeType = CHANGE_ADDED;
+ break;
+ case UnmodifiedChange:
+ ochangeType = CHANGE_UNMODIFIED;
+ break;
+ case DeletedChange:
+ ochangeType = CHANGE_DELETED;
+ break;
+ case ModifiedChange:
+ ochangeType = CHANGE_MODIFIED;
+ break;
+ case UnknownChange:
+ default:
+ ochangeType = CHANGE_UNKNOWN;
+ break;
+ }
+
+ osync_change_set_changetype( mSyncChange, ochangeType );
+}
+
+SyncChange::Type SyncChange::changeType() const
+{
+ OSyncChangeType ochangeType = osync_change_get_changetype( mSyncChange );
+
+ switch ( ochangeType ) {
+ case CHANGE_ADDED:
+ return AddedChange;
+ break;
+ case CHANGE_UNMODIFIED:
+ return UnmodifiedChange;
+ break;
+ case CHANGE_DELETED:
+ return DeletedChange;
+ break;
+ case CHANGE_MODIFIED:
+ return ModifiedChange;
+ break;
+ case CHANGE_UNKNOWN:
+ default:
+ return UnknownChange;
+ break;
+ }
+}
+
diff --git a/kitchensync/libqopensync/syncchange.h b/kitchensync/libqopensync/syncchange.h
new file mode 100644
index 000000000..775d3a8ed
--- /dev/null
+++ b/kitchensync/libqopensync/syncchange.h
@@ -0,0 +1,116 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef QSYNC_SYNCCHANGE_H
+#define QSYNC_SYNCCHANGE_H
+
+#include <libqopensync/member.h>
+
+class OSyncChange;
+
+namespace QSync {
+
+class SyncChange
+{
+ friend class SyncMapping;
+
+ public:
+ enum Type
+ {
+ UnknownChange,
+ AddedChange,
+ UnmodifiedChange,
+ DeletedChange,
+ ModifiedChange
+ };
+
+ SyncChange();
+ SyncChange( OSyncChange* );
+ ~SyncChange();
+
+ /**
+ Returns whether it's a valid SyncChange.
+ */
+ bool isValid() const;
+
+ /**
+ Sets the uid of this change.
+ */
+ void setUid( const QString &uid );
+
+ /**
+ Returns the uid of this change.
+ */
+ QString uid() const;
+
+ /**
+ Sets the hash of this change.
+ */
+ void setHash( const QString &hash );
+
+ /**
+ Returns the hash of this change.
+ */
+ QString hash() const;
+
+ /**
+ Sets the data provided by the plugin.
+ */
+ void setData( const QString &data );
+
+ /**
+ Returns the data provided by the plugin.
+ */
+ QString data() const;
+
+ /**
+ Returns whether the change contains data.
+ */
+ bool hasData() const;
+
+ /**
+ Returns the object format name.
+ */
+ QString objectFormatName() const;
+
+ /**
+ Returns the parent member of this change.
+ */
+ Member member() const;
+
+ /**
+ Sets the change type.
+ */
+ void setChangeType( Type changeType );
+
+ /**
+ Returns the change type.
+ */
+ Type changeType() const;
+
+ private:
+ OSyncChange *mSyncChange;
+};
+
+}
+
+#endif
+
diff --git a/kitchensync/libqopensync/syncmapping.cpp b/kitchensync/libqopensync/syncmapping.cpp
new file mode 100644
index 000000000..8097c5482
--- /dev/null
+++ b/kitchensync/libqopensync/syncmapping.cpp
@@ -0,0 +1,100 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qstring.h>
+#include <osengine/engine.h>
+
+#include "syncmapping.h"
+
+using namespace QSync;
+
+SyncMapping::SyncMapping()
+ : mEngine( 0 ), mMapping( 0 )
+{
+}
+
+SyncMapping::SyncMapping( OSyncMapping *mapping, OSyncEngine *engine )
+ : mEngine( engine ), mMapping( mapping )
+{
+}
+
+SyncMapping::~SyncMapping()
+{
+}
+
+bool SyncMapping::isValid() const
+{
+ return ( mEngine != 0 && mMapping != 0 );
+}
+
+long long SyncMapping::id() const
+{
+ Q_ASSERT( mMapping );
+
+ return osengine_mapping_get_id( mMapping );
+}
+
+void SyncMapping::duplicate()
+{
+ Q_ASSERT( mEngine );
+ Q_ASSERT( mMapping );
+
+ osengine_mapping_duplicate( mEngine, mMapping );
+}
+
+void SyncMapping::solve( const SyncChange &change )
+{
+ Q_ASSERT( mEngine );
+ Q_ASSERT( mMapping );
+ Q_ASSERT( change.isValid() );
+
+ osengine_mapping_solve( mEngine, mMapping, change.mSyncChange );
+}
+
+void SyncMapping::ignore()
+{
+ Q_ASSERT( mEngine );
+ Q_ASSERT( mMapping );
+
+ //TODO: error should be returned as Result
+ OSyncError *error = 0;
+ osengine_mapping_ignore_conflict( mEngine, mMapping, &error );
+}
+
+int SyncMapping::changesCount() const
+{
+ Q_ASSERT( mMapping );
+
+ return osengine_mapping_num_changes( mMapping );
+}
+
+SyncChange SyncMapping::changeAt( int pos )
+{
+ Q_ASSERT( mMapping );
+
+ if ( pos < 0 || pos >= osengine_mapping_num_changes( mMapping ) )
+ return SyncChange();
+
+ OSyncChange *ochange = osengine_mapping_nth_change( mMapping, pos );
+
+ return SyncChange( ochange );
+}
+
diff --git a/kitchensync/libqopensync/syncmapping.h b/kitchensync/libqopensync/syncmapping.h
new file mode 100644
index 000000000..6de67330a
--- /dev/null
+++ b/kitchensync/libqopensync/syncmapping.h
@@ -0,0 +1,59 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef QSYNC_SYNCMAPPING_H
+#define QSYNC_SYNCMAPPING_H
+
+#include <libqopensync/syncchange.h>
+
+class OSyncEngine;
+class OSyncMapping;
+
+namespace QSync {
+
+class SyncMapping
+{
+ friend class SyncMappingUpdate;
+
+ public:
+ SyncMapping();
+ SyncMapping( OSyncMapping*, OSyncEngine* );
+ ~SyncMapping();
+
+ bool isValid() const;
+
+ long long id() const;
+
+ void duplicate();
+ void solve( const SyncChange &change );
+ void ignore();
+
+ int changesCount() const;
+ SyncChange changeAt( int pos );
+
+ private:
+ OSyncEngine *mEngine;
+ OSyncMapping *mMapping;
+};
+
+}
+
+#endif
diff --git a/kitchensync/libqopensync/syncupdates.cpp b/kitchensync/libqopensync/syncupdates.cpp
new file mode 100644
index 000000000..653ccf7f3
--- /dev/null
+++ b/kitchensync/libqopensync/syncupdates.cpp
@@ -0,0 +1,251 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <osengine/engine.h>
+
+#include "syncupdates.h"
+
+using namespace QSync;
+
+SyncMemberUpdate::SyncMemberUpdate()
+{
+}
+
+SyncMemberUpdate::SyncMemberUpdate( OSyncMemberUpdate *update )
+{
+ switch ( update->type ) {
+ case MEMBER_CONNECTED:
+ mType = Connected;
+ break;
+ case MEMBER_SENT_CHANGES:
+ mType = SentChanges;
+ break;
+ case MEMBER_COMMITTED_ALL:
+ mType = CommittedAll;
+ break;
+ case MEMBER_DISCONNECTED:
+ mType = Disconnected;
+ break;
+ case MEMBER_CONNECT_ERROR:
+ mType = ConnectError;
+ break;
+ case MEMBER_GET_CHANGES_ERROR:
+ mType = GetChangesError;
+ break;
+ case MEMBER_COMMITTED_ALL_ERROR:
+ mType = CommittedAllError;
+ break;
+ case MEMBER_SYNC_DONE_ERROR:
+ mType = SyncDoneError;
+ break;
+ case MEMBER_DISCONNECT_ERROR:
+ mType = DisconnectedError;
+ break;
+ }
+
+ if ( update->error )
+ mResult = Result( &(update->error) );
+
+ mMember.mMember = update->member;
+}
+
+SyncMemberUpdate::~SyncMemberUpdate()
+{
+}
+
+SyncMemberUpdate::Type SyncMemberUpdate::type() const
+{
+ return mType;
+}
+
+Result SyncMemberUpdate::result() const
+{
+ return mResult;
+}
+
+Member SyncMemberUpdate::member() const
+{
+ return mMember;
+}
+
+
+SyncChangeUpdate::SyncChangeUpdate()
+{
+}
+
+SyncChangeUpdate::SyncChangeUpdate( OSyncChangeUpdate *update )
+{
+ switch ( update->type ) {
+ case CHANGE_RECEIVED:
+ mType = Received;
+ break;
+ case CHANGE_RECEIVED_INFO:
+ mType = ReceivedInfo;
+ break;
+ case CHANGE_SENT:
+ mType = Sent;
+ break;
+ case CHANGE_WRITE_ERROR:
+ mType = WriteError;
+ break;
+ case CHANGE_RECV_ERROR:
+ mType = ReceiveError;
+ break;
+ }
+
+ if ( update->error )
+ mResult = Result( &(update->error) );
+
+ mChange = SyncChange( update->change );
+ mMemberId = update->member_id;
+ mMappingId = update->mapping_id;
+}
+
+SyncChangeUpdate::~SyncChangeUpdate()
+{
+}
+
+SyncChangeUpdate::Type SyncChangeUpdate::type() const
+{
+ return mType;
+}
+
+Result SyncChangeUpdate::result() const
+{
+ return mResult;
+}
+
+SyncChange SyncChangeUpdate::change() const
+{
+ return mChange;
+}
+
+int SyncChangeUpdate::memberId() const
+{
+ return mMemberId;
+}
+
+int SyncChangeUpdate::mappingId() const
+{
+ return mMappingId;
+}
+
+SyncMappingUpdate::SyncMappingUpdate()
+{
+}
+
+SyncMappingUpdate::SyncMappingUpdate( OSyncMappingUpdate *update, OSyncEngine *engine )
+{
+ switch ( update->type ) {
+ case MAPPING_SOLVED:
+ mType = Solved;
+ break;
+ case MAPPING_SYNCED:
+ mType = Synced;
+ break;
+ case MAPPING_WRITE_ERROR:
+ mType = WriteError;
+ break;
+ }
+
+ if ( update->error )
+ mResult = Result( &(update->error) );
+
+ mWinner = update->winner;
+ mMapping.mEngine = engine;
+ mMapping.mMapping = update->mapping;
+}
+
+SyncMappingUpdate::~SyncMappingUpdate()
+{
+}
+
+SyncMappingUpdate::Type SyncMappingUpdate::type() const
+{
+ return mType;
+}
+
+Result SyncMappingUpdate::result() const
+{
+ return mResult;
+}
+
+long long int SyncMappingUpdate::winner() const
+{
+ return mWinner;
+}
+
+SyncMapping SyncMappingUpdate::mapping() const
+{
+ return mMapping;
+}
+
+SyncEngineUpdate::SyncEngineUpdate()
+{
+}
+
+SyncEngineUpdate::SyncEngineUpdate( OSyncEngineUpdate *update )
+{
+ switch ( update->type ) {
+ case ENG_ENDPHASE_CON:
+ mType = EndPhaseConnected;
+ break;
+ case ENG_ENDPHASE_READ:
+ mType = EndPhaseRead;
+ break;
+ case ENG_ENDPHASE_WRITE:
+ mType = EndPhaseWrite;
+ break;
+ case ENG_ENDPHASE_DISCON:
+ mType = EndPhaseDisconnected;
+ break;
+ case ENG_ERROR:
+ mType = Error;
+ break;
+ case ENG_SYNC_SUCCESSFULL:
+ mType = SyncSuccessfull;
+ break;
+ case ENG_PREV_UNCLEAN:
+ mType = PrevUnclean;
+ break;
+ case ENG_END_CONFLICTS:
+ mType = EndConflicts;
+ break;
+ }
+
+ if ( update->error )
+ mResult = Result( &(update->error) );
+}
+
+SyncEngineUpdate::~SyncEngineUpdate()
+{
+}
+
+SyncEngineUpdate::Type SyncEngineUpdate::type() const
+{
+ return mType;
+}
+
+Result SyncEngineUpdate::result() const
+{
+ return mResult;
+}
+
diff --git a/kitchensync/libqopensync/syncupdates.h b/kitchensync/libqopensync/syncupdates.h
new file mode 100644
index 000000000..14a2d9193
--- /dev/null
+++ b/kitchensync/libqopensync/syncupdates.h
@@ -0,0 +1,157 @@
+/*
+ This file is part of libqopensync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef QSYNC_SYNCUPDATES_H
+#define QSYNC_SYNCUPDATES_H
+
+#include <libqopensync/member.h>
+#include <libqopensync/result.h>
+#include <libqopensync/syncchange.h>
+#include <libqopensync/syncmapping.h>
+
+class OSyncMemberUpdate;
+class OSyncChangeUpdate;
+class OSyncMappingUpdate;
+class OSyncEngineUpdate;
+class OSyncMemberUpdate;
+
+namespace QSync {
+
+class SyncMemberUpdate
+{
+ friend class CallbackHandler;
+
+ public:
+ enum Type {
+ Connected,
+ SentChanges,
+ CommittedAll,
+ Disconnected,
+ ConnectError,
+ GetChangesError,
+ CommittedAllError,
+ SyncDoneError,
+ DisconnectedError
+ };
+
+ SyncMemberUpdate();
+ SyncMemberUpdate( OSyncMemberUpdate* );
+ ~SyncMemberUpdate();
+
+ Type type() const;
+ Result result() const;
+ Member member() const;
+
+ private:
+ Type mType;
+ Result mResult;
+ Member mMember;
+};
+
+class SyncChangeUpdate
+{
+ friend class CallbackHandler;
+
+ public:
+ enum Type {
+ Received = 1,
+ ReceivedInfo,
+ Sent,
+ WriteError,
+ ReceiveError
+ };
+
+ SyncChangeUpdate();
+ SyncChangeUpdate( OSyncChangeUpdate* );
+ ~SyncChangeUpdate();
+
+ Type type() const;
+ Result result() const;
+ SyncChange change() const;
+ int memberId() const;
+ int mappingId() const;
+
+ private:
+ Type mType;
+ Result mResult;
+ SyncChange mChange;
+ int mMemberId;
+ int mMappingId;
+};
+
+class SyncMappingUpdate
+{
+ friend class CallbackHandler;
+
+ public:
+ enum Type {
+ Solved = 1,
+ Synced,
+ WriteError
+ };
+
+ SyncMappingUpdate();
+ SyncMappingUpdate( OSyncMappingUpdate*, OSyncEngine* );
+ ~SyncMappingUpdate();
+
+ Type type() const;
+ Result result() const;
+ long long int winner() const;
+ SyncMapping mapping() const;
+
+ private:
+ Type mType;
+ Result mResult;
+ long long int mWinner;
+ SyncMapping mMapping;
+};
+
+class SyncEngineUpdate
+{
+ friend class CallbackHandler;
+
+ public:
+ enum Type {
+ EndPhaseConnected = 1,
+ EndPhaseRead,
+ EndPhaseWrite,
+ EndPhaseDisconnected,
+ Error,
+ SyncSuccessfull,
+ PrevUnclean,
+ EndConflicts
+ };
+
+ SyncEngineUpdate();
+ SyncEngineUpdate( OSyncEngineUpdate* );
+ ~SyncEngineUpdate();
+
+ Type type() const;
+ Result result() const;
+
+ private:
+ Type mType;
+ Result mResult;
+};
+
+}
+
+#endif
diff --git a/kitchensync/opensyncdbus/Makefile.am b/kitchensync/opensyncdbus/Makefile.am
new file mode 100644
index 000000000..9b1721f6e
--- /dev/null
+++ b/kitchensync/opensyncdbus/Makefile.am
@@ -0,0 +1,10 @@
+INCLUDES = -I/usr/local/include/dbus-1.0/qt3 $(all_includes) \
+ -I$(top_srcdir)/kitchensync
+
+bin_PROGRAMS = opensyncdbus
+
+opensyncdbus_SOURCES = dbusclient.cpp
+opensyncdbus_LDADD = $(top_builddir)/kitchensync/libqopensync/libqopensync.la
+opensyncdbus_LDFLAGS = -ldbus-1-qt3 -ldbus-1 $(all_libraries) $(KDE_RPATH)
+
+METASOURCES = AUTO
diff --git a/kitchensync/opensyncdbus/README b/kitchensync/opensyncdbus/README
new file mode 100644
index 000000000..e1aa1e3ce
--- /dev/null
+++ b/kitchensync/opensyncdbus/README
@@ -0,0 +1,5 @@
+This directory contains opensyncdbus, a D-BUS frontend for OpenSync. It's a
+daemon which provides a D-BUS interface for controlling OpenSync.
+
+To compile opensyncdbus you need the Qt3 bindings for D-BUS.
+They are in SVN under branches/work/dbus-qt4-qt3backport/
diff --git a/kitchensync/opensyncdbus/dbusclient.cpp b/kitchensync/opensyncdbus/dbusclient.cpp
new file mode 100644
index 000000000..fcf6eda30
--- /dev/null
+++ b/kitchensync/opensyncdbus/dbusclient.cpp
@@ -0,0 +1,273 @@
+/*
+ This file is part of KDE.
+
+ Copyright (c) 2006 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "dbusclient.h"
+
+#include <libqopensync/environment.h>
+#include <libqopensync/group.h>
+
+#include <dbus/qdbuserror.h>
+#include <dbus/qdbusconnection.h>
+#include <dbus/qdbusmessage.h>
+#include <dbus/qdbusproxy.h>
+
+#include <qapplication.h>
+#include <qtimer.h>
+
+#include <iostream>
+
+OpenSyncService::OpenSyncService()
+ : mConnection( 0 )
+{
+}
+
+void OpenSyncService::setConnection( QDBusConnection *connection )
+{
+ mConnection = connection;
+ mConnection->registerObject( "/ABC", this );
+}
+
+bool OpenSyncService::handleMethodCall( const QDBusMessage &message )
+{
+ qDebug( "OpenSyncService::handleMethodCall()" );
+
+ qDebug( " Interface: %s", message.interface().latin1() );
+ qDebug( " Path: %s", message.path().latin1() );
+ qDebug( " Member: %s", message.member().latin1() );
+ qDebug( " Sender: %s", message.sender().latin1() );
+
+ if ( message.interface() != "org.opensync.SyncEngine" ) return false;
+
+ QDBusMessage reply;
+
+ QString function = message.member();
+ if ( function == "hello" ) {
+ reply = hello( message );
+ } else if ( function == "randomNumber" ) {
+ reply = randomNumber( message );
+ } else if ( function == "listGroups" ) {
+ reply = listGroups( message );
+ } else if ( function == "listPlugins" ) {
+ reply = listPlugins( message );
+ } else if ( function == "showGroup" ) {
+ reply = showGroup( message );
+ } else if ( function == "showMember" ) {
+ reply = showMember( message );
+ } else {
+ return false;
+ }
+
+ mConnection->send( reply );
+
+ return true;
+}
+
+QDBusMessage OpenSyncService::showMember( const QDBusMessage &message )
+{
+ if ( message.count() != 2 ) {
+ return error( message, "arg_count",
+ QString("Wrong number of arguments. Expected 2, got %1.")
+ .arg( message.count() ) );
+ }
+
+ QString groupName = message[ 0 ].toString();
+ if ( groupName.isEmpty() ) {
+ return error( message, "missing_arg", "Missing argument: group name." );
+ }
+
+ bool ok;
+ int memberId = message[ 1 ].toInt( &ok );
+ if ( !ok ) {
+ return error( message, "missing_arg", "Missing argument: member id." );
+ }
+
+ QDBusMessage reply;
+
+ QSync::Environment env;
+ QSync::Result result = env.initialize();
+ if ( result.isError() ) {
+ return error( message, result.name(), result.message() );
+ } else {
+ reply = QDBusMessage::methodReply( message );
+
+ QSync::Group group = env.groupByName( groupName );
+ if ( !group.isValid() ) {
+ return error( message, "group_name", QString("Unknown group '%1'.")
+ .arg( groupName ) );
+ }
+
+ QSync::Member member = group.memberById( memberId );
+ if ( !member.isValid() ) {
+ return error( message, "member_id",
+ QString("Unknown member id '%1' in group '%2'.").arg( groupName )
+ .arg( memberId ) );
+ }
+
+ reply.append( memberId );
+ reply.append( member.pluginName() );
+
+ env.finalize();
+ }
+
+ return reply;
+}
+
+
+QDBusMessage OpenSyncService::showGroup( const QDBusMessage &message )
+{
+ if ( message.count() != 1 ) {
+ return error( message, "arg_count",
+ QString("Wrong number of arguments. Expected 1, got %1")
+ .arg( message.count() ) );
+ }
+
+ QString groupName = message[ 0 ].toString();
+ if ( groupName.isEmpty() ) {
+ return error( message, "missing_arg", "Missing argument group name." );
+ }
+
+ QDBusMessage reply;
+
+ QSync::Environment env;
+ QSync::Result result = env.initialize();
+ if ( result.isError() ) {
+ return error( message, result.name(), result.message() );
+ } else {
+ reply = QDBusMessage::methodReply( message );
+
+ QSync::Group group = env.groupByName( groupName );
+ if ( !group.isValid() ) {
+ return error( message, "group_name", QString("Unknown group '%1'")
+ .arg( groupName ) );
+ }
+
+ QSync::Group::Iterator it( &group );
+ for( it = group.begin(); it != group.end(); ++it ) {
+ QSync::Member member = *it;
+ reply.append( QVariant( member.id() ) );
+ }
+
+ env.finalize();
+ }
+
+ return reply;
+}
+
+QDBusMessage OpenSyncService::error( const QDBusMessage &message,
+ const QString &errorCode,
+ const QString &errorMessage )
+{
+ QDBusError error( "org.opensync." + errorCode, errorMessage );
+ return QDBusMessage::methodError( message, error );
+}
+
+QDBusMessage OpenSyncService::listPlugins( const QDBusMessage &message )
+{
+ QDBusMessage reply;
+
+ QSync::Environment env;
+ QSync::Result result = env.initialize();
+ if ( result.isError() ) {
+ QDBusError error( result.name(), result.message() );
+ reply = QDBusMessage::methodError( message, error );
+ } else {
+ reply = QDBusMessage::methodReply( message );
+
+ QSync::Environment::PluginIterator it( env.pluginBegin() );
+ for ( ; it != env.pluginEnd(); ++it ) {
+ reply.append( QVariant( (*it).name() ) );
+ }
+
+ env.finalize();
+ }
+
+ return reply;
+}
+
+QDBusMessage OpenSyncService::listGroups( const QDBusMessage &message )
+{
+ QDBusMessage reply;
+
+ QSync::Environment env;
+ QSync::Result result = env.initialize();
+ if ( result.isError() ) {
+ QDBusError error( result.name(), result.message() );
+ reply = QDBusMessage::methodError( message, error );
+ } else {
+ reply = QDBusMessage::methodReply( message );
+
+ QSync::Environment::GroupIterator it( env.groupBegin() );
+ for ( ; it != env.groupEnd(); ++it ) {
+ reply.append( QVariant( (*it).name() ) );
+ }
+
+ env.finalize();
+ }
+
+ return reply;
+}
+
+QDBusMessage OpenSyncService::hello( const QDBusMessage &message )
+{
+ QDBusMessage reply = QDBusMessage::methodReply( message );
+
+// QDBusError error;
+// reply = QDBusMessage::methodError( message, error );
+
+ reply.append( QVariant( QString( "Hello!" ) ) );
+
+ return reply;
+}
+
+QDBusMessage OpenSyncService::randomNumber( const QDBusMessage &message )
+{
+ QDBusMessage reply = QDBusMessage::methodReply( message );
+
+ int number = rand();
+
+ reply.append( QVariant( number ) );
+
+ return reply;
+}
+
+int main( int argc, char *argv[] )
+{
+ QApplication app(argc, argv);
+
+ std::cout << "Hello" << std::endl;
+
+ QDBusConnection connection = QDBusConnection::addConnection(
+ QDBusConnection::SessionBus );
+
+ if ( !connection.isConnected() ) {
+ qFatal("Cannot connect to session bus");
+ }
+
+ connection.requestName( "org.opensync.SyncEngine",
+ QDBusConnection::NoReplace );
+
+ OpenSyncService service;
+ service.setConnection( &connection );
+
+ return app.exec();
+}
+
+//#include "dbusclient.moc"
diff --git a/kitchensync/opensyncdbus/dbusclient.h b/kitchensync/opensyncdbus/dbusclient.h
new file mode 100644
index 000000000..5cd6635f7
--- /dev/null
+++ b/kitchensync/opensyncdbus/dbusclient.h
@@ -0,0 +1,56 @@
+/*
+ This file is part of KDE.
+
+ Copyright (c) 2006 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+#ifndef DBUSCLIENT_H
+#define DBUSCLIENT_H
+
+#include <qobject.h>
+
+#include <dbus/qdbusobject.h>
+
+class QDBusMessage;
+class QDBusConnection;
+
+class OpenSyncService : public QDBusObjectBase
+{
+ public:
+ OpenSyncService();
+
+ void setConnection( QDBusConnection *connection );
+
+ protected:
+ virtual bool handleMethodCall( const QDBusMessage &message );
+
+ QDBusMessage hello( const QDBusMessage & );
+ QDBusMessage randomNumber( const QDBusMessage & );
+
+ QDBusMessage listGroups( const QDBusMessage &message );
+ QDBusMessage listPlugins( const QDBusMessage &message );
+ QDBusMessage showGroup( const QDBusMessage &message );
+ QDBusMessage showMember( const QDBusMessage &message );
+
+ QDBusMessage error( const QDBusMessage &, const QString &errorCode,
+ const QString &errorMessage );
+
+ private:
+ QDBusConnection *mConnection;
+};
+
+#endif
diff --git a/kitchensync/src/Makefile.am b/kitchensync/src/Makefile.am
new file mode 100644
index 000000000..7f94fc173
--- /dev/null
+++ b/kitchensync/src/Makefile.am
@@ -0,0 +1,52 @@
+SUBDIRS = about pics
+
+INCLUDES = -I$(top_srcdir)/kitchensync/src \
+ -I$(top_srcdir)/kitchensync \
+ -I$(top_srcdir)/libkdepim \
+ -I$(top_srcdir) \
+ $(all_includes)
+
+# Application
+bin_PROGRAMS = kitchensync
+
+kitchensync_SOURCES = main.cpp mainwindow.cpp
+kitchensync_LDFLAGS = $(KDE_RPATH) $(all_libraries)
+kitchensync_LDADD = libkitchensync.la
+
+xdg_apps_DATA = kitchensync.desktop
+
+# Library
+lib_LTLIBRARIES = libkitchensync.la
+
+libkitchensync_la_SOURCES = aboutpage.cpp mainwidget.cpp groupconfigdialog.cpp \
+ groupconfig.cpp groupitem.cpp groupview.cpp memberconfig.cpp \
+ syncprocess.cpp syncprocessmanager.cpp connectionwidgets.cpp \
+ pluginpicker.cpp configgui.cpp configguiblank.cpp configguifile.cpp \
+ memberinfo.cpp groupconfigcommon.cpp kwidgetlist.cpp \
+ configguipalm.cpp conflictdialog.cpp singleconflictdialog.cpp \
+ addresseediffalgo.cpp calendardiffalgo.cpp \
+ htmldiffalgodisplay.cpp genericdiffalgo.cpp multiconflictdialog.cpp \
+ configguiirmc.cpp \
+ configguisyncmlobex.cpp configguisyncmlhttp.cpp configguiopie.cpp \
+ configguignokii.cpp configguigcalendar.cpp configguildap.cpp configguigpe.cpp \
+ configguijescs.cpp configguievo2.cpp configguimoto.cpp configguisynce.cpp \
+ configguisunbird.cpp
+libkitchensync_la_LDFLAGS = $(all_libraries) $(KDE_RPATH) -no-undefined
+libkitchensync_la_LIBADD = $(LIB_KIO) $(LIB_KHTML) $(top_builddir)/kitchensync/libqopensync/libqopensync.la \
+ $(LIB_KABC) $(top_builddir)/libkdepim/libkdepim.la $(top_builddir)/libkcal/libkcal.la
+
+# KPart
+kde_module_LTLIBRARIES = libkitchensyncpart.la
+
+libkitchensyncpart_la_SOURCES = part.cpp
+libkitchensyncpart_la_LDFLAGS = -module $(KDE_PLUGIN) $(KDE_RPATH) $(all_libraries) -no-undefined
+libkitchensyncpart_la_LIBADD = $(LIB_KPARTS) libkitchensync.la
+
+# Resources
+kitchensyncdatadir = $(kde_datadir)/kitchensync
+kitchensyncdata_DATA = kitchensyncui.rc kitchensync_part.rc
+
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/kitchensync.pot
diff --git a/kitchensync/src/about/Makefile.am b/kitchensync/src/about/Makefile.am
new file mode 100644
index 000000000..6a4c77c59
--- /dev/null
+++ b/kitchensync/src/about/Makefile.am
@@ -0,0 +1,6 @@
+about_DATA = \
+ top-right-kitchensync.png \
+ main.html \
+ kitchensync.css
+
+aboutdir = $(kde_datadir)/kitchensync/about
diff --git a/kitchensync/src/about/kitchensync.css b/kitchensync/src/about/kitchensync.css
new file mode 100644
index 000000000..18aa0ddcd
--- /dev/null
+++ b/kitchensync/src/about/kitchensync.css
@@ -0,0 +1,30 @@
+
+#headerR {
+ position: absolute;
+ right: 0px;
+ width: 430px;
+ height: 131px;
+ background-image: url(top-right-kontact.png);
+}
+
+#title {
+ right: 125px;
+}
+
+#tagline {
+ right: 125px;
+}
+
+#boxCenter {
+ background-image: url(box-center-kontact.png);
+ background-repeat: no-repeat;
+ background-color: #dfe7f3;
+ background-position: bottom right;
+}
+
+#subtext {
+ font-style: italic;
+}
+
+/* vim:set sw=2 et nocindent smartindent: */
+
diff --git a/kitchensync/src/about/main.html b/kitchensync/src/about/main.html
new file mode 100644
index 000000000..2474a7fca
--- /dev/null
+++ b/kitchensync/src/about/main.html
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for Linux/x86 (vers 1st August 2004), see www.w3.org" />
+
+ <style type="text/css">
+ /*<![CDATA[*/
+ @import "%1"; /* kde_infopage.css */
+ %1 /* maybe @import "kde_infopage_rtl.css"; */
+ @import "kitchensync.css";
+ body {font-size: %1px;}
+ /*]]>*/
+ </style>
+
+ <title>KitchenSync</title>
+</head>
+
+<body>
+ <div id="header">
+ <div id="headerL"/>
+ <div id="headerR"/>
+
+ <div id="title">
+ %2 <!-- KitchenSync -->
+ </div>
+
+ <div id="tagline">
+ %3 <!-- Catchphrase -->
+ </div>
+ </div>
+
+ <!-- the bar -->
+ <div id="bar">
+ <div id="barT"><div id="barTL"/><div id="barTR"/><div id="barTC"/></div>
+ <div id="barL">
+ <div id="barR">
+ <div id="barCenter" class="bar_text">
+ %4<!-- KitchenSync is ... -->
+ </div>
+ </div>
+ </div>
+ <div id="barB"><div id="barBL"/><div id="barBR"/><div id="barBC"/></div>
+ </div>
+
+ <!-- the main text box -->
+ <div id="box">
+ <div id="boxT"><div id="boxTL"/><div id="boxTR"/><div id="boxTC"/></div>
+ <div id="boxL">
+ <div id="boxR">
+ <div id="boxCenter">
+ <!--Welcome to KitchenSync-->
+ %5
+ </div>
+ </div>
+ </div>
+ <div id="boxB"><div id="boxBL"/><div id="boxBR"/><div id="boxBC"/></div>
+ </div>
+
+ <div id="footer"><div id="footerL"/><div id="footerR"/></div>
+</body>
+</html>
+<!-- vim:set sw=2 et nocindent smartindent: -->
diff --git a/kitchensync/src/about/top-right-kitchensync.png b/kitchensync/src/about/top-right-kitchensync.png
new file mode 100644
index 000000000..bf15f38b5
--- /dev/null
+++ b/kitchensync/src/about/top-right-kitchensync.png
Binary files differ
diff --git a/kitchensync/src/aboutpage.cpp b/kitchensync/src/aboutpage.cpp
new file mode 100644
index 000000000..f8110c4d0
--- /dev/null
+++ b/kitchensync/src/aboutpage.cpp
@@ -0,0 +1,141 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <qfile.h>
+#include <qlayout.h>
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <khtml_part.h>
+#include <khtmlview.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <krun.h>
+#include <kstandarddirs.h>
+
+#include "aboutpage.h"
+
+static QString readFile( const QString &fileName )
+{
+ QFile file( fileName );
+ if ( !file.open( IO_ReadOnly ) ) {
+ kdDebug() << "Unable to open file '" << fileName << "'" << endl;
+ return QCString();
+ }
+
+ QString content = QString::fromUtf8( file.readAll() );
+
+ file.close();
+
+ return content;
+}
+
+AboutPage::AboutPage( QWidget *parent )
+ : QWidget( parent, "AboutPage" )
+{
+ QVBoxLayout *layout = new QVBoxLayout( this );
+
+ QString location = locate( "data", "kitchensync/about/main.html" );
+ QString content = readFile( location );
+ content = content.arg( locate( "data", "libkdepim/about/kde_infopage.css" ) );
+ if ( kapp->reverseLayout() )
+ content = content.arg( "@import \"%1\";" ).arg( locate( "data", "libkdepim/about/kde_infopage_rtl.css" ) );
+ else
+ content = content.arg( "" );
+
+ KHTMLPart *part = new KHTMLPart( this );
+ layout->addWidget( part->view() );
+
+ part->begin( KURL( location ) );
+
+ QString appName( i18n( "KDE KitchenSync" ) );
+ QString catchPhrase( i18n( "Get Synchronized!" ) );
+ QString quickDescription( i18n( "The KDE Synchronization Tool" ) );
+
+ part->write( content.arg( QFont().pointSize() + 2 ).arg( appName )
+ .arg( catchPhrase ).arg( quickDescription ).arg( htmlText() ) );
+ part->end();
+
+ connect( part->browserExtension(),
+ SIGNAL( openURLRequest( const KURL&, const KParts::URLArgs& ) ),
+ SLOT( handleUrl( const KURL& ) ) );
+
+ connect( part->browserExtension(),
+ SIGNAL( createNewWindow( const KURL&, const KParts::URLArgs& ) ),
+ SLOT( handleUrl( const KURL& ) ) );
+}
+
+void AboutPage::handleUrl( const KURL &url )
+{
+ if ( url.protocol() == "exec" ) {
+ if ( url.path() == "/addGroup" )
+ emit addGroup();
+ } else
+ new KRun( url, this );
+}
+
+QString AboutPage::htmlText() const
+{
+ KIconLoader *iconloader = KGlobal::iconLoader();
+ int iconSize = iconloader->currentSize( KIcon::Desktop );
+
+ QString handbook_icon_path = iconloader->iconPath( "contents2", KIcon::Desktop );
+ QString html_icon_path = iconloader->iconPath( "html", KIcon::Desktop );
+ QString wizard_icon_path = iconloader->iconPath( "wizard", KIcon::Desktop );
+
+ QString info = i18n( "<h2 style='text-align:center; margin-top: 0px;'>Welcome to KitchenSync %1</h2>"
+ "<p>%1</p>"
+ "<table align=\"center\">"
+ "<tr><td><a href=\"%1\"><img width=\"%1\" height=\"%1\" src=\"%1\" /></a></td>"
+ "<td><a href=\"%1\">%1</a><br><span id=\"subtext\"><nobr>%1</td></tr>"
+ "<tr><td><a href=\"%1\"><img width=\"%1\" height=\"%1\" src=\"%1\" /></a></td>"
+ "<td><a href=\"%1\">%1</a><br><span id=\"subtext\"><nobr>%1</td></tr>"
+ "<tr><td><a href=\"%1\"><img width=\"%1\" height=\"%1\" src=\"%1\" /></a></td>"
+ "<td><a href=\"%1\">%1</a><br><span id=\"subtext\"><nobr>%1</td></tr>"
+ "</table>" )
+ .arg( kapp->aboutData()->version() )
+ .arg( i18n( "KitchenSync synchronizes your e-mail, addressbook, calendar, to-do list and more." ) )
+ .arg( "help:/kitchensync" )
+ .arg( iconSize )
+ .arg( iconSize )
+ .arg( handbook_icon_path )
+ .arg( "help:/kitchensync" )
+ .arg( i18n( "Read Manual" ) )
+ .arg( i18n( "Learn more about KitchenSync and its components" ) )
+ .arg( "http://pim.kde.org" )
+ .arg( iconSize )
+ .arg( iconSize )
+ .arg( html_icon_path )
+ .arg( "http://pim.kde.org" )
+ .arg( i18n( "Visit KitchenSync Website" ) )
+ .arg( i18n( "Access online resources and tutorials" ) )
+ .arg( "exec:/addGroup" )
+ .arg( iconSize )
+ .arg( iconSize )
+ .arg( wizard_icon_path )
+ .arg( "exec:/addGroup" )
+ .arg( i18n( "Add Synchronization Group" ) )
+ .arg( i18n( "Create group of devices for synchronization" ) );
+
+ return info;
+}
+
+#include "aboutpage.moc"
diff --git a/kitchensync/src/aboutpage.h b/kitchensync/src/aboutpage.h
new file mode 100644
index 000000000..d0bed85a0
--- /dev/null
+++ b/kitchensync/src/aboutpage.h
@@ -0,0 +1,45 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef ABOUTPAGE_H
+#define ABOUTPAGE_H
+
+#include <kurl.h>
+
+#include <qwidget.h>
+
+class AboutPage : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ AboutPage( QWidget *parent );
+
+ signals:
+ void addGroup();
+
+ private slots:
+ void handleUrl( const KURL& );
+
+ private:
+ QString htmlText() const;
+};
+
+#endif
diff --git a/kitchensync/src/addresseediffalgo.cpp b/kitchensync/src/addresseediffalgo.cpp
new file mode 100644
index 000000000..18b924b5a
--- /dev/null
+++ b/kitchensync/src/addresseediffalgo.cpp
@@ -0,0 +1,157 @@
+/*
+ This file is part of libkdepim.
+
+ Copyright (c) 2004 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kabc/vcardconverter.h>
+
+#include "addresseediffalgo.h"
+
+using namespace KSync;
+
+static bool compareString( const QString &left, const QString &right )
+{
+ if ( left.isEmpty() && right.isEmpty() )
+ return true;
+ else
+ return left == right;
+}
+
+AddresseeDiffAlgo::AddresseeDiffAlgo( const KABC::Addressee &leftAddressee,
+ const KABC::Addressee &rightAddressee )
+ : mLeftAddressee( leftAddressee ), mRightAddressee( rightAddressee )
+{
+}
+
+AddresseeDiffAlgo::AddresseeDiffAlgo( const QString &leftAddressee,
+ const QString &rightAddressee )
+{
+ KABC::VCardConverter converter;
+
+ mLeftAddressee = converter.parseVCard( leftAddressee );
+ mRightAddressee = converter.parseVCard( rightAddressee );
+}
+
+void AddresseeDiffAlgo::run()
+{
+ begin();
+
+ if ( !compareString( mLeftAddressee.uid(), mRightAddressee.uid() ) )
+ conflictField( KABC::Addressee::uidLabel(), mLeftAddressee.uid(), mRightAddressee.uid() );
+
+ if ( !compareString( mLeftAddressee.name(), mRightAddressee.name() ) )
+ conflictField( KABC::Addressee::nameLabel(), mLeftAddressee.name(), mRightAddressee.name() );
+
+ if ( !compareString( mLeftAddressee.formattedName(), mRightAddressee.formattedName() ) )
+ conflictField( KABC::Addressee::formattedNameLabel(), mLeftAddressee.formattedName(), mRightAddressee.formattedName() );
+
+ if ( !compareString( mLeftAddressee.familyName(), mRightAddressee.familyName() ) )
+ conflictField( KABC::Addressee::familyNameLabel(), mLeftAddressee.familyName(), mRightAddressee.familyName() );
+
+ if ( !compareString( mLeftAddressee.givenName(), mRightAddressee.givenName() ) )
+ conflictField( KABC::Addressee::givenNameLabel(), mLeftAddressee.givenName(), mRightAddressee.givenName() );
+
+ if ( !compareString( mLeftAddressee.additionalName(), mRightAddressee.additionalName() ) )
+ conflictField( KABC::Addressee::additionalNameLabel(), mLeftAddressee.additionalName(), mRightAddressee.additionalName() );
+
+ if ( !compareString( mLeftAddressee.prefix(), mRightAddressee.prefix() ) )
+ conflictField( KABC::Addressee::prefixLabel(), mLeftAddressee.prefix(), mRightAddressee.prefix() );
+
+ if ( !compareString( mLeftAddressee.suffix(), mRightAddressee.suffix() ) )
+ conflictField( KABC::Addressee::suffixLabel(), mLeftAddressee.suffix(), mRightAddressee.suffix() );
+
+ if ( !compareString( mLeftAddressee.nickName(), mRightAddressee.nickName() ) )
+ conflictField( KABC::Addressee::nickNameLabel(), mLeftAddressee.nickName(), mRightAddressee.nickName() );
+
+ if ( mLeftAddressee.birthday() != mRightAddressee.birthday() )
+ conflictField( KABC::Addressee::birthdayLabel(), mLeftAddressee.birthday().toString(),
+ mRightAddressee.birthday().toString() );
+
+ if ( !compareString( mLeftAddressee.mailer(), mRightAddressee.mailer() ) )
+ conflictField( KABC::Addressee::mailerLabel(), mLeftAddressee.mailer(), mRightAddressee.mailer() );
+
+ if ( mLeftAddressee.timeZone() != mRightAddressee.timeZone() )
+ conflictField( KABC::Addressee::timeZoneLabel(), mLeftAddressee.timeZone().asString(), mRightAddressee.timeZone().asString() );
+
+ if ( mLeftAddressee.geo() != mRightAddressee.geo() )
+ conflictField( KABC::Addressee::geoLabel(), mLeftAddressee.geo().asString(), mRightAddressee.geo().asString() );
+
+ if ( !compareString( mLeftAddressee.title(), mRightAddressee.title() ) )
+ conflictField( KABC::Addressee::titleLabel(), mLeftAddressee.title(), mRightAddressee.title() );
+
+ if ( !compareString( mLeftAddressee.role(), mRightAddressee.role() ) )
+ conflictField( KABC::Addressee::roleLabel(), mLeftAddressee.role(), mRightAddressee.role() );
+
+ if ( !compareString( mLeftAddressee.organization(), mRightAddressee.organization() ) )
+ conflictField( KABC::Addressee::organizationLabel(), mLeftAddressee.organization(), mRightAddressee.organization() );
+
+ if ( !compareString( mLeftAddressee.note(), mRightAddressee.note() ) )
+ conflictField( KABC::Addressee::noteLabel(), mLeftAddressee.note(), mRightAddressee.note() );
+
+ if ( !compareString( mLeftAddressee.productId(), mRightAddressee.productId() ) )
+ conflictField( KABC::Addressee::productIdLabel(), mLeftAddressee.productId(), mRightAddressee.productId() );
+
+ if ( !compareString( mLeftAddressee.sortString(), mRightAddressee.sortString() ) )
+ conflictField( KABC::Addressee::sortStringLabel(), mLeftAddressee.sortString(), mRightAddressee.sortString() );
+
+ if ( mLeftAddressee.secrecy() != mRightAddressee.secrecy() ) {
+ conflictField( KABC::Addressee::secrecyLabel(), mLeftAddressee.secrecy().asString(), mRightAddressee.secrecy().asString() );
+ }
+ if ( mLeftAddressee.url()!= mRightAddressee.url() )
+ conflictField( KABC::Addressee::urlLabel(), mLeftAddressee.url().prettyURL(),
+ mRightAddressee.url().prettyURL() );
+
+ if ( mLeftAddressee.logo() != mRightAddressee.logo() ) {
+ }
+
+ if ( mLeftAddressee.photo() != mRightAddressee.photo() ) {
+ }
+
+ diffList( "emails", mLeftAddressee.emails(), mRightAddressee.emails() );
+
+ diffList( "Phone Numbers", mLeftAddressee.phoneNumbers(), mRightAddressee.phoneNumbers() );
+ diffList( "Addresses", mLeftAddressee.addresses(), mRightAddressee.addresses() );
+
+ end();
+}
+
+QString AddresseeDiffAlgo::toString( const KABC::PhoneNumber &number )
+{
+ return number.number();
+}
+
+QString AddresseeDiffAlgo::toString( const KABC::Address &addr )
+{
+ return addr.formattedAddress();
+}
+
+template <class L>
+void AddresseeDiffAlgo::diffList( const QString &id,
+ const QValueList<L> &left, const QValueList<L> &right )
+{
+ for ( uint i = 0; i < left.count(); ++i ) {
+ if ( right.find( left[ i ] ) == right.end() )
+ additionalLeftField( id, toString( left[ i ] ) );
+ }
+
+ for ( uint i = 0; i < right.count(); ++i ) {
+ if ( left.find( right[ i ] ) == left.end() )
+ additionalRightField( id, toString( right[ i ] ) );
+ }
+}
diff --git a/kitchensync/src/addresseediffalgo.h b/kitchensync/src/addresseediffalgo.h
new file mode 100644
index 000000000..6eef5a179
--- /dev/null
+++ b/kitchensync/src/addresseediffalgo.h
@@ -0,0 +1,53 @@
+/*
+ This file is part of libkdepim.
+
+ Copyright (c) 2004 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KSYNC_ADDRESSEEDIFFALGO_H
+#define KSYNC_ADDRESSEEDIFFALGO_H
+
+#include <kabc/addressee.h>
+#include <libkdepim/diffalgo.h>
+
+using namespace KPIM;
+
+namespace KSync {
+
+class AddresseeDiffAlgo : public DiffAlgo
+{
+ public:
+ AddresseeDiffAlgo( const KABC::Addressee &leftAddressee, const KABC::Addressee &rightAddressee );
+ AddresseeDiffAlgo( const QString &leftAddressee, const QString &rightAddressee );
+
+ void run();
+
+ private:
+ template <class L>
+ void diffList( const QString &id, const QValueList<L> &left, const QValueList<L> &right );
+
+ QString toString( const KABC::PhoneNumber &number );
+ QString toString( const KABC::Address &address );
+
+ KABC::Addressee mLeftAddressee;
+ KABC::Addressee mRightAddressee;
+};
+
+}
+
+#endif
diff --git a/kitchensync/src/calendardiffalgo.cpp b/kitchensync/src/calendardiffalgo.cpp
new file mode 100644
index 000000000..f7ef174a2
--- /dev/null
+++ b/kitchensync/src/calendardiffalgo.cpp
@@ -0,0 +1,217 @@
+/*
+ This file is part of libkdepim.
+
+ Copyright (c) 2004 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <klocale.h>
+
+#include <libkcal/kcalversion.h>
+
+#include "calendardiffalgo.h"
+
+using namespace KSync;
+
+#ifndef KDE_USE_FINAL
+static bool compareString( const QString &left, const QString &right )
+{
+ if ( left.isEmpty() && right.isEmpty() )
+ return true;
+ else
+ return left == right;
+}
+#endif
+
+static QString toString( KCal::Attendee *attendee )
+{
+ return attendee->name() + "<" + attendee->email() + ">";
+}
+
+static QString toString( KCal::Alarm * )
+{
+ return QString::null;
+}
+
+static QString toString( KCal::Incidence * )
+{
+ return QString::null;
+}
+
+static QString toString( KCal::Attachment * )
+{
+ return QString::null;
+}
+
+static QString toString( const QDate &date )
+{
+ return date.toString();
+}
+
+static QString toString( const QDateTime &dateTime )
+{
+ return dateTime.toString();
+}
+
+static QString toString( const QString str )
+{
+ return str;
+}
+
+static QString toString( bool value )
+{
+ if ( value )
+ return i18n( "Yes" );
+ else
+ return i18n( "No" );
+}
+
+CalendarDiffAlgo::CalendarDiffAlgo( KCal::Incidence *leftIncidence,
+ KCal::Incidence *rightIncidence )
+ : mLeftIncidence( leftIncidence ), mRightIncidence( rightIncidence )
+{
+}
+
+void CalendarDiffAlgo::run()
+{
+ begin();
+
+ diffIncidenceBase( mLeftIncidence, mRightIncidence );
+ diffIncidence( mLeftIncidence, mRightIncidence );
+
+ KCal::Event *leftEvent = dynamic_cast<KCal::Event*>( mLeftIncidence );
+ KCal::Event *rightEvent = dynamic_cast<KCal::Event*>( mRightIncidence );
+ if ( leftEvent && rightEvent ) {
+ diffEvent( leftEvent, rightEvent );
+ } else {
+ KCal::Todo *leftTodo = dynamic_cast<KCal::Todo*>( mLeftIncidence );
+ KCal::Todo *rightTodo = dynamic_cast<KCal::Todo*>( mRightIncidence );
+ if ( leftTodo && rightTodo ) {
+ diffTodo( leftTodo, rightTodo );
+ }
+ }
+
+ end();
+}
+
+void CalendarDiffAlgo::diffIncidenceBase( KCal::IncidenceBase *left, KCal::IncidenceBase *right )
+{
+ diffList( i18n( "Attendees" ), left->attendees(), right->attendees() );
+
+ if ( left->dtStart() != right->dtStart() )
+ conflictField( i18n( "Start time" ), left->dtStartStr(), right->dtStartStr() );
+
+ if ( !compareString( left->organizer().fullName(), right->organizer().fullName() ) )
+ conflictField( i18n( "Organizer" ), left->organizer().fullName(), right->organizer().fullName() );
+
+ if ( !compareString( left->uid(), right->uid() ) )
+ conflictField( i18n( "UID" ), left->uid(), right->uid() );
+
+ if ( left->doesFloat() != right->doesFloat() )
+ conflictField( i18n( "Is floating" ), toString( left->doesFloat() ), toString( right->doesFloat() ) );
+
+ if ( left->hasDuration() != right->hasDuration() )
+ conflictField( i18n( "Has duration" ), toString( left->hasDuration() ), toString( right->hasDuration() ) );
+
+ if ( left->duration() != right->duration() )
+ conflictField( i18n( "Duration" ), QString::number( left->duration() ), QString::number( right->duration() ) );
+}
+
+void CalendarDiffAlgo::diffIncidence( KCal::Incidence *left, KCal::Incidence *right )
+{
+ if ( !compareString( left->description(), right->description() ) )
+ conflictField( i18n( "Description" ), left->description(), right->description() );
+
+ if ( !compareString( left->summary(), right->summary() ) )
+ conflictField( i18n( "Summary" ), left->summary(), right->summary() );
+
+ if ( left->status() != right->status() )
+ conflictField( i18n( "Status" ), left->statusStr(), right->statusStr() );
+
+ if ( left->secrecy() != right->secrecy() )
+ conflictField( i18n( "Secrecy" ), toString( left->secrecy() ), toString( right->secrecy() ) );
+
+ if ( left->priority() != right->priority() )
+ conflictField( i18n( "Priority" ), toString( left->priority() ), toString( right->priority() ) );
+
+ if ( !compareString( left->location(), right->location() ) )
+ conflictField( i18n( "Location" ), left->location(), right->location() );
+
+ diffList( i18n( "Categories" ), left->categories(), right->categories() );
+ diffList( i18n( "Alarms" ), left->alarms(), right->alarms() );
+ diffList( i18n( "Resources" ), left->resources(), right->resources() );
+ diffList( i18n( "Relations" ), left->relations(), right->relations() );
+ diffList( i18n( "Attachments" ), left->attachments(), right->attachments() );
+#if LIBKCAL_IS_VERSION( 1, 3, 1 )
+ diffList( i18n( "Exception Dates" ), left->recurrence()->exDates(), right->recurrence()->exDates() );
+ diffList( i18n( "Exception Times" ), left->recurrence()->exDateTimes(), right->recurrence()->exDateTimes() );
+#endif
+ // TODO: recurrence dates and date/times, exrules, rrules
+
+ if ( left->created() != right->created() )
+ conflictField( i18n( "Created" ), left->created().toString(), right->created().toString() );
+
+ if ( !compareString( left->relatedToUid(), right->relatedToUid() ) )
+ conflictField( i18n( "Related Uid" ), left->relatedToUid(), right->relatedToUid() );
+}
+
+void CalendarDiffAlgo::diffEvent( KCal::Event *left, KCal::Event *right )
+{
+ if ( left->hasEndDate() != right->hasEndDate() )
+ conflictField( i18n( "Has End Date" ), toString( left->hasEndDate() ), toString( right->hasEndDate() ) );
+
+ if ( left->dtEnd() != right->dtEnd() )
+ conflictField( i18n( "End Date" ), left->dtEndStr(), right->dtEndStr() );
+
+ // TODO: check transparency
+}
+
+void CalendarDiffAlgo::diffTodo( KCal::Todo *left, KCal::Todo *right )
+{
+ if ( left->hasStartDate() != right->hasStartDate() )
+ conflictField( i18n( "Has Start Date" ), toString( left->hasStartDate() ), toString( right->hasStartDate() ) );
+
+ if ( left->hasDueDate() != right->hasDueDate() )
+ conflictField( i18n( "Has Due Date" ), toString( left->hasDueDate() ), toString( right->hasDueDate() ) );
+
+ if ( left->dtDue() != right->dtDue() )
+ conflictField( i18n( "Due Date" ), left->dtDue().toString(), right->dtDue().toString() );
+
+ if ( left->hasCompletedDate() != right->hasCompletedDate() )
+ conflictField( i18n( "Has Complete Date" ), toString( left->hasCompletedDate() ), toString( right->hasCompletedDate() ) );
+
+ if ( left->percentComplete() != right->percentComplete() )
+ conflictField( i18n( "Complete" ), QString::number( left->percentComplete() ), QString::number( right->percentComplete() ) );
+
+ if ( left->completed() != right->completed() )
+ conflictField( i18n( "Completed" ), toString( left->completed() ), toString( right->completed() ) );
+}
+
+template <class L>
+void CalendarDiffAlgo::diffList( const QString &id,
+ const QValueList<L> &left, const QValueList<L> &right )
+{
+ for ( uint i = 0; i < left.count(); ++i ) {
+ if ( right.find( left[ i ] ) == right.end() )
+ additionalLeftField( id, toString( left[ i ] ) );
+ }
+
+ for ( uint i = 0; i < right.count(); ++i ) {
+ if ( left.find( right[ i ] ) == left.end() )
+ additionalRightField( id, toString( right[ i ] ) );
+ }
+}
diff --git a/kitchensync/src/calendardiffalgo.h b/kitchensync/src/calendardiffalgo.h
new file mode 100644
index 000000000..fbfb92daa
--- /dev/null
+++ b/kitchensync/src/calendardiffalgo.h
@@ -0,0 +1,55 @@
+/*
+ This file is part of libkdepim.
+
+ Copyright (c) 2004 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KSYNC_CALENDARDIFFALGO_H
+#define KSYNC_CALENDARDIFFALGO_H
+
+#include <libkcal/event.h>
+#include <libkcal/todo.h>
+#include <libkdepim/diffalgo.h>
+
+using namespace KPIM;
+
+namespace KSync {
+
+class CalendarDiffAlgo : public DiffAlgo
+{
+ public:
+ CalendarDiffAlgo( KCal::Incidence *leftIncidence, KCal::Incidence *rightIncidence );
+
+ void run();
+
+ private:
+ template <class L>
+ void diffList( const QString &id, const QValueList<L> &left, const QValueList<L> &right );
+
+ void diffIncidenceBase( KCal::IncidenceBase*, KCal::IncidenceBase* );
+ void diffIncidence( KCal::Incidence*, KCal::Incidence* );
+ void diffEvent( KCal::Event*, KCal::Event* );
+ void diffTodo( KCal::Todo*, KCal::Todo* );
+
+ KCal::Incidence *mLeftIncidence;
+ KCal::Incidence *mRightIncidence;
+};
+
+}
+
+#endif
diff --git a/kitchensync/src/configgui.cpp b/kitchensync/src/configgui.cpp
new file mode 100644
index 000000000..c57b4d991
--- /dev/null
+++ b/kitchensync/src/configgui.cpp
@@ -0,0 +1,135 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "configgui.h"
+
+
+#include "configguiblank.h"
+#include "configguifile.h"
+#include "configguignokii.h"
+#include "configguigpe.h"
+#include "configguiirmc.h"
+#include "configguildap.h"
+#include "configguiopie.h"
+#include "configguipalm.h"
+#include "configguisyncmlhttp.h"
+#include "configguisyncmlobex.h"
+#include "configguigcalendar.h"
+#include "configguijescs.h"
+#include "configguievo2.h"
+#include "configguimoto.h"
+#include "configguisynce.h"
+#include "configguisunbird.h"
+
+#include "memberinfo.h"
+
+#include <kdialog.h>
+#include <klocale.h>
+#include <klineedit.h>
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qtextedit.h>
+
+ConfigGui::ConfigGui( const QSync::Member &member, QWidget *parent )
+ : QWidget( parent ), mMember( member )
+{
+ mTopLayout = new QVBoxLayout( this );
+ mTopLayout->setSpacing( KDialog::spacingHint() );
+ mTopLayout->setMargin( KDialog::marginHint() );
+
+ QBoxLayout *nameLayout = new QHBoxLayout( mTopLayout );
+
+ QLabel *label = new QLabel( i18n("Name:"), this );
+ nameLayout->addWidget( label );
+
+ mNameEdit = new KLineEdit( this );
+ nameLayout->addWidget( mNameEdit );
+}
+
+void ConfigGui::setInstanceName( const QString &t )
+{
+ mNameEdit->setText( t );
+}
+
+QString ConfigGui::instanceName() const
+{
+ return mNameEdit->text();
+}
+
+ConfigGui *ConfigGui::Factory::create( const QSync::Member &member,
+ QWidget *parent )
+{
+ QString name = member.pluginName();
+ if ( name == "file-sync" ) {
+ return new ConfigGuiFile( member, parent );
+ } else if ( name == "palm-sync" ) {
+ return new ConfigGuiPalm( member, parent );
+ } else if ( name == "irmc-sync" ) {
+ return new ConfigGuiIRMC( member, parent );
+ } else if ( name == "syncml-obex-client" ) {
+ return new ConfigGuiSyncmlObex( member, parent );
+ } else if ( name == "syncml-http-server" ) {
+ return new ConfigGuiSyncmlHttp( member, parent );
+ } else if ( name == "opie-sync" ) {
+ return new ConfigGuiOpie( member, parent );
+ } else if ( name == "gnokii-sync" ) {
+ return new ConfigGuiGnokii( member, parent );
+ } else if ( name == "gpe-sync" ) {
+ return new ConfigGuiGpe( member, parent );
+ } else if ( name == "google-calendar" ) {
+ return new ConfigGuiGoogleCalendar( member, parent );
+ } else if ( name == "ldap-sync" ) {
+ return new ConfigGuiLdap( member, parent );
+ } else if ( name == "kdepim-sync" ) {
+ return new ConfigGuiBlank( member, parent );
+ } else if ( name == "jescs-sync" ) {
+ return new ConfigGuiJescs( member, parent );
+ } else if ( name == "evo2-sync" ) {
+ return new ConfigGuiEvo2( member, parent );
+ } else if ( name == "moto-sync" ) {
+ return new ConfigGuiMoto( member, parent );
+ } else if ( name == "synce-plugin" ) {
+ return new ConfigGuiSynce( member, parent );
+ } else if ( name == "sunbird-sync" ) {
+ return new ConfigGuiSunbird( member, parent );
+ } else {
+ return new ConfigGuiXml( member, parent );
+ }
+}
+
+
+ConfigGuiXml::ConfigGuiXml( const QSync::Member &member, QWidget *parent )
+ : ConfigGui( member, parent )
+{
+ mTextEdit = new QTextEdit( this );
+ topLayout()->addWidget( mTextEdit );
+}
+
+void ConfigGuiXml::load( const QString &xml )
+{
+ mTextEdit->setText( xml );
+}
+
+QString ConfigGuiXml::save() const
+{
+ return mTextEdit->text();
+}
diff --git a/kitchensync/src/configgui.h b/kitchensync/src/configgui.h
new file mode 100644
index 000000000..0423be715
--- /dev/null
+++ b/kitchensync/src/configgui.h
@@ -0,0 +1,72 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+#ifndef CONFIGGUI_H
+#define CONFIGGUI_H
+
+#include <libqopensync/member.h>
+
+#include <qwidget.h>
+
+class QBoxLayout;
+class KLineEdit;
+class QTextEdit;
+
+class ConfigGui : public QWidget
+{
+ public:
+ ConfigGui( const QSync::Member &, QWidget *parent );
+
+ class Factory
+ {
+ public:
+ static ConfigGui *create( const QSync::Member &, QWidget *parent );
+ };
+
+ void setInstanceName( const QString & );
+ QString instanceName() const;
+
+ virtual void load( const QString &xml ) = 0;
+ virtual QString save() const = 0;
+
+ QSync::Member member() const { return mMember; }
+
+ QBoxLayout *topLayout() const { return mTopLayout; }
+
+ private:
+ QSync::Member mMember;
+
+ QBoxLayout *mTopLayout;
+ KLineEdit *mNameEdit;
+};
+
+class ConfigGuiXml : public ConfigGui
+{
+ public:
+ ConfigGuiXml( const QSync::Member &, QWidget *parent );
+
+ void load( const QString & );
+ QString save() const;
+
+ private:
+ QTextEdit *mTextEdit;
+};
+
+#endif
diff --git a/kitchensync/src/configguiblank.cpp b/kitchensync/src/configguiblank.cpp
new file mode 100644
index 000000000..e3f7dbbc1
--- /dev/null
+++ b/kitchensync/src/configguiblank.cpp
@@ -0,0 +1,44 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2006 Daniel Gollub <dgollub@suse.de>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "configguiblank.h"
+
+#include <klocale.h>
+
+#include <qlabel.h>
+#include <qlayout.h>
+
+ConfigGuiBlank::ConfigGuiBlank( const QSync::Member &member, QWidget *parent )
+ : ConfigGui( member, parent )
+{
+ QLabel *label = new QLabel( i18n( "This member/plugin needs no configuration." ), this );
+ topLayout()->addWidget( label );
+}
+
+void ConfigGuiBlank::load( const QString& )
+{
+}
+
+QString ConfigGuiBlank::save() const
+{
+ QString xml = "<config></config>";
+ return xml;
+}
diff --git a/kitchensync/src/configguiblank.h b/kitchensync/src/configguiblank.h
new file mode 100644
index 000000000..692d470e3
--- /dev/null
+++ b/kitchensync/src/configguiblank.h
@@ -0,0 +1,35 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2006 Daniel Gollub <dgollub@suse.de>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+#ifndef CONFIGGUIBLANK_H
+#define CONFIGGUIBLANK_H
+
+#include "configgui.h"
+
+class ConfigGuiBlank : public ConfigGui
+{
+ public:
+ ConfigGuiBlank( const QSync::Member &member, QWidget *parent = 0 );
+
+ void load( const QString &xml );
+ QString save() const;
+};
+
+#endif
diff --git a/kitchensync/src/configguievo2.cpp b/kitchensync/src/configguievo2.cpp
new file mode 100644
index 000000000..a8856c1e8
--- /dev/null
+++ b/kitchensync/src/configguievo2.cpp
@@ -0,0 +1,91 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2007 Anirudh Ramesh <abattoir@abattoir.in>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "configguievo2.h"
+
+#include <qdom.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qstring.h>
+
+#include <kurlrequester.h>
+#include <kurl.h>
+#include <kfile.h>
+#include <kdialog.h>
+#include <klocale.h>
+
+ConfigGuiEvo2::ConfigGuiEvo2( const QSync::Member &member, QWidget *parent )
+ : ConfigGui( member, parent )
+{
+ initGUI();
+}
+
+void ConfigGuiEvo2::load( const QString &xml )
+{
+ QDomDocument doc;
+ doc.setContent( xml );
+ QDomElement docElement = doc.documentElement();
+ QDomNode node;
+ for( node = docElement.firstChild(); !node.isNull(); node = node.nextSibling() ) {
+ QDomElement element = node.toElement();
+ if ( element.tagName() == "address_path" ) {
+ mAddressPath->setURL( element.text() );
+ } else if ( element.tagName() == "calendar_path" ) {
+ mCalendarPath->setURL( element.text() ) ;
+ } else if ( element.tagName() == "tasks_path" ) {
+ mTasksPath->setURL( element.text() );
+ }
+ }
+}
+
+QString ConfigGuiEvo2::save() const
+{
+ QString config = "<config>\n";
+
+ config += QString( "<address_path>%1</address_path>\n" ).arg( mAddressPath->url() );
+ config += QString( "<calendar_path>%1</calendar_path>\n" ).arg( mCalendarPath->url() );
+ config += QString( "<tasks_path>%1</tasks_path>\n" ).arg( mTasksPath->url() );
+
+ config += "</config>";
+
+ return config;
+}
+
+void ConfigGuiEvo2::initGUI()
+{
+ QGridLayout *layout = new QGridLayout( topLayout(), 12, 3, KDialog::spacingHint() );
+ layout->setMargin( KDialog::marginHint() );
+
+ layout->addWidget( new QLabel( i18n( "Address Book location:" ), this ), 0, 0 );
+ mAddressPath = new KURLRequester( this );
+ mAddressPath->setMode( KFile::Directory );
+ layout->addMultiCellWidget( mAddressPath, 0, 0, 1, 2 );
+
+ layout->addWidget( new QLabel( i18n( "Calendar location:" ), this ), 1, 0 );
+ mCalendarPath = new KURLRequester( this );
+ mCalendarPath->setMode( KFile::Directory );
+ layout->addMultiCellWidget( mCalendarPath, 1, 1, 1, 2 );
+
+ layout->addWidget( new QLabel( i18n( "Task list location:" ), this ), 2, 0 );
+ mTasksPath = new KURLRequester( this );
+ mTasksPath->setMode( KFile::Directory );
+ layout->addMultiCellWidget( mTasksPath, 2, 2, 1, 2 );
+}
diff --git a/kitchensync/src/configguievo2.h b/kitchensync/src/configguievo2.h
new file mode 100644
index 000000000..f9e7ad19e
--- /dev/null
+++ b/kitchensync/src/configguievo2.h
@@ -0,0 +1,46 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2007 Anirudh Ramesh <abattoir@abattoir.in>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#ifndef CONFIGGUIEVO2_H
+#define CONFIGGUIEVO2_H
+
+#include "configgui.h"
+
+class KURLRequester;
+
+class ConfigGuiEvo2 : public ConfigGui
+{
+ public:
+ ConfigGuiEvo2( const QSync::Member &, QWidget *parent );
+
+ void load( const QString &xml );
+
+ QString save() const;
+
+ private:
+ void initGUI();
+
+ KURLRequester *mAddressPath;
+ KURLRequester *mCalendarPath;
+ KURLRequester *mTasksPath;
+};
+
+#endif
diff --git a/kitchensync/src/configguifile.cpp b/kitchensync/src/configguifile.cpp
new file mode 100644
index 000000000..e7974ecb6
--- /dev/null
+++ b/kitchensync/src/configguifile.cpp
@@ -0,0 +1,81 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "configguifile.h"
+
+#include <kurlrequester.h>
+#include <klocale.h>
+#include <kdialog.h>
+
+#include <qlayout.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qdom.h>
+
+ConfigGuiFile::ConfigGuiFile( const QSync::Member &member, QWidget *parent )
+ : ConfigGui( member, parent )
+{
+ QBoxLayout *filenameLayout = new QHBoxLayout( topLayout() );
+
+ QLabel *label = new QLabel( i18n("Directory name:"), this );
+ filenameLayout->addWidget( label );
+
+ mFilename = new KURLRequester( this );
+ mFilename->setMode( KFile::Directory | KFile::LocalOnly );
+ filenameLayout->addWidget( mFilename );
+
+ QBoxLayout *recursiveLayout = new QHBoxLayout( topLayout() );
+
+ mRecursive = new QCheckBox( i18n("Sync all subdirectories"), this );
+ recursiveLayout->addWidget( mRecursive );
+
+ topLayout()->addStretch( 1 );
+}
+
+void ConfigGuiFile::load( const QString &xml )
+{
+ QDomDocument doc;
+ doc.setContent( xml );
+ QDomElement docElement = doc.documentElement();
+ QDomNode n;
+ for( n = docElement.firstChild(); !n.isNull(); n = n.nextSibling() ) {
+ QDomElement e = n.toElement();
+ if ( e.tagName() == "path" ) {
+ mFilename->setURL( e.text() );
+ } else if ( e.tagName() == "recursive" ) {
+ mRecursive->setChecked( e.text() == "TRUE" );
+ }
+ }
+}
+
+QString ConfigGuiFile::save() const
+{
+ QString xml;
+ xml = "<config>";
+ xml += "<path>" + mFilename->url() + "</path>";
+ xml += "<recursive>";
+ if ( mRecursive->isChecked() ) xml += "TRUE";
+ else xml += "FALSE";
+ xml += "</recursive>";
+ xml += "</config>";
+
+ return xml;
+}
diff --git a/kitchensync/src/configguifile.h b/kitchensync/src/configguifile.h
new file mode 100644
index 000000000..6da034f57
--- /dev/null
+++ b/kitchensync/src/configguifile.h
@@ -0,0 +1,42 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+#ifndef CONFIGGUIFILE_H
+#define CONFIGGUIFILE_H
+
+#include "configgui.h"
+
+class KURLRequester;
+class QCheckBox;
+
+class ConfigGuiFile : public ConfigGui
+{
+ public:
+ ConfigGuiFile( const QSync::Member &, QWidget *parent );
+
+ void load( const QString &xml );
+ QString save() const;
+
+ private:
+ KURLRequester *mFilename;
+ QCheckBox *mRecursive;
+};
+
+#endif
diff --git a/kitchensync/src/configguigcalendar.cpp b/kitchensync/src/configguigcalendar.cpp
new file mode 100644
index 000000000..0434de789
--- /dev/null
+++ b/kitchensync/src/configguigcalendar.cpp
@@ -0,0 +1,103 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (c) 2006 Eduardo Habkost <ehabkost@raisama.net>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "configguigcalendar.h"
+
+#include <klocale.h>
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qdom.h>
+#include <qlineedit.h>
+
+ConfigGuiGoogleCalendar::ConfigGuiGoogleCalendar( const QSync::Member &member, QWidget *parent )
+ : ConfigGui( member, parent )
+{
+ QBoxLayout *userLayout = new QHBoxLayout( topLayout() );
+
+ QLabel *userLbl= new QLabel( i18n("Username:"), this );
+ userLayout->addWidget(userLbl);
+
+ mUsername = new QLineEdit(this);
+ userLayout->addWidget(mUsername);
+
+
+ QBoxLayout *passLayout = new QHBoxLayout( topLayout() );
+
+ QLabel *passLbl = new QLabel( i18n("Password:"), this );
+ passLayout->addWidget(passLbl);
+
+ mPassword = new QLineEdit(this);
+ mPassword->setEchoMode(QLineEdit::Password);
+ passLayout->addWidget(mPassword);
+
+ topLayout()->addWidget(new QLabel( i18n("Please notice that currently the password is stored as plain text in the plugin configuration file"), this ));
+
+ QBoxLayout *urlLayout = new QHBoxLayout( topLayout() );
+ QLabel *urlLbl = new QLabel( i18n("Calendar URL:"), this );
+ urlLayout->addWidget(urlLbl);
+
+ mUrl = new QLineEdit(this);
+ urlLayout->addWidget(mUrl);
+
+ topLayout()->addStretch( 1 );
+}
+
+void ConfigGuiGoogleCalendar::load( const QString &xml )
+{
+ QDomDocument doc;
+ doc.setContent( xml );
+ QDomElement docElement = doc.documentElement();
+ QDomNode n;
+ for( n = docElement.firstChild(); !n.isNull(); n = n.nextSibling() ) {
+ QDomElement e = n.toElement();
+ if ( e.tagName() == "username" ) {
+ mUsername->setText(e.text());
+ } else if ( e.tagName() == "password" ) {
+ mPassword->setText(e.text());
+ } else if ( e.tagName() == "url" ) {
+ mUrl->setText(e.text());
+ }
+ }
+}
+
+QString ConfigGuiGoogleCalendar::save() const
+{
+ QDomDocument doc;
+ QDomElement root = doc.createElement("config");
+ doc.appendChild(root);
+
+ QDomElement un = doc.createElement("username");
+ root.appendChild(un);
+ un.appendChild(doc.createTextNode(mUsername->text()));
+
+ QDomElement pass = doc.createElement("password");
+ root.appendChild(pass);
+ pass.appendChild(doc.createTextNode(mPassword->text()));
+
+ QDomElement url = doc.createElement("url");
+ root.appendChild(url);
+ url.appendChild(doc.createTextNode(mUrl->text()));
+
+ //TODO: Implement me!
+ return doc.toString();
+}
diff --git a/kitchensync/src/configguigcalendar.h b/kitchensync/src/configguigcalendar.h
new file mode 100644
index 000000000..e87eb300d
--- /dev/null
+++ b/kitchensync/src/configguigcalendar.h
@@ -0,0 +1,43 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (c) 2006 Eduardo Habkost <ehabkost@raisama.net>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+#ifndef CONFIGGUIGCALENDAR_H
+#define CONFIGGUIGCALENDAR_H
+
+#include "configgui.h"
+
+class QLineEdit;
+
+class ConfigGuiGoogleCalendar : public ConfigGui
+{
+ public:
+ ConfigGuiGoogleCalendar( const QSync::Member &, QWidget *parent );
+
+ void load( const QString &xml );
+ QString save() const;
+
+ private:
+ QLineEdit *mUsername;
+ QLineEdit *mPassword;
+ QLineEdit *mUrl;
+};
+
+#endif
diff --git a/kitchensync/src/configguignokii.cpp b/kitchensync/src/configguignokii.cpp
new file mode 100644
index 000000000..1379f5e5a
--- /dev/null
+++ b/kitchensync/src/configguignokii.cpp
@@ -0,0 +1,223 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2006 David Förster <david@dfoerster.de>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "configguignokii.h"
+
+#include <klocale.h>
+#include <kdialog.h>
+#include <kcombobox.h>
+
+#include <kdebug.h>
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qcombobox.h>
+#include <qdom.h>
+#include <qvbox.h>
+
+ConfigGuiGnokii::ConfigGuiGnokii( const QSync::Member &member, QWidget *parent )
+ : ConfigGui( member, parent )
+{
+ QGridLayout *layout = new QGridLayout( topLayout() );
+
+ // Model
+ QLabel *label = new QLabel( i18n("Model:"), this );
+ layout->addWidget( label, 0, 0 );
+
+ mModel = new KComboBox( true, this );
+ layout->addWidget( mModel, 0, 1 );
+ mModel->insertItem( "2110" );
+ mModel->insertItem( "3110" );
+ mModel->insertItem( "6110" );
+ mModel->insertItem( "6110" );
+ mModel->insertItem( "6160" );
+ mModel->insertItem( "6230" );
+ mModel->insertItem( "6230i" );
+ mModel->insertItem( "6510" );
+ mModel->insertItem( "7110" );
+ mModel->insertItem( "AT" );
+ // This one requires the gnapplet and rfcomm_channel
+ mModel->insertItem( "3650" );
+ mModel->insertItem( "6600" );
+ mModel->insertItem( "gnapplet" );
+ mModel->insertItem( "symbian" );
+ mModel->insertItem( "sx1" );
+
+ connect( mModel, SIGNAL (activated( int ) ),
+ this, SLOT( slotModelChanged () ) );
+
+ // Connection
+ label = new QLabel( i18n("Connection:"), this );
+ layout->addWidget( label, 1, 0 );
+
+ mConnection = new QComboBox( this );
+ layout->addWidget( mConnection, 1, 1 );
+
+ connect( mConnection, SIGNAL (activated( int ) ),
+ this, SLOT( slotConnectionChanged ( int ) ) );
+
+ // this is a list of all connection types accepted by the gnokii-sync plugin
+ mConnectionTypes.append( ConnectionType( "bluetooth", i18n( "Bluetooth" ) ) );
+ mConnectionTypes.append( ConnectionType( "irda", i18n( "IrDA" ) ) );
+ mConnectionTypes.append( ConnectionType( "serial", i18n( "Serial" ) ) );
+ mConnectionTypes.append( ConnectionType( "infrared", i18n( "Infrared" ) ) );
+ mConnectionTypes.append( ConnectionType( "tcp", i18n( "TCP" ) ) );
+ mConnectionTypes.append( ConnectionType( "dku2", i18n( "USB (nokia_dku2)" ) ) );
+ mConnectionTypes.append( ConnectionType( "dku2libusb", i18n( "USB (libusb)" ) ) );
+ mConnectionTypes.append( ConnectionType( "dau9p", i18n( "Serial (DAU9P cable)" ) ) );
+ mConnectionTypes.append( ConnectionType( "dlr3p", i18n( "Serial (DLR3P cable)" ) ) );
+ mConnectionTypes.append( ConnectionType( "tekram", i18n( "Tekram Ir-Dongle" ) ) );
+ mConnectionTypes.append( ConnectionType( "m2bus", i18n( "Serial (M2BUS protocol)" ) ) );
+
+ ConnectionTypeList::ConstIterator it;
+ for ( it = mConnectionTypes.begin(); it != mConnectionTypes.end(); it++ ) {
+ mConnection->insertItem( (*it).second );
+ }
+
+ QVBox *connectionWidget = new QVBox( this );
+ connectionWidget->setMargin( KDialog::marginHint() );
+ connectionWidget->setSpacing( 5 );
+
+ mBluetooth = new BluetoothWidget( connectionWidget );
+ mBluetooth->hide();
+
+ layout->addMultiCellWidget( connectionWidget, 2, 2, 0, 1 );
+
+ // Port
+ mPortLabel = new QLabel( i18n("Port:"), this );
+ layout->addWidget( mPortLabel, 2, 0 );
+ mPortLabel->hide();
+
+ mPort = new KComboBox( true, this );
+ layout->addWidget( mPort, 2, 1 );
+ mPort->hide();
+
+ mPort->insertItem( "/dev/ircomm0" );
+ mPort->insertItem( "/dev/ircomm1" );
+ mPort->insertItem( "/dev/ttyS0" );
+ mPort->insertItem( "/dev/ttyS1" );
+ mPort->insertItem( "/dev/ttyUSB0" );
+ mPort->insertItem( "/dev/ttyUSB1" );
+
+ layout->setColStretch( 1, 1 );
+
+ topLayout()->addStretch( 1 );
+}
+
+void ConfigGuiGnokii::slotConnectionChanged( int nth )
+{
+ mPort->hide();
+ mPortLabel->hide();
+ mBluetooth->hide();
+
+ // Bluetooth
+ if ( nth == 0 ) {
+ mBluetooth->show();
+ slotModelChanged();
+
+ if ( !mPort->currentText().isEmpty() )
+ mBluetooth->setAddress( mPort->currentText() );
+
+ // dku2libusb
+ } else if ( nth == 6 ) {
+ // No widget needed.
+ } else {
+ mPort->show();
+ mPortLabel->show();
+ }
+
+}
+
+void ConfigGuiGnokii::slotModelChanged()
+{
+ mBluetooth->hideChannel();
+
+ if ( mModel->currentText() == "gnapplet"
+ || mModel->currentText() == "symbian"
+ || mModel->currentText() == "3650"
+ || mModel->currentText() == "6600"
+ || mModel->currentText() == "sx1")
+ mBluetooth->showChannel();
+ else
+ mBluetooth->setChannel("");
+}
+
+void ConfigGuiGnokii::load( const QString &xml )
+{
+ QDomDocument doc;
+ doc.setContent( xml );
+ QDomElement docElement = doc.documentElement();
+ QDomNode n;
+ for( n = docElement.firstChild(); !n.isNull(); n = n.nextSibling() ) {
+ QDomElement e = n.toElement();
+ if ( e.tagName() == "connection" ) {
+ for ( uint i = 0; i < mConnectionTypes.count(); i++ ) {
+ if ( mConnectionTypes[i].first == e.text()) {
+ mConnection->setCurrentItem( i );
+ slotConnectionChanged( i );
+ break;
+ }
+ }
+ } else if ( e.tagName() == "port" ) {
+ mPort->setCurrentText( e.text() );
+ } else if ( e.tagName() == "model" ) {
+ mModel->setCurrentText( e.text() );
+ } else if ( e.tagName() == "rfcomm_channel" ) {
+ mBluetooth->setChannel( e.text() );
+ mBluetooth->showChannel();
+ }
+ }
+}
+
+QString ConfigGuiGnokii::save() const
+{
+ QString xml;
+ xml = "<config>";
+
+ ConnectionTypeList::ConstIterator it;
+ for ( it = mConnectionTypes.begin(); it != mConnectionTypes.end(); it++ ) {
+ if ( mConnection->currentText() == (*it).second ) {
+ xml += "<connection>" + (*it).first + "</connection>";
+ break;
+ }
+ }
+
+ if ( (*it).first == "bluetooth" )
+ xml += "<port>" + mBluetooth->address() + "</port>";
+ else if ( (*it).first == "dku2libusb" )
+ xml += "<port>" + QString("FF:FF:FF:FF:FF:FF") + "</port>"; // Only place holder for libgnokii
+ else
+ xml += "<port>" + mPort->currentText() + "</port>";
+
+ // model
+ xml += "<model>" + mModel->currentText() + "</model>";
+
+ // rfcomm_channel
+ if ( !mBluetooth->channel().isNull() )
+ xml += "<rfcomm_channel>" + mBluetooth->channel() + "</rfcomm_channel>";
+
+ xml += "</config>";
+
+ return xml;
+}
+
+#include "configguignokii.moc"
diff --git a/kitchensync/src/configguignokii.h b/kitchensync/src/configguignokii.h
new file mode 100644
index 000000000..6f413a4c1
--- /dev/null
+++ b/kitchensync/src/configguignokii.h
@@ -0,0 +1,62 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2006 David Förster <david@dfoerster.de>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+#ifndef CONFIGGUIGNOKII_H
+#define CONFIGGUIGNOKII_H
+
+#include "configgui.h"
+#include "connectionwidgets.h"
+
+#include <qvaluelist.h>
+#include <qpair.h>
+
+class QLabel;
+class QLineEdit;
+class QComboBox;
+
+class ConfigGuiGnokii : public ConfigGui
+{
+ Q_OBJECT
+
+ public:
+ ConfigGuiGnokii( const QSync::Member &, QWidget *parent );
+
+ void load( const QString &xml );
+ QString save() const;
+
+ private:
+ QComboBox *mConnection;
+ KComboBox *mPort;
+ QLabel *mPortLabel;
+ KComboBox *mModel;
+
+ BluetoothWidget *mBluetooth;
+
+ typedef QPair<QString, QString> ConnectionType;
+ typedef QValueList<ConnectionType> ConnectionTypeList;
+ ConnectionTypeList mConnectionTypes;
+
+ protected slots:
+ void slotConnectionChanged( int nth );
+ void slotModelChanged();
+
+};
+
+#endif
diff --git a/kitchensync/src/configguigpe.cpp b/kitchensync/src/configguigpe.cpp
new file mode 100644
index 000000000..4b71c766a
--- /dev/null
+++ b/kitchensync/src/configguigpe.cpp
@@ -0,0 +1,103 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2007 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "configguigpe.h"
+
+#include <qcheckbox.h>
+#include <qdom.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qspinbox.h>
+
+#include <kcombobox.h>
+#include <kdialog.h>
+#include <klineedit.h>
+#include <klocale.h>
+
+ConfigGuiGpe::ConfigGuiGpe( const QSync::Member &member, QWidget *parent )
+ : ConfigGui( member, parent )
+{
+ initGUI();
+
+ mConnectionMode->insertItem( i18n( "Local" ) );
+ mConnectionMode->insertItem( i18n( "Ssh" ) );
+}
+
+void ConfigGuiGpe::load( const QString &xml )
+{
+ QDomDocument doc;
+ doc.setContent( xml );
+ QDomElement docElement = doc.documentElement();
+ QDomNode node;
+ for( node = docElement.firstChild(); !node.isNull(); node = node.nextSibling() ) {
+ QDomElement element = node.toElement();
+ if ( element.tagName() == "use_local" ) {
+ if ( element.text().toInt() == 1 )
+ mConnectionMode->setCurrentItem( 0 );
+ else
+ mConnectionMode->setCurrentItem( 1 );
+ } else if ( element.tagName() == "handheld_ip" ) {
+ mIP->setText( element.text() );
+ } else if ( element.tagName() == "handheld_port" ) {
+ mPort->setValue( element.text().toInt() );
+ } else if ( element.tagName() == "handheld_user" ) {
+ mUser->setText( element.text() );
+ }
+ }
+}
+
+QString ConfigGuiGpe::save() const
+{
+ QString config = "<config>";
+
+ config += QString( "<use_local>%1</use_local>" ).arg( mConnectionMode->currentItem() == 0 );
+ config += QString( "<use_ssh>%1</use_ssh>" ).arg( mConnectionMode->currentItem() == 1 );
+ config += QString( "<handheld_ip>%1</handheld_ip>" ).arg( mIP->text() );
+ config += QString( "<handheld_port>%1</handheld_port>" ).arg( mPort->value() );
+ config += QString( "<handheld_user>%1</handheld_user>" ).arg( mUser->text() );
+
+ config += "</config>";
+
+ return config;
+}
+
+void ConfigGuiGpe::initGUI()
+{
+ QGridLayout *layout = new QGridLayout( topLayout(), 12, 4, KDialog::spacingHint() );
+ layout->setMargin( KDialog::marginHint() );
+
+ layout->addWidget( new QLabel( i18n( "Connection Mode:" ), this ), 0, 0 );
+ mConnectionMode = new KComboBox( this );
+ layout->addMultiCellWidget( mConnectionMode, 0, 0, 0, 3 );
+
+ layout->addWidget( new QLabel( i18n( "IP Address:" ), this ), 1, 0 );
+ mIP = new KLineEdit( this );
+ mIP->setInputMask( "000.000.000.000" );
+ layout->addWidget( mIP, 1, 1 );
+
+ layout->addWidget( new QLabel( i18n( "Port:" ), this ), 1, 2, Qt::AlignRight );
+ mPort = new QSpinBox( 1, 65536, 1, this );
+ layout->addWidget( mPort, 1, 3 );
+
+ layout->addWidget( new QLabel( i18n( "User:" ), this ), 2, 0 );
+ mUser = new KLineEdit( this );
+ layout->addMultiCellWidget( mUser, 2, 2, 1, 3 );
+}
diff --git a/kitchensync/src/configguigpe.h b/kitchensync/src/configguigpe.h
new file mode 100644
index 000000000..48f66674e
--- /dev/null
+++ b/kitchensync/src/configguigpe.h
@@ -0,0 +1,50 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2007 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#ifndef CONFIGGUIGPE_H
+#define CONFIGGUIGPE_H
+
+#include "configgui.h"
+
+class QSpinBox;
+
+class KComboBox;
+class KLineEdit;
+
+class ConfigGuiGpe : public ConfigGui
+{
+ public:
+ ConfigGuiGpe( const QSync::Member &, QWidget *parent );
+
+ void load( const QString &xml );
+ QString save() const;
+
+ private:
+ void initGUI();
+
+ KComboBox *mConnectionMode;
+
+ KLineEdit *mIP;
+ QSpinBox *mPort;
+ KLineEdit *mUser;
+};
+
+#endif
diff --git a/kitchensync/src/configguiirmc.cpp b/kitchensync/src/configguiirmc.cpp
new file mode 100644
index 000000000..54d837b68
--- /dev/null
+++ b/kitchensync/src/configguiirmc.cpp
@@ -0,0 +1,192 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include <kcombobox.h>
+#include <kdialog.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <kinputdialog.h>
+#include <klineedit.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#include <kdebug.h>
+
+#include <qapplication.h>
+#include <qeventloop.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qspinbox.h>
+#include <qtabwidget.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+
+#include "configguiirmc.h"
+
+ConfigGuiIRMC::ConfigGuiIRMC( const QSync::Member &member, QWidget *parent )
+ : ConfigGui( member, parent )
+{
+ initGUI();
+
+ mConnectionType->insertItem( i18n( "Bluetooth" ) );
+ mConnectionType->insertItem( i18n( "InfraRed (IR)" ) );
+ mConnectionType->insertItem( i18n( "Cable" ) );
+
+ connect( mConnectionType, SIGNAL( activated( int ) ),
+ this, SLOT( connectionTypeChanged( int ) ) );
+
+ connectionTypeChanged( 0 );
+}
+
+void ConfigGuiIRMC::load( const QString &xml )
+{
+ QDomDocument doc;
+ doc.setContent( xml );
+ QDomElement docElement = doc.documentElement();
+ QDomNode node;
+ for ( node = docElement.firstChild(); !node.isNull(); node = node.nextSibling() ) {
+ QDomElement element = node.toElement();
+ if ( element.tagName() == "connectmedium" ) {
+ if ( element.text() == "bluetooth" ) {
+ mConnectionType->setCurrentItem( 0 );
+ connectionTypeChanged( 0 );
+ } else if ( element.text() == "ir" ) {
+ mConnectionType->setCurrentItem( 1 );
+ connectionTypeChanged( 1 );
+ } else if ( element.text() == "cable" ) {
+ mConnectionType->setCurrentItem( 2 );
+ connectionTypeChanged( 2 );
+ }
+ } else if (element.tagName() == "btunit" ) {
+ mBluetoothWidget->setAddress( element.text() );
+ } else if (element.tagName() == "btchannel" ) {
+ mBluetoothWidget->setChannel( element.text() );
+ } else if (element.tagName() == "donttellsync" ) {
+ mDontTellSync->setChecked( element.text() == "true" );
+ }
+
+
+ }
+
+ mIRWidget->load( docElement );
+ mCableWidget->load( docElement );
+}
+
+QString ConfigGuiIRMC::save() const
+{
+ QDomDocument doc;
+ QDomElement config = doc.createElement( "config" );
+ doc.appendChild( config );
+
+ QDomElement element = doc.createElement( "connectmedium" );
+ if ( mConnectionType->currentItem() == 0 )
+ element.appendChild( doc.createTextNode( "bluetooth" ) );
+ if ( mConnectionType->currentItem() == 1 )
+ element.appendChild( doc.createTextNode( "ir" ) );
+ if ( mConnectionType->currentItem() == 2 )
+ element.appendChild( doc.createTextNode( "cable" ) );
+
+ config.appendChild( element );
+
+ if ( mConnectionType->currentItem() == 0 ) {
+ QDomElement btunit = doc.createElement( "btunit" );
+ if ( !mBluetoothWidget->address().isEmpty() )
+ btunit.appendChild( doc.createTextNode( mBluetoothWidget->address() ) );
+
+ QDomElement btchannel = doc.createElement( "btchannel" );
+ if ( !mBluetoothWidget->channel().isEmpty() )
+ btchannel.appendChild( doc.createTextNode( mBluetoothWidget->channel() ) );
+
+ config.appendChild( btunit );
+ config.appendChild( btchannel );
+ }
+
+ if ( mDontTellSync->isChecked() ) {
+ QDomElement dontellsync = doc.createElement( "donttellsync" );
+ dontellsync.appendChild( doc.createTextNode( "true" ) );
+ config.appendChild( dontellsync );
+ }
+
+ mIRWidget->save( doc, config );
+ mCableWidget->save( doc, config );
+
+ return doc.toString();
+}
+
+void ConfigGuiIRMC::connectionTypeChanged( int type )
+{
+ mBluetoothWidget->hide();
+ mIRWidget->hide();
+ mCableWidget->hide();
+
+ if ( type == 0 )
+ mBluetoothWidget->show();
+ else if ( type == 1 )
+ mIRWidget->show();
+ else
+ mCableWidget->show();
+}
+
+void ConfigGuiIRMC::initGUI()
+{
+ QTabWidget *tabWidget = new QTabWidget( this );
+ topLayout()->addWidget( tabWidget );
+
+ QVBox *connectionWidget = new QVBox( tabWidget );
+ connectionWidget->setMargin( KDialog::marginHint() );
+ connectionWidget->setSpacing( 5 );
+
+ tabWidget->addTab( connectionWidget, i18n( "Connection" ) );
+
+ mConnectionType = new KComboBox( connectionWidget );
+ QToolTip::add( mConnectionType, i18n( "Select your connection type." ) );
+
+ mBluetoothWidget = new BluetoothWidget( connectionWidget );
+ mBluetoothWidget->hide();
+
+ mIRWidget = new IRWidget( connectionWidget );
+ mIRWidget->hide();
+
+ mCableWidget = new CableWidget( connectionWidget );
+ mCableWidget->hide();
+
+ connectionWidget->setStretchFactor( mBluetoothWidget, 1 );
+ connectionWidget->setStretchFactor( mIRWidget, 1 );
+ connectionWidget->setStretchFactor( mCableWidget, 1 );
+
+ QVBox *optionsWidget = new QVBox( tabWidget );
+ optionsWidget->setMargin( KDialog::marginHint() );
+ optionsWidget->setSpacing( 5 );
+
+ tabWidget->addTab( optionsWidget, i18n( "Options" ) );
+
+ QHBox *optionBox = new QHBox( optionsWidget );
+ optionBox->setSpacing( KDialog::spacingHint() );
+
+ QLabel *label = new QLabel( i18n( "Don't send OBEX UUID (IRMC-SYNC)" ), optionBox );
+ mDontTellSync = new QCheckBox( optionBox );
+ QToolTip::add( mDontTellSync, i18n( "Don't send OBEX UUID while connecting. Needed for older IrMC based mobile phones." ) );
+ label->setBuddy( mDontTellSync );
+
+}
+
+#include "configguiirmc.moc"
diff --git a/kitchensync/src/configguiirmc.h b/kitchensync/src/configguiirmc.h
new file mode 100644
index 000000000..a50051679
--- /dev/null
+++ b/kitchensync/src/configguiirmc.h
@@ -0,0 +1,61 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#ifndef CONFIGGUIIRMC_H
+#define CONFIGGUIIRMC_H
+
+#include <qcheckbox.h>
+#include <qdom.h>
+
+#include "configgui.h"
+#include "connectionwidgets.h"
+
+class KComboBox;
+class KLineEdit;
+class QCheckBox;
+class QPushButton;
+class QSpinBox;
+
+class ConfigGuiIRMC : public ConfigGui
+{
+ Q_OBJECT
+
+ public:
+ ConfigGuiIRMC( const QSync::Member &, QWidget *parent );
+
+ void load( const QString &xml );
+ QString save() const;
+
+ protected slots:
+ void connectionTypeChanged( int type );
+
+ private:
+ void initGUI();
+
+ KComboBox *mConnectionType;
+ QCheckBox *mDontTellSync;
+
+ BluetoothWidget *mBluetoothWidget;
+ IRWidget *mIRWidget;
+ CableWidget *mCableWidget;
+};
+
+#endif
diff --git a/kitchensync/src/configguijescs.cpp b/kitchensync/src/configguijescs.cpp
new file mode 100644
index 000000000..6a66e8590
--- /dev/null
+++ b/kitchensync/src/configguijescs.cpp
@@ -0,0 +1,98 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2007 Anirudh Ramesh <abattoir@abattoir.in>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "configguijescs.h"
+
+#include <qcheckbox.h>
+#include <qdom.h>
+#include <qlabel.h>
+#include <qlayout.h>
+
+#include <klineedit.h>
+#include <kdialog.h>
+#include <klocale.h>
+
+ConfigGuiJescs::ConfigGuiJescs( const QSync::Member &member, QWidget *parent )
+ : ConfigGui( member, parent )
+{
+ initGUI();
+}
+
+void ConfigGuiJescs::load( const QString &xml )
+{
+ QDomDocument doc;
+ doc.setContent( xml );
+ QDomElement docElement = doc.documentElement();
+ QDomNode node;
+ for( node = docElement.firstChild(); !node.isNull(); node = node.nextSibling() ) {
+ QDomElement element = node.toElement();
+ if ( element.tagName() == "url" ) {
+ mUrl->setText( element.text() );
+ } else if ( element.tagName() == "username" ) {
+ mUsername->setText( element.text() );
+ } else if ( element.tagName() == "password" ) {
+ mPassword->setText( element.text() );
+ } else if ( element.tagName() == "del_notify" ) {
+ mDelNotify->setChecked( element.text() == "1" );
+ }
+ }
+}
+
+QString ConfigGuiJescs::save() const
+{
+ int delNotifyState;
+ QString config = "<config>\n";
+
+ config += QString( "<url>%1</url>\n" ).arg( mUrl->text() );
+ config += QString( "<username>%1</username>\n" ).arg( mUsername->text() );
+ config += QString( "<password>%1</password>\n" ).arg( mPassword->text() );
+ if ( mDelNotify->isChecked() ) { delNotifyState = 1;
+ } else { delNotifyState = 0;
+ }
+ config += QString( "<del_notify>%1</del_notify>\n" ).arg( delNotifyState );
+
+ config += "</config>";
+
+ return config;
+}
+
+void ConfigGuiJescs::initGUI()
+{
+ QGridLayout *layout = new QGridLayout( topLayout(), 12, 3, KDialog::spacingHint() );
+ layout->setMargin( KDialog::marginHint() );
+
+ layout->addWidget( new QLabel( i18n( "URL:" ), this ), 0, 0 );
+ mUrl = new KLineEdit( this );
+ layout->addMultiCellWidget( mUrl, 0, 0, 1, 2 );
+
+ layout->addWidget( new QLabel( i18n( "Username:" ), this ), 1, 0 );
+ mUsername = new KLineEdit( this );
+ layout->addMultiCellWidget( mUsername, 1, 1, 1, 2 );
+
+ layout->addWidget( new QLabel( i18n( "Password:" ), this ), 2, 0 );
+ mPassword = new KLineEdit( this );
+ mPassword->setEchoMode( KLineEdit::Password );
+ layout->addMultiCellWidget( mPassword, 2, 2, 1, 2 );
+
+ mDelNotify = new QCheckBox( this );
+ mDelNotify->setText( "Notify attendees about event/task deletion" );
+ layout->addMultiCellWidget( mDelNotify, 3, 3, 0, 2 );
+}
diff --git a/kitchensync/src/configguijescs.h b/kitchensync/src/configguijescs.h
new file mode 100644
index 000000000..4e56376bb
--- /dev/null
+++ b/kitchensync/src/configguijescs.h
@@ -0,0 +1,48 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2007 Anirudh Ramesh <abattoir@abattoir.in>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#ifndef CONFIGGUIJESCS_H
+#define CONFIGGUIJESCS_H
+
+#include "configgui.h"
+
+class KLineEdit;
+class QCheckBox;
+
+class ConfigGuiJescs : public ConfigGui
+{
+ public:
+ ConfigGuiJescs( const QSync::Member &, QWidget *parent );
+
+ void load( const QString &xml );
+
+ QString save() const;
+
+ private:
+ void initGUI();
+
+ KLineEdit *mUrl;
+ KLineEdit *mUsername;
+ KLineEdit *mPassword;
+ QCheckBox *mDelNotify;
+};
+
+#endif
diff --git a/kitchensync/src/configguildap.cpp b/kitchensync/src/configguildap.cpp
new file mode 100644
index 000000000..ce4881156
--- /dev/null
+++ b/kitchensync/src/configguildap.cpp
@@ -0,0 +1,153 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2007 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "configguildap.h"
+
+#include <qcheckbox.h>
+#include <qdom.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qspinbox.h>
+
+#include <kcombobox.h>
+#include <kdialog.h>
+#include <klineedit.h>
+#include <klocale.h>
+
+ConfigGuiLdap::ConfigGuiLdap( const QSync::Member &member, QWidget *parent )
+ : ConfigGui( member, parent )
+{
+ initGUI();
+
+ mSearchScope->insertItem( i18n( "Base" ) );
+ mSearchScope->insertItem( i18n( "One" ) );
+ mSearchScope->insertItem( i18n( "Sub" ) );
+}
+
+void ConfigGuiLdap::load( const QString &xml )
+{
+ QDomDocument doc;
+ doc.setContent( xml );
+ QDomElement docElement = doc.documentElement();
+ QDomNode node;
+ for( node = docElement.firstChild(); !node.isNull(); node = node.nextSibling() ) {
+ QDomElement element = node.toElement();
+ if ( element.tagName() == "servername" ) {
+ mLdapWidget->setHost( element.text() );
+ } else if ( element.tagName() == "serverport" ) {
+ mLdapWidget->setPort( element.text().toInt() );
+ } else if ( element.tagName() == "binddn" ) {
+ mLdapWidget->setBindDN( element.text() );
+ } else if ( element.tagName() == "password" ) {
+ mLdapWidget->setPassword( element.text() );
+ } else if ( element.tagName() == "anonymous" ) {
+ mLdapWidget->setAuthAnon( element.text().toInt() == 1 );
+ } else if ( element.tagName() == "searchbase" ) {
+ mLdapWidget->setDn( element.text() );
+ } else if ( element.tagName() == "searchfilter" ) {
+ mLdapWidget->setFilter( element.text() );
+ } else if ( element.tagName() == "storebase" ) {
+ mLdapWidget->setDn( element.text() );
+ } else if ( element.tagName() == "keyattr" ) {
+ mKeyAttribute->setText( element.text() );
+ } else if ( element.tagName() == "scope" ) {
+ QStringList list;
+ list << "base" << "one" << "sub";
+ for ( uint i = 0; i < list.count(); ++i )
+ if ( list[ i ] == element.text() )
+ mSearchScope->setCurrentItem( i );
+
+ } else if ( element.tagName() == "authmech" ) {
+ if ( element.text() == "SIMPLE" ) {
+ mLdapWidget->setAuthSimple( true );
+ }
+ } else if ( element.tagName() == "encryption" ) {
+ mEncryption->setChecked( element.text().toInt() == 1 );
+ } else if ( element.tagName() == "ldap_read" ) {
+ mReadLdap->setChecked( element.text().toInt() == 1 );
+ } else if ( element.tagName() == "ldap_write" ) {
+ mWriteLdap->setChecked( element.text().toInt() == 1 );
+ }
+ }
+}
+
+QString ConfigGuiLdap::save() const
+{
+ QString config = "<config>\n";
+
+ config += QString( "<servername>%1</servername>\n" ).arg( mLdapWidget->host() );
+ config += QString( "<serverport>%1</serverport>\n" ).arg( mLdapWidget->port() );
+ config += QString( "<binddn>%1</binddn>\n" ).arg( mLdapWidget->bindDN() );
+ config += QString( "<password>%1</password>\n" ).arg( mLdapWidget->password() );
+ config += QString( "<anonymous>%1</anonymous>\n" ).arg( mLdapWidget->isAuthAnon() ? "1" : "0" );
+ config += QString( "<searchbase>%1</searchbase>\n" ).arg( mLdapWidget->dn() );
+ config += QString( "<searchfilter>%1</searchfilter>\n" ).arg( mLdapWidget->filter() );
+ config += QString( "<storebase>%1</storebase>\n" ).arg( mLdapWidget->dn() );
+ config += QString( "<keyattr>%1</keyattr>\n" ).arg( mKeyAttribute->text() );
+
+ QStringList scopes;
+ scopes << "base" << "one" << "sub";
+
+ config += QString( "<scope>%1</scope>\n" ).arg( scopes[ mSearchScope->currentItem() ] );
+
+ config += QString( "<authmech>SIMPLE</authmech>\n" );
+ config += QString( "<encryption>%1</encryption>\n" ).arg( mEncryption->isChecked() ? "1" : "0" );
+
+ config += QString( "<ldap_read>%1</ldap_read>\n" ).arg( mReadLdap->isChecked() ? "1" : "0" );
+ config += QString( "<ldap_write>%1</ldap_write>\n" ).arg( mWriteLdap->isChecked() ? "1" : "0" );
+
+ config += "</config>";
+
+ return config;
+}
+
+void ConfigGuiLdap::initGUI()
+{
+ QGridLayout *layout = new QGridLayout( topLayout(), 12, 4, KDialog::spacingHint() );
+ layout->setMargin( KDialog::marginHint() );
+
+ mLdapWidget = new KABC::LdapConfigWidget( KABC::LdapConfigWidget::W_HOST |
+ KABC::LdapConfigWidget::W_PORT |
+ KABC::LdapConfigWidget::W_USER |
+ KABC::LdapConfigWidget::W_PASS |
+ KABC::LdapConfigWidget::W_BINDDN |
+ KABC::LdapConfigWidget::W_DN |
+ KABC::LdapConfigWidget::W_FILTER |
+ KABC::LdapConfigWidget::W_AUTHBOX, this );
+
+ mKeyAttribute = new KLineEdit( this );
+ mSearchScope = new KComboBox( this );
+ mEncryption = new QCheckBox( i18n( "Use encryption" ), this );
+ mReadLdap = new QCheckBox( i18n( "Load data from LDAP" ), this );
+ mWriteLdap = new QCheckBox( i18n( "Save data to LDAP" ), this );
+
+ layout->addMultiCellWidget( mLdapWidget, 0, 9, 0, 3 );
+ layout->addWidget( new QLabel( i18n( "Key Attribute:" ), this ), 10, 0 );
+ layout->addMultiCellWidget( mKeyAttribute, 10, 10, 1, 2 );
+ layout->addWidget( new QLabel( i18n( "Search Scope:" ), this ), 11, 0 );
+ layout->addMultiCellWidget( mSearchScope, 11, 11, 1, 2 );
+ layout->addWidget( mEncryption, 12, 0 );
+ layout->addWidget( mReadLdap, 13, 0 );
+ layout->addWidget( mWriteLdap, 13, 3 );
+
+}
+
+#include "configguildap.moc"
diff --git a/kitchensync/src/configguildap.h b/kitchensync/src/configguildap.h
new file mode 100644
index 000000000..e02d7ab68
--- /dev/null
+++ b/kitchensync/src/configguildap.h
@@ -0,0 +1,58 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2007 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#ifndef CONFIGGUILDAP_H
+#define CONFIGGUILDAP_H
+
+#include "configgui.h"
+#include "kabc/ldapconfigwidget.h"
+
+class QCheckBox;
+class QLabel;
+class QSpinBox;
+
+class KABC::LdapConfigWidget;
+class KComboBox;
+class KLineEdit;
+
+class ConfigGuiLdap : public ConfigGui
+{
+ Q_OBJECT
+
+ public:
+ ConfigGuiLdap( const QSync::Member &, QWidget *parent );
+
+ void load( const QString &xml );
+ QString save() const;
+
+ private:
+ void initGUI();
+
+ KABC::LdapConfigWidget *mLdapWidget;
+ KLineEdit *mKeyAttribute;
+ KComboBox *mSearchScope;
+ QCheckBox *mEncryption;
+ QCheckBox *mReadLdap;
+ QCheckBox *mWriteLdap;
+
+};
+
+#endif
diff --git a/kitchensync/src/configguimoto.cpp b/kitchensync/src/configguimoto.cpp
new file mode 100644
index 000000000..80c493dca
--- /dev/null
+++ b/kitchensync/src/configguimoto.cpp
@@ -0,0 +1,71 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2007 Anirudh Ramesh <abattoir@abattoir.in>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "configguimoto.h"
+
+#include <qdom.h>
+#include <qlabel.h>
+#include <qlayout.h>
+
+#include <klineedit.h>
+#include <kdialog.h>
+#include <klocale.h>
+
+ConfigGuiMoto::ConfigGuiMoto( const QSync::Member &member, QWidget *parent )
+ : ConfigGui( member, parent )
+{
+ initGUI();
+}
+
+void ConfigGuiMoto::load( const QString &xml )
+{
+ QDomDocument doc;
+ doc.setContent( xml );
+ QDomElement docElement = doc.documentElement();
+ QDomNode node;
+ for( node = docElement.firstChild(); !node.isNull(); node = node.nextSibling() ) {
+ QDomElement element = node.toElement();
+ if ( element.tagName() == "device" ) {
+ mDeviceString->setText( element.text() );
+ }
+ }
+}
+
+QString ConfigGuiMoto::save() const
+{
+ QString config = "<config>\n";
+
+ config += QString( "<device>%1</device>\n" ).arg( mDeviceString->text() );
+
+ config += "</config>";
+
+ return config;
+}
+
+void ConfigGuiMoto::initGUI()
+{
+ QGridLayout *layout = new QGridLayout( topLayout(), 12, 3, KDialog::spacingHint() );
+ layout->setMargin( KDialog::marginHint() );
+
+ layout->addWidget( new QLabel( i18n( "Device String:" ), this ), 0, 0 );
+ mDeviceString = new KLineEdit( this );
+ layout->addMultiCellWidget( mDeviceString, 0, 0, 1, 2 );
+}
diff --git a/kitchensync/src/configguimoto.h b/kitchensync/src/configguimoto.h
new file mode 100644
index 000000000..54afcb759
--- /dev/null
+++ b/kitchensync/src/configguimoto.h
@@ -0,0 +1,43 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2007 Anirudh Ramesh <abattoir@abattoir.in>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#ifndef CONFIGGUIMOTO_H
+#define CONFIGGUIMOTO_H
+
+#include "configgui.h"
+
+class KLineEdit;
+
+class ConfigGuiMoto : public ConfigGui
+{
+ public:
+ ConfigGuiMoto( const QSync::Member &, QWidget *parent );
+
+ void load( const QString &xml );
+ QString save() const;
+
+ private:
+ void initGUI();
+
+ KLineEdit *mDeviceString;
+};
+
+#endif
diff --git a/kitchensync/src/configguiopie.cpp b/kitchensync/src/configguiopie.cpp
new file mode 100644
index 000000000..6d0a5d80c
--- /dev/null
+++ b/kitchensync/src/configguiopie.cpp
@@ -0,0 +1,135 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2006 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "configguiopie.h"
+
+#include <klocale.h>
+
+#include <qcombobox.h>
+#include <qdom.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qspinbox.h>
+
+ConfigGuiOpie::ConfigGuiOpie( const QSync::Member &member, QWidget *parent )
+ : ConfigGui( member, parent )
+{
+ QGridLayout *layout = new QGridLayout( topLayout() );
+
+ QLabel *label = new QLabel( i18n("Device IP:"), this );
+ layout->addWidget( label, 0, 0 );
+
+ mDeviceIP = new QLineEdit( this );
+ mDeviceIP->setInputMask( "000.000.000.000" );
+ label->setBuddy( mDeviceIP );
+ layout->addWidget( mDeviceIP, 0, 1 );
+
+ label = new QLabel( i18n("Device Type:"), this );
+ layout->addWidget( label, 1, 0 );
+
+ mDeviceType = new QComboBox( this );
+ label->setBuddy( mDeviceType );
+ layout->addWidget( mDeviceType, 1, 1 );
+
+ label = new QLabel( i18n("Username:"), this );
+ layout->addWidget( label, 2, 0 );
+
+ mUserName = new QLineEdit( this );
+ label->setBuddy( mUserName );
+ layout->addWidget( mUserName, 2, 1 );
+
+ label = new QLabel( i18n("Password:"), this );
+ layout->addWidget( label, 3, 0 );
+
+ mPassword = new QLineEdit( this );
+ mPassword->setEchoMode( QLineEdit::Password );
+ label->setBuddy( mPassword );
+ layout->addWidget( mPassword, 3, 1 );
+
+ label = new QLabel( i18n("Protocol:"), this );
+ layout->addWidget( label, 4, 0 );
+
+ mConnectionType = new QComboBox( this );
+ label->setBuddy( mConnectionType );
+ layout->addWidget( mConnectionType, 4, 1 );
+
+ label = new QLabel( i18n("Port:"), this );
+ layout->addWidget( label, 5, 0 );
+
+ mPort = new QSpinBox( this );
+ mPort->setRange( 0, 65335 );
+ label->setBuddy( mPort );
+ layout->addWidget( mPort, 5, 1 );
+
+ mDeviceType->insertItem( i18n("Opie/OpenZaurus") );
+ mDeviceType->insertItem( i18n("Qtopia2") );
+
+ mConnectionType->insertItem( i18n("SCP") );
+ mConnectionType->insertItem( i18n("FTP") );
+
+ topLayout()->addStretch( 1 );
+}
+
+void ConfigGuiOpie::load( const QString &xml )
+{
+ QDomDocument doc;
+ doc.setContent( xml );
+ QDomElement docElement = doc.documentElement();
+ QDomNode n;
+ for( n = docElement.firstChild(); !n.isNull(); n = n.nextSibling() ) {
+ QDomElement e = n.toElement();
+ if ( e.tagName() == "username" ) {
+ mUserName->setText( e.text() );
+ } else if ( e.tagName() == "password" ) {
+ mPassword->setText( e.text() );
+ } else if ( e.tagName() == "url" ) {
+ mDeviceIP->setText( e.text() );
+ } else if ( e.tagName() == "port" ) {
+ mPort->setValue( e.text().toInt() );
+ } else if ( e.tagName() == "device" ) {
+ if ( e.text() == "opie" )
+ mDeviceType->setCurrentItem( 0 );
+ else
+ mDeviceType->setCurrentItem( 1 );
+ } else if ( e.tagName() == "conntype" ) {
+ if ( e.text() == "scp" )
+ mConnectionType->setCurrentItem( 0 );
+ else
+ mConnectionType->setCurrentItem( 1 );
+ }
+ }
+}
+
+QString ConfigGuiOpie::save() const
+{
+ QString xml;
+ xml = "<config>";
+ xml += "<username>" + mUserName->text() + "</username>";
+ xml += "<password>" + mPassword->text() + "</password>";
+ xml += "<url>" + mDeviceIP->text() + "</url>";
+ xml += "<device>" + QString( mDeviceType->currentItem() == 0 ? "opie" : "qtopia2" ) + "</device>";
+ xml += "<port>" + QString::number( mPort->value() ) + "</port>";
+ xml += "<conntype>" + QString( mConnectionType->currentItem() == 0 ? "scp" : "ftp" ) + "</conntype>";
+ xml += "</config>";
+
+ return xml;
+}
diff --git a/kitchensync/src/configguiopie.h b/kitchensync/src/configguiopie.h
new file mode 100644
index 000000000..671526d6d
--- /dev/null
+++ b/kitchensync/src/configguiopie.h
@@ -0,0 +1,47 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2006 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+#ifndef CONFIGGUIOPIE_H
+#define CONFIGGUIOPIE_H
+
+#include "configgui.h"
+
+class QComboBox;
+class QLineEdit;
+class QSpinBox;
+
+class ConfigGuiOpie : public ConfigGui
+{
+ public:
+ ConfigGuiOpie( const QSync::Member &, QWidget *parent );
+
+ void load( const QString &xml );
+ QString save() const;
+
+ private:
+ QLineEdit *mDeviceIP;
+ QComboBox *mDeviceType;
+ QLineEdit *mUserName;
+ QLineEdit *mPassword;
+ QComboBox *mConnectionType;
+ QSpinBox *mPort;
+};
+
+#endif
diff --git a/kitchensync/src/configguipalm.cpp b/kitchensync/src/configguipalm.cpp
new file mode 100644
index 000000000..de18e92c2
--- /dev/null
+++ b/kitchensync/src/configguipalm.cpp
@@ -0,0 +1,200 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include <kcombobox.h>
+#include <kdialog.h>
+#include <klineedit.h>
+#include <klocale.h>
+
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qdom.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qradiobutton.h>
+#include <qspinbox.h>
+#include <qtabwidget.h>
+
+#include "configguipalm.h"
+
+ConfigGuiPalm::ConfigGuiPalm( const QSync::Member &member, QWidget *parent )
+ : ConfigGui( member, parent )
+{
+ initGUI();
+
+ mDevice->insertItem( "/dev/pilot" );
+ mDevice->insertItem( "/dev/ttyUSB0" );
+ mDevice->insertItem( "/dev/ttyUSB1" );
+ mDevice->insertItem( "/dev/ttyUSB2" );
+ mDevice->insertItem( "/dev/ttyUSB3" );
+
+ mSpeed->insertItem( "9600" );
+ mSpeed->insertItem( "19200" );
+ mSpeed->insertItem( "38400" );
+ mSpeed->insertItem( "57600" );
+ mSpeed->insertItem( "115200" );
+}
+
+void ConfigGuiPalm::load( const QString &xml )
+{
+ QDomDocument doc;
+ doc.setContent( xml );
+ QDomElement docElement = doc.documentElement();
+ QDomNode node;
+ for( node = docElement.firstChild(); !node.isNull(); node = node.nextSibling() ) {
+ QDomElement element = node.toElement();
+ if ( element.tagName() == "sockaddr" ) {
+ mDevice->setCurrentText( element.text() );
+ } else if ( element.tagName() == "speed" ) {
+ mSpeed->setCurrentText( element.text() );
+ } else if ( element.tagName() == "timeout" ) {
+ mTimeout->setValue( element.text().toInt() );
+ } else if ( element.tagName() == "username" ) {
+ mUserName->setText( element.text() );
+ } else if ( element.tagName() == "mismatch" ) {
+ switch ( element.text().toInt() ) {
+ case 0:
+ mSyncAlways->setChecked( true );
+ break;
+ case 2:
+ mSyncAbort->setChecked( true );
+ break;
+ case 1:
+ default:
+ mSyncAsk->setChecked( true );
+ break;
+ }
+ } else if ( element.tagName() == "popup" ) {
+ mPopup->setChecked( element.text() == "1" );
+ }
+ }
+}
+
+QString ConfigGuiPalm::save() const
+{
+ QString config = "<config>";
+
+ config += "<sockaddr>" + mDevice->currentText() + "</sockaddr>";
+ config += "<username>" + mUserName->text() + "</username>";
+ config += "<timeout>" + QString::number( mTimeout->value() ) + "</timeout>";
+ config += "<type>0</type>";
+ config += "<speed>" + mSpeed->currentText() + "</speed>";
+ config += "<id>0</id>";
+ config += "<codepage>cp1252</codepage>";
+ config += "<popup>" + QString( mPopup->isChecked() ? "1" : "0" ) + "</popup>";
+
+ QString popup;
+ if ( mSyncAlways->isChecked() )
+ popup = "0";
+ else if ( mSyncAsk->isChecked() )
+ popup = "1";
+ else if ( mSyncAbort->isChecked() )
+ popup = "2";
+
+ config += "<mismatch>" + popup + "</mismatch>";
+
+ config += "</config>";
+
+ return config;
+}
+
+void ConfigGuiPalm::initGUI()
+{
+ QFont boldFont = font();
+ boldFont.setBold( true );
+
+ QTabWidget *tabWidget = new QTabWidget( this );
+
+ QWidget *connectionWidget = new QWidget( tabWidget );
+ QVBoxLayout *connectionLayout = new QVBoxLayout( connectionWidget,
+ KDialog::marginHint(), KDialog::spacingHint() );
+
+ QLabel *label = new QLabel( i18n( "Connection" ), connectionWidget );
+ label->setFont( boldFont );
+ connectionLayout->addWidget( label );
+
+ QGridLayout *gridLayout = new QGridLayout( connectionLayout, 3, 2, KDialog::spacingHint() );
+ gridLayout->setMargin( KDialog::marginHint() );
+
+ gridLayout->addWidget( new QLabel( i18n( "Port:" ), connectionWidget ), 0, 0 );
+ gridLayout->addWidget( new QLabel( i18n( "Speed:" ), connectionWidget ), 1, 0 );
+ gridLayout->addWidget( new QLabel( i18n( "Timeout:" ), connectionWidget ), 2, 0 );
+
+ mDevice = new KComboBox( true, connectionWidget );
+ mSpeed = new KComboBox( connectionWidget );
+ mTimeout = new QSpinBox( 1, 60, 1, connectionWidget );
+ mTimeout->setSuffix( i18n( " sec" ) );
+
+ gridLayout->addWidget( mDevice, 0, 1 );
+ gridLayout->addWidget( mSpeed, 1, 1 );
+ gridLayout->addWidget( mTimeout, 2, 1 );
+ gridLayout->setColStretch( 1, 1 );
+
+ label = new QLabel( i18n( "User" ), connectionWidget );
+ label->setFont( boldFont );
+ connectionLayout->addWidget( label );
+
+ gridLayout = new QGridLayout( connectionLayout, 1, 2, KDialog::spacingHint() );
+ gridLayout->setMargin( KDialog::marginHint() );
+
+ gridLayout->addWidget( new QLabel( i18n( "Username:" ), connectionWidget ), 0, 0 );
+
+ mUserName = new KLineEdit( connectionWidget );
+ gridLayout->addWidget( mUserName, 0, 1 );
+
+ label = new QLabel( i18n( "What to do if Username does not match" ), connectionWidget );
+ label->setFont( boldFont );
+ connectionLayout->addWidget( label );
+
+ gridLayout = new QGridLayout( connectionLayout, 1, 2, KDialog::spacingHint() );
+ gridLayout->setMargin( KDialog::marginHint() );
+
+ QButtonGroup *buttonGroup = new QButtonGroup( 1, Qt::Horizontal, connectionWidget );
+ buttonGroup->setExclusive( true );
+ buttonGroup->setFrameStyle( QFrame::NoFrame );
+ mSyncAlways = new QRadioButton( i18n( "Sync Anyway" ), buttonGroup );
+ mSyncAsk = new QRadioButton( i18n( "Ask What To Do" ), buttonGroup );
+ mSyncAbort = new QRadioButton( i18n( "Abort Sync" ), buttonGroup );
+
+ gridLayout->addMultiCellWidget( buttonGroup, 0, 0, 0, 1 );
+
+ connectionLayout->addStretch( 1 );
+ tabWidget->addTab( connectionWidget, i18n( "Connection" ) );
+
+ QWidget *optionWidget = new QWidget( tabWidget );
+ QVBoxLayout *optionLayout = new QVBoxLayout( optionWidget,
+ KDialog::marginHint(), KDialog::spacingHint() );
+
+ label = new QLabel( i18n( "Hotsync Notification" ), optionWidget );
+ label->setFont( boldFont );
+ optionLayout->addWidget( label );
+
+ gridLayout = new QGridLayout( optionLayout, 1, 2, KDialog::spacingHint() );
+ gridLayout->setMargin( KDialog::marginHint() );
+
+ mPopup = new QCheckBox( i18n( "Popup when interaction is required" ), optionWidget );
+ gridLayout->addMultiCellWidget( mPopup, 0, 0, 0, 1 );
+
+ optionLayout->addStretch( 1 );
+ tabWidget->addTab( optionWidget, i18n( "Options" ) );
+
+ topLayout()->addWidget( tabWidget );
+}
diff --git a/kitchensync/src/configguipalm.h b/kitchensync/src/configguipalm.h
new file mode 100644
index 000000000..212ef61a6
--- /dev/null
+++ b/kitchensync/src/configguipalm.h
@@ -0,0 +1,59 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#ifndef CONFIGGUIPALM_H
+#define CONFIGGUIPALM_H
+
+#include "configgui.h"
+
+class KComboBox;
+class KLineEdit;
+class QCheckBox;
+class QRadioButton;
+class QSpinBox;
+
+class ConfigGuiPalm : public ConfigGui
+{
+ public:
+ ConfigGuiPalm( const QSync::Member &, QWidget *parent );
+
+ void load( const QString &xml );
+ QString save() const;
+
+ private:
+ void initGUI();
+
+ KComboBox *mDevice;
+ KComboBox *mSpeed;
+ QSpinBox *mTimeout;
+
+ KLineEdit *mUserName;
+
+ QRadioButton *mSyncAlways;
+ QRadioButton *mSyncAsk;
+ QRadioButton *mSyncAbort;
+
+ QCheckBox *mPopup;
+ KComboBox *mVerbosity;
+ KComboBox *mCodePage;
+};
+
+#endif
diff --git a/kitchensync/src/configguisunbird.cpp b/kitchensync/src/configguisunbird.cpp
new file mode 100644
index 000000000..7b09cd50c
--- /dev/null
+++ b/kitchensync/src/configguisunbird.cpp
@@ -0,0 +1,367 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2007 Tobias Koenig <tokoe@kde.org>
+ Copyright (c) 2007 Anirudh Ramesh <abattoir@abattoir.in>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "configguisunbird.h"
+
+#include <qdom.h>
+#include <qtabwidget.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qsizepolicy.h>
+#include <qptrlist.h>
+#include <qspinbox.h>
+#include <qwidget.h>
+
+#include <kurlrequester.h>
+#include <klineedit.h>
+#include <kpushbutton.h>
+#include <kdialog.h>
+#include <klocale.h>
+#include <kfile.h>
+
+ConfigGuiSunbird::ConfigGuiSunbird( const QSync::Member &member, QWidget *parent )
+ : ConfigGui( member, parent )
+{
+ QTabWidget *tabWidget = new QTabWidget( this );
+ topLayout()->addWidget( tabWidget );
+
+ mLocalWidget = new QWidget( tabWidget );
+ mLocalLayout = new QVBoxLayout( mLocalWidget, KDialog::spacingHint() );
+
+ mWebdavWidget = new QWidget( tabWidget );
+ mWebdavLayout = new QVBoxLayout( mWebdavWidget, KDialog::spacingHint() );
+
+ tabWidget->addTab( mLocalWidget, i18n( "Local Calendars" ) );
+ tabWidget->addTab( mWebdavWidget, i18n( "WebDAV Calendars" ) );
+
+ KPushButton *mLocalAddButton = new KPushButton( mLocalWidget );
+ mLocalAddButton->setText( i18n( "Add new calendar" ) );
+ mLocalAddButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
+ mLocalLayout->addWidget( mLocalAddButton );
+ connect( mLocalAddButton, SIGNAL( clicked() ),
+ this, SLOT( addLocalCalendar() ) );
+
+ KPushButton *mWebdavAddButton = new KPushButton( mWebdavWidget );
+ mWebdavAddButton->setText( i18n( "Add new calendar" ) );
+ mWebdavAddButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
+ mWebdavLayout->addWidget( mWebdavAddButton );
+ connect( mWebdavAddButton, SIGNAL( clicked() ),
+ this, SLOT( addWebdavCalendar() ) );
+
+ mLocalSpacer = new QSpacerItem( 20, 40, QSizePolicy::Expanding );
+ mLocalLayout->addItem( mLocalSpacer );
+ mWebdavSpacer = new QSpacerItem( 20, 40, QSizePolicy::Expanding );
+ mWebdavLayout->addItem( mWebdavSpacer );
+}
+
+void ConfigGuiSunbird::load( const QString &xml )
+{
+ QString path;
+ QString url;
+ QString username;
+ QString password;
+ QString defaultcal;
+ QString days;
+
+ QDomDocument doc;
+ doc.setContent( xml );
+ QDomElement docElement = doc.documentElement();
+ QDomNode node;
+ for( node = docElement.firstChild(); !node.isNull(); node = node.nextSibling() ) {
+ QDomElement element = node.toElement();
+ if ( element.tagName() == "file" ) {
+ QDomAttr pathAttr = element.attributeNode( "path" );
+ path = pathAttr.value();
+ QDomAttr defaultAttr = element.attributeNode( "default" );
+ defaultcal = defaultAttr.value();
+ QDomAttr daysAttr = element.attributeNode( "deletedaysold" );
+ days = daysAttr.value();
+
+ LocalCalendar *cal = new LocalCalendar( path, defaultcal, days, mLocalWidget );
+ mLocalLayout->removeItem( mLocalSpacer );
+ cal->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+ mLocalLayout->addWidget( cal );
+ mLocalLayout->addItem( mLocalSpacer );
+ mLocalList.append( cal );
+
+ connect( cal, SIGNAL( deleteRequest( LocalCalendar* ) ), SLOT( delLocalCalendar( LocalCalendar* ) ) );
+ cal->show();
+ } else if ( element.tagName() == "webdav" ) {
+ QDomAttr urlAttr = element.attributeNode( "url" );
+ url = urlAttr.value();
+ QDomAttr unameAttr = element.attributeNode( "username" );
+ username = unameAttr.value();
+ QDomAttr pwordAttr = element.attributeNode( "password" );
+ password = pwordAttr.value();
+ QDomAttr defaultAttr = element.attributeNode( "default" );
+ defaultcal = defaultAttr.value();
+ QDomAttr daysAttr = element.attributeNode( "deletedaysold" );
+ days = daysAttr.value();
+
+ WebdavCalendar *cal = new WebdavCalendar( username, password,
+ url, defaultcal, days, mWebdavWidget );
+ mWebdavLayout->removeItem( mWebdavSpacer );
+ cal->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+ mWebdavLayout->addWidget( cal );
+ mWebdavLayout->addItem( mWebdavSpacer );
+ mWebdavList.append( cal );
+
+ connect( cal, SIGNAL( deleteRequest( WebdavCalendar* ) ), SLOT( delWebdavCalendar( WebdavCalendar* ) ) );
+ cal->show();
+ }
+ }
+}
+
+QString ConfigGuiSunbird::save() const
+{
+ QString config = "<config>\n";
+
+ for ( uint i = 0; i < mLocalList.count(); ++i ) {
+ LocalCalendar *lcal = mLocalList[ i ];
+ config += QString( "<file " );
+ config += QString( "path=\"%1\" " ).arg( lcal->mPathRequester->url() );
+
+ if ( lcal->mDaysCheckBox->isChecked() ) {
+ config += QString( "deletedaysold=\"%1\" " ).arg( lcal->mDaysSpinBox->value() );
+ }
+ if ( lcal->mDefaultCheckBox->isChecked() ) {
+ config += QString( "default=\"1\" " );
+ }
+ config += QString( "/>\n" );
+ }
+
+ for ( uint i = 0; i < mWebdavList.count(); ++i ) {
+ WebdavCalendar *wcal = mWebdavList[ i ];
+ config += QString( "<webdav " );
+ config += QString( "username=\"%1\" " ).arg( wcal->mUsername->text() );
+ config += QString( "password=\"%1\" " ).arg( wcal->mPassword->text() );
+ config += QString( "url=\"%1\" " ).arg( wcal->mUrl->text() );
+
+ if ( wcal->mDaysCheckBox->isChecked() ) {
+ config += QString( "deletedaysold=\"%1\" " ).arg( wcal->mDaysSpinBox->value() );
+ }
+ if ( wcal->mDefaultCheckBox->isChecked() ) {
+ config += QString( "default=\"1\" " );
+ }
+ config += QString( "/>\n" );
+ }
+ config += "</config>";
+
+ return config;
+}
+
+void ConfigGuiSunbird::addLocalCalendar()
+{
+ LocalCalendar *cal = new LocalCalendar( mLocalWidget );
+ mLocalLayout->removeItem( mLocalSpacer );
+ cal->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+ mLocalLayout->addWidget( cal );
+ mLocalLayout->addItem( mLocalSpacer );
+ mLocalList.append( cal );
+
+ connect( cal, SIGNAL( deleteRequest( LocalCalendar* ) ), SLOT( delLocalCalendar( LocalCalendar* ) ) );
+ cal->show();
+}
+
+void ConfigGuiSunbird::delLocalCalendar( LocalCalendar *calendar )
+{
+ mLocalList.remove( calendar );
+ calendar->deleteLater();
+}
+
+void ConfigGuiSunbird::addWebdavCalendar()
+{
+ WebdavCalendar *cal = new WebdavCalendar( mWebdavWidget );
+ mWebdavLayout->removeItem( mWebdavSpacer );
+ cal->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+ mWebdavLayout->addWidget( cal );
+ mWebdavLayout->addItem( mWebdavSpacer );
+ mWebdavList.append( cal );
+
+ connect( cal, SIGNAL( deleteRequest( WebdavCalendar* ) ), SLOT( delWebdavCalendar( WebdavCalendar* ) ) );
+ cal->show();
+}
+
+void ConfigGuiSunbird::delWebdavCalendar( WebdavCalendar *calendar )
+{
+ mWebdavList.remove( calendar );
+ calendar->deleteLater();
+}
+
+LocalCalendar::LocalCalendar( QWidget *parent )
+ : QWidget( parent )
+{
+ initGui();
+}
+
+LocalCalendar::LocalCalendar( const QString &path, const QString &defaultcal, const QString &days, QWidget *parent )
+ : QWidget( parent )
+{
+ initGui();
+
+ mPathRequester->setURL( path );
+ mDefaultCheckBox->setChecked( defaultcal.toInt() == 1 );
+
+ if ( !days.isEmpty() ) {
+ mDaysCheckBox->setChecked( true );
+ mDaysSpinBox->setEnabled( true );
+ mDaysSpinBox->setValue( days.toInt() );
+ }
+}
+
+void LocalCalendar::initGui()
+{
+ QBoxLayout *bottomLayout = new QHBoxLayout();
+
+ mDaysCheckBox = new QCheckBox( this );
+ mDaysCheckBox->setText( i18n( "Sync only events newer than" ) );
+
+ mDaysSpinBox = new QSpinBox( this );
+ mDaysSpinBox->setDisabled( true );
+ mDaysSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
+
+ connect( mDaysCheckBox, SIGNAL( toggled( bool ) ),
+ this, SLOT( toggleDays( bool ) ) );
+
+ bottomLayout->addWidget( mDaysCheckBox );
+ bottomLayout->addWidget( mDaysSpinBox );
+ bottomLayout->addWidget( new QLabel( i18n( "day(s)" ), this ) );
+
+ QGridLayout *localLayout = new QGridLayout( this );
+
+ mPathRequester = new KURLRequester( this );
+
+ KPushButton *removeButton = new KPushButton( this );
+ removeButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
+ removeButton->setText( i18n( "Remove" ) );
+ connect( removeButton, SIGNAL( clicked() ),
+ this, SLOT( deleteWidget() ) );
+
+ mDefaultCheckBox = new QCheckBox( this );
+ mDefaultCheckBox->setText( i18n( "Set as Default" ) );
+
+ localLayout->addItem( new QSpacerItem( 40, 20, QSizePolicy::Expanding ), 0, 0 );
+ localLayout->addWidget( new QLabel( i18n( "Location:" ), this ), 1, 0 );
+ localLayout->addWidget( mPathRequester, 1, 1 );
+ localLayout->addItem( new QSpacerItem( 40, 20, QSizePolicy::Fixed ), 1, 2 );
+ localLayout->addWidget( removeButton, 1, 3 );
+ localLayout->addMultiCellLayout( bottomLayout, 2, 2, 0, 2 );
+ localLayout->addWidget( mDefaultCheckBox, 2, 3 );
+}
+
+void LocalCalendar::deleteWidget()
+{
+ emit deleteRequest( this );
+}
+
+WebdavCalendar::WebdavCalendar( QWidget *parent )
+ : QWidget( parent )
+{
+ initGui();
+};
+
+WebdavCalendar::WebdavCalendar( const QString &username, const QString &password, const QString &url,
+ const QString &defaultcal, const QString &days, QWidget *parent )
+ : QWidget( parent )
+{
+ initGui();
+
+ mUsername->setText( username );
+ mPassword->setText( password );
+ mUrl->setText( url );
+ mDefaultCheckBox->setChecked( defaultcal.toInt() == 1 );
+
+ if ( !days.isEmpty() ) {
+ mDaysCheckBox->setChecked( true );
+ mDaysSpinBox->setEnabled( true );
+ mDaysSpinBox->setValue( days.toInt() );
+ }
+}
+
+void WebdavCalendar::initGui()
+{
+ QBoxLayout *bottomLayout = new QHBoxLayout();
+
+ mDaysCheckBox = new QCheckBox( this );
+ mDaysCheckBox->setText( i18n( "Sync only events newer than" ) );
+
+ mDaysSpinBox = new QSpinBox( this );
+ mDaysSpinBox->setDisabled( true );
+ mDaysSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
+
+ connect( mDaysCheckBox, SIGNAL( toggled( bool ) ),
+ this, SLOT( toggleDays( bool ) ) );
+
+ bottomLayout->addWidget( mDaysCheckBox );
+ bottomLayout->addWidget( mDaysSpinBox );
+ bottomLayout->addWidget( new QLabel( i18n( "day(s)" ), this ) );
+
+ QGridLayout *webdavLayout = new QGridLayout();
+
+ mUrl = new KLineEdit( this );
+ mUsername = new KLineEdit( this );
+ mPassword = new KLineEdit( this );
+ mPassword->setEchoMode( KLineEdit::Password );
+
+ KPushButton *removeButton = new KPushButton( this );
+ removeButton->setText( i18n( "Remove" ) );
+ connect( removeButton, SIGNAL( clicked() ),
+ this, SLOT( deleteWidget() ) );
+
+ mDefaultCheckBox = new QCheckBox( this );
+ mDefaultCheckBox->setText( i18n( "Set as Default" ) );
+
+ webdavLayout->addWidget( new QLabel( i18n( "Location:" ), this ), 0, 0 );
+ webdavLayout->addWidget( mUrl, 0, 1 );
+ webdavLayout->addItem( new QSpacerItem( 40, 20, QSizePolicy::Fixed ), 0, 2 );
+ webdavLayout->addWidget( removeButton, 0, 3 );
+ webdavLayout->addMultiCellLayout( bottomLayout, 1, 1, 0, 1 );
+ webdavLayout->addWidget( mDefaultCheckBox, 1, 3 );
+
+ QGridLayout *mainLayout = new QGridLayout( this );
+ mainLayout->addItem( new QSpacerItem( 40, 20, QSizePolicy::Fixed ), 0, 0 );
+ mainLayout->addMultiCellLayout( webdavLayout, 1, 1, 0, 4 );
+ mainLayout->addWidget( new QLabel( i18n( "Username:" ), this ), 2, 0 );
+ mainLayout->addWidget( mUsername, 2, 1 );
+ mainLayout->addItem( new QSpacerItem( 40, 20, QSizePolicy::Fixed ), 2, 2 );
+ mainLayout->addWidget( new QLabel( i18n( "Password:" ), this ), 2, 3 );
+ mainLayout->addWidget( mPassword, 2, 4 );
+}
+
+void WebdavCalendar::deleteWidget()
+{
+ emit deleteRequest( this );
+}
+
+void LocalCalendar::toggleDays( bool state )
+{
+ mDaysSpinBox->setEnabled( state );
+}
+
+void WebdavCalendar::toggleDays( bool state )
+{
+ mDaysSpinBox->setEnabled( state );
+}
+
+#include "configguisunbird.moc"
diff --git a/kitchensync/src/configguisunbird.h b/kitchensync/src/configguisunbird.h
new file mode 100644
index 000000000..df69417f7
--- /dev/null
+++ b/kitchensync/src/configguisunbird.h
@@ -0,0 +1,130 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2007 Tobias Koenig <tokoe@kde.org>
+ Copyright (c) 2007 Anirudh Ramesh <abattoir@abattoir.in>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#ifndef CONFIGGUISUNBIRD_H
+#define CONFIGGUISUNBIRD_H
+
+#include "configgui.h"
+
+class QWidget;
+class QSpinBox;
+class QCheckBox;
+class QVBoxLayout;
+class QSpacerItem;
+class QSignalMapper;
+
+class KURLRequester;
+class KPushButton;
+class KLineEdit;
+
+class LocalCalendar : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ LocalCalendar( QWidget *parent = 0 );
+ LocalCalendar( const QString &path,
+ const QString &defaultcal,
+ const QString &days, QWidget *parent = 0 );
+
+ KURLRequester *mPathRequester;
+ QCheckBox *mDaysCheckBox;
+ QSpinBox *mDaysSpinBox;
+ QCheckBox *mDefaultCheckBox;
+
+ signals:
+ void deleteRequest( LocalCalendar* );
+
+ private slots:
+ void deleteWidget();
+ void toggleDays( bool days );
+
+ private:
+ void initGui();
+};
+
+class WebdavCalendar : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ WebdavCalendar( QWidget *parent = 0 );
+ WebdavCalendar( const QString &username,
+ const QString &password,
+ const QString &url,
+ const QString &defaultcal,
+ const QString &days, QWidget *parent = 0 );
+
+ KLineEdit *mUrl;
+ QCheckBox *mDaysCheckBox;
+ QSpinBox *mDaysSpinBox;
+ QCheckBox *mDefaultCheckBox;
+ KLineEdit *mUsername;
+ KLineEdit *mPassword;
+
+ signals:
+ void deleteRequest( WebdavCalendar* );
+
+ private slots:
+ void deleteWidget();
+ void toggleDays( bool state );
+
+ private:
+ void initGui();
+};
+
+class ConfigGuiSunbird : public ConfigGui
+{
+ Q_OBJECT
+
+ public:
+ ConfigGuiSunbird( const QSync::Member &, QWidget *parent );
+
+ void load( const QString &xml );
+
+ QString save() const;
+
+ public slots:
+ void addLocalCalendar();
+ void addWebdavCalendar();
+
+ void delLocalCalendar( LocalCalendar* );
+ void delWebdavCalendar( WebdavCalendar* );
+
+ private:
+ QValueList<LocalCalendar*> mLocalList;
+ QValueList<WebdavCalendar*> mWebdavList;
+
+ QWidget *mLocalWidget;
+ QWidget *mWebdavWidget;
+
+ QVBoxLayout *mLocalLayout;
+ QVBoxLayout *mWebdavLayout;
+
+ KPushButton *mLocalAddButton;
+ KPushButton *mWebdavAddButton;
+
+ QSpacerItem *mLocalSpacer;
+ QSpacerItem *mWebdavSpacer;
+};
+
+#endif
diff --git a/kitchensync/src/configguisynce.cpp b/kitchensync/src/configguisynce.cpp
new file mode 100644
index 000000000..43b509a46
--- /dev/null
+++ b/kitchensync/src/configguisynce.cpp
@@ -0,0 +1,93 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2007 Anirudh Ramesh <abattoir@abattoir.in>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "configguisynce.h"
+
+#include <qdom.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qcheckbox.h>
+
+#include <klineedit.h>
+#include <kdialog.h>
+#include <klocale.h>
+
+ConfigGuiSynce::ConfigGuiSynce( const QSync::Member &member, QWidget *parent )
+ : ConfigGui( member, parent )
+{
+ initGUI();
+}
+
+void ConfigGuiSynce::load( const QString &xml )
+{
+ QDomDocument doc;
+ doc.setContent( xml );
+ QDomElement docElement = doc.documentElement();
+ QDomNode node;
+ for( node = docElement.firstChild(); !node.isNull(); node = node.nextSibling() ) {
+ QDomElement element = node.toElement();
+ if ( element.tagName() == "contact" ) {
+ mContacts->setChecked( element.text().toInt() == 1 );
+ } else if ( element.tagName() == "todos" ) {
+ mTodos->setChecked( element.text().toInt() == 1 );
+ } else if ( element.tagName() == "calendar" ) {
+ mCalendar->setChecked( element.text().toInt() == 1 );
+ } else if ( element.tagName() == "file" ) {
+ mFile->setText( element.text() );
+ }
+ }
+}
+
+QString ConfigGuiSynce::save() const
+{
+ QString config = "<config>\n";
+
+ config += QString( "<contact>%1</contact>\n" ).arg( mContacts->isChecked() ? "1" : "0" );
+ config += QString( "<todos>%1</todos>\n" ).arg( mTodos->isChecked() ? "1" : "0" );
+ config += QString( "<calendar>%1</calendar>\n" ).arg( mCalendar->isChecked() ? "1" : "0" );
+ config += QString( "<file>%1</file>\n" ).arg( mFile->text() );
+
+ config += "</config>";
+
+ return config;
+}
+
+void ConfigGuiSynce::initGUI()
+{
+ QGridLayout *layout = new QGridLayout( topLayout(), 12, 2, KDialog::spacingHint() );
+ layout->setMargin( KDialog::marginHint() );
+
+ mContacts = new QCheckBox( this );
+ mContacts->setText( "Sync Contacts" );
+ layout->addMultiCellWidget( mContacts, 0, 0, 0, 1 );
+
+ mTodos = new QCheckBox( this );
+ mTodos->setText( "Sync \'Todo\' items" );
+ layout->addMultiCellWidget( mTodos, 1, 1, 0, 1 );
+
+ mCalendar = new QCheckBox( this );
+ mCalendar->setText( "Sync Calendar" );
+ layout->addMultiCellWidget( mCalendar, 2, 2, 0, 1 );
+
+ layout->addWidget( new QLabel( i18n( "File:" ), this ), 3, 0 );
+ mFile = new KLineEdit( this );
+ layout->addWidget( mFile, 3, 1 );
+}
diff --git a/kitchensync/src/configguisynce.h b/kitchensync/src/configguisynce.h
new file mode 100644
index 000000000..07835572e
--- /dev/null
+++ b/kitchensync/src/configguisynce.h
@@ -0,0 +1,49 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2007 Anirudh Ramesh <abattoir@abattoir.in>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#ifndef CONFIGGUISYNCE_H
+#define CONFIGGUISYNCE_H
+
+#include "configgui.h"
+
+class QCheckBox;
+
+class KLineEdit;
+
+class ConfigGuiSynce : public ConfigGui
+{
+ public:
+ ConfigGuiSynce( const QSync::Member &, QWidget *parent );
+
+ void load( const QString &xml );
+
+ QString save() const;
+
+ private:
+ void initGUI();
+
+ QCheckBox *mContacts;
+ QCheckBox *mTodos;
+ QCheckBox *mCalendar;
+ KLineEdit *mFile;
+};
+
+#endif
diff --git a/kitchensync/src/configguisyncmlhttp.cpp b/kitchensync/src/configguisyncmlhttp.cpp
new file mode 100644
index 000000000..63a073c90
--- /dev/null
+++ b/kitchensync/src/configguisyncmlhttp.cpp
@@ -0,0 +1,227 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "configguisyncmlhttp.h"
+
+#include <kcombobox.h>
+#include <kdialog.h>
+#include <klineedit.h>
+#include <klocale.h>
+#include <kurlrequester.h>
+
+#include <qcheckbox.h>
+#include <qdom.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qspinbox.h>
+#include <qtabwidget.h>
+#include <qvbox.h>
+
+ConfigGuiSyncmlHttp::ConfigGuiSyncmlHttp( const QSync::Member &member, QWidget *parent )
+ : ConfigGui( member, parent ), mUrl( 0 ), mPort( 0 )
+{
+
+ QTabWidget *tabWidget = new QTabWidget( this );
+ topLayout()->addWidget( tabWidget );
+
+ // Connection
+ QWidget *connectionWidget = new QWidget( tabWidget );
+ QVBoxLayout *connectionLayout = new QVBoxLayout( connectionWidget,
+ KDialog::marginHint(), KDialog::spacingHint() );
+
+ tabWidget->addTab( connectionWidget, i18n( "Connection" ) );
+
+ mGridLayout = new QGridLayout( connectionLayout );
+
+ QLabel *label = new QLabel( i18n("Port:"), connectionWidget );
+ mGridLayout->addWidget( label, 0, 0 );
+
+ mPort = new QSpinBox( connectionWidget );
+ mPort->setMinValue( 1 );
+ mPort->setMaxValue( 65536 );
+ mGridLayout->addWidget( mPort, 0, 1 );
+
+ // Database
+ QWidget *databaseWidget = new QWidget( tabWidget );
+ QVBoxLayout *databaseLayout = new QVBoxLayout( databaseWidget,
+ KDialog::marginHint(), KDialog::spacingHint() );
+
+ tabWidget->addTab( databaseWidget, i18n( "Databases" ) );
+
+ mGridLayout = new QGridLayout( databaseLayout );
+ addLineEdit( databaseWidget, i18n("Contact Database:"), &mContactDb, 0 );
+ addLineEdit( databaseWidget, i18n("Calendar Database:"), &mCalendarDb, 1 );
+ addLineEdit( databaseWidget, i18n("Note Database:"), &mNoteDb, 2 );
+
+ mContactDb->insertItem( "addressbook" );
+ mContactDb->insertItem( "contacts" );
+
+ mCalendarDb->insertItem( "agenda" );
+ mCalendarDb->insertItem( "calendar" );
+
+ mNoteDb->insertItem( "notes" );
+
+
+ // Options
+ QWidget *optionWidget = new QWidget( tabWidget );
+ QVBoxLayout *optionLayout = new QVBoxLayout( optionWidget,
+ KDialog::marginHint(), KDialog::spacingHint() );
+
+ tabWidget->addTab( optionWidget, i18n( "Options" ) );
+
+ mGridLayout = new QGridLayout( optionLayout );
+
+ label = new QLabel( i18n("User name:"), optionWidget );
+ mGridLayout->addWidget( label, 0, 0 );
+
+ mUsername = new KLineEdit( optionWidget );
+ mGridLayout->addWidget( mUsername, 0, 1 );
+
+ label = new QLabel( i18n("Password:"), optionWidget );
+ mGridLayout->addWidget( label, 1, 0 );
+
+ mPassword = new KLineEdit( optionWidget );
+ mPassword->setEchoMode( QLineEdit::Password );
+ mGridLayout->addWidget( mPassword, 1, 1 );
+
+
+ mUseStringTable = new QCheckBox( i18n("Use String Table"), optionWidget );
+ mGridLayout->addMultiCellWidget( mUseStringTable, 2, 2, 0, 1 );
+
+ mOnlyReplace = new QCheckBox( i18n("Only Replace Entries"), optionWidget );
+ mGridLayout->addMultiCellWidget( mOnlyReplace, 3, 3, 0, 1 );
+
+ // Url
+ label = new QLabel( i18n("URL:"), optionWidget );
+ mGridLayout->addWidget( label, 4, 0 );
+
+ mUrl = new KLineEdit( optionWidget );
+ mGridLayout->addWidget( mUrl, 4, 1 );
+
+ // recvLimit
+ label = new QLabel( i18n("Receive Limit:"), optionWidget );
+ mGridLayout->addWidget( label, 5, 0 );
+
+ mRecvLimit = new QSpinBox( optionWidget );
+ mRecvLimit->setMinValue( 1 );
+ mRecvLimit->setMaxValue( 65536 );
+ mGridLayout->addWidget( mRecvLimit, 5, 1 );
+
+ // maxObjSize
+ label = new QLabel( i18n("Maximum Object Size"), optionWidget );
+ mGridLayout->addWidget( label, 6, 0 );
+
+ mMaxObjSize = new QSpinBox( optionWidget );
+ mMaxObjSize->setMinValue( 1 );
+ mMaxObjSize->setMaxValue( 65536 );
+ mGridLayout->addWidget( mMaxObjSize, 6, 1 );
+
+ topLayout()->addStretch( 1 );
+}
+
+void ConfigGuiSyncmlHttp::addLineEdit( QWidget *parent, const QString &text, KComboBox **edit, int row )
+{
+ QLabel *label = new QLabel( text, parent);
+ mGridLayout->addWidget( label, row, 0 );
+
+ *edit = new KComboBox( true, parent );
+ mGridLayout->addWidget( *edit, row, 1 );
+}
+
+void ConfigGuiSyncmlHttp::load( const QString &xml )
+{
+ QDomDocument document;
+ document.setContent( xml );
+
+ QDomElement docElement = document.documentElement();
+ QDomNode node;
+
+ for ( node = docElement.firstChild(); !node.isNull(); node = node.nextSibling() ) {
+ QDomElement element = node.toElement();
+ if ( element.tagName() == "username" ) {
+ mUsername->setText( element.text() );
+ } else if ( element.tagName() == "password" ) {
+ mPassword->setText( element.text() );
+ } else if ( element.tagName() == "url" ) {
+ if ( mUrl )
+ mUrl->setText( element.text() );
+ } else if ( element.tagName() == "port" ) {
+ if ( mPort )
+ mPort->setValue( element.text().toInt() );
+ } else if ( element.tagName() == "recvLimit" ) {
+ if ( mRecvLimit )
+ mRecvLimit->setValue( element.text().toInt() );
+ } else if ( element.tagName() == "maxObjSize" ) {
+ if ( mMaxObjSize )
+ mMaxObjSize->setValue( element.text().toInt() );
+ } else if ( element.tagName() == "usestringtable" ) {
+ mUseStringTable->setChecked( element.text() == "1" );
+ } else if ( element.tagName() == "onlyreplace" ) {
+ mOnlyReplace->setChecked( element.text() == "1" );
+ } else if ( element.tagName() == "contact_db" ) {
+ mContactDb->setCurrentText( element.text() );
+ } else if ( element.tagName() == "calendar_db" ) {
+ mCalendarDb->setCurrentText( element.text() );
+ } else if ( element.tagName() == "note_db" ) {
+ mNoteDb->setCurrentText( element.text() );
+ }
+ }
+}
+
+QString ConfigGuiSyncmlHttp::save() const
+{
+ QString xml;
+ xml = "<config>\n";
+ xml += "<username>" + mUsername->text() + "</username>\n";
+ xml += "<password>" + mPassword->text() + "</password>\n";
+
+ xml += "<url>" + mUrl->text() + "</url>\n";
+ xml += "<port>" + QString::number( mPort->value() ) + "</port>\n";
+ // Receive Limit
+ xml += "<recvLimit>" + QString::number( mRecvLimit->value() ) + "</recvLimit>\n";
+
+ // Maximal Object Size
+ xml += "<maxObjSize>" + QString::number( mMaxObjSize->value() ) + "</maxObjSize>\n";
+
+ xml += "<usestringtable>";
+ if ( mUseStringTable->isChecked() )
+ xml += "1";
+ else
+ xml += "0";
+ xml += "</usestringtable>\n";
+
+ xml += "<onlyreplace>";
+ if ( mOnlyReplace->isChecked() )
+ xml += "1";
+ else
+ xml += "0";
+ xml += "</onlyreplace>\n";
+
+ xml += "<contact_db>" + mContactDb->currentText() + "</contact_db>\n";
+ xml += "<calendar_db>" + mCalendarDb->currentText() + "</calendar_db>\n";
+ xml += "<note_db>" + mNoteDb->currentText() + "</note_db>\n";
+ xml += "</config>";
+
+ return xml;
+}
+
+#include "configguisyncmlhttp.moc"
+
diff --git a/kitchensync/src/configguisyncmlhttp.h b/kitchensync/src/configguisyncmlhttp.h
new file mode 100644
index 000000000..2cbcfc40a
--- /dev/null
+++ b/kitchensync/src/configguisyncmlhttp.h
@@ -0,0 +1,67 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+#ifndef CONFIGGUISYNCML_H
+#define CONFIGGUISYNCML_H
+
+#include <qdom.h>
+
+#include "configgui.h"
+
+class QCheckBox;
+class QComboBox;
+class QGridLayout;
+class QSpinBox;
+class KComboBox;
+class KLineEdit;
+
+class ConfigGuiSyncmlHttp : public ConfigGui
+{
+
+ Q_OBJECT
+
+ public:
+ ConfigGuiSyncmlHttp( const QSync::Member &, QWidget *parent );
+
+ void load( const QString &xml );
+ QString save() const;
+
+ private:
+ QGridLayout *mGridLayout;
+
+ KLineEdit *mUsername;
+ KLineEdit *mPassword;
+ KLineEdit *mUrl;
+ QSpinBox *mPort;
+ QCheckBox *mUseStringTable;
+ QCheckBox *mOnlyReplace;
+
+ QSpinBox *mRecvLimit;
+ QSpinBox *mMaxObjSize;
+
+ KComboBox *mContactDb;
+ KComboBox *mCalendarDb;
+ KComboBox *mNoteDb;
+
+ protected slots:
+ void addLineEdit( QWidget *parent, const QString &text, KComboBox **edit, int row );
+};
+
+#endif
diff --git a/kitchensync/src/configguisyncmlobex.cpp b/kitchensync/src/configguisyncmlobex.cpp
new file mode 100644
index 000000000..488a0d944
--- /dev/null
+++ b/kitchensync/src/configguisyncmlobex.cpp
@@ -0,0 +1,320 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (c) 2006 Daniel Gollub <dgollub@suse.de>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "configguisyncmlobex.h"
+
+#include <kcombobox.h>
+#include <kdialog.h>
+#include <klineedit.h>
+#include <klocale.h>
+#include <kurlrequester.h>
+
+#include <qlayout.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qlabel.h>
+#include <qdom.h>
+#include <qspinbox.h>
+#include <qtabwidget.h>
+#include <qvbox.h>
+
+ConfigGuiSyncmlObex::ConfigGuiSyncmlObex( const QSync::Member &member, QWidget *parent )
+ : ConfigGui( member, parent )
+{
+ QTabWidget *tabWidget = new QTabWidget( this );
+ topLayout()->addWidget( tabWidget );
+
+ // Connection
+ QVBox *connectionWidget = new QVBox( this );
+ connectionWidget->setMargin( KDialog::marginHint() );
+ connectionWidget->setSpacing( 5 );
+
+ tabWidget->addTab( connectionWidget, i18n( "Connection" ) );
+
+ mConnection = new KComboBox( connectionWidget );
+
+ connect( mConnection, SIGNAL (activated( int ) ),
+ this, SLOT( slotConnectionChanged ( int ) ) );
+
+ mConnectionTypes.append( ConnectionType( 2, i18n( "Bluetooth" ) ) );
+ mConnectionTypes.append( ConnectionType( 5, i18n( "USB" ) ) );
+
+ ConnectionTypeList::ConstIterator it;
+ for ( it = mConnectionTypes.begin(); it != mConnectionTypes.end(); it++ )
+ mConnection->insertItem( (*it).second );
+
+ mBluetooth = new BluetoothWidget( connectionWidget );
+ mBluetooth->hide();
+
+ mUsb = new UsbWidget( connectionWidget );
+ mUsb->hide();
+
+ connectionWidget->setStretchFactor( mBluetooth, 1 );
+ connectionWidget->setStretchFactor( mUsb, 1 );
+
+ // Databases
+ QWidget *databaseWidget = new QWidget( tabWidget );
+ QVBoxLayout *databaseLayout = new QVBoxLayout( databaseWidget,
+ KDialog::marginHint(), KDialog::spacingHint() );
+
+ tabWidget->addTab( databaseWidget, i18n( "Databases" ) );
+
+ mGridLayout = new QGridLayout( databaseLayout );
+ addLineEdit( databaseWidget, i18n("Contact Database:"), &mContactDb, 0 );
+ addLineEdit( databaseWidget, i18n("Calendar Database:"), &mCalendarDb, 1 );
+ addLineEdit( databaseWidget, i18n("Note Database:"), &mNoteDb, 2 );
+
+ mContactDb->insertItem( "addressbook" );
+ mContactDb->insertItem( "contacts" );
+
+ mCalendarDb->insertItem( "agenda" );
+ mCalendarDb->insertItem( "calendar" );
+
+ mNoteDb->insertItem( "notes" );
+
+ // Options
+ QWidget *optionsWidget = new QWidget( tabWidget );
+ QVBoxLayout *optionsLayout = new QVBoxLayout( optionsWidget,
+ KDialog::marginHint(), KDialog::spacingHint() );
+
+ tabWidget->addTab( optionsWidget, i18n( "Options" ) );
+
+ mGridLayout = new QGridLayout( optionsLayout );
+
+ QLabel *label = new QLabel( i18n("User name:"), optionsWidget );
+ mGridLayout->addWidget( label, 0, 0 );
+
+ mUsername = new KLineEdit( optionsWidget );
+ mGridLayout->addWidget( mUsername, 0, 1 );
+
+ label = new QLabel( i18n("Password:"), optionsWidget );
+ mGridLayout->addWidget( label, 1, 0 );
+
+ mPassword = new KLineEdit( optionsWidget );
+ mPassword->setEchoMode( QLineEdit::Password );
+ mGridLayout->addWidget( mPassword, 1, 1 );
+
+ mUseStringTable = new QCheckBox( i18n("Use String Table"), optionsWidget );
+ mGridLayout->addMultiCellWidget( mUseStringTable, 2, 2, 0, 1 );
+
+ mOnlyReplace = new QCheckBox( i18n("Only Replace Entries"), optionsWidget );
+ mGridLayout->addMultiCellWidget( mOnlyReplace, 3, 3, 0, 1 );
+
+ // SynML Version
+ label = new QLabel( i18n("SyncML Version:"), optionsWidget );
+ mGridLayout->addWidget( label, 4, 0 );
+
+ mSyncmlVersion = new QComboBox( optionsWidget );
+ mGridLayout->addWidget( mSyncmlVersion, 4, 1 );
+
+ mSyncmlVersions.append( SyncmlVersion( 0, i18n( "1.0" ) ) );
+ mSyncmlVersions.append( SyncmlVersion( 1, i18n( "1.1" ) ) );
+ mSyncmlVersions.append( SyncmlVersion( 2, i18n( "1.2" ) ) );
+
+ SyncmlVersionList::ConstIterator itVersion;
+ for ( itVersion = mSyncmlVersions.begin(); itVersion != mSyncmlVersions.end(); itVersion++ )
+ mSyncmlVersion->insertItem( (*itVersion).second );
+
+ // WBXML
+ mWbxml = new QCheckBox( i18n("WAP Binary XML"), optionsWidget );
+ mGridLayout->addMultiCellWidget( mWbxml, 12, 12, 0, 1 );
+
+ // Identifier
+ label = new QLabel( i18n("Software Identifier:"), optionsWidget );
+ mGridLayout->addWidget( label, 13, 0 );
+
+ mIdentifier = new KComboBox( true, optionsWidget );
+ mGridLayout->addWidget( mIdentifier, 13, 1 );
+
+ mIdentifier->insertItem( "" );
+ mIdentifier->insertItem( "PC Suite" );
+
+ // recvLimit
+ label = new QLabel( i18n("Receive Limit:"), optionsWidget );
+ mGridLayout->addWidget( label, 14, 0 );
+
+ mRecvLimit = new QSpinBox( optionsWidget );
+ mRecvLimit->setMinValue( 1 );
+ mRecvLimit->setMaxValue( 65536 );
+ mGridLayout->addWidget( mRecvLimit, 14, 1 );
+
+ // maxObjSize
+ label = new QLabel( i18n("Maximum Object Size"), optionsWidget );
+ mGridLayout->addWidget( label, 15, 0 );
+
+ mMaxObjSize = new QSpinBox( optionsWidget );
+ mMaxObjSize->setMinValue( 1 );
+ mMaxObjSize->setMaxValue( 65536 );
+ mGridLayout->addWidget( mMaxObjSize, 15, 1 );
+
+ topLayout()->addStretch( 1 );
+}
+
+void ConfigGuiSyncmlObex::slotConnectionChanged( int pos )
+{
+ mUsb->hide();
+ mBluetooth->hide();
+
+ if ( pos == 0 )
+ mBluetooth->show();
+ else if ( pos == 1 )
+ mUsb->show();
+}
+
+void ConfigGuiSyncmlObex::load( const QString &xml )
+{
+ QDomDocument document;
+ document.setContent( xml );
+
+ QDomElement docElement = document.documentElement();
+
+ QDomNode node;
+ for( node = docElement.firstChild(); !node.isNull(); node = node.nextSibling() ) {
+ QDomElement element = node.toElement();
+ if ( element.tagName() == "username" ) {
+ mUsername->setText( element.text() );
+ } else if ( element.tagName() == "password" ) {
+ mPassword->setText( element.text() );
+ } else if ( element.tagName() == "type" ) {
+ for ( uint i = 0; i < mConnectionTypes.count(); i++ ) {
+ if ( mConnectionTypes[i].first == element.text().toInt() ) {
+ mConnection->setCurrentItem( i );
+ slotConnectionChanged( i );
+ break;
+ }
+ }
+ } else if ( element.tagName() == "version" ) {
+ for ( uint i = 0; i < mSyncmlVersions.count(); i++ ) {
+ if ( mSyncmlVersions[i].first == element.text().toInt() ) {
+ mSyncmlVersion->setCurrentItem( i );
+ break;
+ }
+ }
+ } else if ( element.tagName() == "bluetooth_address" ) {
+ if ( mBluetooth ) mBluetooth->setAddress( element.text() );
+ } else if ( element.tagName() == "bluetooth_channel" ) {
+ if ( mBluetooth ) mBluetooth->setChannel( element.text() );
+ } else if ( element.tagName() == "identifier" ) {
+ if ( mIdentifier ) mIdentifier->setCurrentText( element.text() );
+ } else if ( element.tagName() == "interface" ) {
+ if ( mUsb ) mUsb->setInterface( element.text().toInt() );
+ } else if ( element.tagName() == "wbxml" ) {
+ if ( mWbxml) mWbxml->setChecked( element.text() == "1" );
+ } else if ( element.tagName() == "recvLimit" ) {
+ if ( mRecvLimit ) mRecvLimit->setValue( element.text().toInt() );
+ } else if ( element.tagName() == "maxObjSize" ) {
+ if ( mMaxObjSize ) mMaxObjSize->setValue( element.text().toInt() );
+ } else if ( element.tagName() == "usestringtable" ) {
+ mUseStringTable->setChecked( element.text() == "1" );
+ } else if ( element.tagName() == "onlyreplace" ) {
+ mOnlyReplace->setChecked( element.text() == "1" );
+ } else if ( element.tagName() == "contact_db" ) {
+ mContactDb->setCurrentText( element.text() );
+ } else if ( element.tagName() == "calendar_db" ) {
+ mCalendarDb->setCurrentText( element.text() );
+ } else if ( element.tagName() == "note_db" ) {
+ mNoteDb->setCurrentText( element.text() );
+ }
+ }
+}
+
+QString ConfigGuiSyncmlObex::save() const
+{
+ QString xml;
+ xml = "<config>\n";
+ xml += "<username>" + mUsername->text() + "</username>\n";
+ xml += "<password>" + mPassword->text() + "</password>\n";
+ ConnectionTypeList::ConstIterator it;
+ for ( it = mConnectionTypes.begin(); it != mConnectionTypes.end(); it++ ) {
+ if ( mConnection->currentText() == (*it).second ) {
+ xml += "<type>" + QString("%1").arg((*it).first) + "</type>\n";
+ break;
+ }
+ }
+
+ // Bluetooth Address
+ xml += "<bluetooth_address>" + mBluetooth->address() + "</bluetooth_address>\n";
+
+ // Bluetooth Channel
+ xml += "<bluetooth_channel>" + mBluetooth->channel() + "</bluetooth_channel>\n";
+
+ // USB Interface
+ xml += "<interface>" + QString::number( mUsb->interface() ) +"</interface>\n";
+
+ // SyncML Version
+ SyncmlVersionList::ConstIterator itVersion;
+ for ( itVersion = mSyncmlVersions.begin(); itVersion != mSyncmlVersions.end(); itVersion++ ) {
+ if ( mSyncmlVersion->currentText() == (*itVersion).second ) {
+ xml += "<version>" + QString("%1").arg((*itVersion).first) + "</version>\n";
+ break;
+ }
+ }
+
+ // (Software) Identifier
+ xml += "<identifier>" + mIdentifier->currentText() + "</identifier>\n";
+
+ // WBXML
+ xml += "<wbxml>";
+ if ( mWbxml->isChecked() )
+ xml += "1";
+ else
+ xml += "0";
+ xml += "</wbxml>\n";
+
+ // Receive Limit
+ xml += "<recvLimit>" + QString::number( mRecvLimit->value() ) + "</recvLimit>\n";
+
+ // Maximal Object Size
+ xml += "<maxObjSize>" + QString::number( mMaxObjSize->value() ) + "</maxObjSize>\n";
+
+ xml += "<usestringtable>";
+ if ( mUseStringTable->isChecked() )
+ xml += "1";
+ else
+ xml += "0";
+ xml += "</usestringtable>\n";
+
+ xml += "<onlyreplace>";
+ if ( mOnlyReplace->isChecked() )
+ xml += "1";
+ else
+ xml += "0";
+ xml += "</onlyreplace>\n";
+
+ xml += "<contact_db>" + mContactDb->currentText() + "</contact_db>\n";
+ xml += "<calendar_db>" + mCalendarDb->currentText() + "</calendar_db>\n";
+ xml += "<note_db>" + mNoteDb->currentText() + "</note_db>\n";
+ xml += "</config>";
+
+ return xml;
+}
+
+void ConfigGuiSyncmlObex::addLineEdit( QWidget *parent, const QString &text, KComboBox **edit, int row )
+{
+ QLabel *label = new QLabel( text, parent );
+ mGridLayout->addWidget( label, row, 0 );
+
+ *edit = new KComboBox( true, parent );
+ mGridLayout->addWidget( *edit, row, 1 );
+}
+
+#include "configguisyncmlobex.moc"
diff --git a/kitchensync/src/configguisyncmlobex.h b/kitchensync/src/configguisyncmlobex.h
new file mode 100644
index 000000000..a10d06a52
--- /dev/null
+++ b/kitchensync/src/configguisyncmlobex.h
@@ -0,0 +1,87 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (c) 2006 Daniel Gollub <dgollub@suse.de>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+#ifndef CONFIGGUISYNCMLOBEX_H
+#define CONFIGGUISYNCMLOBEX_H
+
+#include <qdom.h>
+
+#include "configgui.h"
+#include "connectionwidgets.h"
+
+class QCheckBox;
+class QComboBox;
+class QGridLayout;
+class QSpinBox;
+class KComboBox;
+class KLineEdit;
+class KURLRequester;
+
+class ConfigGuiSyncmlObex : public ConfigGui
+{
+ Q_OBJECT
+
+ public:
+ ConfigGuiSyncmlObex( const QSync::Member &, QWidget *parent = 0 );
+
+ void load( const QString &xml );
+ QString save() const;
+
+ public slots:
+ void slotConnectionChanged( int pos );
+
+ private:
+ // Connection
+ typedef QPair<int, QString> ConnectionType;
+ typedef QValueList<ConnectionType> ConnectionTypeList;
+ ConnectionTypeList mConnectionTypes;
+
+ QComboBox *mConnection;
+ BluetoothWidget *mBluetooth;
+ UsbWidget *mUsb;
+
+ // Options
+ typedef QPair<int, QString> SyncmlVersion;
+ typedef QValueList<SyncmlVersion> SyncmlVersionList;
+ SyncmlVersionList mSyncmlVersions;
+
+ QStringList mIdentiferList;
+ KLineEdit *mUsername;
+ KLineEdit *mPassword;
+ QCheckBox *mUseStringTable;
+ QCheckBox *mOnlyReplace;
+ QSpinBox *mRecvLimit;
+ QSpinBox *mMaxObjSize;
+ QComboBox *mSyncmlVersion;
+ KComboBox *mIdentifier;
+ QCheckBox *mWbxml;
+
+ QGridLayout *mGridLayout;
+
+ KComboBox *mContactDb;
+ KComboBox *mCalendarDb;
+ KComboBox *mNoteDb;
+
+ protected slots:
+ void addLineEdit( QWidget *parent, const QString &text, KComboBox **edit, int row );
+};
+
+#endif
diff --git a/kitchensync/src/conflictdialog.cpp b/kitchensync/src/conflictdialog.cpp
new file mode 100644
index 000000000..a021e121a
--- /dev/null
+++ b/kitchensync/src/conflictdialog.cpp
@@ -0,0 +1,26 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include "conflictdialog.h"
+
+ConflictDialog::ConflictDialog( QSync::SyncMapping &mapping, QWidget *parent )
+ : QDialog( parent ), mMapping( mapping )
+{
+}
diff --git a/kitchensync/src/conflictdialog.h b/kitchensync/src/conflictdialog.h
new file mode 100644
index 000000000..9718f4c65
--- /dev/null
+++ b/kitchensync/src/conflictdialog.h
@@ -0,0 +1,40 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef CONFLICTDIALOG_H
+#define CONFLICTDIALOG_H
+
+#include <qdialog.h>
+
+#include <libqopensync/syncmapping.h>
+
+/**
+ Base class for SingleConflictDialog and MultiConflictDialog.
+ */
+class ConflictDialog : public QDialog
+{
+ public:
+ ConflictDialog( QSync::SyncMapping &mapping, QWidget *parent );
+
+ protected:
+ QSync::SyncMapping mMapping;
+};
+
+#endif
diff --git a/kitchensync/src/connectionwidgets.cpp b/kitchensync/src/connectionwidgets.cpp
new file mode 100644
index 000000000..76d2297b7
--- /dev/null
+++ b/kitchensync/src/connectionwidgets.cpp
@@ -0,0 +1,227 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+ Copyright (c) 2006 Daniel Gollub <dgollub@suse.de>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <kcombobox.h>
+#include <kdialog.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <kinputdialog.h>
+#include <klineedit.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#include <qapplication.h>
+#include <qeventloop.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qspinbox.h>
+#include <qtabwidget.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+
+#include "connectionwidgets.h"
+
+BluetoothWidget::BluetoothWidget( QWidget *parent )
+ : QWidget( parent )
+{
+ QGridLayout *layout = new QGridLayout( this );
+
+ mAddress = new KLineEdit( this );
+ mAddress->setInputMask( ">NN:NN:NN:NN:NN:NN;" );
+ layout->addWidget( mAddress, 1, 0 );
+
+ QLabel *label = new QLabel( i18n( "Bluetooth address:" ), this );
+ label->setBuddy( mAddress );
+ layout->addWidget( label, 0, 0 );
+
+ mChannel = new KLineEdit( this );
+ layout->addWidget( mChannel, 1, 1 );
+
+ mChannelLabel = new QLabel( i18n( "Channel:" ), this );
+ mChannelLabel->setBuddy( mChannel );
+ layout->addWidget( mChannelLabel, 0, 1 );
+
+ layout->setRowStretch( 2, 1 );
+}
+
+void BluetoothWidget::hideChannel()
+{
+ mChannelLabel->hide();
+ mChannel->hide();
+}
+
+void BluetoothWidget::showChannel()
+{
+ mChannelLabel->show();
+ mChannel->show();
+}
+
+void BluetoothWidget::setAddress( const QString address )
+{
+ mAddress->setText( address );
+}
+
+void BluetoothWidget::setChannel( const QString channel )
+{
+ if ( mChannel )
+ mChannel->setText( channel );
+}
+
+QString BluetoothWidget::address() const
+{
+ return mAddress->text();
+}
+
+QString BluetoothWidget::channel() const
+{
+ if ( mChannel->text().isEmpty() )
+ return QString();
+
+ return mChannel->text();
+}
+
+// FIXME - Only IrMC specific
+IRWidget::IRWidget( QWidget *parent )
+ : QWidget( parent )
+{
+ QGridLayout *layout = new QGridLayout( this, 3, 3, 11, 3 );
+
+ mDevice = new KLineEdit( this );
+ mSerialNumber = new KLineEdit( this );
+
+ layout->addWidget( mDevice, 1, 0 );
+ layout->addWidget( mSerialNumber, 1, 1 );
+
+ QLabel *label = new QLabel( i18n( "Device Name:" ), this );
+ label->setBuddy( mDevice );
+ layout->addWidget( label, 0, 0 );
+
+ label = new QLabel( i18n( "Serial Number:" ), this );
+ label->setBuddy( mSerialNumber );
+ layout->addWidget( label, 0, 1 );
+
+ layout->setRowStretch( 2, 1 );
+}
+
+void IRWidget::load( const QDomElement &parent )
+{
+ QDomNode node;
+ for ( node = parent.firstChild(); !node.isNull(); node = node.nextSibling() ) {
+ QDomElement element = node.toElement();
+ if ( element.tagName() == "irname" )
+ mDevice->setText( element.text() );
+ else if ( element.tagName() == "irserial" )
+ mSerialNumber->setText( element.text() );
+ }
+}
+
+void IRWidget::save( QDomDocument &doc, QDomElement &parent )
+{
+ QDomElement element = doc.createElement( "irname" );
+ element.appendChild( doc.createTextNode( mDevice->text() ) );
+ parent.appendChild( element );
+
+ element = doc.createElement( "irserial" );
+ element.appendChild( doc.createTextNode( mSerialNumber->text() ) );
+ parent.appendChild( element );
+}
+
+// FIXME - Only IrMC specific
+CableWidget::CableWidget( QWidget *parent )
+ : QWidget( parent )
+{
+ QGridLayout *layout = new QGridLayout( this, 3, 2, 11, 3 );
+
+ mManufacturer = new KComboBox( this );
+ mDevice = new KComboBox( true, this );
+
+ layout->addWidget( mManufacturer, 0, 1 );
+ layout->addWidget( mDevice, 1, 1 );
+
+ QLabel *label = new QLabel( i18n( "Device Manufacturer:" ), this );
+ label->setBuddy( mManufacturer );
+ layout->addWidget( label, 0, 0 );
+
+ label = new QLabel( i18n( "Device:" ), this );
+ label->setBuddy( mDevice );
+ layout->addWidget( label, 1, 0 );
+
+ layout->setRowStretch( 2, 1 );
+
+ mManufacturer->insertItem( i18n( "SonyEricsson/Ericsson" ) );
+ mManufacturer->insertItem( i18n( "Siemens" ) );
+
+ mDevice->insertItem( "/dev/ttyS0" );
+ mDevice->insertItem( "/dev/ttyS1" );
+ mDevice->insertItem( "/dev/ttyUSB0" );
+ mDevice->insertItem( "/dev/ttyUSB1" );
+}
+
+void CableWidget::load( const QDomElement &parent )
+{
+ QDomNode node;
+ for ( node = parent.firstChild(); !node.isNull(); node = node.nextSibling() ) {
+ QDomElement element = node.toElement();
+ if ( element.tagName() == "cabletype" )
+ mManufacturer->setCurrentItem( element.text().toInt() );
+ else if ( element.tagName() == "cabledev" )
+ mDevice->setCurrentText( element.text() );
+ }
+}
+
+void CableWidget::save( QDomDocument &doc, QDomElement &parent )
+{
+ QDomElement element = doc.createElement( "cabletype" );
+ element.appendChild( doc.createTextNode( QString::number( mManufacturer->currentItem() ) ) );
+ parent.appendChild( element );
+
+ element = doc.createElement( "cabledev" );
+ element.appendChild( doc.createTextNode( mDevice->currentText() ) );
+ parent.appendChild( element );
+}
+
+UsbWidget::UsbWidget( QWidget *parent )
+ : QWidget( parent )
+{
+ QGridLayout *layout = new QGridLayout( this, 3, 2, 11, 3);
+
+ mInterface = new QSpinBox( this );
+ layout->addWidget( mInterface, 0, 1 );
+
+ QLabel *label = new QLabel( i18n( "USB Interface:" ), this );
+ label->setBuddy( mInterface );
+ layout->addWidget( label, 0, 0 );
+
+ layout->setRowStretch( 2, 1 );
+}
+
+void UsbWidget::setInterface( int interface )
+{
+ mInterface->setValue( interface );
+}
+
+int UsbWidget::interface() const
+{
+ return mInterface->value();
+}
+
+#include "connectionwidgets.moc"
diff --git a/kitchensync/src/connectionwidgets.h b/kitchensync/src/connectionwidgets.h
new file mode 100644
index 000000000..cb7dfb428
--- /dev/null
+++ b/kitchensync/src/connectionwidgets.h
@@ -0,0 +1,99 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+ Copyright (c) 2006 Daniel Gollub <dgollub@suse.de>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#ifndef CONNECTIONWIDGETS_H
+#define CONNECTIONWIDGETS_H
+
+#include <qdom.h>
+
+#include "configgui.h"
+
+class QCheckBox;
+class QLabel;
+class QPushButton;
+class QSpinBox;
+
+class KComboBox;
+class KLineEdit;
+
+class BluetoothWidget : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ BluetoothWidget( QWidget *parent );
+
+ void hideChannel();
+ void showChannel();
+
+ void setAddress( const QString address );
+ void setChannel( const QString channel );
+ QString address() const;
+ QString channel() const;
+
+ private:
+ KLineEdit *mAddress;
+ KLineEdit *mChannel;
+ QLabel *mChannelLabel;
+};
+
+class IRWidget : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ IRWidget( QWidget *parent );
+
+ void load( const QDomElement& );
+ void save( QDomDocument&, QDomElement& );
+
+ private:
+ KLineEdit *mDevice;
+ KLineEdit *mSerialNumber;
+};
+
+class CableWidget : public QWidget
+{
+ public:
+ CableWidget( QWidget *parent );
+
+ void load( const QDomElement& );
+ void save( QDomDocument&, QDomElement& );
+
+ private:
+ KComboBox *mManufacturer;
+ KComboBox *mDevice;
+};
+
+class UsbWidget : public QWidget
+{
+ public:
+ UsbWidget( QWidget *parent );
+
+ int interface() const;
+ void setInterface( int interface );
+
+ private:
+ QSpinBox *mInterface;
+};
+
+#endif // CONNECTIONWIDGETS_H
diff --git a/kitchensync/src/genericdiffalgo.cpp b/kitchensync/src/genericdiffalgo.cpp
new file mode 100644
index 000000000..9c03360e9
--- /dev/null
+++ b/kitchensync/src/genericdiffalgo.cpp
@@ -0,0 +1,70 @@
+/*
+ This file is part of libkdepim.
+
+ Copyright (c) 2004 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qstringlist.h>
+
+#include <klocale.h>
+
+#include "genericdiffalgo.h"
+
+using namespace KSync;
+
+#define MAX( a, b ) ( a > b ? a : b )
+
+#ifndef KDE_USE_FINAL
+// With --enable-final, we get the (identical) compareString from
+// addresseediffalgo.cpp
+static bool compareString( const QString &left, const QString &right )
+{
+ if ( left.isEmpty() && right.isEmpty() )
+ return true;
+ else
+ return left == right;
+}
+#endif
+
+GenericDiffAlgo::GenericDiffAlgo( const QString &leftData, const QString &rightData )
+ : mLeftData( leftData ), mRightData( rightData )
+{
+}
+
+void GenericDiffAlgo::run()
+{
+ begin();
+
+ QStringList leftList = QStringList::split( '\n', mLeftData, true );
+ QStringList rightList = QStringList::split( '\n', mRightData, true );
+
+ uint lines = MAX( leftList.count(), rightList.count() );
+ for ( uint i = 0; i < lines; ++i ) {
+ if ( i < leftList.count() && i < rightList.count() ) {
+ if ( !compareString( leftList[ i ], rightList[ i ] ) )
+ conflictField( i18n( "Line %1" ).arg( i ), leftList[ i ], rightList[ i ] );
+ } else if ( i < leftList.count() && i >= rightList.count() ) {
+ additionalLeftField( i18n( "Line %1" ).arg( i ), leftList[ i ] );
+ } else if ( i >= leftList.count() && i < rightList.count() ) {
+ additionalRightField( i18n( "Line %1" ).arg( i ), rightList[ i ] );
+ }
+ }
+
+ end();
+}
+
diff --git a/kitchensync/src/genericdiffalgo.h b/kitchensync/src/genericdiffalgo.h
new file mode 100644
index 000000000..64f4a4404
--- /dev/null
+++ b/kitchensync/src/genericdiffalgo.h
@@ -0,0 +1,45 @@
+/*
+ This file is part of libkdepim.
+
+ Copyright (c) 2004 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KSYNC_GENERICDIFFALGO_H
+#define KSYNC_GENERICDIFFALGO_H
+
+#include <libkdepim/diffalgo.h>
+
+using namespace KPIM;
+
+namespace KSync {
+
+class GenericDiffAlgo : public DiffAlgo
+{
+ public:
+ GenericDiffAlgo( const QString &left, const QString &right );
+
+ void run();
+
+ private:
+ QString mLeftData;
+ QString mRightData;
+};
+
+}
+
+#endif
diff --git a/kitchensync/src/groupconfig.cpp b/kitchensync/src/groupconfig.cpp
new file mode 100644
index 000000000..2ad4af631
--- /dev/null
+++ b/kitchensync/src/groupconfig.cpp
@@ -0,0 +1,179 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include "groupconfig.h"
+
+#include "groupconfigcommon.h"
+#include "memberconfig.h"
+#include "memberinfo.h"
+#include "pluginpicker.h"
+#include "syncprocess.h"
+#include "syncprocessmanager.h"
+
+#include <libqopensync/group.h>
+#include <libqopensync/plugin.h>
+
+#include <kdialog.h>
+#include <kiconloader.h>
+#include <kjanuswidget.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+
+GroupConfig::GroupConfig( QWidget *parent )
+ : QWidget( parent )
+{
+ QBoxLayout *topLayout = new QVBoxLayout( this );
+ topLayout->setSpacing( KDialog::spacingHint() );
+
+ QFrame *titleFrame = new QFrame( this );
+ topLayout->addWidget( titleFrame );
+
+ titleFrame->setPaletteForegroundColor( colorGroup().light() );
+ titleFrame->setPaletteBackgroundColor( colorGroup().mid() );
+
+ QBoxLayout *nameLayout = new QHBoxLayout( titleFrame );
+ nameLayout->setMargin( 4 );
+
+ QPixmap icon = KGlobal::iconLoader()->loadIcon( "kontact_summary",
+ KIcon::Desktop );
+
+ QLabel *iconLabel = new QLabel( titleFrame );
+ iconLabel->setPixmap( icon );
+ nameLayout->addWidget( iconLabel );
+
+ nameLayout->addSpacing( 8 );
+
+ QLabel *label = new QLabel( i18n("Group:"), titleFrame );
+ QFont font = label->font();
+ font.setBold( true );
+ font.setPointSize( font.pointSize() + 2 );
+ label->setFont( font );
+ nameLayout->addWidget( label );
+
+ mNameLabel = new QLabel( titleFrame );
+ font = mNameLabel->font();
+ font.setBold( true );
+ font.setPointSize( font.pointSize() + 2 );
+ mNameLabel->setFont( font );
+ nameLayout->addWidget( mNameLabel );
+
+ nameLayout->addStretch( 1 );
+
+ mMemberView = new KJanusWidget( this, 0, KJanusWidget::IconList );
+ topLayout->addWidget( mMemberView );
+
+ QBoxLayout *buttonLayout = new QHBoxLayout( topLayout );
+
+ QPushButton *addButton = new QPushButton( i18n("Add Member..."), this );
+ connect( addButton, SIGNAL( clicked() ), SLOT( addMember() ) );
+ buttonLayout->addWidget( addButton );
+
+ buttonLayout->addStretch( 1 );
+
+ icon = KGlobal::iconLoader()->loadIcon( "bookmark", KIcon::Desktop );
+ QFrame *page = mMemberView->addPage( i18n("Group"),
+ i18n("General Group Settings"), icon );
+ QBoxLayout *pageLayout = new QVBoxLayout( page );
+
+ mCommonConfig = new GroupConfigCommon( page );
+ pageLayout->addWidget( mCommonConfig );
+}
+
+void GroupConfig::setSyncProcess( SyncProcess *process )
+{
+ mProcess = process;
+
+ mNameLabel->setText( mProcess->group().name() );
+ mCommonConfig->setSyncProcess( mProcess );
+
+ updateMembers();
+}
+
+void GroupConfig::updateMembers()
+{
+ QValueList<MemberConfig *>::ConstIterator memberIt;
+ for ( memberIt = mMemberConfigs.begin(); memberIt != mMemberConfigs.end(); ++memberIt )
+ (*memberIt)->saveData();
+
+ QValueList<QFrame *>::ConstIterator it2;
+ for ( it2 = mConfigPages.begin(); it2 != mConfigPages.end(); ++it2 ) {
+ mMemberView->removePage( *it2 );
+ delete *it2;
+ }
+ mConfigPages.clear();
+ mMemberConfigs.clear();
+
+ QSync::Group group = mProcess->group();
+ QSync::Group::Iterator it( group.begin() );
+ for ( ; it != group.end(); ++it ) {
+ QSync::Member member = *it;
+ MemberInfo mi( member );
+ QFrame *page = mMemberView->addPage( mi.name(),
+ QString( "%1 (%2)" ).arg( mi.name() ).arg(member.pluginName()), mi.desktopIcon() );
+
+ QBoxLayout *pageLayout = new QVBoxLayout( page );
+ mConfigPages.append( page );
+
+ MemberConfig *memberConfig = new MemberConfig( page, member );
+ mMemberConfigs.append( memberConfig );
+ pageLayout->addWidget( memberConfig );
+
+ memberConfig->loadData();
+ }
+}
+
+void GroupConfig::saveConfig()
+{
+ mProcess->group().save();
+
+ QValueList<MemberConfig *>::ConstIterator it;
+ for ( it = mMemberConfigs.begin(); it != mMemberConfigs.end(); ++it )
+ (*it)->saveData();
+
+ mCommonConfig->save();
+
+ mProcess->reinitEngine();
+}
+
+void GroupConfig::addMember()
+{
+ QSync::Plugin plugin = PluginPickerDialog::getPlugin( this );
+
+ if ( plugin.isValid() ) {
+ QSync::Result result = SyncProcessManager::self()->addMember( mProcess, plugin );
+ if ( result.isError() ) {
+ KMessageBox::error( this, i18n("Error adding member %1\n%2\nType: %3")
+ .arg( plugin.name() ).arg( result.message() ).arg( result.type() ) );
+ } else {
+ updateMembers();
+
+ // select last (added) page
+ int index = mMemberView->pageIndex( mConfigPages.last() );
+ mMemberView->showPage( index );
+ }
+ }
+}
+
+#include "groupconfig.moc"
diff --git a/kitchensync/src/groupconfig.h b/kitchensync/src/groupconfig.h
new file mode 100644
index 000000000..d46d64575
--- /dev/null
+++ b/kitchensync/src/groupconfig.h
@@ -0,0 +1,62 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+#ifndef GROUPCONFIG_H
+#define GROUPCONFIG_H
+
+#include <qwidget.h>
+#include <qvaluelist.h>
+
+class QFrame;
+class QLabel;
+class KJanusWidget;
+
+class GroupConfigCommon;
+class MemberConfig;
+class SyncProcess;
+
+class GroupConfig : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ GroupConfig( QWidget *parent );
+
+ void setSyncProcess( SyncProcess *process );
+
+ void updateMembers();
+
+ void saveConfig();
+
+ protected slots:
+ void addMember();
+
+ private:
+ QLabel *mNameLabel;
+
+ KJanusWidget *mMemberView;
+
+ SyncProcess *mProcess;
+
+ GroupConfigCommon *mCommonConfig;
+ QValueList<MemberConfig *> mMemberConfigs;
+ QValueList<QFrame *> mConfigPages;
+};
+
+#endif
diff --git a/kitchensync/src/groupconfigcommon.cpp b/kitchensync/src/groupconfigcommon.cpp
new file mode 100644
index 000000000..d5b0bd1c1
--- /dev/null
+++ b/kitchensync/src/groupconfigcommon.cpp
@@ -0,0 +1,158 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+
+#include <kdialog.h>
+#include <klineedit.h>
+#include <klocale.h>
+#include <kdebug.h>
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qcheckbox.h>
+
+#include <libqopensync/group.h>
+#include <libqopensync/conversion.h>
+#include <libqopensync/environment.h>
+
+#include "syncprocess.h"
+#include "syncprocessmanager.h"
+
+#include "groupconfigcommon.h"
+
+ObjectTypeSelector::ObjectTypeSelector( QWidget *parent )
+ : QWidget( parent )
+{
+ QGridLayout *layout = new QGridLayout( this );
+ layout->setMargin( 0 );
+
+ const QSync::Conversion conversion = SyncProcessManager::self()->environment()->conversion();
+
+ QMap<QString, QString> objectTypeMap;
+ objectTypeMap.insert( "contact", i18n( "Contacts" ) );
+ objectTypeMap.insert( "event", i18n( "Events" ) );
+ objectTypeMap.insert( "todo", i18n( "To-dos" ) );
+ objectTypeMap.insert( "note", i18n( "Notes" ) );
+
+ QStringList objectTypes = conversion.objectTypes();
+
+ // reorder the entries so that contact and event are the first one
+ qHeapSort( objectTypes );
+
+ QStringList reoderedObjectTypes, stack;
+ for ( uint i = 0; i < objectTypes.count(); ++i ) {
+ if ( objectTypes[ i ] == "contact" || objectTypes[ i ] == "event" )
+ reoderedObjectTypes.append( objectTypes[ i ] );
+ else
+ stack.append( objectTypes[ i ] );
+ }
+ reoderedObjectTypes += stack;
+
+ QStringList::ConstIterator it;
+
+ int row = 0;
+ int col = 0;
+ for( it = reoderedObjectTypes.begin(); it != reoderedObjectTypes.end(); ++it ) {
+ QString objectType = *it;
+
+ // Don't display object type "data". Object type "data" is a kind of wildcard - so don't filter *
+ if ( objectType == "data" )
+ continue;
+
+ QCheckBox *objectCheckBox = new QCheckBox( objectTypeMap[ objectType ], this );
+ layout->addWidget( objectCheckBox, row, col );
+ mObjectTypeChecks.insert( objectType, objectCheckBox );
+
+ col++;
+ if ( (row == 0 && col == 2) || col == 3 ) {
+ col = 0;
+ row++;
+ }
+ }
+}
+
+void ObjectTypeSelector::load( const QSync::Group &group )
+{
+ const QSync::GroupConfig config = group.config();
+
+ const QStringList objectTypes = config.activeObjectTypes();
+
+ // Enable everything on the inital load
+ bool initialLoad = false;
+ if ( objectTypes.isEmpty() )
+ initialLoad = true;
+
+ QMap<QString, QCheckBox*>::ConstIterator it;
+ for( it = mObjectTypeChecks.begin(); it != mObjectTypeChecks.end(); ++it ) {
+ QCheckBox *check = it.data();
+ check->setChecked( objectTypes.contains( it.key() ) || initialLoad );
+ }
+}
+
+void ObjectTypeSelector::save( QSync::Group group )
+{
+ QStringList objectTypes;
+
+ QMap<QString,QCheckBox *>::ConstIterator it;
+ for( it = mObjectTypeChecks.begin(); it != mObjectTypeChecks.end(); ++it ) {
+ QCheckBox *check = it.data();
+ if ( check->isChecked() )
+ objectTypes.append( it.key() );
+ }
+
+ // Always add object type "data"
+ objectTypes.append( "data" );
+
+ QSync::GroupConfig config = group.config();
+ config.setActiveObjectTypes( objectTypes );
+}
+
+GroupConfigCommon::GroupConfigCommon( QWidget *parent )
+ : QWidget( parent )
+{
+ QGridLayout *layout = new QGridLayout( this, 2, 2, KDialog::marginHint(), KDialog::spacingHint() );
+
+ layout->addWidget( new QLabel( i18n( "Name:" ), this ), 0, 0 );
+
+ mGroupName = new KLineEdit( this );
+ layout->addWidget( mGroupName, 0, 1 );
+
+ layout->addWidget( new QLabel( i18n( "Object Types to be Synchronized:"), this ), 1, 0, Qt::AlignTop );
+
+ mObjectTypeSelector = new ObjectTypeSelector( this );
+ layout->addWidget( mObjectTypeSelector, 1, 1 );
+
+ layout->setRowStretch( 2, 1 );
+}
+
+void GroupConfigCommon::setSyncProcess( SyncProcess *syncProcess )
+{
+ mSyncProcess = syncProcess;
+
+ mGroupName->setText( mSyncProcess->group().name() );
+ mObjectTypeSelector->load( mSyncProcess->group() );
+}
+
+void GroupConfigCommon::save()
+{
+ mSyncProcess->group().setName( mGroupName->text() );
+ mObjectTypeSelector->save( mSyncProcess->group() );
+}
diff --git a/kitchensync/src/groupconfigcommon.h b/kitchensync/src/groupconfigcommon.h
new file mode 100644
index 000000000..b28499aa0
--- /dev/null
+++ b/kitchensync/src/groupconfigcommon.h
@@ -0,0 +1,60 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+#ifndef GROUPCONFIGCOMMON_H
+#define GROUPCONFIGCOMMON_H
+
+#include <qwidget.h>
+#include <qmap.h>
+
+#include <libqopensync/group.h>
+
+class KLineEdit;
+class SyncProcess;
+class QCheckBox;
+
+class ObjectTypeSelector : public QWidget
+{
+ public:
+ ObjectTypeSelector( QWidget *parent );
+
+ void load( const QSync::Group &group );
+ void save( QSync::Group group );
+
+ private:
+ QMap<QString,QCheckBox *> mObjectTypeChecks;
+};
+
+class GroupConfigCommon : public QWidget
+{
+ public:
+ GroupConfigCommon( QWidget *parent );
+
+ void setSyncProcess( SyncProcess *syncProcess );
+ void save();
+
+ private:
+ KLineEdit *mGroupName;
+ ObjectTypeSelector *mObjectTypeSelector;
+
+ SyncProcess *mSyncProcess;
+};
+
+#endif
diff --git a/kitchensync/src/groupconfigdialog.cpp b/kitchensync/src/groupconfigdialog.cpp
new file mode 100644
index 000000000..868915da2
--- /dev/null
+++ b/kitchensync/src/groupconfigdialog.cpp
@@ -0,0 +1,57 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include "groupconfigdialog.h"
+
+#include "groupconfig.h"
+
+#include <klocale.h>
+
+#include <qlayout.h>
+
+GroupConfigDialog::GroupConfigDialog( QWidget *parent, SyncProcess *process )
+ : KDialogBase( parent, 0, true, i18n("Configure Synchronization Group"),
+ Ok )
+{
+ QFrame *topFrame = makeMainWidget();
+
+ QBoxLayout *topLayout = new QVBoxLayout( topFrame );
+
+ mConfigWidget = new GroupConfig( topFrame );
+ topLayout->addWidget( mConfigWidget );
+
+ mConfigWidget->setSyncProcess( process );
+
+ setInitialSize( configDialogSize( "size_groupconfigdialog" ) );
+}
+
+GroupConfigDialog::~GroupConfigDialog()
+{
+ saveDialogSize( "size_groupconfigdialog" );
+}
+
+void GroupConfigDialog::slotOk()
+{
+ mConfigWidget->saveConfig();
+
+ accept();
+}
+
+#include "groupconfigdialog.moc"
diff --git a/kitchensync/src/groupconfigdialog.h b/kitchensync/src/groupconfigdialog.h
new file mode 100644
index 000000000..10000b960
--- /dev/null
+++ b/kitchensync/src/groupconfigdialog.h
@@ -0,0 +1,43 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+#ifndef GROUPCONFIGDIALOG_H
+#define GROUPCONFIGDIALOG_H
+
+#include <kdialogbase.h>
+
+class GroupConfig;
+class SyncProcess;
+
+class GroupConfigDialog : public KDialogBase
+{
+ Q_OBJECT
+
+ public:
+ GroupConfigDialog( QWidget *parent, SyncProcess * );
+ ~GroupConfigDialog();
+
+ protected slots:
+ void slotOk();
+
+ private:
+ GroupConfig *mConfigWidget;
+};
+
+#endif
diff --git a/kitchensync/src/groupitem.cpp b/kitchensync/src/groupitem.cpp
new file mode 100644
index 000000000..bd5a8821d
--- /dev/null
+++ b/kitchensync/src/groupitem.cpp
@@ -0,0 +1,389 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <kapplication.h>
+#include <kdialog.h>
+#include <kglobal.h>
+#include <kglobalsettings.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kpassivepopup.h>
+#include <kurllabel.h>
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpixmap.h>
+#include <qprogressbar.h>
+#include <qvbox.h>
+
+#include "memberinfo.h"
+#include "multiconflictdialog.h"
+#include "singleconflictdialog.h"
+#include "syncprocessmanager.h"
+
+#include "groupitem.h"
+
+GroupItem::GroupItem( KWidgetList *parent, SyncProcess *process )
+ : KWidgetListItem( parent ), mSyncProcess( process ),
+ mCallbackHandler( new QSync::CallbackHandler ),
+ mProcessedItems( 0 ), mMaxProcessedItems( 0 ),
+ mSynchronizing( false )
+{
+ QFont boldFont;
+ boldFont.setBold( true );
+ boldFont.setPointSize( boldFont.pointSize() + 2 );
+
+ QGridLayout *layout = new QGridLayout( this, 4, 4, KDialog::marginHint(), KDialog::spacingHint() );
+
+ mBox = new QVBox( this );
+ mBox->setMargin( 5 );
+ mProgressBar = new QProgressBar( this );
+ mProgressBar->setTotalSteps( 100 );
+
+ mTime = new QLabel( this );
+ mSyncAction = new KURLLabel( "exec:/sync", i18n( "Synchronize Now" ), this );
+ mConfigureAction = new KURLLabel( "exec:/config", i18n( "Configure" ), this );
+
+ // header
+ QHBox* hbox = new QHBox( this );
+ hbox->setMargin( 2 );
+
+ static QPixmap icon;
+ if ( icon.isNull() )
+ icon = KGlobal::iconLoader()->loadIcon( "kontact_summary", KIcon::Desktop );
+
+ mIcon = new QLabel( hbox );
+ mIcon->setPixmap( icon );
+ mIcon->setFixedSize( mIcon->sizeHint() );
+ mIcon->setPaletteBackgroundColor( colorGroup().mid() );
+
+ mGroupName = new QLabel( hbox );
+ mGroupName->setAlignment( AlignLeft | AlignVCenter );
+ mGroupName->setIndent( KDialog::spacingHint() );
+ mGroupName->setFont( boldFont );
+ mGroupName->setPaletteForegroundColor( colorGroup().light() );
+ mGroupName->setPaletteBackgroundColor( colorGroup().mid() );
+
+ mStatus = new QLabel( hbox );
+ mStatus->setAlignment( Qt::AlignRight );
+ mStatus->setAlignment( AlignRight | AlignVCenter );
+ mStatus->setIndent( KDialog::spacingHint() );
+ mStatus->setFont( boldFont );
+ mStatus->setPaletteForegroundColor( colorGroup().light() );
+ mStatus->setPaletteBackgroundColor( colorGroup().mid() );
+ mStatus->setText( i18n( "Ready" ) );
+
+ hbox->setPaletteBackgroundColor( colorGroup().mid() );
+ hbox->setMaximumHeight( hbox->minimumSizeHint().height() );
+
+ layout->addMultiCellWidget( hbox, 0, 0, 0, 3 );
+ layout->addMultiCellWidget( mBox, 1, 1, 0, 3 );
+ layout->addWidget( mTime, 2, 0 );
+ layout->addWidget( mSyncAction, 2, 1 );
+ layout->addWidget( mConfigureAction, 2, 2 );
+ layout->addWidget( mProgressBar, 2, 3 );
+ layout->setColStretch( 0, 1 );
+ layout->setRowStretch( 3, 1 );
+
+ setPaletteBackgroundColor( kapp->palette().active().base() );
+
+ connect( mCallbackHandler, SIGNAL( conflict( QSync::SyncMapping ) ),
+ this, SLOT( conflict( QSync::SyncMapping ) ) );
+ connect( mCallbackHandler, SIGNAL( change( const QSync::SyncChangeUpdate& ) ),
+ this, SLOT( change( const QSync::SyncChangeUpdate& ) ) );
+ connect( mCallbackHandler, SIGNAL( mapping( const QSync::SyncMappingUpdate& ) ),
+ this, SLOT( mapping( const QSync::SyncMappingUpdate& ) ) );
+ connect( mCallbackHandler, SIGNAL( engine( const QSync::SyncEngineUpdate& ) ),
+ this, SLOT( engine( const QSync::SyncEngineUpdate& ) ) );
+ connect( mCallbackHandler, SIGNAL( member( const QSync::SyncMemberUpdate& ) ),
+ this, SLOT( member( const QSync::SyncMemberUpdate& ) ) );
+ connect( mSyncAction, SIGNAL( leftClickedURL() ),
+ this, SLOT( synchronize() ) );
+ connect( mConfigureAction, SIGNAL( leftClickedURL() ),
+ this, SLOT( configure() ) );
+ connect( mSyncProcess, SIGNAL( engineChanged( QSync::Engine* ) ),
+ this, SLOT( engineChanged( QSync::Engine* ) ) );
+
+ mCallbackHandler->setEngine( mSyncProcess->engine() );
+
+ setSelectionForegroundColor( KGlobalSettings::textColor() );
+ setSelectionBackgroundColor( KGlobalSettings::alternateBackgroundColor() );
+
+ update();
+}
+
+GroupItem::~GroupItem()
+{
+ delete mCallbackHandler;
+ mCallbackHandler = 0;
+}
+
+void GroupItem::update()
+{
+ clear();
+
+ mGroupName->setText( i18n( "Group: %1" ).arg( mSyncProcess->group().name() ) );
+
+ QDateTime dateTime = mSyncProcess->group().lastSynchronization();
+ if ( dateTime.isValid() )
+ mTime->setText( i18n( "Last synchronized on: %1" ).arg( KGlobal::locale()->formatDateTime( dateTime ) ) );
+ else
+ mTime->setText( i18n( "Not synchronized yet" ) );
+
+ mProgressBar->reset();
+ mProgressBar->hide();
+
+ QSync::Group group = mSyncProcess->group();
+ QSync::Group::Iterator memberIt( group.begin() );
+ QSync::Group::Iterator memberEndIt( group.end() );
+
+ for ( ; memberIt != memberEndIt; ++memberIt ) {
+ MemberItem *item = new MemberItem( mBox, mSyncProcess, *memberIt );
+ item->show();
+ item->setStatusMessage( i18n( "Ready" ) );
+ mMemberItems.append( item );
+ }
+}
+
+void GroupItem::clear()
+{
+ mGroupName->setText( QString() );
+
+ QValueList<MemberItem*>::Iterator it;
+ for ( it = mMemberItems.begin(); it != mMemberItems.end(); ++it )
+ delete *it;
+
+ mMemberItems.clear();
+}
+
+void GroupItem::conflict( QSync::SyncMapping mapping )
+{
+ if ( mapping.changesCount() == 2 ) {
+ SingleConflictDialog dlg( mapping, this );
+ dlg.exec();
+ } else {
+ MultiConflictDialog dlg( mapping, this );
+ dlg.exec();
+ }
+}
+
+void GroupItem::change( const QSync::SyncChangeUpdate &update )
+{
+ switch ( update.type() ) {
+ case QSync::SyncChangeUpdate::Received:
+ mProcessedItems++;
+ mStatus->setText( i18n( "%1 entries read" ).arg( mProcessedItems ) );
+ break;
+ case QSync::SyncChangeUpdate::ReceivedInfo:
+ mStatus->setText( i18n( "Receive information" ) );
+ break;
+ case QSync::SyncChangeUpdate::Sent:
+ mProcessedItems--;
+ mStatus->setText( i18n( "%1 entries written" ).arg( mMaxProcessedItems - mProcessedItems ) );
+
+ mProgressBar->show();
+
+ {
+ int progress = 100;
+ if ( mMaxProcessedItems != 0 )
+ progress = (mProcessedItems * 100) / mMaxProcessedItems;
+
+ if ( progress < 0 )
+ progress = 0;
+
+ mProgressBar->setProgress( 100 - progress );
+ }
+ break;
+ case QSync::SyncChangeUpdate::WriteError:
+ mStatus->setText( i18n( "Error" ) );
+ KPassivePopup::message( update.result().message(), this );
+ break;
+ case QSync::SyncChangeUpdate::ReceiveError:
+ mStatus->setText( i18n( "Error" ) );
+ KPassivePopup::message( update.result().message(), this );
+ break;
+ default:
+ mStatus->setText( QString() );
+ break;
+ }
+}
+
+void GroupItem::mapping( const QSync::SyncMappingUpdate& )
+{
+}
+
+void GroupItem::engine( const QSync::SyncEngineUpdate &update )
+{
+ switch ( update.type() ) {
+ case QSync::SyncEngineUpdate::EndPhaseConnected:
+ mStatus->setText( i18n( "Connected" ) );
+ mProgressBar->setProgress( 0 );
+ mSynchronizing = true;
+ mSyncAction->setText( "Abort Synchronization" );
+ break;
+ case QSync::SyncEngineUpdate::EndPhaseRead:
+ mStatus->setText( i18n( "Data read" ) );
+ break;
+ case QSync::SyncEngineUpdate::EndPhaseWrite:
+ mStatus->setText( i18n( "Data written" ) );
+ mProgressBar->setProgress( 100 );
+ mProcessedItems = mMaxProcessedItems = 0;
+ break;
+ case QSync::SyncEngineUpdate::EndPhaseDisconnected:
+ mStatus->setText( i18n( "Disconnected" ) );
+ break;
+ case QSync::SyncEngineUpdate::Error:
+ mStatus->setText( i18n( "Synchronization failed" ) );
+ KPassivePopup::message( update.result().message(), this );
+ this->update();
+
+ mSynchronizing = false;
+ mSyncAction->setText( i18n( "Synchronize Now" ) );
+ break;
+ case QSync::SyncEngineUpdate::SyncSuccessfull:
+ mStatus->setText( i18n( "Successfully synchronized" ) );
+ mSyncProcess->group().setLastSynchronization( QDateTime::currentDateTime() );
+ mSyncProcess->group().save();
+ this->update();
+
+ mSynchronizing = false;
+ mSyncAction->setText( i18n( "Synchronize Now" ) );
+ break;
+ case QSync::SyncEngineUpdate::PrevUnclean:
+ mStatus->setText( i18n( "Previous synchronization failed" ) );
+ break;
+ case QSync::SyncEngineUpdate::EndConflicts:
+ mStatus->setText( i18n( "Conflicts solved" ) );
+ mMaxProcessedItems = mProcessedItems;
+ break;
+ default:
+ mStatus->setText( QString() );
+ break;
+ }
+}
+
+void GroupItem::member( const QSync::SyncMemberUpdate &update )
+{
+ QValueList<MemberItem*>::Iterator it;
+ for ( it = mMemberItems.begin(); it != mMemberItems.end(); ++it ) {
+ if ( (*it)->member() == update.member() ) {
+ switch ( update.type() ) {
+ case QSync::SyncMemberUpdate::Connected:
+ (*it)->setStatusMessage( i18n( "Connected" ) );
+ break;
+ case QSync::SyncMemberUpdate::SentChanges:
+ (*it)->setStatusMessage( i18n( "Changes read" ) );
+ break;
+ case QSync::SyncMemberUpdate::CommittedAll:
+ (*it)->setStatusMessage( i18n( "Changes written" ) );
+ break;
+ case QSync::SyncMemberUpdate::Disconnected:
+ (*it)->setStatusMessage( i18n( "Disconnected" ) );
+ break;
+ case QSync::SyncMemberUpdate::ConnectError:
+ (*it)->setStatusMessage( i18n( "Error: %1" ).arg( update.result().message() ) );
+ break;
+ case QSync::SyncMemberUpdate::GetChangesError:
+ (*it)->setStatusMessage( i18n( "Error: %1" ).arg( update.result().message() ) );
+ break;
+ case QSync::SyncMemberUpdate::CommittedAllError:
+ (*it)->setStatusMessage( i18n( "Error: %1" ).arg( update.result().message() ) );
+ break;
+ case QSync::SyncMemberUpdate::SyncDoneError:
+ (*it)->setStatusMessage( i18n( "Error: %1" ).arg( update.result().message() ) );
+ break;
+ case QSync::SyncMemberUpdate::DisconnectedError:
+ (*it)->setStatusMessage( i18n( "Error: %1" ).arg( update.result().message() ) );
+ break;
+ default:
+ break;
+ }
+
+ return;
+ }
+ }
+}
+
+void GroupItem::synchronize()
+{
+ if ( !mSynchronizing )
+ emit synchronizeGroup( mSyncProcess );
+ else
+ emit abortSynchronizeGroup( mSyncProcess );
+}
+
+void GroupItem::configure()
+{
+ emit configureGroup( mSyncProcess );
+
+ this->update();
+}
+
+void GroupItem::engineChanged( QSync::Engine *engine )
+{
+ Q_ASSERT( engine );
+
+ mCallbackHandler->setEngine( engine );
+
+ this->update();
+}
+
+MemberItem::MemberItem( QWidget *parent, SyncProcess *process,
+ const QSync::Member &member )
+ : QWidget( parent ), mSyncProcess( process ), mMember( member )
+{
+ QFont boldFont;
+ boldFont.setBold( true );
+
+ MemberInfo mi( member );
+
+ QPixmap icon = mi.smallIcon();
+
+ QSync::Plugin plugin = member.plugin();
+
+ QVBoxLayout *layout = new QVBoxLayout( this );
+
+ QHBox* box = new QHBox( this );
+ box->setMargin( 5 );
+ box->setSpacing( 6 );
+ layout->addWidget( box );
+
+ mIcon = new QLabel( box );
+ mIcon->setPixmap( icon );
+ mIcon->setAlignment( Qt::AlignTop );
+ mIcon->setFixedWidth( mIcon->sizeHint().width() );
+
+ QVBox *nameBox = new QVBox( box );
+ mMemberName = new QLabel( nameBox );
+ mMemberName->setFont( boldFont );
+ mDescription = new QLabel( nameBox );
+
+ mStatus = new QLabel( box );
+
+ mMemberName->setText( member.name() );
+ mDescription->setText( plugin.longName() );
+}
+
+void MemberItem::setStatusMessage( const QString &msg )
+{
+ mStatus->setText( msg );
+}
+
+#include "groupitem.moc"
diff --git a/kitchensync/src/groupitem.h b/kitchensync/src/groupitem.h
new file mode 100644
index 000000000..a18ca1d83
--- /dev/null
+++ b/kitchensync/src/groupitem.h
@@ -0,0 +1,111 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef GROUPITEM_H
+#define GROUPITEM_H
+
+#include "syncprocess.h"
+
+#include <libqopensync/callbackhandler.h>
+
+#include <kwidgetlist.h>
+
+namespace QSync {
+class Engine;
+}
+
+class MemberItem;
+class KURLLabel;
+class QLabel;
+class QProgressBar;
+class QVBox;
+
+class GroupItem : public KWidgetListItem
+{
+ Q_OBJECT
+
+ public:
+ GroupItem( KWidgetList*, SyncProcess *syncProcess );
+ ~GroupItem();
+
+ SyncProcess *syncProcess() const { return mSyncProcess; }
+
+ void update();
+
+ void clear();
+
+ signals:
+ void synchronizeGroup( SyncProcess *syncProcess );
+ void abortSynchronizeGroup( SyncProcess *syncProcess );
+ void configureGroup( SyncProcess *syncProcess );
+
+ protected slots:
+ void conflict( QSync::SyncMapping );
+ void change( const QSync::SyncChangeUpdate& );
+ void mapping( const QSync::SyncMappingUpdate& );
+ void engine( const QSync::SyncEngineUpdate& );
+ void member( const QSync::SyncMemberUpdate& );
+
+ void synchronize();
+ void configure();
+
+ void engineChanged( QSync::Engine *engine );
+
+ private:
+ SyncProcess *mSyncProcess;
+ QSync::CallbackHandler *mCallbackHandler;
+ QValueList<MemberItem*> mMemberItems;
+
+ QLabel *mIcon;
+ QLabel *mGroupName;
+ QLabel *mStatus;
+ QLabel *mTime;
+ KURLLabel *mSyncAction;
+ KURLLabel *mConfigureAction;
+ QVBox *mBox;
+ QProgressBar *mProgressBar;
+
+ int mProcessedItems;
+ int mMaxProcessedItems;
+ bool mSynchronizing;
+};
+
+class MemberItem : public QWidget
+{
+ public:
+ MemberItem( QWidget *parent, SyncProcess *syncProcess,
+ const QSync::Member &member );
+
+ SyncProcess* syncProcess() const { return mSyncProcess; }
+ QSync::Member member() const { return mMember; }
+
+ void setStatusMessage( const QString &msg );
+
+ private:
+ SyncProcess *mSyncProcess;
+ QSync::Member mMember;
+
+ QLabel *mIcon;
+ QLabel *mMemberName;
+ QLabel *mDescription;
+ QLabel *mStatus;
+};
+
+#endif
diff --git a/kitchensync/src/groupview.cpp b/kitchensync/src/groupview.cpp
new file mode 100644
index 000000000..b0c061e84
--- /dev/null
+++ b/kitchensync/src/groupview.cpp
@@ -0,0 +1,99 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <qlayout.h>
+
+#include "aboutpage.h"
+#include "groupitem.h"
+#include "syncprocessmanager.h"
+
+#include "groupview.h"
+
+GroupView::GroupView( QWidget *parent )
+ : QWidget( parent ), mAboutPage( 0 )
+{
+ mLayout = new QVBoxLayout( this );
+
+ mWidgetList = new KWidgetList( this );
+
+ mLayout->addWidget( mWidgetList );
+}
+
+SyncProcess* GroupView::selectedSyncProcess() const
+{
+ GroupItem *item = static_cast<GroupItem*>( mWidgetList->selectedItem() );
+ if ( item )
+ return item->syncProcess();
+ else
+ return 0;
+}
+
+void GroupView::clear()
+{
+ mWidgetList->clear();
+}
+
+void GroupView::updateView()
+{
+ clear();
+
+ if ( SyncProcessManager::self()->count() == 0 ) {
+ mWidgetList->hide();
+
+ if ( !mAboutPage ) {
+ mAboutPage = new AboutPage( this );
+ mLayout->addWidget( mAboutPage );
+
+ connect( mAboutPage, SIGNAL( addGroup() ), SIGNAL( addGroup() ) );
+ }
+
+ mAboutPage->show();
+
+ } else {
+ if ( mAboutPage )
+ mAboutPage->hide();
+ mWidgetList->show();
+ }
+
+ for ( int i = 0; i < SyncProcessManager::self()->count(); ++i ) {
+ SyncProcess *process = SyncProcessManager::self()->at( i );
+
+ GroupItem *item = new GroupItem( mWidgetList, process );
+ connect( item, SIGNAL( synchronizeGroup( SyncProcess* ) ),
+ SIGNAL( synchronizeGroup( SyncProcess* ) ) );
+ connect( item, SIGNAL( abortSynchronizeGroup( SyncProcess* ) ),
+ SIGNAL( abortSynchronizeGroup( SyncProcess* ) ) );
+ connect( item, SIGNAL( configureGroup( SyncProcess* ) ),
+ SIGNAL( configureGroup( SyncProcess* ) ) );
+
+ mWidgetList->appendItem( item );
+ }
+}
+
+void GroupView::updateSyncProcess( SyncProcess *syncProcess )
+{
+ for ( int i = 0; i < (int)mWidgetList->count(); ++i ) {
+ GroupItem *item = static_cast<GroupItem*>( mWidgetList->item( i ) );
+ if ( item && item->syncProcess() == syncProcess )
+ item->update();
+ }
+}
+
+#include "groupview.moc"
diff --git a/kitchensync/src/groupview.h b/kitchensync/src/groupview.h
new file mode 100644
index 000000000..7aba895a1
--- /dev/null
+++ b/kitchensync/src/groupview.h
@@ -0,0 +1,57 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+#ifndef GROUPVIEW_H
+#define GROUPVIEW_H
+
+#include <kwidgetlist.h>
+
+class AboutPage;
+class SyncProcess;
+class QVBoxLayout;
+
+class GroupView : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ GroupView( QWidget *parent );
+
+ SyncProcess* selectedSyncProcess() const;
+
+ void clear();
+
+ public slots:
+ void updateView();
+ void updateSyncProcess( SyncProcess *process );
+
+ signals:
+ void addGroup();
+ void synchronizeGroup( SyncProcess *syncProcess );
+ void abortSynchronizeGroup( SyncProcess *syncProcess );
+ void configureGroup( SyncProcess *syncProcess );
+
+ private:
+ AboutPage *mAboutPage;
+ KWidgetList *mWidgetList;
+
+ QVBoxLayout *mLayout;
+};
+
+#endif
diff --git a/kitchensync/src/htmldiffalgodisplay.cpp b/kitchensync/src/htmldiffalgodisplay.cpp
new file mode 100644
index 000000000..b3b1bf819
--- /dev/null
+++ b/kitchensync/src/htmldiffalgodisplay.cpp
@@ -0,0 +1,97 @@
+/*
+ This file is part of libkdepim.
+
+ Copyright (c) 2004 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kglobalsettings.h>
+
+#include "htmldiffalgodisplay.h"
+
+using namespace KSync;
+
+static QString textToHTML( const QString &text )
+{
+ return QStyleSheet::convertFromPlainText( text );
+}
+
+HTMLDiffAlgoDisplay::HTMLDiffAlgoDisplay( QWidget *parent )
+ : KTextBrowser( parent )
+{
+ setWrapPolicy( QTextEdit::AtWordBoundary );
+ setVScrollBarMode( QScrollView::AlwaysOff );
+ setHScrollBarMode( QScrollView::AlwaysOff );
+}
+
+void HTMLDiffAlgoDisplay::begin()
+{
+ clear();
+ mText = "";
+
+ mText.append( "<html>" );
+ mText.append( QString( "<body text=\"%1\" bgcolor=\"%2\">" )
+ .arg( KGlobalSettings::textColor().name() )
+ .arg( KGlobalSettings::baseColor().name() ) );
+
+ mText.append( "<center><table>" );
+ mText.append( QString( "<tr><th></th><th align=\"center\">%1</th><td> </td><th align=\"center\">%2</th></tr>" )
+ .arg( mLeftTitle )
+ .arg( mRightTitle ) );
+}
+
+void HTMLDiffAlgoDisplay::end()
+{
+ mText.append( "</table></center>"
+ "</body>"
+ "</html>" );
+
+ setText( mText );
+}
+
+void HTMLDiffAlgoDisplay::setLeftSourceTitle( const QString &title )
+{
+ mLeftTitle = title;
+}
+
+void HTMLDiffAlgoDisplay::setRightSourceTitle( const QString &title )
+{
+ mRightTitle = title;
+}
+
+void HTMLDiffAlgoDisplay::additionalLeftField( const QString &id, const QString &value )
+{
+ mText.append( QString( "<tr><td align=\"right\"><b>%1:</b></td><td bgcolor=\"#9cff83\">%2</td><td></td><td></td></tr>" )
+ .arg( id )
+ .arg( textToHTML( value ) ) );
+}
+
+void HTMLDiffAlgoDisplay::additionalRightField( const QString &id, const QString &value )
+{
+ mText.append( QString( "<tr><td align=\"right\"><b>%1:</b></td><td></td><td></td><td bgcolor=\"#9cff83\">%2</td></tr>" )
+ .arg( id )
+ .arg( textToHTML( value ) ) );
+}
+
+void HTMLDiffAlgoDisplay::conflictField( const QString &id, const QString &leftValue,
+ const QString &rightValue )
+{
+ mText.append( QString( "<tr><td align=\"right\"><b>%1:</b></td><td bgcolor=\"#ff8686\">%2</td><td></td><td bgcolor=\"#ff8686\">%3</td></tr>" )
+ .arg( id )
+ .arg( textToHTML( leftValue ) )
+ .arg( textToHTML( rightValue ) ) );
+}
diff --git a/kitchensync/src/htmldiffalgodisplay.h b/kitchensync/src/htmldiffalgodisplay.h
new file mode 100644
index 000000000..e35e5eb40
--- /dev/null
+++ b/kitchensync/src/htmldiffalgodisplay.h
@@ -0,0 +1,54 @@
+/*
+ This file is part of libkdepim.
+
+ Copyright (c) 2004 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KSYNC_HTMLDIFFALGODISPLAY_H
+#define KSYNC_HTMLDIFFALGODISPLAY_H
+
+#include <ktextbrowser.h>
+#include <libkdepim/diffalgo.h>
+
+using namespace KPIM;
+
+namespace KSync {
+
+class HTMLDiffAlgoDisplay : virtual public DiffAlgoDisplay, public KTextBrowser
+{
+ public:
+ HTMLDiffAlgoDisplay( QWidget *parent );
+
+ void begin();
+ void end();
+ void setLeftSourceTitle( const QString &title );
+ void setRightSourceTitle( const QString &title );
+ void additionalLeftField( const QString &id, const QString &value );
+ void additionalRightField( const QString &id, const QString &value );
+ void conflictField( const QString &id, const QString &leftValue,
+ const QString &rightValue );
+
+ private:
+ QString mLeftTitle;
+ QString mRightTitle;
+ QString mText;
+};
+
+}
+
+#endif
diff --git a/kitchensync/src/kitchensync.desktop b/kitchensync/src/kitchensync.desktop
new file mode 100644
index 000000000..e7df319b5
--- /dev/null
+++ b/kitchensync/src/kitchensync.desktop
@@ -0,0 +1,61 @@
+[Desktop Entry]
+Name=KitchenSync
+Name[pt]=KitchenSyncFilter
+Name[sv]=Kitchensync
+GenericName=Synchronization
+GenericName[af]=Sinkronisasie
+GenericName[bg]=Синхронизация
+GenericName[ca]=Sincronització
+GenericName[cs]=Synchronizace
+GenericName[cy]=Cydamseriad
+GenericName[da]=Synkronisering
+GenericName[de]=Abgleich
+GenericName[el]=Συγχρονισμός
+GenericName[eo]=Sinkronigo
+GenericName[es]=Sincronización
+GenericName[et]=Sünkroniseerimine
+GenericName[eu]=Sinkronizazioa
+GenericName[fa]=همگامی
+GenericName[fi]=Synkronointi
+GenericName[fr]=Synchronisation
+GenericName[fy]=Syngronisaasje
+GenericName[ga]=Sioncrónú
+GenericName[gl]=Sincronización
+GenericName[he]=סינכרון
+GenericName[hu]=Szinkronizáció
+GenericName[is]=Samstilling
+GenericName[it]=Sincronizzazione
+GenericName[ja]=同期
+GenericName[ka]=სინქრონიზაცია
+GenericName[kk]=Қадамдастыру
+GenericName[km]=ការ​​ធ្វើ​សមកាលកម្ម
+GenericName[lt]=Sinchronizacija
+GenericName[ms]=Segerakan
+GenericName[nb]=Synkronisering
+GenericName[nds]=Synkroniseren
+GenericName[nl]=Synchronisatie
+GenericName[nn]=Synkronisering
+GenericName[pl]=Synchronizacja
+GenericName[pt]=Sincronização
+GenericName[pt_BR]=Gerenciador de Sincronização
+GenericName[ru]=Синхронизация
+GenericName[sk]=Synchronizácia
+GenericName[sl]=Usklajevanje
+GenericName[sr]=Синхронизација
+GenericName[sr@Latn]=Sinhronizacija
+GenericName[sv]=Synkronisering
+GenericName[ta]=கூட்டிணைப்பு
+GenericName[tr]=Senkronizasyon
+GenericName[uk]=Синхронізація
+GenericName[zh_CN]=同步
+Exec=kitchensync
+Icon=kitchensync
+Type=Application
+DocPath=kitchensync/index.html
+Terminal=false
+X-KDE-StartupNotify=true
+X-DCOP-ServiceType=Unique
+X-DCOP-ServiceName=kitchensync
+ServiceTypes=KParts/ReadOnlyPart
+X-KDE-Library=libkitchensyncpart
+Categories=Qt;KDE;Utility;X-KDE-Utilities-PIM;
diff --git a/kitchensync/src/kitchensync_part.rc b/kitchensync/src/kitchensync_part.rc
new file mode 100644
index 000000000..03a13ba6b
--- /dev/null
+++ b/kitchensync/src/kitchensync_part.rc
@@ -0,0 +1,22 @@
+<!DOCTYPE kpartgui>
+<kpartgui name="kitchensync" version="1">
+ <MenuBar>
+ <Menu name="file">
+ <Action name="sync" />
+ </Menu>
+
+ <Menu name="groups"><text>&amp;Groups</text>
+ <Action name="add_group" />
+ <Action name="edit_group" />
+ <Action name="delete_group" />
+ </Menu>
+ </MenuBar>
+
+ <ToolBar name="mainToolBar"><text>Main</text>
+ <Action name="sync" />
+ <Separator />
+ <Action name="add_group" />
+ <Action name="edit_group" />
+ <Action name="delete_group" />
+ </ToolBar>
+</kpartgui>
diff --git a/kitchensync/src/kitchensyncui.rc b/kitchensync/src/kitchensyncui.rc
new file mode 100644
index 000000000..df2e49be0
--- /dev/null
+++ b/kitchensync/src/kitchensyncui.rc
@@ -0,0 +1,22 @@
+<!DOCTYPE kpartgui>
+<kpartgui name="kitchensync" version="2">
+ <MenuBar>
+ <Menu name="file">
+ <Action name="sync" />
+ </Menu>
+
+ <Menu name="groups"><text>&amp;Groups</text>
+ <Action name="add_group" />
+ <Action name="edit_group" />
+ <Action name="delete_group" />
+ </Menu>
+ </MenuBar>
+
+ <ToolBar name="mainToolBar"><text>Main</text>
+ <Action name="sync" />
+ <Separator />
+ <Action name="add_group" />
+ <Action name="edit_group" />
+ <Action name="delete_group" />
+ </ToolBar>
+</kpartgui>
diff --git a/kitchensync/src/kwidgetlist.cpp b/kitchensync/src/kwidgetlist.cpp
new file mode 100644
index 000000000..450a719e8
--- /dev/null
+++ b/kitchensync/src/kwidgetlist.cpp
@@ -0,0 +1,305 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qvbox.h>
+
+#include <kglobalsettings.h>
+
+#include "kwidgetlist.h"
+
+class KWidgetList::Private
+{
+ public:
+ Private()
+ : mSelectedItem( 0 )
+ {
+ }
+
+ QValueList<KWidgetListItem*> mItems;
+ KWidgetListItem *mSelectedItem;
+ QVBox *mBox;
+};
+
+KWidgetList::KWidgetList( QWidget *parent, const char *name )
+ : QScrollView( parent, name ),
+ d( new Private )
+{
+ d->mBox = new QVBox( viewport() );
+ addChild( d->mBox );
+
+ setResizePolicy( AutoOneFit );
+ setFocusPolicy( QWidget::StrongFocus );
+
+ viewport()->setFocus();
+}
+
+KWidgetList::~KWidgetList()
+{
+ clear();
+
+ delete d;
+ d = 0;
+}
+
+uint KWidgetList::count() const
+{
+ return d->mItems.count();
+}
+
+void KWidgetList::appendItem( KWidgetListItem *item )
+{
+ if ( !item )
+ return;
+
+ if ( !d->mItems.contains( item ) ) {
+ d->mItems.append( item );
+ item->reparent( d->mBox, 0, QPoint( 0, 0 ), true );
+ item->setSelected( false );
+ item->installEventFilter( this );
+
+ if ( d->mItems.count() == 1 ) {
+ d->mSelectedItem = item;
+ } else {
+ if ( !d->mSelectedItem )
+ setSelected( item );
+ else
+ d->mSelectedItem->setSelected( true );
+ }
+ }
+}
+
+void KWidgetList::removeItem( int index )
+{
+ if ( index < 0 || index >= (int)d->mItems.count() )
+ return;
+
+ KWidgetListItem *item = d->mItems[ index ];
+ d->mItems.remove( item );
+
+ if ( d->mSelectedItem == item ) {
+ // TODO: smarter selection
+ if ( !d->mItems.isEmpty() )
+ setSelected( d->mItems.first() );
+ else
+ d->mSelectedItem = 0;
+ }
+
+ delete item;
+
+ if ( d->mItems.count() == 1 )
+ d->mItems.first()->setSelected( false );
+}
+
+void KWidgetList::takeItem( KWidgetListItem *item )
+{
+ d->mItems.remove( item );
+ item->reparent( 0, 0, QPoint( 0, 0 ) );
+ item->removeEventFilter( this );
+ item->hide();
+
+ if ( d->mSelectedItem == item ) {
+ // TODO: smarter selection
+ if ( !d->mItems.isEmpty() )
+ setSelected( d->mItems.first() );
+ else
+ d->mSelectedItem = 0;
+ }
+}
+
+void KWidgetList::setSelected( KWidgetListItem *item )
+{
+ if ( !item )
+ return;
+
+ if ( d->mItems.contains( item ) == 0 )
+ return;
+
+ if ( d->mSelectedItem )
+ d->mSelectedItem->setSelected( false );
+
+ item->setSelected( true );
+ d->mSelectedItem = item;
+}
+
+void KWidgetList::setSelected( int index )
+{
+ setSelected( item( index ) );
+}
+
+bool KWidgetList::isSelected( KWidgetListItem *item ) const
+{
+ return ( d->mSelectedItem == item );
+}
+
+bool KWidgetList::isSelected( int index ) const
+{
+ return isSelected( item( index ) );
+}
+
+KWidgetListItem *KWidgetList::selectedItem() const
+{
+ return d->mSelectedItem;
+}
+
+KWidgetListItem *KWidgetList::item( int index ) const
+{
+ if ( index < 0 || index >= (int)d->mItems.count() )
+ return 0;
+ else
+ return d->mItems[ index ];
+}
+
+int KWidgetList::index( KWidgetListItem *item ) const
+{
+ return d->mItems.findIndex( item );
+}
+
+void KWidgetList::clear()
+{
+ QValueList<KWidgetListItem*>::Iterator it;
+ for ( it = d->mItems.begin(); it != d->mItems.end(); ++it )
+ delete *it;
+
+ d->mItems.clear();
+
+ d->mSelectedItem = 0;
+}
+
+void KWidgetList::setFocus()
+{
+ viewport()->setFocus();
+}
+
+bool KWidgetList::eventFilter( QObject *object, QEvent *event )
+{
+ if ( event->type() == QEvent::MouseButtonPress ) {
+ QMouseEvent *mouseEvent = static_cast<QMouseEvent*>( event );
+ if ( mouseEvent->button() & LeftButton ) {
+ QValueList<KWidgetListItem*>::Iterator it;
+ for ( it = d->mItems.begin(); it != d->mItems.end(); ++it ) {
+ if ( *it == object ) {
+ if ( d->mItems.count() != 1 ) {
+ setSelected( *it );
+ emit selectionChanged( *it );
+ }
+ return true;
+ }
+ }
+ }
+ } else if ( event->type() == QEvent::MouseButtonDblClick ) {
+ QValueList<KWidgetListItem*>::Iterator it;
+ for ( it = d->mItems.begin(); it != d->mItems.end(); ++it ) {
+ if ( *it == object ) {
+ if ( d->mItems.count() != 1 ) {
+ setSelected( *it );
+ emit doubleClicked( *it );
+ }
+ return true;
+ }
+ }
+ } else if ( event->type() == QEvent::KeyPress ) {
+ QKeyEvent *keyEvent = static_cast<QKeyEvent*>( event );
+ if ( keyEvent->key() == Qt::Key_Up ) {
+ if ( d->mSelectedItem == 0 ) {
+ if ( !d->mItems.isEmpty() ) {
+ setSelected( d->mItems.first() );
+ return true;
+ }
+ }
+
+ for ( int i = 0; i < (int)d->mItems.count(); ++i ) {
+ if ( d->mItems[ i ] == d->mSelectedItem ) {
+ if ( ( i - 1 ) >= 0 ) {
+ setSelected( d->mItems[ i - 1 ] );
+ return true;
+ }
+ }
+ }
+ return true;
+ } else if ( keyEvent->key() == Qt::Key_Down ) {
+ if ( d->mSelectedItem == 0 ) {
+ if ( !d->mItems.isEmpty() ) {
+ setSelected( d->mItems.last() );
+ return true;
+ }
+ }
+
+ for ( int i = 0; i < (int)d->mItems.count(); ++i )
+ if ( d->mItems[ i ] == d->mSelectedItem ) {
+ if ( ( i + 1 ) < (int)d->mItems.count() ) {
+ setSelected( d->mItems[ i + 1 ] );
+ return true;
+ }
+ }
+ return true;
+ }
+ }
+
+ return QScrollView::eventFilter( object, event );
+}
+
+KWidgetListItem::KWidgetListItem( KWidgetList *parent, const char *name )
+ : QWidget( parent, name )
+{
+ mForegroundColor = KGlobalSettings::textColor();
+ mBackgroundColor = KGlobalSettings::baseColor();
+ mSelectionForegroundColor = KGlobalSettings::highlightedTextColor();
+ mSelectionBackgroundColor = KGlobalSettings::highlightColor();
+
+ setFocusPolicy( QWidget::StrongFocus );
+}
+
+KWidgetListItem::~KWidgetListItem()
+{
+}
+
+void KWidgetListItem::setSelected( bool select )
+{
+ if ( select ) {
+ setPaletteForegroundColor( mSelectionForegroundColor );
+ setPaletteBackgroundColor( mSelectionBackgroundColor );
+ } else {
+ setPaletteForegroundColor( mForegroundColor );
+ setPaletteBackgroundColor( mBackgroundColor );
+ }
+}
+
+void KWidgetListItem::setForegroundColor( const QColor &color )
+{
+ mForegroundColor = color;
+}
+
+void KWidgetListItem::setBackgroundColor( const QColor &color )
+{
+ mBackgroundColor = color;
+}
+
+void KWidgetListItem::setSelectionForegroundColor( const QColor &color )
+{
+ mSelectionForegroundColor = color;
+}
+
+void KWidgetListItem::setSelectionBackgroundColor( const QColor &color )
+{
+ mSelectionBackgroundColor = color;
+}
+
+#include "kwidgetlist.moc"
diff --git a/kitchensync/src/kwidgetlist.h b/kitchensync/src/kwidgetlist.h
new file mode 100644
index 000000000..59567b7d5
--- /dev/null
+++ b/kitchensync/src/kwidgetlist.h
@@ -0,0 +1,90 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KWIDGETLIST_H
+#define KWIDGETLIST_H
+
+#include <qscrollview.h>
+
+class KWidgetListItem;
+
+class KWidgetList : public QScrollView
+{
+ Q_OBJECT
+
+ public:
+ KWidgetList( QWidget *parent = 0, const char *name = 0 );
+ ~KWidgetList();
+
+ uint count() const;
+
+ void appendItem( KWidgetListItem *item );
+ void removeItem( int index );
+ void takeItem( KWidgetListItem *item );
+
+ void setSelected( KWidgetListItem *item );
+ void setSelected( int index );
+
+ bool isSelected( KWidgetListItem *item ) const;
+ bool isSelected( int index ) const;
+
+ KWidgetListItem *selectedItem() const;
+ KWidgetListItem *item( int index ) const;
+
+ int index( KWidgetListItem *item ) const;
+
+ virtual bool eventFilter( QObject *object, QEvent *event );
+
+ public slots:
+ void clear();
+ virtual void setFocus();
+
+ signals:
+ void selectionChanged( KWidgetListItem *item );
+ void doubleClicked( KWidgetListItem *item );
+
+ private:
+ class Private;
+ Private *d;
+};
+
+class KWidgetListItem : public QWidget
+{
+ public:
+ KWidgetListItem( KWidgetList *parent, const char *name = 0 );
+ ~KWidgetListItem();
+
+ void setSelected( bool selected );
+
+ protected:
+ void setForegroundColor( const QColor& );
+ void setBackgroundColor( const QColor& );
+ void setSelectionForegroundColor( const QColor& );
+ void setSelectionBackgroundColor( const QColor& );
+
+ private:
+ QColor mForegroundColor;
+ QColor mBackgroundColor;
+ QColor mSelectionForegroundColor;
+ QColor mSelectionBackgroundColor;
+};
+
+#endif
diff --git a/kitchensync/src/main.cpp b/kitchensync/src/main.cpp
new file mode 100644
index 000000000..e93ad26e7
--- /dev/null
+++ b/kitchensync/src/main.cpp
@@ -0,0 +1,58 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <kuniqueapplication.h>
+#include <stdlib.h>
+
+#include "mainwidget.h"
+#include "mainwindow.h"
+
+static KCmdLineOptions options[] =
+{
+ KCmdLineLastOption
+};
+
+int main( int argc, char **argv )
+{
+ KAboutData *about = MainWidget::aboutData();
+
+ KCmdLineArgs::init( argc, argv, about );
+ KCmdLineArgs::addCmdLineOptions( options );
+ KUniqueApplication::addCmdLineOptions();
+
+ KUniqueApplication::addCmdLineOptions();
+
+ if( !KUniqueApplication::start() ) {
+ kdDebug() << "kitchensync already runs." << endl;
+ exit( 0 );
+ };
+
+ KUniqueApplication app;
+
+ KGlobal::locale()->insertCatalogue( "libkcal" );
+
+ MainWindow *mainWindow = new MainWindow;
+ mainWindow->show();
+
+ app.exec();
+}
diff --git a/kitchensync/src/mainwidget.cpp b/kitchensync/src/mainwidget.cpp
new file mode 100644
index 000000000..683436364
--- /dev/null
+++ b/kitchensync/src/mainwidget.cpp
@@ -0,0 +1,191 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include "mainwidget.h"
+
+#include "groupconfigdialog.h"
+#include "groupview.h"
+#include "syncprocess.h"
+#include "syncprocessmanager.h"
+
+#include <libqopensync/environment.h>
+
+#include <kaboutdata.h>
+#include <kaction.h>
+#include <kdebug.h>
+#include <kinputdialog.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kstdaction.h>
+#include <kxmlguiclient.h>
+
+#include <qlayout.h>
+
+MainWidget::MainWidget( KXMLGUIClient *guiClient, QWidget *widget, const char *name )
+ : QWidget( widget, name ), mGUIClient( guiClient )
+{
+ initGUI();
+ initActions();
+
+ /** apply object type filter hack **/
+ int count = SyncProcessManager::self()->count();
+ for ( int i = 0; i < count; ++i ) {
+ SyncProcessManager::self()->at( i )->applyObjectTypeFilter();
+ }
+ /** apply object type filter hack **/
+
+ mGroupView->updateView();
+
+ connect( SyncProcessManager::self(), SIGNAL( changed() ),
+ mGroupView, SLOT( updateView() ) );
+ connect( SyncProcessManager::self(), SIGNAL( syncProcessChanged( SyncProcess* ) ),
+ mGroupView, SLOT( updateSyncProcess( SyncProcess* ) ) );
+
+ enableActions();
+}
+
+MainWidget::~MainWidget()
+{
+}
+
+KXMLGUIClient *MainWidget::guiClient() const
+{
+ return mGUIClient;
+}
+
+KAboutData *MainWidget::aboutData()
+{
+ KAboutData *about = new KAboutData( "kitchensync", I18N_NOOP( "KitchenSync" ),
+ "0.1", I18N_NOOP( "The KDE Syncing Application" ),
+ KAboutData::License_GPL_V2,
+ I18N_NOOP( "(c) 2005, The KDE PIM Team" ) );
+ about->addAuthor( "Tobias Koenig", I18N_NOOP( "Current maintainer" ), "tokoe@kde.org" );
+ about->addAuthor( "Cornelius Schumacher", 0, "schumacher@kde.org" );
+
+ return about;
+}
+
+void MainWidget::initGUI()
+{
+ QVBoxLayout *topLayout = new QVBoxLayout( this );
+
+ mGroupView = new GroupView( this );
+ topLayout->addWidget( mGroupView );
+
+ connect( mGroupView, SIGNAL( addGroup() ), SLOT( addGroup() ) );
+ connect( mGroupView, SIGNAL( synchronizeGroup( SyncProcess* ) ),
+ SLOT( sync( SyncProcess* ) ) );
+ connect( mGroupView, SIGNAL( abortSynchronizeGroup( SyncProcess* ) ),
+ SLOT( abortSync( SyncProcess* ) ) );
+ connect( mGroupView, SIGNAL( configureGroup( SyncProcess* ) ),
+ SLOT( editGroup( SyncProcess* ) ) );
+}
+
+void MainWidget::initActions()
+{
+ mActionSynchronize = new KAction( i18n("Synchronize"), "hotsync", 0, this, SLOT( sync() ),
+ mGUIClient->actionCollection(), "sync" );
+ mActionAddGroup = new KAction( i18n("Add Group..."), "filenew", 0, this, SLOT( addGroup() ),
+ mGUIClient->actionCollection(), "add_group" );
+ mActionDeleteGroup = new KAction( i18n("Delete Group..."), "editdelete", 0, this, SLOT( deleteGroup() ),
+ mGUIClient->actionCollection(), "delete_group" );
+ mActionEditGroup = new KAction( i18n("Edit Group..."), "edit", 0, this, SLOT( editGroup() ),
+ mGUIClient->actionCollection(), "edit_group" );
+}
+
+void MainWidget::enableActions()
+{
+ bool state = ( SyncProcessManager::self()->count() > 0 );
+
+ mActionSynchronize->setEnabled( state );
+ mActionDeleteGroup->setEnabled( state );
+ mActionEditGroup->setEnabled( state );
+}
+
+void MainWidget::addGroup()
+{
+ bool ok;
+ QString name = KInputDialog::getText( i18n("Create Synchronization Group"),
+ i18n("Name for new synchronization group."), QString::null, &ok, this );
+ if ( ok ) {
+ SyncProcessManager::self()->addGroup( name );
+ enableActions();
+
+ SyncProcess *process = SyncProcessManager::self()->byGroupName( name );
+ if ( process )
+ editGroup( process );
+ }
+}
+
+void MainWidget::deleteGroup()
+{
+ SyncProcess *syncProcess = mGroupView->selectedSyncProcess();
+ if ( syncProcess ) {
+ int result = KMessageBox::warningContinueCancel( this,
+ i18n("Delete synchronization group '%1'?").arg( syncProcess->group().name() ) );
+ if ( result == KMessageBox::Continue ) {
+ SyncProcessManager::self()->remove( syncProcess );
+ enableActions();
+ }
+ }
+}
+
+void MainWidget::editGroup()
+{
+ editGroup( mGroupView->selectedSyncProcess() );
+}
+
+void MainWidget::editGroup( SyncProcess *syncProcess )
+{
+ if ( syncProcess ) {
+ GroupConfigDialog dlg( this, syncProcess );
+ dlg.exec();
+
+ enableActions();
+ }
+}
+
+void MainWidget::sync()
+{
+ sync( mGroupView->selectedSyncProcess() );
+}
+
+void MainWidget::sync( SyncProcess *syncProcess )
+{
+ if ( syncProcess ) {
+ syncProcess->reinitEngine();
+ QSync::Result result = syncProcess->engine()->synchronize();
+ if ( result ) {
+ qDebug( "%s", result.message().latin1() );
+ } else {
+ qDebug( "synchronization worked" );
+ }
+ }
+}
+
+void MainWidget::abortSync( SyncProcess *syncProcess )
+{
+ if ( syncProcess )
+ syncProcess->engine()->abort();
+}
+
+#include "mainwidget.moc"
diff --git a/kitchensync/src/mainwidget.h b/kitchensync/src/mainwidget.h
new file mode 100644
index 000000000..3bbfcb5cd
--- /dev/null
+++ b/kitchensync/src/mainwidget.h
@@ -0,0 +1,73 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+#ifndef MAINWIDGET_H
+#define MAINWIDGET_H
+
+#include <libqopensync/engine.h>
+#include <kdemacros.h>
+
+#include <qwidget.h>
+
+class KAboutData;
+class KAction;
+class KXMLGUIClient;
+class GroupView;
+class SyncProcess;
+class SyncProcessManager;
+
+namespace QSync {
+class Environment;
+}
+
+class KDE_EXPORT MainWidget : public QWidget
+{
+ Q_OBJECT
+ public:
+ MainWidget( KXMLGUIClient *guiClient, QWidget *widget = 0, const char *name = 0 );
+ ~MainWidget();
+
+ virtual KXMLGUIClient *guiClient() const;
+ static KAboutData *aboutData();
+
+ public slots:
+ void addGroup();
+ void deleteGroup();
+ void editGroup();
+ void editGroup( SyncProcess *syncProcess );
+
+ void sync();
+ void sync( SyncProcess *syncProcess );
+ void abortSync( SyncProcess *syncProcess );
+
+ private:
+ void initGUI();
+ void initActions();
+ void enableActions();
+
+ KXMLGUIClient *mGUIClient;
+ KAction *mActionSynchronize;
+ KAction *mActionAddGroup;
+ KAction *mActionDeleteGroup;
+ KAction *mActionEditGroup;
+
+ GroupView *mGroupView;
+};
+
+#endif
diff --git a/kitchensync/src/mainwindow.cpp b/kitchensync/src/mainwindow.cpp
new file mode 100644
index 000000000..2426b11dc
--- /dev/null
+++ b/kitchensync/src/mainwindow.cpp
@@ -0,0 +1,61 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <kaction.h>
+#include <klocale.h>
+#include <kstdaction.h>
+#include <ktoolbar.h>
+
+#include "mainwidget.h"
+
+#include "mainwindow.h"
+
+MainWindow::MainWindow()
+ : KMainWindow( 0 )
+{
+ setWFlags( getWFlags() | WGroupLeader );
+
+ setCaption( i18n( "PIM Synchronization" ) );
+
+ mWidget = new MainWidget( this, this, "MainWidget" );
+
+ setCentralWidget( mWidget );
+
+ initActions();
+
+ createGUI( "kitchensyncui.rc", false );
+ createGUI( 0 );
+
+ toolBar()->setIconText( KToolBar::IconTextBottom );
+
+ resize( 760, 530 ); // initial size
+ setAutoSaveSettings();
+}
+
+MainWindow::~MainWindow()
+{
+}
+
+void MainWindow::initActions()
+{
+ KStdAction::quit( this, SLOT( close() ), actionCollection() );
+}
+
+#include "mainwindow.moc"
diff --git a/kitchensync/src/mainwindow.h b/kitchensync/src/mainwindow.h
new file mode 100644
index 000000000..653227181
--- /dev/null
+++ b/kitchensync/src/mainwindow.h
@@ -0,0 +1,46 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <kmainwindow.h>
+
+class MainWidget;
+
+/**
+ This class serves as the main window for Kitchensync. It handles the
+ menus, toolbars, and status bars.
+ */
+class MainWindow : public KMainWindow
+{
+ Q_OBJECT
+
+ public:
+ MainWindow();
+ virtual ~MainWindow();
+
+ private:
+ void initActions();
+
+ MainWidget *mWidget;
+};
+
+#endif
diff --git a/kitchensync/src/memberconfig.cpp b/kitchensync/src/memberconfig.cpp
new file mode 100644
index 000000000..932830cd8
--- /dev/null
+++ b/kitchensync/src/memberconfig.cpp
@@ -0,0 +1,79 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include "memberconfig.h"
+
+#include "configgui.h"
+#include "memberinfo.h"
+
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qtabwidget.h>
+
+MemberConfig::MemberConfig( QWidget *parent, const QSync::Member &member )
+ : QWidget( parent ), mMember( member )
+{
+ QBoxLayout *topLayout = new QVBoxLayout( this );
+
+ mGui = ConfigGui::Factory::create( member, this );
+ topLayout->addWidget( mGui );
+}
+
+MemberConfig::~MemberConfig()
+{
+}
+
+void MemberConfig::loadData()
+{
+ QByteArray cfg;
+ QSync::Result error = mMember.configuration( cfg );
+
+ if ( error ) {
+ KMessageBox::error( this,
+ i18n("Unable to read config from plugin '%1':\n%2")
+ .arg( mMember.pluginName() ).arg( error.message() ) );
+ } else {
+ QString txt = QString::fromUtf8( cfg.data(), cfg.size() );
+ mGui->load( txt );
+ MemberInfo mi( mMember );
+ mGui->setInstanceName( mi.name() );
+ }
+}
+
+void MemberConfig::saveData()
+{
+ QString txt = mGui->save();
+
+ if ( txt.isEmpty() ) {
+ KMessageBox::sorry( this, i18n("Configuration of %1 is empty.").arg( mMember.pluginName() ) );
+ } else {
+ QByteArray cfg = txt.utf8();
+ cfg.truncate(cfg.size() - 1); /* discard NUL terminator */
+ mMember.setConfiguration( cfg );
+ mMember.setName( mGui->instanceName() );
+ // TODO: Check for save() error.
+ mMember.save();
+ }
+}
+
+#include "memberconfig.moc"
diff --git a/kitchensync/src/memberconfig.h b/kitchensync/src/memberconfig.h
new file mode 100644
index 000000000..5bb46b8ff
--- /dev/null
+++ b/kitchensync/src/memberconfig.h
@@ -0,0 +1,47 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+#ifndef MEMBERCONFIG_H
+#define MEMBERCONFIG_H
+
+#include <libqopensync/member.h>
+
+#include <qwidget.h>
+
+class QTextEdit;
+class ConfigGui;
+
+class MemberConfig : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ MemberConfig( QWidget *parent, const QSync::Member & );
+ ~MemberConfig();
+
+ void loadData();
+ void saveData();
+
+ private:
+ QSync::Member mMember;
+
+ ConfigGui *mGui;
+};
+
+#endif
diff --git a/kitchensync/src/memberinfo.cpp b/kitchensync/src/memberinfo.cpp
new file mode 100644
index 000000000..be43991fd
--- /dev/null
+++ b/kitchensync/src/memberinfo.cpp
@@ -0,0 +1,99 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "memberinfo.h"
+
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <klocale.h>
+
+MemberInfo::MemberInfo( const QSync::Member &member )
+ : mMember( member )
+{
+}
+
+QPixmap MemberInfo::smallIcon() const
+{
+ return KGlobal::iconLoader()->loadIcon( iconName(), KIcon::Small );
+}
+
+QPixmap MemberInfo::desktopIcon() const
+{
+ return KGlobal::iconLoader()->loadIcon( iconName(), KIcon::Desktop );
+}
+
+QString MemberInfo::iconName() const
+{
+ return pluginIconName( mMember.pluginName() );
+}
+
+QString MemberInfo::name() const
+{
+ static QMap<QString, QString> nameMap;
+ if ( nameMap.isEmpty() ) {
+ nameMap.insert( "file-sync", i18n( "File" ) );
+ nameMap.insert( "palm-sync", i18n( "Palm" ) );
+ nameMap.insert( "kdepim-sync", i18n( "KDE PIM" ) );
+ nameMap.insert( "kio-sync", i18n( "Remote File" ) );
+ nameMap.insert( "irmc-sync", i18n( "Mobile Phone" ) );
+ nameMap.insert( "evo2-sync", i18n( "Evolution" ) );
+ nameMap.insert( "opie-sync", i18n( "Handheld" ) );
+ nameMap.insert( "ldap-sync", i18n( "LDAP" ) );
+ nameMap.insert( "syncml-obex-client", i18n( "Mobile Phone" ) );
+ nameMap.insert( "syncml-http-server", i18n( "Mobile Phone" ) );
+ nameMap.insert( "moto-sync", i18n( "Mobile Phone" ) );
+ nameMap.insert( "gnokii-sync", i18n( "Mobile Phone" ) );
+ nameMap.insert( "google-calendar", i18n( "Google Calendar" ) );
+ nameMap.insert( "gpe-sync", i18n( "Handheld" ) );
+ nameMap.insert( "sunbird-sync", i18n( "Sunbird Calendar" ) );
+ nameMap.insert( "jescs-sync", i18n( "Java Enterprise System Calendar" ) );
+ nameMap.insert( "synce-plugin", i18n( "WinCE Devices" ) );
+ }
+
+ if ( mMember.name().isEmpty() )
+ return nameMap[ mMember.pluginName() ] + " (" + QString::number( mMember.id() ) + ") ";
+ else
+ return mMember.name();
+}
+
+QString MemberInfo::pluginIconName( const QString &pluginName )
+{
+ if ( pluginName == "file-sync" ) return "folder";
+ if ( pluginName == "palm-sync" ) return "pda_black";
+ if ( pluginName == "kdepim-sync" ) return "kontact";
+ if ( pluginName == "kio-sync" ) return "network";
+ if ( pluginName == "irmc-sync" ) return "mobile_phone";
+ if ( pluginName == "evo2-sync" ) return "evolution";
+ if ( pluginName == "opie-sync" ) return "pda_blue";
+ if ( pluginName == "synce-plugin" ) return "pda_blue";
+ if ( pluginName == "ldap-sync" ) return "contents2";
+ if ( pluginName == "syncml-obex-client" ) return "mobile_phone";
+ if ( pluginName == "syncml-http-server" ) return "pda_blue";
+ if ( pluginName == "moto-sync" ) return "mobile_phone";
+ if ( pluginName == "gnokii-sync" ) return "mobile_phone";
+ if ( pluginName == "google-calendar" ) return "www";
+ if ( pluginName == "gpe-sync" ) return "pda_blue";
+ if ( pluginName == "sunbird-sync" ) return "www";
+ if ( pluginName == "jescs-sync" ) return "www";
+
+
+ return QString::null;
+}
diff --git a/kitchensync/src/memberinfo.h b/kitchensync/src/memberinfo.h
new file mode 100644
index 000000000..2ec35cfaa
--- /dev/null
+++ b/kitchensync/src/memberinfo.h
@@ -0,0 +1,47 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+#ifndef MEMBERINFO_H
+#define MEMBERINFO_H
+
+#include <libqopensync/member.h>
+
+#include <qstring.h>
+#include <qpixmap.h>
+
+class MemberInfo
+{
+ public:
+ MemberInfo( const QSync::Member &member );
+
+ QPixmap smallIcon() const;
+ QPixmap desktopIcon() const;
+
+ QString iconName() const;
+
+ QString name() const;
+
+ static QString pluginIconName( const QString &pluginName );
+
+ private:
+ QSync::Member mMember;
+};
+
+#endif
diff --git a/kitchensync/src/multiconflictdialog.cpp b/kitchensync/src/multiconflictdialog.cpp
new file mode 100644
index 000000000..996ef08af
--- /dev/null
+++ b/kitchensync/src/multiconflictdialog.cpp
@@ -0,0 +1,141 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <kdialog.h>
+#include <klocale.h>
+#include <kwidgetlist.h>
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+
+#include "memberinfo.h"
+
+#include "multiconflictdialog.h"
+
+class ChangeItem : public KWidgetListItem
+{
+ public:
+ ChangeItem( KWidgetList *parent, const QSync::SyncChange &change )
+ : KWidgetListItem( parent ),
+ mChange( change )
+ {
+ QGridLayout *layout = new QGridLayout( this, 2, 1, KDialog::marginHint(), KDialog::spacingHint() );
+
+ MemberInfo mi( change.member() );
+ layout->addWidget( new QLabel( mi.name(), this ), 0, 0 );
+
+ QString type;
+ switch ( change.changeType() ) {
+ case QSync::SyncChange::UnknownChange:
+ type = i18n( "Unknown" );
+ break;
+ case QSync::SyncChange::AddedChange:
+ type = i18n( "Added" );
+ break;
+ case QSync::SyncChange::DeletedChange:
+ type = i18n( "Deleted" );
+ break;
+ case QSync::SyncChange::ModifiedChange:
+ type = i18n( "Modified" );
+ break;
+ case QSync::SyncChange::UnmodifiedChange:
+ default:
+ type = i18n( "Unmodified" );
+ break;
+ }
+
+ layout->addWidget( new QLabel( type, this ), 1, 0 );
+ }
+
+ QSync::SyncChange change() const { return mChange; }
+
+ private:
+ QSync::SyncChange mChange;
+};
+
+MultiConflictDialog::MultiConflictDialog( QSync::SyncMapping &mapping, QWidget *parent )
+ : ConflictDialog( mapping, parent )
+{
+ initGUI();
+
+ for ( int i = 0; i < mMapping.changesCount(); ++i ) {
+ QSync::SyncChange change = mMapping.changeAt( i );
+ if ( change.isValid() ) {
+ ChangeItem *item = new ChangeItem( mWidgetList, change );
+ mWidgetList->appendItem( item );
+ }
+ }
+
+ mWidgetList->setFocus();
+}
+
+MultiConflictDialog::~MultiConflictDialog()
+{
+}
+
+void MultiConflictDialog::useSelectedChange()
+{
+ ChangeItem *item = static_cast<ChangeItem*>( mWidgetList->selectedItem() );
+ if ( !item )
+ return;
+
+ mMapping.solve( item->change() );
+
+ accept();
+}
+
+void MultiConflictDialog::duplicateChange()
+{
+ mMapping.duplicate();
+
+ accept();
+}
+
+void MultiConflictDialog::ignoreChange()
+{
+ mMapping.ignore();
+
+ accept();
+}
+
+void MultiConflictDialog::initGUI()
+{
+ QGridLayout *layout = new QGridLayout( this, 3, 3, KDialog::marginHint(), KDialog::spacingHint() );
+
+ layout->addMultiCellWidget( new QLabel( i18n( "A conflict has appeared, please solve it manually." ), this ), 0, 0, 0, 2 );
+
+ mWidgetList = new KWidgetList( this );
+ layout->addMultiCellWidget( mWidgetList, 1, 1, 0, 2 );
+
+ QPushButton *button = new QPushButton( i18n( "Use Selected Item" ), this );
+ connect( button, SIGNAL( clicked() ), SLOT( useSelectedChange() ) );
+ layout->addWidget( button, 2, 0 );
+
+ button = new QPushButton( i18n( "Duplicate Items" ), this );
+ connect( button, SIGNAL( clicked() ), SLOT( duplicateChange() ) );
+ layout->addWidget( button, 2, 1 );
+
+ button = new QPushButton( i18n( "Ignore Conflict" ), this );
+ connect( button, SIGNAL( clicked() ), SLOT( ignoreChange() ) );
+ layout->addWidget( button, 2, 2 );
+}
+
+#include "multiconflictdialog.moc"
diff --git a/kitchensync/src/multiconflictdialog.h b/kitchensync/src/multiconflictdialog.h
new file mode 100644
index 000000000..d98fb927b
--- /dev/null
+++ b/kitchensync/src/multiconflictdialog.h
@@ -0,0 +1,47 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef MULTICONFLICTDIALOG_H
+#define MULTICONFLICTDIALOG_H
+
+#include "conflictdialog.h"
+
+class KWidgetList;
+
+class MultiConflictDialog : public ConflictDialog
+{
+ Q_OBJECT
+
+ public:
+ MultiConflictDialog( QSync::SyncMapping &mapping, QWidget *parent );
+ ~MultiConflictDialog();
+
+ private slots:
+ void useSelectedChange();
+ void duplicateChange();
+ void ignoreChange();
+
+ private:
+ void initGUI();
+
+ KWidgetList *mWidgetList;
+};
+
+#endif
diff --git a/kitchensync/src/part.cpp b/kitchensync/src/part.cpp
new file mode 100644
index 000000000..e0d65cf40
--- /dev/null
+++ b/kitchensync/src/part.cpp
@@ -0,0 +1,89 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <qlayout.h>
+#include <qvbox.h>
+
+#include <kaction.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <kinstance.h>
+#include <klocale.h>
+#include <kparts/genericfactory.h>
+
+#include "mainwidget.h"
+
+#include "part.h"
+
+typedef KParts::GenericFactory< KitchenSyncPart > KitchenSyncFactory;
+K_EXPORT_COMPONENT_FACTORY( libkitchensyncpart, KitchenSyncFactory )
+
+KitchenSyncPart::KitchenSyncPart( QWidget *parentWidget, const char *widgetName,
+ QObject *parent, const char *name,
+ const QStringList& )
+ : KParts::ReadOnlyPart( parent, name )
+{
+ setInstance( KitchenSyncFactory::instance() );
+
+ QVBox *canvas = new QVBox( parentWidget, widgetName );
+ setWidget( canvas );
+
+ new MainWidget( this, canvas );
+
+ KGlobal::iconLoader()->addAppDir( "kitchensync" );
+
+ setXMLFile( "kitchensync_part.rc" );
+}
+
+KitchenSyncPart::~KitchenSyncPart()
+{
+ closeURL();
+}
+
+KAboutData *KitchenSyncPart::createAboutData()
+{
+ return MainWidget::aboutData();
+}
+
+void KitchenSyncPart::exit()
+{
+ delete this;
+}
+
+bool KitchenSyncPart::openURL( const KURL &url )
+{
+ emit setWindowCaption( url.prettyURL() );
+
+ return true;
+}
+
+bool KitchenSyncPart::openFile()
+{
+ return true;
+}
+
+void KitchenSyncPart::guiActivateEvent( KParts::GUIActivateEvent *e )
+{
+ KParts::ReadOnlyPart::guiActivateEvent( e );
+}
+
+#include "part.moc"
+
diff --git a/kitchensync/src/part.h b/kitchensync/src/part.h
new file mode 100644
index 000000000..f51ddd158
--- /dev/null
+++ b/kitchensync/src/part.h
@@ -0,0 +1,49 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef PART_H
+#define PART_H
+
+#include <kparts/event.h>
+#include <kparts/factory.h>
+#include <kparts/part.h>
+
+class KAboutData;
+
+class KitchenSyncPart: public KParts::ReadOnlyPart
+{
+ Q_OBJECT
+
+ public:
+ KitchenSyncPart( QWidget *parentWidget, const char *widgetName,
+ QObject *parent, const char *name, const QStringList& );
+ virtual ~KitchenSyncPart();
+
+ static KAboutData *createAboutData();
+
+ virtual void exit();
+ virtual bool openURL( const KURL &url );
+
+ protected:
+ virtual bool openFile();
+ virtual void guiActivateEvent( KParts::GUIActivateEvent* );
+};
+
+#endif
diff --git a/kitchensync/src/pics/Makefile.am b/kitchensync/src/pics/Makefile.am
new file mode 100644
index 000000000..ddb7cc451
--- /dev/null
+++ b/kitchensync/src/pics/Makefile.am
@@ -0,0 +1,4 @@
+kitchensyncicondir = $(kde_datadir)/kitchensync/icons
+kitchensyncicon_ICON = hotsync mobile_phone
+
+KDE_ICON = kitchensync
diff --git a/kitchensync/src/pics/cr128-app-mobile_phone.png b/kitchensync/src/pics/cr128-app-mobile_phone.png
new file mode 100644
index 000000000..732327e2b
--- /dev/null
+++ b/kitchensync/src/pics/cr128-app-mobile_phone.png
Binary files differ
diff --git a/kitchensync/src/pics/cr16-action-hotsync.png b/kitchensync/src/pics/cr16-action-hotsync.png
new file mode 100644
index 000000000..bdcaf824e
--- /dev/null
+++ b/kitchensync/src/pics/cr16-action-hotsync.png
Binary files differ
diff --git a/kitchensync/src/pics/cr16-app-mobile_phone.png b/kitchensync/src/pics/cr16-app-mobile_phone.png
new file mode 100644
index 000000000..3bfa3627c
--- /dev/null
+++ b/kitchensync/src/pics/cr16-app-mobile_phone.png
Binary files differ
diff --git a/kitchensync/src/pics/cr22-action-hotsync.png b/kitchensync/src/pics/cr22-action-hotsync.png
new file mode 100644
index 000000000..11eceb43b
--- /dev/null
+++ b/kitchensync/src/pics/cr22-action-hotsync.png
Binary files differ
diff --git a/kitchensync/src/pics/cr32-action-hotsync.png b/kitchensync/src/pics/cr32-action-hotsync.png
new file mode 100644
index 000000000..8316a1612
--- /dev/null
+++ b/kitchensync/src/pics/cr32-action-hotsync.png
Binary files differ
diff --git a/kitchensync/src/pics/cr32-app-mobile_phone.png b/kitchensync/src/pics/cr32-app-mobile_phone.png
new file mode 100644
index 000000000..161108041
--- /dev/null
+++ b/kitchensync/src/pics/cr32-app-mobile_phone.png
Binary files differ
diff --git a/kitchensync/src/pics/cr48-action-hotsync.png b/kitchensync/src/pics/cr48-action-hotsync.png
new file mode 100644
index 000000000..dfc98ff41
--- /dev/null
+++ b/kitchensync/src/pics/cr48-action-hotsync.png
Binary files differ
diff --git a/kitchensync/src/pics/cr48-app-mobile_phone.png b/kitchensync/src/pics/cr48-app-mobile_phone.png
new file mode 100644
index 000000000..82049813d
--- /dev/null
+++ b/kitchensync/src/pics/cr48-app-mobile_phone.png
Binary files differ
diff --git a/kitchensync/src/pics/cr64-app-mobile_phone.png b/kitchensync/src/pics/cr64-app-mobile_phone.png
new file mode 100644
index 000000000..527771f73
--- /dev/null
+++ b/kitchensync/src/pics/cr64-app-mobile_phone.png
Binary files differ
diff --git a/kitchensync/src/pics/hi16-app-kitchensync.png b/kitchensync/src/pics/hi16-app-kitchensync.png
new file mode 100644
index 000000000..bdcaf824e
--- /dev/null
+++ b/kitchensync/src/pics/hi16-app-kitchensync.png
Binary files differ
diff --git a/kitchensync/src/pics/hi22-app-kitchensync.png b/kitchensync/src/pics/hi22-app-kitchensync.png
new file mode 100644
index 000000000..11eceb43b
--- /dev/null
+++ b/kitchensync/src/pics/hi22-app-kitchensync.png
Binary files differ
diff --git a/kitchensync/src/pics/hi32-app-kitchensync.png b/kitchensync/src/pics/hi32-app-kitchensync.png
new file mode 100644
index 000000000..8316a1612
--- /dev/null
+++ b/kitchensync/src/pics/hi32-app-kitchensync.png
Binary files differ
diff --git a/kitchensync/src/pics/hi48-app-kitchensync.png b/kitchensync/src/pics/hi48-app-kitchensync.png
new file mode 100644
index 000000000..dfc98ff41
--- /dev/null
+++ b/kitchensync/src/pics/hi48-app-kitchensync.png
Binary files differ
diff --git a/kitchensync/src/pluginpicker.cpp b/kitchensync/src/pluginpicker.cpp
new file mode 100644
index 000000000..5fe4b5e81
--- /dev/null
+++ b/kitchensync/src/pluginpicker.cpp
@@ -0,0 +1,136 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "pluginpicker.h"
+
+#include "memberinfo.h"
+#include "syncprocessmanager.h"
+
+#include <libqopensync/environment.h>
+
+#include <kdialog.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <klocale.h>
+
+#include <qlabel.h>
+#include <qlayout.h>
+
+PluginItem::PluginItem( KWidgetList *list, const QSync::Plugin &plugin )
+ : KWidgetListItem( list ), mPlugin( plugin )
+{
+ QString iconName = MemberInfo::pluginIconName( mPlugin.name() );
+ QGridLayout *layout = new QGridLayout( this, 2, 2, KDialog::marginHint(), KDialog::spacingHint() );
+
+ QLabel *icon = new QLabel( this );
+ icon->setPixmap( KGlobal::iconLoader()->loadIcon( iconName, KIcon::Desktop ) );
+ icon->setFixedSize( icon->sizeHint() );
+
+ QLabel *name = new QLabel( plugin.longName(), this );
+ QLabel *description = new QLabel( plugin.description(), this );
+
+ QFont font = name->font();
+ font.setBold( true );
+ name->setFont( font );
+
+ layout->addWidget( icon, 0, 0 );
+ layout->addWidget( name, 0, 1 );
+ layout->addWidget( description, 1, 1 );
+}
+
+
+PluginPicker::PluginPicker( QWidget *parent )
+ : QWidget( parent )
+{
+ QBoxLayout *layout = new QVBoxLayout( this );
+
+ mPluginList = new KWidgetList( this );
+ layout->addWidget( mPluginList );
+
+ connect( mPluginList, SIGNAL( doubleClicked( KWidgetListItem* ) ),
+ SIGNAL( selected() ) );
+
+ updatePluginList();
+
+ mPluginList->setFocus();
+}
+
+void PluginPicker::updatePluginList()
+{
+ mPluginList->clear();
+
+ QSync::Environment *env = SyncProcessManager::self()->environment();
+
+ QSync::Environment::PluginIterator it( env->pluginBegin() );
+ for( ; it != env->pluginEnd(); ++it ) {
+ QSync::Plugin plugin = *it;
+ mPluginList->appendItem( new PluginItem( mPluginList, plugin ) );
+ }
+}
+
+QSync::Plugin PluginPicker::selectedPlugin() const
+{
+ PluginItem *item = static_cast<PluginItem *>( mPluginList->selectedItem() );
+ if ( item ) return item->plugin();
+ else return QSync::Plugin();
+}
+
+
+PluginPickerDialog::PluginPickerDialog( QWidget *parent )
+ : KDialogBase( parent, 0, true, i18n("Select Member Type"), Ok | Cancel )
+{
+ QFrame *topFrame = makeMainWidget();
+
+ QBoxLayout *topLayout = new QVBoxLayout( topFrame );
+
+ mPicker = new PluginPicker( topFrame );
+ topLayout->addWidget( mPicker );
+
+ connect( mPicker, SIGNAL( selected() ), SLOT( slotOk() ) );
+
+ setInitialSize( QSize( 460, 380 ) );
+}
+
+QSync::Plugin PluginPickerDialog::selectedPlugin() const
+{
+ return mPicker->selectedPlugin();
+}
+
+QSync::Plugin PluginPickerDialog::getPlugin( QWidget *parent )
+{
+ PluginPickerDialog dlg( parent );
+ if ( dlg.exec() )
+ return dlg.selectedPlugin();
+ else
+ return QSync::Plugin();
+}
+
+void PluginPickerDialog::slotOk()
+{
+ accept();
+}
+
+void PluginPickerDialog::slotCancel()
+{
+ reject();
+}
+
+#include "pluginpicker.moc"
diff --git a/kitchensync/src/pluginpicker.h b/kitchensync/src/pluginpicker.h
new file mode 100644
index 000000000..39630f448
--- /dev/null
+++ b/kitchensync/src/pluginpicker.h
@@ -0,0 +1,80 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+#ifndef PLUGINPICKER_H
+#define PLUGINPICKER_H
+
+#include <libqopensync/plugin.h>
+
+#include <kdialogbase.h>
+#include <kwidgetlist.h>
+
+#include <qwidget.h>
+
+class PluginItem : public KWidgetListItem
+{
+ public:
+ PluginItem( KWidgetList *, const QSync::Plugin & );
+
+ QSync::Plugin plugin() const { return mPlugin; }
+
+ private:
+ QSync::Plugin mPlugin;
+};
+
+class PluginPicker : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ PluginPicker( QWidget *parent );
+
+ QSync::Plugin selectedPlugin() const;
+
+ signals:
+ void selected();
+
+ protected:
+ void updatePluginList();
+
+ private:
+ KWidgetList *mPluginList;
+};
+
+class PluginPickerDialog : public KDialogBase
+{
+ Q_OBJECT
+
+ public:
+ PluginPickerDialog( QWidget *parent );
+
+ QSync::Plugin selectedPlugin() const;
+
+ static QSync::Plugin getPlugin( QWidget *parent );
+
+ protected slots:
+ void slotOk();
+ void slotCancel();
+
+ private:
+ PluginPicker *mPicker;
+};
+
+#endif
diff --git a/kitchensync/src/singleconflictdialog.cpp b/kitchensync/src/singleconflictdialog.cpp
new file mode 100644
index 000000000..53acba799
--- /dev/null
+++ b/kitchensync/src/singleconflictdialog.cpp
@@ -0,0 +1,123 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <kdialog.h>
+#include <klocale.h>
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+
+#include "addresseediffalgo.h"
+#include "genericdiffalgo.h"
+#include "htmldiffalgodisplay.h"
+#include "memberinfo.h"
+
+#include "singleconflictdialog.h"
+
+SingleConflictDialog::SingleConflictDialog( QSync::SyncMapping &mapping, QWidget *parent )
+ : ConflictDialog( mapping, parent ), mDiffAlgo( 0 )
+{
+ initGUI();
+
+ QString format = mapping.changeAt( 0 ).objectFormatName();
+ QSync::SyncChange leftChange = mapping.changeAt( 0 );
+ QSync::SyncChange rightChange = mapping.changeAt( 1 );
+
+ if ( format == "file" ) {
+ mDiffAlgo = new KSync::GenericDiffAlgo( leftChange.data(), rightChange.data() );
+ } else if ( format == "vcard" ) {
+ } else if ( format == "calendar" ) {
+ } else if ( format == "xml-contact" ) {
+ mDiffAlgo = new KSync::AddresseeDiffAlgo( leftChange.data(), rightChange.data() );
+ }
+
+ MemberInfo miLeft( leftChange.member() );
+ mDiffAlgoDisplay->setLeftSourceTitle( miLeft.name() );
+ MemberInfo miRight( rightChange.member() );
+ mDiffAlgoDisplay->setRightSourceTitle( miRight.name() );
+
+ if ( mDiffAlgo ) {
+ mDiffAlgo->addDisplay( mDiffAlgoDisplay );
+ mDiffAlgo->run();
+ }
+}
+
+SingleConflictDialog::~SingleConflictDialog()
+{
+ delete mDiffAlgo;
+ mDiffAlgo = 0;
+}
+
+void SingleConflictDialog::useFirstChange()
+{
+ mMapping.solve( mMapping.changeAt( 0 ) );
+
+ accept();
+}
+
+void SingleConflictDialog::useSecondChange()
+{
+ mMapping.solve( mMapping.changeAt( 1 ) );
+
+ accept();
+}
+
+void SingleConflictDialog::duplicateChange()
+{
+ mMapping.duplicate();
+
+ accept();
+}
+
+void SingleConflictDialog::ignoreChange()
+{
+ mMapping.ignore();
+
+ accept();
+}
+
+void SingleConflictDialog::initGUI()
+{
+ QGridLayout *layout = new QGridLayout( this, 3, 4, KDialog::marginHint(), KDialog::spacingHint() );
+
+ layout->addMultiCellWidget( new QLabel( i18n( "A conflict has appeared, please solve it manually." ), this ), 0, 0, 0, 3 );
+ mDiffAlgoDisplay = new KSync::HTMLDiffAlgoDisplay( this );
+
+ layout->addMultiCellWidget( mDiffAlgoDisplay, 1, 1, 0, 3 );
+
+ QPushButton *button = new QPushButton( i18n( "Use Item" ), this );
+ connect( button, SIGNAL( clicked() ), SLOT( useFirstChange() ) );
+ layout->addWidget( button, 2, 0 );
+
+ button = new QPushButton( i18n( "Duplicate Items" ), this );
+ connect( button, SIGNAL( clicked() ), SLOT( duplicateChange() ) );
+ layout->addWidget( button, 2, 1 );
+
+ button = new QPushButton( i18n( "Ignore Conflict" ), this );
+ connect( button, SIGNAL( clicked() ), SLOT( ignoreChange() ) );
+ layout->addWidget( button, 2, 2 );
+
+ button = new QPushButton( i18n( "Use Item" ), this );
+ connect( button, SIGNAL( clicked() ), SLOT( useSecondChange() ) );
+ layout->addWidget( button, 2, 3 );
+}
+
+#include "singleconflictdialog.moc"
diff --git a/kitchensync/src/singleconflictdialog.h b/kitchensync/src/singleconflictdialog.h
new file mode 100644
index 000000000..75e083895
--- /dev/null
+++ b/kitchensync/src/singleconflictdialog.h
@@ -0,0 +1,54 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SINGLECONFLICTDIALOG_H
+#define SINGLECONFLICTDIALOG_H
+
+#include "conflictdialog.h"
+#include <libkdepim/diffalgo.h>
+
+using namespace KPIM;
+
+namespace KSync {
+class HTMLDiffAlgoDisplay;
+}
+
+class SingleConflictDialog : public ConflictDialog
+{
+ Q_OBJECT
+
+ public:
+ SingleConflictDialog( QSync::SyncMapping &mapping, QWidget *parent );
+ ~SingleConflictDialog();
+
+ private slots:
+ void useFirstChange();
+ void useSecondChange();
+ void duplicateChange();
+ void ignoreChange();
+
+ private:
+ void initGUI();
+
+ DiffAlgo *mDiffAlgo;
+ KSync::HTMLDiffAlgoDisplay *mDiffAlgoDisplay;
+};
+
+#endif
diff --git a/kitchensync/src/syncprocess.cpp b/kitchensync/src/syncprocess.cpp
new file mode 100644
index 000000000..b52cc6db4
--- /dev/null
+++ b/kitchensync/src/syncprocess.cpp
@@ -0,0 +1,108 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <libqopensync/engine.h>
+#include <libqopensync/environment.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "syncprocess.h"
+#include "syncprocessmanager.h"
+
+using namespace QSync;
+
+SyncProcess::SyncProcess( const QSync::Group &group )
+ : QObject( 0, "SyncProcess" )
+{
+ mGroup = group;
+ mEngine = new QSync::Engine( mGroup );
+
+ Result result = mEngine->initialize();
+ if ( result.isError() )
+ kdDebug() << "SyncProcess::SyncProcess: " << result.message() << endl;
+}
+
+SyncProcess::~SyncProcess()
+{
+ mEngine->finalize();
+
+ delete mEngine;
+ mEngine = 0;
+}
+
+QString SyncProcess::groupStatus() const
+{
+ return i18n( "Ready" );
+}
+
+QString SyncProcess::memberStatus( const QSync::Member& ) const
+{
+ return i18n( "Ready" );
+}
+
+QSync::Result SyncProcess::addMember( const QSync::Plugin &plugin )
+{
+ QSync::Member member = mGroup.addMember();
+ QSync::Result result = member.instance( plugin );
+
+ if ( !result.isError() )
+ mGroup.save();
+
+ return result;
+}
+
+void SyncProcess::reinitEngine()
+{
+ mEngine->finalize();
+ delete mEngine;
+ mEngine = new QSync::Engine( mGroup );
+ Result result = mEngine->initialize();
+ if ( result.isError() )
+ kdDebug() << "SyncProcess::reinitEngine: " << result.message() << endl;
+
+ applyObjectTypeFilter();
+
+ emit engineChanged( mEngine );
+}
+
+void SyncProcess::applyObjectTypeFilter()
+{
+ const QSync::Conversion conversion = SyncProcessManager::self()->environment()->conversion();
+ const QStringList objectTypes = conversion.objectTypes();
+ const QStringList activeObjectTypes = mGroup.config().activeObjectTypes();
+
+ for ( uint i = 0; i < objectTypes.count(); ++i ) {
+ if ( activeObjectTypes.contains( objectTypes[ i ] ) ) {
+ kdDebug() << "Enabled object type: " << objectTypes[ i ] << endl;
+ /*
+ * This is not required. Also this lead to filtering problems when sync with "file-sync".
+ * Uncomment this line again when OpenSync is fixed!
+ *
+ * mGroup.setObjectTypeEnabled( objectTypes[ i ], true );
+ */
+ } else {
+ kdDebug() << "Disabled object type: " << objectTypes[ i ] << endl;
+ mGroup.setObjectTypeEnabled( objectTypes[ i ], false );
+ }
+ }
+}
+
+#include "syncprocess.moc"
diff --git a/kitchensync/src/syncprocess.h b/kitchensync/src/syncprocess.h
new file mode 100644
index 000000000..5b70a4b49
--- /dev/null
+++ b/kitchensync/src/syncprocess.h
@@ -0,0 +1,64 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SYNCPROCESS_H
+#define SYNCPROCESS_H
+
+#include <qobject.h>
+
+#include <libqopensync/group.h>
+
+namespace QSync {
+class Engine;
+}
+
+class SyncProcess : public QObject
+{
+ Q_OBJECT
+
+ public:
+ SyncProcess( const QSync::Group &group );
+ ~SyncProcess();
+
+ QSync::Group group() const { return mGroup; }
+ QSync::Engine* engine() const { return mEngine; }
+
+ QString groupStatus() const;
+ QString memberStatus( const QSync::Member &member ) const;
+
+ QSync::Result addMember( const QSync::Plugin &plugin );
+
+ void reinitEngine();
+
+ /** apply object type filter hack **/
+ void applyObjectTypeFilter();
+
+ signals:
+ /**
+ This signal is emitted whenever the engine has changed ( reinitialized ).
+ */
+ void engineChanged( QSync::Engine *engine );
+
+ private:
+ QSync::Group mGroup;
+ QSync::Engine *mEngine;
+};
+
+#endif
diff --git a/kitchensync/src/syncprocessmanager.cpp b/kitchensync/src/syncprocessmanager.cpp
new file mode 100644
index 000000000..f2cb1ab0a
--- /dev/null
+++ b/kitchensync/src/syncprocessmanager.cpp
@@ -0,0 +1,172 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
+#include "syncprocessmanager.h"
+
+#include "syncprocess.h"
+
+#include <libqopensync/environment.h>
+
+#include <kstaticdeleter.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+
+static KStaticDeleter<SyncProcessManager> selfDeleter;
+
+SyncProcessManager *SyncProcessManager::mSelf = 0;
+
+SyncProcessManager *SyncProcessManager::self()
+{
+ if ( !mSelf ) {
+ selfDeleter.setObject( mSelf, new SyncProcessManager() );
+ }
+ return mSelf;
+}
+
+SyncProcessManager::SyncProcessManager()
+{
+ mEnvironment = new QSync::Environment;
+ QSync::Result result = mEnvironment->initialize();
+ if ( result.isError() ) {
+ KMessageBox::error( 0, i18n("Error initializing OpenSync.\n%1")
+ .arg( result.message() ) );
+ } else {
+ init( mEnvironment );
+ }
+}
+
+SyncProcessManager::~SyncProcessManager()
+{
+ QValueList<SyncProcess*>::Iterator it;
+ for ( it = mProcesses.begin(); it != mProcesses.end(); ++it )
+ delete *it;
+
+ mProcesses.clear();
+
+ mEnvironment->finalize();
+ delete mEnvironment;
+}
+
+int SyncProcessManager::count() const
+{
+ return mProcesses.count();
+}
+
+SyncProcess* SyncProcessManager::at( int pos ) const
+{
+ if ( pos < 0 || pos >= (int)mProcesses.count() )
+ return 0;
+
+ return mProcesses[ pos ];
+}
+
+SyncProcess* SyncProcessManager::byGroup( const QSync::Group &group )
+{
+ QValueList<SyncProcess*>::Iterator it;
+ for ( it = mProcesses.begin(); it != mProcesses.end(); ++it )
+ if ( (*it)->group() == group )
+ return *it;
+
+ return 0;
+}
+
+SyncProcess* SyncProcessManager::byGroupName( const QString &name )
+{
+ QValueList<SyncProcess*>::Iterator it;
+ for ( it = mProcesses.begin(); it != mProcesses.end(); ++it )
+ if ( (*it)->group().name() == name )
+ return *it;
+
+ return 0;
+}
+
+void SyncProcessManager::addGroup( const QString &name )
+{
+ SyncProcess* process = byGroupName( name );
+ if ( !process ) {
+ QSync::Group group = mEnvironment->addGroup();
+ group.setName( name );
+ group.save();
+
+ mProcesses.append( new SyncProcess( group ) );
+
+ emit changed();
+ } else
+ qDebug( "Try to add duplicate" );
+}
+
+void SyncProcessManager::remove( SyncProcess *syncProcess )
+{
+ if ( syncProcess ) {
+ mProcesses.remove( syncProcess );
+ const QSync::Group group = syncProcess->group();
+ delete syncProcess;
+
+ mEnvironment->removeGroup( group );
+
+ emit changed();
+ }
+}
+
+void SyncProcessManager::init( QSync::Environment *environment )
+{
+ QSync::Environment::GroupIterator it( environment->groupBegin() );
+ for ( ; it != environment->groupEnd(); ++it ) {
+ /**
+ * We check whether the group is valid before we append them
+ * to mProcesses. That avoids crashes if the plugin of one of
+ * the members isn't loaded (e.g. not installed).
+ */
+ const QSync::Group group = *it;
+ int count = group.memberCount();
+
+ bool isValid = true;
+ for ( int i = 0; i < count; ++i ) {
+ const QSync::Member member = group.memberAt( i );
+
+ if ( !member.isValid() ) {
+ isValid = false;
+ break;
+ }
+ }
+
+ if ( isValid )
+ mProcesses.append( new SyncProcess( *it ) );
+ }
+
+ emit changed();
+}
+
+QSync::Result SyncProcessManager::addMember( SyncProcess *process,
+ const QSync::Plugin &plugin )
+{
+ Q_ASSERT( process );
+
+ QSync::Result result = process->addMember( plugin );
+ if ( !result.isError() ) {
+ process->group().save();
+ emit syncProcessChanged( process );
+ }
+
+ return result;
+}
+
+#include "syncprocessmanager.moc"
diff --git a/kitchensync/src/syncprocessmanager.h b/kitchensync/src/syncprocessmanager.h
new file mode 100644
index 000000000..488312939
--- /dev/null
+++ b/kitchensync/src/syncprocessmanager.h
@@ -0,0 +1,100 @@
+/*
+ This file is part of KitchenSync.
+
+ Copyright (c) 2005 Cornelius Schumacher <schumacher@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+#ifndef SYNCPROCESSMANAGER_H
+#define SYNCPROCESSMANAGER_H
+
+#include <qobject.h>
+
+#include <libqopensync/group.h>
+
+namespace QSync {
+class Environment;
+}
+
+class SyncProcess;
+
+class SyncProcessManager : public QObject
+{
+ Q_OBJECT
+ public:
+ static SyncProcessManager *self();
+
+ /**
+ Destroys the SyncProcessList.
+ */
+ ~SyncProcessManager();
+
+ /**
+ Return OpenSync Environment.
+ */
+ QSync::Environment *environment() const { return mEnvironment; }
+
+ /**
+ Returns the number of SyncProcesses.
+ */
+ int count() const;
+
+ /**
+ Returns the SyncProcess at position @param pos.
+ */
+ SyncProcess* at( int pos ) const;
+
+ /**
+ Returns the SyncProcess with the given @param group.
+ */
+ SyncProcess* byGroup( const QSync::Group &group );
+
+ /**
+ Returns the SyncProcess with the given group @param name.
+ */
+ SyncProcess* byGroupName( const QString &name );
+
+ /**
+ Adds a group with given @param name.
+ */
+ void addGroup( const QString &name );
+
+ /**
+ Removes the given @param sync process.
+ */
+ void remove( SyncProcess *syncProcess );
+
+ /**
+ Adds @param plugin instance as member to the group of @param process.
+ */
+ QSync::Result addMember( SyncProcess *process, const QSync::Plugin &plugin );
+
+ signals:
+ void changed();
+ void syncProcessChanged( SyncProcess *process );
+
+ private:
+ SyncProcessManager();
+
+ void init( QSync::Environment *environment );
+
+ QValueList<SyncProcess*> mProcesses;
+ QSync::Environment *mEnvironment;
+
+ static SyncProcessManager *mSelf;
+};
+
+#endif