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).
This commit is contained in:
parent
9b2a170842
commit
773005292a
@ -21,6 +21,7 @@ HAIKU_PACKAGE_FS_SOURCES =
|
||||
NameIndex.cpp
|
||||
Node.cpp
|
||||
NodeListener.cpp
|
||||
OldUnpackingNodeAttributes.cpp
|
||||
Query.cpp
|
||||
Package.cpp
|
||||
PackageDirectory.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
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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)
|
||||
{
|
||||
}
|
||||
|
@ -6,6 +6,8 @@
|
||||
#define NODE_LISTENER_H
|
||||
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#include <util/DoublyLinkedList.h>
|
||||
#include <util/OpenHashTable.h>
|
||||
|
||||
@ -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; }
|
||||
|
@ -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;
|
||||
}
|
@ -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
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
@ -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<UnpackingNode*>(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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user