Part 2/2 of Chakra patch commit

git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1172727 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
v3.5.13-sru
tpearson 14 years ago
parent 009631d0fc
commit d8b40941f9

@ -1,7 +1,7 @@
if test "$HAVE_OPENSYNC" = 0 -o "$HAVE_OPENSYNC_ENGINE" = 0; then if test "$HAVE_OPENSYNC" = 0; then
echo "" echo ""
echo "You're missing a compatible version of libopensync." echo "You're missing a compatible version of libopensync."
echo "Version 0.19 or greater is needed." echo "Version 0.31 or greater is needed."
echo "kitchensync will not be built." echo "kitchensync will not be built."
echo "" echo ""
all_tests=bad all_tests=bad

@ -29,9 +29,7 @@ export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:$prefix/lib/pkgconfig:/usr/local/lib/p
HAVE_OPENSYNC=0 HAVE_OPENSYNC=0
HAVE_OPENSYNC_ENGINE=0 PKG_CHECK_MODULES(OPENSYNC, opensync-1.0 >= 0.33, HAVE_OPENSYNC=1,HAVE_OPENSYNC=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(LIBXML, libxml-2.0, , HAVE_OPENSYNC=0)
PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.6, , HAVE_OPENSYNC=0) PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.6, , HAVE_OPENSYNC=0)
@ -52,9 +50,9 @@ AC_SUBST(OPENSYNC_FORMATSDIR)
AC_SUBST(OPENSYNC_HEADERDIR) AC_SUBST(OPENSYNC_HEADERDIR)
dnl Check if we can compile KitchenSync dnl Check if we can compile KitchenSync
AM_CONDITIONAL(compile_kitchensync, test "$HAVE_OPENSYNC" = 1 -a "$HAVE_OPENSYNC_ENGINE" = 1) AM_CONDITIONAL(compile_kitchensync, test "$HAVE_OPENSYNC" = 1)
if test "$HAVE_OPENSYNC" = 1 -a "$HAVE_OPENSYNC_ENGINE" = 1 ; then if test "$HAVE_OPENSYNC" = 1; then
AC_MSG_RESULT([found]) AC_MSG_RESULT([found])
else else
AC_MSG_RESULT([not found]) AC_MSG_RESULT([not found])

@ -2,16 +2,20 @@ INCLUDES = -I$(top_srcdir)/kitchensync/src \
-I$(top_srcdir)/kitchensync \ -I$(top_srcdir)/kitchensync \
-I$(top_srcdir) \ -I$(top_srcdir) \
$(OPENSYNC_CFLAGS) \ $(OPENSYNC_CFLAGS) \
$(OPENSYNCENGINE_CFLAGS) \ $(GLIB_CFLAGS) \
$(all_includes) $(all_includes)
lib_LTLIBRARIES = libqopensync.la lib_LTLIBRARIES = libqopensync.la
libqopensync_la_SOURCES = callbackhandler.cpp conversion.cpp engine.cpp environment.cpp filter.cpp group.cpp \ libqopensync_la_SOURCES = callbackhandler.cpp engine.cpp groupenv.cpp pluginenv.cpp filter.cpp group.cpp \
member.cpp plugin.cpp result.cpp syncmapping.cpp syncupdates.cpp \ member.cpp plugin.cpp result.cpp syncmapping.cpp syncupdates.cpp \
syncchange.cpp syncchange.cpp
libqopensync_la_LDFLAGS = $(all_libraries) $(KDE_RPATH) -no-undefined
libqopensync_la_LIBADD = $(LIB_KDEUI) $(OPENSYNC_LIBS) $(OPENSYNCENGINE_LIBS) # FIXME: -no-undefined break the build for some unkown reason - libopensync broken?!
#libqopensync_la_LDFLAGS = $(all_libraries) $(KDE_RPATH) -no-undefined
libqopensync_la_LDFLAGS = $(all_libraries) $(KDE_RPATH)
libqopensync_la_LIBADD = $(LIB_KDEUI) $(OPENSYNC_LIBS)
METASOURCES = AUTO METASOURCES = AUTO

@ -19,12 +19,13 @@
Boston, MA 02110-1301, USA. Boston, MA 02110-1301, USA.
*/ */
#include <osengine/engine.h> #include <opensync/opensync.h>
#include <opensync/opensync-engine.h>
#include <libqopensync/engine.h>
#include <tqapplication.h> #include <tqapplication.h>
#include "engine.h"
#include "callbackhandler.h" #include "callbackhandler.h"
using namespace QSync; using namespace QSync;
@ -111,11 +112,11 @@ void CallbackHandler::setEngine( Engine *engine )
{ {
mEngine = engine; mEngine = engine;
osengine_set_conflict_callback( engine->mEngine, &conflict_callback, this ); osync_engine_set_conflict_callback( engine->mEngine, &conflict_callback, this );
osengine_set_changestatus_callback( engine->mEngine, &change_callback, this ); osync_engine_set_changestatus_callback( engine->mEngine, &change_callback, this );
osengine_set_mappingstatus_callback( engine->mEngine, &mapping_callback, this ); osync_engine_set_mappingstatus_callback( engine->mEngine, &mapping_callback, this );
osengine_set_enginestatus_callback( engine->mEngine, &engine_callback, this ); osync_engine_set_enginestatus_callback( engine->mEngine, &engine_callback, this );
osengine_set_memberstatus_callback( engine->mEngine, &member_callback, this ); osync_engine_set_memberstatus_callback( engine->mEngine, &member_callback, this );
} }
Engine* CallbackHandler::engine() const Engine* CallbackHandler::engine() const
@ -143,7 +144,7 @@ void CallbackHandler::customEvent( TQCustomEvent *event )
} }
} }
void CallbackHandler::conflict_callback( OSyncEngine *engine, OSyncMapping *omapping, void *data ) void CallbackHandler::conflict_callback( OSyncEngine *engine, OSyncMappingEngine *omapping, void *data )
{ {
SyncMapping mapping( omapping, engine ); SyncMapping mapping( omapping, engine );
@ -152,7 +153,7 @@ void CallbackHandler::conflict_callback( OSyncEngine *engine, OSyncMapping *omap
TQApplication::postEvent( handler, new ConflictEvent( mapping ) ); TQApplication::postEvent( handler, new ConflictEvent( mapping ) );
} }
void CallbackHandler::change_callback( OSyncEngine*, OSyncChangeUpdate *update, void *data ) void CallbackHandler::change_callback( OSyncChangeUpdate *update, void *data )
{ {
SyncChangeUpdate change( update ); SyncChangeUpdate change( update );
@ -170,7 +171,7 @@ void CallbackHandler::mapping_callback( OSyncMappingUpdate *update, void *data )
TQApplication::postEvent( handler, new MappingEvent( mapping ) ); TQApplication::postEvent( handler, new MappingEvent( mapping ) );
} }
void CallbackHandler::engine_callback( OSyncEngine*, OSyncEngineUpdate *update, void *data ) void CallbackHandler::engine_callback( OSyncEngineUpdate *update, void *data )
{ {
SyncEngineUpdate engine( update ); SyncEngineUpdate engine( update );

@ -76,10 +76,10 @@ class CallbackHandler : public QObject
class EngineEvent; class EngineEvent;
class MemberEvent; class MemberEvent;
static void conflict_callback( OSyncEngine*, OSyncMapping*, void* ); static void conflict_callback( OSyncEngine*, OSyncMappingEngine*, void* );
static void change_callback( OSyncEngine*, OSyncChangeUpdate*, void* ); static void change_callback( OSyncChangeUpdate*, void* );
static void mapping_callback( OSyncMappingUpdate*, void* ); static void mapping_callback( OSyncMappingUpdate*, void* );
static void engine_callback( OSyncEngine*, OSyncEngineUpdate*, void* ); static void engine_callback( OSyncEngineUpdate*, void* );
static void member_callback( OSyncMemberUpdate*, void* ); static void member_callback( OSyncMemberUpdate*, void* );
Engine* mEngine; Engine* mEngine;

@ -20,6 +20,7 @@
*/ */
#include <opensync/opensync.h> #include <opensync/opensync.h>
#include <opensync/opensync-format.h>
#include "conversion.h" #include "conversion.h"
@ -43,16 +44,20 @@ TQStringList Conversion::objectTypes() const
{ {
Q_ASSERT( mEnvironment ); Q_ASSERT( mEnvironment );
OSyncFormatEnv *formatEnv = osync_conv_env_new( mEnvironment ); OSyncError *error = NULL;
OSyncFormatEnv *formatEnv = osync_format_env_new( &error );
Q_ASSERT( formatEnv ); Q_ASSERT( formatEnv );
osync_format_env_load_plugins(formatEnv, NULL, &error);
TQStringList types; TQStringList types;
for ( int i = 0; i < osync_conv_num_objtypes( formatEnv ); i++ ) {
OSyncObjType *type = osync_conv_nth_objtype( formatEnv, i );
types.append( TQString::fromUtf8( osync_objtype_get_name( type ) ) );
}
osync_conv_env_free( formatEnv ); for (int i = 0; i < osync_format_env_num_objformats(formatEnv); i++) {
OSyncObjFormat *format = osync_format_env_nth_objformat(formatEnv, i);
types.append( TQString::fromUtf8( osync_objformat_get_objtype(format) ) );
}
osync_format_env_free( formatEnv );
return types; return types;
} }

@ -24,13 +24,13 @@
#include <tqstringlist.h> #include <tqstringlist.h>
class OSyncEnv; class OSyncGroupEnv;
namespace QSync { namespace QSync {
class Conversion class Conversion
{ {
friend class Environment; friend class PluginEnv;
public: public:
Conversion(); Conversion();
@ -47,7 +47,7 @@ class Conversion
TQStringList objectTypes() const; TQStringList objectTypes() const;
private: private:
OSyncEnv *mEnvironment; OSyncGroupEnv *mGroupEnv;
}; };
} }

@ -20,7 +20,11 @@
*/ */
#include <opensync/opensync.h> #include <opensync/opensync.h>
#include <osengine/engine.h> #include <opensync/opensync-engine.h>
#include "group.h"
#include "member.h"
#include "result.h"
#include "engine.h" #include "engine.h"
@ -29,19 +33,21 @@ using namespace QSync;
Engine::Engine( const Group &group ) Engine::Engine( const Group &group )
{ {
OSyncError *error = 0; OSyncError *error = 0;
mEngine = osengine_new( group.mGroup, &error ); mEngine = osync_engine_new( group.mGroup, &error );
} }
Engine::~Engine() Engine::~Engine()
{ {
osengine_free( mEngine ); osync_engine_unref( mEngine );
mEngine = 0; mEngine = 0;
} }
Result Engine::initialize() Result Engine::initialize()
{ {
Q_ASSERT( mEngine );
OSyncError *error = 0; OSyncError *error = 0;
if ( !osengine_init( mEngine, &error ) ) if ( !osync_engine_initialize ( mEngine, &error ) )
return Result( &error ); return Result( &error );
else else
return Result(); return Result();
@ -49,13 +55,29 @@ Result Engine::initialize()
void Engine::finalize() void Engine::finalize()
{ {
osengine_finalize( mEngine ); Q_ASSERT( mEngine );
OSyncError *error = 0;
osync_engine_finalize( mEngine , &error );
} }
Result Engine::synchronize() Result Engine::synchronize()
{ {
Q_ASSERT( mEngine );
OSyncError *error = 0; OSyncError *error = 0;
if ( !osengine_synchronize( mEngine, &error ) ) if ( !osync_engine_synchronize( mEngine, &error ) )
return Result( &error );
else
return Result();
}
Result Engine::discover( const Member &member )
{
Q_ASSERT( mEngine );
OSyncError *error = 0;
if ( !osync_engine_discover_and_block( mEngine, member.mMember, &error ) )
return Result( &error ); return Result( &error );
else else
return Result(); return Result();
@ -63,5 +85,9 @@ Result Engine::synchronize()
void Engine::abort() void Engine::abort()
{ {
osengine_abort( mEngine ); Q_ASSERT( mEngine );
// TODO
// osync_engine_abort( mEngine );
} }

@ -22,12 +22,14 @@
#ifndef QSYNC_ENGINE_H #ifndef QSYNC_ENGINE_H
#define QSYNC_ENGINE_H #define QSYNC_ENGINE_H
#include <libqopensync/group.h>
class OSyncEngine; class OSyncEngine;
namespace QSync { namespace QSync {
class Group;
class Member;
class Result;
class Engine class Engine
{ {
friend class CallbackHandler; friend class CallbackHandler;
@ -58,6 +60,11 @@ class Engine
*/ */
Result synchronize(); Result synchronize();
/**
Starts the discover process for a certain member.
*/
Result discover( const Member &member );
/** /**
Stops the synchronization process. Stops the synchronization process.
*/ */

@ -20,6 +20,7 @@
*/ */
#include <opensync/opensync.h> #include <opensync/opensync.h>
#include <opensync/opensync-format.h>
#include "filter.h" #include "filter.h"

@ -25,86 +25,18 @@
/** hack includes **/ /** hack includes **/
#include <opensync/opensync.h> #include <opensync/opensync.h>
#include <opensync/opensync-group.h>
#include "conversion.h" #include "conversion.h"
#include "filter.h"
#include "member.h"
#include "plugin.h"
#include "result.h"
#include "group.h" #include "group.h"
using namespace QSync; 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 )
{
}
TQStringList GroupConfig::activeObjectTypes() const
{
Q_ASSERT( mGroup );
const TQString fileName = TQString( "%1/filter.conf" ).arg( osync_group_get_configdir( mGroup ) );
TQFile file( fileName );
if ( !file.open( IO_ReadOnly ) )
return TQStringList();
TQDomDocument document;
TQString message;
if ( !document.setContent( &file, &message ) ) {
qDebug( "Error on loading %s: %s", fileName.latin1(), message.latin1() );
return TQStringList();
}
file.close();
TQStringList objectTypes;
TQDomElement element = document.documentElement();
TQDomNode node = element.firstChild();
while ( !node.isNull() ) {
TQDomElement childElement = node.toElement();
if ( !childElement.isNull() )
objectTypes.append( childElement.tagName() );
node = node.nextSibling();
}
return objectTypes;
}
void GroupConfig::setActiveObjectTypes( const TQStringList &objectTypes )
{
Q_ASSERT( mGroup );
TQDomDocument document( "Filter" );
document.appendChild( document.createProcessingInstruction(
"xml", "version=\"1.0\" encoding=\"UTF-8\"" ) );
TQDomElement element = document.createElement( "filter" );
document.appendChild( element );
for ( uint i = 0; i < objectTypes.count(); ++i ) {
TQDomElement entry = document.createElement( objectTypes[ i ] );
element.appendChild( entry );
}
const TQString fileName = TQString( "%1/filter.conf" ).arg( osync_group_get_configdir( mGroup ) );
TQFile file( fileName );
if ( !file.open( IO_WriteOnly ) )
return;
TQTextStream s( &file );
s.setEncoding( TQTextStream::UnicodeUTF8 );
s << document.toString();
file.close();
}
Group::Group() Group::Group()
: mGroup( 0 ) : mGroup( 0 )
{ {
@ -119,22 +51,6 @@ bool Group::isValid() const
return ( mGroup != 0 ); 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 TQString &name ) void Group::setName( const TQString &name )
{ {
Q_ASSERT( mGroup ); Q_ASSERT( mGroup );
@ -188,18 +104,22 @@ Group::LockType Group::lock()
} }
} }
void Group::unlock( bool removeFile ) void Group::unlock()
{ {
Q_ASSERT( mGroup ); Q_ASSERT( mGroup );
osync_group_unlock( mGroup, removeFile ); osync_group_unlock( mGroup );
} }
Member Group::addMember() Member Group::addMember( const QSync::Plugin &plugin )
{ {
Q_ASSERT( mGroup ); Q_ASSERT( mGroup );
OSyncMember *omember = osync_member_new( mGroup ); OSyncError *error = 0;
OSyncMember *omember = osync_member_new( &error );
osync_group_add_member( mGroup, omember );
osync_member_set_pluginname( omember, plugin.name().utf8() );
Member member; Member member;
member.mMember = omember; member.mMember = omember;
@ -269,6 +189,30 @@ Result Group::save()
return Result(); return Result();
} }
void Group::setUseMerger( bool use )
{
Q_ASSERT( mGroup );
osync_group_set_merger_enabled( mGroup, use );
}
bool Group::useMerger() const
{
Q_ASSERT( mGroup );
return osync_group_get_merger_enabled( mGroup );
}
void Group::setUseConverter( bool use )
{
Q_ASSERT( mGroup );
osync_group_set_converter_enabled( mGroup, use );
}
bool Group::useConverter() const
{
Q_ASSERT( mGroup );
return osync_group_get_converter_enabled( mGroup );
}
void Group::setObjectTypeEnabled( const TQString &objectType, bool enabled ) void Group::setObjectTypeEnabled( const TQString &objectType, bool enabled )
{ {
Q_ASSERT( mGroup ); Q_ASSERT( mGroup );
@ -281,12 +225,13 @@ bool Group::isObjectTypeEnabled( const TQString &objectType ) const
return osync_group_objtype_enabled( mGroup, objectType.utf8() ); return osync_group_objtype_enabled( mGroup, objectType.utf8() );
} }
GroupConfig Group::config() const Result Group::cleanup() const
{ {
Q_ASSERT( mGroup ); Q_ASSERT( mGroup );
GroupConfig config; OSyncError *error = 0;
config.mGroup = mGroup; if ( !osync_group_delete( mGroup, &error ) )
return Result( &error );
return config; else
return Result();
} }

@ -25,35 +25,22 @@
#include <tqdatetime.h> #include <tqdatetime.h>
#include <tqstringlist.h> #include <tqstringlist.h>
#include <libqopensync/filter.h>
#include <libqopensync/member.h>
class OSyncGroup; class OSyncGroup;
namespace QSync { namespace QSync {
class Filter;
class Member;
class Plugin;
class Result;
/** /**
@internal @internal
*/ */
class GroupConfig
{
friend class Group;
public:
GroupConfig();
TQStringList activeObjectTypes() const;
void setActiveObjectTypes( const TQStringList &objectTypes );
private:
OSyncGroup *mGroup;
};
class Group class Group
{ {
friend class Engine; friend class Engine;
friend class Environment; friend class GroupEnv;
public: public:
enum LockType enum LockType
@ -71,51 +58,6 @@ class Group
*/ */
bool isValid() const; 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. Sets the name of the group.
*/ */
@ -145,17 +87,15 @@ class Group
/** /**
Unlocks the group. Unlocks the group.
@param removeFile Whether the lock file shall be removed.
*/ */
void unlock( bool removeFile = true ); void unlock();
/** /**
Adds a new member to the group. Adds a new member to the group.
@returns the new member. @returns the new member.
*/ */
Member addMember(); Member addMember( const QSync::Plugin &plugin );
/** /**
Removes a member from the group. Removes a member from the group.
@ -195,19 +135,37 @@ class Group
bool isObjectTypeEnabled( const TQString &objectType ) const; bool isObjectTypeEnabled( const TQString &objectType ) const;
/** /**
Saves the configuration to hard disc. Sets whether this group uses the merger for synchronization.
*/ */
Result save(); void setUseMerger( bool use );
/**
Returns whether this group uses the merger for synchronization.
*/
bool useMerger() const;
/**
Sets whether this group uses the converter for synchronization.
*/
void setUseConverter( bool use );
/** /**
Returns the config object of this group. Returns whether this group uses the converter for synchronization.
*/
bool useConverter() const;
Note: This method is only available for OpenSync 0.19 and 0.20. /**
Saves the configuration to hard disc.
*/ */
GroupConfig config() const; Result save();
bool operator==( const Group &group ) const { return mGroup == group.mGroup; } bool operator==( const Group &group ) const { return mGroup == group.mGroup; }
/**
Removes all group configurations from the hard disc.
*/
Result cleanup() const;
private: private:
OSyncGroup *mGroup; OSyncGroup *mGroup;
}; };

@ -0,0 +1,121 @@
/*
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 <opensync/opensync-group.h>
#include "group.h"
#include "result.h"
#include "groupenv.h"
using namespace QSync;
GroupEnv::GroupEnv()
{
OSyncError *error = 0;
mGroupEnv = osync_group_env_new( &error );
}
GroupEnv::~GroupEnv()
{
osync_group_env_free( mGroupEnv );
}
Result GroupEnv::initialize()
{
Q_ASSERT( mGroupEnv );
OSyncError *error = 0;
if ( !osync_group_env_load_groups( mGroupEnv, NULL, &error ) )
return Result( &error );
else
return Result();
}
void GroupEnv::finalize()
{
}
int GroupEnv::groupCount() const
{
Q_ASSERT( mGroupEnv );
return osync_group_env_num_groups( mGroupEnv );
}
Group GroupEnv::groupAt( int pos ) const
{
Q_ASSERT( mGroupEnv );
Group group;
if ( pos < 0 || pos >= groupCount() )
return group;
OSyncGroup *ogroup = osync_group_env_nth_group( mGroupEnv, pos );
group.mGroup = ogroup;
return group;
}
Group GroupEnv::groupByName( const TQString &name ) const
{
Q_ASSERT( mGroupEnv );
Group group;
OSyncGroup *ogroup = osync_group_env_find_group( mGroupEnv, name.latin1() );
if ( ogroup )
group.mGroup = ogroup;
return group;
}
Group GroupEnv::addGroup( const TQString &name )
{
Q_ASSERT( mGroupEnv );
Group group;
OSyncError *error = 0;
OSyncGroup *ogroup = osync_group_new( &error );
if ( ogroup )
group.mGroup = ogroup;
group.setName( name );
if ( !osync_group_env_add_group( mGroupEnv, ogroup, &error ) ) {
Result res( &error );
qDebug( "Error on adding group: %s", res.message().latin1() );
}
return group;
}
void GroupEnv::removeGroup( const Group &group )
{
Q_ASSERT( mGroupEnv );
group.cleanup();
osync_group_env_remove_group( mGroupEnv, group.mGroup );
}

@ -0,0 +1,86 @@
/*
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_GROUPENV_H
#define OSYNC_GROUPENV_H
#include <tqstring.h>
struct OSyncGroupEnv;
namespace QSync {
class Group;
class Result;
class GroupEnv
{
public:
GroupEnv();
~GroupEnv();
/**
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.
*/
void 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 TQString &name ) const;
/**
Adds a new group to the environment.
@returns the new group.
*/
Group addGroup( const TQString &name );
/**
Removes a group from the environment.
*/
void removeGroup( const Group &group );
private:
OSyncGroupEnv *mGroupEnv;
};
}
#endif

@ -20,8 +20,12 @@
*/ */
#include <opensync/opensync.h> #include <opensync/opensync.h>
#include <opensync/opensync-group.h>
#include <stdlib.h> #include <stdlib.h>
#include "result.h"
#include "member.h" #include "member.h"
using namespace QSync; using namespace QSync;
@ -42,9 +46,9 @@ bool Member::isValid() const
if ( !mMember ) if ( !mMember )
return false; return false;
if ( !osync_member_instance_plugin( mMember, pluginName().utf8(), &error ) ) { if ( !osync_member_load( mMember, configurationDirectory().utf8(), &error ) ) {
qDebug( "Plugin %s is not valid: %s", pluginName().latin1(), osync_error_print( &error ) ); qDebug( "Plugin %s is not valid: %s", pluginName().latin1(), osync_error_print( &error ) );
osync_error_free( &error ); osync_error_unref( &error );
return false; return false;
} }
@ -65,19 +69,6 @@ TQString Member::pluginName() const
return TQString::fromLatin1( osync_member_get_pluginname( mMember ) ); return TQString::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 int Member::id() const
{ {
Q_ASSERT( mMember ); Q_ASSERT( mMember );
@ -103,26 +94,27 @@ void Member::setConfiguration( const TQByteArray &configurationData )
{ {
Q_ASSERT( mMember ); Q_ASSERT( mMember );
osync_member_set_config( mMember, configurationData.data(), configurationData.size() ); osync_member_set_config( mMember, configurationData.data() );
} }
Result Member::configuration( TQByteArray &configurationData, bool useDefault ) Result Member::configuration( TQByteArray &configurationData, bool useDefault )
{ {
Q_ASSERT( mMember ); Q_ASSERT( mMember );
char *data; const char *data;
int size; int size = 0;
OSyncError *error = 0; OSyncError *error = 0;
osync_bool ok = false;
if ( useDefault ) if ( useDefault )
ok = osync_member_get_config_or_default( mMember, &data, &size, &error ); data = osync_member_get_config_or_default( mMember, &error );
else else
ok = osync_member_get_config( mMember, &data, &size, &error ); data = osync_member_get_config( mMember, &error );
if ( !ok ) {
if ( !data ) {
return Result( &error ); return Result( &error );
} else { } else {
size = strlen(data);
configurationData.resize( size ); configurationData.resize( size );
memcpy( configurationData.data(), data, size ); memcpy( configurationData.data(), data, size );
@ -141,10 +133,10 @@ Result Member::save()
return Result(); return Result();
} }
Result Member::instance( const Plugin &plugin ) Result Member::instance()
{ {
OSyncError *error = 0; OSyncError *error = 0;
if ( !osync_member_instance_plugin( mMember, plugin.name().utf8(), &error ) ) if ( !osync_member_load( mMember, configurationDirectory().utf8(), &error ) )
return Result( &error ); return Result( &error );
else else
return Result(); return Result();
@ -155,34 +147,13 @@ bool Member::operator==( const Member &member ) const
return mMember == member.mMember; return mMember == member.mMember;
} }
TQString Member::scanDevices( const TQString &query ) Result Member::cleanup() const
{
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 TQString();
} else {
TQString xml = TQString::fromUtf8( data );
free( data );
return xml;
}
}
bool Member::testConnection( const TQString &configuration )
{ {
Q_ASSERT( mMember ); Q_ASSERT( mMember );
OSyncError *error = 0; OSyncError *error = 0;
int *result = (int*)osync_member_call_plugin( mMember, "test_connection", const_cast<char*>( configuration.utf8().data() ), &error ); if ( !osync_member_delete( mMember, &error ) )
if ( error != 0 ) { return Result( &error );
osync_error_free( &error ); else
return false; return Result();
} else {
bool value = ( *result == 1 ? true : false );
free( result );
return value;
}
} }

@ -22,19 +22,21 @@
#ifndef QSYNC_MEMBER_H #ifndef QSYNC_MEMBER_H
#define QSYNC_MEMBER_H #define QSYNC_MEMBER_H
#include <libqopensync/plugin.h> #include <tqstring.h>
#include <libqopensync/result.h>
#include <libqopensync/plugin.h>
class OSyncMember; class OSyncMember;
namespace QSync { namespace QSync {
class Result;
class Member class Member
{ {
friend class Group; friend class Group;
friend class Engine;
friend class SyncChange; friend class SyncChange;
friend class SyncMemberUpdate; friend class SyncMemberUpdate;
friend class SyncChangeUpdate;
public: public:
Member(); Member();
@ -55,11 +57,6 @@ class Member
*/ */
TQString pluginName() const; TQString pluginName() const;
/**
Returns the plugin, the member belongs to.
*/
Plugin plugin() const;
/** /**
Returns the id of the plugin. Returns the id of the plugin.
*/ */
@ -102,7 +99,7 @@ class Member
/** /**
Make this member an instance of the given plugin. Make this member an instance of the given plugin.
*/ */
Result instance( const Plugin & ); Result instance();
bool operator==( const Member& ) const; bool operator==( const Member& ) const;
@ -119,6 +116,12 @@ class Member
*/ */
bool testConnection( const TQString &configuration ); bool testConnection( const TQString &configuration );
/**
* Deletes the member's information from the hard disc.
*/
Result cleanup() const;
private: private:
OSyncMember *mMember; OSyncMember *mMember;
}; };

@ -20,6 +20,7 @@
*/ */
#include <opensync/opensync.h> #include <opensync/opensync.h>
#include <opensync/opensync-plugin.h>
#include "plugin.h" #include "plugin.h"

@ -30,7 +30,7 @@ namespace QSync {
class Plugin class Plugin
{ {
friend class Environment; friend class PluginEnv;
friend class Member; friend class Member;
public: public:

@ -0,0 +1,96 @@
/*
This file is part of libqopensync.
Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
Copyright (c) 2007 Daniel Gollub <dgollub@suse.de>
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 <opensync/opensync-plugin.h>
#include "plugin.h"
#include "result.h"
#include "pluginenv.h"
using namespace QSync;
PluginEnv::PluginEnv()
{
OSyncError *error = 0;
mPluginEnv = osync_plugin_env_new( &error );
}
PluginEnv::~PluginEnv()
{
osync_plugin_env_free( mPluginEnv );
}
Result PluginEnv::initialize()
{
OSyncError *error = 0;
if ( !osync_plugin_env_load( mPluginEnv, NULL, &error ) )
return Result( &error );
else
return Result();
}
Result PluginEnv::finalize()
{
osync_plugin_env_free( mPluginEnv );
return Result();
}
int PluginEnv::pluginCount() const
{
return osync_plugin_env_num_plugins( mPluginEnv );
}
Plugin PluginEnv::pluginAt( int pos ) const
{
Plugin plugin;
if ( pos < 0 || pos >= pluginCount() )
return plugin;
OSyncPlugin *oplugin = osync_plugin_env_nth_plugin( mPluginEnv, pos );
plugin.mPlugin = oplugin;
return plugin;
}
Plugin PluginEnv::pluginByName( const TQString &name ) const
{
Plugin plugin;
OSyncPlugin *oplugin = osync_plugin_env_find_plugin( mPluginEnv, name.latin1() );
if ( oplugin )
plugin.mPlugin = oplugin;
return plugin;
}
/*
Conversion PluginEnv::conversion() const
{
Conversion conversion;
conversion.mPluginEnv = mPluginEnv;
return conversion;
}
*/

@ -0,0 +1,80 @@
/*
This file is part of libqopensync.
Copyright (c) 2005 Tobias Koenig <tokoe@kde.org>
Copyright (c) 2007 Daniel Gollub <dgollub@suse.de>
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_PLUGINENV_H
#define OSYNC_PLUGINENV_H
#include <tqstring.h>
struct OSyncPluginEnv;
namespace QSync {
class Plugin;
class Result;
class PluginEnv
{
public:
PluginEnv();
~PluginEnv();
/**
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 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 TQString &name ) const;
/**
Returns the conversion object of this environment.
*/
// Conversion conversion() const;
private:
OSyncPluginEnv *mPluginEnv;
};
}
#endif

@ -100,7 +100,7 @@ Result::Result( OSyncError **error, bool deleteError )
mMessage = TQString::fromUtf8( osync_error_print( error ) ); mMessage = TQString::fromUtf8( osync_error_print( error ) );
if ( deleteError ) if ( deleteError )
osync_error_free( error ); osync_error_unref( error );
} }
Result::~Result() Result::~Result()

@ -19,8 +19,13 @@
Boston, MA 02110-1301, USA. Boston, MA 02110-1301, USA.
*/ */
#include <stdlib.h>
#include <opensync/file.h> #include <opensync/file.h>
#include <opensync/opensync.h> #include <opensync/opensync.h>
#include <opensync/opensync-data.h>
#include <opensync/opensync-format.h>
#include "syncchange.h" #include "syncchange.h"
@ -64,39 +69,50 @@ TQString SyncChange::hash() const
return TQString::fromUtf8( osync_change_get_hash( mSyncChange ) ); return TQString::fromUtf8( osync_change_get_hash( mSyncChange ) );
} }
void SyncChange::setData( const TQString &data ) void SyncChange::setData( const TQString &data , OSyncObjFormat *format )
{ {
osync_change_set_data( mSyncChange, const_cast<char*>( data.utf8().data() ), data.utf8().size(), true ); OSyncError *error = 0;
OSyncData *odata = osync_data_new( const_cast<char*>( data.utf8().data() ), data.utf8().size(), format, &error );
osync_change_set_data( mSyncChange, odata );
} }
TQString SyncChange::data() const TQString SyncChange::data() const
{ {
int size = osync_change_get_datasize( mSyncChange ); char *buf;
unsigned int size;
OSyncData *data = osync_change_get_data( mSyncChange );
osync_data_get_data( data, &buf, &size );
TQString content; TQString content;
if ( objectFormatName() == "file" ) { if ( objectFormatName() == "file" ) {
fileFormat *format = (fileFormat*)osync_change_get_data( mSyncChange ); OSyncFileFormat *format = (OSyncFileFormat*) buf;
if ( format ) if ( format )
content = TQString::fromUtf8( format->data, format->size ); content = TQString::fromUtf8( format->data, format->size );
} else } else
content = TQString::fromUtf8( osync_change_get_data( mSyncChange ), size ); content = TQString::fromUtf8( buf, size );
free( buf );
return content; return content;
} }
bool SyncChange::hasData() const bool SyncChange::hasData() const
{ {
return osync_change_has_data( mSyncChange ); return osync_data_has_data( osync_change_get_data( mSyncChange ) );
} }
TQString SyncChange::objectFormatName() const TQString SyncChange::objectFormatName() const
{ {
OSyncObjFormat *format = osync_change_get_objformat( mSyncChange ); OSyncObjFormat *format = osync_data_get_objformat( osync_change_get_data( mSyncChange ) );
Q_ASSERT( format ); Q_ASSERT( format );
return TQString::fromUtf8( osync_objformat_get_name( format ) ); return TQString::fromUtf8( osync_objformat_get_name( format ) );
} }
/*
Member SyncChange::member() const Member SyncChange::member() const
{ {
OSyncMember *omember = osync_change_get_member( mSyncChange ); OSyncMember *omember = osync_change_get_member( mSyncChange );
@ -106,6 +122,7 @@ Member SyncChange::member() const
return m; return m;
} }
*/
void SyncChange::setChangeType( Type changeType ) void SyncChange::setChangeType( Type changeType )
{ {
@ -113,20 +130,20 @@ void SyncChange::setChangeType( Type changeType )
switch ( changeType ) { switch ( changeType ) {
case AddedChange: case AddedChange:
ochangeType = CHANGE_ADDED; ochangeType = OSYNC_CHANGE_TYPE_ADDED;
break; break;
case UnmodifiedChange: case UnmodifiedChange:
ochangeType = CHANGE_UNMODIFIED; ochangeType = OSYNC_CHANGE_TYPE_UNMODIFIED;
break; break;
case DeletedChange: case DeletedChange:
ochangeType = CHANGE_DELETED; ochangeType = OSYNC_CHANGE_TYPE_DELETED;
break; break;
case ModifiedChange: case ModifiedChange:
ochangeType = CHANGE_MODIFIED; ochangeType = OSYNC_CHANGE_TYPE_MODIFIED;
break; break;
case UnknownChange: case UnknownChange:
default: default:
ochangeType = CHANGE_UNKNOWN; ochangeType = OSYNC_CHANGE_TYPE_UNKNOWN;
break; break;
} }
@ -138,19 +155,19 @@ SyncChange::Type SyncChange::changeType() const
OSyncChangeType ochangeType = osync_change_get_changetype( mSyncChange ); OSyncChangeType ochangeType = osync_change_get_changetype( mSyncChange );
switch ( ochangeType ) { switch ( ochangeType ) {
case CHANGE_ADDED: case OSYNC_CHANGE_TYPE_ADDED:
return AddedChange; return AddedChange;
break; break;
case CHANGE_UNMODIFIED: case OSYNC_CHANGE_TYPE_UNMODIFIED:
return UnmodifiedChange; return UnmodifiedChange;
break; break;
case CHANGE_DELETED: case OSYNC_CHANGE_TYPE_DELETED:
return DeletedChange; return DeletedChange;
break; break;
case CHANGE_MODIFIED: case OSYNC_CHANGE_TYPE_MODIFIED:
return ModifiedChange; return ModifiedChange;
break; break;
case CHANGE_UNKNOWN: case OSYNC_CHANGE_TYPE_UNKNOWN:
default: default:
return UnknownChange; return UnknownChange;
break; break;

@ -25,6 +25,7 @@
#include <libqopensync/member.h> #include <libqopensync/member.h>
class OSyncChange; class OSyncChange;
class OSyncObjFormat;
namespace QSync { namespace QSync {
@ -74,7 +75,7 @@ class SyncChange
/** /**
Sets the data provided by the plugin. Sets the data provided by the plugin.
*/ */
void setData( const TQString &data ); void setData( const TQString &data, OSyncObjFormat *format );
/** /**
Returns the data provided by the plugin. Returns the data provided by the plugin.
@ -94,7 +95,7 @@ class SyncChange
/** /**
Returns the parent member of this change. Returns the parent member of this change.
*/ */
Member member() const; // Member member() const;
/** /**
Sets the change type. Sets the change type.

@ -20,19 +20,20 @@
*/ */
#include <tqstring.h> #include <tqstring.h>
#include <osengine/engine.h> #include <opensync/opensync.h>
#include <opensync/opensync-engine.h>
#include "syncmapping.h" #include "syncmapping.h"
using namespace QSync; using namespace QSync;
SyncMapping::SyncMapping() SyncMapping::SyncMapping()
: mEngine( 0 ), mMapping( 0 ) : mEngine( 0 ), mMappingEngine( 0 )
{ {
} }
SyncMapping::SyncMapping( OSyncMapping *mapping, OSyncEngine *engine ) SyncMapping::SyncMapping( OSyncMappingEngine *mapping, OSyncEngine *engine )
: mEngine( engine ), mMapping( mapping ) : mEngine( engine ), mMappingEngine( mapping )
{ {
} }
@ -42,58 +43,64 @@ SyncMapping::~SyncMapping()
bool SyncMapping::isValid() const bool SyncMapping::isValid() const
{ {
return ( mEngine != 0 && mMapping != 0 ); return ( mEngine != 0 && mMappingEngine != 0 );
} }
/*
long long SyncMapping::id() const long long SyncMapping::id() const
{ {
Q_ASSERT( mMapping ); Q_ASSERT( mMappingEngine );
return osengine_mapping_get_id( mMapping ); return osync_mapping_engine_get_id( mMappingEngine );
} }
*/
void SyncMapping::duplicate() void SyncMapping::duplicate()
{ {
Q_ASSERT( mEngine ); Q_ASSERT( mEngine );
Q_ASSERT( mMapping ); Q_ASSERT( mMappingEngine );
OSyncError *error = 0;
osengine_mapping_duplicate( mEngine, mMapping ); osync_mapping_engine_duplicate( mMappingEngine, &error );
} }
void SyncMapping::solve( const SyncChange &change ) void SyncMapping::solve( const SyncChange &change )
{ {
Q_ASSERT( mEngine ); Q_ASSERT( mEngine );
Q_ASSERT( mMapping ); Q_ASSERT( mMappingEngine );
Q_ASSERT( change.isValid() ); Q_ASSERT( change.isValid() );
osengine_mapping_solve( mEngine, mMapping, change.mSyncChange ); OSyncError *error = 0;
osync_mapping_engine_solve( mMappingEngine, change.mSyncChange, &error );
} }
void SyncMapping::ignore() void SyncMapping::ignore()
{ {
Q_ASSERT( mEngine ); Q_ASSERT( mEngine );
Q_ASSERT( mMapping ); Q_ASSERT( mMappingEngine );
//TODO: error should be returned as Result //TODO: error should be returned as Result
OSyncError *error = 0; OSyncError *error = 0;
osengine_mapping_ignore_conflict( mEngine, mMapping, &error ); osync_mapping_engine_ignore( mMappingEngine, &error );
} }
int SyncMapping::changesCount() const int SyncMapping::changesCount() const
{ {
Q_ASSERT( mMapping ); Q_ASSERT( mMappingEngine );
return osengine_mapping_num_changes( mMapping ); return osync_mapping_engine_num_changes( mMappingEngine );
} }
SyncChange SyncMapping::changeAt( int pos ) SyncChange SyncMapping::changeAt( int pos )
{ {
Q_ASSERT( mMapping ); Q_ASSERT( mMappingEngine );
if ( pos < 0 || pos >= osengine_mapping_num_changes( mMapping ) ) if ( pos < 0 || pos >= osync_mapping_engine_num_changes( mMappingEngine ) )
return SyncChange(); return SyncChange();
OSyncChange *ochange = osengine_mapping_nth_change( mMapping, pos ); OSyncChange *ochange = osync_mapping_engine_nth_change( mMappingEngine, pos );
return SyncChange( ochange ); return SyncChange( ochange );
} }

@ -25,7 +25,7 @@
#include <libqopensync/syncchange.h> #include <libqopensync/syncchange.h>
class OSyncEngine; class OSyncEngine;
class OSyncMapping; class OSyncMappingEngine;
namespace QSync { namespace QSync {
@ -35,7 +35,7 @@ class SyncMapping
public: public:
SyncMapping(); SyncMapping();
SyncMapping( OSyncMapping*, OSyncEngine* ); SyncMapping( OSyncMappingEngine*, OSyncEngine* );
~SyncMapping(); ~SyncMapping();
bool isValid() const; bool isValid() const;
@ -51,7 +51,7 @@ class SyncMapping
private: private:
OSyncEngine *mEngine; OSyncEngine *mEngine;
OSyncMapping *mMapping; OSyncMappingEngine *mMappingEngine;
}; };
} }

@ -19,7 +19,8 @@
Boston, MA 02110-1301, USA. Boston, MA 02110-1301, USA.
*/ */
#include <osengine/engine.h> #include <opensync/opensync.h>
#include <opensync/opensync-engine.h>
#include "syncupdates.h" #include "syncupdates.h"
@ -32,32 +33,26 @@ SyncMemberUpdate::SyncMemberUpdate()
SyncMemberUpdate::SyncMemberUpdate( OSyncMemberUpdate *update ) SyncMemberUpdate::SyncMemberUpdate( OSyncMemberUpdate *update )
{ {
switch ( update->type ) { switch ( update->type ) {
case MEMBER_CONNECTED: case OSYNC_CLIENT_EVENT_CONNECTED:
mType = Connected; mType = Connected;
break; break;
case MEMBER_SENT_CHANGES: case OSYNC_CLIENT_EVENT_DISCONNECTED:
mType = SentChanges;
break;
case MEMBER_COMMITTED_ALL:
mType = CommittedAll;
break;
case MEMBER_DISCONNECTED:
mType = Disconnected; mType = Disconnected;
break; break;
case MEMBER_CONNECT_ERROR: case OSYNC_CLIENT_EVENT_READ:
mType = ConnectError; mType = Read;
break; break;
case MEMBER_GET_CHANGES_ERROR: case OSYNC_CLIENT_EVENT_WRITTEN:
mType = GetChangesError; mType = Written;
break; break;
case MEMBER_COMMITTED_ALL_ERROR: case OSYNC_CLIENT_EVENT_SYNC_DONE:
mType = CommittedAllError; mType = SyncDone;
break; break;
case MEMBER_SYNC_DONE_ERROR: case OSYNC_CLIENT_EVENT_DISCOVERED:
mType = SyncDoneError; mType = Discovered;
break; break;
case MEMBER_DISCONNECT_ERROR: case OSYNC_CLIENT_EVENT_ERROR:
mType = DisconnectedError; mType = Error;
break; break;
} }
@ -94,20 +89,14 @@ SyncChangeUpdate::SyncChangeUpdate()
SyncChangeUpdate::SyncChangeUpdate( OSyncChangeUpdate *update ) SyncChangeUpdate::SyncChangeUpdate( OSyncChangeUpdate *update )
{ {
switch ( update->type ) { switch ( update->type ) {
case CHANGE_RECEIVED: case OSYNC_CHANGE_EVENT_READ:
mType = Received; mType = Read;
break;
case CHANGE_RECEIVED_INFO:
mType = ReceivedInfo;
break; break;
case CHANGE_SENT: case OSYNC_CHANGE_EVENT_WRITTEN:
mType = Sent; mType = Written;
break; break;
case CHANGE_WRITE_ERROR: case OSYNC_CHANGE_EVENT_ERROR:
mType = WriteError; mType = Error;
break;
case CHANGE_RECV_ERROR:
mType = ReceiveError;
break; break;
} }
@ -115,7 +104,7 @@ SyncChangeUpdate::SyncChangeUpdate( OSyncChangeUpdate *update )
mResult = Result( &(update->error) ); mResult = Result( &(update->error) );
mChange = SyncChange( update->change ); mChange = SyncChange( update->change );
mMemberId = update->member_id; mMember.mMember = update->member;
mMappingId = update->mapping_id; mMappingId = update->mapping_id;
} }
@ -138,9 +127,9 @@ SyncChange SyncChangeUpdate::change() const
return mChange; return mChange;
} }
int SyncChangeUpdate::memberId() const Member SyncChangeUpdate::member() const
{ {
return mMemberId; return mMember;
} }
int SyncChangeUpdate::mappingId() const int SyncChangeUpdate::mappingId() const
@ -155,14 +144,14 @@ SyncMappingUpdate::SyncMappingUpdate()
SyncMappingUpdate::SyncMappingUpdate( OSyncMappingUpdate *update, OSyncEngine *engine ) SyncMappingUpdate::SyncMappingUpdate( OSyncMappingUpdate *update, OSyncEngine *engine )
{ {
switch ( update->type ) { switch ( update->type ) {
case MAPPING_SOLVED: case OSYNC_MAPPING_EVENT_SOLVED:
mType = Solved; mType = Solved;
break; break;
case MAPPING_SYNCED: // case OSYNC_MAPPING_EVENT_SYNCED:
mType = Synced; // mType = Synced;
break; // break;
case MAPPING_WRITE_ERROR: case OSYNC_MAPPING_EVENT_ERROR:
mType = WriteError; mType = Error;
break; break;
} }
@ -171,7 +160,9 @@ SyncMappingUpdate::SyncMappingUpdate( OSyncMappingUpdate *update, OSyncEngine *e
mWinner = update->winner; mWinner = update->winner;
mMapping.mEngine = engine; mMapping.mEngine = engine;
mMapping.mMapping = update->mapping;
// TODO PORTING
// mMapping.mMapping = update->mapping;
} }
SyncMappingUpdate::~SyncMappingUpdate() SyncMappingUpdate::~SyncMappingUpdate()
@ -205,30 +196,33 @@ SyncEngineUpdate::SyncEngineUpdate()
SyncEngineUpdate::SyncEngineUpdate( OSyncEngineUpdate *update ) SyncEngineUpdate::SyncEngineUpdate( OSyncEngineUpdate *update )
{ {
switch ( update->type ) { switch ( update->type ) {
case ENG_ENDPHASE_CON: case OSYNC_ENGINE_EVENT_CONNECTED:
mType = EndPhaseConnected; mType = Connected;
break; break;
case ENG_ENDPHASE_READ: case OSYNC_ENGINE_EVENT_READ:
mType = EndPhaseRead; mType = Read;
break; break;
case ENG_ENDPHASE_WRITE: case OSYNC_ENGINE_EVENT_WRITTEN:
mType = EndPhaseWrite; mType = Written;
break; break;
case ENG_ENDPHASE_DISCON: case OSYNC_ENGINE_EVENT_DISCONNECTED:
mType = EndPhaseDisconnected; mType = Disconnected;
break; break;
case ENG_ERROR: case OSYNC_ENGINE_EVENT_ERROR:
mType = Error; mType = Error;
break; break;
case ENG_SYNC_SUCCESSFULL: case OSYNC_ENGINE_EVENT_SUCCESSFUL:
mType = SyncSuccessfull; mType = SyncSuccessful;
break; break;
case ENG_PREV_UNCLEAN: case OSYNC_ENGINE_EVENT_PREV_UNCLEAN:
mType = PrevUnclean; mType = PrevUnclean;
break; break;
case ENG_END_CONFLICTS: case OSYNC_ENGINE_EVENT_END_CONFLICTS:
mType = EndConflicts; mType = EndConflicts;
break; break;
case OSYNC_ENGINE_EVENT_SYNC_DONE:
mType = SyncDone;
break;
} }
if ( update->error ) if ( update->error )

@ -42,14 +42,12 @@ class SyncMemberUpdate
public: public:
enum Type { enum Type {
Connected, Connected,
SentChanges,
CommittedAll,
Disconnected, Disconnected,
ConnectError, Read,
GetChangesError, Written,
CommittedAllError, SyncDone,
SyncDoneError, Discovered,
DisconnectedError Error
}; };
SyncMemberUpdate(); SyncMemberUpdate();
@ -72,11 +70,9 @@ class SyncChangeUpdate
public: public:
enum Type { enum Type {
Received = 1, Read = 1,
ReceivedInfo, Written,
Sent, Error
WriteError,
ReceiveError
}; };
SyncChangeUpdate(); SyncChangeUpdate();
@ -86,14 +82,14 @@ class SyncChangeUpdate
Type type() const; Type type() const;
Result result() const; Result result() const;
SyncChange change() const; SyncChange change() const;
int memberId() const; Member member() const;
int mappingId() const; int mappingId() const;
private: private:
Type mType; Type mType;
Result mResult; Result mResult;
SyncChange mChange; SyncChange mChange;
int mMemberId; Member mMember;
int mMappingId; int mMappingId;
}; };
@ -104,8 +100,8 @@ class SyncMappingUpdate
public: public:
enum Type { enum Type {
Solved = 1, Solved = 1,
Synced, //Synced,
WriteError Error
}; };
SyncMappingUpdate(); SyncMappingUpdate();
@ -130,14 +126,15 @@ class SyncEngineUpdate
public: public:
enum Type { enum Type {
EndPhaseConnected = 1, Connected = 1,
EndPhaseRead, Read,
EndPhaseWrite, Written,
EndPhaseDisconnected, Disconnected,
Error, Error,
SyncSuccessfull, SyncSuccessful,
PrevUnclean, PrevUnclean,
EndConflicts EndConflicts,
SyncDone
}; };
SyncEngineUpdate(); SyncEngineUpdate();

@ -24,7 +24,7 @@ libkitchensync_la_SOURCES = aboutpage.cpp mainwidget.cpp groupconfigdialog.cpp \
pluginpicker.cpp configgui.cpp configguiblank.cpp configguifile.cpp \ pluginpicker.cpp configgui.cpp configguiblank.cpp configguifile.cpp \
memberinfo.cpp groupconfigcommon.cpp kwidgetlist.cpp \ memberinfo.cpp groupconfigcommon.cpp kwidgetlist.cpp \
configguipalm.cpp conflictdialog.cpp singleconflictdialog.cpp \ configguipalm.cpp conflictdialog.cpp singleconflictdialog.cpp \
addresseediffalgo.cpp calendardiffalgo.cpp \ addresseediffalgo.cpp calendardiffalgo.cpp xmldiffalgo.cpp \
htmldiffalgodisplay.cpp genericdiffalgo.cpp multiconflictdialog.cpp \ htmldiffalgodisplay.cpp genericdiffalgo.cpp multiconflictdialog.cpp \
configguiirmc.cpp \ configguiirmc.cpp \
configguisyncmlobex.cpp configguisyncmlhttp.cpp configguiopie.cpp \ configguisyncmlobex.cpp configguisyncmlhttp.cpp configguiopie.cpp \

@ -55,13 +55,20 @@ void ConfigGuiFile::load( const TQString &xml )
TQDomDocument doc; TQDomDocument doc;
doc.setContent( xml ); doc.setContent( xml );
TQDomElement docElement = doc.documentElement(); TQDomElement docElement = doc.documentElement();
TQDomNode n;
for( n = docElement.firstChild(); !n.isNull(); n = n.nextSibling() ) { TQDomNode node;
TQDomElement e = n.toElement(); for ( node = docElement.firstChild(); !node.isNull(); node = node.nextSibling() ) {
if ( e.tagName() == "path" ) { TQDomElement e = node.toElement();
mFilename->setURL( e.text() ); if ( e.tagName() == "directory" ) {
} else if ( e.tagName() == "recursive" ) { TQDomNode subNode;
mRecursive->setChecked( e.text() == "TRUE" ); for ( subNode = e.firstChild(); !subNode.isNull(); subNode = subNode.nextSibling() ) {
TQDomElement subElement = subNode.toElement();
if ( subElement.tagName() == "path" ) {
mFilename->setURL( subElement.text() );
} else if ( subElement.tagName() == "recursive" ) {
mRecursive->setChecked( subElement.text() == "TRUE" );
}
}
} }
} }
} }
@ -69,13 +76,18 @@ void ConfigGuiFile::load( const TQString &xml )
TQString ConfigGuiFile::save() const TQString ConfigGuiFile::save() const
{ {
TQString xml; TQString xml;
xml = "<config>"; xml = "<config>\n";
xml += "<path>" + mFilename->url() + "</path>"; xml += " <directory>\n";
xml += "<recursive>"; xml += " <path>" + mFilename->url() + "</path>\n";
if ( mRecursive->isChecked() ) xml += "TRUE"; xml += " <objtype>data</objtype>\n";
else xml += "FALSE"; xml += " <recursive>";
xml += "</recursive>"; if ( mRecursive->isChecked() )
xml += "</config>"; xml += "TRUE";
else
xml += "FALSE";
xml += "</recursive>\n";
xml += " </directory>\n";
xml += "</config>\n";
return xml; return xml;
} }

@ -121,7 +121,7 @@ ConfigGuiSyncmlHttp::ConfigGuiSyncmlHttp( const QSync::Member &member, TQWidget
mGridLayout->addWidget( label, 5, 0 ); mGridLayout->addWidget( label, 5, 0 );
mRecvLimit = new TQSpinBox( optionWidget ); mRecvLimit = new TQSpinBox( optionWidget );
mRecvLimit->setMinValue( 1 ); mRecvLimit->setMinValue( 0 );
mRecvLimit->setMaxValue( 65536 ); mRecvLimit->setMaxValue( 65536 );
mGridLayout->addWidget( mRecvLimit, 5, 1 ); mGridLayout->addWidget( mRecvLimit, 5, 1 );
@ -130,7 +130,7 @@ ConfigGuiSyncmlHttp::ConfigGuiSyncmlHttp( const QSync::Member &member, TQWidget
mGridLayout->addWidget( label, 6, 0 ); mGridLayout->addWidget( label, 6, 0 );
mMaxObjSize = new TQSpinBox( optionWidget ); mMaxObjSize = new TQSpinBox( optionWidget );
mMaxObjSize->setMinValue( 1 ); mMaxObjSize->setMinValue( 0 );
mMaxObjSize->setMaxValue( 65536 ); mMaxObjSize->setMaxValue( 65536 );
mGridLayout->addWidget( mMaxObjSize, 6, 1 ); mGridLayout->addWidget( mMaxObjSize, 6, 1 );

@ -153,7 +153,7 @@ ConfigGuiSyncmlObex::ConfigGuiSyncmlObex( const QSync::Member &member, TQWidget
mGridLayout->addWidget( label, 14, 0 ); mGridLayout->addWidget( label, 14, 0 );
mRecvLimit = new TQSpinBox( optionsWidget ); mRecvLimit = new TQSpinBox( optionsWidget );
mRecvLimit->setMinValue( 1 ); mRecvLimit->setMinValue( 0 );
mRecvLimit->setMaxValue( 65536 ); mRecvLimit->setMaxValue( 65536 );
mGridLayout->addWidget( mRecvLimit, 14, 1 ); mGridLayout->addWidget( mRecvLimit, 14, 1 );
@ -162,7 +162,7 @@ ConfigGuiSyncmlObex::ConfigGuiSyncmlObex( const QSync::Member &member, TQWidget
mGridLayout->addWidget( label, 15, 0 ); mGridLayout->addWidget( label, 15, 0 );
mMaxObjSize = new TQSpinBox( optionsWidget ); mMaxObjSize = new TQSpinBox( optionsWidget );
mMaxObjSize->setMinValue( 1 ); mMaxObjSize->setMinValue( 0 );
mMaxObjSize->setMaxValue( 65536 ); mMaxObjSize->setMaxValue( 65536 );
mGridLayout->addWidget( mMaxObjSize, 15, 1 ); mGridLayout->addWidget( mMaxObjSize, 15, 1 );

@ -27,8 +27,10 @@
#include "syncprocess.h" #include "syncprocess.h"
#include "syncprocessmanager.h" #include "syncprocessmanager.h"
#include <libqopensync/engine.h>
#include <libqopensync/group.h> #include <libqopensync/group.h>
#include <libqopensync/plugin.h> #include <libqopensync/plugin.h>
#include <libqopensync/result.h>
#include <kdialog.h> #include <kdialog.h>
#include <kiconloader.h> #include <kiconloader.h>
@ -40,6 +42,7 @@
#include <tqlabel.h> #include <tqlabel.h>
#include <tqlayout.h> #include <tqlayout.h>
#include <tqpushbutton.h> #include <tqpushbutton.h>
#include <tqtimer.h>
GroupConfig::GroupConfig( TQWidget *parent ) GroupConfig::GroupConfig( TQWidget *parent )
: TQWidget( parent ) : TQWidget( parent )
@ -84,14 +87,6 @@ GroupConfig::GroupConfig( TQWidget *parent )
mMemberView = new KJanusWidget( this, 0, KJanusWidget::IconList ); mMemberView = new KJanusWidget( this, 0, KJanusWidget::IconList );
topLayout->addWidget( mMemberView ); topLayout->addWidget( mMemberView );
TQBoxLayout *buttonLayout = new TQHBoxLayout( topLayout );
TQPushButton *addButton = new TQPushButton( i18n("Add Member..."), this );
connect( addButton, TQT_SIGNAL( clicked() ), TQT_SLOT( addMember() ) );
buttonLayout->addWidget( addButton );
buttonLayout->addStretch( 1 );
icon = KGlobal::iconLoader()->loadIcon( "bookmark", KIcon::Desktop ); icon = KGlobal::iconLoader()->loadIcon( "bookmark", KIcon::Desktop );
TQFrame *page = mMemberView->addPage( i18n("Group"), TQFrame *page = mMemberView->addPage( i18n("Group"),
i18n("General Group Settings"), icon ); i18n("General Group Settings"), icon );
@ -99,6 +94,8 @@ GroupConfig::GroupConfig( TQWidget *parent )
mCommonConfig = new GroupConfigCommon( page ); mCommonConfig = new GroupConfigCommon( page );
pageLayout->addWidget( mCommonConfig ); pageLayout->addWidget( mCommonConfig );
connect( mMemberView, TQT_SIGNAL( aboutToShowPage( TQWidget* ) ), TQT_SLOT( memberWidgetSelected( TQWidget* ) ) );
} }
void GroupConfig::setSyncProcess( SyncProcess *process ) void GroupConfig::setSyncProcess( SyncProcess *process )
@ -113,9 +110,9 @@ void GroupConfig::setSyncProcess( SyncProcess *process )
void GroupConfig::updateMembers() void GroupConfig::updateMembers()
{ {
TQValueList<MemberConfig *>::ConstIterator memberIt; TQMap<TQWidget*, MemberConfig *>::ConstIterator memberIt;
for ( memberIt = mMemberConfigs.begin(); memberIt != mMemberConfigs.end(); ++memberIt ) for ( memberIt = mMemberConfigs.begin(); memberIt != mMemberConfigs.end(); ++memberIt )
(*memberIt)->saveData(); memberIt.data()->saveData();
TQValueList<TQFrame *>::ConstIterator it2; TQValueList<TQFrame *>::ConstIterator it2;
for ( it2 = mConfigPages.begin(); it2 != mConfigPages.end(); ++it2 ) { for ( it2 = mConfigPages.begin(); it2 != mConfigPages.end(); ++it2 ) {
@ -125,10 +122,9 @@ void GroupConfig::updateMembers()
mConfigPages.clear(); mConfigPages.clear();
mMemberConfigs.clear(); mMemberConfigs.clear();
QSync::Group group = mProcess->group(); const QSync::Group group = mProcess->group();
QSync::Group::Iterator it( group.begin() ); for ( int i = 0; i < group.memberCount(); ++i ) {
for ( ; it != group.end(); ++it ) { QSync::Member member = group.memberAt( i );
QSync::Member member = *it;
MemberInfo mi( member ); MemberInfo mi( member );
TQFrame *page = mMemberView->addPage( mi.name(), TQFrame *page = mMemberView->addPage( mi.name(),
TQString( "%1 (%2)" ).arg( mi.name() ).arg(member.pluginName()), mi.desktopIcon() ); TQString( "%1 (%2)" ).arg( mi.name() ).arg(member.pluginName()), mi.desktopIcon() );
@ -137,7 +133,7 @@ void GroupConfig::updateMembers()
mConfigPages.append( page ); mConfigPages.append( page );
MemberConfig *memberConfig = new MemberConfig( page, member ); MemberConfig *memberConfig = new MemberConfig( page, member );
mMemberConfigs.append( memberConfig ); mMemberConfigs.insert( page, memberConfig );
pageLayout->addWidget( memberConfig ); pageLayout->addWidget( memberConfig );
memberConfig->loadData(); memberConfig->loadData();
@ -148,15 +144,30 @@ void GroupConfig::saveConfig()
{ {
mProcess->group().save(); mProcess->group().save();
TQValueList<MemberConfig *>::ConstIterator it; TQMap<TQWidget*, MemberConfig*>::ConstIterator it;
for ( it = mMemberConfigs.begin(); it != mMemberConfigs.end(); ++it ) for ( it = mMemberConfigs.begin(); it != mMemberConfigs.end(); ++it )
(*it)->saveData(); it.data()->saveData();
mCommonConfig->save(); mCommonConfig->save();
const QSync::Group group = mProcess->group();
for ( int i = 0; i < group.memberCount(); ++i ) {
const QSync::Member member = group.memberAt( i );
mProcess->engine()->discover( member );
}
mProcess->reinitEngine(); mProcess->reinitEngine();
} }
void GroupConfig::memberWidgetSelected( TQWidget *wdg )
{
/**
* Emit 'true' whenever a real member widget is selected by the
* user.
*/
emit memberSelected( wdg != mCommonConfig->parentWidget() );
}
void GroupConfig::addMember() void GroupConfig::addMember()
{ {
QSync::Plugin plugin = PluginPickerDialog::getPlugin( this ); QSync::Plugin plugin = PluginPickerDialog::getPlugin( this );
@ -176,4 +187,17 @@ void GroupConfig::addMember()
} }
} }
void GroupConfig::removeMember()
{
TQWidget *selectedWidget = mMemberView->pageWidget( mMemberView->activePageIndex() );
if ( selectedWidget && mMemberConfigs.contains( selectedWidget ) ) {
MemberConfig *config = mMemberConfigs[ selectedWidget ];
SyncProcessManager::self()->removeMember( mProcess, config->member() );
mMemberConfigs.remove( selectedWidget );
TQTimer::singleShot( 0, this, TQT_SLOT( updateMembers() ) );
}
}
#include "groupconfig.moc" #include "groupconfig.moc"

@ -40,12 +40,19 @@ class GroupConfig : public QWidget
void setSyncProcess( SyncProcess *process ); void setSyncProcess( SyncProcess *process );
void saveConfig();
public slots:
void addMember();
void removeMember();
void updateMembers(); void updateMembers();
void saveConfig(); signals:
void memberSelected( bool );
protected slots: protected slots:
void addMember(); void memberWidgetSelected( TQWidget* );
private: private:
TQLabel *mNameLabel; TQLabel *mNameLabel;
@ -55,8 +62,8 @@ class GroupConfig : public QWidget
SyncProcess *mProcess; SyncProcess *mProcess;
GroupConfigCommon *mCommonConfig; GroupConfigCommon *mCommonConfig;
TQValueList<MemberConfig *> mMemberConfigs; TQMap<TQWidget*, MemberConfig*> mMemberConfigs;
TQValueList<TQFrame *> mConfigPages; TQValueList<TQFrame*> mConfigPages;
}; };
#endif #endif

@ -30,14 +30,15 @@
#include <tqcheckbox.h> #include <tqcheckbox.h>
#include <libqopensync/group.h> #include <libqopensync/group.h>
#include <libqopensync/conversion.h> //#include <libqopensync/conversion.h>
#include <libqopensync/environment.h>
#include "syncprocess.h" #include "syncprocess.h"
#include "syncprocessmanager.h" #include "syncprocessmanager.h"
#include "groupconfigcommon.h" #include "groupconfigcommon.h"
// TODO: port ObjectTypeSelector to ported solution of Conversation class
#if 0
ObjectTypeSelector::ObjectTypeSelector( TQWidget *parent ) ObjectTypeSelector::ObjectTypeSelector( TQWidget *parent )
: TQWidget( parent ) : TQWidget( parent )
{ {
@ -124,6 +125,7 @@ void ObjectTypeSelector::save( QSync::Group group )
QSync::GroupConfig config = group.config(); QSync::GroupConfig config = group.config();
config.setActiveObjectTypes( objectTypes ); config.setActiveObjectTypes( objectTypes );
} }
#endif
GroupConfigCommon::GroupConfigCommon( TQWidget *parent ) GroupConfigCommon::GroupConfigCommon( TQWidget *parent )
: TQWidget( parent ) : TQWidget( parent )
@ -135,10 +137,11 @@ GroupConfigCommon::GroupConfigCommon( TQWidget *parent )
mGroupName = new KLineEdit( this ); mGroupName = new KLineEdit( this );
layout->addWidget( mGroupName, 0, 1 ); layout->addWidget( mGroupName, 0, 1 );
layout->addWidget( new TQLabel( i18n( "Object Types to be Synchronized:"), this ), 1, 0, Qt::AlignTop ); //layout->addWidget( new TQLabel( i18n( "Object Types to be Synchronized:"), this ), 1, 0, Qt::AlignTop );
mObjectTypeSelector = new ObjectTypeSelector( this ); // TODO port ObjectTypeSelector class..
layout->addWidget( mObjectTypeSelector, 1, 1 ); //mObjectTypeSelector = new ObjectTypeSelector( this );
//layout->addWidget( mObjectTypeSelector, 1, 1 );
layout->setRowStretch( 2, 1 ); layout->setRowStretch( 2, 1 );
} }
@ -148,11 +151,15 @@ void GroupConfigCommon::setSyncProcess( SyncProcess *syncProcess )
mSyncProcess = syncProcess; mSyncProcess = syncProcess;
mGroupName->setText( mSyncProcess->group().name() ); mGroupName->setText( mSyncProcess->group().name() );
mObjectTypeSelector->load( mSyncProcess->group() );
// TODO port ObjectTypeSelector class..
//mObjectTypeSelector->load( mSyncProcess->group() );
} }
void GroupConfigCommon::save() void GroupConfigCommon::save()
{ {
mSyncProcess->group().setName( mGroupName->text() ); mSyncProcess->group().setName( mGroupName->text() );
mObjectTypeSelector->save( mSyncProcess->group() );
// TODO port ObjectTypeSelector class..
//mObjectTypeSelector->save( mSyncProcess->group() );
} }

@ -30,7 +30,9 @@ class KLineEdit;
class SyncProcess; class SyncProcess;
class TQCheckBox; class TQCheckBox;
class ObjectTypeSelector : public QWidget //TODO: Conversation needs to be ported before...
#if 0
class ObjectTypeSelector : public TQWidget
{ {
public: public:
ObjectTypeSelector( TQWidget *parent ); ObjectTypeSelector( TQWidget *parent );
@ -41,6 +43,7 @@ class ObjectTypeSelector : public QWidget
private: private:
TQMap<TQString,TQCheckBox *> mObjectTypeChecks; TQMap<TQString,TQCheckBox *> mObjectTypeChecks;
}; };
#endif
class GroupConfigCommon : public QWidget class GroupConfigCommon : public QWidget
{ {
@ -52,7 +55,7 @@ class GroupConfigCommon : public QWidget
private: private:
KLineEdit *mGroupName; KLineEdit *mGroupName;
ObjectTypeSelector *mObjectTypeSelector; // ObjectTypeSelector *mObjectTypeSelector;
SyncProcess *mSyncProcess; SyncProcess *mSyncProcess;
}; };

@ -28,7 +28,7 @@
GroupConfigDialog::GroupConfigDialog( TQWidget *parent, SyncProcess *process ) GroupConfigDialog::GroupConfigDialog( TQWidget *parent, SyncProcess *process )
: KDialogBase( parent, 0, true, i18n("Configure Synchronization Group"), : KDialogBase( parent, 0, true, i18n("Configure Synchronization Group"),
Ok ) Ok | User1 | User2, Ok )
{ {
TQFrame *topFrame = makeMainWidget(); TQFrame *topFrame = makeMainWidget();
@ -40,6 +40,13 @@ GroupConfigDialog::GroupConfigDialog( TQWidget *parent, SyncProcess *process )
mConfigWidget->setSyncProcess( process ); mConfigWidget->setSyncProcess( process );
setInitialSize( configDialogSize( "size_groupconfigdialog" ) ); setInitialSize( configDialogSize( "size_groupconfigdialog" ) );
enableButton( User1, false );
setButtonText( User1, i18n( "Remove Member" ) );
connect( mConfigWidget, TQT_SIGNAL( memberSelected( bool ) ), TQT_SLOT( memberSelected( bool ) ) );
setButtonText( User2, i18n("Add Member...") );
} }
GroupConfigDialog::~GroupConfigDialog() GroupConfigDialog::~GroupConfigDialog()
@ -54,4 +61,19 @@ void GroupConfigDialog::slotOk()
accept(); accept();
} }
void GroupConfigDialog::slotUser1()
{
mConfigWidget->removeMember();
}
void GroupConfigDialog::slotUser2()
{
mConfigWidget->addMember();
}
void GroupConfigDialog::memberSelected( bool selected )
{
enableButton( User1, selected );
}
#include "groupconfigdialog.moc" #include "groupconfigdialog.moc"

@ -35,6 +35,11 @@ class GroupConfigDialog : public KDialogBase
protected slots: protected slots:
void slotOk(); void slotOk();
void slotUser1();
void slotUser2();
private slots:
void memberSelected( bool );
private: private:
GroupConfig *mConfigWidget; GroupConfig *mConfigWidget;

@ -33,6 +33,9 @@
#include <tqprogressbar.h> #include <tqprogressbar.h>
#include <tqvbox.h> #include <tqvbox.h>
#include <libqopensync/plugin.h>
#include <libqopensync/pluginenv.h>
#include "memberinfo.h" #include "memberinfo.h"
#include "multiconflictdialog.h" #include "multiconflictdialog.h"
#include "singleconflictdialog.h" #include "singleconflictdialog.h"
@ -150,12 +153,9 @@ void GroupItem::update()
mProgressBar->reset(); mProgressBar->reset();
mProgressBar->hide(); mProgressBar->hide();
QSync::Group group = mSyncProcess->group(); const QSync::Group group = mSyncProcess->group();
QSync::Group::Iterator memberIt( group.begin() ); for ( int i = 0; i < group.memberCount(); ++i ) {
QSync::Group::Iterator memberEndIt( group.end() ); MemberItem *item = new MemberItem( mBox, mSyncProcess, group.memberAt( i ) );
for ( ; memberIt != memberEndIt; ++memberIt ) {
MemberItem *item = new MemberItem( mBox, mSyncProcess, *memberIt );
item->show(); item->show();
item->setStatusMessage( i18n( "Ready" ) ); item->setStatusMessage( i18n( "Ready" ) );
mMemberItems.append( item ); mMemberItems.append( item );
@ -187,14 +187,11 @@ void GroupItem::conflict( QSync::SyncMapping mapping )
void GroupItem::change( const QSync::SyncChangeUpdate &update ) void GroupItem::change( const QSync::SyncChangeUpdate &update )
{ {
switch ( update.type() ) { switch ( update.type() ) {
case QSync::SyncChangeUpdate::Received: case QSync::SyncChangeUpdate::Read:
mProcessedItems++; mProcessedItems++;
mStatus->setText( i18n( "%1 entries read" ).arg( mProcessedItems ) ); mStatus->setText( i18n( "%1 entries read" ).arg( mProcessedItems ) );
break; break;
case QSync::SyncChangeUpdate::ReceivedInfo: case QSync::SyncChangeUpdate::Written:
mStatus->setText( i18n( "Receive information" ) );
break;
case QSync::SyncChangeUpdate::Sent:
mProcessedItems--; mProcessedItems--;
mStatus->setText( i18n( "%1 entries written" ).arg( mMaxProcessedItems - mProcessedItems ) ); mStatus->setText( i18n( "%1 entries written" ).arg( mMaxProcessedItems - mProcessedItems ) );
@ -211,11 +208,7 @@ void GroupItem::change( const QSync::SyncChangeUpdate &update )
mProgressBar->setProgress( 100 - progress ); mProgressBar->setProgress( 100 - progress );
} }
break; break;
case QSync::SyncChangeUpdate::WriteError: case QSync::SyncChangeUpdate::Error:
mStatus->setText( i18n( "Error" ) );
KPassivePopup::message( update.result().message(), this );
break;
case QSync::SyncChangeUpdate::ReceiveError:
mStatus->setText( i18n( "Error" ) ); mStatus->setText( i18n( "Error" ) );
KPassivePopup::message( update.result().message(), this ); KPassivePopup::message( update.result().message(), this );
break; break;
@ -232,21 +225,21 @@ void GroupItem::mapping( const QSync::SyncMappingUpdate& )
void GroupItem::engine( const QSync::SyncEngineUpdate &update ) void GroupItem::engine( const QSync::SyncEngineUpdate &update )
{ {
switch ( update.type() ) { switch ( update.type() ) {
case QSync::SyncEngineUpdate::EndPhaseConnected: case QSync::SyncEngineUpdate::Connected:
mStatus->setText( i18n( "Connected" ) ); mStatus->setText( i18n( "Connected" ) );
mProgressBar->setProgress( 0 ); mProgressBar->setProgress( 0 );
mSynchronizing = true; mSynchronizing = true;
mSyncAction->setText( "Abort Synchronization" ); mSyncAction->setText( "Abort Synchronization" );
break; break;
case QSync::SyncEngineUpdate::EndPhaseRead: case QSync::SyncEngineUpdate::Read:
mStatus->setText( i18n( "Data read" ) ); mStatus->setText( i18n( "Data read" ) );
break; break;
case QSync::SyncEngineUpdate::EndPhaseWrite: case QSync::SyncEngineUpdate::Written:
mStatus->setText( i18n( "Data written" ) ); mStatus->setText( i18n( "Data written" ) );
mProgressBar->setProgress( 100 ); mProgressBar->setProgress( 100 );
mProcessedItems = mMaxProcessedItems = 0; mProcessedItems = mMaxProcessedItems = 0;
break; break;
case QSync::SyncEngineUpdate::EndPhaseDisconnected: case QSync::SyncEngineUpdate::Disconnected:
mStatus->setText( i18n( "Disconnected" ) ); mStatus->setText( i18n( "Disconnected" ) );
break; break;
case QSync::SyncEngineUpdate::Error: case QSync::SyncEngineUpdate::Error:
@ -257,7 +250,7 @@ void GroupItem::engine( const QSync::SyncEngineUpdate &update )
mSynchronizing = false; mSynchronizing = false;
mSyncAction->setText( i18n( "Synchronize Now" ) ); mSyncAction->setText( i18n( "Synchronize Now" ) );
break; break;
case QSync::SyncEngineUpdate::SyncSuccessfull: case QSync::SyncEngineUpdate::SyncSuccessful:
mStatus->setText( i18n( "Successfully synchronized" ) ); mStatus->setText( i18n( "Successfully synchronized" ) );
mSyncProcess->group().setLastSynchronization( TQDateTime::currentDateTime() ); mSyncProcess->group().setLastSynchronization( TQDateTime::currentDateTime() );
mSyncProcess->group().save(); mSyncProcess->group().save();
@ -288,28 +281,22 @@ void GroupItem::member( const QSync::SyncMemberUpdate &update )
case QSync::SyncMemberUpdate::Connected: case QSync::SyncMemberUpdate::Connected:
(*it)->setStatusMessage( i18n( "Connected" ) ); (*it)->setStatusMessage( i18n( "Connected" ) );
break; break;
case QSync::SyncMemberUpdate::SentChanges: case QSync::SyncMemberUpdate::Read:
(*it)->setStatusMessage( i18n( "Changes read" ) ); (*it)->setStatusMessage( i18n( "Changes read" ) );
break; break;
case QSync::SyncMemberUpdate::CommittedAll: case QSync::SyncMemberUpdate::Written:
(*it)->setStatusMessage( i18n( "Changes written" ) ); (*it)->setStatusMessage( i18n( "Changes written" ) );
break; break;
case QSync::SyncMemberUpdate::Disconnected: case QSync::SyncMemberUpdate::Disconnected:
(*it)->setStatusMessage( i18n( "Disconnected" ) ); (*it)->setStatusMessage( i18n( "Disconnected" ) );
break; break;
case QSync::SyncMemberUpdate::ConnectError: case QSync::SyncMemberUpdate::SyncDone:
(*it)->setStatusMessage( i18n( "Error: %1" ).arg( update.result().message() ) ); (*it)->setStatusMessage( i18n( "Synchronization done" ) );
break; break;
case QSync::SyncMemberUpdate::GetChangesError: case QSync::SyncMemberUpdate::Discovered:
(*it)->setStatusMessage( i18n( "Error: %1" ).arg( update.result().message() ) ); (*it)->setStatusMessage( i18n( "Discovered" ) );
break; break;
case QSync::SyncMemberUpdate::CommittedAllError: case QSync::SyncMemberUpdate::Error:
(*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() ) ); (*it)->setStatusMessage( i18n( "Error: %1" ).arg( update.result().message() ) );
break; break;
default: default:
@ -352,11 +339,8 @@ MemberItem::MemberItem( TQWidget *parent, SyncProcess *process,
TQFont boldFont; TQFont boldFont;
boldFont.setBold( true ); boldFont.setBold( true );
MemberInfo mi( member ); const MemberInfo mi( member );
const TQPixmap icon = mi.smallIcon();
TQPixmap icon = mi.smallIcon();
QSync::Plugin plugin = member.plugin();
TQVBoxLayout *layout = new TQVBoxLayout( this ); TQVBoxLayout *layout = new TQVBoxLayout( this );
@ -378,7 +362,14 @@ MemberItem::MemberItem( TQWidget *parent, SyncProcess *process,
mStatus = new TQLabel( box ); mStatus = new TQLabel( box );
mMemberName->setText( member.name() ); mMemberName->setText( member.name() );
mDescription->setText( plugin.longName() );
const QSync::PluginEnv *env = SyncProcessManager::self()->pluginEnv();
const QSync::Plugin plugin = env->pluginByName( member.pluginName() );
if ( plugin.isValid() )
mDescription->setText( plugin.longName() );
else
mDescription->setText( i18n("Plugin \"%1\" can't get initialized!").arg( member.pluginName() ) );
} }
void MemberItem::setStatusMessage( const TQString &msg ) void MemberItem::setStatusMessage( const TQString &msg )

@ -26,7 +26,7 @@
#include "syncprocess.h" #include "syncprocess.h"
#include "syncprocessmanager.h" #include "syncprocessmanager.h"
#include <libqopensync/environment.h> #include <libqopensync/result.h>
#include <kaboutdata.h> #include <kaboutdata.h>
#include <kaction.h> #include <kaction.h>
@ -46,13 +46,6 @@ MainWidget::MainWidget( KXMLGUIClient *guiClient, TQWidget *widget, const char *
initGUI(); initGUI();
initActions(); 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(); mGroupView->updateView();
connect( SyncProcessManager::self(), TQT_SIGNAL( changed() ), connect( SyncProcessManager::self(), TQT_SIGNAL( changed() ),
@ -125,12 +118,19 @@ void MainWidget::addGroup()
{ {
bool ok; bool ok;
TQString name = KInputDialog::getText( i18n("Create Synchronization Group"), TQString name = KInputDialog::getText( i18n("Create Synchronization Group"),
i18n("Name for new synchronization group."), TQString::null, &ok, this ); i18n("Name for new synchronization group."), i18n( "Default" ), &ok, this );
if ( ok ) { if ( ok ) {
SyncProcess *process = SyncProcessManager::self()->byGroupName( name );
if ( process ) {
KMessageBox::error( this, i18n( "A group with the same name exists already.\nPlease choose another name." ),
i18n( "Duplicated Group Name" ) );
return;
}
SyncProcessManager::self()->addGroup( name ); SyncProcessManager::self()->addGroup( name );
enableActions(); enableActions();
SyncProcess *process = SyncProcessManager::self()->byGroupName( name ); process = SyncProcessManager::self()->byGroupName( name );
if ( process ) if ( process )
editGroup( process ); editGroup( process );
} }

@ -23,6 +23,8 @@
#include "configgui.h" #include "configgui.h"
#include "memberinfo.h" #include "memberinfo.h"
#include <libqopensync/result.h>
#include <klocale.h> #include <klocale.h>
#include <kmessagebox.h> #include <kmessagebox.h>
@ -67,13 +69,16 @@ void MemberConfig::saveData()
if ( txt.isEmpty() ) { if ( txt.isEmpty() ) {
KMessageBox::sorry( this, i18n("Configuration of %1 is empty.").arg( mMember.pluginName() ) ); KMessageBox::sorry( this, i18n("Configuration of %1 is empty.").arg( mMember.pluginName() ) );
} else { } else {
TQByteArray cfg = txt.utf8(); mMember.setConfiguration( txt.utf8() );
cfg.truncate(cfg.size() - 1); /* discard NUL terminator */
mMember.setConfiguration( cfg );
mMember.setName( mGui->instanceName() ); mMember.setName( mGui->instanceName() );
// TODO: Check for save() error. // TODO: Check for save() error.
mMember.save(); mMember.save();
} }
} }
QSync::Member MemberConfig::member() const
{
return mMember;
}
#include "memberconfig.moc" #include "memberconfig.moc"

@ -38,6 +38,8 @@ class MemberConfig : public QWidget
void loadData(); void loadData();
void saveData(); void saveData();
QSync::Member member() const;
private: private:
QSync::Member mMember; QSync::Member mMember;

@ -39,8 +39,10 @@ class ChangeItem : public KWidgetListItem
{ {
TQGridLayout *layout = new TQGridLayout( this, 2, 1, KDialog::marginHint(), KDialog::spacingHint() ); TQGridLayout *layout = new TQGridLayout( this, 2, 1, KDialog::marginHint(), KDialog::spacingHint() );
MemberInfo mi( change.member() ); // TODO change doesn't contain member as struct member .. use SyncMapping to determine the correct member.
layout->addWidget( new TQLabel( mi.name(), this ), 0, 0 ); //MemberInfo mi( change.member() );
//layout->addWidget( new TQLabel( mi.name(), this ), 0, 0 );
layout->addWidget( new TQLabel( "PORTING TODO", this ), 0, 0 );
TQString type; TQString type;
switch ( change.changeType() ) { switch ( change.changeType() ) {

@ -24,7 +24,7 @@
#include "memberinfo.h" #include "memberinfo.h"
#include "syncprocessmanager.h" #include "syncprocessmanager.h"
#include <libqopensync/environment.h> #include <libqopensync/pluginenv.h>
#include <kdialog.h> #include <kdialog.h>
#include <kglobal.h> #include <kglobal.h>
@ -77,12 +77,14 @@ void PluginPicker::updatePluginList()
{ {
mPluginList->clear(); mPluginList->clear();
QSync::Environment *env = SyncProcessManager::self()->environment(); const QSync::PluginEnv *env = SyncProcessManager::self()->pluginEnv();
for ( int i = 0; i < env->pluginCount(); ++i ) {
QSync::Plugin plugin = env->pluginAt( i );
if ( plugin.isValid() )
mPluginList->appendItem( new PluginItem( mPluginList, plugin ) );
QSync::Environment::PluginIterator it( env->pluginBegin() );
for( ; it != env->pluginEnd(); ++it ) {
QSync::Plugin plugin = *it;
mPluginList->appendItem( new PluginItem( mPluginList, plugin ) );
} }
} }

@ -27,6 +27,7 @@
#include "addresseediffalgo.h" #include "addresseediffalgo.h"
#include "genericdiffalgo.h" #include "genericdiffalgo.h"
#include "xmldiffalgo.h"
#include "htmldiffalgodisplay.h" #include "htmldiffalgodisplay.h"
#include "memberinfo.h" #include "memberinfo.h"
@ -43,16 +44,22 @@ SingleConflictDialog::SingleConflictDialog( QSync::SyncMapping &mapping, TQWidge
if ( format == "file" ) { if ( format == "file" ) {
mDiffAlgo = new KSync::GenericDiffAlgo( leftChange.data(), rightChange.data() ); mDiffAlgo = new KSync::GenericDiffAlgo( leftChange.data(), rightChange.data() );
} else if ( format == "vcard" ) { } else if ( format == "vcard21" || format == "vcard30" ) {
} else if ( format == "calendar" ) {
} else if ( format == "xml-contact" ) {
mDiffAlgo = new KSync::AddresseeDiffAlgo( leftChange.data(), rightChange.data() ); mDiffAlgo = new KSync::AddresseeDiffAlgo( leftChange.data(), rightChange.data() );
} else if ( format == "calendar" ) {
} else if ( format == "xmlformat-contact" || format == "xmlformat-note"
|| format == "xmlformat-event" || format == "xmlformat-todo") {
mDiffAlgo = new KSync::XmlDiffAlgo( leftChange.data(), rightChange.data() );
} }
// TODO: SyncChange doesn't have member as struct member anymore ...
// Use SyncMapping to determine the member .. see msynctool for example implementation of conlicthandler
#if 0
MemberInfo miLeft( leftChange.member() ); MemberInfo miLeft( leftChange.member() );
mDiffAlgoDisplay->setLeftSourceTitle( miLeft.name() ); mDiffAlgoDisplay->setLeftSourceTitle( miLeft.name() );
MemberInfo miRight( rightChange.member() ); MemberInfo miRight( rightChange.member() );
mDiffAlgoDisplay->setRightSourceTitle( miRight.name() ); mDiffAlgoDisplay->setRightSourceTitle( miRight.name() );
#endif
if ( mDiffAlgo ) { if ( mDiffAlgo ) {
mDiffAlgo->addDisplay( mDiffAlgoDisplay ); mDiffAlgo->addDisplay( mDiffAlgoDisplay );
@ -99,6 +106,7 @@ void SingleConflictDialog::initGUI()
TQGridLayout *layout = new TQGridLayout( this, 3, 4, KDialog::marginHint(), KDialog::spacingHint() ); TQGridLayout *layout = new TQGridLayout( this, 3, 4, KDialog::marginHint(), KDialog::spacingHint() );
layout->addMultiCellWidget( new TQLabel( i18n( "A conflict has appeared, please solve it manually." ), this ), 0, 0, 0, 3 ); layout->addMultiCellWidget( new TQLabel( i18n( "A conflict has appeared, please solve it manually." ), this ), 0, 0, 0, 3 );
mDiffAlgoDisplay = new KSync::HTMLDiffAlgoDisplay( this ); mDiffAlgoDisplay = new KSync::HTMLDiffAlgoDisplay( this );
layout->addMultiCellWidget( mDiffAlgoDisplay, 1, 1, 0, 3 ); layout->addMultiCellWidget( mDiffAlgoDisplay, 1, 1, 0, 3 );

@ -19,10 +19,12 @@
*/ */
#include <libqopensync/engine.h> #include <libqopensync/engine.h>
#include <libqopensync/environment.h> #include <libqopensync/member.h>
#include <libqopensync/result.h>
#include <kdebug.h> #include <kdebug.h>
#include <klocale.h> #include <klocale.h>
#include <kmessagebox.h>
#include "syncprocess.h" #include "syncprocess.h"
#include "syncprocessmanager.h" #include "syncprocessmanager.h"
@ -60,8 +62,8 @@ TQString SyncProcess::memberStatus( const QSync::Member& ) const
QSync::Result SyncProcess::addMember( const QSync::Plugin &plugin ) QSync::Result SyncProcess::addMember( const QSync::Plugin &plugin )
{ {
QSync::Member member = mGroup.addMember(); QSync::Member member = mGroup.addMember( plugin );
QSync::Result result = member.instance( plugin ); QSync::Result result = member.instance();
if ( !result.isError() ) if ( !result.isError() )
mGroup.save(); mGroup.save();
@ -69,40 +71,27 @@ QSync::Result SyncProcess::addMember( const QSync::Plugin &plugin )
return result; return result;
} }
void SyncProcess::removeMember( const QSync::Member &member )
{
member.cleanup();
mGroup.removeMember( member );
mGroup.save();
}
void SyncProcess::reinitEngine() void SyncProcess::reinitEngine()
{ {
mEngine->finalize(); mEngine->finalize();
delete mEngine; delete mEngine;
mEngine = new QSync::Engine( mGroup ); mEngine = new QSync::Engine( mGroup );
Result result = mEngine->initialize(); Result result = mEngine->initialize();
if ( result.isError() ) if ( result.isError() ) {
kdDebug() << "SyncProcess::reinitEngine: " << result.message() << endl; kdDebug() << "SyncProcess::reinitEngine: " << result.message() << endl;
KMessageBox::error( 0, i18n("Error initializing Synchronization Engine for group \"%1\":\n %2")
.arg( mGroup.name() ).arg( result.message() ) );
applyObjectTypeFilter(); }
emit engineChanged( mEngine ); emit engineChanged( mEngine );
} }
void SyncProcess::applyObjectTypeFilter()
{
const QSync::Conversion conversion = SyncProcessManager::self()->environment()->conversion();
const TQStringList objectTypes = conversion.objectTypes();
const TQStringList 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" #include "syncprocess.moc"

@ -44,12 +44,10 @@ class SyncProcess : public QObject
TQString memberStatus( const QSync::Member &member ) const; TQString memberStatus( const QSync::Member &member ) const;
QSync::Result addMember( const QSync::Plugin &plugin ); QSync::Result addMember( const QSync::Plugin &plugin );
void removeMember( const QSync::Member &member );
void reinitEngine(); void reinitEngine();
/** apply object type filter hack **/
void applyObjectTypeFilter();
signals: signals:
/** /**
This signal is emitted whenever the engine has changed ( reinitialized ). This signal is emitted whenever the engine has changed ( reinitialized ).

@ -23,7 +23,10 @@
#include "syncprocess.h" #include "syncprocess.h"
#include <libqopensync/environment.h> #include <libqopensync/groupenv.h>
#include <libqopensync/member.h>
#include <libqopensync/pluginenv.h>
#include <libqopensync/result.h>
#include <kstaticdeleter.h> #include <kstaticdeleter.h>
#include <kmessagebox.h> #include <kmessagebox.h>
@ -43,14 +46,24 @@ SyncProcessManager *SyncProcessManager::self()
SyncProcessManager::SyncProcessManager() SyncProcessManager::SyncProcessManager()
{ {
mEnvironment = new QSync::Environment; mGroupEnv = new QSync::GroupEnv;
QSync::Result result = mEnvironment->initialize(); QSync::Result result = mGroupEnv->initialize();
if ( result.isError() ) { if ( result.isError() ) {
KMessageBox::error( 0, i18n("Error initializing OpenSync.\n%1") KMessageBox::error( 0, i18n("Error initializing OpenSync.\n%1")
.arg( result.message() ) ); .arg( result.message() ) );
} else { } else {
init( mEnvironment ); initGroup( mGroupEnv );
} }
mPluginEnv = new QSync::PluginEnv;
result = mPluginEnv->initialize();
if ( result.isError() ) {
KMessageBox::error( 0, i18n("Error initializing OpenSync.\n%1")
.arg( result.message() ) );
} else {
// initPlugin( mPluginEnv );
}
} }
SyncProcessManager::~SyncProcessManager() SyncProcessManager::~SyncProcessManager()
@ -61,8 +74,8 @@ SyncProcessManager::~SyncProcessManager()
mProcesses.clear(); mProcesses.clear();
mEnvironment->finalize(); mGroupEnv->finalize();
delete mEnvironment; delete mGroupEnv;
} }
int SyncProcessManager::count() const int SyncProcessManager::count() const
@ -102,8 +115,7 @@ void SyncProcessManager::addGroup( const TQString &name )
{ {
SyncProcess* process = byGroupName( name ); SyncProcess* process = byGroupName( name );
if ( !process ) { if ( !process ) {
QSync::Group group = mEnvironment->addGroup(); QSync::Group group = mGroupEnv->addGroup( name );
group.setName( name );
group.save(); group.save();
mProcesses.append( new SyncProcess( group ) ); mProcesses.append( new SyncProcess( group ) );
@ -120,22 +132,21 @@ void SyncProcessManager::remove( SyncProcess *syncProcess )
const QSync::Group group = syncProcess->group(); const QSync::Group group = syncProcess->group();
delete syncProcess; delete syncProcess;
mEnvironment->removeGroup( group ); mGroupEnv->removeGroup( group );
emit changed(); emit changed();
} }
} }
void SyncProcessManager::init( QSync::Environment *environment ) void SyncProcessManager::initGroup( QSync::GroupEnv *groupEnv )
{ {
QSync::Environment::GroupIterator it( environment->groupBegin() ); for ( int i = 0; i < groupEnv->groupCount(); ++i ) {
for ( ; it != environment->groupEnd(); ++it ) {
/** /**
* We check whether the group is valid before we append them * We check whether the group is valid before we append them
* to mProcesses. That avoids crashes if the plugin of one of * to mProcesses. That avoids crashes if the plugin of one of
* the members isn't loaded (e.g. not installed). * the members isn't loaded (e.g. not installed).
*/ */
const QSync::Group group = *it; const QSync::Group group = groupEnv->groupAt( i );
int count = group.memberCount(); int count = group.memberCount();
bool isValid = true; bool isValid = true;
@ -149,7 +160,7 @@ void SyncProcessManager::init( QSync::Environment *environment )
} }
if ( isValid ) if ( isValid )
mProcesses.append( new SyncProcess( *it ) ); mProcesses.append( new SyncProcess( group ) );
} }
emit changed(); emit changed();
@ -169,4 +180,13 @@ QSync::Result SyncProcessManager::addMember( SyncProcess *process,
return result; return result;
} }
void SyncProcessManager::removeMember( SyncProcess *process, const QSync::Member &member )
{
Q_ASSERT( process );
process->removeMember( member );
process->group().save();
emit syncProcessChanged( process );
}
#include "syncprocessmanager.moc" #include "syncprocessmanager.moc"

@ -26,7 +26,8 @@
#include <libqopensync/group.h> #include <libqopensync/group.h>
namespace QSync { namespace QSync {
class Environment; class GroupEnv;
class PluginEnv;
} }
class SyncProcess; class SyncProcess;
@ -43,9 +44,14 @@ class SyncProcessManager : public QObject
~SyncProcessManager(); ~SyncProcessManager();
/** /**
Return OpenSync Environment. Return OpenSync GroupEnv.
*/ */
QSync::Environment *environment() const { return mEnvironment; } QSync::GroupEnv *groupEnv() const { return mGroupEnv; }
/**
Return OpenSync PluginEnv.
*/
QSync::PluginEnv *pluginEnv() const { return mPluginEnv; }
/** /**
Returns the number of SyncProcesses. Returns the number of SyncProcesses.
@ -82,6 +88,11 @@ class SyncProcessManager : public QObject
*/ */
QSync::Result addMember( SyncProcess *process, const QSync::Plugin &plugin ); QSync::Result addMember( SyncProcess *process, const QSync::Plugin &plugin );
/**
Removes the @param member from the group of @param process.
*/
void removeMember( SyncProcess *process, const QSync::Member &member );
signals: signals:
void changed(); void changed();
void syncProcessChanged( SyncProcess *process ); void syncProcessChanged( SyncProcess *process );
@ -89,10 +100,12 @@ class SyncProcessManager : public QObject
private: private:
SyncProcessManager(); SyncProcessManager();
void init( QSync::Environment *environment ); void initGroup( QSync::GroupEnv *groupEnv );
// void initPlugin( QSync::PluginEnv *pluginEnv );
TQValueList<SyncProcess*> mProcesses; TQValueList<SyncProcess*> mProcesses;
QSync::Environment *mEnvironment; QSync::GroupEnv *mGroupEnv;
QSync::PluginEnv *mPluginEnv;
static SyncProcessManager *mSelf; static SyncProcessManager *mSelf;
}; };

@ -0,0 +1,166 @@
/*
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 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 "xmldiffalgo.h"
#include <kdebug.h>
using namespace KSync;
#ifndef KDE_USE_FINAL
// With --enable-final, we get the (identical) compareString from
// addresseediffalgo.cpp
//
static bool compareString( const TQString &left, const TQString &right )
{
if ( left.isEmpty() && right.isEmpty() )
return true;
else
return left == right;
}
#endif
XmlDiffAlgo::XmlDiffAlgo( const TQString &leftXml, const TQString &rightXml )
{
kdDebug() << __func__ << " " << __LINE__ << endl;
mLeftXml.setContent( leftXml );
mRightXml.setContent( rightXml );
}
XmlDiffAlgo::XmlDiffAlgo( const TQDomDocument &leftXml, const TQDomDocument &rightXml )
: mLeftXml( leftXml ), mRightXml( rightXml )
{
kdDebug() << __func__ << " " << __LINE__ << endl;
}
void XmlDiffAlgo::appendSingleNodes(TQDomElement &element, bool isLeft)
{
TQDomNode node;
for ( node = element.firstChild(); !node.isNull(); node = node.nextSibling() ) {
TQDomElement child = node.toElement();
if (isLeft)
additionalLeftField( node.nodeName(), child.text() );
else
additionalRightField( node.nodeName(), child.text() );
}
}
void XmlDiffAlgo::appendConflictNodes(TQDomElement &leftElement, TQDomElement &rightElement)
{
TQDomNode left, right;
TQDomElement leftChild, rightChild;
for ( left = leftElement.firstChild(); !left.isNull(); left = left.nextSibling() ) {
leftChild = left.toElement();
for ( right = rightElement.firstChild(); !right.isNull(); right = right.nextSibling() ) {
rightChild = right.toElement();
if ( leftChild.tagName() != rightChild.tagName() )
continue;
if (leftChild.text().isEmpty() || rightChild.text().isEmpty())
continue;
TQString id = leftChild.tagName();
if (id == "Content")
id = left.parentNode().nodeName();
conflictField( id, leftChild.text(), rightChild.text() );
left.parentNode().removeChild( left );
left = leftElement.firstChild();
right.parentNode().removeChild( right );
right = rightElement.firstChild();
}
}
}
void XmlDiffAlgo::compareNode(TQDomElement &leftElement, TQDomElement &rightElement)
{
TQDomNode left, right;
TQDomElement leftChild, rightChild;
TQDomNodeList nlist;
top:;
for ( left = leftElement.firstChild(); !left.isNull(); left = left.nextSibling() ) {
leftChild = left.toElement();
for ( right = rightElement.firstChild(); !right.isNull(); right = right.nextSibling() ) {
rightChild = right.toElement();
if (leftChild.tagName() != rightChild.tagName())
continue;
if ( left.childNodes().count() > 1 && right.childNodes().count() > 1 ) {
compareNode( leftChild, rightChild );
if ( !left.hasChildNodes() && !right.hasChildNodes() ) {
left.parentNode().removeChild( left );
right.parentNode().removeChild( right );
goto top;
}
break;
}
if ( leftChild.text() == rightChild.text() ) {
TQString id = leftChild.tagName();
if ( id == "Content" )
id = left.parentNode().nodeName();
if ( id != "Type" )
//matchingField( id, leftChild.text(), rightChild.text() );
left.parentNode().removeChild( left );
right.parentNode().removeChild( right );
goto top;
}
}
}
appendConflictNodes(rightElement, leftElement);
appendSingleNodes(rightElement, false);
appendSingleNodes(leftElement, true);
}
void XmlDiffAlgo::run()
{
kdDebug() << __func__ << endl;
begin();
TQDomElement leftElement = mLeftXml.documentElement();
TQDomElement rightElement = mRightXml.documentElement();
compareNode( leftElement, rightElement );
end();
}

@ -0,0 +1,54 @@
/*
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 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_XMLDIFFALGO_H
#define KSYNC_XMLDIFFALGO_H
#include <tqdom.h>
#include <libkdepim/diffalgo.h>
using namespace KPIM;
namespace KSync {
class XmlDiffAlgo : public DiffAlgo
{
public:
XmlDiffAlgo( const TQString &leftXml, const TQString &rightXml );
XmlDiffAlgo( const TQDomDocument &leftXml, const TQDomDocument &rightXml );
void run();
private:
void appendConflictNodes(TQDomElement &leftElement, TQDomElement &rightElement);
void appendSingleNodes(TQDomElement &element, bool isLeft);
void compareNode(TQDomElement &leftElement, TQDomElement &rightElement);
TQDomDocument mLeftXml;
TQDomDocument mRightXml;
};
}
#endif

@ -2241,6 +2241,9 @@ static const BoolConfigEntry showExpandQuotesMark= {
"Reader", "ShowExpandQuotesMark", I18N_NOOP("Show expand/collapse quote marks"), false "Reader", "ShowExpandQuotesMark", I18N_NOOP("Show expand/collapse quote marks"), false
}; };
static const BoolConfigEntry showCurrentTime = {
"Reader", "ShowCurrentTime", I18N_NOOP("Show current sender time"), true
};
TQString AppearancePage::ReaderTab::helpAnchor() const { TQString AppearancePage::ReaderTab::helpAnchor() const {
return TQString::fromLatin1("configure-appearance-reader"); return TQString::fromLatin1("configure-appearance-reader");
@ -2349,6 +2352,11 @@ AppearancePageReaderTab::AppearancePageReaderTab( TQWidget * parent,
hlay2->addWidget( label ); hlay2->addWidget( label );
hlay2->addWidget( mOverrideCharsetCombo ); hlay2->addWidget( mOverrideCharsetCombo );
populateCheckBox( mShowCurrentTimeCheck = new TQCheckBox( this ), showCurrentTime );
vlay->addWidget( mShowCurrentTimeCheck );
connect( mShowCurrentTimeCheck, TQT_SIGNAL ( stateChanged( int ) ),
this, TQT_SLOT( slotEmitChanged() ) );
vlay->addStretch( 100 ); // spacer vlay->addStretch( 100 ); // spacer
} }
@ -2420,6 +2428,7 @@ void AppearancePage::ReaderTab::doLoadFromGlobalSettings()
mCollapseQuoteLevelSpin->setValue( GlobalSettings::self()->collapseQuoteLevelSpin() ); mCollapseQuoteLevelSpin->setValue( GlobalSettings::self()->collapseQuoteLevelSpin() );
readCurrentFallbackCodec(); readCurrentFallbackCodec();
readCurrentOverrideCodec(); readCurrentOverrideCodec();
mShowCurrentTimeCheck->setChecked( GlobalSettings::self()->showCurrentTime() );
} }
void AppearancePage::ReaderTab::doLoadOther() void AppearancePage::ReaderTab::doLoadOther()
@ -2446,6 +2455,7 @@ void AppearancePage::ReaderTab::save() {
mOverrideCharsetCombo->currentItem() == 0 ? mOverrideCharsetCombo->currentItem() == 0 ?
TQString() : TQString() :
KGlobal::charsets()->encodingForName( mOverrideCharsetCombo->currentText() ) ); KGlobal::charsets()->encodingForName( mOverrideCharsetCombo->currentText() ) );
GlobalSettings::self()->setShowCurrentTime( mShowCurrentTimeCheck->isChecked() );
} }
@ -2457,6 +2467,7 @@ void AppearancePage::ReaderTab::installProfile( KConfig * /* profile */ ) {
loadProfile( mShowEmoticonsCheck, reader, showEmoticons ); loadProfile( mShowEmoticonsCheck, reader, showEmoticons );
loadProfile( mShrinkQuotesCheck, reader, shrinkQuotes ); loadProfile( mShrinkQuotesCheck, reader, shrinkQuotes );
loadProfile( mShowExpandQuotesMark, reader, showExpandQuotesMark); loadProfile( mShowExpandQuotesMark, reader, showExpandQuotesMark);
loadProfile( mShowCurrentTimeCheck, reader, showCurrentTime );
} }

@ -541,6 +541,7 @@ private: // data
TQCheckBox *mShrinkQuotesCheck; TQCheckBox *mShrinkQuotesCheck;
TQComboBox *mCharsetCombo; TQComboBox *mCharsetCombo;
TQComboBox *mOverrideCharsetCombo; TQComboBox *mOverrideCharsetCombo;
TQCheckBox *mShowCurrentTimeCheck;
}; };

@ -615,6 +615,122 @@ namespace KMail {
kdDebug( 5006 ) << "final presence: '" << presence << "'" << endl; kdDebug( 5006 ) << "final presence: '" << presence << "'" << endl;
#endif #endif
TQString timeHTML;
if ( GlobalSettings::self()->showCurrentTime() && strategy->showHeader( "date" ) ) {
DwHeaders& header = message->headers();
if ( header.HasDate() ) {
DwDateTime& origDate = header.Date();
int zone = origDate.Zone();
// kdDebug() << "FancyHeaderStyle::format() zone offset (in minutes): " << zone << endl;
// copyed fro mimelib -- code to determine local timezone
time_t t_now = time((time_t*) 0);
#if defined(HAVE_GMTIME_R)
struct tm utc;
gmtime_r(&t_now, &utc);
struct tm local;
localtime_r(&t_now, &local);
#else
struct tm utc = *gmtime(&t_now);
struct tm local = *localtime(&t_now);
#endif
DwUint32 t_local = 0;
t_local = 24 * t_local + local.tm_hour;
t_local = 60 * t_local + local.tm_min;
t_local = 60 * t_local + local.tm_sec;
DwUint32 t_utc = 0;
t_utc = 24 * t_utc + utc.tm_hour;
t_utc = 60 * t_utc + utc.tm_min;
t_utc = 60 * t_utc + utc.tm_sec;
int lzone = (int) (t_local - t_utc) / 60;
// kdDebug() << "FancyHeaderStyle::format() local zone offset (in minutes): " << lzone << endl;
TQTime currTime = TQTime::currentTime( Qt::UTC );
// kdDebug() << "FancyHeaderStyle::format() current time: " << currTime << endl;
// now currTime contain message sender local time
currTime = currTime.addSecs( zone * 60 );
TQString timeofday;
TQString color;
TQString bg_color;
TQString bg_image;
if ( currTime > TQTime( 0, 0, 0 ) && currTime <= TQTime( 6, 0, 0 ) ) {
timeofday = i18n( "Night" );
color = "white";
bg_color = "#000B6B";
bg_image = "url(data:image/png;base64,"
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAAyCAIAAAASmSbdAAAAS0lEQVQI11WOsRGAQAzDOG/LHoz9"
"kikIcF+kSBxbPs7LoNGVapAI0Zn+O+8NUwldozn6io7G7kdS/5zi7i+BvUM/5uSXlIfzMHx/bmWR"
"k++yj9rZAAAAAElFTkSuQmCC)";
}
else if ( currTime > TQTime( 6, 0, 0 ) && currTime <= TQTime( 12, 0, 0 ) ) {
timeofday = i18n( "Morning" );
color = "white";
bg_color = "#00A6FF";
bg_image = "url(data:image/png;base64,"
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAAyCAYAAACd+7GKAAAAWklEQVQI122OQQ7DMAzDaP3/dfuO"
"pWSHJgva7iZIBk3m/Ew5hexCHVCilewzFHKEbFZqgxJQWyzKhWKl9unqddJj8+L9sl0oR2gUim+o"
"zu4uSh7kn67/DNv+C4tsZOtjAWEHAAAAAElFTkSuQmCC)";
}
else if ( currTime > TQTime( 12, 0, 0 ) && currTime <= TQTime( 18, 0, 0 ) ) {
timeofday = i18n( "Afternoon" );
color = "black";
bg_color = "#00A6FF";
bg_image = "url(data:image/png;base64,"
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAAyCAYAAACd+7GKAAAAPUlEQVQI132OwQ0AIAwCSfcfw91c"
"QsCfRm399HFwoWjdDhMICQhxHSWMQPhkTCoqWRZU2h5i9tr4GZfmV5t3wWUI3h+NugAAAABJRU5E"
"rkJggg==)";
}
else {
timeofday = i18n( "Evening" );
color = "white";
bg_color = "#0014CC";
bg_image = "url(data:image/png;base64,"
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAAyCAYAAACd+7GKAAAAWklEQVQI11WOyRHAMAgDNQuUlBrS"
"fyFpAfKwje0PwyEt0vN+hVsJpzS6QML2ziWcFI6mZBZNSVDXYehyUgI1XsLI9eimHDH6kW0ddVIO"
"xx7JjrtshlbXlLDSD+WhJ+hwqWo8AAAAAElFTkSuQmCC)";
}
TQString tformat;
if ( KGlobal::locale()->use12Clock() ) {
tformat = "h:mm AP";
}
else {
tformat = "h:mm";
}
// kdDebug() << "FancyHeaderStyle::format() current time: " << currTime << " (" << timeofday << ")" << endl;
timeHTML.append( TQString(
"<div style=\""
"border:1px solid %1;"
"color:%2;"
"background-image:%3;"
"background-position:center left;"
"background-repeat:repeat-x;"
"text-align:center;"
"font-size:12px;"
"padding:2px;"
"width:50px;"
"heigth:50px;"
"margin: 0px 0px 3px 0px;"
"\" class=\"curtime\">%4<br />%5<br />%6</div>"
)
.arg( bg_color )
.arg( color )
.arg( bg_image )
.arg( i18n( "Now:" ) )
.arg( currTime.toString( tformat ) )
.arg( timeofday )
);
}
else {
// kdDebug() << "FancyHeaderStyle::format() no date header to display" << endl;
}
}
//case HdrFancy: //case HdrFancy:
// the subject line and box below for details // the subject line and box below for details
@ -719,7 +835,9 @@ namespace KMail {
*/ */
headerStr.append( TQString("<tr><td colspan=\"2\"><div id=\"attachmentInjectionPoint\"></div></td></tr>" ) ); headerStr.append( TQString("<tr><td colspan=\"2\"><div id=\"attachmentInjectionPoint\"></div></td></tr>" ) );
headerStr.append( headerStr.append(
TQString( "</table></td><td align=\"center\">%1</td></tr></table>\n" ).arg(userHTML) ); TQString( "</table></td><td align=\"center\" valign=\"top\">%1%2</td></tr></table>\n" )
.arg(timeHTML)
.arg(userHTML) );
if ( !spamHTML.isEmpty() ) if ( !spamHTML.isEmpty() )
headerStr.append( TQString( "<div class=\"spamheader\" dir=\"%1\"><b>%2</b>&nbsp;<span style=\"padding-left: 20px;\">%3</span></div>\n") headerStr.append( TQString( "<div class=\"spamheader\" dir=\"%1\"><b>%2</b>&nbsp;<span style=\"padding-left: 20px;\">%3</span></div>\n")

@ -607,6 +607,12 @@
<entry name="ChiasmusDecryptionOptions" type="String"> <entry name="ChiasmusDecryptionOptions" type="String">
</entry> </entry>
<entry name="ShowCurrentTime" type="Bool">
<default>true</default>
<label>Show current message sender time</label>
<whatsthis>Enable this if you like to know what time of day are now in sender location (calculated from sender time zone).</whatsthis>
</entry>
<entry name="ShowUserAgent" type="Bool"> <entry name="ShowUserAgent" type="Bool">
<default>false</default> <default>false</default>
<label>Show user agent in fancy headers</label> <label>Show user agent in fancy headers</label>

Loading…
Cancel
Save