Attached a patch for gnomevfs for the following (as detailed in
changelog)
1) hopefully fixed file creation problem as reported by Alan Hartless.
It seems the module was checking for an error code when it shouldn't be.
2) fix to configure.ac.in to cope with variable expansion for later
autoconf versions
3) mem leak in _close_dir
4) fixed itemcount in _open_dir
5) changes to debug output, added --without-verbose-debug to configure
(still need to do some tidying here)
6) added more error code handling
Also attached is a patch to libsynce for more error codes, and extras
for synce_strerror. I can deal with these codes in vfs but I think they
are common enough to be in libsynce.
Mark
diff -Nur synce-gnomevfs-0.10.0.svn20070511.orig/ChangeLog synce-gnomevfs-0.10.0.svn20070511/ChangeLog
--- synce-gnomevfs-0.10.0.svn20070511.orig/ChangeLog 2007-05-05 16:24:38.000000000 +0100
+++ synce-gnomevfs-0.10.0.svn20070511/ChangeLog 2007-05-21 20:24:36.000000000 +0100
@@ -1,3 +1,12 @@
+2007-05-09 Mark Ellis <[EMAIL PROTECTED]>
+ * fixed invalid return in _open & _create if mode GENERIC_WRITE
+ * added and tidied debugging output
+ * added --without-verbose-debug to configure
+ * fix var expansion for later autoconf version
+ * fixed memory leak in close_dir
+ * modified open_dir for Applications
+ * added more error codes
+
2007-05-05 Mark Ellis <[EMAIL PROTECTED]>
* corrected gnome-vfs system config file
diff -Nur synce-gnomevfs-0.10.0.svn20070511.orig/configure.ac.in synce-gnomevfs-0.10.0.svn20070511/configure.ac.in
--- synce-gnomevfs-0.10.0.svn20070511.orig/configure.ac.in 2007-05-08 09:06:58.000000000 +0100
+++ synce-gnomevfs-0.10.0.svn20070511/configure.ac.in 2007-05-21 19:51:09.000000000 +0100
@@ -28,13 +28,24 @@
dnl Check for librapi2
PKG_CHECK_MODULES(LIBRAPI2, librapi2 >= 0.10.0)
+dnl
+dnl debugging output
+dnl
+AC_ARG_WITH(verbose-debug, AC_HELP_STRING([--without-verbose-debug], [Build without copious syslog debugging output]))
+if test x"$with_verbose_debug" != xno; then
+ AC_DEFINE(WITH_VERBOSE_DEBUG, 1, [Build with copious syslog debugging output])
+fi
+
dnl Prevent "NONE" used as prefix!
test "x$prefix" = xNONE && eval prefix=$ac_default_prefix
test "x$exec_prefix" = xNONE && eval exec_prefix='${prefix}'
+## need to expand these an extra time since autoconf introduced $datarootdir
eval SYNCE_IN_COMPUTER_FOLDER_SH="${datadir}/synce/synce-in-computer-folder.sh"
+eval SYNCE_IN_COMPUTER_FOLDER_SH="${SYNCE_IN_COMPUTER_FOLDER_SH}"
AC_DEFINE_UNQUOTED(SYNCE_IN_COMPUTER_FOLDER_SH, "$SYNCE_IN_COMPUTER_FOLDER_SH", "Script for use with dccm.")
eval SYNCE_ICON="${datadir}/pixmaps/synce/synce-color.png"
+eval SYNCE_ICON="${SYNCE_ICON}"
AC_DEFINE_UNQUOTED(SYNCE_ICON, "$SYNCE_ICON", "Icon file path.")
eval SYNCE_BINDIR="${bindir}"
@@ -43,8 +54,8 @@
AC_OUTPUT([
Makefile
- pixmaps/Makefile
- script/Makefile
+ pixmaps/Makefile
+ script/Makefile
src/Makefile
man/Makefile
])
diff -Nur synce-gnomevfs-0.10.0.svn20070511.orig/src/libsyncevfs.c synce-gnomevfs-0.10.0.svn20070511/src/libsyncevfs.c
--- synce-gnomevfs-0.10.0.svn20070511.orig/src/libsyncevfs.c 2007-05-05 16:24:38.000000000 +0100
+++ synce-gnomevfs-0.10.0.svn20070511/src/libsyncevfs.c 2007-05-21 19:50:01.000000000 +0100
@@ -1,3 +1,5 @@
+#include "config.h"
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -17,7 +19,11 @@
#define SHOW_APPLICATIONS 0
+#ifdef WITH_VERBOSE_DEBUG
#define D(x...) synce_debug(x)
+#else
+#define D(x...)
+#endif
#ifdef G_THREADS_ENABLED
#define MUTEX_NEW() g_mutex_new ()
@@ -63,6 +69,14 @@
HRESULT hresult;
} ErrorCodeTriple;
+/* hack, these should be in synce.h */
+#ifndef ERROR_TOO_MANY_OPEN_FILES
+#define ERROR_TOO_MANY_OPEN_FILES 4
+#define ERROR_INVALID_HANDLE 6
+#define ERROR_NO_MORE_FILES 18
+#define ERROR_DISK_FULL 112
+#endif
+
static ErrorCodeTriple error_codes[] =
{
{GNOME_VFS_OK, ERROR_SUCCESS, S_OK },
@@ -74,7 +88,10 @@
{GNOME_VFS_ERROR_FILE_EXISTS, ERROR_FILE_EXISTS, 0},
{GNOME_VFS_ERROR_FILE_EXISTS, ERROR_ALREADY_EXISTS, 0},
{GNOME_VFS_ERROR_DIRECTORY_NOT_EMPTY, ERROR_DIR_NOT_EMPTY, 0},
- {GNOME_VFS_ERROR_NOT_PERMITTED, ERROR_ACCESS_DENIED, 0}
+ {GNOME_VFS_ERROR_NOT_PERMITTED, ERROR_ACCESS_DENIED, 0},
+ {GNOME_VFS_ERROR_TOO_MANY_OPEN_FILES, ERROR_TOO_MANY_OPEN_FILES, 0},
+ {GNOME_VFS_ERROR_NOT_FOUND, ERROR_NO_MORE_FILES, 0},
+ {GNOME_VFS_ERROR_NO_SPACE, ERROR_DISK_FULL, 0}
};
static GnomeVFSResult gnome_vfs_result_from_rapi()/*{{{*/
@@ -132,7 +149,7 @@
if (FAILED(hr))
{
- fprintf(stderr, "Unable to initialize RAPI: %s\n",
+ synce_error("Unable to initialize RAPI: %s",
synce_strerror(hr));
return GNOME_VFS_ERROR_LOGIN_FAILED;
}
@@ -240,8 +257,7 @@
int synce_create_mode;
HANDLE handle;
- D("--------------------------------------------\n");
- D("synce_open()\n");
+ D("------------------ synce_open() ------------------\n");
if ((result = initialize_rapi()) != GNOME_VFS_OK)
return result;
@@ -290,9 +306,9 @@
g_free(location);
wstr_free_string(wide_path);
- *(method_handle_return) = GUINT_TO_POINTER(handle);
+ *(method_handle_return) = GUINT_TO_POINTER(handle);
- if((handle == INVALID_HANDLE_VALUE) || (synce_open_mode & GENERIC_WRITE))
+ if(handle == INVALID_HANDLE_VALUE)
result = gnome_vfs_result_from_rapi();
else
result = GNOME_VFS_OK;
@@ -300,6 +316,7 @@
MUTEX_UNLOCK (mutex);
exit:
+ D("------------------ synce_open() end --------------\n");
return result;
}/*}}}*/
@@ -322,8 +339,7 @@
HANDLE handle;
char *tempstring;
- D("--------------------------------------------\n");
- D("synce_create()\n");
+ D("------------------ synce_create() ----------------\n");
if ((result = initialize_rapi()) != GNOME_VFS_OK)
return result;
@@ -374,9 +390,9 @@
g_free(location);
wstr_free_string(wide_path);
- *(method_handle_return) = GUINT_TO_POINTER(handle);
+ *(method_handle_return) = GUINT_TO_POINTER(handle);
- if((handle == INVALID_HANDLE_VALUE) || (synce_open_mode & GENERIC_WRITE))
+ if(handle == INVALID_HANDLE_VALUE)
result = gnome_vfs_result_from_rapi();
else
result = GNOME_VFS_OK;
@@ -384,6 +400,7 @@
MUTEX_UNLOCK (mutex);
exit:
+ D("------------------ synce_create() end ------------\n");
return result;
}/*}}}*/
@@ -398,12 +415,12 @@
HANDLE handle;
int success;
- D("------------------- synce_close() -----------------------\n");
+ D("------------------- synce_close() ----------------\n");
if ((result = initialize_rapi()) != GNOME_VFS_OK)
return result;
- handle = GPOINTER_TO_UINT(method_handle);
+ handle = GPOINTER_TO_UINT(method_handle);
D("synce_close: CeCloseHandle()\n");
MUTEX_LOCK (mutex);
@@ -416,6 +433,7 @@
MUTEX_UNLOCK (mutex);
+ D("------------------- synce_close() end ------------\n");
return result;
}/*}}}*/
@@ -431,16 +449,15 @@
{
GnomeVFSResult result;
int success;
- DWORD read_return;
+ DWORD read_return;
HANDLE handle;
- D("------------------ synce_read() ---------------------\n");
- D("synce_read()\n");
+ D("------------------ synce_read() ------------------\n");
if ((result = initialize_rapi()) != GNOME_VFS_OK)
return result;
- handle = GPOINTER_TO_UINT(method_handle);
+ handle = GPOINTER_TO_UINT(method_handle);
D("CeReadFile\n");
MUTEX_LOCK (mutex);
@@ -468,6 +485,7 @@
}
MUTEX_UNLOCK (mutex);
+ D("------------------ synce_read() end --------------\n");
return result;
}/*}}}*/
@@ -484,14 +502,14 @@
GnomeVFSResult result;
int success;
HANDLE handle;
- DWORD bytes_written;
+ DWORD bytes_written;
- D("----------------- synce_write() -------------------\n");
+ D("----------------- synce_write() ------------------\n");
if ((result = initialize_rapi()) != GNOME_VFS_OK)
return result;
- handle = GPOINTER_TO_UINT(method_handle);
+ handle = GPOINTER_TO_UINT(method_handle);
D("CeWriteFile()\n");
MUTEX_LOCK (mutex);
@@ -522,6 +540,7 @@
}
MUTEX_UNLOCK (mutex);
+ D("----------------- synce_write() end --------------\n");
return result;
}/*}}}*/
@@ -578,6 +597,7 @@
MUTEX_UNLOCK (mutex);
+ D("------------------ synce_seek() end --------------\n");
return result;
}
@@ -619,6 +639,7 @@
MUTEX_UNLOCK (mutex);
+ D("------------------ synce_tell() end --------------\n");
return result;
}
@@ -641,7 +662,7 @@
WCHAR *tempwstr;
int index;
- D("------------------ synce_open_dir() -------------------\n");
+ D("------------------ synce_open_dir() --------------\n");
if ((result = initialize_rapi()) != GNOME_VFS_OK)
return result;
@@ -654,7 +675,11 @@
dh->index = INDEX_DEVICE;
dh->location = NULL;
+#if SHOW_APPLICATIONS
dh->itemcount = 3; /* Applications, Documents, Filesystem */
+#else
+ dh->itemcount = 2; /* Documents, Filesystem */
+#endif
dh->count = 0;
dh->data = NULL;
@@ -743,7 +768,7 @@
wstr_free_string(tempwstr);
result = gnome_vfs_result_from_rapi();
MUTEX_UNLOCK (mutex);
- return result;
+ goto exit;
}
MUTEX_UNLOCK (mutex);
@@ -762,6 +787,7 @@
result = GNOME_VFS_OK;
exit:
+ D("------------------ synce_open_dir() end ----------\n");
return result;
}/*}}}*/
@@ -776,7 +802,7 @@
DIR_HANDLE *dh;
HRESULT hr;
- D("----------------- synce_close_dir() ------------------\n");
+ D("----------------- synce_close_dir() --------------\n");
if ((result = initialize_rapi()) != GNOME_VFS_OK)
return result;
@@ -792,16 +818,14 @@
if (FAILED(hr))
{
D("synce_close_dir: Failed\n");
- D("----------------- synce_close_dir() end --------------\n");
+ g_free(dh);
+ D("----------------- synce_close_dir() end ----------\n");
return GNOME_VFS_ERROR_GENERIC;
}
- else
- {
- D("synce_close_dir: Ok\n");
- D("----------------- synce_close_dir() end --------------\n");
- return GNOME_VFS_OK;
- }
+ D("synce_close_dir: Ok\n");
g_free(dh);
+ D("----------------- synce_close_dir() end ----------\n");
+ return GNOME_VFS_OK;
}/*}}}*/
/* Have to fix the mime-type conversion */
@@ -900,7 +924,7 @@
DIR_HANDLE *dh;
BOOL success = FALSE;
- D("------------------ synce_read_dir() --------------------\n");
+ D("------------------ synce_read_dir() --------------\n");
if ((result = initialize_rapi()) != GNOME_VFS_OK)
return result;
@@ -911,7 +935,7 @@
{
D("synce_read_dir: Synce Error: %d %s\n", 38, "End of file");
D("synce_read_dir: Ok\n");
- D("------------------ synce_read_dir() end ----------------\n");
+ D("------------------ synce_read_dir() end ----------\n");
return GNOME_VFS_ERROR_EOF;
}
@@ -973,7 +997,7 @@
if(!success)
{
D("synce_read_dir: Failed\n");
- D("------------------ synce_read_dir() end ----------------\n");
+ D("------------------ synce_read_dir() end ----------\n");
return GNOME_VFS_ERROR_CORRUPTED_DATA;
}
else
@@ -981,7 +1005,7 @@
D("synce_read_dir: Name: %s\n", file_info->name);
D("synce_read_dir: Mime-type: %s\n", file_info->mime_type);
D("synce_read_dir: Ok\n");
- D("------------------ synce_read_dir() end ----------------\n");
+ D("------------------ synce_read_dir() end ----------\n");
return GNOME_VFS_OK;
}
}/*}}}*/
@@ -1001,7 +1025,7 @@
WCHAR *tempwstr;
int err;
- D("------------- synce_get_file_info() -----------------\n");
+ D("------------- synce_get_file_info() --------------\n");
if ((result = initialize_rapi()) != GNOME_VFS_OK)
return result;
@@ -1039,7 +1063,7 @@
{
D("synce_get_file_info Synce Error: %d %s\n", 2, "ERROR_FILE_NOT_FOUND");
D("synce_get_file_info Failed\n");
- D("------------- synce_get_file_info() end --------------\n");
+ D("------------- synce_get_file_info() end ----------\n");
return GNOME_VFS_ERROR_INVALID_URI;
}
else if(strcmp(location, "\\") == 0)
@@ -1049,7 +1073,7 @@
get_root_attributes(file_info);
D("synce_get_file_info: Ok\n");
- D("------------- synce_get_file_info() end --------------\n");
+ D("------------- synce_get_file_info() end ----------\n");
return GNOME_VFS_OK;
}
else if(location[strlen(location)-1] == '\\')
@@ -1078,7 +1102,6 @@
g_free(location);
D("synce_get_file_info: Failed\n");
- D("------------- synce_get_file_info() end --------------\n");
result = gnome_vfs_result_from_rapi();
}
@@ -1093,12 +1116,12 @@
D("synce_get_file_info: Name: %s\n", file_info->name);
D("synce_get_file_info: Mime-type: %s\n", file_info->mime_type);
D("synce_get_file_info: Ok\n");
- D("------------- synce_get_file_info() end --------------\n");
result = GNOME_VFS_OK;
}
exit:
+ D("------------- synce_get_file_info() end ----------\n");
return result;
}/*}}}*/
@@ -1111,7 +1134,8 @@
GnomeVFSContext *context
)
{
- D("synce_get_files_info_from_handle\n");
+ D("--------- synce_get_file_info_from_handle --------\n");
+ D("------- synce_get_file_info_from_handle end ------\n");
return GNOME_VFS_ERROR_ACCESS_DENIED;
}/*}}}*/
@@ -1137,8 +1161,7 @@
gchar *location;
WCHAR *tempwstr;
- D("--------------------------------------------\n");
- D("synce_mkdir()\n");
+ D("------------------ synce_mkdir() -----------------\n");
if ((result = initialize_rapi()) != GNOME_VFS_OK)
return result;
@@ -1167,7 +1190,7 @@
{
D("Synce Error: %d %s\n", 13, "ERROR_INVALID_DATA");
D("Failed\n");
- D("--------------------------------------------\n");
+ D("---------------- synce_mkdir() end ---------------\n");
return GNOME_VFS_ERROR_INVALID_URI;
}
@@ -1180,6 +1203,7 @@
wstr_free_string(tempwstr);
result = gnome_vfs_result_from_rapi();
MUTEX_UNLOCK (mutex);
+ D("---------------- synce_mkdir() end ---------------\n");
return result;
}
@@ -1194,6 +1218,7 @@
result = GNOME_VFS_OK;
exit:
+ D("---------------- synce_mkdir() end ---------------\n");
return result;
}/*}}}*/
@@ -1210,7 +1235,7 @@
int err;
int success;
- D("----------------- synce_rmdir() -----------------------\n");
+ D("----------------- synce_rmdir() ------------------\n");
if ((result = initialize_rapi()) != GNOME_VFS_OK)
return result;
@@ -1239,7 +1264,7 @@
{
D("synce_rmdir: Synce Error: %d %s\n", 13, "ERROR_INVALID_DATA");
D("synce_rmdir: Failed\n");
- D("----------------- synce_rmdir() end -------------------\n");
+ D("----------------- synce_rmdir() end --------------\n");
return GNOME_VFS_ERROR_INVALID_URI;
}
@@ -1262,6 +1287,7 @@
MUTEX_UNLOCK (mutex);
exit:
+ D("----------------- synce_rmdir() end --------------\n");
return result;
}/*}}}*/
@@ -1282,8 +1308,7 @@
int success;
int err;
- D("--------------------------------------------\n");
- D("synce_move()\n");
+ D("------------------ synce_move() ------------------\n");
if ((result = initialize_rapi()) != GNOME_VFS_OK)
return result;
@@ -1312,6 +1337,7 @@
if(!new_location)
{
D("Failed\n");
+ D("---------------- synce_move() end ------------------\n");
return GNOME_VFS_ERROR_INVALID_URI;
}
@@ -1341,7 +1367,7 @@
g_free(new_location);
D("Synce Error: %d %s\n", 13, "ERROR_INVALID_DATA");
D("Failed\n");
- D("--------------------------------------------\n");
+ D("---------------- synce_move() end ------------------\n");
return GNOME_VFS_ERROR_INVALID_URI;
}
@@ -1379,11 +1405,12 @@
MUTEX_UNLOCK (mutex);
exit:
+ D("---------------- synce_move() end ------------------\n");
return result;
}/*}}}*/
- static GnomeVFSResult/*{{{*/
+static GnomeVFSResult/*{{{*/
synce_set_file_info (GnomeVFSMethod *method,
GnomeVFSURI *uri,
const GnomeVFSFileInfo *info,
@@ -1393,11 +1420,14 @@
GnomeVFSURI *parent_uri, *new_uri;
GnomeVFSResult result;
+ D("-------------- synce_set_file_info() ---------------\n");
+
if ((result = initialize_rapi()) != GNOME_VFS_OK)
return result;
/* For now, we only support changing the name. */
if ((mask & ~(GNOME_VFS_SET_FILE_INFO_NAME)) != 0) {
+ D("------------ synce_set_file_info() end ---------\n");
return GNOME_VFS_ERROR_NOT_SUPPORTED;
}
@@ -1406,6 +1436,7 @@
* instead of moving the file.
*/
if (g_utf8_strchr(info->name,-1,'/') != NULL) {
+ D("------------ synce_set_file_info() end ---------\n");
return GNOME_VFS_ERROR_BAD_PARAMETERS;
}
@@ -1418,6 +1449,7 @@
gnome_vfs_uri_unref (parent_uri);
result = synce_move (method, uri, new_uri, FALSE, context);
gnome_vfs_uri_unref (new_uri);
+ D("------------ synce_set_file_info() end ---------\n");
return result;
}/*}}}*/
@@ -1433,8 +1465,7 @@
int success;
WCHAR *tempwstr;
- D("--------------------------------------------\n");
- D("synce_unlink()\n");
+ D("----------------- synce_unlink() ---------------\n");
if ((result = initialize_rapi()) != GNOME_VFS_OK)
return result;
@@ -1468,6 +1499,7 @@
D("Synce Error: %d %s\n", 13, "ERROR_INVALID_DATA");
D("Failed\n");
D("--------------------------------------------\n");
+ D("--------------- synce_unlink() end -------------\n");
return GNOME_VFS_ERROR_INVALID_URI;
}
@@ -1493,6 +1525,7 @@
}
exit:
+ D("--------------- synce_unlink() end -------------\n");
return result;
}/*}}}*/
@@ -1505,8 +1538,10 @@
GnomeVFSContext *context
)
{
+ D("----------------- synce_same_fs() --------------\n");
*same_fs_return = 1;
+ D("--------------- synce_same_fs() end ------------\n");
return GNOME_VFS_OK;
}/*}}}*/
@@ -1520,7 +1555,7 @@
synce_write,
synce_seek,
synce_tell,
- NULL, /* truncate */
+ NULL, /* truncate_handle */
synce_open_dir,
synce_close_dir,
synce_read_dir,
diff -Nur libsynce.orig/lib/errors.c libsynce/lib/errors.c
--- libsynce.orig/lib/errors.c 2007-05-21 13:24:37.000000000 +0100
+++ libsynce/lib/errors.c 2007-05-21 13:54:53.000000000 +0100
@@ -25,8 +25,25 @@
case ERROR_FILE_NOT_FOUND: result = "File not found"; break;
case ERROR_PATH_NOT_FOUND: result = "Path not found"; break;
- case ERROR_DIR_NOT_EMPTY: result = "Directory not empty"; break;
+ case ERROR_TOO_MANY_OPEN_FILES: result = "Too many open files"; break;
+ case ERROR_ACCESS_DENIED: result = "Access is denied"; break;
+ case ERROR_INVALID_HANDLE: result = "Invalid file handle"; break;
+ case ERROR_NOT_ENOUGH_MEMORY: result = "Not enough memory"; break;
+ case ERROR_NO_MORE_FILES: result = "There are no more files"; break;
+ case ERROR_SEEK: result = "Drive seek error"; break;
+ case ERROR_SHARING_VIOLATION: result = "Sharing violation"; break;
+ case ERROR_NOT_SUPPORTED: result = "Not supported"; break;
+ case ERROR_DUP_NAME: result = "Duplicate name"; break;
+ case ERROR_FILE_EXISTS: result = "File exists"; break;
case ERROR_INVALID_PARAMETER: result = "Invalid parameter"; break;
+ case ERROR_DISK_FULL: result = "Not enough space on disk"; break;
+ case ERROR_INSUFFICIENT_BUFFER: result = "Insufficient buffer"; break;
+ case ERROR_INVALID_NAME: result = "Invalid name"; break;
+ case ERROR_DIR_NOT_EMPTY: result = "Directory not empty"; break;
+ case ERROR_ALREADY_EXISTS: result = "File already exists"; break;
+ case ERROR_NO_DATA: result = "No more data in pipe"; break;
+ case ERROR_NO_MORE_ITEMS: result = "No more data available"; break;
+ case ERROR_KEY_DELETED: result = "Registry key marked for deletion"; break;
default:
synce_trace("Unknown error code: 0x%08x", error);
diff -Nur libsynce.orig/lib/synce_types.h libsynce/lib/synce_types.h
--- libsynce.orig/lib/synce_types.h 2007-05-21 13:24:37.000000000 +0100
+++ libsynce/lib/synce_types.h 2007-05-21 13:55:05.000000000 +0100
@@ -135,14 +135,18 @@
#define ERROR_SUCCESS 0
#define ERROR_FILE_NOT_FOUND 2
#define ERROR_PATH_NOT_FOUND 3
+#define ERROR_TOO_MANY_OPEN_FILES 4
#define ERROR_ACCESS_DENIED 5
+#define ERROR_INVALID_HANDLE 6
#define ERROR_NOT_ENOUGH_MEMORY 8
+#define ERROR_NO_MORE_FILES 18
#define ERROR_SEEK 25
#define ERROR_SHARING_VIOLATION 32
#define ERROR_NOT_SUPPORTED 50
#define ERROR_DUP_NAME 52
#define ERROR_FILE_EXISTS 80
#define ERROR_INVALID_PARAMETER 87
+#define ERROR_DISK_FULL 112
#define ERROR_INSUFFICIENT_BUFFER 122
#define ERROR_INVALID_NAME 123
#define ERROR_DIR_NOT_EMPTY 145
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
SynCE-Devel mailing list
SynCE-Devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/synce-devel