X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/72a12576750f52947eb043106ba5c12c0d07decf..b1ab9ed8d0e0f1c3b66d7daa8fd5564444c56195:/libsecurity_transform/lib/SingleShotSource.cpp diff --git a/libsecurity_transform/lib/SingleShotSource.cpp b/libsecurity_transform/lib/SingleShotSource.cpp new file mode 100644 index 00000000..f5121f21 --- /dev/null +++ b/libsecurity_transform/lib/SingleShotSource.cpp @@ -0,0 +1,61 @@ + +#include "SingleShotSource.h" +#include + +using namespace std; + +CFStringRef gSingleShotSourceName = CFSTR("Single Shot Source"); + +SingleShotSource::SingleShotSource(CFTypeRef value, Transform* t, CFStringRef name) : + Source(gSingleShotSourceName, t, name) +{ + SetValue(value); +} + +void SingleShotSource::DoActivate() +{ + // Make sure our destination doesn't vanish while we are sending it data (or the final NULL) + CFRetain(mDestination->GetCFObject()); + + // take our value and send it on its way + mDestination->SetAttribute(mDestinationName, GetValue()); + + // send an end of stream + mDestination->SetAttribute(mDestinationName, NULL); + + CFRelease(mDestination->GetCFObject()); +} + + + +Boolean SingleShotSource::Equal(const CoreFoundationObject* obj) +{ + if (Source::Equal(obj)) + { + const SingleShotSource* sss = (const SingleShotSource*) obj; + return CFEqual(GetValue(), sss->GetValue()); + } + + return false; +} + + + +CFTypeRef SingleShotSource::Make(CFTypeRef value, Transform* t, CFStringRef name) +{ + return CoreFoundationHolder::MakeHolder(gInternalCFObjectName, new SingleShotSource(value, t, name)); +} + + + +std::string SingleShotSource::DebugDescription() +{ + string result = Source::DebugDescription() + ": SingleShotSource "; + + char buffer[256]; + snprintf(buffer, sizeof(buffer), "(value = %p)", GetValue()); + + result += buffer; + + return result; +}