#ifndef _SEC_SOSCODER_H_
#define _SEC_SOSCODER_H_
#include "keychain/SecureObjectSync/SOSFullPeerInfo.h"
#include <Security/SecureObjectSync/SOSPeerInfo.h>
typedef struct __OpaqueSOSCoder *SOSCoderRef;
typedef bool (^SOSPeerSendBlock)(CFDataRef message, CFErrorRef *error);
enum {
kSOSCoderDataReturned = 0,
kSOSCoderNegotiating = 1,
kSOSCoderNegotiationCompleted = 2,
kSOSCoderFailure = 3,
kSOSCoderStaleEvent = 4,
kSOSCoderTooNew = 5,
kSOSCoderForceMessage = 6,
};
typedef uint32_t SOSCoderStatus;
CFTypeID SOSCoderGetTypeID(void);
SOSCoderRef SOSCoderCreate(SOSPeerInfoRef peerInfo, SOSFullPeerInfoRef myPeerInfo, CFBooleanRef useCompact, CFErrorRef *error);
SOSCoderRef SOSCoderCreateFromData(CFDataRef exportedData, CFErrorRef *error);
CFDataRef SOSCoderCopyDER(SOSCoderRef coder, CFErrorRef* error);
CFStringRef SOSCoderGetID(SOSCoderRef coder);
bool SOSCoderIsFor(SOSCoderRef coder, SOSPeerInfoRef peerInfo, SOSFullPeerInfoRef myPeerInfo);
SOSCoderStatus
SOSCoderStart(SOSCoderRef coder, CFErrorRef *error);
SOSCoderStatus
SOSCoderResendDH(SOSCoderRef coder, CFErrorRef *error);
void SOSCoderPersistState(CFStringRef peer_id, SOSCoderRef coder);
SOSCoderStatus SOSCoderUnwrap(SOSCoderRef coder, CFDataRef codedMessage, CFMutableDataRef *message,
CFStringRef clientId, CFErrorRef *error);
SOSCoderStatus SOSCoderWrap(SOSCoderRef coder, CFDataRef message, CFMutableDataRef *codedMessage, CFStringRef clientId, CFErrorRef *error);
bool SOSCoderCanWrap(SOSCoderRef coder);
void SOSCoderReset(SOSCoderRef coder);
CFDataRef SOSCoderCopyPendingResponse(SOSCoderRef coder);
void SOSCoderConsumeResponse(SOSCoderRef coder);
bool SOSCoderIsCoderInAwaitingState(SOSCoderRef coder);
#endif // _SEC_SOSCODER_H_