You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
382 lines
4.4 KiB
382 lines
4.4 KiB
/* -*- 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 );
|
|
|
|
}
|
|
|