summaryrefslogtreecommitdiff
path: root/plugingui
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2015-11-13 19:21:31 +0100
committerBent Bisballe Nyeng <deva@aasimon.org>2015-11-13 19:21:31 +0100
commitbfdb184d349d2b8ecf4ea993793182cb32098e12 (patch)
tree40bbf053556453f8f3de87f69c3aae0a6a87f57f /plugingui
parentca384e485956059d5d427fbe07a7b2277c43680e (diff)
Refactored Resource and added unittests.
Diffstat (limited to 'plugingui')
-rw-r--r--plugingui/resource.cc173
-rw-r--r--plugingui/resource.h27
-rw-r--r--plugingui/resource_data.h5
3 files changed, 112 insertions, 93 deletions
diff --git a/plugingui/resource.cc b/plugingui/resource.cc
index 80bd51e..c0248c3 100644
--- a/plugingui/resource.cc
+++ b/plugingui/resource.cc
@@ -26,94 +26,119 @@
*/
#include "resource.h"
-#include <stdio.h>
#include <hugin.hpp>
+#include <cstdio>
+
+// rcgen generated file containing rc_data declaration.
#include "resource_data.h"
-GUI::Resource::Resource(std::string name)
+namespace GUI {
+
+// Internal resources start with a colon.
+static bool nameIsInternal(const std::string& name)
+{
+ return name.size() && (name[0] == ':');
+}
+
+Resource::Resource(const std::string& name)
{
- is_valid = false;
- is_internal = false;
-
- if(name.length() == 0) return;
- if(name[0] == ':') {
- i_data = NULL;
- i_size = 0;
-
- // Use internal resource:
- const rc_data_t *p = rc_data;
- while(p->name[0] == ':') {
- if(std::string(p->name) == name) {
- i_data = p->data;
- i_size = p->size;
- break;
- }
- p++;
- }
-
- // We did not find the named resource.
- if(i_data == NULL) {
- ERR(rc, "Could not find '%s'\n", name.c_str());
- return;
- }
-
- is_internal = true;
- } else {
- // Read from file:
- FILE *fp = fopen(name.c_str(), "r");
- if(!fp) return;
- char buf[32];
- while(!feof(fp)) {
- size_t sz = fread(buf, 1, sizeof(buf), fp);
- e_data.append(buf, sz);
- }
- fclose(fp);
- is_internal = false;
+ if(nameIsInternal(name))
+ {
+ // Use internal resource:
+
+ // Find internal resource in rc_data.
+ const rc_data_t* p = rc_data;
+ while(p->name) // last entry in rc_data has the name := ""
+ {
+ if(name == p->name)
+ {
+ internalData = p->data;
+ internalSize = p->size;
+ break;
+ }
+ ++p;
+ }
+
+ // We did not find the named resource.
+ if(internalData == nullptr)
+ {
+ ERR(rc, "Could not find '%s'\n", name.c_str());
+ return;
+ }
+
+ isInternal = true;
+ }
+ else
+ {
+ // Read from file:
+ std::FILE *fp = std::fopen(name.c_str(), "rb");
+ if(!fp)
+ {
+ return;
+ }
+
+ // Get the file size
+ std::fseek(fp, 0, SEEK_END);
+ size_t filesize = ftell(fp);
+
+ // Reserve space in the string for the data.
+ externalData.reserve(filesize);
+
+ // Rewind and read...
+ std::rewind(fp);
+
+ char buffer[32];
+ while(!std::feof(fp))
+ {
+ size_t size = std::fread(buffer, 1, sizeof(buffer), fp);
+ externalData.append(buffer, size);
+ }
+
+ std::fclose(fp);
+
+ isInternal = false;
}
- is_valid = true;
+ isValid = true;
}
-const char *GUI::Resource::data()
+const char *Resource::data()
{
- if(is_valid == false) return NULL;
- if(is_internal) {
- return i_data;
- } else {
- return e_data.data();
- }
- return NULL;
+ if(isValid == false)
+ {
+ return nullptr;
+ }
+
+ if(isInternal)
+ {
+ return internalData;
+ }
+ else
+ {
+ return externalData.data();
+ }
}
-size_t GUI::Resource::size()
+size_t Resource::size()
{
- if(is_valid == false) return 0;
- if(is_internal) {
- return i_size;
- } else {
- return e_data.length();
- }
- return 0;
+ if(isValid == false)
+ {
+ return 0;
+ }
+
+ if(isInternal)
+ {
+ return internalSize;
+ }
+ else
+ {
+ return externalData.length();
+ }
}
-bool GUI::Resource::valid()
+bool Resource::valid()
{
- return is_valid;
+ return isValid;
}
-#ifdef TEST_RESOURCE
-//Additional dependency files
-//deps:
-//Required cflags (autoconf vars may be used)
-//cflags:
-//Required link options (autoconf vars may be used)
-//libs:
-#include "test.h"
-
-TEST_BEGIN;
-
-// TODO: Put some testcode here (see test.h for usable macros).
-
-TEST_END;
-
-#endif/*TEST_RESOURCE*/
+} // GUI::
diff --git a/plugingui/resource.h b/plugingui/resource.h
index 4b494f7..101c689 100644
--- a/plugingui/resource.h
+++ b/plugingui/resource.h
@@ -24,8 +24,7 @@
* along with DrumGizmo; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-#ifndef __DRUMGIZMO_RESOURCE_H__
-#define __DRUMGIZMO_RESOURCE_H__
+#pragma once
#include <string>
@@ -33,21 +32,19 @@ namespace GUI {
class Resource {
public:
- Resource(std::string name);
+ Resource(const std::string& name);
- const char *data();
- size_t size();
+ const char* data();
+ size_t size();
- bool valid();
+ bool valid();
-private:
- std::string e_data;
- bool is_valid;
- bool is_internal;
- const char *i_data;
- size_t i_size;
+protected:
+ std::string externalData;
+ bool isValid = false;
+ bool isInternal = false;
+ const char *internalData = nullptr;
+ size_t internalSize = 0;
};
-};
-
-#endif/*__DRUMGIZMO_RESOURCE_H__*/
+} // GUI::
diff --git a/plugingui/resource_data.h b/plugingui/resource_data.h
index c81c6cc..5d6392f 100644
--- a/plugingui/resource_data.h
+++ b/plugingui/resource_data.h
@@ -24,8 +24,7 @@
* along with DrumGizmo; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-#ifndef __DRUMGIZMO_RESOURCE_DATA_H__
-#define __DRUMGIZMO_RESOURCE_DATA_H__
+#pragma once
typedef struct {
const char *name;
@@ -34,5 +33,3 @@ typedef struct {
} rc_data_t;
extern const rc_data_t rc_data[];
-
-#endif/*__DRUMGIZMO_RESOURCE_DATA_H__*/