/* -*- 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_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 );
}