#ifndef _SEC_SOSENGINE_H_
#define _SEC_SOSENGINE_H_
#include <SecureObjectSync/SOSTransport.h>
#include <CoreFoundation/CFRuntime.h>
__BEGIN_DECLS
enum {
kSOSEngineInvalidMessageError = 1,
kSOSEngineInternalError = 2,
};
typedef struct __OpaqueSOSEngine *SOSEngineRef;
typedef struct __OpaqueSOSPeer *SOSPeerRef;
typedef struct SOSDataSource *SOSDataSourceRef;
typedef struct __OpaqueSOSObject *SOSObjectRef;
enum SOSMergeResult {
kSOSMergeFailure = 0, kSOSMergeLocalObject, kSOSMergePeersObject, kSOSMergeCreatedObject, };
typedef CFIndex SOSMergeResult;
struct SOSDataSource {
bool (*get_manifest_digest)(SOSDataSourceRef ds, uint8_t *out_digest, CFErrorRef *error);
SOSManifestRef (*copy_manifest)(SOSDataSourceRef ds, CFErrorRef *error);
bool (*foreach_object)(SOSDataSourceRef ds, SOSManifestRef manifest, CFErrorRef *error, bool (^handle_object)(SOSObjectRef object, CFErrorRef *error));
SOSMergeResult (*add)(SOSDataSourceRef ds, SOSObjectRef object, CFErrorRef *error);
void (*release)(SOSDataSourceRef ds);
SOSObjectRef (*createWithPropertyList)(SOSDataSourceRef ds, CFDictionaryRef plist, CFErrorRef *error);
CFDataRef (*copyDigest)(SOSObjectRef object, CFErrorRef *error);
CFDataRef (*copyPrimaryKey)(SOSObjectRef object, CFErrorRef *error);
CFDictionaryRef (*copyPropertyList)(SOSObjectRef object, CFErrorRef *error);
SOSObjectRef (*copyMergedObject)(SOSObjectRef object1, SOSObjectRef object2, CFErrorRef *error);
CFDictionaryRef (*backupObject)(SOSObjectRef object, uint64_t handle, CFErrorRef *error);
bool (*restoreObject)(SOSDataSourceRef ds, uint64_t handle, CFDictionaryRef item, CFErrorRef *error);
};
SOSEngineRef SOSEngineCreate(SOSDataSourceRef dataSource, CFErrorRef *error);
void SOSEngineDispose(SOSEngineRef engine);
bool SOSEngineHandleMessage(SOSEngineRef engine, SOSPeerRef peer,
CFDataRef message, CFErrorRef *error);
bool SOSEngineSyncWithPeer(SOSEngineRef engine, SOSPeerRef peer, bool force,
CFErrorRef *error);
CFDataRef SOSEngineCreateManifestDigestMessage(SOSEngineRef engine, SOSPeerRef peer, CFErrorRef *error);
CFDataRef SOSEngineCreateManifestMessage(SOSEngineRef engine, SOSPeerRef peer, CFErrorRef *error);
CFDataRef SOSEngineCreateManifestAndObjectsMessage(SOSEngineRef engine, SOSPeerRef peer, CFErrorRef *error);
CFStringRef SOSMessageCopyDescription(CFDataRef message);
__END_DECLS
#endif