reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

commit 85bc759a8730d4de1d897c729e7bd05206b7bcb5
parent ea826bf701e8cd542bafb1c23de294a7a1295500
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Wed, 25 Nov 2015 00:30:58 -0500

start working on the database parser

Diffstat:
MTupfile | 4++++
Asrc/database.cpp | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/database.hpp | 22++++++++++++++++++++++
Asrc/database_v1.cpp | 24++++++++++++++++++++++++
Msrc/main.cpp | 16+++++-----------
Atest/database.cpp | 50++++++++++++++++++++++++++++++++++++++++++++++++++
Atest/database_v1.cpp | 19+++++++++++++++++++
Atest/db/broken.xml | 1+
Atest/db/future_version.xml | 1+
Atest/db/invalid_version.xml | 1+
Atest/db/v1/unnamed_category.xml | 3+++
Atest/db/wrong_root.xml | 1+
12 files changed, 180 insertions(+), 11 deletions(-)

diff --git a/Tupfile b/Tupfile @@ -20,6 +20,10 @@ JNETLIB := $(WDL)/jnetlib WDLSOURCE += $(JNETLIB)/util.cpp $(JNETLIB)/httpget.cpp WDLSOURCE += $(JNETLIB)/connection.cpp $(JNETLIB)/asyncdns.cpp +TINYXML := $(WDL)/tinyxml +WDLSOURCE += $(TINYXML)/tinyxml.cpp $(TINYXML)/tinystr.cpp +WDLSOURCE += $(TINYXML)/tinyxmlparser.cpp $(TINYXML)/tinyxmlerror.cpp + !build = |> $(CXX) $(CXXFLAGS) -c %f -o %o |> !link = |> $(CXX) $(CXXFLAGS) %f $(LDFLAGS) -o %o |> diff --git a/src/database.cpp b/src/database.cpp @@ -0,0 +1,49 @@ +#include "database.hpp" + +#include <WDL/tinyxml/tinyxml.h> + +#include <cstdio> + +DatabasePtr Database::load(const char *file, const char **error) +{ + TiXmlDocument doc(file); + + if(!doc.LoadFile()) { + *error = "failed to read database"; + return 0; + } + + TiXmlHandle docHandle(&doc); + TiXmlElement *root = doc.RootElement(); + + if(strcmp(root->Value(), "index")) { + *error = "invalid database"; + return 0; + } + + int version = 0; + root->Attribute("version", &version); + + if(!version) { + *error = "invalid version"; + return 0; + } + + switch(version) { + case 1: + return loadV1(root, error); + default: + *error = "unsupported version"; + return 0; + } +} + +Database::Database() +{ + printf("constructed\n"); +} + +Database::~Database() +{ + printf("destructed\n"); +} diff --git a/src/database.hpp b/src/database.hpp @@ -0,0 +1,22 @@ +#ifndef REAPACK_DATABASE_HPP +#define REAPACK_DATABASE_HPP + +#include <memory> + +class TiXmlElement; + +class Database; +typedef std::shared_ptr<Database> DatabasePtr; + +class Database { +public: + static DatabasePtr load(const char *, const char **error); + + Database(); + ~Database(); + +private: + static DatabasePtr loadV1(TiXmlElement *, const char **); +}; + +#endif diff --git a/src/database_v1.cpp b/src/database_v1.cpp @@ -0,0 +1,24 @@ +#include "database.hpp" + +#include <WDL/tinyxml/tinyxml.h> + +DatabasePtr Database::loadV1(TiXmlElement *root, const char **error) +{ + DatabasePtr db = std::make_shared<Database>(); + + // read categories + TiXmlElement *catNode = root->FirstChildElement("category"); + + while(catNode) { + const char *name = catNode->Attribute("name"); + + if(!name) { + *error = "missing category name"; + return 0; + } + + catNode = catNode->NextSiblingElement(); + } + + return db; +} diff --git a/src/main.cpp b/src/main.cpp @@ -1,5 +1,5 @@ #include "reapack.hpp" -#include "download.hpp" +#include "database.hpp" #include <cstdlib> @@ -24,20 +24,14 @@ extern "C" REAPER_PLUGIN_DLL_EXPORT int REAPER_PLUGIN_ENTRYPOINT( printf("%s\n", GetResourcePath()); - Download *down = new Download("http://cfillion.tk/"); - down->addCallback([=](const int status, const char *contents) { - char strStatus[5]; - sprintf(strStatus, "%zu", strlen(contents)); - - ShowMessageBox(contents, strStatus, 0); - down->start(); - }); - down->start(); + const char *error = 0; + DatabasePtr db = Database::load("/Users/cfillion/Programs/reapack/reapack.xml", &error); + printf("%s\n", error); reapack.init(instance, rec); reapack.setupAction("REAPACKMGR", "ReaPack: Package Manager", - &reapack.action, std::bind(&ReaPack::toggleWindow, reapack)); + &reapack.action, std::bind(&ReaPack::toggleBrowser, reapack)); rec->Register("hookcommand", (void *)commandHook); diff --git a/test/database.cpp b/test/database.cpp @@ -0,0 +1,50 @@ +#include <catch.hpp> + +#include <database.hpp> + +#include <string> + +#define DBPATH "test/db/" + +using namespace std; + +static const char *M = "[database]"; + +TEST_CASE("file not found", M) { + const char *error = ""; + DatabasePtr db = Database::load(DBPATH "404.xml", &error); + + CHECK(db.get() == 0); + REQUIRE(string(error) == "failed to read database"); +} + +TEST_CASE("broken xml", M) { + const char *error = ""; + Database::load(DBPATH "broken.xml", &error); + + REQUIRE(string(error) == "failed to read database"); +} + +TEST_CASE("wrong root tag name", M) { + const char *error = ""; + DatabasePtr db = Database::load(DBPATH "wrong_root.xml", &error); + + CHECK(db.get() == 0); + REQUIRE(string(error) == "invalid database"); +} + +TEST_CASE("invalid version", M) { + const char *error = ""; + DatabasePtr db = Database::load(DBPATH "invalid_version.xml", &error); + + CHECK(db.get() == 0); + REQUIRE(string(error) == "invalid version"); +} + +TEST_CASE("future version", M) { + const char *error = ""; + DatabasePtr db = Database::load(DBPATH "future_version.xml", &error); + + CHECK(db.get() == 0); + REQUIRE(string(error) == "unsupported version"); +} diff --git a/test/database_v1.cpp b/test/database_v1.cpp @@ -0,0 +1,19 @@ +#include <catch.hpp> + +#include <database.hpp> + +#include <string> + +#define DBPATH "test/db/v1/" + +using namespace std; + +static const char *M = "[database_v1]"; + +TEST_CASE("unnamed category", M) { + const char *error = ""; + DatabasePtr db = Database::load(DBPATH "unnamed_category.xml", &error); + + CHECK(db.get() == 0); + REQUIRE(string(error) == "missing category name"); +} diff --git a/test/db/broken.xml b/test/db/broken.xml @@ -0,0 +1 @@ +<no_closing_tag> diff --git a/test/db/future_version.xml b/test/db/future_version.xml @@ -0,0 +1 @@ +<index version="999"></index> diff --git a/test/db/invalid_version.xml b/test/db/invalid_version.xml @@ -0,0 +1 @@ +<index version="one"></index> diff --git a/test/db/v1/unnamed_category.xml b/test/db/v1/unnamed_category.xml @@ -0,0 +1,3 @@ +<index version="1"> + <category /> +</index> diff --git a/test/db/wrong_root.xml b/test/db/wrong_root.xml @@ -0,0 +1 @@ +<test></test>