* 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:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user