diff options
Diffstat (limited to 'mDNSResponder/mDNSWindows/DLLX/TXTRecord.cpp')
-rwxr-xr-x | mDNSResponder/mDNSWindows/DLLX/TXTRecord.cpp | 382 |
1 files changed, 382 insertions, 0 deletions
diff --git a/mDNSResponder/mDNSWindows/DLLX/TXTRecord.cpp b/mDNSResponder/mDNSWindows/DLLX/TXTRecord.cpp new file mode 100755 index 00000000..2ebb67e0 --- /dev/null +++ b/mDNSResponder/mDNSWindows/DLLX/TXTRecord.cpp @@ -0,0 +1,382 @@ +/* -*- Mode: C; tab-width: 4 -*- + * + * Copyright (c) 2009 Apple Computer, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include "stdafx.h" + +#include "TXTRecord.h" + +#include "StringServices.h" + +#include <DebugServices.h> + + + + + +// CTXTRecord + + + + + +STDMETHODIMP CTXTRecord::SetValue(BSTR key, VARIANT value) + +{ + + std::string keyUTF8; + + ByteArray valueArray; + + BOOL ok; + + DNSServiceErrorType err; + + HRESULT hr = S_OK; + + + + if ( !m_allocated ) + + { + + TXTRecordCreate( &m_tref, 0, NULL ); + + m_allocated = TRUE; + + } + + + + ok = BSTRToUTF8( key, keyUTF8 ); + + require_action( ok, exit, hr = S_FALSE ); + + + + ok = VariantToByteArray( &value, valueArray ); + + require_action( ok, exit, hr = S_FALSE ); + + + + err = TXTRecordSetValue( &m_tref, keyUTF8.c_str(), ( uint8_t ) valueArray.size(), &valueArray[ 0 ] ); + + require_action( !err, exit, hr = S_FALSE ); + + + +exit: + + + + return hr; + +} + + + +STDMETHODIMP CTXTRecord::RemoveValue(BSTR key) + +{ + + HRESULT hr = S_OK; + + + + if ( m_allocated ) + + { + + std::string keyUTF8; + + BOOL ok; + + DNSServiceErrorType err; + + + + ok = BSTRToUTF8( key, keyUTF8 ); + + require_action( ok, exit, hr = S_FALSE ); + + + + err = TXTRecordRemoveValue( &m_tref, keyUTF8.c_str() ); + + require_action( !err, exit, hr = S_FALSE ); + + } + + + +exit: + + + + return hr; + +} + + + +STDMETHODIMP CTXTRecord::ContainsKey(BSTR key, VARIANT_BOOL* retval) + +{ + + std::string keyUTF8; + + int ret = 0; + + HRESULT err = S_OK; + + + + if ( m_byteArray.size() > 0 ) + + { + + BOOL ok; + + + + ok = BSTRToUTF8( key, keyUTF8 ); + + require_action( ok, exit, err = S_FALSE ); + + + + ret = TXTRecordContainsKey( ( uint16_t ) m_byteArray.size(), &m_byteArray[ 0 ], keyUTF8.c_str() ); + + } + + + + *retval = ( ret ) ? VARIANT_TRUE : VARIANT_FALSE; + + + +exit: + + + + return err; + +} + + + +STDMETHODIMP CTXTRecord::GetValueForKey(BSTR key, VARIANT* value) + +{ + + std::string keyUTF8; + + const void * rawValue; + + uint8_t rawValueLen; + + BOOL ok = TRUE; + + HRESULT hr = S_OK; + + + + VariantClear( value ); + + + + if ( m_byteArray.size() > 0 ) + + { + + ok = BSTRToUTF8( key, keyUTF8 ); + + require_action( ok, exit, hr = S_FALSE ); + + + + rawValue = TXTRecordGetValuePtr( ( uint16_t ) m_byteArray.size(), &m_byteArray[ 0 ], keyUTF8.c_str(), &rawValueLen ); + + + + if ( rawValue ) + + { + + ok = ByteArrayToVariant( rawValue, rawValueLen, value ); + + require_action( ok, exit, hr = S_FALSE ); + + } + + } + + + +exit: + + + + return hr; + +} + + + +STDMETHODIMP CTXTRecord::GetCount(ULONG* count) + +{ + + *count = 0; + + if ( m_allocated ) + { + *count = TXTRecordGetCount( TXTRecordGetLength( &m_tref ), TXTRecordGetBytesPtr( &m_tref ) ); + } + else if ( m_byteArray.size() > 0 ) + { + + *count = TXTRecordGetCount( ( uint16_t ) m_byteArray.size(), &m_byteArray[ 0 ] ); + + } + + + + return S_OK; + +} + + + +STDMETHODIMP CTXTRecord::GetKeyAtIndex(ULONG index, BSTR* retval) + +{ + + char keyBuf[ 64 ]; + + uint8_t rawValueLen; + + const void * rawValue; + + CComBSTR temp; + + DNSServiceErrorType err; + + BOOL ok; + + HRESULT hr = S_OK; + + + + err = TXTRecordGetItemAtIndex( ( uint16_t ) m_byteArray.size(), &m_byteArray[ 0 ], ( uint16_t ) index, sizeof( keyBuf ), keyBuf, &rawValueLen, &rawValue ); + + require_action( !err, exit, hr = S_FALSE ); + + + + ok = UTF8ToBSTR( keyBuf, temp ); + + require_action( ok, exit, hr = S_FALSE ); + + + + *retval = temp; + + + +exit: + + + + return hr; + +} + + + +STDMETHODIMP CTXTRecord::GetValueAtIndex(ULONG index, VARIANT* retval) + +{ + + char keyBuf[ 64 ]; + + uint8_t rawValueLen; + + const void * rawValue; + + CComBSTR temp; + + DNSServiceErrorType err; + + BOOL ok; + + HRESULT hr = S_OK; + + + + err = TXTRecordGetItemAtIndex( ( uint16_t ) m_byteArray.size(), &m_byteArray[ 0 ], ( uint16_t ) index, sizeof( keyBuf ), keyBuf, &rawValueLen, &rawValue ); + + require_action( !err, exit, hr = S_FALSE ); + + + + ok = ByteArrayToVariant( rawValue, rawValueLen, retval ); + + require_action( ok, exit, hr = S_FALSE ); + + + +exit: + + + + return hr; + +} + + + + + +void + +CTXTRecord::SetBytes + + ( + + const unsigned char * bytes, + + uint16_t len + + ) + +{ + + check ( bytes != NULL ); + + check( len ); + + + + m_byteArray.reserve( len ); + + m_byteArray.assign( bytes, bytes + len ); + +} + |