blob: a73196513b844b3c9faf4851f96b825c523150ab [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 2008 PacketVideo
*
* 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 "pvmi_kvp_util.h"
#include "pv_mime_string_utils.h"
#include "oscl_string_containers.h"
OSCL_EXPORT_REF PvmiKvpType GetTypeFromKeyString(PvmiKeyType aKeyString)
{
if (aKeyString == NULL)
{
return PVMI_KVPTYPE_UNKNOWN;
}
// Determine the type
char* paramstr = NULL;
OSCL_StackString<24> typestr;
OSCL_StackString<10> basestr(PVMI_KVPTYPE_STRING_CONSTCHAR);
// value
typestr = basestr;
typestr += PVMI_KVPTYPE_VALUE_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, typestr.get_str(), paramstr) > 0)
{
return PVMI_KVPTYPE_VALUE;
}
// pointer
typestr = basestr;
typestr += PVMI_KVPTYPE_POINTER_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, typestr.get_str(), paramstr) > 0)
{
return PVMI_KVPTYPE_POINTER;
}
// aggregate
typestr = basestr;
typestr += PVMI_KVPTYPE_AGGREGATE_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, typestr.get_str(), paramstr) > 0)
{
return PVMI_KVPTYPE_AGGREGATE;
}
return PVMI_KVPTYPE_UNKNOWN;
}
OSCL_EXPORT_REF PvmiKvpAttr GetAttrTypeFromKeyString(PvmiKeyType aKeyString)
{
if (aKeyString == NULL)
{
return PVMI_KVPATTR_UNKNOWN;
}
// Determine the attribute type
char* paramstr = NULL;
OSCL_StackString<16> attrstr;
OSCL_StackString<8> basestr(PVMI_KVPATTR_STRING_CONSTCHAR);
// cap
attrstr = basestr;
attrstr += PVMI_KVPATTR_CAP_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, attrstr.get_str(), paramstr) > 0)
{
return PVMI_KVPATTR_CAP;
}
// def
attrstr = basestr;
attrstr += PVMI_KVPATTR_DEF_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, attrstr.get_str(), paramstr) > 0)
{
return PVMI_KVPATTR_DEF;
}
// cur
attrstr = basestr;
attrstr += PVMI_KVPATTR_CUR_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, attrstr.get_str(), paramstr) > 0)
{
return PVMI_KVPATTR_CUR;
}
return PVMI_KVPATTR_UNKNOWN;
}
OSCL_EXPORT_REF PvmiKvpValueType GetValTypeFromKeyString(PvmiKeyType aKeyString)
{
if (aKeyString == NULL)
{
return PVMI_KVPVALTYPE_UNKNOWN;
}
// Determine the valtype
char* paramstr = NULL;
OSCL_StackString<64> valtypestr;
OSCL_StackString<10> basestr(PVMI_KVPVALTYPE_STRING_CONSTCHAR);
// bool
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_BOOL_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_BOOL;
}
// float
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_FLOAT_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_FLOAT;
}
// double
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_DOUBLE_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_DOUBLE;
}
// uint8
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_UINT8_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_UINT8;
}
// int32
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_INT32_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_INT32;
}
// uint32
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_UINT32_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_UINT32;
}
// int64
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_INT64_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_INT32;
}
// uint64
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_UINT64_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_UINT32;
}
// wchar*
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_WCHARPTR_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_WCHARPTR;
}
// char*
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_CHARPTR_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_CHARPTR;
}
// uint8*
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_UINT8PTR_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_UINT8PTR;
}
// int32*
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_INT32PTR_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_INT32PTR;
}
// uint32*
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_UINT32PTR_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_UINT32PTR;
}
// int64*
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_INT64PTR_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_INT64PTR;
}
// uint64*
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_UINT64PTR_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_UINT64PTR;
}
// float*
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_FLOATPTR_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_FLOATPTR;
}
// double*
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_DOUBLEPTR_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_DOUBLEPTR;
}
// ksv
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_KSV_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_KSV;
}
// pKvp
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_PKVP_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_PKVP;
}
// ppKvp
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_PPKVP_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_PPKVP;
}
// range_float
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_RANGE_FLOAT_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_RANGE_FLOAT;
}
// range_double
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_RANGE_DOUBLE_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_RANGE_DOUBLE;
}
// range_uint8
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_RANGE_UINT8_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_RANGE_UINT8;
}
// range_int32
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_RANGE_INT32_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_RANGE_INT32;
}
// range_uint32
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_RANGE_UINT32_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_RANGE_UINT32;
}
// range_int64
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_RANGE_INT64_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_RANGE_INT64;
}
// range_uint64
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_RANGE_UINT64_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_RANGE_UINT64;
}
// bitarray32
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_BITARRAY32_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_BITARRAY32;
}
// bitarray64
valtypestr = basestr;
valtypestr += PVMI_KVPVALTYPE_BITARRAY64_STRING_CONSTCHAR;
if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
{
return PVMI_KVPVALTYPE_BITARRAY64;
}
return PVMI_KVPVALTYPE_UNKNOWN;
}
OSCL_EXPORT_REF PVMFStatus PVMFCreateKVPUtils::CreateKVPForWStringValue(PvmiKvp& aKeyVal,
const char* aKeyTypeString,
OSCL_wString& aValString,
char* aMiscKeyParam,
uint32 aMaxSize,
uint32 aTruncateFlag)
{
// Check parameters
if (aKeyVal.key != NULL || aKeyTypeString == NULL || aValString.get_size() == 0)
{
return PVMFErrArgument;
}
aKeyVal.value.pWChar_value = NULL;
aKeyVal.key = NULL;
// Determine the length of strings
uint32 keylen = oscl_strlen(aKeyTypeString) + 1; // for key string and ";"
keylen += oscl_strlen(PVMI_KVPVALTYPE_STRING_CONSTCHAR); // for "valtype="
keylen += oscl_strlen(PVMI_KVPVALTYPE_WCHARPTR_STRING_CONSTCHAR) + 1; // for "wchar*" and NULL terminator
if (aMiscKeyParam)
{
keylen += oscl_strlen(aMiscKeyParam);
}
uint32 valuelen = aValString.get_size() + 1;
// Allocate memory for the strings
int32 leavecode = 0, leavecode1 = 0;
OSCL_TRY(leavecode,
aKeyVal.key = OSCL_ARRAY_NEW(char, keylen););
if (aTruncateFlag)
{
if (aMaxSize < valuelen)
{
valuelen = aMaxSize + 1;
}
}
if (aMaxSize >= valuelen)
{
OSCL_TRY(leavecode,
aKeyVal.value.pWChar_value = OSCL_ARRAY_NEW(oscl_wchar, valuelen););
}
if (leavecode == 0 && leavecode1 == 0)
{
// Copy the key string
oscl_strncpy(aKeyVal.key, aKeyTypeString, oscl_strlen(aKeyTypeString) + 1);
oscl_strncat(aKeyVal.key, PVMI_KVP_SEMICOLON_STRING_CONSTCHAR, oscl_strlen(PVMI_KVP_SEMICOLON_STRING_CONSTCHAR));
oscl_strncat(aKeyVal.key, PVMI_KVPVALTYPE_STRING_CONSTCHAR, oscl_strlen(PVMI_KVPVALTYPE_STRING_CONSTCHAR));
oscl_strncat(aKeyVal.key, PVMI_KVPVALTYPE_WCHARPTR_STRING_CONSTCHAR, oscl_strlen(PVMI_KVPVALTYPE_WCHARPTR_STRING_CONSTCHAR));
if (aMiscKeyParam)
{
oscl_strncat(aKeyVal.key, aMiscKeyParam, oscl_strlen(aMiscKeyParam));
}
aKeyVal.key[keylen-1] = '\0';
// Copy the value
if (aKeyVal.value.pWChar_value != NULL)
{
oscl_strncpy(aKeyVal.value.pWChar_value, aValString.get_cstr(), valuelen);
aKeyVal.value.pWChar_value[valuelen-1] = '\0';
}
// Set the length and capacity
aKeyVal.length = valuelen;
aKeyVal.capacity = valuelen;
}
else
{
// Memory allocation failed so clean up
if (aKeyVal.key)
{
OSCL_ARRAY_DELETE(aKeyVal.key);
aKeyVal.key = NULL;
}
if (aKeyVal.value.pWChar_value)
{
OSCL_ARRAY_DELETE(aKeyVal.value.pWChar_value);
}
return PVMFErrNoMemory;
}
return PVMFSuccess;
}
OSCL_EXPORT_REF PVMFStatus PVMFCreateKVPUtils::CreateKVPForCharStringValue(PvmiKvp& aKeyVal,
const char* aKeyTypeString,
const char* aValString,
char* aMiscKeyParam,
uint32 aMaxSize,
uint32 aTruncateFlag)
{
// Check parameters
if (aKeyVal.key != NULL || aKeyTypeString == NULL)
{
return PVMFErrArgument;
}
aKeyVal.value.pChar_value = NULL;
aKeyVal.key = NULL;
// Determine the length of strings
uint32 keylen = oscl_strlen(aKeyTypeString) + 1; // for key string and ";"
keylen += oscl_strlen(PVMI_KVPVALTYPE_STRING_CONSTCHAR); // for "valtype="
keylen += oscl_strlen(PVMI_KVPVALTYPE_CHARPTR_STRING_CONSTCHAR) + 1; // for "char*" and NULL terminator
if (aMiscKeyParam)
{
keylen += oscl_strlen(aMiscKeyParam);
}
uint32 valuelen = oscl_strlen(aValString) + 1;
// Allocate memory for the strings
int32 leavecode = 0, leavecode1 = 0;
OSCL_TRY(leavecode, aKeyVal.key = OSCL_ARRAY_NEW(char, keylen);)
if (aTruncateFlag)
{
if (aMaxSize < valuelen)
{
valuelen = aMaxSize + 1;
}
}
if (aMaxSize >= valuelen)
OSCL_TRY(leavecode1, aKeyVal.value.pChar_value = OSCL_ARRAY_NEW(char, valuelen););
if (leavecode == 0 && leavecode1 == 0)
{
// Copy the key string
oscl_strncpy(aKeyVal.key, aKeyTypeString, oscl_strlen(aKeyTypeString) + 1);
oscl_strncat(aKeyVal.key, PVMI_KVP_SEMICOLON_STRING_CONSTCHAR, oscl_strlen(PVMI_KVP_SEMICOLON_STRING_CONSTCHAR));
oscl_strncat(aKeyVal.key, PVMI_KVPVALTYPE_STRING_CONSTCHAR, oscl_strlen(PVMI_KVPVALTYPE_STRING_CONSTCHAR));
oscl_strncat(aKeyVal.key, PVMI_KVPVALTYPE_CHARPTR_STRING_CONSTCHAR, oscl_strlen(PVMI_KVPVALTYPE_CHARPTR_STRING_CONSTCHAR));
if (aMiscKeyParam)
{
oscl_strncat(aKeyVal.key, aMiscKeyParam, oscl_strlen(aMiscKeyParam));
}
aKeyVal.key[keylen-1] = '\0';
// Copy the value
if (aKeyVal.value.pChar_value != NULL)
{
oscl_strncpy(aKeyVal.value.pChar_value, aValString, valuelen);
aKeyVal.value.pChar_value[valuelen-1] = '\0';
}
// Set the length and capacity
aKeyVal.length = valuelen;
aKeyVal.capacity = valuelen;
}
else
{
// Memory allocation failed so clean up
if (aKeyVal.key)
{
OSCL_ARRAY_DELETE(aKeyVal.key);
aKeyVal.key = NULL;
}
if (aKeyVal.value.pChar_value)
{
OSCL_ARRAY_DELETE(aKeyVal.value.pChar_value);
}
return PVMFErrNoMemory;
}
return PVMFSuccess;
}
OSCL_EXPORT_REF PVMFStatus PVMFCreateKVPUtils::CreateKVPForByteArrayValue(PvmiKvp& aKeyVal,
const char* aKeyTypeString,
uint8* aValue,
uint32 aValueLen,
char* aMiscKeyParam,
uint32 aMaxSize)
{
OSCL_UNUSED_ARG(aMaxSize);
/* Check parameters */
if (aKeyVal.key != NULL || aKeyTypeString == NULL || aValueLen == 0)
{
return PVMFErrArgument;
}
/* Determine the length of strings */
uint32 keylen = oscl_strlen(aKeyTypeString) + 1; // for key string and ";"
keylen += oscl_strlen(PVMI_KVPVALTYPE_STRING_CONSTCHAR); // for "valtype="
keylen += oscl_strlen(PVMI_KVPVALTYPE_UINT8PTR_STRING_CONSTCHAR) + 1; // for "char*" and NULL terminator
if (aMiscKeyParam)
{
keylen += oscl_strlen(aMiscKeyParam);
}
/* Allocate memory for the strings */
int32 leavecode = 0;
OSCL_TRY(leavecode,
aKeyVal.key = OSCL_ARRAY_NEW(char, keylen);
aKeyVal.value.pUint8_value = OSCL_ARRAY_NEW(uint8, aValueLen);
);
if (leavecode == 0)
{
/* Copy the key string */
oscl_strncpy(aKeyVal.key,
aKeyTypeString,
oscl_strlen(aKeyTypeString) + 1);
oscl_strncat(aKeyVal.key,
PVMI_KVP_SEMICOLON_STRING_CONSTCHAR,
oscl_strlen(PVMI_KVP_SEMICOLON_STRING_CONSTCHAR));
oscl_strncat(aKeyVal.key,
PVMI_KVPVALTYPE_STRING_CONSTCHAR,
oscl_strlen(PVMI_KVPVALTYPE_STRING_CONSTCHAR));
oscl_strncat(aKeyVal.key,
PVMI_KVPVALTYPE_UINT8PTR_STRING,
oscl_strlen(PVMI_KVPVALTYPE_UINT8PTR_STRING));
if (aMiscKeyParam)
{
oscl_strncat(aKeyVal.key, aMiscKeyParam, oscl_strlen(aMiscKeyParam));
}
aKeyVal.key[keylen-1] = NULL_TERM_CHAR;
/* Copy the value */
oscl_memcpy(aKeyVal.value.pUint8_value, aValue, aValueLen);
aKeyVal.length = aValueLen;
aKeyVal.capacity = aValueLen;
}
else
{
/* Memory allocation failed so clean up */
if (aKeyVal.key)
{
OSCL_ARRAY_DELETE(aKeyVal.key);
aKeyVal.key = NULL;
}
if (aKeyVal.value.pUint8_value)
{
OSCL_ARRAY_DELETE(aKeyVal.value.pUint8_value);
}
return PVMFErrNoMemory;
}
return PVMFSuccess;
}
OSCL_EXPORT_REF PVMFStatus PVMFCreateKVPUtils::CreateKVPForUInt32Value(PvmiKvp& aKeyVal,
const char* aKeyTypeString,
uint32& aValueUInt32,
char* aMiscKeyParam)
{
// Check parameters
if (aKeyVal.key != NULL || aKeyTypeString == NULL)
{
return PVMFErrArgument;
}
// Determine the length of strings
uint32 keylen = oscl_strlen(aKeyTypeString) + 1; // for key string and ";"
keylen += oscl_strlen(PVMI_KVPVALTYPE_STRING_CONSTCHAR); // for "valtype="
keylen += oscl_strlen(PVMI_KVPVALTYPE_UINT32_STRING_CONSTCHAR) + 1; // for "uint32" and NULL terminator
if (aMiscKeyParam)
{
keylen += oscl_strlen(aMiscKeyParam);
}
// Allocate memory for the strings
int32 leavecode = 0;
OSCL_TRY(leavecode,
aKeyVal.key = OSCL_ARRAY_NEW(char, keylen);
);
if (leavecode == 0)
{
// Copy the key string
oscl_strncpy(aKeyVal.key, aKeyTypeString, oscl_strlen(aKeyTypeString) + 1);
oscl_strncat(aKeyVal.key, PVMI_KVP_SEMICOLON_STRING_CONSTCHAR, oscl_strlen(PVMI_KVP_SEMICOLON_STRING_CONSTCHAR));
oscl_strncat(aKeyVal.key, PVMI_KVPVALTYPE_STRING_CONSTCHAR, oscl_strlen(PVMI_KVPVALTYPE_STRING_CONSTCHAR));
oscl_strncat(aKeyVal.key, PVMI_KVPVALTYPE_UINT32_STRING_CONSTCHAR, oscl_strlen(PVMI_KVPVALTYPE_UINT32_STRING_CONSTCHAR));
if (aMiscKeyParam)
{
oscl_strncat(aKeyVal.key, aMiscKeyParam, oscl_strlen(aMiscKeyParam));
}
aKeyVal.key[keylen-1] = '\0';
// Copy the value
aKeyVal.value.uint32_value = aValueUInt32;
// Set the length and capacity
aKeyVal.length = 1;
aKeyVal.capacity = 1;
}
else
{
// Memory allocation failed so clean up
if (aKeyVal.key)
{
OSCL_ARRAY_DELETE(aKeyVal.key);
aKeyVal.key = NULL;
}
return PVMFErrNoMemory;
}
return PVMFSuccess;
}
OSCL_EXPORT_REF PVMFStatus PVMFCreateKVPUtils::CreateKVPForFloatValue(PvmiKvp& aKeyVal,
const char* aKeyTypeString,
float& aValueFloat,
char* aMiscKeyParam)
{
// Check parameters
if (aKeyVal.key != NULL || aKeyTypeString == NULL)
{
return PVMFErrArgument;
}
// Determine the length of strings
uint32 keylen = oscl_strlen(aKeyTypeString) + 1; // for key string and ";"
keylen += oscl_strlen(PVMI_KVPVALTYPE_STRING_CONSTCHAR); // for "valtype="
keylen += oscl_strlen(PVMI_KVPVALTYPE_FLOAT_STRING_CONSTCHAR) + 1; // for "float" and NULL terminator
if (aMiscKeyParam)
{
keylen += oscl_strlen(aMiscKeyParam);
}
// Allocate memory for the strings
int32 leavecode = 0;
OSCL_TRY(leavecode,
aKeyVal.key = OSCL_ARRAY_NEW(char, keylen);
);
if (leavecode == 0)
{
// Copy the key string
oscl_strncpy(aKeyVal.key, aKeyTypeString, oscl_strlen(aKeyTypeString) + 1);
oscl_strncat(aKeyVal.key, PVMI_KVP_SEMICOLON_STRING_CONSTCHAR, oscl_strlen(PVMI_KVP_SEMICOLON_STRING_CONSTCHAR));
oscl_strncat(aKeyVal.key, PVMI_KVPVALTYPE_STRING_CONSTCHAR, oscl_strlen(PVMI_KVPVALTYPE_STRING_CONSTCHAR));
oscl_strncat(aKeyVal.key, PVMI_KVPVALTYPE_FLOAT_STRING_CONSTCHAR, oscl_strlen(PVMI_KVPVALTYPE_FLOAT_STRING_CONSTCHAR));
if (aMiscKeyParam)
{
oscl_strncat(aKeyVal.key, aMiscKeyParam, oscl_strlen(aMiscKeyParam));
}
aKeyVal.key[keylen-1] = '\0';
// Copy the value
aKeyVal.value.float_value = aValueFloat;
// Set length and capacity
aKeyVal.length = 1;
aKeyVal.capacity = 1;
}
else
{
// Memory allocation failed so clean up
if (aKeyVal.key)
{
OSCL_ARRAY_DELETE(aKeyVal.key);
aKeyVal.key = NULL;
}
return PVMFErrNoMemory;
}
return PVMFSuccess;
}
OSCL_EXPORT_REF PVMFStatus PVMFCreateKVPUtils::CreateKVPForBoolValue(PvmiKvp& aKeyVal,
const char* aKeyTypeString,
bool& aValueBool,
char* aMiscKeyParam)
{
// Check parameters
if (aKeyVal.key != NULL || aKeyTypeString == NULL)
{
return PVMFErrArgument;
}
// Determine the length of strings
uint32 keylen = oscl_strlen(aKeyTypeString) + 1; // for key string and ";"
keylen += oscl_strlen(PVMI_KVPVALTYPE_STRING_CONSTCHAR); // for "valtype="
keylen += oscl_strlen(PVMI_KVPVALTYPE_BOOL_STRING_CONSTCHAR) + 1; // for "bool" and NULL terminator
if (aMiscKeyParam)
{
keylen += oscl_strlen(aMiscKeyParam);
}
// Allocate memory for the strings
int32 leavecode = 0;
OSCL_TRY(leavecode,
aKeyVal.key = OSCL_ARRAY_NEW(char, keylen);
);
if (leavecode == 0)
{
// Copy the key string
oscl_strncpy(aKeyVal.key, aKeyTypeString, oscl_strlen(aKeyTypeString) + 1);
oscl_strncat(aKeyVal.key, PVMI_KVP_SEMICOLON_STRING_CONSTCHAR, oscl_strlen(PVMI_KVP_SEMICOLON_STRING_CONSTCHAR));
oscl_strncat(aKeyVal.key, PVMI_KVPVALTYPE_STRING_CONSTCHAR, oscl_strlen(PVMI_KVPVALTYPE_STRING_CONSTCHAR));
oscl_strncat(aKeyVal.key, PVMI_KVPVALTYPE_BOOL_STRING_CONSTCHAR, oscl_strlen(PVMI_KVPVALTYPE_BOOL_STRING_CONSTCHAR));
if (aMiscKeyParam)
{
oscl_strncat(aKeyVal.key, aMiscKeyParam, oscl_strlen(aMiscKeyParam));
}
aKeyVal.key[keylen-1] = '\0';
// Copy the value
aKeyVal.value.bool_value = aValueBool;
// Set length and capacity
aKeyVal.length = 1;
aKeyVal.capacity = 1;
}
else
{
// Memory allocation failed so clean up
if (aKeyVal.key)
{
OSCL_ARRAY_DELETE(aKeyVal.key);
aKeyVal.key = NULL;
}
return PVMFErrNoMemory;
}
return PVMFSuccess;
}
OSCL_EXPORT_REF PVMFStatus PVMFCreateKVPUtils::CreateKVPForKSVValue(PvmiKvp& aKeyVal,
const char* aKeyTypeString,
OsclAny* aValue,
char* aMiscKeyParam)
{
/* Check parameters */
if (aKeyVal.key != NULL || aKeyTypeString == NULL)
{
return PVMFErrArgument;
}
/* Determine the length of strings */
uint32 keylen = oscl_strlen(aKeyTypeString) + 1; // for key string and ";"
keylen += oscl_strlen(PVMI_KVPVALTYPE_STRING_CONSTCHAR); // for "valtype="
keylen += oscl_strlen(PVMI_KVPVALTYPE_UINT8PTR_STRING_CONSTCHAR) + 1; // for "char*" and NULL terminator
if (aMiscKeyParam)
{
keylen += oscl_strlen(aMiscKeyParam);
}
/* Allocate memory for the strings */
int32 leavecode = 0;
OSCL_TRY(leavecode,
aKeyVal.key = OSCL_ARRAY_NEW(char, keylen);
aKeyVal.value.key_specific_value = NULL;
);
if (leavecode == 0)
{
/* Copy the key string */
oscl_strncpy(aKeyVal.key,
aKeyTypeString,
oscl_strlen(aKeyTypeString) + 1);
oscl_strncat(aKeyVal.key,
PVMI_KVP_SEMICOLON_STRING_CONSTCHAR,
oscl_strlen(PVMI_KVP_SEMICOLON_STRING_CONSTCHAR));
oscl_strncat(aKeyVal.key,
PVMI_KVPVALTYPE_STRING_CONSTCHAR,
oscl_strlen(PVMI_KVPVALTYPE_STRING_CONSTCHAR));
oscl_strncat(aKeyVal.key,
PVMI_KVPVALTYPE_KSV_STRING,
oscl_strlen(PVMI_KVPVALTYPE_KSV_STRING));
if (aMiscKeyParam)
{
oscl_strncat(aKeyVal.key, aMiscKeyParam, oscl_strlen(aMiscKeyParam));
}
aKeyVal.key[keylen-1] = '\0';
/* Copy the value */
aKeyVal.value.key_specific_value = aValue;
}
else
{
/* Memory allocation failed so clean up */
if (aKeyVal.key)
{
OSCL_ARRAY_DELETE(aKeyVal.key);
aKeyVal.key = NULL;
}
return PVMFErrNoMemory;
}
return PVMFSuccess;
}