#ifndef _SOSPEER_H_
#define _SOSPEER_H_
#include <SecureObjectSync/SOSEngine.h>
#include <SecureObjectSync/SOSFullPeerInfo.h>
#include <SecureObjectSync/SOSPeerInfo.h>
__BEGIN_DECLS
enum {
kSOSPeerHasNoManifest = 1,
kSOSPeerDigestFailure = 2,
};
enum {
kSOSPeerCoderDataReturned = 0,
kSOSPeerCoderNegotiating = 1,
kSOSPeerCoderNegotiationCompleted = 2,
kSOSPeerCoderFailure = 3,
kSOSPeerCoderStaleEvent = 4,
};
typedef uint32_t SOSPeerCoderStatus;
typedef bool (^SOSPeerSendBlock)(CFDataRef message, CFErrorRef *error);
SOSPeerRef SOSPeerCreate(SOSFullPeerInfoRef myPeerInfo, SOSPeerInfoRef peerInfo, CFErrorRef *error,
SOSPeerSendBlock sendBlock);
void SOSPeerPurge(SOSPeerRef);
void SOSPeerPurgeAllFor(CFStringRef my_id);
void SOSPeerDispose(SOSPeerRef peer);
SOSPeerCoderStatus SOSPeerStartSync(SOSPeerRef peer, SOSEngineRef engine, CFErrorRef *error);
SOSPeerCoderStatus SOSPeerHandleMessage(SOSPeerRef peer, SOSEngineRef engine, CFDataRef message, CFErrorRef *error);
bool SOSPeerSendMessage(SOSPeerRef peer, CFDataRef message, CFErrorRef *error);
bool SOSPeerCanSendMessage(SOSPeerRef peer);
CFIndex SOSPeerGetVersion(SOSPeerRef peer);
CFStringRef SOSPeerGetID(SOSPeerRef peer);
bool SOSPeersEqual(SOSPeerRef peerA, SOSPeerRef peerB);
bool SOSPeerSetManifest(SOSPeerRef peer, SOSManifestRef manifest, CFErrorRef *error);
SOSManifestRef SOSPeerCopyManifest(SOSPeerRef peer, CFErrorRef *error);
CFDataRef SOSPeerCopyManifestDigest(SOSPeerRef peer, CFErrorRef *error);
SOSPeerRef SOSPeerCreateSimple(CFStringRef peer_id, CFIndex version, CFErrorRef *error,
SOSPeerSendBlock sendBlock);
__END_DECLS
#endif