diff -r 4ea6f81c838a -r 0e9bb658ef58 osncore/osncore/src/alfstringdata.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/osncore/osncore/src/alfstringdata.cpp Wed Sep 01 12:23:18 2010 +0100 @@ -0,0 +1,226 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: OSN string data implementation. +* +*/ + + +#include +#include + +#if defined(__GNUC__) +#include +#else +#include +#endif + +#include + +#include "alfstringdata.h" +//#include "osn/char.h" +#include + +using namespace std; + +namespace osncore + { + + + +// ------------------------------------------------------------------------- +// stringData +// ------------------------------------------------------------------------- +SAlfStringData::SAlfStringData() : refCount(1), /*_unicode(0),*/ _ascii(0), _maxAscii(QS_INTERNAL_BUFFER_CHARS), _isAsciiValid(1) +{ +//#ifdef QSTRING_DEBUG_ALLOCATIONS + // stringDataInstances++; +//#endif + refCount = 1; + _length=0; +// _unicode = 0; + _isUnicodeValid=0; + _isAsciiValid = 1; + _isHeapAllocated=0; + _ascii = _internalBuffer; + _internalBuffer[0] = 0; +} + +SAlfStringData::~SAlfStringData() +{ + // ASSERT(refCount == 0); + /* if (_unicode && !isUnicodeInternal()) + { + DELETE_QCHAR(_unicode); + } + */ + if (_ascii && !isAsciiInternal()) + { + DELETE_CHAR(_ascii); + } + +} + + +// Copy data +void SAlfStringData::initialize(const char *a, int l) +{ + refCount = 1; + _length = l; + // _unicode = 0; + _isUnicodeValid = 0; + _maxUnicode = 0; + _isAsciiValid = 1; + _isHeapAllocated = 0; + + if (l > QS_INTERNAL_BUFFER_CHARS) + { + _maxAscii = ALLOC_CHAR_GOOD_SIZE(l+1); + _ascii = ALLOC_CHAR(_maxAscii); + //Make sure we have memory before doing data copy. + if(_ascii) + { + if (a) + { + memcpy(_ascii, a, l); + } + _ascii[l] = 0; + } + else{ + _length = 0; + refCount = 0; + _length = 0; + // _unicode = 0; + _isUnicodeValid = 0; + _maxUnicode = 0; + _isAsciiValid = 1; + _isHeapAllocated = 0; + throw bad_alloc(); + } + } + else { + _maxAscii = QS_INTERNAL_BUFFER_CHARS; + _ascii = _internalBuffer; + if (a) + memcpy(_internalBuffer, a, l); + _internalBuffer[l] = 0; + } + + +} + + +bool SAlfStringData::increaseAsciiSize(uint size) +{ + //ASSERT(this != QString::shared_null); + + uint newSize = (uint)ALLOC_CHAR_GOOD_SIZE((size * 3 + 1) / 2); + + /* + if (!_isAsciiValid) + return false; + */ + // ASSERT(_isAsciiValid); + + if (isAsciiInternal()) { + char *newAscii = ALLOC_CHAR(newSize); + if( !newAscii ) return false; + + if (_length) + memcpy(newAscii, _ascii, _length); + _ascii = newAscii; + } else { + char* ap = _ascii; + _ascii = REALLOC_CHAR( _ascii, newSize ); + + if( !_ascii ) + { + // memory manager won't delete the original pointer if realloc failed + _ascii = ap; + return false; + } + } + + _maxAscii = newSize; + _isAsciiValid = 1; + _isUnicodeValid = 0; + return true; +} + + + + + +char* SAlfStringData::ascii() +{ +// return _isAsciiValid ? _ascii :0; +return _ascii; +} + + +/* +AlfChar *SAlfStringData::makeUnicode() +{ + //ASSERT(this != QString::shared_null); + + if (_isAsciiValid){ + char copyBuf[QS_INTERNAL_BUFFER_CHARS]; + // char *str; + + if (_unicode && !isUnicodeInternal()) + DELETE_QCHAR(_unicode); + + if (_length <= QS_INTERNAL_BUFFER_UCHARS){ + if (isAsciiInternal()) { + uint i = _length; + char *tp = ©Buf[0], *fp = _ascii; + while (i--) + *tp++ = *fp++; + // str = ©Buf[0]; + _isAsciiValid = 0; + } + else + { + // str = _ascii; + + } + _unicode = (AlfChar *)_internalBuffer; + _maxUnicode = QS_INTERNAL_BUFFER_UCHARS; + } + else { + uint newSize = ALLOC_QCHAR_GOOD_SIZE(_length); + _unicode = ALLOC_QCHAR(newSize); + if( !_unicode ) + { + _maxUnicode = 0; + return 0; + } + _maxUnicode = newSize; + // str = _ascii; + } + // uint i = _length; + // AlfChar *cp = _unicode; + // while ( i-- ) + // *cp++ = *str++; + + _isUnicodeValid = 1; + } + // else if (!_isUnicodeValid) + // FATAL("invalid character cache",0); + + return _unicode; +} + +*/ +} // osncore +