tomk%mitre.org 92cbf62bb0 Added a generic Makefile to simply build the Mozilla DOM wrapper classes.
Fixed a bug in the wrapper factory methods in MozillaDocument.cpp.  The bug
could cause seg. faults if a "null" mozilla object was being wrapped.

Note:  These files are not part of the regular Mozilla build.


git-svn-id: svn://10.0.0.236/trunk@60884 18797224-902f-48f8-a5cc-f745e15eee43
2000-02-15 15:19:15 +00:00

391 lines
9.8 KiB
C++

/*
* (C) Copyright The MITRE Corporation 1999 All rights reserved.
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* The program provided "as is" without any warranty express or
* implied, including the warranty of non-infringement and the implied
* warranties of merchantibility and fitness for a particular purpose.
* The Copyright owner will not be liable for any damages suffered by
* you as a result of using the Program. In no event will the Copyright
* owner be liable for any special, indirect or consequential damages or
* lost profits even if the Copyright owner has been advised of the
* possibility of their occurrence.
*
* Please see release.txt distributed with this file for more information.
*
*/
// Tom Kneeland (3/29/99)
//
// Wrapper class to convert Mozilla's Node Interface to TransforMIIX's Node
// Interface.
//
// NOTE: The objects being wrapped are not deleted. It is assumed that they
// will be deleted when the actual ("real") Mozilla Document is
// destroyed
//
// Also note that this object's parent Document provides the necessary
// factory functions for creating wrapper classes; such as:
//
//
// Modification History:
// Who When What
//
#include "mozilladom.h"
Node::Node()
{
ownerDocument = NULL;
}
Node::Node(nsIDOMNode* node, Document* owner)
{
ownerDocument = owner;
nsNode = node;
}
Node::~Node()
{
}
void Node::setNSObj(nsIDOMNode* node)
{
//First we must remove this wrapper from the document hash table since we
//don't want to be associated with the existing nsIDOM* object anymore
ownerDocument->removeWrapper((Int32)nsNode);
//Now assume control of the new node
nsNode = node;
//Finally, place our selves back in the hash table, using the new object
//as the hash value
ownerDocument->addWrapper(this, (Int32)node);
}
void Node::setNSObj(nsIDOMNode* node, Document* owner)
{
ownerDocument = owner;
nsNode = node;
}
nsIDOMNode* Node::getNSObj()
{
return nsNode;
}
//
//Call nsIDOMNode::GetNodeName, store the results in the nodeName DOMString,
//and return it to the caller.
//
const DOMString& Node::getNodeName()
{
if (nsNode == NULL)
return NULL_STRING;
nsNode->GetNodeName(nodeName.getNSString());
return nodeName;
}
//
//Call nsIDOMNode::GetNodeValue, store the results in nodeValue, and
//return it to the caller.
//
const DOMString& Node::getNodeValue()
{
if (nsNode == NULL)
return NULL_STRING;
nsNode->GetNodeValue(nodeValue.getNSString());
return nodeValue;
}
//
//Call nsIDOMNode::GetNodeType passing it a temporary unsigned short. Then
//pass the value stored in that variable to the caller.
//
unsigned short Node::getNodeType() const
{
unsigned short nodeType;
if (nsNode == NULL)
return 0;
nsNode->GetNodeType(&nodeType);
return nodeType;
}
//
//Call nsIDOMNode::GetParentNode(nsIDOMNode**) passing it a handle to a
//nsIDOMNode. Store the returned nsIDOMNode in the parentNode wrapper object
//and return its address to the caller.
//
Node* Node::getParentNode()
{
nsIDOMNode* tmpParent = NULL;
if (nsNode == NULL)
return NULL;
if (nsNode->GetParentNode(&tmpParent) == NS_OK)
return ownerDocument->createWrapper(tmpParent);
else
return NULL;
}
//
//Call nsIDOMNode::GetChildNodes(nsIDOMNodeList**) passing it a handle to a
//nsIDOMNodeList. Defer to the owner document to produce a wrapper for this
//object.
//
NodeList* Node::getChildNodes()
{
nsIDOMNodeList* tmpNodeList = NULL;
if (nsNode == NULL)
return NULL;
if (nsNode->GetChildNodes(&tmpNodeList) == NS_OK)
return ownerDocument->createNodeList(tmpNodeList);
else
return NULL;
}
//
//Call nsIDOMNode::GetFirstChild(nsIDOMNode**) passing it a handle to a
//nsIDOMNode. Defer to the owner document to produce a wrapper for this object.
//
Node* Node::getFirstChild()
{
nsIDOMNode* tmpFirstChild = NULL;
if (nsNode == NULL)
return NULL;
if (nsNode->GetFirstChild(&tmpFirstChild) == NS_OK)
return ownerDocument->createWrapper(tmpFirstChild);
else
return NULL;
}
//
//Call nsIDOMNode::GetLastChild(nsIDOMNode**) passing it a handle to a
//nsIDOMNode. Defer to the owner document to produce a wrapper for this object.
//
Node* Node::getLastChild()
{
nsIDOMNode* tmpLastChild = NULL;
if (nsNode == NULL)
return NULL;
if (nsNode->GetLastChild(&tmpLastChild) == NS_OK)
return ownerDocument->createWrapper(tmpLastChild);
else
return NULL;
}
//
//Call nsIDOMNode::GetPreviousSibling(nsIDOMNode**) passing it a handle to a
//nsIDOMNode. Defer to the owner document to produce a wrapper for this object.
//
Node* Node::getPreviousSibling()
{
nsIDOMNode* tmpPrevSib = NULL;
if (nsNode == NULL)
return NULL;
if (nsNode->GetPreviousSibling(&tmpPrevSib) == NS_OK)
return ownerDocument->createWrapper(tmpPrevSib);
else
return NULL;
}
//
//Call nsIDOMNode::GetNextSibling(nsIDOMNode**) passing it a handle to a
//nsIDOMNode. Defer to the owner document to produce a wrapper for this object.
//
Node* Node::getNextSibling()
{
nsIDOMNode* tmpNextSib = NULL;
if (nsNode == NULL)
return NULL;
if (nsNode->GetNextSibling(&tmpNextSib) == NS_OK)
return ownerDocument->createWrapper(tmpNextSib);
else
return NULL;
}
//
//Call nsIDOMNode::GetAttributes(nsIDOMNamedNodeMap**) passing it a handle to a
//nsIDOMNamedNodeMap. Defer to the owner document to produce a wrapper for this
//object.
//
NamedNodeMap* Node::getAttributes()
{
nsIDOMNamedNodeMap* tmpAttributes = NULL;
if (nsNode == NULL)
return NULL;
if (nsNode->GetAttributes(&tmpAttributes) == NS_OK)
return ownerDocument->createNamedNodeMap(tmpAttributes);
else
return NULL;
}
//
//Call nsIDOMNode::GetOwnerDocument(nsIDOMDocument**) passing it a handle to a
//nsIDOMDocument. ????
//
Document* Node::getOwnerDocument()
{
/*nsIDOMDocument* tmpOwnerDoc = NULL;
if (nsNode == NULL)
return NULL;
nsNode->GetOwnerDocument(&tmpOwnerDoc);
ownerDocument->setNSObj(tmpOwnerDoc); */
return ownerDocument;
}
//
//Call nsIDOMNode::SetNodeValue(nsString*) passing it the nsString wrapped by
//the provided DOMString.
//
void Node::setNodeValue(const DOMString& newNodeValue)
{
if (nsNode != NULL)
nsNode->SetNodeValue(newNodeValue.getConstNSString());
}
//
//Retreive the nsIDOMNode objects wrapped by newChild and refChild and pass
//them to nsIDOMNode::InsertBefore(...). If the return value from InsertBefore
//is valid, retrieve or create a wrapper class for it from the owner document.
//This ensures there newChild is properly hashed (it should have been when it
//was created.)
//
Node* Node::insertBefore(Node* newChild,
Node* refChild)
{
nsIDOMNode* returnValue = NULL;
if (nsNode == NULL)
return NULL;
if (nsNode->InsertBefore(newChild->getNSObj(), refChild->getNSObj(),
&returnValue) == NS_OK)
return ownerDocument->createWrapper(returnValue);
else
return NULL;
}
//
//Retreive the nsIDOMNode objects wrapped by newChild and oldChild and pass
//them to nsIDOMNode::ReplaceChild(...). If the replace call success, then
//we want to remove the old child's wrapper object from the hash and return
//it to the caller. This ensures that when the caller deletes the memory,
//no hash conflicts occure when the address is reused.
//
Node* Node::replaceChild(Node* newChild,
Node* oldChild)
{
nsIDOMNode* returnValue = NULL;
if (nsNode == NULL)
return NULL;
if (nsNode->ReplaceChild(newChild->getNSObj(), oldChild->getNSObj(),
&returnValue) == NS_OK)
{
//We want to remove the wrapper class from the hash table, and return
//it to the caller.
return (Node*)ownerDocument->removeWrapper((Int32)returnValue);
}
else
return NULL;
}
//
//Retreive the nsIDOMNode object wrapped by oldChild and pass it to
//nsIDOMNode::RemoveChild(...). If the return value from RemoveChild
//is valid, then we want to remove the wrapper class from from the hash.
//
Node* Node::removeChild(Node* oldChild)
{
nsIDOMNode* returnValue = NULL;
if (nsNode == NULL)
return NULL;
if (nsNode->RemoveChild(oldChild->getNSObj(), &returnValue) == NS_OK)
return (Node*)ownerDocument->removeWrapper((Int32)returnValue);
else
return NULL;
}
//
//Retreive the nsIDOMNode object wrapped by newChild and pass it to
//nsIDOMNode::AppendChild(...). If the return value from AppendChild
//is valid, then goto the owner document for a wrapper object for the return
//value.
//
Node* Node::appendChild(Node* newChild)
{
nsIDOMNode* returnValue = NULL;
if (nsNode == NULL)
return NULL;
if (nsNode->AppendChild(newChild->getNSObj(), &returnValue) == NS_OK)
return ownerDocument->createWrapper(returnValue);
else
return NULL;
}
//
//Call nsIDOMNode::Clone to clone the node wrapped by this object. Simply
//take the returned node, and wrap it in dest.
//
Node* Node::cloneNode(MBool deep, Node* dest)
{
nsIDOMNode* returnValue = NULL;
if (nsNode == NULL)
return NULL;
if (nsNode->CloneNode(deep, &returnValue) == NS_OK)
{
dest->setNSObj(returnValue);
return dest;
}
else
return NULL;
}
MBool Node::hasChildNodes() const
{
PRBool returnValue;
if (nsNode == NULL)
return MB_FALSE;
nsNode->HasChildNodes(&returnValue);
return returnValue;
}