c41939ed3b
* NEW: Added a new Document property to XMLExplorer. * NEW: Added the Name and Value properties to XMLReader.Node.Attributes and XMLNode.Attributes, to get the name and value of the enumerated attribute. * BUG: Fixed the XMLNode.Attributes enumeration. * BUG: Fixed XMLExplorer taking the document itself as a node. * OPT: Rewrote internal exception handling. [GB.XML.XSLT] * NEW: Added a new method XSLT.TransformToString() that returns a string instead of an XML document. * BUG: Fixed internal error management. git-svn-id: svn://localhost/gambas/trunk@6416 867c0c6c-44f3-4631-809d-bfa615b0a4ec
139 lines
3.2 KiB
C++
139 lines
3.2 KiB
C++
/***************************************************************************
|
|
|
|
(c) 2012 Adrien Prokopowicz <prokopy@users.sourceforge.net>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2, or (at your option)
|
|
any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
MA 02110-1301, USA.
|
|
|
|
***************************************************************************/
|
|
|
|
#include "explorer.h"
|
|
|
|
#include "node.h"
|
|
#include "document.h"
|
|
#include "element.h"
|
|
#include "gbinterface.h"
|
|
#include <memory.h>
|
|
|
|
|
|
|
|
Explorer::Explorer() : loadedDocument(0)
|
|
{
|
|
Init();
|
|
}
|
|
|
|
Explorer::~Explorer()
|
|
{
|
|
Clear();
|
|
delete[] flags;
|
|
}
|
|
|
|
void Explorer::Init()
|
|
{
|
|
this->flags = new bool[FLAGS_COUNT];
|
|
memset(this->flags, false, FLAGS_COUNT);
|
|
this->flags[NODE_ELEMENT] = true;
|
|
this->flags[NODE_TEXT] = true;
|
|
this->flags[NODE_COMMENT] = true;
|
|
this->flags[NODE_CDATA] = true;
|
|
this->flags[READ_END_CUR_ELEMENT] = true;
|
|
this->flags[READ_ERR_EOF] = true;
|
|
Clear();
|
|
}
|
|
|
|
void Explorer::Load(Document *doc)
|
|
{
|
|
Clear();
|
|
loadedDocument = doc;
|
|
CNode *obj = XMLNode_GetGBObject(loadedDocument);
|
|
GB.Ref(obj);
|
|
//GB.Ref(doc);
|
|
|
|
Read();
|
|
|
|
}
|
|
|
|
void Explorer::Clear()
|
|
{
|
|
if(loadedDocument)
|
|
{
|
|
CNode *obj = XMLNode_GetGBObject(loadedDocument);
|
|
GB.Unref(POINTER(&obj));
|
|
}
|
|
loadedDocument = 0;
|
|
curNode = 0;
|
|
this->eof = false;
|
|
this->endElement = false;
|
|
}
|
|
|
|
int Explorer::MoveNext()
|
|
{
|
|
if(eof) return READ_ERR_EOF;
|
|
if(!loadedDocument)
|
|
{
|
|
GB.Error("No document loaded");
|
|
GB.Propagate();
|
|
return READ_ERR_EOF;
|
|
}
|
|
if(!curNode)//Début du document
|
|
{
|
|
curNode = (Node*)(loadedDocument->root);
|
|
return NODE_ELEMENT;
|
|
}
|
|
//Premier enfant
|
|
else if(curNode->type == Node::ElementNode && ((Element*)curNode)->childCount > 0 && !endElement)
|
|
{
|
|
curNode = (((Element*)curNode)->firstChild);
|
|
return curNode->type;
|
|
}
|
|
//Si plus d'enfants, frère suivant
|
|
else
|
|
{
|
|
Node *nextNode = curNode->nextNode;
|
|
endElement = false;
|
|
if(nextNode)
|
|
{
|
|
curNode = nextNode;
|
|
return nextNode->type;
|
|
}
|
|
//si plus d'enfants ni de frère, on remonte
|
|
else if(curNode->parent && curNode != loadedDocument->root && curNode->parent != loadedDocument)
|
|
{
|
|
curNode = curNode->parent;
|
|
endElement = true;
|
|
return READ_END_CUR_ELEMENT;
|
|
}
|
|
else//Plus de parent = fin du document
|
|
{
|
|
this->eof = true;
|
|
return READ_ERR_EOF;
|
|
}
|
|
|
|
}
|
|
|
|
return 0;//Hautement probablement impossible
|
|
|
|
}
|
|
|
|
unsigned char Explorer::Read()
|
|
{
|
|
do
|
|
{
|
|
state = MoveNext();
|
|
} while(!this->flags[state]);
|
|
|
|
return state;
|
|
}
|