[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[paragui-cvs] CVS: paragui/src/layout pgxmllayoutloader.cpp,NONE,1.1
From: |
Alexander Pipelka <address@hidden> |
Subject: |
[paragui-cvs] CVS: paragui/src/layout pgxmllayoutloader.cpp,NONE,1.1 |
Date: |
Thu, 27 Jun 2002 10:37:14 -0400 |
Update of /cvsroot/paragui/paragui/src/layout
In directory subversions:/tmp/cvs-serv16607/src/layout
Added Files:
pgxmllayoutloader.cpp
Log Message:
added new xml layoutloader framework (not finished)
--- NEW FILE ---
#include "pgxmllayoutloader.h"
#include "pgwidget.h"
#include "pgfilearchive.h"
#include "pglog.h"
#include "expat.h"
#include <stack>
#define XML_BUFF_SIZE 512
class PG_XMLParseUserData {
public:
XML_Parser parser;
PG_XML_SECTION section;
PG_Widget* parent;
PG_XMLLayoutLoaderBase* caller;
PG_XMLParseUserData() {
parser = XML_ParserCreate(NULL);
section = DOC;
parent = NULL;
}
void push() {
stack_parent.push(parent);
stack_section.push(section);
}
void pop() {
parent = stack_parent.top();
section = stack_section.top();
stack_parent.pop();
stack_section.pop();
}
private:
std::stack<PG_Widget*> stack_parent;
std::stack<PG_XML_SECTION> stack_section;
};
PG_XMLTagList::PG_XMLTagList(const char** atts) {
if(atts == NULL) {
return;
}
std::string xmltag;
std::string value;
while(*atts != NULL) {
xmltag = *atts;
atts++;
value = *atts;
atts++;
(*this)[xmltag] = value;
}
}
PG_XMLTag::PG_XMLTag(const char* n, const char** a, PG_XML_SECTION sec) :
taglist(a), section(sec) {
if(n != NULL) {
name = n;
}
}
void PG_XMLTag::Log() {
PG_LogMSG("Tagname: %s", name.c_str());
PG_LogMSG("Section: %i", section);
PG_LogMSG("Attributes: %i", taglist.size());
for(PG_XMLTagList::iterator i = taglist.begin(); i != taglist.end();
i++) {
PG_LogMSG("%s: %s", (*i).first.c_str(), (*i).second.c_str());
}
}
bool PG_XMLLayoutLoaderBase::Load(PG_Widget* parent, const char* filename) {
bool status = true;
int bytes_pos = 0;
PG_XMLParseUserData XMLParser;
XMLParser.parent = parent;
XMLParser.caller = this;
XML_SetUserData(XMLParser.parser, &XMLParser);
XML_SetElementHandler(XMLParser.parser,
PG_XMLLayoutLoaderBase::XMLStartDoc, PG_XMLLayoutLoaderBase::XMLEndDoc);
PG_File* f = PG_FileArchive::OpenFile(filename);
if (f == NULL) {
PG_LogWRN("Layout file %s not found !", filename);
return false;
}
for (;;) {
int bytes_read;
void* buff;
if ((buff = XML_GetBuffer(XMLParser.parser, XML_BUFF_SIZE)) ==
NULL) {
PG_LogWRN("Can`t get parse buffer");
status = false;
break;
}
bytes_read = f->read(buff, XML_BUFF_SIZE);
bytes_pos += bytes_read;
/*if (WorkCallback != NULL) {
WorkCallback(bytes_pos , f->fileLength());
}*/
if (XML_ParseBuffer(XMLParser.parser, bytes_read, bytes_read ==
0) == 0) {
PG_LogWRN("%s on the line %d pos
%d",XML_ErrorString(XML_GetErrorCode(XMLParser.parser)),XML_GetCurrentLineNumber(XMLParser.parser),
XML_GetCurrentColumnNumber(XMLParser.parser));
status = false;
break;
}
if (bytes_read == 0) {
status = true;
break;
}
}
if (XMLParser.parser != NULL) {
XML_ParserFree(XMLParser.parser);
}
delete f;
return status;
}
void PG_XMLLayoutLoaderBase::XMLStartDoc(void *userData, const char *name,
const char **atts) {
// get pointer to our private parser data
PG_XMLParseUserData* parser =
static_cast<PG_XMLParseUserData*>(userData);
// put our status on the stack
parser->push();
std::string n = name;
if(n == "layout") {
parser->section = LAYOUT;
}
if(n == "head") {
parser->section = HEAD;
}
if(n == "body") {
parser->section = BODY;
}
// create new tag object
PG_XMLTag xmltag(name, atts, parser->section);
// execute it
parser->caller->sigStartTag(xmltag);
}
void PG_XMLLayoutLoaderBase::XMLEndDoc(void *userData, const char *name) {
PG_XMLParseUserData* parser =
static_cast<PG_XMLParseUserData*>(userData);
// create new tag object
PG_XMLTag xmltag(name, NULL, parser->section);
// execute it
parser->caller->sigEndTag(xmltag);
// get our status from the stack
parser->pop();
}
bool PG_XMLBasicExecutor::handleStartTag(PG_XMLTag& tag) {
PG_LogMSG("> handleStartTag");
tag.Log();
return true;
}
bool PG_XMLBasicExecutor::handleEndTag(PG_XMLTag& tag) {
PG_LogMSG("> handleEndTag");
tag.Log();
PG_LogMSG("");
return true;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [paragui-cvs] CVS: paragui/src/layout pgxmllayoutloader.cpp,NONE,1.1,
Alexander Pipelka <address@hidden> <=
- Prev by Date:
[paragui-cvs] CVS: paragui/include pgxmllayoutloader.h,NONE,1.1 Makefile.am,1.9,1.10
- Next by Date:
[paragui-cvs] CVS: paragui configure.in,1.16,1.17
- Previous by thread:
[paragui-cvs] CVS: paragui/include pgxmllayoutloader.h,NONE,1.1 Makefile.am,1.9,1.10
- Next by thread:
[paragui-cvs] CVS: paragui configure.in,1.16,1.17
- Index(es):