paragui-cvs
[Top][All Lists]
Advanced

[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;
}




reply via email to

[Prev in Thread] Current Thread [Next in Thread]