#include "precomp_wasabi_bfc.h" // someday, there will be a file here. #include #include "encodedstr.h" #include #include #include EncodedStr::EncodedStr(FOURCC encodingType, void *encodedBuffer, int bufferSize, int deleteIt) { encoding_type = encodingType; encoded_buffer = encodedBuffer; buffer_size = bufferSize; delete_it = deleteIt; } EncodedStr::~EncodedStr() { if (delete_it && (encoded_buffer != NULL)) { #ifdef WASABI_COMPILE_MEMMGR WASABI_API_MEMMGR->sysFree(encoded_buffer); #else free(encoded_buffer); #endif } } void EncodedStr::resetBuffer(FOURCC encodingType, void *encodedBuffer, int bufferSize, int deleteIt) { // if there's someone already there, toss them. if (delete_it && (encoded_buffer != NULL)) { #ifdef WASABI_COMPILE_MEMMGR WASABI_API_MEMMGR->sysFree(encoded_buffer); #else free(encoded_buffer); #endif } encoding_type = encodingType; encoded_buffer = encodedBuffer; buffer_size = bufferSize; delete_it = deleteIt; } int EncodedStr::convertToUTF8(String &output_str) { int retval = 0; StringConverterEnum myServiceEnum(encoding_type); svc_stringConverter *myConv = myServiceEnum.getFirst(); if (myConv != NULL) { void *in_buffer = encoded_buffer; int size_in_bytes = buffer_size; if (encoded_buffer != NULL) { // Preflight int u8size = myConv->preflightToUTF8(encoding_type, in_buffer, size_in_bytes); // Alloc #ifdef WASABI_COMPILE_MEMMGR char *u8str = reinterpret_cast(WASABI_API_MEMMGR->sysMalloc(u8size)); #else char *u8str = reinterpret_cast(MALLOC(u8size)); #endif if (u8str != NULL) { // Convert retval = myConv->convertToUTF8(encoding_type, in_buffer, size_in_bytes, u8str, u8size); if (retval < 0) { // Clear on error. #ifdef WASABI_COMPILE_MEMMGR WASABI_API_MEMMGR->sysFree(u8str); #else free(encoded_buffer); #endif u8str = NULL; } } else { ASSERTPR(u8str != NULL, "Malloc failed in string converter\n"); } // And call the method to inject the pointer into our string (cleared on error). output_str.setValue(u8str); } // Once we use our service, release our locked instance of it. myServiceEnum.release(myConv); } else { // Clear the string on error. retval = SvcStrCnv::ERROR_UNAVAILABLE; output_str.setValue(NULL); } return retval; } int EncodedStr::convertFromUTF8(FOURCC encodingType, const String &inputStr) { int retval = 0; int written = 0; void *buffer = NULL; StringConverterEnum myServiceEnum(encodingType); svc_stringConverter *myConv = myServiceEnum.getFirst(); if (myConv != NULL) { if (inputStr != NULL) { const char *val = inputStr.getValue(); int valsize = STRLEN(val) + 1; // count the null char in your size-in-bytes! // Preflight int size = myConv->preflightFromUTF8(encodingType, val, valsize); if (size > 0) { // Alloc #ifdef WASABI_COMPILE_MEMMGR buffer = WASABI_API_MEMMGR->sysMalloc(size); #else buffer = MALLOC(size); #endif if (buffer != NULL) { // Convert written = myConv->convertFromUTF8(encodingType, val, valsize, buffer, size); if (written > 0) { retval = written; } else { // Clear on error. #ifdef WASABI_COMPILE_MEMMGR WASABI_API_MEMMGR->sysFree(buffer); #else free(buffer); #endif buffer = NULL; retval = written; written = 0; } } else { ASSERTPR(buffer != NULL, "Malloc failed in string converter\n"); } } else { // Clear on error. buffer = NULL; retval = size; written = 0; } } // Once we use our service, release our locked instance of it. myServiceEnum.release(myConv); } else { // On error locking down a service, all the default values are errors and called through resetBuffer. retval = SvcStrCnv::ERROR_UNAVAILABLE; } resetBuffer(encodingType, buffer, written); return retval; } // This is for debugging. int EncodedStr::operator ==(const EncodedStr &in_string) { if (encoding_type == in_string.encoding_type) { switch (encoding_type) { case SvcStrCnv::OSNATIVE: return (STRCMP(reinterpret_cast(encoded_buffer), reinterpret_cast(in_string.encoded_buffer)) == 0); break; default: return 0; break; } } return 0; }