Merge commit 'syncevolution-1-1-1'

Conflicts:
	configure-pre.in
	src/syncevo/SyncContext.cpp
	src/syncevo/configs/datatypes/10calendar-fieldlist.xml
	test/ClientTest.cpp
	test/client-test-main.cpp
	test/synccompare.pl

Conflicts all resolved by using the code from "master" branch. Caused
by similar changes on release branch.
This commit is contained in:
Patrick Ohly 2010-12-26 21:29:00 +01:00
commit ed05a9ab51
18 changed files with 283 additions and 80 deletions

101
NEWS
View File

@ -1,3 +1,104 @@
SyncEvolution 1.1 -> 1.1.1, 26.12.2010
======================================
Maintenance release, in particular improving syncing with phones.
There was a bug that could cause all kinds of weird behavior after
a failed sync with a phone, so updating is highly recommended.
* Synthesis engine: fixed a corruption issue in internal meta data which
caused duplicates and other problems in a pretty indeterminstic way;
apparently caused by failed syncs (BMC #11044).
* Synthesis engine: recurrence rules with end date now sent correctly to phones (BMC #11241).
The RRULE property was not encoded correctly previously during the
iCalendar 2.0 -> vCalendar 1.0 conversion. Events with recurrence count
were okay. Probably also affected SyncML servers without iCalendar 2.0
support.
The fix was confirmed to work with Nokia phones. It also helps with Sony Ericsson
phones, but at least the t700 still has a problem: depending on the phone's
time zone, it repeats the event for one day too long (BMC #10092).
* Synthesis engine: fixed broken time zone information when sending to phone;
previously that broke sending calendar updates to Nokia phones (BMC #9600).
iCalendar 2.0 time zone definitions imported from libical were not
encoded correctly in vCalendar 1.0 items as sent to phones. Nokia
phones accepted such data when part of a new event, but rejected
updates of it.
* Synthesis engine: shorter TZIDs, might help N900 calendar (BMC #6680).
The shorter TZIDs will be included in iCalendar 2.0 data exported
by libsyntesis and thus SyncEvolution. This change is motivated primarily
by the observation that the N900 calendar storage can handle TZID=<location>,
but not TZID=/softwarestudio.org/Tzfile/<location>.
* ScheduleWorld: disable configuration template because service has shut down.
The template is only hidden from the GTK sync-ui, but remains in SyncEvolution
for the time being because it is referenced in several places.
* Evolution CalDAV: added workaround for "must sync twice" (BMC #10265)
The Evolution CalDAV backend seems to update its data when closing the
database, not when opening it. As a result, syncevolution had to be run
twice to see all data changes. The workaround is to open the database
twice at the start of the sync. This is done for all calendar databases,
regardless of which backend they use, in case that some other (yet unknown)
backend needs the same workaround.
* GTK sync-ui: workaround for "Sync Now" button not reacting to online
status changed (BMC #9949).
* Changed slow sync handling. Some users have complained about getting
duplicated contacts (BMC #10081). The exact reason is not known (no
useful logs provided yet), but it might be due to using "duplicate"
as resolution strategy during slow syncs.
This caused slightly different contacts to be duplicated instead of
merging the two copies, reasoning that "no data loss" is better than
"duplicates". This release switches to a mode where the engine
tries harder to avoid duplicates by merging data if modification
time stamps are available for contacts (usually they are). When fields
differ, the more recent data is kept.
* convert absolute alarm back to relative (BMC #11233)
Experiments show that at least Nokia phones (and thus perhaps also
Mobical.com) interpret a fixed alarm as "repeat alarm with the same
relative offset as on first occurrence". The same transformation to
relative alarm times is applied whenever the transformation to
absolute alarm is enabled for a peer.
* Sony Ericsson: enable conversion to absolute alarm times (BMC #10092)
Like Nokia and Mobical.net, Sony Ericsson phones also seem to be unable
to deal with relative alarm times - verified with t700.
* Sony Ericsson C510: workaround for SyncML violation
The phone does not sent identifiers for the target database;
using the source identifier as fallback allows a sync to
run.
* Fixed a regression affecting users who had created a config
with SyncEvolution < 1.0. Using the config worked once, then
failed with "No configuration for ... found". Users must
manually remove the empty "peers" directory inside their
affected configuration, the fix only makes configs without that
directory usable again (BMC #9381).
* Removed obsolete workaround for older mKCal calendar storage.
* Fixed error message in QtContacts backend.
* Same SYNCEVOLUTION_DEBUG code as in master branch.
* Some updates to synccompare, including a workaround for a Perl
bug seen on Debian Testing with Perl 5.10.1-16 (Perl panic).
* Fix compilation of syncevo-dbus-server with libnotify 0.7.0 (BMC #10453).
* Fixed compilation on Debian GNU/Hurd (no MAX_PATH, Mac OS X confusion).
SyncEvolution 1.0.1 -> 1.1, 26.10.2010
======================================

View File

@ -87,7 +87,7 @@ peer. Depending on which parameters are given, different operations
are executed.
Starting with SyncEvolution 1.0, <config> strings can have different
meanings. Typically, a simple string like `scheduleworld` refers to
meanings. Typically, a simple string like `memotoo` refers to
the configuration for that peer, as it did in previous releases. A
peer is either a SyncML server (the traditional usage of
SyncEvolution) or a client (the new feature in 1.0).
@ -107,7 +107,7 @@ the context name.
When different peers are meant to synchronize different local
databases, then different contexts have to be used when setting up the
peers by appending a context name after the `at` sign, as in
`scheduleworld2@other-context`. Later on, if `scheduleworld2` is
`memotoo2@other-context`. Later on, if `memotoo2` is
unique, the `@other-context` suffix becomes optional.
Sometimes it is also useful to change configuration options of a
@ -305,8 +305,8 @@ a list of valid values.
of the template configurations (see --template option). When
creating a new configuration and listing sources explicitly on the
command line, only those sources will be set to active in the new
configuration, i.e. `syncevolution -c scheduleworld addressbook`
followed by `syncevolution scheduleworld` will only synchronize the
configuration, i.e. `syncevolution -c memotoo addressbook`
followed by `syncevolution memotoo` will only synchronize the
address book. The other sources are created in a disabled state.
When modifying an existing configuration and sources are specified,
then the source properties of only those sources are modified.
@ -412,7 +412,7 @@ a list of valid values.
for known SyncML peers. Defaults to the <config> name, so --template
only has to be specified when creating multiple different configurations
for the same peer, or when using a template that is named differently
than the peer. `default` is an alias for `scheduleworld` and can be
than the peer. `default` is an alias for `memotoo` and can be
used as the starting point for servers which do not have a built-in
template.
@ -475,12 +475,12 @@ List the known configuration templates::
syncevolution --template ?
Create a new configuration, using the existing ScheduleWorld template::
Create a new configuration, using the existing Memotoo template::
syncevolution --configure \
--sync-property "username=123456" \
--sync-property "password=!@#ABcd1234" \
scheduleworld
memotoo
Note that putting passwords into the command line, even for
short-lived processes as the one above, is a security risk in shared
@ -493,29 +493,29 @@ This command shows the directory containing the file::
Review configuration::
syncevolution --print-config scheduleworld
syncevolution --print-config memotoo
Synchronize all sources::
syncevolution scheduleworld
syncevolution memotoo
Deactivate all sources::
syncevolution --configure \
--source-property sync=none \
scheduleworld
memotoo
Activate address book synchronization again, using the --sync shortcut::
syncevolution --configure \
--sync two-way \
scheduleworld addressbook
memotoo addressbook
Change the password for a configuration::
syncevolution --configure \
--sync-property password=foo \
scheduleworld
memotoo
Set up another configuration for under a different account, using
the same default databases as above::
@ -523,8 +523,8 @@ the same default databases as above::
syncevolution --configure \
--sync-property username=joe \
--sync-property password=foo \
--template scheduleworld \
scheduleworld_joe
--template memotoo \
memotoo_joe
Set up another configuration using the same account, but different
local databases (can be used to simulate synchronizing between two
@ -534,7 +534,7 @@ clients, see `Exchanging Data`_::
--sync-property "username=123456" \
--sync-property "password=!@#ABcd1234" \
--source-property sync=none \
scheduleworld@other
memotoo@other
syncevolution --configure \
--source-property evolutionsource=<name of other address book> \
@ -542,16 +542,16 @@ clients, see `Exchanging Data`_::
syncevolution --configure \
--source-property sync=two-way \
scheduleworld@other addressbook
memotoo@other addressbook
syncevolution scheduleworld
syncevolution scheduleworld@other
syncevolution memotoo
syncevolution memotoo@other
Migrate a configuration from the <= 0.7 format to the current one
and/or updates the configuration so that it looks like configurations
created anew with the current syncevolution::
syncevolution --migrate scheduleworld
syncevolution --migrate memotoo
NOTES
@ -571,16 +571,9 @@ possible because it cannot represent all data that Evolution stores.
the same applies to other data sources.
How the server stores the items depends on its implementation and
configuration. In the default Funambol server installation, contacts
and calendar items are converted into an internal format, but at
least for contacts it preserves most of the properties used by
Evolution whereas iCalendar 2.0 items are not preserved properly
up to and including Funambol 8.0. ScheduleWorld uses the same format
as Evolution for calendars and tasks and thus requires no conversion.
To check which data is preserved, one can use this procedure
(described for contacts, but works the same way for calendars and
tasks):
configuration. To check which data is preserved, one can use this
procedure (described for contacts, but works the same way for
calendars and tasks):
1. synchronize the address book with the server
2. create a new address book in Evolution and view it in Evolution

View File

@ -178,34 +178,45 @@ void EvolutionCalendarSource::open()
ESource *source = findSource(sources, id);
bool onlyIfExists = true;
bool created = false;
if (!source) {
// might have been special "<<system>>" or "<<default>>", try that and
// creating address book from file:// URI before giving up
if ((id.empty() || id == "<<system>>") && m_newSystem) {
m_calendar.set(m_newSystem(), (string("system ") + m_typeName).c_str());
} else if (!id.compare(0, 7, "file://")) {
m_calendar.set(e_cal_new_from_uri(id.c_str(), m_type), (string("creating ") + m_typeName).c_str());
} else {
throwError(string("not found: '") + id + "'");
}
created = true;
onlyIfExists = false;
} else {
m_calendar.set(e_cal_new(source, m_type), m_typeName.c_str());
}
e_cal_set_auth_func(m_calendar, eCalAuthFunc, this);
// Open twice. This solves an issue where Evolution's CalDAV
// backend only updates its local cache *after* a sync (= while
// closing the calendar?), instead of doing it *before* a sync (in
// e_cal_open()).
//
// This workaround is applied to *all* backends because there might
// be others with similar problems and for local storage it is
// a reasonably cheap operation (so no harm there).
for (int retries = 0; retries < 2; retries++) {
if (!source) {
// might have been special "<<system>>" or "<<default>>", try that and
// creating address book from file:// URI before giving up
if ((id.empty() || id == "<<system>>") && m_newSystem) {
m_calendar.set(m_newSystem(), (string("system ") + m_typeName).c_str());
} else if (!id.compare(0, 7, "file://")) {
m_calendar.set(e_cal_new_from_uri(id.c_str(), m_type), (string("creating ") + m_typeName).c_str());
} else {
throwError(string("not found: '") + id + "'");
}
created = true;
onlyIfExists = false;
} else {
m_calendar.set(e_cal_new(source, m_type), m_typeName.c_str());
}
e_cal_set_auth_func(m_calendar, eCalAuthFunc, this);
if (!e_cal_open(m_calendar, onlyIfExists, &gerror)) {
if (created) {
// opening newly created address books often failed, perhaps that also applies to calendars - try again
g_clear_error(&gerror);
sleep(5);
if (!e_cal_open(m_calendar, onlyIfExists, &gerror)) {
if (!e_cal_open(m_calendar, onlyIfExists, &gerror)) {
if (created) {
// opening newly created address books often failed, perhaps that also applies to calendars - try again
g_clear_error(&gerror);
sleep(5);
if (!e_cal_open(m_calendar, onlyIfExists, &gerror)) {
throwError(string("opening ") + m_typeName, gerror );
}
} else {
throwError(string("opening ") + m_typeName, gerror );
}
} else {
throwError(string("opening ") + m_typeName, gerror );
}
}

View File

@ -379,6 +379,18 @@ public:
setWBXML(m_options.m_isWBXML, true);
setRetryDuration(m_options.m_retryDuration, true);
setRetryInterval(m_options.m_retryInterval, true);
if (m_options.m_syncMode == SYNC_TWO_WAY &&
m_options.m_checkReport.syncMode == SYNC_NONE) {
// For this test, any kind of final sync mode is
// acceptable. Disable slow sync prevention
// temporarily. The check for the requested sync
// mode is perhaps too conservative, but in
// practice the only test where slow sync
// prevention caused a test failure was
// Client::Sync::vcard30::testTwoWaySync after
// some other failed test, so let's be conservative...
setPreventSlowSync(false);
}
SyncContext::prepare();
}

View File

@ -450,7 +450,7 @@ sometimes also a beta or alpha suffix),
<arg type="s" name="config" direction="in">
<doc:doc><doc:summary>name of configuration to be created or used in session</doc:summary></doc:doc>
</arg>
<arg type="a(s)" name="flags" direction="in">
<arg type="as" name="flags" direction="in">
<doc:doc><doc:summary>optional flags</doc:summary></doc:doc>
</arg>
<arg type="o" name="session" direction="out">

View File

@ -22,7 +22,7 @@
Get the session flags set with Server.StartSessionWithFlags().
</doc:description>
</doc:doc>
<arg type="a(s)" name="flags" direction="out">
<arg type="as" name="flags" direction="out">
<doc:doc><doc:summary>session flags</doc:summary></doc:doc>
</arg>
</method>

View File

@ -644,6 +644,35 @@ syncevo_server_start_session (SyncevoServer *syncevo,
data);
}
void
syncevo_server_start_no_sync_session (SyncevoServer *syncevo,
const char *config_name,
SyncevoServerStartSessionCb callback,
gpointer userdata)
{
ServerAsyncData *data;
SyncevoServerPrivate *priv;
char *flags[2] = {"no-sync", NULL};
priv = GET_PRIVATE (syncevo);
data = server_async_data_new (syncevo, G_CALLBACK (callback), userdata);
if (!priv->proxy && !syncevo_server_get_new_proxy (syncevo)) {
if (callback) {
g_idle_add ((GSourceFunc)start_session_error, data);
}
return;
}
org_syncevolution_Server_start_session_with_flags_async
(priv->proxy,
config_name,
flags,
(org_syncevolution_Server_start_session_reply) start_session_callback,
data);
}
static void
get_sessions_callback (SyncevoServer *syncevo,
SyncevoSessions *sessions,
@ -705,14 +734,14 @@ syncevo_server_get_sessions (SyncevoServer *syncevo,
static void
check_presence_callback (SyncevoServer *syncevo,
char *status,
char *transport,
char **transports,
GError *error,
ServerAsyncData *data)
{
if (data->callback) {
(*(SyncevoServerGetPresenceCb)data->callback) (data->server,
status,
transport,
transports,
error,
data->userdata);
}

View File

@ -127,7 +127,7 @@ void syncevo_server_get_sessions (SyncevoServer *syncevo,
typedef void (*SyncevoServerGetPresenceCb) (SyncevoServer *syncevo,
char *status,
char *transport,
char **transports,
GError *error,
gpointer userdata);
void syncevo_server_get_presence (SyncevoServer *syncevo,

View File

@ -292,6 +292,46 @@ generic_error (SessionAsyncData *data)
return FALSE;
}
static void
get_config_name_callback (DBusGProxy *proxy,
char *name,
GError *error,
SessionAsyncData *data)
{
if (data->callback) {
(*(SyncevoSessionGetConfigNameCb)data->callback) (data->session,
name,
error,
data->userdata);
}
session_async_data_free (data);
}
void
syncevo_session_get_config_name (SyncevoSession *session,
SyncevoSessionGetConfigNameCb callback,
gpointer userdata)
{
SessionAsyncData *data;
SyncevoSessionPrivate *priv;
priv = GET_PRIVATE (session);
data = session_async_data_new (session, G_CALLBACK (callback), userdata);
if (!priv->proxy) {
if (callback) {
g_idle_add ((GSourceFunc)generic_error, data);
}
return;
}
org_syncevolution_Session_get_config_name_async
(priv->proxy,
(org_syncevolution_Session_get_config_name_reply) get_config_name_callback,
data);
}
static void
get_config_callback (DBusGProxy *proxy,
SyncevoConfig *configuration,

View File

@ -60,6 +60,14 @@ typedef void (*SyncevoSessionGenericCb) (SyncevoSession *session,
GError *error,
gpointer userdata);
typedef void (*SyncevoSessionGetConfigNameCb) (SyncevoSession *session,
char *name,
GError *error,
gpointer userdata);
void syncevo_session_get_config_name (SyncevoSession *session,
SyncevoSessionGetConfigNameCb callback,
gpointer userdata);
typedef void (*SyncevoSessionGetConfigCb) (SyncevoSession *session,
SyncevoConfig *config,
GError *error,

View File

@ -244,7 +244,7 @@ get_config_for_overwrite_prevention_cb (SyncevoSession *session,
sync_config_widget_set_name (data->widget, name);
g_free (name);
syncevo_server_start_session (data->widget->server,
syncevo_server_start_no_sync_session (data->widget->server,
data->widget->config_name,
(SyncevoServerStartSessionCb)start_session_for_config_write_cb,
data);
@ -359,7 +359,7 @@ stop_clicked_cb (GtkButton *btn, SyncConfigWidget *self)
data->widget = self;
data->delete = FALSE;
data->temporary = FALSE;
syncevo_server_start_session (self->server,
syncevo_server_start_no_sync_session (self->server,
self->config_name,
(SyncevoServerStartSessionCb)start_session_for_config_write_cb,
data);
@ -462,7 +462,7 @@ use_clicked_cb (GtkButton *btn, SyncConfigWidget *self)
data->delete = FALSE;
data->temporary = FALSE;
data->basename = g_strdup (self->config_name);
syncevo_server_start_session (self->server,
syncevo_server_start_no_sync_session (self->server,
self->config_name,
(SyncevoServerStartSessionCb)start_session_for_config_write_cb,
data);
@ -519,7 +519,7 @@ reset_delete_clicked_cb (GtkButton *btn, SyncConfigWidget *self)
data->delete = TRUE;
data->temporary = FALSE;
syncevo_server_start_session (self->server,
syncevo_server_start_no_sync_session (self->server,
self->config_name,
(SyncevoServerStartSessionCb)start_session_for_config_write_cb,
data);
@ -777,7 +777,7 @@ init_source (char *name,
data->temporary = TRUE;
data->widgets = source_widgets_ref (widgets);
syncevo_server_start_session (self->server,
syncevo_server_start_no_sync_session (self->server,
self->config_name,
(SyncevoServerStartSessionCb)start_session_for_config_write_cb,
data);

View File

@ -185,7 +185,7 @@ static void update_services_list (app_data *data);
static void update_service_ui (app_data *data);
static void setup_new_service_clicked (GtkButton *btn, app_data *data);
static gboolean source_config_update_widget (source_config *source);
static void get_presence_cb (SyncevoServer *server, char *status, char *transport,
static void get_presence_cb (SyncevoServer *server, char *status, char **transport,
GError *error, app_data *data);
static void get_reports_cb (SyncevoServer *server, SyncevoReports *reports,
GError *error, app_data *data);
@ -1210,7 +1210,7 @@ autosync_toggle_cb (GtkWidget *widget, gpointer x, app_data *data)
op_data->data = data;
op_data->operation = OP_SAVE;
op_data->started = FALSE;
syncevo_server_start_session (data->server,
syncevo_server_start_no_sync_session (data->server,
data->current_service->name,
(SyncevoServerStartSessionCb)start_session_cb,
op_data);
@ -3328,7 +3328,7 @@ set_online_status (app_data *data, gboolean online)
static void
get_presence_cb (SyncevoServer *server,
char *status,
char *transport,
char **transports,
GError *error,
app_data *data)
{
@ -3343,7 +3343,7 @@ get_presence_cb (SyncevoServer *server,
set_online_status (data, strcmp (status, "") == 0);
}
g_free (status);
g_free (transport);
g_strfreev (transports);
}
static void
@ -3456,7 +3456,7 @@ server_presence_changed_cb (SyncevoServer *server,
{
if (data->current_service &&
config_name && status &&
strcmp (data->current_service->name, config_name) == 0) {
g_strcasecmp (data->current_service->name, config_name) == 0) {
set_online_status (data, strcmp (status, "") == 0);
}
@ -3549,9 +3549,9 @@ sync_ui_create ()
G_CALLBACK (server_shutdown_cb), data);
g_signal_connect (data->server, "session-changed",
G_CALLBACK (server_session_changed_cb), data);
g_signal_connect (data->server, "presence_changed",
g_signal_connect (data->server, "presence-changed",
G_CALLBACK (server_presence_changed_cb), data);
g_signal_connect (data->server, "templates_changed",
g_signal_connect (data->server, "templates-changed",
G_CALLBACK (server_templates_changed_cb), data);
g_signal_connect (data->server, "info-request",
G_CALLBACK (info_request_cb), data);

View File

@ -6110,7 +6110,11 @@ void AutoSyncManager::Notification::send(const char *summary,
notify_notification_clear_actions(m_notification);
notify_notification_close(m_notification, NULL);
}
#if !defined(NOTIFY_CHECK_VERSION)
m_notification = notify_notification_new(summary, body, NULL, NULL);
#else // NOTIFY_CHECK_VERSION(0,7,0) is redundant, because 0.7.0 introduced NOTIFY_CHECK_VERSION
m_notification = notify_notification_new(summary, body, NULL);
#endif
//if actions are not supported, don't add actions
//An example is Ubuntu Notify OSD. It uses an alert box
//instead of a bubble when a notification is appended with actions.

View File

@ -1854,7 +1854,7 @@ public:
"peers/scheduleworld/config.ini:# SSLVerifyHost = 1\n"
"peers/scheduleworld/config.ini:WebURL = http://www.scheduleworld.com\n"
"peers/scheduleworld/config.ini:# IconURI = \n"
"peers/scheduleworld/config.ini:ConsumerReady = 1\n"
"peers/scheduleworld/config.ini:# ConsumerReady = 0\n"
"peers/scheduleworld/sources/addressbook/.internal.ini:# adminData = \n"
"peers/scheduleworld/sources/addressbook/.internal.ini:# synthesisID = 0\n"
@ -3111,7 +3111,7 @@ private:
"spds/syncml/config.txt:# SSLVerifyHost = 1\n"
"spds/syncml/config.txt:WebURL = http://www.scheduleworld.com\n"
"spds/syncml/config.txt:# IconURI = \n"
"spds/syncml/config.txt:ConsumerReady = 1\n"
"spds/syncml/config.txt:# ConsumerReady = 0\n"
"spds/sources/addressbook/config.txt:sync = two-way\n"
"spds/sources/addressbook/config.txt:type = addressbook:text/vcard\n"
"spds/sources/addressbook/config.txt:# evolutionsource = \n"
@ -3151,6 +3151,10 @@ private:
"WebURL = http://www.scheduleworld.com",
"WebURL = http://my.funambol.com");
boost::replace_first(config,
"# ConsumerReady = 0",
"ConsumerReady = 1");
boost::replace_first(config,
"# enableWBXML = 1",
"enableWBXML = 0");
@ -3195,10 +3199,6 @@ private:
"WebURL = http://www.scheduleworld.com",
"WebURL = http://www.synthesis.ch");
boost::replace_first(config,
"ConsumerReady = 1",
"# ConsumerReady = 0");
boost::replace_first(config,
"addressbook/config.ini:uri = card3",
"addressbook/config.ini:uri = contacts");

View File

@ -612,7 +612,11 @@ boost::shared_ptr<SyncConfig> SyncConfig::createPeerTemplate(const string &serve
boost::iequals(server, "default")) {
config->setSyncURL("http://sync.scheduleworld.com/funambol/ds");
config->setWebURL("http://www.scheduleworld.com");
config->setConsumerReady(true);
// ScheduleWorld was shut down end of November 2010.
// Completely removing all traces of it from SyncEvolution
// source code is too intrusive for the time being, so
// just disable it in the UI.
// config->setConsumerReady(false);
source = config->getSyncSourceConfig("addressbook");
source->setURI("card3");
source->setSourceType("addressbook:text/vcard");

View File

@ -118,9 +118,10 @@ void splitPath(const string &path, string &dir, string &file)
bool relToAbs(string &path)
{
char buffer[PATH_MAX+1];
if (realpath(path.c_str(), buffer)) {
char *buffer;
if ((buffer = realpath(path.c_str(), NULL)) != NULL) {
path = buffer;
free(buffer);
return true;
} else {
return false;

View File

@ -5,7 +5,6 @@ description = http://www.scheduleworld.org
=== config.ini ===
syncURL = http://sync.scheduleworld.com/funambol/ds
WebURL = http://www.scheduleworld.com
ConsumerReady = TRUE
=== sources/addressbook/config.ini ===
type = addressbook:text/vcard

View File

@ -58,6 +58,7 @@ http://bugzilla.moblin.org/show_bug.cgi?id=3009
Client::Sync::text::testOneWayFromClient, \
Client::Sync::text::Retry,Client::Sync::text::Suspend, \
disable "prevent slow sync"
* Test Profiles Settings
N/A