VirtualBox

Ignore:
Timestamp:
Sep 18, 2018 4:10:34 PM (6 years ago)
Author:
vboxsync
Message:

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

Location:
trunk/src/VBox/Runtime/common/rest
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • 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.

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