/**
 * @defgroup OSyncConvPrivate OpenSync Conversion Internals
 * @ingroup OSyncPrivate
 * @brief The private API of opensync
 * 
 * This gives you an insight in the private API of opensync.
 * 
 */
/*@{*/

/*! @brief The environment used for conversions
 */
struct OSyncFormatEnv {
	/** A list of object types */
	GList *objtypes;
	/** A List of formats */
	GList *objformats;
	/** A list of available converters */
	GList *converters;
	/** A list of filter functions */
	GList *filter_functions;
	/** A list of extensions */
	GList *extensions;
};

/*! @brief Represent a abstract object type (like "contact")
 */
struct OSyncObjType {
#ifndef DOXYGEN_SHOULD_SKIP_THIS
	char *name;
	GList *formats;
	GList *converters;
	OSyncFormatEnv *env;
	osync_bool needs_slow_sync;
	OSyncObjFormat *common_format;
#endif
};

/*! @brief Represent a format for a object type
 */
struct OSyncObjFormat {
#ifndef DOXYGEN_SHOULD_SKIP_THIS
	char *name;
	OSyncFormatEnv *env;
	OSyncObjType *objtype;
	//GList *extensions;
	OSyncFormatCompareFunc cmp_func;
	OSyncFormatMergeFunc merge_func;
	OSyncFormatDuplicateFunc duplicate_func;
	OSyncFormatCopyFunc copy_func;
	OSyncFormatCreateFunc create_func;
	OSyncFormatDestroyFunc destroy_func;
	OSyncFormatPrintFunc print_func;
	OSyncFormatRevisionFunc revision_func;
	OSyncFormatMarshallFunc marshall_func;
	OSyncFormatDemarshallFunc demarshall_func;
#endif
};

/*! @brief Represent a converter from one format to another
 */
struct OSyncFormatConverter {
#ifndef DOXYGEN_SHOULD_SKIP_THIS
	OSyncObjFormat *source_format;
	OSyncObjFormat *target_format;
	OSyncFormatConvertFunc convert_func;
	OSyncFormatDetectDataFunc detect_func;
	OSyncFormatConverterInitFunc init_func;
	OSyncFormatConverterFinalizeFunc fin_func;
	ConverterType type;
#endif
};

/*! @brief Represent a detector for a given format
 */
typedef struct OSyncDataDetector {
#ifndef DOXYGEN_SHOULD_SKIP_THIS
	const char *sourceformat;
	const char *targetformat;
	OSyncFormatDetectDataFunc detect_func;
#endif
} OSyncDataDetector;

/*! @brief An extension to a format
 */
typedef struct OSyncFormatExtension {
#ifndef DOXYGEN_SHOULD_SKIP_THIS
	OSyncObjFormat *from_format;
	OSyncObjFormat *to_format;
	char *name;
	OSyncFormatConvertFunc conv_func;
	OSyncFormatExtInitFunc init_func;
#endif
} OSyncFormatExtension;

#ifndef DOXYGEN_SHOULD_SKIP_THIS

typedef struct OSyncObjFormatSink {
	OSyncObjFormat *format;
	OSyncFormatFunctions functions;
	char *extension_name;
	struct OSyncObjTypeSink *objtype_sink;
	GList *commit_changes;
	GList *commit_contexts;
} OSyncObjFormatSink;

typedef struct OSyncObjTypeSink {
	OSyncMember *member;
	OSyncObjType *objtype;
	osync_bool write;
	osync_bool read;
	osync_bool enabled;
	GList *formatsinks;
	OSyncObjFormatSink *selected_format;
	GList *properties;
} OSyncObjTypeSink;

typedef struct OSyncObjTypeTemplate {
	const char *name;
	GList *formats;
} OSyncObjTypeTemplate;

typedef struct OSyncObjFormatTemplate {
	const char *name;
	const char *objtype;
	char *extension_name;
	OSyncFormatCommitFn commit_change;
	OSyncFormatAccessFn access;
	OSyncFormatReadFn read;
	OSyncFormatCommittedAllFn committed_all;
	OSyncFormatBatchCommitFn batch_commit;
	OSyncFormatCompareFunc cmp_func;
	OSyncFormatMergeFunc merge_func;
	OSyncFormatDuplicateFunc duplicate_func;
	OSyncFormatCopyFunc copy_func;
	OSyncFormatCreateFunc create_func;
	OSyncFormatDestroyFunc destroy_func;
	OSyncFormatPrintFunc print_func;
	OSyncFormatRevisionFunc revision_func;
	OSyncFormatMarshallFunc marshall_func;
	OSyncFormatDemarshallFunc demarshall_func;
} OSyncObjFormatTemplate;

typedef struct OSyncConverterTemplate {
	const char *source_format;
	const char *target_format;
	OSyncFormatConvertFunc convert_func;
	ConverterType type;
	OSyncFormatConverterInitFunc init_func;
	OSyncFormatConverterFinalizeFunc fin_func;
} OSyncConverterTemplate;

typedef struct OSyncFormatExtensionTemplate {
	char *from_formatname;
	char *to_formatname;
	char *name;
	OSyncFormatExtInitFunc init_func;
} OSyncFormatExtensionTemplate;

/** A target function for osync_conv_find_path_fn() */
typedef osync_bool (*OSyncPathTargetFn)(const void *data, OSyncObjFormat *fmt);

osync_bool osync_conv_find_path_fmtlist(OSyncFormatEnv *env, OSyncChange *start, GList/*OSyncObjFormat * */ *targets, GList **retlist);

osync_bool osync_conv_convert_fn(OSyncFormatEnv *env, OSyncChange *change, OSyncPathTargetFn target_fn, const void *fndata, const char *extension_name, OSyncError **error);
osync_bool osync_conv_convert_fmtlist(OSyncFormatEnv *env, OSyncChange *change, GList/*OSyncObjFormat * */ *targets);
OSyncDataDetector *osync_env_find_detector(OSyncEnv *env, const char *sourcename, const char *targetname);
osync_bool osync_conv_objtype_is_any(const char *objstr);
OSyncFormatExtensionTemplate *osync_env_find_extension_template(OSyncEnv *env, const char *formatname);
OSyncFormatExtension *osync_conv_find_extension(OSyncFormatEnv *env, OSyncObjFormat *from_format, OSyncObjFormat *to_format, const char *extension_name);
OSyncChange *osync_converter_invoke_decap(OSyncFormatConverter *converter, OSyncChange *change, osync_bool *free_output);

#endif

/*@}*/


syntax highlighted by Code2HTML, v. 0.9.1