#include "Emoconfig.h" #include #include #include #include #include #include #include //tmp BMessage* faces = NULL; bool valid = false; bool fname = false; bool svg = false; bool size = true; BString filename; BString face; BPath path; BString gCharacters; Emoconfig::Emoconfig(const char* xmlfile): BMessage() { fEmoticonSize = 16.0; //default numfaces = 0; fParser = XML_ParserCreate(NULL); XML_SetUserData(fParser, this); XML_SetElementHandler(fParser, StartElement, EndElement); XML_SetCharacterDataHandler(fParser, Characters); //path! BPath p(xmlfile); p.GetParent(&path); // loading the config file.. BFile* settings = new BFile(xmlfile, B_READ_ONLY); off_t size; settings->GetSize(&size); if (size) { void* buffer = malloc((size_t)size); size = settings->Read(buffer, (size_t)size); XML_Parse(fParser, (const char*)buffer, (int)size, true); free(buffer); } delete settings; if (fParser) XML_ParserFree(fParser); printf("Emoconfig: loaded %d faces\n", numfaces); } Emoconfig::~Emoconfig() { } void Emoconfig::StartElement(void * /*pUserData*/, const char* pName, const char** /*pAttr*/) { //printf("StartElement %s\n",pName); BString name(pName); if (name.ICompare("emoticon") == 0) { faces = new BMessage(); svg = false; } else if (name.ICompare("text") == 0 && faces) { valid = true; } else if (name.ICompare("file") == 0 && faces) { fname = true; } else if (name.ICompare("svg") == 0 && faces) { // printf("File is SVG\n"); svg = true; } else if (name.ICompare("size") == 0) { size = true; gCharacters = ""; } } void Emoconfig::EndElement(void* pUserData, const char* pName) { //printf("EndElement %s\n",pName); BString name(pName); if (name.ICompare("emoticon") == 0 && faces) { //faces->PrintToStream(); //debug delete faces; faces = NULL; } else if (name.ICompare("text") == 0 && faces) { valid = false; faces->AddString("face", face); //printf("to ]%s[\n",face.String()); face.SetTo(""); } else if (name.ICompare("file") == 0 && faces) { //load file //compose the filename BPath p(path); p.Append(filename.String()); BBitmap* icons = NULL; if ( !svg ) { // icons = BTranslationUtils::GetBitmap(p.Path()); } //assign to faces; fname = false; // printf("Filename %s [%s]\n",p.Path(),path.Path()); if (!icons) return; int i = 0; BString s; while (faces->FindString("face", i, &s) == B_OK) { if (i == 0) { ((Emoconfig*)pUserData)->menu.AddPointer(s.String(), (const void*)icons); ((Emoconfig*)pUserData)->menu.AddString("face", s.String()); } ((BMessage*)pUserData)->AddPointer(s.String(), (const void*)icons); ((BMessage*)pUserData)->AddString("face", s.String()); ((Emoconfig*)pUserData)->numfaces++; i++; } } else if (name.ICompare("size") == 0) { if ( size ) { ((Emoconfig*)pUserData)->fEmoticonSize = atoi(gCharacters.String()); } size = false; } } void Emoconfig::Characters(void * /*pUserData*/, const char* pString, int pLen) { BString f(pString, pLen); //printf("Characters %s\n",f.String()); if (faces && valid) { f.RemoveAll(" "); f.RemoveAll("\""); if (f.Length() > 0) face.Append(f); } else if (fname) { f.RemoveAll(" "); filename = f; } else { gCharacters.Append(f); } }