You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
394 lines
9.1 KiB
394 lines
9.1 KiB
%module opensync
|
|
%include "cdata.i"
|
|
%include "cstring.i"
|
|
%include "typemaps.i"
|
|
|
|
%{
|
|
#include "opensync.h"
|
|
#include <glib.h>
|
|
%}
|
|
|
|
%include "opensync.h"
|
|
typedef struct {} OSyncEnv;
|
|
typedef struct {} OSyncPlugin;
|
|
typedef struct {} OSyncPluginInfo;
|
|
typedef struct {} OSyncContext;
|
|
typedef struct {} OSyncChange;
|
|
typedef struct {} OSyncMember;
|
|
typedef struct {} OSyncHashTable;
|
|
|
|
%extend OSyncMember {
|
|
OSyncMember(PyObject *obj) {
|
|
OSyncMember *member = NULL;
|
|
member = (OSyncMember *)PyCObject_AsVoidPtr(obj);
|
|
return member;
|
|
}
|
|
|
|
osync_bool get_slow_sync(const char *objtype) {
|
|
return osync_member_get_slow_sync(self, objtype);
|
|
}
|
|
|
|
void set_slow_sync(const char *objtype, osync_bool set) {
|
|
osync_member_set_slow_sync(self, objtype, set);
|
|
}
|
|
|
|
osync_bool objtype_enabled(const char *objtype) {
|
|
return osync_member_objtype_enabled(self, objtype);
|
|
}
|
|
|
|
const char *get_configdir() {
|
|
return osync_member_get_configdir(self);
|
|
}
|
|
|
|
void set_configdir(const char *configdir) {
|
|
osync_member_set_configdir(self, configdir);
|
|
}
|
|
|
|
%pythoncode %{
|
|
configdir = property(get_configdir, set_configdir);
|
|
%}
|
|
|
|
/* This SWIG code is really confusing, so I'd better explain it:
|
|
* The %apply directive means that any argument called int *sizeout is actually a return value;
|
|
* this means that __get_config (from python) returns two values, a pointer and a length.
|
|
* The char * is returned as a void * to avoid SWIG converting it to a string automatically
|
|
* (because theoretically it might not be null-terminated).
|
|
*/
|
|
%apply int *OUTPUT {int *sizeout};
|
|
void * __get_config(int *sizeout) {
|
|
char *data;
|
|
OSyncError *error;
|
|
/* FIXME: do something with the error! */
|
|
if (osync_member_get_config(self, &data, sizeout, &error))
|
|
return data;
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
void __set_config(void *data, int size) {
|
|
osync_member_set_config(self, data, size);
|
|
}
|
|
|
|
%pythoncode %{
|
|
def get_config(self):
|
|
data, len = self.__get_config()
|
|
return cdata(data, len)
|
|
def set_config(self, data):
|
|
self.__set_config(data, len(data))
|
|
config = property(get_config, set_config)
|
|
%}
|
|
}
|
|
|
|
%extend OSyncChange {
|
|
OSyncChange(PyObject *obj=NULL) {
|
|
OSyncChange *change = NULL;
|
|
if (obj)
|
|
change = (OSyncChange *)PyCObject_AsVoidPtr(obj);
|
|
else
|
|
change = osync_change_new();
|
|
return change;
|
|
}
|
|
|
|
~OSyncChange() {
|
|
osync_trace(TRACE_INTERNAL, "Deleting change %p", self);
|
|
}
|
|
|
|
%cstring_input_binary(char *data, int datasize);
|
|
void __set_data(char *data, int datasize) {
|
|
osync_change_set_data(self, data, datasize, TRUE);
|
|
}
|
|
|
|
void *__get_data() {
|
|
return osync_change_get_data(self);
|
|
}
|
|
|
|
int __get_datasize() {
|
|
return osync_change_get_datasize(self);
|
|
}
|
|
|
|
%pythoncode %{
|
|
def get_data(self):
|
|
try:
|
|
return self.__data
|
|
except AttributeError:
|
|
self.__data = cdata(self.__get_data(), self.__get_datasize())
|
|
# FIXME: despite passing the size around, sometimes the data
|
|
# seems also to be null-terminated; remove this.
|
|
if self.__data[-1] == '\0':
|
|
self.__data = self.__data[:-1]
|
|
return self.__data
|
|
|
|
def set_data(self, data):
|
|
self.__data = data
|
|
self.__set_data(data)
|
|
|
|
data = property(get_data,set_data)
|
|
%}
|
|
|
|
void report(OSyncContext *ctx)
|
|
{
|
|
/* take a copy of the data, so python does not try to reclaim it
|
|
* this memory should be freed by opensync after the change is written
|
|
*/
|
|
if (osync_change_has_data(self)) {
|
|
void *data = osync_change_get_data(self);
|
|
int datasize = osync_change_get_datasize(self);
|
|
void *copy = memcpy(malloc(datasize), data, datasize);
|
|
osync_change_set_data(self, copy, datasize, TRUE);
|
|
}
|
|
osync_context_report_change(ctx, self);
|
|
}
|
|
|
|
void set_uid(const char *uid) {
|
|
osync_change_set_uid(self, uid);
|
|
}
|
|
|
|
const char *get_uid() {
|
|
return osync_change_get_uid(self);
|
|
}
|
|
|
|
%pythoncode %{
|
|
uid = property(get_uid, set_uid)
|
|
%}
|
|
|
|
void set_format(const char *format) {
|
|
osync_change_set_objformat_string(self, format);
|
|
}
|
|
|
|
const char *get_format() {
|
|
OSyncObjFormat *format = osync_change_get_objformat(self);
|
|
if (!format)
|
|
return NULL;
|
|
return osync_objformat_get_name(format);
|
|
}
|
|
|
|
%pythoncode %{
|
|
format = property(get_format, set_format)
|
|
%}
|
|
|
|
void set_objtype(const char *objtype) {
|
|
osync_change_set_objtype_string(self, objtype);
|
|
}
|
|
|
|
const char *get_objtype() {
|
|
OSyncObjType *objtype = osync_change_get_objtype(self);
|
|
if (!objtype)
|
|
return NULL;
|
|
return osync_objtype_get_name(objtype);
|
|
}
|
|
|
|
%pythoncode %{
|
|
objtype = property(get_objtype, set_objtype)
|
|
%}
|
|
|
|
void set_changetype(int changetype) {
|
|
osync_change_set_changetype(self, changetype);
|
|
}
|
|
|
|
int get_changetype() {
|
|
return osync_change_get_changetype(self);
|
|
}
|
|
|
|
%pythoncode %{
|
|
changetype = property(get_changetype, set_changetype)
|
|
%}
|
|
|
|
void set_hash(const char *hash) {
|
|
osync_change_set_hash(self, hash);
|
|
}
|
|
|
|
const char *get_hash() {
|
|
return osync_change_get_hash(self);
|
|
}
|
|
|
|
%pythoncode %{
|
|
hash = property(get_hash, set_hash)
|
|
%}
|
|
|
|
void set_member(OSyncMember *member) {
|
|
osync_change_set_member(self, member);
|
|
}
|
|
|
|
OSyncMember *get_member() {
|
|
return osync_change_get_member(self);
|
|
}
|
|
|
|
%pythoncode %{
|
|
member = property(get_member, set_member);
|
|
%}
|
|
};
|
|
|
|
%extend OSyncContext {
|
|
OSyncContext(PyObject *obj) {
|
|
OSyncContext *ctx = (OSyncContext *)PyCObject_AsVoidPtr(obj);
|
|
return ctx;
|
|
}
|
|
|
|
void report_success(void) {
|
|
osync_context_report_success(self);
|
|
}
|
|
|
|
void report_error(int type, const char *msg) {
|
|
osync_context_report_error(self, type, msg);
|
|
}
|
|
};
|
|
|
|
%extend OSyncPlugin {
|
|
OSyncPlugin(OSyncEnv *env) {
|
|
OSyncPlugin *plugin = osync_plugin_new(env);
|
|
return plugin;
|
|
}
|
|
|
|
~OSyncPlugin() {
|
|
osync_plugin_free(self);
|
|
}
|
|
|
|
const char *get_name() {
|
|
return osync_plugin_get_name(self);
|
|
}
|
|
|
|
%pythoncode %{
|
|
name = property(get_name)
|
|
%}
|
|
};
|
|
|
|
%extend OSyncPluginInfo {
|
|
OSyncPluginInfo(PyObject *obj) {
|
|
OSyncPluginInfo *exinfo = (OSyncPluginInfo *)PyCObject_AsVoidPtr(obj);
|
|
return exinfo;
|
|
}
|
|
|
|
void accept_objtype(const char *objtype) {
|
|
osync_plugin_accept_objtype(self, objtype);
|
|
}
|
|
|
|
void accept_objformat(const char *objtype, const char *objformat, const char *extension = NULL) {
|
|
osync_plugin_accept_objformat(self, objtype, objformat, extension);
|
|
}
|
|
|
|
void set_name(const char *name) {
|
|
self->name = g_strdup(name);
|
|
}
|
|
const char *get_name() {
|
|
return self->name;
|
|
}
|
|
|
|
void set_longname(const char *name) {
|
|
self->longname = g_strdup(name);
|
|
}
|
|
const char *get_longname() {
|
|
return self->longname;
|
|
}
|
|
|
|
void set_description(const char *desc) {
|
|
self->description = g_strdup(desc);
|
|
}
|
|
const char *get_description() {
|
|
return self->description;
|
|
}
|
|
|
|
%pythoncode %{
|
|
name = property(get_name, set_name)
|
|
longname = property(get_longname, set_longname)
|
|
description = property(get_description, set_description)
|
|
%}
|
|
};
|
|
|
|
%extend OSyncEnv {
|
|
OSyncEnv(PyObject *obj) {
|
|
return (OSyncEnv *)PyCObject_AsVoidPtr(obj);
|
|
}
|
|
|
|
OSyncEnv() {
|
|
return osync_env_new();
|
|
}
|
|
|
|
~OSyncEnv() {
|
|
osync_env_free(self);
|
|
}
|
|
|
|
int initialize() {
|
|
return osync_env_initialize(self, NULL);
|
|
}
|
|
|
|
int finalize() {
|
|
return osync_env_finalize(self, NULL);
|
|
}
|
|
|
|
int num_plugins() {
|
|
return osync_env_num_plugins(self);
|
|
}
|
|
|
|
OSyncPlugin *get_nth_plugin(int nth) {
|
|
OSyncPlugin *plugin = osync_env_nth_plugin(self, nth);
|
|
return plugin;
|
|
}
|
|
};
|
|
|
|
%extend OSyncHashTable {
|
|
OSyncHashTable() {
|
|
return osync_hashtable_new();
|
|
}
|
|
|
|
~OSyncHashTable() {
|
|
osync_hashtable_free(self);
|
|
}
|
|
|
|
void forget() {
|
|
osync_hashtable_forget(self);
|
|
}
|
|
|
|
osync_bool load(OSyncMember *member) {
|
|
OSyncError *error;
|
|
/* FIXME: do something with the error! */
|
|
return osync_hashtable_load(self, member, &error);
|
|
}
|
|
|
|
void close() {
|
|
osync_hashtable_close(self);
|
|
}
|
|
|
|
void update_hash(OSyncChange *change) {
|
|
osync_hashtable_update_hash(self, change);
|
|
}
|
|
|
|
void report(const char *uid) {
|
|
osync_hashtable_report(self, uid);
|
|
}
|
|
|
|
void report_deleted(OSyncContext *context, const char *objtype) {
|
|
osync_hashtable_report_deleted(self, context, objtype);
|
|
}
|
|
|
|
OSyncChangeType get_changetype(const char *uid, const char *hash, const char *objtype) {
|
|
return osync_hashtable_get_changetype(self, uid, hash, objtype);
|
|
}
|
|
|
|
osync_bool detect_change(OSyncChange *change) {
|
|
return osync_hashtable_detect_change(self, change);
|
|
}
|
|
|
|
void set_slow_sync(const char *objtype) {
|
|
osync_hashtable_set_slow_sync(self, objtype);
|
|
}
|
|
};
|
|
|
|
/* pull in constants from opensync_error.h without all the functions */
|
|
%constant int NO_ERROR = OSYNC_NO_ERROR;
|
|
%constant int ERROR_GENERIC = OSYNC_ERROR_GENERIC;
|
|
%constant int ERROR_IO_ERROR = OSYNC_ERROR_IO_ERROR;
|
|
%constant int ERROR_NOT_SUPPORTED = OSYNC_ERROR_NOT_SUPPORTED;
|
|
%constant int ERROR_TIMEOUT = OSYNC_ERROR_TIMEOUT;
|
|
%constant int ERROR_DISCONNECTED = OSYNC_ERROR_DISCONNECTED;
|
|
%constant int ERROR_FILE_NOT_FOUND = OSYNC_ERROR_FILE_NOT_FOUND;
|
|
%constant int ERROR_EXISTS = OSYNC_ERROR_EXISTS;
|
|
%constant int ERROR_CONVERT = OSYNC_ERROR_CONVERT;
|
|
%constant int ERROR_MISCONFIGURATION = OSYNC_ERROR_MISCONFIGURATION;
|
|
%constant int ERROR_INITIALIZATION = OSYNC_ERROR_INITIALIZATION;
|
|
%constant int ERROR_PARAMETER = OSYNC_ERROR_PARAMETER;
|
|
%constant int ERROR_EXPECTED = OSYNC_ERROR_EXPECTED;
|
|
%constant int ERROR_NO_CONNECTION = OSYNC_ERROR_NO_CONNECTION;
|
|
%constant int ERROR_TEMPORARY = OSYNC_ERROR_TEMPORARY;
|
|
%constant int ERROR_LOCKED = OSYNC_ERROR_LOCKED;
|
|
%constant int ERROR_PLUGIN_NOT_FOUND = OSYNC_ERROR_PLUGIN_NOT_FOUND;
|