Changeset 74347 in vbox
- Timestamp:
- Sep 18, 2018 4:10:34 PM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 125160
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/iprt/cpp/restbase.h
r74263 r74347 252 252 253 253 /** 254 * Abstract base class for REST data objects. 254 * Abstract base class for REST primitive types and data objects (via 255 * RTCRestDataObject). 255 256 * 256 257 * The only information this keeps is the null indicator. … … 371 372 kTypeClass_Uuid, /**< UUID. */ 372 373 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). */ 374 376 kTypeClass_Array, /**< Array (containing any kind of object). */ 375 377 kTypeClass_StringMap, /**< String map (containing any kind of object). */ … … 380 382 * Returns the object type class. 381 383 */ 382 virtual kTypeClass typeClass(void) const ;384 virtual kTypeClass typeClass(void) const = 0; 383 385 384 386 /** … … 980 982 981 983 984 /** 985 * Abstract base class for REST data model objects. 986 */ 987 class RT_DECL_CLASS RTCRestDataObject : public RTCRestObjectBase 988 { 989 public: 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 1024 protected: 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 982 1033 /** @} */ 983 1034 -
trunk/src/VBox/Runtime/VBox/VBoxRTImp-gcc.def
r74282 r74347 509 509 _ZNK17RTCRestObjectBase8toStringEP9RTCStringj 510 510 _ZNK17RTCRestObjectBase8toStringEv 511 _ZNK17RTCRestObjectBase9typeClassEv512 511 _ZNK20RTCRestStringMapBase11containsKeyEPKc 513 512 _ZNK20RTCRestStringMapBase11containsKeyERK9RTCString -
trunk/src/VBox/Runtime/VBox/VBoxRTImp-vcc32.def
r74280 r74347 525 525 ?typeClass@RTCRestInt32@@UBE?AW4kTypeClass@RTCRestObjectBase@@XZ ; (public: virtual enum RTCRestObjectBase::kTypeClass __thiscall RTCRestInt32::typeClass(void)const ) 526 526 ?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 )528 527 ?typeClass@RTCRestString@@UBE?AW4kTypeClass@RTCRestObjectBase@@XZ ; (public: virtual enum RTCRestObjectBase::kTypeClass __thiscall RTCRestString::typeClass(void)const ) 529 528 ?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 525 525 ?typeClass@RTCRestInt32@@UEBA?AW4kTypeClass@RTCRestObjectBase@@XZ ; (public: virtual enum RTCRestObjectBase::kTypeClass __cdecl RTCRestInt32::typeClass(void)const ) 526 526 ?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 )528 527 ?typeClass@RTCRestString@@UEBA?AW4kTypeClass@RTCRestObjectBase@@XZ ; (public: virtual enum RTCRestObjectBase::kTypeClass __cdecl RTCRestString::typeClass(void)const ) 529 528 ?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 112 112 case kTypeClass_Binary: 113 113 case kTypeClass_StringEnum: 114 case kTypeClass_Object: 114 case kTypeClass_AnyObject: 115 case kTypeClass_DataObject: 115 116 case kTypeClass_Invalid: 116 117 AssertFailedReturn(VERR_REST_INTERNAL_ERROR_7); … … 522 523 RTCRestObjectBase::kTypeClass RTCRestAnyObject::typeClass(void) const 523 524 { 524 return kTypeClass_ Object;525 return kTypeClass_AnyObject; 525 526 } 526 527 … … 547 548 case kTypeClass_Binary: 548 549 case kTypeClass_StringEnum: 549 case kTypeClass_Object: 550 case kTypeClass_DataObject: 551 case kTypeClass_AnyObject: 550 552 case kTypeClass_Invalid: 551 553 AssertFailed(); -
trunk/src/VBox/Runtime/common/rest/rest-primary-object-types.cpp
r74181 r74347 118 118 } 119 119 120 121 RTCRestObjectBase::kTypeClass RTCRestObjectBase::typeClass() const122 {123 return kTypeClass_Object;124 }125 120 126 121 … … 2014 2009 } 2015 2010 2011 2012 2013 /********************************************************************************************************************************* 2014 * RTCRestDataObject * 2015 *********************************************************************************************************************************/ 2016 2017 RTCRestDataObject::RTCRestDataObject() 2018 : RTCRestObjectBase() 2019 , m_fIsSet(0) 2020 { 2021 } 2022 2023 2024 RTCRestDataObject::~RTCRestDataObject() 2025 { 2026 } 2027 2028 2029 RTCRestDataObject::RTCRestDataObject(RTCRestDataObject const &a_rThat) 2030 : RTCRestObjectBase(a_rThat) 2031 , m_fIsSet(a_rThat.m_fIsSet) 2032 { 2033 } 2034 2035 2036 RTCRestDataObject &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 2044 int 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 2052 int RTCRestDataObject::resetToDefault() 2053 { 2054 m_fNullIndicator = false; 2055 m_fIsSet = 0; 2056 return VINF_SUCCESS; 2057 } 2058 2059 2060 const char *RTCRestDataObject::serializeMembersAsJson(RTCRestOutputBase &a_rDst, const char *a_pszSep) const 2061 { 2062 RT_NOREF(a_rDst); 2063 return a_pszSep; 2064 } 2065 2066 2067 RTCRestOutputBase &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 2085 int 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 2092 int 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 2167 RTCRestObjectBase::kTypeClass RTCRestDataObject::typeClass(void) const 2168 { 2169 return kTypeClass_DataObject; 2170 } 2171
Note:
See TracChangeset
for help on using the changeset viewer.