From 182e58f709cc0d9e0ae0f905874c13dfe38ce516 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Thu, 7 Jul 2011 08:38:02 +0200 Subject: [PATCH] NodeListener::NodeChanged(): Provide old value * Add interface OldNodeAttributes an instance of which is passed to NodeListener::NodeChanged() to provide the old attribute values (currently only modification time and file size). * Also extend PackageLinksListener::PackageLinkNodeChanged() with a OldNodeAttributes parameter. * Add OldNodeAttributes implementations for PackageLinkSymlink (inner class OldAttributes) and UnpackingNode (OldUnpackageNodeAttributes). --- .../kernel/file_systems/packagefs/Jamfile | 1 + .../file_systems/packagefs/NameIndex.cpp | 3 +- .../kernel/file_systems/packagefs/NameIndex.h | 3 +- .../file_systems/packagefs/NodeListener.cpp | 14 +++++++- .../file_systems/packagefs/NodeListener.h | 14 +++++++- .../packagefs/OldUnpackingNodeAttributes.cpp | 35 +++++++++++++++++++ .../packagefs/OldUnpackingNodeAttributes.h | 28 +++++++++++++++ .../packagefs/PackageLinkSymlink.cpp | 34 ++++++++++++++++-- .../packagefs/PackageLinkSymlink.h | 3 ++ .../packagefs/PackageLinksListener.h | 4 ++- .../kernel/file_systems/packagefs/Volume.cpp | 27 +++++++++----- .../kernel/file_systems/packagefs/Volume.h | 6 ++-- 12 files changed, 154 insertions(+), 18 deletions(-) create mode 100644 src/add-ons/kernel/file_systems/packagefs/OldUnpackingNodeAttributes.cpp create mode 100644 src/add-ons/kernel/file_systems/packagefs/OldUnpackingNodeAttributes.h diff --git a/src/add-ons/kernel/file_systems/packagefs/Jamfile b/src/add-ons/kernel/file_systems/packagefs/Jamfile index 5c7584a97e..f07377cf06 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Jamfile +++ b/src/add-ons/kernel/file_systems/packagefs/Jamfile @@ -21,6 +21,7 @@ HAIKU_PACKAGE_FS_SOURCES = NameIndex.cpp Node.cpp NodeListener.cpp + OldUnpackingNodeAttributes.cpp Query.cpp Package.cpp PackageDirectory.cpp diff --git a/src/add-ons/kernel/file_systems/packagefs/NameIndex.cpp b/src/add-ons/kernel/file_systems/packagefs/NameIndex.cpp index c142215c2c..601f965c3e 100644 --- a/src/add-ons/kernel/file_systems/packagefs/NameIndex.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/NameIndex.cpp @@ -186,7 +186,8 @@ NameIndex::NodeRemoved(Node* node) void -NameIndex::NodeChanged(Node* node, uint32 statFields) +NameIndex::NodeChanged(Node* node, uint32 statFields, + const OldNodeAttributes& oldAttributes) { // nothing to do -- the name remains the same } diff --git a/src/add-ons/kernel/file_systems/packagefs/NameIndex.h b/src/add-ons/kernel/file_systems/packagefs/NameIndex.h index 3fceabedfb..7e8ed7bfc6 100644 --- a/src/add-ons/kernel/file_systems/packagefs/NameIndex.h +++ b/src/add-ons/kernel/file_systems/packagefs/NameIndex.h @@ -25,7 +25,8 @@ public: private: virtual void NodeAdded(Node* node); virtual void NodeRemoved(Node* node); - virtual void NodeChanged(Node* node, uint32 statFields); + virtual void NodeChanged(Node* node, uint32 statFields, + const OldNodeAttributes& oldAttributes); protected: virtual AbstractIndexIterator* InternalGetIterator(); diff --git a/src/add-ons/kernel/file_systems/packagefs/NodeListener.cpp b/src/add-ons/kernel/file_systems/packagefs/NodeListener.cpp index bd5b826a16..ae77b4c1dc 100644 --- a/src/add-ons/kernel/file_systems/packagefs/NodeListener.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/NodeListener.cpp @@ -7,6 +7,17 @@ #include "NodeListener.h" +// #pragma mark - OldNodeAttributes + + +OldNodeAttributes::~OldNodeAttributes() +{ +} + + +// #pragma mark - NodeListener + + NodeListener::NodeListener() : fPrevious(this), @@ -34,6 +45,7 @@ NodeListener::NodeRemoved(Node* node) void -NodeListener::NodeChanged(Node* node, uint32 statFields) +NodeListener::NodeChanged(Node* node, uint32 statFields, + const OldNodeAttributes& oldAttributes) { } diff --git a/src/add-ons/kernel/file_systems/packagefs/NodeListener.h b/src/add-ons/kernel/file_systems/packagefs/NodeListener.h index 5c21c95d12..35ab10e19a 100644 --- a/src/add-ons/kernel/file_systems/packagefs/NodeListener.h +++ b/src/add-ons/kernel/file_systems/packagefs/NodeListener.h @@ -6,6 +6,8 @@ #define NODE_LISTENER_H +#include + #include #include @@ -16,6 +18,15 @@ class Node; #define NOT_LISTENING_NODE ((Node*)~(addr_t)0) +class OldNodeAttributes { +public: + virtual ~OldNodeAttributes(); + + virtual timespec ModifiedTime() const = 0; + virtual off_t FileSize() const = 0; +}; + + class NodeListener { public: NodeListener(); @@ -23,7 +34,8 @@ public: virtual void NodeAdded(Node* node); virtual void NodeRemoved(Node* node); - virtual void NodeChanged(Node* node, uint32 statFields); + virtual void NodeChanged(Node* node, uint32 statFields, + const OldNodeAttributes& oldAttributes); void StartedListening(Node* node) { fNode = node; } diff --git a/src/add-ons/kernel/file_systems/packagefs/OldUnpackingNodeAttributes.cpp b/src/add-ons/kernel/file_systems/packagefs/OldUnpackingNodeAttributes.cpp new file mode 100644 index 0000000000..f4508edb41 --- /dev/null +++ b/src/add-ons/kernel/file_systems/packagefs/OldUnpackingNodeAttributes.cpp @@ -0,0 +1,35 @@ +/* + * Copyright 2011, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ + + +#include "OldUnpackingNodeAttributes.h" + +#include "PackageNode.h" + + +OldUnpackingNodeAttributes::OldUnpackingNodeAttributes( + PackageNode* packageNode) + : + fPackageNode(packageNode) +{ +} + + +timespec +OldUnpackingNodeAttributes::ModifiedTime() const +{ + if (fPackageNode != NULL) + return fPackageNode->ModifiedTime(); + + timespec time = { 0, 0 }; + return time; +} + + +off_t +OldUnpackingNodeAttributes::FileSize() const +{ + return fPackageNode != NULL ? fPackageNode->FileSize() : 0; +} diff --git a/src/add-ons/kernel/file_systems/packagefs/OldUnpackingNodeAttributes.h b/src/add-ons/kernel/file_systems/packagefs/OldUnpackingNodeAttributes.h new file mode 100644 index 0000000000..867ab0741f --- /dev/null +++ b/src/add-ons/kernel/file_systems/packagefs/OldUnpackingNodeAttributes.h @@ -0,0 +1,28 @@ +/* + * Copyright 2011, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ +#ifndef OLD_UNPACKING_NODE_ATTRIBUTES_H +#define OLD_UNPACKING_NODE_ATTRIBUTES_H + + +#include "NodeListener.h" + + +class PackageNode; + + +class OldUnpackingNodeAttributes : public OldNodeAttributes { +public: + OldUnpackingNodeAttributes( + PackageNode* packageNode); + + virtual timespec ModifiedTime() const; + virtual off_t FileSize() const; + +private: + PackageNode* fPackageNode; +}; + + +#endif // OLD_UNPACKING_NODE_ATTRIBUTES_H diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageLinkSymlink.cpp b/src/add-ons/kernel/file_systems/packagefs/PackageLinkSymlink.cpp index 1d0e7a31e9..562200e123 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageLinkSymlink.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/PackageLinkSymlink.cpp @@ -12,6 +12,7 @@ #include "EmptyAttributeDirectoryCookie.h" #include "DebugSupport.h" +#include "NodeListener.h" #include "PackageLinksListener.h" #include "Utils.h" #include "Volume.h" @@ -41,7 +42,34 @@ link_path_for_mount_type(MountType type) } -// #pragma mark - +// #pragma mark - OldAttributes + + +struct PackageLinkSymlink::OldAttributes : OldNodeAttributes { + OldAttributes(const timespec& modifiedTime, off_t fileSize) + : + fModifiedTime(modifiedTime), + fFileSize(fileSize) + { + } + + virtual timespec ModifiedTime() const + { + return fModifiedTime; + } + + virtual off_t FileSize() const + { + return fFileSize; + } + +private: + timespec fModifiedTime; + off_t fFileSize; +}; + + +// #pragma mark - PackageLinkSymlink PackageLinkSymlink::PackageLinkSymlink(Package* package) @@ -61,6 +89,8 @@ PackageLinkSymlink::~PackageLinkSymlink() void PackageLinkSymlink::Update(Package* package, PackageLinksListener* listener) { + OldAttributes oldAttributes(fModifiedTime, FileSize()); + if (package != NULL) { fLinkPath = link_path_for_mount_type( package->Domain()->Volume()->MountType()); @@ -71,7 +101,7 @@ PackageLinkSymlink::Update(Package* package, PackageLinksListener* listener) if (listener != NULL) { listener->PackageLinkNodeChanged(this, - B_STAT_SIZE | B_STAT_MODIFICATION_TIME); + B_STAT_SIZE | B_STAT_MODIFICATION_TIME, oldAttributes); } } diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageLinkSymlink.h b/src/add-ons/kernel/file_systems/packagefs/PackageLinkSymlink.h index 91e687e71c..cfa64a8c4d 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageLinkSymlink.h +++ b/src/add-ons/kernel/file_systems/packagefs/PackageLinkSymlink.h @@ -38,6 +38,9 @@ public: virtual status_t OpenAttribute(const char* name, int openMode, AttributeCookie*& _cookie); +private: + struct OldAttributes; + private: timespec fModifiedTime; const char* fLinkPath; diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageLinksListener.h b/src/add-ons/kernel/file_systems/packagefs/PackageLinksListener.h index 4d3e7644ed..21f10b6073 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageLinksListener.h +++ b/src/add-ons/kernel/file_systems/packagefs/PackageLinksListener.h @@ -10,6 +10,7 @@ class Node; +class OldNodeAttributes; class PackageLinksListener { @@ -19,7 +20,8 @@ public: virtual void PackageLinkNodeAdded(Node* node) = 0; virtual void PackageLinkNodeRemoved(Node* node) = 0; virtual void PackageLinkNodeChanged(Node* node, - uint32 statFields) = 0; + uint32 statFields, + const OldNodeAttributes& oldAttributes) = 0; }; diff --git a/src/add-ons/kernel/file_systems/packagefs/Volume.cpp b/src/add-ons/kernel/file_systems/packagefs/Volume.cpp index 166ef61618..96966895c4 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Volume.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/Volume.cpp @@ -33,6 +33,7 @@ #include "DebugSupport.h" #include "kernel_interface.h" #include "NameIndex.h" +#include "OldUnpackingNodeAttributes.h" #include "PackageDirectory.h" #include "PackageFile.h" #include "PackageFSRoot.h" @@ -775,10 +776,11 @@ Volume::PackageLinkNodeRemoved(Node* node) void -Volume::PackageLinkNodeChanged(Node* node, uint32 statFields) +Volume::PackageLinkNodeChanged(Node* node, uint32 statFields, + const OldNodeAttributes& oldAttributes) { notify_stat_changed(ID(), node->ID(), statFields); - _NotifyNodeChanged(node, statFields); + _NotifyNodeChanged(node, statFields, oldAttributes); } @@ -1137,6 +1139,7 @@ Volume::_AddPackageNode(Directory* directory, PackageNode* packageNode, bool newNode = false; UnpackingNode* unpackingNode; Node* node = directory->FindChild(packageNode->Name()); + PackageNode* oldPackageNode = NULL; if (node != NULL) { unpackingNode = dynamic_cast(node); @@ -1149,6 +1152,7 @@ Volume::_AddPackageNode(Directory* directory, PackageNode* packageNode, RETURN_ERROR(error); node = unpackingNode->GetNode(); + oldPackageNode = unpackingNode->GetPackageNode(); newNode = true; } @@ -1170,10 +1174,12 @@ Volume::_AddPackageNode(Directory* directory, PackageNode* packageNode, RETURN_ERROR(error); } - if (newNode) + if (newNode) { _NotifyNodeAdded(node); - else - _NotifyNodeChanged(node, kAllStatFields); + } else if (packageNode == unpackingNode->GetPackageNode()) { + _NotifyNodeChanged(node, kAllStatFields, + OldUnpackingNodeAttributes(oldPackageNode)); + } if (notify) { if (newNode) { @@ -1238,8 +1244,10 @@ Volume::_RemovePackageNode(Directory* directory, PackageNode* packageNode, if (nodeRemoved) _NotifyNodeRemoved(node); - else - _NotifyNodeChanged(node, kAllStatFields); + else if (packageNode == headPackageNode) { + _NotifyNodeChanged(node, kAllStatFields, + OldUnpackingNodeAttributes(headPackageNode)); + } if (!notify) return; @@ -1716,7 +1724,8 @@ Volume::_NotifyNodeRemoved(Node* node) void -Volume::_NotifyNodeChanged(Node* node, uint32 statFields) +Volume::_NotifyNodeChanged(Node* node, uint32 statFields, + const OldNodeAttributes& oldAttributes) { Node* key = node; @@ -1727,7 +1736,7 @@ Volume::_NotifyNodeChanged(Node* node, uint32 statFields) while (true) { NodeListener* next = listener->NextNodeListener(); - listener->NodeChanged(node, statFields); + listener->NodeChanged(node, statFields, oldAttributes); if (listener == last) break; diff --git a/src/add-ons/kernel/file_systems/packagefs/Volume.h b/src/add-ons/kernel/file_systems/packagefs/Volume.h index 8986913791..532e4b9faa 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Volume.h +++ b/src/add-ons/kernel/file_systems/packagefs/Volume.h @@ -97,7 +97,8 @@ private: virtual void PackageLinkNodeAdded(Node* node); virtual void PackageLinkNodeRemoved(Node* node); virtual void PackageLinkNodeChanged(Node* node, - uint32 statFields); + uint32 statFields, + const OldNodeAttributes& oldAttributes); private: struct Job; @@ -183,7 +184,8 @@ private: void _NotifyNodeAdded(Node* node); void _NotifyNodeRemoved(Node* node); void _NotifyNodeChanged(Node* node, - uint32 statFields); + uint32 statFields, + const OldNodeAttributes& oldAttributes); private: mutable rw_lock fLock;