[haiku-commits] Change in haiku[master]: AppKit: Include Add/Find/Get/ReplaceNodeRef in BMessage

  • From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
  • To: waddlesplash <waddlesplash@xxxxxxxxx>, haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 30 Aug 2020 01:53:20 +0000

From John Scipione <jscipione@xxxxxxxxx>:

John Scipione has uploaded this change for review. ( 
https://review.haiku-os.org/c/haiku/+/3182 ;)


Change subject: AppKit: Include Add/Find/Get/ReplaceNodeRef in BMessage
......................................................................

AppKit: Include Add/Find/Get/ReplaceNodeRef in BMessage

This allows you to pass node_ref's around like you can entry_ref's.

Added node_ref_flatten(), node_ref_unflatten() and node_ref_swap() to
MessageUtils. These are close cousins to entry_ref_flatten(),
entry_ref_unflatten(), and entry_ref_swap() but for node_ref's.

Added B_NODE_REF_TYPE to TypeConstants.h in the Support Kit.

Added B_NODE_REF_TYPE to Debugger and ByteOrder in Support Kit,
B_NODE_REF_TYPE is treated the same as a B_REF_TYPE (entry_ref).
---
M headers/os/app/Message.h
M headers/os/support/TypeConstants.h
M headers/private/app/MessageUtils.h
M src/kits/app/Message.cpp
M src/kits/app/MessageUtils.cpp
M src/kits/debugger/demangler/Demangler.cpp
M src/kits/debugger/value/value_nodes/BMessageValueNode.cpp
M src/kits/support/ByteOrder.cpp
M src/kits/tracker/infowindow/AttributesView.cpp
9 files changed, 154 insertions(+), 6 deletions(-)



  git pull ssh://git.haiku-os.org:22/haiku refs/changes/82/3182/1

diff --git a/headers/os/app/Message.h b/headers/os/app/Message.h
index ab1e909..e21fddb 100644
--- a/headers/os/app/Message.h
+++ b/headers/os/app/Message.h
@@ -13,8 +13,10 @@

 #include <BeBuild.h>
 #include <DataIO.h>
+#include <Entry.h>
 #include <Flattenable.h>
 #include <OS.h>
+#include <Node.h>
 #include <Rect.h>
 #include <Size.h>

@@ -161,6 +163,8 @@
                        status_t                        AddMessenger(const 
char* name,
                                                                        
BMessenger messenger);
                        status_t                        AddRef(const char* 
name, const entry_ref* ref);
+                       status_t                        AddNodeRef(const char* 
name,
+                                                                       const 
node_ref* ref);
                        status_t                        AddMessage(const char* 
name,
                                                                        const 
BMessage* message);
                        status_t                        AddFlat(const char* 
name, BFlattenable* object,
@@ -258,6 +262,10 @@
                        status_t                        FindRef(const char* 
name, entry_ref* ref) const;
                        status_t                        FindRef(const char* 
name, int32 index,
                                                                        
entry_ref* ref) const;
+                       status_t                        FindNodeRef(const char* 
name,
+                                                                       
node_ref* ref) const;
+                       status_t                        FindNodeRef(const char* 
name, int32 index,
+                                                                       
node_ref* ref) const;
                        status_t                        FindMessage(const char* 
name,
                                                                        
BMessage* message) const;
                        status_t                        FindMessage(const char* 
name, int32 index,
@@ -346,6 +354,10 @@
                                                                        const 
entry_ref* ref);
                        status_t                        ReplaceRef(const char* 
name, int32 index,
                                                                        const 
entry_ref* ref);
+                       status_t                        ReplaceNodeRef(const 
char* name,
+                                                                       const 
node_ref* ref);
+                       status_t                        ReplaceNodeRef(const 
char* name, int32 index,
+                                                                       const 
node_ref* ref);
                        status_t                        ReplaceMessage(const 
char* name,
                                                                        const 
BMessage* message);
                        status_t                        ReplaceMessage(const 
char* name, int32 index,
@@ -394,6 +406,7 @@
                        bool                            HasMessenger(const 
char* name,
                                                                        int32 n 
= 0) const;
                        bool                            HasRef(const char* 
name, int32 n = 0) const;
+                       bool                            HasNodeRef(const char* 
name, int32 n = 0) const;
                        bool                            HasMessage(const char* 
name, int32 n = 0) const;
                        bool                            HasFlat(const char* 
name,
                                                                        const 
BFlattenable* object) const;
diff --git a/headers/os/support/TypeConstants.h 
b/headers/os/support/TypeConstants.h
index 33f8d20..a6f8f2b 100644
--- a/headers/os/support/TypeConstants.h
+++ b/headers/os/support/TypeConstants.h
@@ -46,6 +46,7 @@
        B_RAW_TYPE                                              = 'RAWT',
        B_RECT_TYPE                                             = 'RECT',
        B_REF_TYPE                                              = 'RREF',
+       B_NODE_REF_TYPE                                 = 'NREF',
        B_RGB_32_BIT_TYPE                               = 'RGBB',
        B_RGB_COLOR_TYPE                                = 'RGBC',
        B_SIZE_TYPE                                             = 'SIZE',
diff --git a/headers/private/app/MessageUtils.h 
b/headers/private/app/MessageUtils.h
index 920f2fb..1a55604 100644
--- a/headers/private/app/MessageUtils.h
+++ b/headers/private/app/MessageUtils.h
@@ -5,15 +5,22 @@
 #include <DataIO.h>
 #include <Entry.h>
 #include <Message.h>
+#include <Node.h>
 #include <SupportDefs.h>


 namespace BPrivate {   // Only putting these here because Be did

+// entry_ref
 status_t entry_ref_flatten(char* buffer, size_t* size, const entry_ref* ref);
 status_t entry_ref_unflatten(entry_ref* ref, const char* buffer, size_t size);
 status_t entry_ref_swap(char* buffer, size_t size);

+// node_ref
+status_t node_ref_flatten(char* buffer, size_t* size, const node_ref* ref);
+status_t node_ref_unflatten(node_ref* ref, const char* buffer, size_t size);
+status_t node_ref_swap(char* buffer, size_t size);
+
 uint32 CalculateChecksum(const uint8 *buffer, int32 size);

 }      // namespace BPrivate
diff --git a/src/kits/app/Message.cpp b/src/kits/app/Message.cpp
index b4a411f..52307b7 100644
--- a/src/kits/app/Message.cpp
+++ b/src/kits/app/Message.cpp
@@ -21,13 +21,11 @@
 #include <Application.h>
 #include <AppMisc.h>
 #include <BlockCache.h>
-#include <Entry.h>
 #include <GraphicsDefs.h>
 #include <MessageQueue.h>
 #include <Messenger.h>
 #include <Path.h>
 #include <Point.h>
-#include <Rect.h>
 #include <String.h>
 #include <StringList.h>

@@ -720,6 +718,16 @@
                                        break;
                                }

+                               case B_NODE_REF_TYPE:
+                               {
+                                       node_ref ref;
+                                       BPrivate::node_ref_unflatten(&ref, 
(char*)pointer, size);
+
+                                       printf("node_ref(device=%d, node=%" 
B_PRIdINO ", ",
+                                               (int)ref.device, ref.node);
+                                       break;
+                               }
+
                                case B_MESSAGE_TYPE:
                                {
                                        char buffer[1024];
@@ -2511,6 +2519,7 @@
 DEFINE_HAS_FUNCTION(Pointer, B_POINTER_TYPE);
 DEFINE_HAS_FUNCTION(Messenger, B_MESSENGER_TYPE);
 DEFINE_HAS_FUNCTION(Ref, B_REF_TYPE);
+DEFINE_HAS_FUNCTION(NodeRef, B_NODE_REF_TYPE);
 DEFINE_HAS_FUNCTION(Message, B_MESSAGE_TYPE);

 #undef DEFINE_HAS_FUNCTION
@@ -2711,6 +2720,21 @@


 status_t
+BMessage::AddNodeRef(const char* name, const node_ref* ref)
+{
+       size_t size = sizeof(node_ref);
+       char buffer[size];
+
+       status_t error = BPrivate::node_ref_flatten(buffer, &size, ref);
+
+       if (error >= B_OK)
+               error = AddData(name, B_NODE_REF_TYPE, buffer, size, false);
+
+       return error;
+}
+
+
+status_t
 BMessage::AddMessage(const char* name, const BMessage* message)
 {
        if (message == NULL)
@@ -2990,6 +3014,33 @@


 status_t
+BMessage::FindNodeRef(const char* name, node_ref* ref) const
+{
+       return FindNodeRef(name, 0, ref);
+}
+
+
+status_t
+BMessage::FindNodeRef(const char* name, int32 index, node_ref* ref) const
+{
+       if (ref == NULL)
+               return B_BAD_VALUE;
+
+       void* data = NULL;
+       ssize_t size = 0;
+       status_t error = FindData(name, B_NODE_REF_TYPE, index,
+               (const void**)&data, &size);
+
+       if (error == B_OK)
+               error = BPrivate::node_ref_unflatten(ref, (char*)data, size);
+       else
+               *ref = node_ref();
+
+       return error;
+}
+
+
+status_t
 BMessage::FindMessage(const char* name, BMessage* message) const
 {
        return FindMessage(name, 0, message);
@@ -3155,6 +3206,28 @@

 
 status_t
+BMessage::ReplaceNodeRef(const char* name, const node_ref* ref)
+{
+       return ReplaceNodeRef(name, 0, ref);
+}
+
+
+status_t
+BMessage::ReplaceNodeRef(const char* name, int32 index, const node_ref* ref)
+{
+       size_t size = sizeof(node_ref) + B_PATH_NAME_LENGTH;
+       char buffer[size];
+
+       status_t error = BPrivate::node_ref_flatten(buffer, &size, ref);
+
+       if (error >= B_OK)
+               error = ReplaceData(name, B_NODE_REF_TYPE, index, buffer, size);
+
+       return error;
+}
+
+
+status_t
 BMessage::ReplaceMessage(const char* name, const BMessage* message)
 {
        return ReplaceMessage(name, 0, message);
diff --git a/src/kits/app/MessageUtils.cpp b/src/kits/app/MessageUtils.cpp
index 47b6125..b551e33 100644
--- a/src/kits/app/MessageUtils.cpp
+++ b/src/kits/app/MessageUtils.cpp
@@ -46,7 +46,7 @@
        memcpy((void *)buffer, (const void *)&ref->device, sizeof(ref->device));
        buffer += sizeof(ref->device);
        memcpy((void *)buffer, (const void *)&ref->directory, 
sizeof(ref->directory));
-       buffer += sizeof (ref->directory);
+       buffer += sizeof(ref->directory);
        *size -= sizeof(ref->device) + sizeof(ref->directory);

        size_t nameLength = 0;
@@ -59,6 +59,7 @@
        }

        *size = sizeof(ref->device) + sizeof(ref->directory) + nameLength;
+
        return B_OK;
 }

@@ -72,8 +73,9 @@
        }

        memcpy((void  *)&ref->device, (const void *)buffer, 
sizeof(ref->device));
-       buffer += sizeof (ref->device);
-       memcpy((void *)&ref->directory, (const void *)buffer, 
sizeof(ref->directory));
+       buffer += sizeof(ref->device);
+       memcpy((void *)&ref->directory, (const void *)buffer,
+               sizeof(ref->directory));
        buffer += sizeof(ref->directory);

        if (ref->device != ~(dev_t)0 && size > sizeof(ref->device)
@@ -106,4 +108,45 @@
        return B_OK;
 }

+
+/* node_ref support functions */
+status_t
+node_ref_flatten(char *buffer, size_t *size, const node_ref *ref)
+{
+       if (*size < sizeof(dev_t) + sizeof(ino_t))
+               return B_BUFFER_OVERFLOW;
+
+       memcpy((void *)buffer, (const void *)&ref->device, sizeof(ref->device));
+       buffer += sizeof(ref->device);
+       memcpy((void *)buffer, (const void *)&ref->node, sizeof(ref->node));
+       buffer += sizeof(ref->node);
+
+       return B_OK;
+}
+
+
+status_t
+node_ref_unflatten(node_ref *ref, const char *buffer, size_t size)
+{
+       if (size < sizeof(dev_t) + sizeof(ino_t)) {
+               *ref = node_ref();
+               return B_BAD_VALUE;
+       }
+
+       memcpy((void  *)&ref->device, (const void *)buffer, sizeof(dev_t));
+       buffer += sizeof(dev_t);
+       memcpy((void *)&ref->node, (const void *)buffer, sizeof(ino_t));
+       buffer += sizeof(ino_t);
+
+       return B_OK;
+}
+
+
+status_t
+node_ref_swap(char *buffer, size_t size)
+{
+       // does the same thing as entry_ref_swap
+       return entry_ref_swap(buffer, size);
+}
+
 } // namespace BPrivate
diff --git a/src/kits/debugger/demangler/Demangler.cpp 
b/src/kits/debugger/demangler/Demangler.cpp
index 5ed8950..7018b54 100644
--- a/src/kits/debugger/demangler/Demangler.cpp
+++ b/src/kits/debugger/demangler/Demangler.cpp
@@ -94,6 +94,7 @@
                                demangledName << "void*";
                                break;
                        case B_REF_TYPE:
+                       case B_NODE_REF_TYPE:
                                // TODO: use length as hint on reference type
                                demangledName << "&";
                                break;
diff --git a/src/kits/debugger/value/value_nodes/BMessageValueNode.cpp 
b/src/kits/debugger/value/value_nodes/BMessageValueNode.cpp
index 0129c26..989a083 100644
--- a/src/kits/debugger/value/value_nodes/BMessageValueNode.cpp
+++ b/src/kits/debugger/value/value_nodes/BMessageValueNode.cpp
@@ -478,6 +478,11 @@
                        constraints.SetTypeKind(TYPE_COMPOUND);
                        break;

+               case B_NODE_REF_TYPE:
+                       typeName = "node_ref";
+                       constraints.SetTypeKind(TYPE_COMPOUND);
+                       break;
+
                case B_RGB_COLOR_TYPE:
                        typeName = "rgb_color";
                        constraints.SetTypeKind(TYPE_COMPOUND);
diff --git a/src/kits/support/ByteOrder.cpp b/src/kits/support/ByteOrder.cpp
index c009a5f..000a5d9 100644
--- a/src/kits/support/ByteOrder.cpp
+++ b/src/kits/support/ByteOrder.cpp
@@ -143,6 +143,7 @@
                case B_POINT_TYPE:
                case B_RECT_TYPE:
                case B_REF_TYPE:
+               case B_NODE_REF_TYPE:
                case B_RGB_32_BIT_TYPE:
                case B_RGB_COLOR_TYPE:
                case B_SIZE_T_TYPE:
diff --git a/src/kits/tracker/infowindow/AttributesView.cpp 
b/src/kits/tracker/infowindow/AttributesView.cpp
index d19e8d9..31774f4 100644
--- a/src/kits/tracker/infowindow/AttributesView.cpp
+++ b/src/kits/tracker/infowindow/AttributesView.cpp
@@ -394,7 +394,11 @@
                                        kTypeColumn);
                                break;
                        case B_REF_TYPE:
-                               row->SetField(new 
BStringField(B_TRANSLATE("Reference")),
+                               row->SetField(new 
BStringField(B_TRANSLATE("Entry ref")),
+                                       kTypeColumn);
+                               break;
+                       case B_NODE_REF_TYPE:
+                               row->SetField(new 
BStringField(B_TRANSLATE("Node ref")),
                                        kTypeColumn);
                                break;
                        case B_RGB_32_BIT_TYPE:

--
To view, visit https://review.haiku-os.org/c/haiku/+/3182
To unsubscribe, or for help writing mail filters, visit 
https://review.haiku-os.org/settings

Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: I32c6ed276bf1a7894a835b9fc9de5a882c35883c
Gerrit-Change-Number: 3182
Gerrit-PatchSet: 1
Gerrit-Owner: John Scipione <jscipione@xxxxxxxxx>
Gerrit-MessageType: newchange

Other related posts:

  • » [haiku-commits] Change in haiku[master]: AppKit: Include Add/Find/Get/ReplaceNodeRef in BMessage - Gerrit