* Got rid of BMessageFieldNode{Child} in favor of presenting the fields directly

at the top level of the message.
* Fixed issues with incorrectly resolving the what value.
* Reordered some functions to match header decl order.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42331 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Rene Gollent
2011-06-28 00:08:15 +00:00
parent 3fb17998a7
commit 1e1e05fdba
2 changed files with 253 additions and 382 deletions
@@ -20,322 +20,69 @@
#include "ValueNodeContainer.h" #include "ValueNodeContainer.h"
// #pragma mark - BMessageValueNode::BMessageFieldHeaderNode // #pragma mark - BMessageWhatNodeChild
BMessageValueNode::BMessageFieldHeaderNode::BMessageFieldHeaderNode(
BMessageFieldHeaderNodeChild *child, BMessageValueNode* parent,
const BString &name, type_code type, int32 count)
:
ValueNode(child),
fName(name),
fType(parent->GetType()),
fParent(parent),
fFieldType(type),
fFieldCount(count)
{
fParent->AcquireReference();
fType->AcquireReference();
}
BMessageValueNode::BMessageFieldHeaderNode::~BMessageFieldHeaderNode() class BMessageWhatNodeChild : public ValueNodeChild {
{ public:
fParent->ReleaseReference(); BMessageWhatNodeChild(BMessageValueNode* parent, DataMember* member,
fType->ReleaseReference(); Type* type)
}
Type*
BMessageValueNode::BMessageFieldHeaderNode::GetType() const
{
return fType;
}
status_t
BMessageValueNode::BMessageFieldHeaderNode::CreateChildren()
{
return B_OK;
}
int32
BMessageValueNode::BMessageFieldHeaderNode::CountChildren() const
{
return 0;
}
ValueNodeChild*
BMessageValueNode::BMessageFieldHeaderNode::ChildAt(int32 index) const
{
return NULL;
}
status_t
BMessageValueNode::BMessageFieldHeaderNode::ResolvedLocationAndValue(
ValueLoader* loader, ValueLocation *& _location, Value*& _value)
{
_location = fParent->Location();
_value = NULL;
return B_OK;
}
// #pragma mark - BMessageValueNode::BMessageFieldHeaderNodeChild
BMessageValueNode::BMessageFieldHeaderNodeChild::BMessageFieldHeaderNodeChild(
BMessageFieldNode* parent, BMessageValueNode* messageNode,
const BString &name, type_code type, int32 count)
: :
ValueNodeChild(), ValueNodeChild(),
fName(name), fMember(member),
fType(parent->GetType()), fName("what"),
fMessageNode(messageNode),
fParent(parent), fParent(parent),
fFieldType(type), fType(type)
fFieldCount(count)
{ {
fMessageNode->AcquireReference();
fParent->AcquireReference(); fParent->AcquireReference();
fType->AcquireReference(); fType->AcquireReference();
} }
virtual ~BMessageWhatNodeChild()
BMessageValueNode::BMessageFieldHeaderNodeChild::~BMessageFieldHeaderNodeChild()
{ {
fMessageNode->ReleaseReference();
fParent->ReleaseReference(); fParent->ReleaseReference();
fType->ReleaseReference(); fType->ReleaseReference();
} }
virtual const BString& Name() const
const BString&
BMessageValueNode::BMessageFieldHeaderNodeChild::Name() const
{ {
return fName; return fName;
} }
virtual Type* GetType() const
Type*
BMessageValueNode::BMessageFieldHeaderNodeChild::GetType() const
{ {
return fType; return fType;
} }
virtual ValueNode* Parent() const
ValueNode*
BMessageValueNode::BMessageFieldHeaderNodeChild::Parent() const
{ {
return fParent; return fParent;
} }
virtual status_t ResolveLocation(ValueLoader* valueLoader,
bool ValueLocation*& _location)
BMessageValueNode::BMessageFieldHeaderNodeChild::IsInternal() const
{ {
return true; ValueLocation* parentLocation = fParent->Location();
} ValueLocation* location;
CompoundType* type = dynamic_cast<CompoundType*>(fParent->GetType());
if (type == NULL)
return B_BAD_VALUE;
status_t error = type->ResolveDataMemberLocation(fMember,
*parentLocation, location);
if (error != B_OK)
return error;
status_t _location = location;
BMessageValueNode::BMessageFieldHeaderNodeChild::CreateInternalNode(
ValueNode*& _node)
{
BMessageFieldHeaderNode* node = new(std::nothrow)
BMessageFieldHeaderNode(this, fMessageNode, fName, fFieldType,
fFieldCount);
if (node == NULL)
return B_NO_MEMORY;
_node = node;
return B_OK; return B_OK;
} }
status_t private:
BMessageValueNode::BMessageFieldHeaderNodeChild::ResolveLocation( DataMember* fMember;
ValueLoader* valueLoader, ValueLocation*& _location) BString fName;
{ BMessageValueNode* fParent;
_location = fParent->Location(); Type* fType;
};
return B_OK;
}
status_t
BMessageValueNode::BMessageFieldHeaderNodeChild::CreateChildren()
{
return B_OK;
}
int32
BMessageValueNode::BMessageFieldHeaderNodeChild::CountChildren() const
{
return 0;
}
ValueNodeChild*
BMessageValueNode::BMessageFieldHeaderNodeChild::ChildAt(int32 index) const
{
return NULL;
}
// #pragma mark - BMessageValueNode::BMessageFieldNode
BMessageValueNode::BMessageFieldNode::BMessageFieldNode(
BMessageFieldNodeChild *child, BMessageValueNode* parent)
:
ValueNode(child),
fType(parent->GetType()),
fParent(parent)
{
fParent->AcquireReference();
fType->AcquireReference();
}
BMessageValueNode::BMessageFieldNode::~BMessageFieldNode()
{
fParent->ReleaseReference();
fType->ReleaseReference();
}
Type*
BMessageValueNode::BMessageFieldNode::GetType() const
{
return fType;
}
status_t
BMessageValueNode::BMessageFieldNode::CreateChildren()
{
if (!fChildren.IsEmpty())
return B_OK;
char* name;
type_code type;
int32 count;
for (int32 i = 0;
fParent->fMessage.GetInfo(B_ANY_TYPE, i, &name, &type,
&count) == B_OK; i++) {
BMessageFieldHeaderNodeChild* node = new(std::nothrow)
BMessageFieldHeaderNodeChild(this, fParent, name, type, count);
if (node == NULL)
return B_NO_MEMORY;
node->SetContainer(fContainer);
fChildren.AddItem(node);
}
if (fContainer != NULL)
fContainer->NotifyValueNodeChildrenCreated(this);
return B_OK;
}
int32
BMessageValueNode::BMessageFieldNode::CountChildren() const
{
return fChildren.CountItems();
}
ValueNodeChild*
BMessageValueNode::BMessageFieldNode::ChildAt(int32 index) const
{
return fChildren.ItemAt(index);
}
status_t
BMessageValueNode::BMessageFieldNode::ResolvedLocationAndValue(
ValueLoader* loader, ValueLocation*& _location, Value*& _value)
{
_location = fParent->Location();
_value = NULL;
return B_OK;
}
// #pragma mark - BMessageValueNode::BMessageFieldNodeChild
BMessageValueNode::BMessageFieldNodeChild::BMessageFieldNodeChild(
BMessageValueNode* parent)
:
ValueNodeChild(),
fType(parent->GetType()),
fParent(parent),
fName("Fields")
{
fParent->AcquireReference();
fType->AcquireReference();
}
BMessageValueNode::BMessageFieldNodeChild::~BMessageFieldNodeChild()
{
fParent->ReleaseReference();
fType->ReleaseReference();
}
const BString&
BMessageValueNode::BMessageFieldNodeChild::Name() const
{
return fName;
}
Type*
BMessageValueNode::BMessageFieldNodeChild::GetType() const
{
return fType;
}
ValueNode*
BMessageValueNode::BMessageFieldNodeChild::Parent() const
{
return fParent;
}
bool
BMessageValueNode::BMessageFieldNodeChild::IsInternal() const
{
return true;
}
status_t
BMessageValueNode::BMessageFieldNodeChild::CreateInternalNode(
ValueNode*& _node)
{
ValueNode* node = new(std::nothrow) BMessageFieldNode(this, fParent);
if (node == NULL)
return B_NO_MEMORY;
_node = node;
return B_OK;
}
status_t
BMessageValueNode::BMessageFieldNodeChild::ResolveLocation(
ValueLoader* valueLoader, ValueLocation*& _location)
{
_location = fParent->Location();
return B_OK;
}
// #pragma mark - BMessageValueNode // #pragma mark - BMessageValueNode
@@ -346,8 +93,8 @@ BMessageValueNode::BMessageValueNode(ValueNodeChild* nodeChild,
: :
ValueNode(nodeChild), ValueNode(nodeChild),
fType(type), fType(type),
fMessage(), fValid(false),
fFields(NULL) fMessage()
{ {
fType->AcquireReference(); fType->AcquireReference();
} }
@@ -356,6 +103,8 @@ BMessageValueNode::BMessageValueNode(ValueNodeChild* nodeChild,
BMessageValueNode::~BMessageValueNode() BMessageValueNode::~BMessageValueNode()
{ {
fType->ReleaseReference(); fType->ReleaseReference();
for (int32 i = 0; i < fChildren.CountItems(); i++)
fChildren.ItemAt(i)->ReleaseReference();
} }
@@ -542,6 +291,9 @@ BMessageValueNode::ResolvedLocationAndValue(ValueLoader* valueLoader,
if (error != B_OK) if (error != B_OK)
return error; return error;
fValid = true;
CreateChildren();
return B_OK; return B_OK;
} }
@@ -549,12 +301,53 @@ BMessageValueNode::ResolvedLocationAndValue(ValueLoader* valueLoader,
status_t status_t
BMessageValueNode::CreateChildren() BMessageValueNode::CreateChildren()
{ {
if (fFields == NULL) { // delay child creation until our location / value has been resolved
fFields = new(std::nothrow) BMessageFieldNodeChild(this); // since we otherwise have no idea as to what value nodes to present
if (fFields == NULL) if (!fValid)
return B_BAD_VALUE;
if (!fChildren.IsEmpty())
return B_OK;
Type* whatType = NULL;
CompoundType* baseType = dynamic_cast<CompoundType*>(
fType->ResolveRawType(false));
if (baseType == NULL)
return B_OK;
DataMember* member;
for (int32 i = 0; i < baseType->CountDataMembers(); i++) {
member = baseType->DataMemberAt(i);
if (strcmp(member->Name(), "what") == 0) {
whatType = member->GetType();
break;
}
}
ValueNodeChild* whatNode =
new(std::nothrow) BMessageWhatNodeChild(this, member, whatType);
if (whatNode == NULL)
return B_NO_MEMORY; return B_NO_MEMORY;
fFields->SetContainer(fContainer); whatNode->SetContainer(fContainer);
fChildren.AddItem(whatNode);
char* name;
type_code type;
int32 count;
for (int32 i = 0;
fMessage.GetInfo(B_ANY_TYPE, i, &name, &type,
&count) == B_OK; i++) {
// TODO: split FieldHeaderNode into two variants in order to
// present fields with a count of 1 without subindices.
BMessageFieldHeaderNodeChild* node = new(std::nothrow)
BMessageFieldHeaderNodeChild(this, name, type, count);
if (node == NULL)
return B_NO_MEMORY;
node->SetContainer(fContainer);
fChildren.AddItem(node);
} }
if (fContainer != NULL) if (fContainer != NULL)
@@ -567,17 +360,154 @@ BMessageValueNode::CreateChildren()
int32 int32
BMessageValueNode::CountChildren() const BMessageValueNode::CountChildren() const
{ {
if (fFields != NULL) return fChildren.CountItems();
return 1;
return 0;
} }
ValueNodeChild* ValueNodeChild*
BMessageValueNode::ChildAt(int32 index) const BMessageValueNode::ChildAt(int32 index) const
{ {
if (index == 0) return fChildren.ItemAt(index);
return fFields; }
// #pragma mark - BMessageValueNode::BMessageFieldHeaderNode
BMessageValueNode::BMessageFieldHeaderNode::BMessageFieldHeaderNode(
BMessageFieldHeaderNodeChild *child, BMessageValueNode* parent,
const BString &name, type_code type, int32 count)
:
ValueNode(child),
fName(name),
fType(parent->GetType()),
fParent(parent),
fFieldType(type),
fFieldCount(count)
{
fParent->AcquireReference();
fType->AcquireReference();
}
BMessageValueNode::BMessageFieldHeaderNode::~BMessageFieldHeaderNode()
{
fParent->ReleaseReference();
fType->ReleaseReference();
}
Type*
BMessageValueNode::BMessageFieldHeaderNode::GetType() const
{
return fType;
}
status_t
BMessageValueNode::BMessageFieldHeaderNode::CreateChildren()
{
return B_OK;
}
int32
BMessageValueNode::BMessageFieldHeaderNode::CountChildren() const
{
return 0;
}
ValueNodeChild*
BMessageValueNode::BMessageFieldHeaderNode::ChildAt(int32 index) const
{
return NULL; return NULL;
} }
status_t
BMessageValueNode::BMessageFieldHeaderNode::ResolvedLocationAndValue(
ValueLoader* loader, ValueLocation *& _location, Value*& _value)
{
_location = fParent->Location();
_value = NULL;
return B_OK;
}
// #pragma mark - BMessageValueNode::BMessageFieldHeaderNodeChild
BMessageValueNode::BMessageFieldHeaderNodeChild::BMessageFieldHeaderNodeChild(
BMessageValueNode* parent, const BString &name, type_code type,
int32 count)
:
ValueNodeChild(),
fName(name),
fType(parent->GetType()),
fParent(parent),
fFieldType(type),
fFieldCount(count)
{
fParent->AcquireReference();
fType->AcquireReference();
}
BMessageValueNode::BMessageFieldHeaderNodeChild::~BMessageFieldHeaderNodeChild()
{
fParent->ReleaseReference();
fType->ReleaseReference();
}
const BString&
BMessageValueNode::BMessageFieldHeaderNodeChild::Name() const
{
return fName;
}
Type*
BMessageValueNode::BMessageFieldHeaderNodeChild::GetType() const
{
return fType;
}
ValueNode*
BMessageValueNode::BMessageFieldHeaderNodeChild::Parent() const
{
return fParent;
}
bool
BMessageValueNode::BMessageFieldHeaderNodeChild::IsInternal() const
{
return true;
}
status_t
BMessageValueNode::BMessageFieldHeaderNodeChild::CreateInternalNode(
ValueNode*& _node)
{
BMessageFieldHeaderNode* node = new(std::nothrow)
BMessageFieldHeaderNode(this, fParent, fName, fFieldType,
fFieldCount);
if (node == NULL)
return B_NO_MEMORY;
_node = node;
return B_OK;
}
status_t
BMessageValueNode::BMessageFieldHeaderNodeChild::ResolveLocation(
ValueLoader* valueLoader, ValueLocation*& _location)
{
_location = fParent->Location();
return B_OK;
}
@@ -29,20 +29,20 @@ public:
virtual ValueNodeChild* ChildAt(int32 index) const; virtual ValueNodeChild* ChildAt(int32 index) const;
private: private:
class BMessageFieldNode;
class BMessageFieldNodeChild;
class BMessageFieldHeaderNode; class BMessageFieldHeaderNode;
class BMessageFieldHeaderNodeChild; class BMessageFieldHeaderNodeChild;
// for GCC2 // for GCC2
friend class BMessageFieldNode;
friend class BMessageFieldNodeChild;
friend class BMessageFieldHeaderNode; friend class BMessageFieldHeaderNode;
friend class BMessageFieldHeaderNodeChild; friend class BMessageFieldHeaderNodeChild;
typedef BObjectList<ValueNodeChild> ChildNodeList;
private: private:
Type* fType; Type* fType;
bool fValid;
BMessage fMessage; BMessage fMessage;
BMessageFieldNodeChild* fFields; ChildNodeList fChildren;
}; };
@@ -79,8 +79,7 @@ private:
class BMessageValueNode::BMessageFieldHeaderNodeChild : public ValueNodeChild { class BMessageValueNode::BMessageFieldHeaderNodeChild : public ValueNodeChild {
public: public:
BMessageFieldHeaderNodeChild( BMessageFieldHeaderNodeChild(
BMessageFieldNode* parent, BMessageValueNode* parent,
BMessageValueNode* messageNode,
const BString &name, const BString &name,
type_code type, int32 count); type_code type, int32 count);
@@ -97,70 +96,12 @@ public:
virtual status_t ResolveLocation(ValueLoader* valueLoader, virtual status_t ResolveLocation(ValueLoader* valueLoader,
ValueLocation*& _location); ValueLocation*& _location);
virtual status_t CreateChildren();
virtual int32 CountChildren() const;
virtual ValueNodeChild* ChildAt(int32 index) const;
private: private:
BString fName; BString fName;
Type* fType; Type* fType;
BMessageValueNode* fMessageNode; BMessageValueNode* fParent;
BMessageFieldNode* fParent;
type_code fFieldType; type_code fFieldType;
int32 fFieldCount; int32 fFieldCount;
}; };
class BMessageValueNode::BMessageFieldNode : public ValueNode {
public:
BMessageFieldNode(
BMessageFieldNodeChild *child,
BMessageValueNode* parent);
virtual ~BMessageFieldNode();
virtual Type* GetType() const;
virtual status_t CreateChildren();
virtual int32 CountChildren() const;
virtual ValueNodeChild* ChildAt(int32 index) const;
virtual status_t ResolvedLocationAndValue(
ValueLoader* loader,
ValueLocation *& _location,
Value*& _value);
private:
typedef BObjectList<BMessageFieldHeaderNodeChild>
FieldHeaderNodeList;
private:
Type* fType;
BMessageValueNode* fParent;
FieldHeaderNodeList fChildren;
};
class BMessageValueNode::BMessageFieldNodeChild : public ValueNodeChild {
public:
BMessageFieldNodeChild(
BMessageValueNode* parent);
virtual ~BMessageFieldNodeChild();
virtual const BString& Name() const;
virtual Type* GetType() const;
virtual ValueNode* Parent() const;
virtual bool IsInternal() const;
virtual status_t CreateInternalNode(ValueNode*& _node);
virtual status_t ResolveLocation(ValueLoader* valueLoader,
ValueLocation*& _location);
private:
Type* fType;
BMessageValueNode* fParent;
BString fName;
};
#endif // BMESSAGE_VALUE_NODE_H #endif // BMESSAGE_VALUE_NODE_H