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:
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>