HaikuDepot: preliminary fix for crash in JSON listener

* Fix use-after-free in the auto-generated JSON listener code (was
  calling method of instance after 'delete this')
  Will also submit a patch for the code generation script in the
  haikudepotserver repo so it won't get lost -- this is just a
  temporary fix-up until then.

* Fixes some random occasional crashes
This commit is contained in:
Julian Harnath
2017-11-24 18:22:14 +01:00
parent 492c58fd9c
commit a78e725206
2 changed files with 290 additions and 232 deletions
@@ -10,11 +10,11 @@
// #pragma mark - private interfaces for the stacked listeners // #pragma mark - private interfaces for the stacked listeners
/*! This class is the top level of the stacked listeners. The stack structure /*! This class is the top level of the stacked listeners. The stack structure
is maintained in a linked list and sub-classes implement specific behaviors is maintained in a linked list and sub-classes implement specific behaviors
depending where in the parse tree the stacked listener is working at. depending where in the parse tree the stacked listener is working at.
*/ */
class AbstractStackedDumpExportPkgJsonListener : public BJsonEventListener { class AbstractStackedDumpExportPkgJsonListener : public BJsonEventListener {
public: public:
AbstractStackedDumpExportPkgJsonListener( AbstractStackedDumpExportPkgJsonListener(
@@ -36,7 +36,7 @@ protected:
void Pop(); void Pop();
void Push(AbstractStackedDumpExportPkgJsonListener* stackedListener); void Push(AbstractStackedDumpExportPkgJsonListener* stackedListener);
private: private:
AbstractStackedDumpExportPkgJsonListener* fParent; AbstractStackedDumpExportPkgJsonListener* fParent;
}; };
@@ -47,7 +47,7 @@ public:
AbstractMainDumpExportPkgJsonListener* mainListener, AbstractMainDumpExportPkgJsonListener* mainListener,
AbstractStackedDumpExportPkgJsonListener* parent); AbstractStackedDumpExportPkgJsonListener* parent);
~GeneralArrayStackedDumpExportPkgJsonListener(); ~GeneralArrayStackedDumpExportPkgJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
}; };
@@ -57,7 +57,7 @@ public:
AbstractMainDumpExportPkgJsonListener* mainListener, AbstractMainDumpExportPkgJsonListener* mainListener,
AbstractStackedDumpExportPkgJsonListener* parent); AbstractStackedDumpExportPkgJsonListener* parent);
~GeneralObjectStackedDumpExportPkgJsonListener(); ~GeneralObjectStackedDumpExportPkgJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
}; };
@@ -67,11 +67,11 @@ public:
AbstractMainDumpExportPkgJsonListener* mainListener, AbstractMainDumpExportPkgJsonListener* mainListener,
AbstractStackedDumpExportPkgJsonListener* parent); AbstractStackedDumpExportPkgJsonListener* parent);
~DumpExportPkg_StackedDumpExportPkgJsonListener(); ~DumpExportPkg_StackedDumpExportPkgJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
DumpExportPkg* Target(); DumpExportPkg* Target();
protected: protected:
DumpExportPkg* fTarget; DumpExportPkg* fTarget;
BString fNextItemName; BString fNextItemName;
@@ -83,11 +83,11 @@ public:
AbstractMainDumpExportPkgJsonListener* mainListener, AbstractMainDumpExportPkgJsonListener* mainListener,
AbstractStackedDumpExportPkgJsonListener* parent); AbstractStackedDumpExportPkgJsonListener* parent);
~DumpExportPkg_List_StackedDumpExportPkgJsonListener(); ~DumpExportPkg_List_StackedDumpExportPkgJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
List<DumpExportPkg*, true>* Target(); // list of %s pointers List<DumpExportPkg*, true>* Target(); // list of %s pointers
private: private:
List<DumpExportPkg*, true>* fTarget; List<DumpExportPkg*, true>* fTarget;
}; };
@@ -98,11 +98,11 @@ public:
AbstractMainDumpExportPkgJsonListener* mainListener, AbstractMainDumpExportPkgJsonListener* mainListener,
AbstractStackedDumpExportPkgJsonListener* parent); AbstractStackedDumpExportPkgJsonListener* parent);
~DumpExportPkgVersion_StackedDumpExportPkgJsonListener(); ~DumpExportPkgVersion_StackedDumpExportPkgJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
DumpExportPkgVersion* Target(); DumpExportPkgVersion* Target();
protected: protected:
DumpExportPkgVersion* fTarget; DumpExportPkgVersion* fTarget;
BString fNextItemName; BString fNextItemName;
@@ -114,11 +114,11 @@ public:
AbstractMainDumpExportPkgJsonListener* mainListener, AbstractMainDumpExportPkgJsonListener* mainListener,
AbstractStackedDumpExportPkgJsonListener* parent); AbstractStackedDumpExportPkgJsonListener* parent);
~DumpExportPkgVersion_List_StackedDumpExportPkgJsonListener(); ~DumpExportPkgVersion_List_StackedDumpExportPkgJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
List<DumpExportPkgVersion*, true>* Target(); // list of %s pointers List<DumpExportPkgVersion*, true>* Target(); // list of %s pointers
private: private:
List<DumpExportPkgVersion*, true>* fTarget; List<DumpExportPkgVersion*, true>* fTarget;
}; };
@@ -129,11 +129,11 @@ public:
AbstractMainDumpExportPkgJsonListener* mainListener, AbstractMainDumpExportPkgJsonListener* mainListener,
AbstractStackedDumpExportPkgJsonListener* parent); AbstractStackedDumpExportPkgJsonListener* parent);
~DumpExportPkgScreenshot_StackedDumpExportPkgJsonListener(); ~DumpExportPkgScreenshot_StackedDumpExportPkgJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
DumpExportPkgScreenshot* Target(); DumpExportPkgScreenshot* Target();
protected: protected:
DumpExportPkgScreenshot* fTarget; DumpExportPkgScreenshot* fTarget;
BString fNextItemName; BString fNextItemName;
@@ -145,11 +145,11 @@ public:
AbstractMainDumpExportPkgJsonListener* mainListener, AbstractMainDumpExportPkgJsonListener* mainListener,
AbstractStackedDumpExportPkgJsonListener* parent); AbstractStackedDumpExportPkgJsonListener* parent);
~DumpExportPkgScreenshot_List_StackedDumpExportPkgJsonListener(); ~DumpExportPkgScreenshot_List_StackedDumpExportPkgJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
List<DumpExportPkgScreenshot*, true>* Target(); // list of %s pointers List<DumpExportPkgScreenshot*, true>* Target(); // list of %s pointers
private: private:
List<DumpExportPkgScreenshot*, true>* fTarget; List<DumpExportPkgScreenshot*, true>* fTarget;
}; };
@@ -160,11 +160,11 @@ public:
AbstractMainDumpExportPkgJsonListener* mainListener, AbstractMainDumpExportPkgJsonListener* mainListener,
AbstractStackedDumpExportPkgJsonListener* parent); AbstractStackedDumpExportPkgJsonListener* parent);
~DumpExportPkgCategory_StackedDumpExportPkgJsonListener(); ~DumpExportPkgCategory_StackedDumpExportPkgJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
DumpExportPkgCategory* Target(); DumpExportPkgCategory* Target();
protected: protected:
DumpExportPkgCategory* fTarget; DumpExportPkgCategory* fTarget;
BString fNextItemName; BString fNextItemName;
@@ -176,11 +176,11 @@ public:
AbstractMainDumpExportPkgJsonListener* mainListener, AbstractMainDumpExportPkgJsonListener* mainListener,
AbstractStackedDumpExportPkgJsonListener* parent); AbstractStackedDumpExportPkgJsonListener* parent);
~DumpExportPkgCategory_List_StackedDumpExportPkgJsonListener(); ~DumpExportPkgCategory_List_StackedDumpExportPkgJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
List<DumpExportPkgCategory*, true>* Target(); // list of %s pointers List<DumpExportPkgCategory*, true>* Target(); // list of %s pointers
private: private:
List<DumpExportPkgCategory*, true>* fTarget; List<DumpExportPkgCategory*, true>* fTarget;
}; };
@@ -192,9 +192,9 @@ public:
AbstractStackedDumpExportPkgJsonListener* parent, AbstractStackedDumpExportPkgJsonListener* parent,
DumpExportPkgListener* itemListener); DumpExportPkgListener* itemListener);
~ItemEmittingStackedDumpExportPkgJsonListener(); ~ItemEmittingStackedDumpExportPkgJsonListener();
void WillPop(); void WillPop();
private: private:
DumpExportPkgListener* fItemListener; DumpExportPkgListener* fItemListener;
}; };
@@ -207,9 +207,9 @@ public:
AbstractStackedDumpExportPkgJsonListener* parent, AbstractStackedDumpExportPkgJsonListener* parent,
DumpExportPkgListener* itemListener); DumpExportPkgListener* itemListener);
~BulkContainerStackedDumpExportPkgJsonListener(); ~BulkContainerStackedDumpExportPkgJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
private: private:
BString fNextItemName; BString fNextItemName;
DumpExportPkgListener* fItemListener; DumpExportPkgListener* fItemListener;
@@ -223,10 +223,10 @@ public:
AbstractStackedDumpExportPkgJsonListener* parent, AbstractStackedDumpExportPkgJsonListener* parent,
DumpExportPkgListener* itemListener); DumpExportPkgListener* itemListener);
~BulkContainerItemsStackedDumpExportPkgJsonListener(); ~BulkContainerItemsStackedDumpExportPkgJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
void WillPop(); void WillPop();
private: private:
DumpExportPkgListener* fItemListener; DumpExportPkgListener* fItemListener;
}; };
@@ -312,26 +312,29 @@ GeneralObjectStackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
case B_JSON_NULL: case B_JSON_NULL:
// ignore // ignore
break; break;
case B_JSON_OBJECT_START: case B_JSON_OBJECT_START:
Push(new GeneralObjectStackedDumpExportPkgJsonListener(fMainListener, this)); Push(new GeneralObjectStackedDumpExportPkgJsonListener(fMainListener, this));
break; break;
case B_JSON_ARRAY_START: case B_JSON_ARRAY_START:
Push(new GeneralArrayStackedDumpExportPkgJsonListener(fMainListener, this)); Push(new GeneralArrayStackedDumpExportPkgJsonListener(fMainListener, this));
break; break;
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected end of array"); HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected end of array");
break; break;
case B_JSON_OBJECT_END: case B_JSON_OBJECT_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -360,26 +363,29 @@ GeneralArrayStackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
case B_JSON_NULL: case B_JSON_NULL:
// ignore // ignore
break; break;
case B_JSON_OBJECT_START: case B_JSON_OBJECT_START:
Push(new GeneralObjectStackedDumpExportPkgJsonListener(fMainListener, this)); Push(new GeneralObjectStackedDumpExportPkgJsonListener(fMainListener, this));
break; break;
case B_JSON_ARRAY_START: case B_JSON_ARRAY_START:
Push(new GeneralArrayStackedDumpExportPkgJsonListener(fMainListener, this)); Push(new GeneralArrayStackedDumpExportPkgJsonListener(fMainListener, this));
break; break;
case B_JSON_OBJECT_END: case B_JSON_OBJECT_END:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected end of object"); HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected end of object");
break; break;
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -409,25 +415,28 @@ bool
DumpExportPkg_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event) DumpExportPkg_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
{ {
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected start of array"); HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected start of array");
break; break;
case B_JSON_OBJECT_NAME: case B_JSON_OBJECT_NAME:
fNextItemName = event.Content(); fNextItemName = event.Content();
break; break;
case B_JSON_OBJECT_END: case B_JSON_OBJECT_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
case B_JSON_STRING: case B_JSON_STRING:
if (fNextItemName == "pkgChangelogContent") if (fNextItemName == "pkgChangelogContent")
fTarget->SetPkgChangelogContent(new BString(event.Content())); fTarget->SetPkgChangelogContent(new BString(event.Content()));
if (fNextItemName == "name") if (fNextItemName == "name")
fTarget->SetName(new BString(event.Content())); fTarget->SetName(new BString(event.Content()));
fNextItemName.SetTo(""); fNextItemName.SetTo("");
@@ -443,16 +452,16 @@ DumpExportPkg_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
if (fNextItemName == "pkgChangelogContent") if (fNextItemName == "pkgChangelogContent")
fTarget->SetPkgChangelogContentNull(); fTarget->SetPkgChangelogContentNull();
if (fNextItemName == "name") if (fNextItemName == "name")
fTarget->SetNameNull(); fTarget->SetNameNull();
if (fNextItemName == "derivedRating") if (fNextItemName == "derivedRating")
fTarget->SetDerivedRatingNull(); fTarget->SetDerivedRatingNull();
if (fNextItemName == "prominenceOrdering") if (fNextItemName == "prominenceOrdering")
fTarget->SetProminenceOrderingNull(); fTarget->SetProminenceOrderingNull();
if (fNextItemName == "modifyTimestamp") if (fNextItemName == "modifyTimestamp")
fTarget->SetModifyTimestampNull(); fTarget->SetModifyTimestampNull();
fNextItemName.SetTo(""); fNextItemName.SetTo("");
@@ -463,10 +472,10 @@ DumpExportPkg_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
if (fNextItemName == "derivedRating") if (fNextItemName == "derivedRating")
fTarget->SetDerivedRating(event.ContentDouble()); fTarget->SetDerivedRating(event.ContentDouble());
if (fNextItemName == "prominenceOrdering") if (fNextItemName == "prominenceOrdering")
fTarget->SetProminenceOrdering(event.ContentInteger()); fTarget->SetProminenceOrdering(event.ContentInteger());
if (fNextItemName == "modifyTimestamp") if (fNextItemName == "modifyTimestamp")
fTarget->SetModifyTimestamp(event.ContentInteger()); fTarget->SetModifyTimestamp(event.ContentInteger());
fNextItemName.SetTo(""); fNextItemName.SetTo("");
@@ -507,7 +516,7 @@ DumpExportPkg_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
} }
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -537,12 +546,15 @@ bool
DumpExportPkg_List_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event) DumpExportPkg_List_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
{ {
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
case B_JSON_OBJECT_START: case B_JSON_OBJECT_START:
{ {
DumpExportPkg_StackedDumpExportPkgJsonListener* nextListener = DumpExportPkg_StackedDumpExportPkgJsonListener* nextListener =
@@ -551,13 +563,13 @@ DumpExportPkg_List_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& ev
Push(nextListener); Push(nextListener);
break; break;
} }
default: default:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE,
"illegal state - unexpected json event parsing an array of DumpExportPkg"); "illegal state - unexpected json event parsing an array of DumpExportPkg");
break; break;
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -587,43 +599,46 @@ bool
DumpExportPkgVersion_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event) DumpExportPkgVersion_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
{ {
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected start of array"); HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected start of array");
break; break;
case B_JSON_OBJECT_NAME: case B_JSON_OBJECT_NAME:
fNextItemName = event.Content(); fNextItemName = event.Content();
break; break;
case B_JSON_OBJECT_END: case B_JSON_OBJECT_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
case B_JSON_STRING: case B_JSON_STRING:
if (fNextItemName == "major") if (fNextItemName == "major")
fTarget->SetMajor(new BString(event.Content())); fTarget->SetMajor(new BString(event.Content()));
if (fNextItemName == "description") if (fNextItemName == "description")
fTarget->SetDescription(new BString(event.Content())); fTarget->SetDescription(new BString(event.Content()));
if (fNextItemName == "title") if (fNextItemName == "title")
fTarget->SetTitle(new BString(event.Content())); fTarget->SetTitle(new BString(event.Content()));
if (fNextItemName == "summary") if (fNextItemName == "summary")
fTarget->SetSummary(new BString(event.Content())); fTarget->SetSummary(new BString(event.Content()));
if (fNextItemName == "micro") if (fNextItemName == "micro")
fTarget->SetMicro(new BString(event.Content())); fTarget->SetMicro(new BString(event.Content()));
if (fNextItemName == "preRelease") if (fNextItemName == "preRelease")
fTarget->SetPreRelease(new BString(event.Content())); fTarget->SetPreRelease(new BString(event.Content()));
if (fNextItemName == "architectureCode") if (fNextItemName == "architectureCode")
fTarget->SetArchitectureCode(new BString(event.Content())); fTarget->SetArchitectureCode(new BString(event.Content()));
if (fNextItemName == "minor") if (fNextItemName == "minor")
fTarget->SetMinor(new BString(event.Content())); fTarget->SetMinor(new BString(event.Content()));
fNextItemName.SetTo(""); fNextItemName.SetTo("");
@@ -639,31 +654,31 @@ DumpExportPkgVersion_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent&
if (fNextItemName == "major") if (fNextItemName == "major")
fTarget->SetMajorNull(); fTarget->SetMajorNull();
if (fNextItemName == "payloadLength") if (fNextItemName == "payloadLength")
fTarget->SetPayloadLengthNull(); fTarget->SetPayloadLengthNull();
if (fNextItemName == "description") if (fNextItemName == "description")
fTarget->SetDescriptionNull(); fTarget->SetDescriptionNull();
if (fNextItemName == "title") if (fNextItemName == "title")
fTarget->SetTitleNull(); fTarget->SetTitleNull();
if (fNextItemName == "summary") if (fNextItemName == "summary")
fTarget->SetSummaryNull(); fTarget->SetSummaryNull();
if (fNextItemName == "micro") if (fNextItemName == "micro")
fTarget->SetMicroNull(); fTarget->SetMicroNull();
if (fNextItemName == "preRelease") if (fNextItemName == "preRelease")
fTarget->SetPreReleaseNull(); fTarget->SetPreReleaseNull();
if (fNextItemName == "architectureCode") if (fNextItemName == "architectureCode")
fTarget->SetArchitectureCodeNull(); fTarget->SetArchitectureCodeNull();
if (fNextItemName == "minor") if (fNextItemName == "minor")
fTarget->SetMinorNull(); fTarget->SetMinorNull();
if (fNextItemName == "revision") if (fNextItemName == "revision")
fTarget->SetRevisionNull(); fTarget->SetRevisionNull();
fNextItemName.SetTo(""); fNextItemName.SetTo("");
@@ -674,7 +689,7 @@ DumpExportPkgVersion_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent&
if (fNextItemName == "payloadLength") if (fNextItemName == "payloadLength")
fTarget->SetPayloadLength(event.ContentInteger()); fTarget->SetPayloadLength(event.ContentInteger());
if (fNextItemName == "revision") if (fNextItemName == "revision")
fTarget->SetRevision(event.ContentInteger()); fTarget->SetRevision(event.ContentInteger());
fNextItemName.SetTo(""); fNextItemName.SetTo("");
@@ -700,7 +715,7 @@ DumpExportPkgVersion_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent&
} }
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -730,12 +745,15 @@ bool
DumpExportPkgVersion_List_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event) DumpExportPkgVersion_List_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
{ {
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
case B_JSON_OBJECT_START: case B_JSON_OBJECT_START:
{ {
DumpExportPkgVersion_StackedDumpExportPkgJsonListener* nextListener = DumpExportPkgVersion_StackedDumpExportPkgJsonListener* nextListener =
@@ -744,13 +762,13 @@ DumpExportPkgVersion_List_StackedDumpExportPkgJsonListener::Handle(const BJsonEv
Push(nextListener); Push(nextListener);
break; break;
} }
default: default:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE,
"illegal state - unexpected json event parsing an array of DumpExportPkgVersion"); "illegal state - unexpected json event parsing an array of DumpExportPkgVersion");
break; break;
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -780,19 +798,22 @@ bool
DumpExportPkgScreenshot_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event) DumpExportPkgScreenshot_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
{ {
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected start of array"); HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected start of array");
break; break;
case B_JSON_OBJECT_NAME: case B_JSON_OBJECT_NAME:
fNextItemName = event.Content(); fNextItemName = event.Content();
break; break;
case B_JSON_OBJECT_END: case B_JSON_OBJECT_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
case B_JSON_STRING: case B_JSON_STRING:
@@ -811,16 +832,16 @@ DumpExportPkgScreenshot_StackedDumpExportPkgJsonListener::Handle(const BJsonEven
if (fNextItemName == "ordering") if (fNextItemName == "ordering")
fTarget->SetOrderingNull(); fTarget->SetOrderingNull();
if (fNextItemName == "width") if (fNextItemName == "width")
fTarget->SetWidthNull(); fTarget->SetWidthNull();
if (fNextItemName == "length") if (fNextItemName == "length")
fTarget->SetLengthNull(); fTarget->SetLengthNull();
if (fNextItemName == "code") if (fNextItemName == "code")
fTarget->SetCodeNull(); fTarget->SetCodeNull();
if (fNextItemName == "height") if (fNextItemName == "height")
fTarget->SetHeightNull(); fTarget->SetHeightNull();
fNextItemName.SetTo(""); fNextItemName.SetTo("");
@@ -831,13 +852,13 @@ DumpExportPkgScreenshot_StackedDumpExportPkgJsonListener::Handle(const BJsonEven
if (fNextItemName == "ordering") if (fNextItemName == "ordering")
fTarget->SetOrdering(event.ContentInteger()); fTarget->SetOrdering(event.ContentInteger());
if (fNextItemName == "width") if (fNextItemName == "width")
fTarget->SetWidth(event.ContentInteger()); fTarget->SetWidth(event.ContentInteger());
if (fNextItemName == "length") if (fNextItemName == "length")
fTarget->SetLength(event.ContentInteger()); fTarget->SetLength(event.ContentInteger());
if (fNextItemName == "height") if (fNextItemName == "height")
fTarget->SetHeight(event.ContentInteger()); fTarget->SetHeight(event.ContentInteger());
fNextItemName.SetTo(""); fNextItemName.SetTo("");
@@ -863,7 +884,7 @@ DumpExportPkgScreenshot_StackedDumpExportPkgJsonListener::Handle(const BJsonEven
} }
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -893,12 +914,15 @@ bool
DumpExportPkgScreenshot_List_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event) DumpExportPkgScreenshot_List_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
{ {
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
case B_JSON_OBJECT_START: case B_JSON_OBJECT_START:
{ {
DumpExportPkgScreenshot_StackedDumpExportPkgJsonListener* nextListener = DumpExportPkgScreenshot_StackedDumpExportPkgJsonListener* nextListener =
@@ -907,13 +931,13 @@ DumpExportPkgScreenshot_List_StackedDumpExportPkgJsonListener::Handle(const BJso
Push(nextListener); Push(nextListener);
break; break;
} }
default: default:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE,
"illegal state - unexpected json event parsing an array of DumpExportPkgScreenshot"); "illegal state - unexpected json event parsing an array of DumpExportPkgScreenshot");
break; break;
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -943,19 +967,22 @@ bool
DumpExportPkgCategory_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event) DumpExportPkgCategory_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
{ {
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected start of array"); HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected start of array");
break; break;
case B_JSON_OBJECT_NAME: case B_JSON_OBJECT_NAME:
fNextItemName = event.Content(); fNextItemName = event.Content();
break; break;
case B_JSON_OBJECT_END: case B_JSON_OBJECT_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
case B_JSON_STRING: case B_JSON_STRING:
@@ -1002,7 +1029,7 @@ DumpExportPkgCategory_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent&
} }
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -1032,12 +1059,15 @@ bool
DumpExportPkgCategory_List_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event) DumpExportPkgCategory_List_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
{ {
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
case B_JSON_OBJECT_START: case B_JSON_OBJECT_START:
{ {
DumpExportPkgCategory_StackedDumpExportPkgJsonListener* nextListener = DumpExportPkgCategory_StackedDumpExportPkgJsonListener* nextListener =
@@ -1046,13 +1076,13 @@ DumpExportPkgCategory_List_StackedDumpExportPkgJsonListener::Handle(const BJsonE
Push(nextListener); Push(nextListener);
break; break;
} }
default: default:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE,
"illegal state - unexpected json event parsing an array of DumpExportPkgCategory"); "illegal state - unexpected json event parsing an array of DumpExportPkgCategory");
break; break;
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -1098,36 +1128,39 @@ bool
BulkContainerStackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event) BulkContainerStackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
{ {
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected start of array"); HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected start of array");
break; break;
case B_JSON_OBJECT_NAME: case B_JSON_OBJECT_NAME:
fNextItemName = event.Content(); fNextItemName = event.Content();
break; break;
case B_JSON_OBJECT_START: case B_JSON_OBJECT_START:
Push(new GeneralObjectStackedDumpExportPkgJsonListener(fMainListener, this)); Push(new GeneralObjectStackedDumpExportPkgJsonListener(fMainListener, this));
break; break;
case B_JSON_ARRAY_START: case B_JSON_ARRAY_START:
if (fNextItemName == "items") if (fNextItemName == "items")
Push(new BulkContainerItemsStackedDumpExportPkgJsonListener(fMainListener, this, fItemListener)); Push(new BulkContainerItemsStackedDumpExportPkgJsonListener(fMainListener, this, fItemListener));
else else
Push(new GeneralArrayStackedDumpExportPkgJsonListener(fMainListener, this)); Push(new GeneralArrayStackedDumpExportPkgJsonListener(fMainListener, this));
break; break;
case B_JSON_OBJECT_END: case B_JSON_OBJECT_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
default: default:
// ignore // ignore
break; break;
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -1151,21 +1184,24 @@ bool
BulkContainerItemsStackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event) BulkContainerItemsStackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
{ {
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_OBJECT_START: case B_JSON_OBJECT_START:
Push(new ItemEmittingStackedDumpExportPkgJsonListener(fMainListener, this, fItemListener)); Push(new ItemEmittingStackedDumpExportPkgJsonListener(fMainListener, this, fItemListener));
break; break;
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
default: default:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected json event"); HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected json event");
break; break;
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -1242,12 +1278,12 @@ SingleDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
{ {
if (fErrorStatus != B_OK) if (fErrorStatus != B_OK)
return false; return false;
if (fStackedListener != NULL) if (fStackedListener != NULL)
return fStackedListener->Handle(event); return fStackedListener->Handle(event);
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_OBJECT_START: case B_JSON_OBJECT_START:
{ {
DumpExportPkg_StackedDumpExportPkgJsonListener* nextListener = new DumpExportPkg_StackedDumpExportPkgJsonListener( DumpExportPkg_StackedDumpExportPkgJsonListener* nextListener = new DumpExportPkg_StackedDumpExportPkgJsonListener(
@@ -1256,13 +1292,13 @@ SingleDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
SetStackedListener(nextListener); SetStackedListener(nextListener);
break; break;
} }
default: default:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE,
"illegal state - unexpected json event parsing top level for DumpExportPkg"); "illegal state - unexpected json event parsing top level for DumpExportPkg");
break; break;
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -1291,12 +1327,12 @@ BulkContainerDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
{ {
if (fErrorStatus != B_OK) if (fErrorStatus != B_OK)
return false; return false;
if (fStackedListener != NULL) if (fStackedListener != NULL)
return fStackedListener->Handle(event); return fStackedListener->Handle(event);
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_OBJECT_START: case B_JSON_OBJECT_START:
{ {
BulkContainerStackedDumpExportPkgJsonListener* nextListener = BulkContainerStackedDumpExportPkgJsonListener* nextListener =
@@ -1306,13 +1342,13 @@ BulkContainerDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
return true; return true;
break; break;
} }
default: default:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE,
"illegal state - unexpected json event parsing top level for BulkContainerDumpExportPkgJsonListener"); "illegal state - unexpected json event parsing top level for BulkContainerDumpExportPkgJsonListener");
break; break;
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -5,16 +5,15 @@
*/ */
#include "DumpExportRepositoryJsonListener.h" #include "DumpExportRepositoryJsonListener.h"
#include "List.h" #include "List.h"
#include <stdio.h> #include <stdio.h>
// #pragma mark - private interfaces for the stacked listeners // #pragma mark - private interfaces for the stacked listeners
/*! This class is the top level of the stacked listeners. The stack structure /*! This class is the top level of the stacked listeners. The stack structure
is maintained in a linked list and sub-classes implement specific behaviors is maintained in a linked list and sub-classes implement specific behaviors
depending where in the parse tree the stacked listener is working at. depending where in the parse tree the stacked listener is working at.
*/ */
class AbstractStackedDumpExportRepositoryJsonListener : public BJsonEventListener { class AbstractStackedDumpExportRepositoryJsonListener : public BJsonEventListener {
public: public:
AbstractStackedDumpExportRepositoryJsonListener( AbstractStackedDumpExportRepositoryJsonListener(
@@ -36,7 +35,7 @@ protected:
void Pop(); void Pop();
void Push(AbstractStackedDumpExportRepositoryJsonListener* stackedListener); void Push(AbstractStackedDumpExportRepositoryJsonListener* stackedListener);
private: private:
AbstractStackedDumpExportRepositoryJsonListener* fParent; AbstractStackedDumpExportRepositoryJsonListener* fParent;
}; };
@@ -47,7 +46,7 @@ public:
AbstractMainDumpExportRepositoryJsonListener* mainListener, AbstractMainDumpExportRepositoryJsonListener* mainListener,
AbstractStackedDumpExportRepositoryJsonListener* parent); AbstractStackedDumpExportRepositoryJsonListener* parent);
~GeneralArrayStackedDumpExportRepositoryJsonListener(); ~GeneralArrayStackedDumpExportRepositoryJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
}; };
@@ -57,7 +56,7 @@ public:
AbstractMainDumpExportRepositoryJsonListener* mainListener, AbstractMainDumpExportRepositoryJsonListener* mainListener,
AbstractStackedDumpExportRepositoryJsonListener* parent); AbstractStackedDumpExportRepositoryJsonListener* parent);
~GeneralObjectStackedDumpExportRepositoryJsonListener(); ~GeneralObjectStackedDumpExportRepositoryJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
}; };
@@ -67,11 +66,11 @@ public:
AbstractMainDumpExportRepositoryJsonListener* mainListener, AbstractMainDumpExportRepositoryJsonListener* mainListener,
AbstractStackedDumpExportRepositoryJsonListener* parent); AbstractStackedDumpExportRepositoryJsonListener* parent);
~DumpExportRepository_StackedDumpExportRepositoryJsonListener(); ~DumpExportRepository_StackedDumpExportRepositoryJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
DumpExportRepository* Target(); DumpExportRepository* Target();
protected: protected:
DumpExportRepository* fTarget; DumpExportRepository* fTarget;
BString fNextItemName; BString fNextItemName;
@@ -83,11 +82,11 @@ public:
AbstractMainDumpExportRepositoryJsonListener* mainListener, AbstractMainDumpExportRepositoryJsonListener* mainListener,
AbstractStackedDumpExportRepositoryJsonListener* parent); AbstractStackedDumpExportRepositoryJsonListener* parent);
~DumpExportRepository_List_StackedDumpExportRepositoryJsonListener(); ~DumpExportRepository_List_StackedDumpExportRepositoryJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
List<DumpExportRepository*, true>* Target(); // list of %s pointers List<DumpExportRepository*, true>* Target(); // list of %s pointers
private: private:
List<DumpExportRepository*, true>* fTarget; List<DumpExportRepository*, true>* fTarget;
}; };
@@ -98,11 +97,11 @@ public:
AbstractMainDumpExportRepositoryJsonListener* mainListener, AbstractMainDumpExportRepositoryJsonListener* mainListener,
AbstractStackedDumpExportRepositoryJsonListener* parent); AbstractStackedDumpExportRepositoryJsonListener* parent);
~DumpExportRepositorySource_StackedDumpExportRepositoryJsonListener(); ~DumpExportRepositorySource_StackedDumpExportRepositoryJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
DumpExportRepositorySource* Target(); DumpExportRepositorySource* Target();
protected: protected:
DumpExportRepositorySource* fTarget; DumpExportRepositorySource* fTarget;
BString fNextItemName; BString fNextItemName;
@@ -114,11 +113,11 @@ public:
AbstractMainDumpExportRepositoryJsonListener* mainListener, AbstractMainDumpExportRepositoryJsonListener* mainListener,
AbstractStackedDumpExportRepositoryJsonListener* parent); AbstractStackedDumpExportRepositoryJsonListener* parent);
~DumpExportRepositorySource_List_StackedDumpExportRepositoryJsonListener(); ~DumpExportRepositorySource_List_StackedDumpExportRepositoryJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
List<DumpExportRepositorySource*, true>* Target(); // list of %s pointers List<DumpExportRepositorySource*, true>* Target(); // list of %s pointers
private: private:
List<DumpExportRepositorySource*, true>* fTarget; List<DumpExportRepositorySource*, true>* fTarget;
}; };
@@ -130,9 +129,9 @@ public:
AbstractStackedDumpExportRepositoryJsonListener* parent, AbstractStackedDumpExportRepositoryJsonListener* parent,
DumpExportRepositoryListener* itemListener); DumpExportRepositoryListener* itemListener);
~ItemEmittingStackedDumpExportRepositoryJsonListener(); ~ItemEmittingStackedDumpExportRepositoryJsonListener();
void WillPop(); void WillPop();
private: private:
DumpExportRepositoryListener* fItemListener; DumpExportRepositoryListener* fItemListener;
}; };
@@ -145,9 +144,9 @@ public:
AbstractStackedDumpExportRepositoryJsonListener* parent, AbstractStackedDumpExportRepositoryJsonListener* parent,
DumpExportRepositoryListener* itemListener); DumpExportRepositoryListener* itemListener);
~BulkContainerStackedDumpExportRepositoryJsonListener(); ~BulkContainerStackedDumpExportRepositoryJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
private: private:
BString fNextItemName; BString fNextItemName;
DumpExportRepositoryListener* fItemListener; DumpExportRepositoryListener* fItemListener;
@@ -161,10 +160,10 @@ public:
AbstractStackedDumpExportRepositoryJsonListener* parent, AbstractStackedDumpExportRepositoryJsonListener* parent,
DumpExportRepositoryListener* itemListener); DumpExportRepositoryListener* itemListener);
~BulkContainerItemsStackedDumpExportRepositoryJsonListener(); ~BulkContainerItemsStackedDumpExportRepositoryJsonListener();
bool Handle(const BJsonEvent& event); bool Handle(const BJsonEvent& event);
void WillPop(); void WillPop();
private: private:
DumpExportRepositoryListener* fItemListener; DumpExportRepositoryListener* fItemListener;
}; };
@@ -250,26 +249,28 @@ GeneralObjectStackedDumpExportRepositoryJsonListener::Handle(const BJsonEvent& e
case B_JSON_NULL: case B_JSON_NULL:
// ignore // ignore
break; break;
case B_JSON_OBJECT_START: case B_JSON_OBJECT_START:
Push(new GeneralObjectStackedDumpExportRepositoryJsonListener(fMainListener, this)); Push(new GeneralObjectStackedDumpExportRepositoryJsonListener(fMainListener, this));
break; break;
case B_JSON_ARRAY_START: case B_JSON_ARRAY_START:
Push(new GeneralArrayStackedDumpExportRepositoryJsonListener(fMainListener, this)); Push(new GeneralArrayStackedDumpExportRepositoryJsonListener(fMainListener, this));
break; break;
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected end of array"); HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected end of array");
break; break;
case B_JSON_OBJECT_END: case B_JSON_OBJECT_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -298,26 +299,28 @@ GeneralArrayStackedDumpExportRepositoryJsonListener::Handle(const BJsonEvent& ev
case B_JSON_NULL: case B_JSON_NULL:
// ignore // ignore
break; break;
case B_JSON_OBJECT_START: case B_JSON_OBJECT_START:
Push(new GeneralObjectStackedDumpExportRepositoryJsonListener(fMainListener, this)); Push(new GeneralObjectStackedDumpExportRepositoryJsonListener(fMainListener, this));
break; break;
case B_JSON_ARRAY_START: case B_JSON_ARRAY_START:
Push(new GeneralArrayStackedDumpExportRepositoryJsonListener(fMainListener, this)); Push(new GeneralArrayStackedDumpExportRepositoryJsonListener(fMainListener, this));
break; break;
case B_JSON_OBJECT_END: case B_JSON_OBJECT_END:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected end of object"); HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected end of object");
break; break;
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -347,31 +350,34 @@ bool
DumpExportRepository_StackedDumpExportRepositoryJsonListener::Handle(const BJsonEvent& event) DumpExportRepository_StackedDumpExportRepositoryJsonListener::Handle(const BJsonEvent& event)
{ {
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected start of array"); HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected start of array");
break; break;
case B_JSON_OBJECT_NAME: case B_JSON_OBJECT_NAME:
fNextItemName = event.Content(); fNextItemName = event.Content();
break; break;
case B_JSON_OBJECT_END: case B_JSON_OBJECT_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
case B_JSON_STRING: case B_JSON_STRING:
if (fNextItemName == "informationUrl") if (fNextItemName == "informationUrl")
fTarget->SetInformationUrl(new BString(event.Content())); fTarget->SetInformationUrl(new BString(event.Content()));
if (fNextItemName == "code") if (fNextItemName == "code")
fTarget->SetCode(new BString(event.Content())); fTarget->SetCode(new BString(event.Content()));
if (fNextItemName == "name") if (fNextItemName == "name")
fTarget->SetName(new BString(event.Content())); fTarget->SetName(new BString(event.Content()));
if (fNextItemName == "description") if (fNextItemName == "description")
fTarget->SetDescription(new BString(event.Content())); fTarget->SetDescription(new BString(event.Content()));
fNextItemName.SetTo(""); fNextItemName.SetTo("");
@@ -387,13 +393,13 @@ DumpExportRepository_StackedDumpExportRepositoryJsonListener::Handle(const BJson
if (fNextItemName == "informationUrl") if (fNextItemName == "informationUrl")
fTarget->SetInformationUrlNull(); fTarget->SetInformationUrlNull();
if (fNextItemName == "code") if (fNextItemName == "code")
fTarget->SetCodeNull(); fTarget->SetCodeNull();
if (fNextItemName == "name") if (fNextItemName == "name")
fTarget->SetNameNull(); fTarget->SetNameNull();
if (fNextItemName == "description") if (fNextItemName == "description")
fTarget->SetDescriptionNull(); fTarget->SetDescriptionNull();
fNextItemName.SetTo(""); fNextItemName.SetTo("");
@@ -429,7 +435,7 @@ DumpExportRepository_StackedDumpExportRepositoryJsonListener::Handle(const BJson
} }
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -459,12 +465,15 @@ bool
DumpExportRepository_List_StackedDumpExportRepositoryJsonListener::Handle(const BJsonEvent& event) DumpExportRepository_List_StackedDumpExportRepositoryJsonListener::Handle(const BJsonEvent& event)
{ {
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
case B_JSON_OBJECT_START: case B_JSON_OBJECT_START:
{ {
DumpExportRepository_StackedDumpExportRepositoryJsonListener* nextListener = DumpExportRepository_StackedDumpExportRepositoryJsonListener* nextListener =
@@ -473,13 +482,13 @@ DumpExportRepository_List_StackedDumpExportRepositoryJsonListener::Handle(const
Push(nextListener); Push(nextListener);
break; break;
} }
default: default:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE,
"illegal state - unexpected json event parsing an array of DumpExportRepository"); "illegal state - unexpected json event parsing an array of DumpExportRepository");
break; break;
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -509,25 +518,28 @@ bool
DumpExportRepositorySource_StackedDumpExportRepositoryJsonListener::Handle(const BJsonEvent& event) DumpExportRepositorySource_StackedDumpExportRepositoryJsonListener::Handle(const BJsonEvent& event)
{ {
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected start of array"); HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected start of array");
break; break;
case B_JSON_OBJECT_NAME: case B_JSON_OBJECT_NAME:
fNextItemName = event.Content(); fNextItemName = event.Content();
break; break;
case B_JSON_OBJECT_END: case B_JSON_OBJECT_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
case B_JSON_STRING: case B_JSON_STRING:
if (fNextItemName == "url") if (fNextItemName == "url")
fTarget->SetUrl(new BString(event.Content())); fTarget->SetUrl(new BString(event.Content()));
if (fNextItemName == "code") if (fNextItemName == "code")
fTarget->SetCode(new BString(event.Content())); fTarget->SetCode(new BString(event.Content()));
fNextItemName.SetTo(""); fNextItemName.SetTo("");
@@ -543,7 +555,7 @@ DumpExportRepositorySource_StackedDumpExportRepositoryJsonListener::Handle(const
if (fNextItemName == "url") if (fNextItemName == "url")
fTarget->SetUrlNull(); fTarget->SetUrlNull();
if (fNextItemName == "code") if (fNextItemName == "code")
fTarget->SetCodeNull(); fTarget->SetCodeNull();
fNextItemName.SetTo(""); fNextItemName.SetTo("");
@@ -574,7 +586,7 @@ DumpExportRepositorySource_StackedDumpExportRepositoryJsonListener::Handle(const
} }
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -604,12 +616,15 @@ bool
DumpExportRepositorySource_List_StackedDumpExportRepositoryJsonListener::Handle(const BJsonEvent& event) DumpExportRepositorySource_List_StackedDumpExportRepositoryJsonListener::Handle(const BJsonEvent& event)
{ {
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
case B_JSON_OBJECT_START: case B_JSON_OBJECT_START:
{ {
DumpExportRepositorySource_StackedDumpExportRepositoryJsonListener* nextListener = DumpExportRepositorySource_StackedDumpExportRepositoryJsonListener* nextListener =
@@ -618,13 +633,13 @@ DumpExportRepositorySource_List_StackedDumpExportRepositoryJsonListener::Handle(
Push(nextListener); Push(nextListener);
break; break;
} }
default: default:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE,
"illegal state - unexpected json event parsing an array of DumpExportRepositorySource"); "illegal state - unexpected json event parsing an array of DumpExportRepositorySource");
break; break;
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -670,36 +685,39 @@ bool
BulkContainerStackedDumpExportRepositoryJsonListener::Handle(const BJsonEvent& event) BulkContainerStackedDumpExportRepositoryJsonListener::Handle(const BJsonEvent& event)
{ {
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected start of array"); HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected start of array");
break; break;
case B_JSON_OBJECT_NAME: case B_JSON_OBJECT_NAME:
fNextItemName = event.Content(); fNextItemName = event.Content();
break; break;
case B_JSON_OBJECT_START: case B_JSON_OBJECT_START:
Push(new GeneralObjectStackedDumpExportRepositoryJsonListener(fMainListener, this)); Push(new GeneralObjectStackedDumpExportRepositoryJsonListener(fMainListener, this));
break; break;
case B_JSON_ARRAY_START: case B_JSON_ARRAY_START:
if (fNextItemName == "items") if (fNextItemName == "items")
Push(new BulkContainerItemsStackedDumpExportRepositoryJsonListener(fMainListener, this, fItemListener)); Push(new BulkContainerItemsStackedDumpExportRepositoryJsonListener(fMainListener, this, fItemListener));
else else
Push(new GeneralArrayStackedDumpExportRepositoryJsonListener(fMainListener, this)); Push(new GeneralArrayStackedDumpExportRepositoryJsonListener(fMainListener, this));
break; break;
case B_JSON_OBJECT_END: case B_JSON_OBJECT_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
default: default:
// ignore // ignore
break; break;
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -723,21 +741,24 @@ bool
BulkContainerItemsStackedDumpExportRepositoryJsonListener::Handle(const BJsonEvent& event) BulkContainerItemsStackedDumpExportRepositoryJsonListener::Handle(const BJsonEvent& event)
{ {
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_OBJECT_START: case B_JSON_OBJECT_START:
Push(new ItemEmittingStackedDumpExportRepositoryJsonListener(fMainListener, this, fItemListener)); Push(new ItemEmittingStackedDumpExportRepositoryJsonListener(fMainListener, this, fItemListener));
break; break;
case B_JSON_ARRAY_END: case B_JSON_ARRAY_END:
{
Pop(); Pop();
bool status = (ErrorStatus() == B_OK);
delete this; delete this;
break; return status;
}
default: default:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected json event"); HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected json event");
break; break;
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -814,12 +835,12 @@ SingleDumpExportRepositoryJsonListener::Handle(const BJsonEvent& event)
{ {
if (fErrorStatus != B_OK) if (fErrorStatus != B_OK)
return false; return false;
if (fStackedListener != NULL) if (fStackedListener != NULL)
return fStackedListener->Handle(event); return fStackedListener->Handle(event);
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_OBJECT_START: case B_JSON_OBJECT_START:
{ {
DumpExportRepository_StackedDumpExportRepositoryJsonListener* nextListener = new DumpExportRepository_StackedDumpExportRepositoryJsonListener( DumpExportRepository_StackedDumpExportRepositoryJsonListener* nextListener = new DumpExportRepository_StackedDumpExportRepositoryJsonListener(
@@ -828,13 +849,13 @@ SingleDumpExportRepositoryJsonListener::Handle(const BJsonEvent& event)
SetStackedListener(nextListener); SetStackedListener(nextListener);
break; break;
} }
default: default:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE,
"illegal state - unexpected json event parsing top level for DumpExportRepository"); "illegal state - unexpected json event parsing top level for DumpExportRepository");
break; break;
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }
@@ -863,28 +884,29 @@ BulkContainerDumpExportRepositoryJsonListener::Handle(const BJsonEvent& event)
{ {
if (fErrorStatus != B_OK) if (fErrorStatus != B_OK)
return false; return false;
if (fStackedListener != NULL) if (fStackedListener != NULL)
return fStackedListener->Handle(event); return fStackedListener->Handle(event);
switch (event.EventType()) { switch (event.EventType()) {
case B_JSON_OBJECT_START: case B_JSON_OBJECT_START:
{ {
BulkContainerStackedDumpExportRepositoryJsonListener* nextListener = BulkContainerStackedDumpExportRepositoryJsonListener* nextListener =
new BulkContainerStackedDumpExportRepositoryJsonListener( new BulkContainerStackedDumpExportRepositoryJsonListener(
this, NULL, fItemListener); this, NULL, fItemListener);
SetStackedListener(nextListener); SetStackedListener(nextListener);
return true; return true;
break; break;
} }
default: default:
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE,
"illegal state - unexpected json event parsing top level for BulkContainerDumpExportRepositoryJsonListener"); "illegal state - unexpected json event parsing top level for BulkContainerDumpExportRepositoryJsonListener");
break; break;
} }
return ErrorStatus() == B_OK; return ErrorStatus() == B_OK;
} }