VirtualBox

Changeset 74347 in vbox


Ignore:
Timestamp:
Sep 18, 2018 4:10:34 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
125160
Message:

IPRT/rest: Implemented inheritance in the data model. Introducing a new base class RTCRestDataObject for data model classes. bugref:9167

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/cpp/restbase.h

    r74263 r74347  
    252252
    253253/**
    254  * Abstract base class for REST data objects.
     254 * Abstract base class for REST primitive types and data objects (via
     255 * RTCRestDataObject).
    255256 *
    256257 * The only information this keeps is the null indicator.
     
    371372        kTypeClass_Uuid,                /**< UUID. */
    372373        kTypeClass_Binary,              /**< Binary blob. */
    373         kTypeClass_Object,              /**< Object (any kind of data model object). */
     374        kTypeClass_DataObject,          /**< Data object child (RTCRestDataObject). */
     375        kTypeClass_AnyObject,           /**< Any kind of object (RTCRestAnyObject). */
    374376        kTypeClass_Array,               /**< Array (containing any kind of object). */
    375377        kTypeClass_StringMap,           /**< String map (containing any kind of object). */
     
    380382     * Returns the object type class.
    381383     */
    382     virtual kTypeClass typeClass(void) const;
     384    virtual kTypeClass typeClass(void) const = 0;
    383385
    384386    /**
     
    980982
    981983
     984/**
     985 * Abstract base class for REST data model objects.
     986 */
     987class RT_DECL_CLASS RTCRestDataObject : public RTCRestObjectBase
     988{
     989public:
     990    RTCRestDataObject();
     991    RTCRestDataObject(RTCRestDataObject const &a_rThat);
     992    virtual ~RTCRestDataObject();
     993
     994    /* Overridden methods:*/
     995    virtual int resetToDefault() RT_OVERRIDE;
     996    virtual RTCRestOutputBase &serializeAsJson(RTCRestOutputBase &a_rDst) const RT_OVERRIDE;
     997    virtual int deserializeFromJson(RTCRestJsonCursor const &a_rCursor) RT_OVERRIDE;
     998    virtual kTypeClass typeClass(void) const RT_OVERRIDE;
     999
     1000    /** Safe copy assignment method. */
     1001    virtual int assignCopy(RTCRestDataObject const &a_rThat);
     1002
     1003    /**
     1004     * Serialize the members as JSON.
     1005     *
     1006     * @returns Leading separator prefix (empty string or comma string).
     1007     * @param   a_rDst      The destination for the serialization.
     1008     * @param   a_pszSep    Leading separator prefix (empty or comma).
     1009     */
     1010    virtual const char *serializeMembersAsJson(RTCRestOutputBase &a_rDst, const char *a_pszSep) const;
     1011
     1012    /**
     1013     * Deserialize object from the given JSON iterator.
     1014     *
     1015     * @returns IPRT status code.
     1016     * @retval  VERR_NOT_FOUND if field is unknown.  Top level caller will do
     1017     *          invoke unknownField() on it.
     1018     *
     1019     * @param   a_rCursor   The JSON cursor with the current member.
     1020     * @param   a_cchName   The length of a_rCursor.m_pszName.
     1021     */
     1022    virtual int deserializeMemberFromJson(RTCRestJsonCursor const &a_rCursor, size_t a_cchName);
     1023
     1024protected:
     1025    /** The is-set bits for all the fields. */
     1026    uint64_t m_fIsSet;
     1027
     1028    /** Copy assignment operator. */
     1029    RTCRestDataObject &operator=(RTCRestDataObject const &a_rThat);
     1030};
     1031
     1032
    9821033/** @} */
    9831034
  • trunk/src/VBox/Runtime/VBox/VBoxRTImp-gcc.def

    r74282 r74347  
    509509    _ZNK17RTCRestObjectBase8toStringEP9RTCStringj
    510510    _ZNK17RTCRestObjectBase8toStringEv
    511     _ZNK17RTCRestObjectBase9typeClassEv
    512511    _ZNK20RTCRestStringMapBase11containsKeyEPKc
    513512    _ZNK20RTCRestStringMapBase11containsKeyERK9RTCString
  • trunk/src/VBox/Runtime/VBox/VBoxRTImp-vcc32.def

    r74280 r74347  
    525525    ?typeClass@RTCRestInt32@@UBE?AW4kTypeClass@RTCRestObjectBase@@XZ            ; (public: virtual enum RTCRestObjectBase::kTypeClass __thiscall RTCRestInt32::typeClass(void)const )
    526526    ?typeClass@RTCRestInt64@@UBE?AW4kTypeClass@RTCRestObjectBase@@XZ            ; (public: virtual enum RTCRestObjectBase::kTypeClass __thiscall RTCRestInt64::typeClass(void)const )
    527     ?typeClass@RTCRestObjectBase@@UBE?AW4kTypeClass@1@XZ                        ; (public: virtual enum RTCRestObjectBase::kTypeClass __thiscall RTCRestObjectBase::typeClass(void)const )
    528527    ?typeClass@RTCRestString@@UBE?AW4kTypeClass@RTCRestObjectBase@@XZ           ; (public: virtual enum RTCRestObjectBase::kTypeClass __thiscall RTCRestString::typeClass(void)const )
    529528    ?typeClass@RTCRestStringEnumBase@@UBE?AW4kTypeClass@RTCRestObjectBase@@XZ   ; (public: virtual enum RTCRestObjectBase::kTypeClass __thiscall RTCRestStringEnumBase::typeClass(void)const )
  • trunk/src/VBox/Runtime/VBox/VBoxRTImp-vcc64.def

    r74280 r74347  
    525525    ?typeClass@RTCRestInt32@@UEBA?AW4kTypeClass@RTCRestObjectBase@@XZ           ; (public: virtual enum RTCRestObjectBase::kTypeClass __cdecl RTCRestInt32::typeClass(void)const )
    526526    ?typeClass@RTCRestInt64@@UEBA?AW4kTypeClass@RTCRestObjectBase@@XZ           ; (public: virtual enum RTCRestObjectBase::kTypeClass __cdecl RTCRestInt64::typeClass(void)const )
    527     ?typeClass@RTCRestObjectBase@@UEBA?AW4kTypeClass@1@XZ                       ; (public: virtual enum RTCRestObjectBase::kTypeClass __cdecl RTCRestObjectBase::typeClass(void)const )
    528527    ?typeClass@RTCRestString@@UEBA?AW4kTypeClass@RTCRestObjectBase@@XZ          ; (public: virtual enum RTCRestObjectBase::kTypeClass __cdecl RTCRestString::typeClass(void)const )
    529528    ?typeClass@RTCRestStringEnumBase@@UEBA?AW4kTypeClass@RTCRestObjectBase@@XZ  ; (public: virtual enum RTCRestObjectBase::kTypeClass __cdecl RTCRestStringEnumBase::typeClass(void)const )
  • trunk/src/VBox/Runtime/common/rest/RTCRestAnyObject.cpp

    r74149 r74347  
    112112            case kTypeClass_Binary:
    113113            case kTypeClass_StringEnum:
    114             case kTypeClass_Object:
     114            case kTypeClass_AnyObject:
     115            case kTypeClass_DataObject:
    115116            case kTypeClass_Invalid:
    116117                AssertFailedReturn(VERR_REST_INTERNAL_ERROR_7);
     
    522523RTCRestObjectBase::kTypeClass RTCRestAnyObject::typeClass(void) const
    523524{
    524     return kTypeClass_Object;
     525    return kTypeClass_AnyObject;
    525526}
    526527
     
    547548            case kTypeClass_Binary:
    548549            case kTypeClass_StringEnum:
    549             case kTypeClass_Object:
     550            case kTypeClass_DataObject:
     551            case kTypeClass_AnyObject:
    550552            case kTypeClass_Invalid:
    551553                AssertFailed();
  • trunk/src/VBox/Runtime/common/rest/rest-primary-object-types.cpp

    r74181 r74347  
    118118}
    119119
    120 
    121 RTCRestObjectBase::kTypeClass RTCRestObjectBase::typeClass() const
    122 {
    123     return kTypeClass_Object;
    124 }
    125120
    126121
     
    20142009}
    20152010
     2011
     2012
     2013/*********************************************************************************************************************************
     2014*   RTCRestDataObject                                                                                                                *
     2015*********************************************************************************************************************************/
     2016
     2017RTCRestDataObject::RTCRestDataObject()
     2018    : RTCRestObjectBase()
     2019    , m_fIsSet(0)
     2020{
     2021}
     2022
     2023
     2024RTCRestDataObject::~RTCRestDataObject()
     2025{
     2026}
     2027
     2028
     2029RTCRestDataObject::RTCRestDataObject(RTCRestDataObject const &a_rThat)
     2030    : RTCRestObjectBase(a_rThat)
     2031    , m_fIsSet(a_rThat.m_fIsSet)
     2032{
     2033}
     2034
     2035
     2036RTCRestDataObject &RTCRestDataObject::operator=(RTCRestDataObject const &a_rThat)
     2037{
     2038    m_fNullIndicator = a_rThat.m_fNullIndicator;
     2039    m_fIsSet = a_rThat.m_fIsSet;
     2040    return *this;
     2041}
     2042
     2043
     2044int RTCRestDataObject::assignCopy(RTCRestDataObject const &a_rThat)
     2045{
     2046    m_fNullIndicator = a_rThat.m_fNullIndicator;
     2047    m_fIsSet = a_rThat.m_fIsSet;
     2048    return VINF_SUCCESS;
     2049}
     2050
     2051
     2052int RTCRestDataObject::resetToDefault()
     2053{
     2054    m_fNullIndicator = false;
     2055    m_fIsSet = 0;
     2056    return VINF_SUCCESS;
     2057}
     2058
     2059
     2060const char *RTCRestDataObject::serializeMembersAsJson(RTCRestOutputBase &a_rDst, const char *a_pszSep) const
     2061{
     2062    RT_NOREF(a_rDst);
     2063    return a_pszSep;
     2064}
     2065
     2066
     2067RTCRestOutputBase &RTCRestDataObject::serializeAsJson(RTCRestOutputBase &a_rDst) const
     2068{
     2069    if (!m_fNullIndicator)
     2070    {
     2071        a_rDst.printf("{");
     2072        unsigned const uOldIndent = a_rDst.incrementIndent();
     2073
     2074        const char *pszSep = serializeMembersAsJson(a_rDst, "");
     2075
     2076        a_rDst.setIndent(uOldIndent);
     2077        a_rDst.printf("%s}", *pszSep != '\0' ? "\n" : "");
     2078    }
     2079    else
     2080        a_rDst.printf("null");
     2081    return a_rDst;
     2082}
     2083
     2084
     2085int RTCRestDataObject::deserializeMemberFromJson(RTCRestJsonCursor const &a_rCursor, size_t a_cchName)
     2086{
     2087    RT_NOREF(a_rCursor, a_cchName);
     2088    return VERR_NOT_FOUND;
     2089}
     2090
     2091
     2092int RTCRestDataObject::deserializeFromJson(RTCRestJsonCursor const &a_rCursor)
     2093{
     2094    /*
     2095     * Make sure the object starts out with default values.
     2096     */
     2097    if (m_fIsSet == 0)
     2098        m_fNullIndicator = false;
     2099    else
     2100        resetToDefault();
     2101
     2102    /*
     2103     * Iterate the object values.
     2104     */
     2105    RTJSONIT hIterator;
     2106    int rcRet = RTJsonIteratorBeginObject(a_rCursor.m_hValue, &hIterator);
     2107    if (RT_SUCCESS(rcRet))
     2108    {
     2109        for (;;)
     2110        {
     2111            RTCRestJsonCursor SubCursor(a_rCursor);
     2112            int rc = RTJsonIteratorQueryValue(hIterator, &SubCursor.m_hValue, &SubCursor.m_pszName);
     2113            if (RT_SUCCESS(rc))
     2114            {
     2115                size_t const cchName = strlen(SubCursor.m_pszName);
     2116
     2117                rc = deserializeMemberFromJson(SubCursor, cchName);
     2118                if (rc == VINF_SUCCESS)
     2119                { /* likely */ }
     2120                else if (rc == VERR_NOT_FOUND)
     2121                {
     2122                    rc = SubCursor.m_pPrimary->unknownField(SubCursor);
     2123                    if (rcRet == VINF_SUCCESS)
     2124                        rcRet = rc;
     2125                }
     2126                else if (RT_SUCCESS(rc))
     2127                {
     2128                    if (rcRet == VINF_SUCCESS)
     2129                        rcRet = rc;
     2130                }
     2131                else if (RT_SUCCESS(rcRet))
     2132                    rcRet = rc;
     2133            }
     2134            else
     2135                rcRet = a_rCursor.m_pPrimary->addError(a_rCursor, rc, "RTJsonIteratorQueryValue failed: %Rrc", rc);
     2136
     2137            /*
     2138             * Advance.
     2139             */
     2140            rc = RTJsonIteratorNext(hIterator);
     2141            if (RT_SUCCESS(rc))
     2142            { /* likely */ }
     2143            else if (rc == VERR_JSON_ITERATOR_END)
     2144                break;
     2145            else
     2146            {
     2147                rcRet = a_rCursor.m_pPrimary->addError(a_rCursor, rc, "RTJsonIteratorNext failed: %Rrc", rc);
     2148                break;
     2149            }
     2150        }
     2151
     2152        RTJsonIteratorFree(hIterator);
     2153    }
     2154    else if (   rcRet == VERR_JSON_VALUE_INVALID_TYPE
     2155             && RTJsonValueGetType(a_rCursor.m_hValue) == RTJSONVALTYPE_NULL)
     2156    {
     2157        m_fNullIndicator = true;
     2158        rcRet = VINF_SUCCESS;
     2159    }
     2160    else
     2161        rcRet = a_rCursor.m_pPrimary->addError(a_rCursor, rcRet, "RTJsonIteratorBeginObject failed: %Rrc (type %s)",
     2162                                               rcRet, RTJsonValueTypeName(RTJsonValueGetType(a_rCursor.m_hValue)));
     2163    return rcRet;
     2164}
     2165
     2166
     2167RTCRestObjectBase::kTypeClass RTCRestDataObject::typeClass(void) const
     2168{
     2169    return kTypeClass_DataObject;
     2170}
     2171
Note: See TracChangeset for help on using the changeset viewer.

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