Separate notification from deletion in repository-handlers.

* Add NotifyDone() to all repository-attribute handlers and invoke that
  to notify any listeners.
* Unify deletion to a single implementation of Delete() in the base
  class. Before, the root handler for a repository didn't do that, but
  just triggered the notification.
This commit is contained in:
Oliver Tappe
2013-09-18 21:16:13 +02:00
parent b162bdaf1d
commit 0a345af77e
3 changed files with 63 additions and 33 deletions
+25 -4
View File
@@ -243,6 +243,8 @@ public:
const AttributeValue& value, const AttributeValue& value,
AttributeHandler** _handler); AttributeHandler** _handler);
virtual status_t NotifyDone(AttributeHandlerContext* context);
virtual status_t Delete(AttributeHandlerContext* context); virtual status_t Delete(AttributeHandlerContext* context);
protected: protected:
@@ -256,12 +258,14 @@ class ReaderImplBase::IgnoreAttributeHandler : public AttributeHandler {
class ReaderImplBase::PackageInfoAttributeHandlerBase class ReaderImplBase::PackageInfoAttributeHandlerBase
: public AttributeHandler { : public AttributeHandler {
private:
typedef AttributeHandler super;
public: public:
PackageInfoAttributeHandlerBase( PackageInfoAttributeHandlerBase(
BPackageInfoAttributeValue& BPackageInfoAttributeValue&
packageInfoValue); packageInfoValue);
virtual status_t Delete(AttributeHandlerContext* context); virtual status_t NotifyDone(AttributeHandlerContext* context);
protected: protected:
BPackageInfoAttributeValue& fPackageInfoValue; BPackageInfoAttributeValue& fPackageInfoValue;
@@ -270,6 +274,8 @@ protected:
class ReaderImplBase::PackageVersionAttributeHandler class ReaderImplBase::PackageVersionAttributeHandler
: public PackageInfoAttributeHandlerBase { : public PackageInfoAttributeHandlerBase {
private:
typedef PackageInfoAttributeHandlerBase super;
public: public:
PackageVersionAttributeHandler( PackageVersionAttributeHandler(
BPackageInfoAttributeValue& BPackageInfoAttributeValue&
@@ -282,7 +288,7 @@ public:
const AttributeValue& value, const AttributeValue& value,
AttributeHandler** _handler); AttributeHandler** _handler);
virtual status_t Delete(AttributeHandlerContext* context); virtual status_t NotifyDone(AttributeHandlerContext* context);
private: private:
BPackageVersionData& fPackageVersionData; BPackageVersionData& fPackageVersionData;
@@ -292,6 +298,8 @@ private:
class ReaderImplBase::PackageResolvableAttributeHandler class ReaderImplBase::PackageResolvableAttributeHandler
: public PackageInfoAttributeHandlerBase { : public PackageInfoAttributeHandlerBase {
private:
typedef PackageInfoAttributeHandlerBase super;
public: public:
PackageResolvableAttributeHandler( PackageResolvableAttributeHandler(
BPackageInfoAttributeValue& BPackageInfoAttributeValue&
@@ -306,6 +314,8 @@ public:
class ReaderImplBase::PackageResolvableExpressionAttributeHandler class ReaderImplBase::PackageResolvableExpressionAttributeHandler
: public PackageInfoAttributeHandlerBase { : public PackageInfoAttributeHandlerBase {
private:
typedef PackageInfoAttributeHandlerBase super;
public: public:
PackageResolvableExpressionAttributeHandler( PackageResolvableExpressionAttributeHandler(
BPackageInfoAttributeValue& BPackageInfoAttributeValue&
@@ -320,6 +330,8 @@ public:
class ReaderImplBase::GlobalWritableFileInfoAttributeHandler class ReaderImplBase::GlobalWritableFileInfoAttributeHandler
: public PackageInfoAttributeHandlerBase { : public PackageInfoAttributeHandlerBase {
private:
typedef PackageInfoAttributeHandlerBase super;
public: public:
GlobalWritableFileInfoAttributeHandler( GlobalWritableFileInfoAttributeHandler(
BPackageInfoAttributeValue& BPackageInfoAttributeValue&
@@ -334,6 +346,8 @@ public:
class ReaderImplBase::UserSettingsFileInfoAttributeHandler class ReaderImplBase::UserSettingsFileInfoAttributeHandler
: public PackageInfoAttributeHandlerBase { : public PackageInfoAttributeHandlerBase {
private:
typedef PackageInfoAttributeHandlerBase super;
public: public:
UserSettingsFileInfoAttributeHandler( UserSettingsFileInfoAttributeHandler(
BPackageInfoAttributeValue& BPackageInfoAttributeValue&
@@ -348,6 +362,8 @@ public:
class ReaderImplBase::UserAttributeHandler class ReaderImplBase::UserAttributeHandler
: public PackageInfoAttributeHandlerBase { : public PackageInfoAttributeHandlerBase {
private:
typedef PackageInfoAttributeHandlerBase super;
public: public:
UserAttributeHandler( UserAttributeHandler(
BPackageInfoAttributeValue& BPackageInfoAttributeValue&
@@ -358,7 +374,7 @@ public:
const AttributeValue& value, const AttributeValue& value,
AttributeHandler** _handler); AttributeHandler** _handler);
virtual status_t Delete(AttributeHandlerContext* context); virtual status_t NotifyDone(AttributeHandlerContext* context);
private: private:
Array<const char*> fGroups; Array<const char*> fGroups;
@@ -366,6 +382,8 @@ private:
class ReaderImplBase::PackageAttributeHandler : public AttributeHandler { class ReaderImplBase::PackageAttributeHandler : public AttributeHandler {
private:
typedef AttributeHandler super;
public: public:
virtual status_t HandleAttribute( virtual status_t HandleAttribute(
AttributeHandlerContext* context, uint8 id, AttributeHandlerContext* context, uint8 id,
@@ -378,6 +396,8 @@ private:
class ReaderImplBase::LowLevelAttributeHandler : public AttributeHandler { class ReaderImplBase::LowLevelAttributeHandler : public AttributeHandler {
private:
typedef AttributeHandler super;
public: public:
LowLevelAttributeHandler(); LowLevelAttributeHandler();
LowLevelAttributeHandler(uint8 id, LowLevelAttributeHandler(uint8 id,
@@ -388,7 +408,8 @@ public:
AttributeHandlerContext* context, uint8 id, AttributeHandlerContext* context, uint8 id,
const AttributeValue& value, const AttributeValue& value,
AttributeHandler** _handler); AttributeHandler** _handler);
virtual status_t Delete(AttributeHandlerContext* context);
virtual status_t NotifyDone(AttributeHandlerContext* context);
private: private:
void* fParentToken; void* fParentToken;
+31 -27
View File
@@ -103,6 +103,14 @@ ReaderImplBase::AttributeHandler::HandleAttribute(
} }
status_t
ReaderImplBase::AttributeHandler::NotifyDone(
AttributeHandlerContext* context)
{
return B_OK;
}
status_t status_t
ReaderImplBase::AttributeHandler::Delete(AttributeHandlerContext* context) ReaderImplBase::AttributeHandler::Delete(AttributeHandlerContext* context)
{ {
@@ -124,14 +132,12 @@ ReaderImplBase::PackageInfoAttributeHandlerBase
status_t status_t
ReaderImplBase::PackageInfoAttributeHandlerBase::Delete( ReaderImplBase::PackageInfoAttributeHandlerBase::NotifyDone(
AttributeHandlerContext* context) AttributeHandlerContext* context)
{ {
status_t error = context->packageContentHandler->HandlePackageAttribute( status_t error = context->packageContentHandler->HandlePackageAttribute(
fPackageInfoValue); fPackageInfoValue);
fPackageInfoValue.Clear(); fPackageInfoValue.Clear();
delete this;
return error; return error;
} }
@@ -143,7 +149,7 @@ ReaderImplBase::PackageVersionAttributeHandler::PackageVersionAttributeHandler(
BPackageInfoAttributeValue& packageInfoValue, BPackageInfoAttributeValue& packageInfoValue,
BPackageVersionData& versionData, bool notify) BPackageVersionData& versionData, bool notify)
: :
PackageInfoAttributeHandlerBase(packageInfoValue), super(packageInfoValue),
fPackageVersionData(versionData), fPackageVersionData(versionData),
fNotify(notify) fNotify(notify)
{ {
@@ -187,19 +193,14 @@ ReaderImplBase::PackageVersionAttributeHandler::HandleAttribute(
status_t status_t
ReaderImplBase::PackageVersionAttributeHandler::Delete( ReaderImplBase::PackageVersionAttributeHandler::NotifyDone(
AttributeHandlerContext* context) AttributeHandlerContext* context)
{ {
status_t error = B_OK; if (!fNotify)
if (fNotify) { return B_OK;
fPackageInfoValue.attributeID = B_PACKAGE_INFO_VERSION;
error = context->packageContentHandler->HandlePackageAttribute(
fPackageInfoValue);
fPackageInfoValue.Clear();
}
delete this; fPackageInfoValue.attributeID = B_PACKAGE_INFO_VERSION;
return error; return super::NotifyDone(context);
} }
@@ -210,7 +211,7 @@ ReaderImplBase::PackageResolvableAttributeHandler
::PackageResolvableAttributeHandler( ::PackageResolvableAttributeHandler(
BPackageInfoAttributeValue& packageInfoValue) BPackageInfoAttributeValue& packageInfoValue)
: :
PackageInfoAttributeHandlerBase(packageInfoValue) super(packageInfoValue)
{ {
} }
@@ -268,7 +269,7 @@ ReaderImplBase::PackageResolvableExpressionAttributeHandler
::PackageResolvableExpressionAttributeHandler( ::PackageResolvableExpressionAttributeHandler(
BPackageInfoAttributeValue& packageInfoValue) BPackageInfoAttributeValue& packageInfoValue)
: :
PackageInfoAttributeHandlerBase(packageInfoValue) super(packageInfoValue)
{ {
} }
@@ -328,7 +329,7 @@ ReaderImplBase::GlobalWritableFileInfoAttributeHandler
::GlobalWritableFileInfoAttributeHandler( ::GlobalWritableFileInfoAttributeHandler(
BPackageInfoAttributeValue& packageInfoValue) BPackageInfoAttributeValue& packageInfoValue)
: :
PackageInfoAttributeHandlerBase(packageInfoValue) super(packageInfoValue)
{ {
} }
@@ -378,7 +379,7 @@ ReaderImplBase::UserSettingsFileInfoAttributeHandler
::UserSettingsFileInfoAttributeHandler( ::UserSettingsFileInfoAttributeHandler(
BPackageInfoAttributeValue& packageInfoValue) BPackageInfoAttributeValue& packageInfoValue)
: :
PackageInfoAttributeHandlerBase(packageInfoValue) super(packageInfoValue)
{ {
} }
@@ -419,7 +420,7 @@ ReaderImplBase::UserSettingsFileInfoAttributeHandler::HandleAttribute(
ReaderImplBase::UserAttributeHandler::UserAttributeHandler( ReaderImplBase::UserAttributeHandler::UserAttributeHandler(
BPackageInfoAttributeValue& packageInfoValue) BPackageInfoAttributeValue& packageInfoValue)
: :
PackageInfoAttributeHandlerBase(packageInfoValue), super(packageInfoValue),
fGroups() fGroups()
{ {
} }
@@ -464,14 +465,15 @@ ReaderImplBase::UserAttributeHandler::HandleAttribute(
status_t status_t
ReaderImplBase::UserAttributeHandler::Delete(AttributeHandlerContext* context) ReaderImplBase::UserAttributeHandler::NotifyDone(
AttributeHandlerContext* context)
{ {
if (!fGroups.IsEmpty()) { if (!fGroups.IsEmpty()) {
fPackageInfoValue.user.groups = fGroups.Elements(); fPackageInfoValue.user.groups = fGroups.Elements();
fPackageInfoValue.user.groupCount = fGroups.Count(); fPackageInfoValue.user.groupCount = fGroups.Count();
} }
return PackageInfoAttributeHandlerBase::Delete(context); return super::NotifyDone(context);
} }
@@ -740,17 +742,16 @@ ReaderImplBase::LowLevelAttributeHandler::HandleAttribute(
status_t status_t
ReaderImplBase::LowLevelAttributeHandler::Delete( ReaderImplBase::LowLevelAttributeHandler::NotifyDone(
AttributeHandlerContext* context) AttributeHandlerContext* context)
{ {
status_t error = B_OK;
if (fID != B_HPKG_ATTRIBUTE_ID_ENUM_COUNT) { if (fID != B_HPKG_ATTRIBUTE_ID_ENUM_COUNT) {
error = context->lowLevelHandler->HandleAttributeDone( status_t error = context->lowLevelHandler->HandleAttributeDone(
(BHPKGAttributeID)fID, fValue, fParentToken, fToken); (BHPKGAttributeID)fID, fValue, fParentToken, fToken);
if (error != B_OK)
return error;
} }
return super::NotifyDone(context);
delete this;
return error;
} }
@@ -1082,6 +1083,9 @@ ReaderImplBase::_ParseAttributeTree(AttributeHandlerContext* context)
if (tag == 0) { if (tag == 0) {
AttributeHandler* handler = PopAttributeHandler(); AttributeHandler* handler = PopAttributeHandler();
error = handler->NotifyDone(context);
if (error != B_OK)
return error;
if (level-- == 0) if (level-- == 0)
return B_OK; return B_OK;
@@ -45,6 +45,8 @@ static const size_t kMaxPackageAttributesSize = 64 * 1024 * 1024;
class RepositoryReaderImpl::PackagesAttributeHandler class RepositoryReaderImpl::PackagesAttributeHandler
: public AttributeHandler { : public AttributeHandler {
private:
typedef AttributeHandler super;
public: public:
PackagesAttributeHandler(BRepositoryContentHandler* contentHandler) PackagesAttributeHandler(BRepositoryContentHandler* contentHandler)
: :
@@ -92,9 +94,12 @@ public:
return B_OK; return B_OK;
} }
virtual status_t Delete(AttributeHandlerContext* context) virtual status_t NotifyDone(AttributeHandlerContext* context)
{ {
return _NotifyPackageDone(); status_t result = _NotifyPackageDone();
if (result == B_OK)
result = super::NotifyDone(context);
return result;
} }
private: private: