summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2004-07-21 13:46:42 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2004-07-21 13:46:42 +0000
commit897fb63ec8ac9b18add6a61e46807309a28668b0 (patch)
tree59e09fa3c8bfc5da8d50f0571cf7be72e099eff2
parentd1df184f0f74ed201614b17ea1d1d67cffe5773b (diff)
New plugin library framework for loading and saving .cfg files
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4912 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/plugins/lib/configfile.c108
-rw-r--r--apps/plugins/lib/configfile.h44
2 files changed, 152 insertions, 0 deletions
diff --git a/apps/plugins/lib/configfile.c b/apps/plugins/lib/configfile.c
new file mode 100644
index 0000000000..ffa325038c
--- /dev/null
+++ b/apps/plugins/lib/configfile.c
@@ -0,0 +1,108 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 Linus Nielsen Feltzing
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include "plugin.h"
+#include "configfile.h"
+
+static struct plugin_api *cfg_rb;
+
+void configfile_init(struct plugin_api* newrb)
+{
+ cfg_rb = newrb;
+}
+
+int configfile_save(char *filename, struct configdata *cfg, int num_items)
+{
+ int fd;
+ int i;
+ char buf[MAX_PATH];
+
+ cfg_rb->snprintf(buf, MAX_PATH, "/.rockbox/rocks/%s", filename);
+ fd = cfg_rb->creat(buf, 0);
+ if(fd < 0)
+ return fd*10 - 1;
+
+ for(i = 0;i < num_items;i++) {
+ switch(cfg[i].type) {
+ case TYPE_INT:
+ cfg_rb->fprintf(fd, "%s: %d\n",
+ cfg[i].name,
+ *cfg[i].val);
+ break;
+
+ case TYPE_ENUM:
+ cfg_rb->fprintf(fd, "%s: %s\n",
+ cfg[i].name,
+ cfg[i].values[*cfg[i].val]);
+ break;
+
+ case TYPE_STRING:
+ cfg_rb->fprintf(fd, "%s: %s\n",
+ cfg[i].name,
+ cfg[i].string);
+ break;
+
+ }
+ }
+
+ cfg_rb->close(fd);
+ return 0;
+}
+
+int configfile_load(char *filename, struct configdata *cfg, int num_items)
+{
+ int fd;
+ int i, j;
+ char *name;
+ char *val;
+ char buf[MAX_PATH];
+
+ cfg_rb->snprintf(buf, MAX_PATH, "/.rockbox/rocks/%s", filename);
+ fd = cfg_rb->open(buf, O_RDONLY);
+ if(fd < 0)
+ return fd*10 - 1;
+
+ while(cfg_rb->read_line(fd, buf, MAX_PATH) > 0) {
+ cfg_rb->settings_parseline(buf, &name, &val);
+
+ for(i = 0;i < num_items;i++) {
+ if(!cfg_rb->strcmp(cfg[i].name, name)) {
+ switch(cfg[i].type) {
+ case TYPE_INT:
+ *cfg[i].val = cfg_rb->atoi(val);
+ break;
+
+ case TYPE_ENUM:
+ for(j = 0;j < cfg[i].max;j++) {
+ if(!cfg_rb->strcmp(cfg[i].values[j], val)) {
+ *cfg[i].val = j;
+ }
+ }
+ break;
+
+ case TYPE_STRING:
+ cfg_rb->strncpy(cfg[i].string, val, cfg[i].max);
+ break;
+ }
+ }
+ }
+ }
+
+ cfg_rb->close(fd);
+ return 0;
+}
diff --git a/apps/plugins/lib/configfile.h b/apps/plugins/lib/configfile.h
new file mode 100644
index 0000000000..78cc8b1b6c
--- /dev/null
+++ b/apps/plugins/lib/configfile.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 Linus Nielsen Feltzing
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#ifndef CONFIGFILE_H
+#define CONFIGFILE_H
+
+#define TYPE_INT 1
+#define TYPE_ENUM 2
+#define TYPE_STRING 3
+
+struct configdata
+{
+ int type; /* See TYPE_ macros above */
+ int min; /* Min value for integers, should be 0 for enums */
+ int max; /* Max value for enums and integers,
+ buffer size for strings */
+ int *val; /* Pointer to integer/enum value,
+ NULL if the item is a string */
+ char *name; /* Pointer to the name of the item */
+ char **values; /* List of strings for enums, NULL if not enum */
+ char *string; /* Pointer to a string buffer if the item is a string,
+ NULL otherwise */
+};
+
+void configfile_init(struct plugin_api* newrb);
+int configfile_save(char *filename, struct configdata *cfg, int num_items);
+int configfile_load(char *filename, struct configdata *cfg, int num_items);
+
+#endif