SOSTransportCircle.c   [plain text]



#include <CoreFoundation/CoreFoundation.h>
#include <Security/SecureObjectSync/SOSTransportCircle.h>
#include <Security/SecureObjectSync/SOSTransportCircleKVS.h>
#include <Security/SecureObjectSync/SOSTransport.h>
#include <Security/SecureObjectSync/SOSKVSKeys.h>
#include <Security/SecureObjectSync/SOSAccount.h>
#include <Security/SecureObjectSync/SOSAccountPriv.h>
#include <SOSPeerInfoDER.h>

#include <utilities/SecCFWrappers.h>
#include <SOSInternal.h>
#include <SOSCloudKeychainClient.h>
#include <AssertMacros.h>

CFGiblisWithCompareFor(SOSTransportCircle);

SOSTransportCircleRef SOSTransportCircleCreateForSubclass(size_t size, SOSAccountRef account, CFErrorRef *error)
{
    SOSTransportCircleRef tpt = CFTypeAllocateWithSpace(SOSTransportCircle, size, kCFAllocatorDefault);
    tpt->account = CFRetainSafe(account);
    return tpt;
}

static CFStringRef SOSTransportCircleCopyFormatDescription(CFTypeRef aObj, CFDictionaryRef formatOptions) {
    SOSTransportCircleRef t = (SOSTransportCircleRef) aObj;
    
    return CFStringCreateWithFormat(NULL, NULL, CFSTR("<SOSTransportCircle@%p\n>"), t);
}

static void SOSTransportCircleDestroy(CFTypeRef aObj) {
    SOSTransportCircleRef transport = (SOSTransportCircleRef) aObj;
    if(transport->destroy)
        transport->destroy(transport);
    CFReleaseNull(transport->account);
}

static CFHashCode SOSTransportCircleHash(CFTypeRef obj)
{
    return (intptr_t) obj;
}

static Boolean SOSTransportCircleCompare(CFTypeRef lhs, CFTypeRef rhs)
{
    return SOSTransportCircleHash(lhs) == SOSTransportCircleHash(rhs);
}

SOSAccountRef SOSTransportCircleGetAccount(SOSTransportCircleRef transport){
    return transport->account;
}

bool SOSTransportCircleFlushChanges(SOSTransportCircleRef transport, CFErrorRef *error) {
    return transport->flushChanges(transport, error);
}

bool SOSTransportCirclePostCircle(SOSTransportCircleRef transport,  CFStringRef circleName, CFDataRef circle_data, CFErrorRef *error) {
    return transport->postCircle(transport, circleName, circle_data, error);
}
CF_RETURNS_RETAINED
CFDictionaryRef SOSTransportCircleHandleRetirementMessages(SOSTransportCircleRef transport, CFMutableDictionaryRef circle_retirement_messages_table, CFErrorRef *error) {
    return transport->handleRetirementMessages(transport, circle_retirement_messages_table, error);
}

CF_RETURNS_RETAINED
CFArrayRef SOSTransportCircleHandleCircleMessages(SOSTransportCircleRef transport, CFMutableDictionaryRef circle_circle_messages_table, CFErrorRef *error) {
    return transport->handleCircleMessages(transport, circle_circle_messages_table, error);
}

bool SOSTransportCirclePostRetirement(SOSTransportCircleRef transport,  CFStringRef circleName, SOSPeerInfoRef peer, CFErrorRef *error) {
    bool success = false;
    CFDataRef retirement_data = NULL;

    retirement_data = SOSPeerInfoCopyEncodedData(peer, kCFAllocatorDefault, error);

    require_quiet(retirement_data, fail);

    success = transport->postRetirement(transport, circleName, SOSPeerInfoGetPeerID(peer), retirement_data, error);

fail:
    CFReleaseNull(retirement_data);
    return success;
}

bool SOSTransportCircleExpireRetirementRecords(SOSTransportCircleRef transport, CFDictionaryRef retirements, CFErrorRef *error){
    return transport->expireRetirementRecords(transport, retirements, error);
}

CFIndex SOSTransportCircleGetTransportType(SOSTransportCircleRef transport, CFErrorRef *error){
    return transport->getTransportType ? transport->getTransportType(transport, error) : kUnknown;
}

bool SOSTransportCircleSendPeerInfo(SOSTransportCircleRef transport, CFStringRef peerID, CFDataRef peerInfoData, CFErrorRef *error){
    return transport->sendPeerInfo(transport, peerID, peerInfoData, error);
}

bool SOSTransportCircleRingFlushChanges(SOSTransportCircleRef transport, CFErrorRef* error){
    return transport->flushRingChanges(transport, error);
}

bool SOSTransportCircleRingPostRing(SOSTransportCircleRef transport, CFStringRef ringName, CFDataRef ring, CFErrorRef *error){
    return transport->postRing(transport, ringName, ring, error);
}

bool SOSTransportCircleSendDebugInfo(SOSTransportCircleRef transport, CFStringRef type, CFTypeRef debugInfo, CFErrorRef *error){
    return transport->sendDebugInfo(transport, type, debugInfo, error);
}

bool SOSTransportCircleSendAccountChangedWithDSID(SOSTransportCircleRef transport, CFStringRef dsid, CFErrorRef *error){
    return transport->sendAccountChangedWithDSID(transport, dsid, error);
}