VirtualBox

Changeset 21079 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jun 30, 2009 3:59:22 PM (16 years ago)
Author:
vboxsync
Message:

Main: move libxml2 to IPRT unconditionally (remove VBOX_WITH_LIBXML2_IN_VBOXRT); move xml classes to IPRT; introduce IPRT ministring class as base for both Utf8Str and xml.cpp, with better performance; introduce some Utf8Str helpers to avoid string buffer hacks in Main code; remove std::auto_ptr<> from some headers

Location:
trunk/src/VBox
Files:
16 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/ApplianceImpl.cpp

    r21077 r21079  
    2626#include <iprt/file.h>
    2727#include <iprt/s3.h>
     28#include "iprt/xml_cpp.h"
    2829
    2930#include <VBox/param.h>
     
    3940
    4041#include "Logging.h"
    41 
    42 #include "VBox/xml.h"
    4342
    4443using namespace std;
     
    234233//
    235234////////////////////////////////////////////////////////////////////////////////
    236 
    237 static Utf8Str stripFilename(const Utf8Str &strFile)
    238 {
    239     Utf8Str str2(strFile);
    240     RTPathStripFilename(str2.mutableRaw());
    241     return str2;
    242 }
    243235
    244236static const struct
     
    22462238                    /* The disk image has to be on the same place as the OVF file. So
    22472239                     * strip the filename out of the full file path. */
    2248                     Utf8Str strSrcDir = stripFilename(pAppliance->m->strPath);
     2240                    Utf8Str strSrcDir(pAppliance->m->strPath);
     2241                    strSrcDir.stripFilename();
    22492242
    22502243                    /* Iterate over all given disk images */
     
    35223515            const Utf8Str &strTargetFileNameOnly = pDiskEntry->strOvf;
    35233516            // target path needs to be composed from where the output OVF is
    3524             Utf8Str strTargetFilePath = stripFilename(m->strPath);
     3517            Utf8Str strTargetFilePath(m->strPath);
     3518            strTargetFilePath.stripFilename();
    35253519            strTargetFilePath.append("/");
    35263520            strTargetFilePath.append(strTargetFileNameOnly);
     
    37213715                const Utf8Str &strTargetFileNameOnly = (*itH)->strOvf;
    37223716                /* Target path needs to be composed from where the output OVF is */
    3723                 Utf8Str strTargetFilePath = stripFilename(m->strPath);
     3717                Utf8Str strTargetFilePath(m->strPath);
     3718                strTargetFilePath.stripFilename();
    37243719                strTargetFilePath.append("/");
    37253720                strTargetFilePath.append(strTargetFileNameOnly);
     
    47364731
    47374732            Utf8Str strTargetVmdkName(bstrName);
    4738             RTPathStripExt(strTargetVmdkName.mutableRaw());
     4733            strTargetVmdkName.stripExt();
    47394734            strTargetVmdkName.append(".vmdk");
    47404735
  • trunk/src/VBox/Main/ConsoleImpl.cpp

    r21077 r21079  
    10731073    for (unsigned i = 0; i < 10 && (VERR_BUFFER_OVERFLOW == vrc); ++i)
    10741074    {
    1075         Utf8Buf.alloc(cchBuf + 1024);
     1075        Utf8Buf.reserve(cchBuf + 1024);
    10761076        if (Utf8Buf.isNull())
    10771077            return E_OUTOFMEMORY;
     
    10811081        vrc = mVMMDev->hgcmHostCall ("VBoxGuestPropSvc", ENUM_PROPS_HOST, 3,
    10821082                                     &parm[0]);
     1083        Utf8Buf.jolt();
    10831084        if (parm[2].type != VBOX_HGCM_SVC_PARM_32BIT)
    10841085            return setError (E_FAIL, tr ("Internal application error"));
     
    17171718        {
    17181719            Utf8Str dir = stateFilePath;
    1719             RTPathStripFilename (dir.mutableRaw());
    1720             if (!RTDirExists (dir))
     1720            dir.stripFilename();
     1721            if (!RTDirExists(dir))
    17211722            {
    17221723                int vrc = RTDirCreateFullPath (dir, 0777);
     
    38653866
    38663867    parm[0].type = VBOX_HGCM_SVC_PARM_PTR;
    3867     /* To save doing a const cast, we use the mutableRaw() member. */
    3868     parm[0].u.pointer.addr = Utf8Name.mutableRaw();
     3868    parm[0].u.pointer.addr = (void*)Utf8Name.c_str();
    38693869    /* The + 1 is the null terminator */
    38703870    parm[0].u.pointer.size = (uint32_t)Utf8Name.length() + 1;
     
    38823882        if (vrc != VERR_NOT_FOUND)
    38833883        {
    3884             size_t iFlags = strlen(pszBuffer) + 1;
    3885             Utf8Str(pszBuffer).cloneTo (aValue);
     3884            Utf8Str strBuffer(pszBuffer);
     3885            strBuffer.cloneTo(aValue);
     3886
    38863887            *aTimestamp = parm[2].u.uint64;
    3887             Utf8Str(pszBuffer + iFlags).cloneTo (aFlags);
     3888
     3889            size_t iFlags = strBuffer.length() + 1;
     3890            Utf8Str(pszBuffer + iFlags).cloneTo(aFlags);
    38883891        }
    38893892        else
     
    39303933
    39313934    parm[0].type = VBOX_HGCM_SVC_PARM_PTR;
    3932     /* To save doing a const cast, we use the mutableRaw() member. */
    3933     parm[0].u.pointer.addr = Utf8Name.mutableRaw();
     3935    parm[0].u.pointer.addr = (void*)Utf8Name.c_str();
    39343936    /* The + 1 is the null terminator */
    39353937    parm[0].u.pointer.size = (uint32_t)Utf8Name.length() + 1;
     
    39383940    {
    39393941        parm[1].type = VBOX_HGCM_SVC_PARM_PTR;
    3940         /* To save doing a const cast, we use the mutableRaw() member. */
    3941         parm[1].u.pointer.addr = Utf8Value.mutableRaw();
     3942        parm[1].u.pointer.addr = (void*)Utf8Value.c_str();
    39423943        /* The + 1 is the null terminator */
    39433944        parm[1].u.pointer.size = (uint32_t)Utf8Value.length() + 1;
     
    39473948    {
    39483949        parm[2].type = VBOX_HGCM_SVC_PARM_PTR;
    3949         /* To save doing a const cast, we use the mutableRaw() member. */
    3950         parm[2].u.pointer.addr = Utf8Flags.mutableRaw();
     3950        parm[2].u.pointer.addr = (void*)Utf8Flags.c_str();
    39513951        /* The + 1 is the null terminator */
    39523952        parm[2].u.pointer.size = (uint32_t)Utf8Flags.length() + 1;
  • trunk/src/VBox/Main/ConsoleImpl2.cpp

    r21077 r21079  
    18141814        {
    18151815            /* Pull over the properties from the server. */
    1816             SafeArray <BSTR> namesOut;
    1817             SafeArray <BSTR> valuesOut;
    1818             SafeArray <ULONG64> timestampsOut;
    1819             SafeArray <BSTR> flagsOut;
     1816            SafeArray<BSTR> namesOut;
     1817            SafeArray<BSTR> valuesOut;
     1818            SafeArray<ULONG64> timestampsOut;
     1819            SafeArray<BSTR> flagsOut;
    18201820            hrc = pConsole->mControl->PullGuestProperties(ComSafeArrayAsOutParam(namesOut),
    18211821                                                ComSafeArrayAsOutParam(valuesOut),
     
    18291829                rc = VERR_INVALID_PARAMETER;
    18301830
    1831             std::vector <Utf8Str> utf8Names, utf8Values, utf8Flags;
    1832             std::vector <char *> names, values, flags;
    1833             std::vector <ULONG64> timestamps;
     1831            std::vector<Utf8Str> utf8Names, utf8Values, utf8Flags;
     1832            std::vector<char *> names, values, flags;
     1833            std::vector<ULONG64> timestamps;
    18341834            for (unsigned i = 0; i < cProps && RT_SUCCESS(rc); ++i)
    18351835                if (   !VALID_PTR(namesOut[i])
  • trunk/src/VBox/Main/MachineImpl.cpp

    r21077 r21079  
    34503450    AssertReturn (!mData->mConfigFileFull.isNull(), VERR_GENERAL_FAILURE);
    34513451
    3452     Utf8Str settingsDir = mData->mConfigFileFull;
    3453 
    3454     RTPathStripFilename (settingsDir.mutableRaw());
    3455     char folder [RTPATH_MAX];
    3456     int vrc = RTPathAbsEx (settingsDir, aPath, folder, sizeof (folder));
    3457     if (RT_SUCCESS (vrc))
     3452    Utf8Str strSettingsDir = mData->mConfigFileFull;
     3453
     3454    strSettingsDir.stripFilename();
     3455    char folder[RTPATH_MAX];
     3456    int vrc = RTPathAbsEx(strSettingsDir, aPath, folder, sizeof(folder));
     3457    if (RT_SUCCESS(vrc))
    34583458        aResult = folder;
    34593459
     
    34833483    Utf8Str settingsDir = mData->mConfigFileFull;
    34843484
    3485     RTPathStripFilename (settingsDir.mutableRaw());
    3486     if (RTPathStartsWith (aPath, settingsDir))
     3485    settingsDir.stripFilename();
     3486    if (RTPathStartsWith(aPath, settingsDir))
    34873487    {
    34883488        /* when assigning, we create a separate Utf8Str instance because both
     
    34913491         * first, and since its the same as aPath, an attempt to copy garbage
    34923492         * will be made. */
    3493         aResult = Utf8Str (aPath + settingsDir.length() + 1);
     3493        aResult = Utf8Str(aPath + settingsDir.length() + 1);
    34943494    }
    34953495}
     
    59495949            /* first, rename the directory if it matches the machine name */
    59505950            configDir = configFile;
    5951             RTPathStripFilename (configDir.mutableRaw());
     5951            configDir.stripFilename();
    59525952            newConfigDir = configDir;
    5953             if (RTPathFilename (configDir) == name)
     5953            if (RTPathFilename(configDir) == name)
    59545954            {
    5955                 RTPathStripFilename (newConfigDir.mutableRaw());
     5955                newConfigDir.stripFilename();
    59565956                newConfigDir = Utf8StrFmt ("%s%c%s",
    59575957                    newConfigDir.raw(), RTPATH_DELIMITER, newName.raw());
     
    60786078
    60796079        /* ensure the settings directory exists */
    6080         Utf8Str path = mData->mConfigFileFull;
    6081         RTPathStripFilename (path.mutableRaw());
    6082         if (!RTDirExists (path))
    6083         {
    6084             vrc = RTDirCreateFullPath (path, 0777);
    6085             if (RT_FAILURE (vrc))
     6080        Utf8Str path(mData->mConfigFileFull);
     6081        path.stripFilename();
     6082        if (!RTDirExists(path))
     6083        {
     6084            vrc = RTDirCreateFullPath(path, 0777);
     6085            if (RT_FAILURE(vrc))
    60866086            {
    60876087                return setError (E_FAIL,
     
    76557655 *  @note Not thread safe (must be called from this object's lock).
    76567656 */
    7657 bool Machine::isInOwnDir (Utf8Str *aSettingsDir /* = NULL */)
     7657bool Machine::isInOwnDir(Utf8Str *aSettingsDir /* = NULL */)
    76587658{
    76597659    Utf8Str settingsDir = mData->mConfigFileFull;
    7660     RTPathStripFilename (settingsDir.mutableRaw());
    7661     char *dirName = RTPathFilename (settingsDir);
     7660    settingsDir.stripFilename();
     7661    char *dirName = RTPathFilename(settingsDir);
    76627662
    76637663    AssertReturn (dirName, false);
  • trunk/src/VBox/Main/Makefile.kmk

    r21077 r21079  
    519519        include
    520520VBoxSettings_SOURCES    = \
    521         xml/xml.cpp \
    522521        xml/Settings.cpp
    523522VBoxSettings_LDFLAGS.darwin = -install_name $(VBOX_DYLD_EXECUTABLE_PATH)/$(notdir $(LIB_SETTINGS)) -Wl,-x # no debug info please.
  • trunk/src/VBox/Main/SharedFolderImpl.cpp

    r21077 r21079  
    2828
    2929#include <iprt/param.h>
     30#include <iprt/cpputils.h>
    3031#include <iprt/path.h>
    31 #include <iprt/cpputils.h>
    3232
    3333// constructor / destructor
     
    199199        ;
    200200#else
    201     if (hostPathLen == 1 && RTPATH_IS_SEP (hostPath[0]))
     201    if (hostPathLen == 1 && RTPATH_IS_SEP(hostPath[0]))
    202202        ;
    203203#endif
    204204    else
    205         RTPathStripTrailingSlash (hostPath.mutableRaw());
     205        hostPath.stripTrailingSlash();
    206206
    207207    /* Check whether the path is full (absolute) */
  • trunk/src/VBox/Main/VirtualBoxErrorInfoImpl.cpp

    r21077 r21079  
    156156    AssertComRC (rc);
    157157    Utf8Str message;
    158     rc = aInfo->GetMessage (message.asOutParam());
     158    rc = aInfo->GetMessage(message.asOutParam());
     159    message.jolt();
    159160    AssertComRC (rc);
    160161    mText = message;
  • trunk/src/VBox/Main/VirtualBoxImpl.cpp

    r21077 r21079  
    38703870HRESULT VirtualBox::ensureFilePathExists (const char *aFileName)
    38713871{
    3872     Utf8Str dir = aFileName;
    3873     RTPathStripFilename (dir.mutableRaw());
    3874     if (!RTDirExists (dir))
    3875     {
    3876         int vrc = RTDirCreateFullPath (dir, 0777);
     3872    Utf8Str strDir(aFileName);
     3873    strDir.stripFilename();
     3874    if (!RTDirExists(strDir))
     3875    {
     3876        int vrc = RTDirCreateFullPath(strDir, 0777);
    38773877        if (RT_FAILURE (vrc))
    38783878        {
    38793879            return setError (E_FAIL,
    38803880                tr ("Could not create the directory '%s' (%Rrc)"),
    3881                 dir.raw(), vrc);
     3881                strDir.c_str(), vrc);
    38823882        }
    38833883    }
  • trunk/src/VBox/Main/glue/ErrorInfo.cpp

    r21077 r21079  
    118118
    119119                    Utf8Str message;
    120                     rc = ex->GetMessage (message.asOutParam());
     120                    rc = ex->GetMessage(message.asOutParam());
     121                    message.jolt();
    121122                    gotSomething |= NS_SUCCEEDED (rc);
    122123                    if (NS_SUCCEEDED (rc))
  • trunk/src/VBox/Main/glue/VirtualBoxErrorInfo.cpp

    r21077 r21079  
    179179    AssertComRC (rc);
    180180    Utf8Str message;
    181     rc = aInfo->GetMessage (message.asOutParam());
     181    rc = aInfo->GetMessage(message.asOutParam());
     182    message.jolt();
    182183    AssertComRC (rc);
    183184    mText = message;
  • trunk/src/VBox/Main/glue/string.cpp

    r21077 r21079  
    2626
    2727#include <iprt/err.h>
     28#include <iprt/path.h>
    2829
    2930namespace com
     
    8586
    8687                size_t cbCopy = psz - pFirst;
    87                 ret.alloc(cbCopy + 1);
    88                 memcpy(ret.str, pFirst, cbCopy);
    89                 ret.str[cbCopy] = '\0';
     88                ret.reserve(cbCopy + 1);
     89                memcpy(ret.m_psz, pFirst, cbCopy);
     90                ret.m_psz[cbCopy] = '\0';
    9091            }
    9192        }
     
    9596}
    9697
     98bool Utf8Str::endsWith(const Utf8Str &that, CaseSensitivity cs /*= CaseSensitive*/) const
     99{
     100    size_t l1 = length();
     101    if (l1 == 0)
     102        return false;
     103
     104    size_t l2 = that.length();
     105    if (l1 < l2)
     106        return false;
     107
     108    size_t l = l1 - l2;
     109    if (cs == CaseSensitive)
     110        return ::RTStrCmp(&m_psz[l], that.m_psz) == 0;
     111    else
     112        return ::RTStrICmp(&m_psz[l], that.m_psz) == 0;
     113}
     114
     115bool Utf8Str::startsWith(const Utf8Str &that, CaseSensitivity cs /*= CaseSensitive*/) const
     116{
     117    size_t l1 = length();
     118    size_t l2 = that.length();
     119    if (l1 == 0 || l2 == 0)
     120        return false;
     121
     122    if (l1 < l2)
     123        return false;
     124
     125    if (cs == CaseSensitive)
     126        return ::RTStrNCmp(m_psz, that.m_psz, l2) == 0;
     127    else
     128        return ::RTStrNICmp(m_psz, that.m_psz, l2) == 0;
     129}
     130
     131bool Utf8Str::contains(const Utf8Str &that, CaseSensitivity cs /*= CaseSensitive*/) const
     132{
     133    if (cs == CaseSensitive)
     134        return ::RTStrStr(m_psz, that.m_psz) != NULL;
     135    else
     136        return ::RTStrIStr(m_psz, that.m_psz) != NULL;
     137}
     138
     139Utf8Str& Utf8Str::toLower()
     140{
     141    if (!isEmpty())
     142        ::RTStrToLower(m_psz);
     143    return *this;
     144}
     145
     146Utf8Str& Utf8Str::toUpper()
     147{
     148    if (!isEmpty())
     149        ::RTStrToUpper(m_psz);
     150    return *this;
     151}
     152
     153void Utf8Str::stripTrailingSlash()
     154{
     155    RTPathStripTrailingSlash(m_psz);
     156    jolt();
     157}
     158
     159void Utf8Str::stripFilename()
     160{
     161    RTPathStripFilename(m_psz);
     162    jolt();
     163}
     164
     165void Utf8Str::stripExt()
     166{
     167    RTPathStripExt(m_psz);
     168    jolt();
     169}
     170
    97171int Utf8Str::toInt(uint64_t &i) const
    98172{
    99     if (!str)
     173    if (!m_psz)
    100174        return VERR_NO_DIGITS;
    101     return RTStrToUInt64Ex(str, NULL, 0, &i);
     175    return RTStrToUInt64Ex(m_psz, NULL, 0, &i);
    102176}
    103177
    104178int Utf8Str::toInt(uint32_t &i) const
    105179{
    106     if (!str)
     180    if (!m_psz)
    107181        return VERR_NO_DIGITS;
    108     return RTStrToUInt32Ex(str, NULL, 0, &i);
     182    return RTStrToUInt32Ex(m_psz, NULL, 0, &i);
    109183}
    110184
  • trunk/src/VBox/Main/include/ApplianceImpl.h

    r21077 r21079  
    9292    const ComObjPtr <VirtualBox, ComWeakRef> mVirtualBox;
    9393
    94     struct Data;            // obscure, defined in AppliannceImpl.cpp
     94    struct Data;            // opaque, defined in ApplianceImpl.cpp
    9595    Data *m;
    9696
  • trunk/src/VBox/Main/webservice/vboxweb.cpp

    r21077 r21079  
    603603 * @return
    604604 */
    605 std::string ConvertComString(const com::Guid &bstr)
    606 {
     605std::string ConvertComString(const com::Guid &uuid)
     606{
     607    com::Bstr bstr(uuid);
    607608    com::Utf8Str ustr(bstr);
    608609    const char *pcsz;
  • trunk/src/VBox/Runtime/Makefile.kmk

    r21077 r21079  
    5151 LIBRARIES += RuntimeR3
    5252 DLLS += VBoxRT
    53 
    54  # Temporary(?) hack.
    55  VBOX_WITH_LIBXML2_IN_VBOXRT=
    5653
    5754else # !VBOX_ONLY_ADDITIONS && !VBOX_ONLY_DOCS
     
    165162#
    166163RuntimeR3_TEMPLATE      = VBOXR3STATIC
     164RuntimeR3_SDKS          = VBOX_LIBXML2
    167165RuntimeR3_SDKS.win      = WINPSDK W2K3DDK
    168166RuntimeR3_DEFS          = IN_RT_R3 IN_SUP_R3 LDR_WITH_NATIVE LDR_WITH_ELF32 LDR_WITH_PE RT_WITH_VBOX RT_NO_GIP
     
    306304        r3/test.cpp \
    307305        r3/testi.cpp \
    308         r3/tcp.cpp
     306        r3/tcp.cpp \
     307        r3/xml.cpp
    309308
    310309#if1of ($(KBUILD_TARGET_ARCH),amd64 x86)
     
    787786#
    788787VBoxRT_TEMPLATE                = VBOXR3
    789 ifdef VBOX_WITH_LIBXML2_IN_VBOXRT
    790788VBoxRT_SDKS                    = VBOX_OPENSSL VBOX_LIBXML2 VBOX_LIBCURL
    791 endif
    792789VBoxRT_SDKS.win                = WINPSDK W2K3DDK VBOX_NTDLL
    793790ifeq ($(KBUILD_TARGET)$(VBOX_WITH_HARDENING),darwin)
     
    799796        VBox/VBoxRTDeps.cpp \
    800797        $(RuntimeR3_SOURCES)
    801 if defined(VBOX_WITH_LIBXML2_IN_VBOXRT)
    802798VBoxRT_SOURCES                += \
    803799        common/misc/s3.cpp
    804 endif
    805800VBoxRT_SOURCES.$(KBUILD_TARGET) = $(RuntimeR3_SOURCES.$(KBUILD_TARGET))
    806801VBoxRT_SOURCES.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH) = $(RuntimeR3_SOURCES.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))
     
    818813        $(PATH_LIB)/VBox-kStuff$(VBOX_SUFF_LIB)
    819814endif
    820 ifdef VBOX_WITH_LIBXML2_IN_VBOXRT
    821  ifndef SDK_VBOX_LIBXML2_LIBS
    822   VBoxRT_LIBS                 += \
     815ifndef  SDK_VBOX_LIBXML2_LIBS
     816 VBoxRT_LIBS                 += \
    823817        $(PATH_LIB)/VBox-libxml2$(VBOX_SUFF_LIB)
    824  endif
    825  ifndef SDK_VBOX_OPENSSL_LIBS
    826   VBoxRT_LIBS                 += \
     818endif
     819ifndef  SDK_VBOX_OPENSSL_LIBS
     820 VBoxRT_LIBS                 += \
    827821        $(PATH_LIB)/VBox-libcrypto$(VBOX_SUFF_LIB)
    828  endif
    829822endif
    830823VBoxRT_LIBS.darwin             = \
     
    851844        $(PATH_LIB)/RuntimeR3L4$(VBOX_SUFF_LIB)
    852845
    853 ifdef VBOX_WITH_LIBXML2_IN_VBOXRT
    854 VBox/VBoxRTDeps.cpp_DEFS = VBOX_WITH_LIBXML2_IN_VBOXRT
    855 endif
    856 
    857846if1of ($(DLLS), VBoxRT)
    858847$$(VBoxRT_0_OUTDIR)/VBoxRT.def: \
    859848                $(PATH_SUB_CURRENT)/r3/win/VBoxRT-$$(if-expr $$(KBUILD_TARGET_ARCH) == amd64,win64,win32).def \
    860                 $(if-expr defined(VBOX_WITH_LIBXML2_IN_VBOXRT),$(PATH_SUB_CURRENT)/r3/win/$(if $(VBOX_OSE),VBoxRT-openssl-ose.def,VBoxRT-openssl.def),)
     849                $(PATH_SUB_CURRENT)/r3/win/$(if $(VBOX_OSE),VBoxRT-openssl-ose.def,VBoxRT-openssl.def)
    861850        $(RM) -f -- $@
    862851        $(REDIRECT) -wto $@ -- $(CAT_EXT) $^
  • trunk/src/VBox/Runtime/VBox/VBoxRTDeps.cpp

    r21077 r21079  
    3636#include <iprt/assert.h>
    3737#include <iprt/asm.h>
    38 #ifdef VBOX_WITH_LIBXML2_IN_VBOXRT
     38
    3939# include <libxml/xmlmodule.h>
    4040# include <libxml/globals.h>
     
    4444# include <openssl/x509.h>
    4545# include <openssl/rsa.h>
    46 #endif
    4746
    4847
     
    5554    (PFNRT)SUPR3PageAllocEx,
    5655    (PFNRT)SUPSemEventCreate,
    57 #ifdef VBOX_WITH_LIBXML2_IN_VBOXRT
    5856    (PFNRT)xmlModuleOpen,
    5957    (PFNRT)MD5_Init,
     
    6563    (PFNRT)i2d_X509,
    6664    (PFNRT)RSA_generate_key,
    67 #endif
    6865    (PFNRT)RTAssertShouldPanic,
    6966    (PFNRT)ASMAtomicReadU64,
  • trunk/src/VBox/Runtime/r3/xml.cpp

    r21077 r21079  
    1919 */
    2020
    21 #include "Logging.h"
    22 
    2321#include <iprt/cdefs.h>
    2422#include <iprt/err.h>
    2523#include <iprt/file.h>
    2624#include <iprt/lock.h>
    27 #include <iprt/string.h>
     25#include <iprt/xml_cpp.h>
    2826
    2927#include <libxml/tree.h>
     
    3634#include <libxml/xmlschemas.h>
    3735
    38 #include <list>
    3936#include <map>
    4037#include <boost/shared_ptr.hpp>
    41 
    42 #include "VBox/xml.h"
    4338
    4439////////////////////////////////////////////////////////////////////////////////
     
    991986{
    992987    m->copyFrom(x.m);
    993 };
     988}
    994989
    995990Document& Document::operator=(const Document &x)
     
    998993    m->copyFrom(x.m);
    999994    return *this;
    1000 };
     995}
    1001996
    1002997Document::~Document()
  • trunk/src/VBox/Runtime/testcase/tstUtf8.cpp

    r21077 r21079  
    4242#include <iprt/err.h>
    4343#include <iprt/test.h>
     44#include <iprt/ministring_cpp.h>
    4445
    4546#include <stdlib.h> /** @todo use our random. */
     
    926927
    927928
     929void testMinistring(RTTEST hTest)
     930{
     931    RTTestSub(hTest, "class ministring");
     932
     933#define CHECK(expr) \
     934    do { \
     935        if (!(expr)) \
     936            RTTestFailed(hTest, "%d: FAILED %s", __LINE__, #expr); \
     937    } while (0)
     938
     939#define CHECK_DUMP(expr, value) \
     940    do { \
     941        if (!(expr)) \
     942            RTTestFailed(hTest, "%d: FAILED %s, got \"%s\"", __LINE__, #expr, value); \
     943    } while (0)
     944
     945#define CHECK_DUMP_I(expr) \
     946    do { \
     947        if (!(expr)) \
     948            RTTestFailed(hTest, "%d: FAILED %s, got \"%d\"", __LINE__, #expr, expr); \
     949    } while (0)
     950
     951    ministring empty;
     952    CHECK( (empty.length() == 0) );
     953    CHECK( (empty.capacity() == 0) );
     954
     955    ministring sixbytes("12345");
     956    CHECK( (sixbytes.length() == 5) );
     957    CHECK( (sixbytes.capacity() == 6) );
     958
     959    sixbytes.append("678");
     960    CHECK( (sixbytes.length() == 8) );
     961    CHECK( (sixbytes.capacity() == 9) );
     962
     963    char *psz = sixbytes.mutableRaw();
     964        // 12345678
     965        //       ^
     966        // 0123456
     967    psz[6] = '\0';
     968    sixbytes.jolt();
     969    CHECK( (sixbytes.length() == 6) );
     970    CHECK( (sixbytes.capacity() == 7) );
     971
     972    ministring morebytes("tobereplaced");
     973    morebytes = "newstring ";
     974    morebytes.append(sixbytes);
     975
     976    CHECK_DUMP( (morebytes == "newstring 123456"), morebytes.c_str() );
     977
     978    ministring third(morebytes);
     979    third.reserve(100 * 1024);      // 100 KB
     980    CHECK_DUMP( (third == "newstring 123456"), morebytes.c_str() );
     981    CHECK( (third.capacity() == 100 * 1024) );
     982    CHECK( (third.length() == morebytes.length()) );        // must not have changed
     983
     984    ministring copy1(morebytes);
     985    ministring copy2 = morebytes;
     986    CHECK( (copy1 == copy2) );
     987
     988    copy1 = NULL;
     989    CHECK( (copy1.isNull()) );
     990
     991    copy1 = "";
     992    CHECK( (copy1.isEmpty()) );
     993
     994    CHECK( (ministring("abc") < ministring("def")) );
     995    CHECK( (ministring("abc") != ministring("def")) );
     996    CHECK_DUMP_I( (ministring("def") > ministring("abc")) );
     997
     998    copy2.setNull();
     999    for (int i = 0;
     1000         i < 100;
     1001         ++i)
     1002    {
     1003        copy2.reserve(50);      // should be ignored after 50 loops
     1004        copy2.append("1");
     1005    }
     1006    CHECK( (copy2.length() == 100) );
     1007
     1008#undef CHECK
     1009}
     1010
    9281011int main()
    9291012{
     
    9461029    TstRTStrXCmp(hTest);
    9471030    testStrStr(hTest);
     1031
     1032    testMinistring(hTest);
     1033
    9481034    Benchmarks(hTest);
    9491035
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette