diff --git a/CMakeLists.txt b/CMakeLists.txt index d87c9b5a..53c57ab6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -110,15 +110,16 @@ SET(SOURCES # framework otml src/framework/otml/otmldocument.cpp src/framework/otml/otmlemitter.cpp - src/framework/otml/otmlexception.cpp src/framework/otml/otmlnode.cpp src/framework/otml/otmlparser.cpp + src/framework/otml/otmlexception.cpp # framework luascript src/framework/luascript/luainterface.cpp src/framework/luascript/luaobject.cpp src/framework/luascript/luaexception.cpp src/framework/luascript/luafunctions.cpp + src/framework/luascript/luavaluecasts.cpp # framework ui src/framework/ui/uimanager.cpp diff --git a/src/framework/core/configs.cpp b/src/framework/core/configs.cpp index b871055f..2662e810 100644 --- a/src/framework/core/configs.cpp +++ b/src/framework/core/configs.cpp @@ -9,27 +9,23 @@ bool Configs::load(const std::string& fileName) { m_fileName = fileName; - if(!g_resources.fileExists(fileName)) - return false; - try { OTMLDocumentPtr doc = OTMLDocument::parse(fileName); - for(const OTMLNodePtr& child : doc->childNodes()) + for(const OTMLNodePtr& child : doc->children()) m_confsMap[child->tag()] = child->value(); + return true; } catch(std::exception& e) { logError("ERROR: could not load configurations: ", e.what()); return false; } - - return true; } bool Configs::save() { - if(!m_fileName.empty()) { - OTMLDocumentPtr doc = OTMLDocument::create(); - doc->write(m_confsMap); - return doc->save(m_fileName); + OTMLDocumentPtr doc = OTMLDocument::create(); + for(auto it : m_confsMap) { + OTMLNodePtr node = OTMLNode::create(it.first, it.second); + doc->addChild(node); } - return false; + return doc->save(m_fileName); } diff --git a/src/framework/core/module.cpp b/src/framework/core/module.cpp index 43510641..f85d661b 100644 --- a/src/framework/core/module.cpp +++ b/src/framework/core/module.cpp @@ -6,61 +6,57 @@ void Module::discover(const OTMLNodePtr& moduleNode) { - m_description = moduleNode->readAt("description"); - m_author = moduleNode->readAt("author"); - m_website = moduleNode->readAt("website"); - m_version = moduleNode->readAt("version"); + const static std::string none = "none"; + m_description = moduleNode->valueAt("description", none); + m_author = moduleNode->valueAt("author", none); + m_website = moduleNode->valueAt("website", none); + m_version = moduleNode->valueAt("version", none); + m_autoLoad = moduleNode->valueAt("autoLoad", false); if(OTMLNodePtr node = moduleNode->get("dependencies")) { - for(const OTMLNodePtr& tmp : node->childNodes()) + for(const OTMLNodePtr& tmp : node->children()) m_dependencies.push_back(tmp->value()); } // set onLoad callback if(OTMLNodePtr node = moduleNode->get("onLoad")) { - g_lua.loadFunction(node->read(), "@" + node->source() + "[" + node->tag() + "]"); + g_lua.loadFunction(node->value(), "@" + node->source() + "[" + node->tag() + "]"); g_lua.useValue(); m_loadCallback = g_lua.polymorphicPop(); } // set onUnload callback if(OTMLNodePtr node = moduleNode->get("onUnload")) { - g_lua.loadFunction(node->read(), "@" + node->source() + "[" + node->tag() + "]"); + g_lua.loadFunction(node->value(), "@" + node->source() + "[" + node->tag() + "]"); g_lua.useValue(); m_unloadCallback = g_lua.polymorphicPop(); } - - // load if autoLoad is set - m_autoLoad = moduleNode->readAt("autoLoad", false); } bool Module::load() { - for(const std::string& depName : m_dependencies) { - ModulePtr dep = g_modules.getModule(depName); - if(!dep) { - logError("ERROR: failed to load module '",m_name,"': could not find module dependency '",depName,"'"); - return false; - } + try { + for(const std::string& depName : m_dependencies) { + ModulePtr dep = g_modules.getModule(depName); + if(!dep) + throw std::runtime_error(fw::mkstr("could not find module dependency '", depName ,"'")); - if(!dep->isLoaded()) { - if(!dep->load()) { - logError("ERROR: failed to load module '",m_name,"': a dependency has failed to load"); - return false; - } + if(!dep->isLoaded() && !dep->load()) + throw std::runtime_error(fw::mkstr("dependency '", depName, "' has failed to load")); } - } - if(m_loadCallback) { - m_loaded = m_loadCallback(); - if(!m_loaded) { - logError("ERROR: failed to load module '",m_name, "': onLoad returned false"); - return false; + if(m_loadCallback) { + m_loaded = m_loadCallback(); + if(!m_loaded) + throw std::runtime_error("module onLoad event returned false"); } - } - logInfo("Loaded module '", m_name, "'"); - return true; + logInfo("Loaded module '", m_name, "'"); + return true; + } catch(std::exception& e) { + logError("ERROR: failed to load module '", m_name, "': ", e.what()); + return false; + } } void Module::unload() diff --git a/src/framework/core/modulemanager.cpp b/src/framework/core/modulemanager.cpp index 7b84ead0..6b8388e6 100644 --- a/src/framework/core/modulemanager.cpp +++ b/src/framework/core/modulemanager.cpp @@ -30,7 +30,7 @@ bool ModuleManager::discoverModule(const std::string& file) OTMLDocumentPtr doc = OTMLDocument::parse(file); OTMLNodePtr moduleNode = doc->at("Module"); - std::string name = moduleNode->readAt("name"); + std::string name = moduleNode->valueAt("name"); if(getModule(name)) throw OTMLException(moduleNode, "a module with the same name is already discovered, did you duplicate module names?"); @@ -38,7 +38,7 @@ bool ModuleManager::discoverModule(const std::string& file) module->discover(moduleNode); m_modules.push_back(module); } catch(std::exception& e) { - logError("ERROR: failed to load module from '", file, "':\n", e.what()); + logError("ERROR: failed to load module from '", file, "': ", e.what()); return false; } return true; diff --git a/src/framework/core/resourcemanager.cpp b/src/framework/core/resourcemanager.cpp index 7e93a990..cfe1f6ef 100644 --- a/src/framework/core/resourcemanager.cpp +++ b/src/framework/core/resourcemanager.cpp @@ -30,14 +30,14 @@ void ResourceManager::init(const char* argv0) } if(!found) - throw std::runtime_error("could not find modules directory"); + logFatal("FATAL ERROR: could not find modules directory"); // setup write directory std::string dir = g_platform.getAppUserDir(); if(g_resources.setWriteDir(dir)) g_resources.addToSearchPath(dir); else - throw std::runtime_error("could not setup write directory"); + logError("ERROR: could not setup write directory"); } void ResourceManager::terminate() @@ -156,12 +156,11 @@ std::string ResourceManager::resolvePath(const std::string& path) { std::string fullPath; if(boost::starts_with(path, "/")) - fullPath = path.substr(1); + fullPath = path; else { - std::string scriptPath = g_lua.currentSourcePath(); - if(!scriptPath.empty()) { + std::string scriptPath = "/" + g_lua.currentSourcePath(); + if(!scriptPath.empty()) fullPath += scriptPath + "/"; - } fullPath += path; } return fullPath; diff --git a/src/framework/graphics/borderimage.cpp b/src/framework/graphics/borderimage.cpp index c417b146..50132e16 100644 --- a/src/framework/graphics/borderimage.cpp +++ b/src/framework/graphics/borderimage.cpp @@ -61,17 +61,17 @@ BorderImagePtr BorderImage::loadFromOTML(const OTMLNodePtr& borderImageNode) // load basic border confs size = texture->getSize(); - size = borderImageNode->readAt("size", size); - offset = borderImageNode->readAt("offset", offset); - border = borderImageNode->readAt("border", 0); + size = borderImageNode->valueAt("size", size); + offset = borderImageNode->valueAt("offset", offset); + border = borderImageNode->valueAt("border", 0); subRect = Rect(offset, size); // load border margins top = bottom = left = right = border; - top = borderImageNode->readAt("border.top", top); - bottom = borderImageNode->readAt("border.bottom", bottom); - left = borderImageNode->readAt("border.left", left); - right = borderImageNode->readAt("border.right", right); + top = borderImageNode->valueAt("border.top", top); + bottom = borderImageNode->valueAt("border.bottom", bottom); + left = borderImageNode->valueAt("border.left", left); + right = borderImageNode->valueAt("border.right", right); // calculates border coords leftBorder = Rect(subRect.left(), subRect.top() + top, left, subRect.height() - top - bottom); @@ -86,15 +86,15 @@ BorderImagePtr BorderImage::loadFromOTML(const OTMLNodePtr& borderImageNode) // load individual border conf if supplied /* - leftBorder = borderImageNode->readAt("left border", leftBorder); - rightBorder = borderImageNode->readAt("right border", rightBorder); - topBorder = borderImageNode->readAt("top border", topBorder); - bottomBorder = borderImageNode->readAt("bottom border", bottomBorder); - topLeftCorner = borderImageNode->readAt("top left corner", topLeftCorner); - topRightCorner = borderImageNode->readAt("top right corner", topRightCorner); - bottomLeftCorner = borderImageNode->readAt("bottom left corner", bottomLeftCorner); - bottomRightCorner = borderImageNode->readAt("bottom right corner", bottomRightCorner); - center = borderImageNode->readAt("center", center); + leftBorder = borderImageNode->valueAt("left border", leftBorder); + rightBorder = borderImageNode->valueAt("right border", rightBorder); + topBorder = borderImageNode->valueAt("top border", topBorder); + bottomBorder = borderImageNode->valueAt("bottom border", bottomBorder); + topLeftCorner = borderImageNode->valueAt("top left corner", topLeftCorner); + topRightCorner = borderImageNode->valueAt("top right corner", topRightCorner); + bottomLeftCorner = borderImageNode->valueAt("bottom left corner", bottomLeftCorner); + bottomRightCorner = borderImageNode->valueAt("bottom right corner", bottomRightCorner); + center = borderImageNode->valueAt("center", center); */ return BorderImagePtr(new BorderImage(texture, diff --git a/src/framework/graphics/declarations.h b/src/framework/graphics/declarations.h index 211fd745..ede66004 100644 --- a/src/framework/graphics/declarations.h +++ b/src/framework/graphics/declarations.h @@ -7,7 +7,6 @@ class Texture; class Font; class Image; class BorderImage; -class TextArea; class FrameBuffer; typedef std::weak_ptr TextureWeakPtr; @@ -16,7 +15,6 @@ typedef std::shared_ptr TexturePtr; typedef std::shared_ptr FontPtr; typedef std::shared_ptr ImagePtr; typedef std::shared_ptr BorderImagePtr; -typedef std::shared_ptr