mirror of
https://github.com/Rockbox/rockbox.git
synced 2026-04-11 16:37:45 -04:00
openplugins -- import and export thru settings save / restore settings
saves openplugin entries to the config file for later import to the database lang_english_to_id() allows entries to be transfered between builds Change-Id: I47e01c5f75f8b0e69c203828e21759ef24bf125d
This commit is contained in:
parent
e75ffe5f72
commit
045d148697
4 changed files with 105 additions and 4 deletions
|
|
@ -27,6 +27,7 @@
|
|||
#include "splash.h"
|
||||
#include "lang.h"
|
||||
#include "filetypes.h"
|
||||
#include "language.h" /*lang_english_to_id*/
|
||||
|
||||
/* Define LOGF_ENABLE to enable logf output in this file */
|
||||
/*#define LOGF_ENABLE*/
|
||||
|
|
@ -520,4 +521,86 @@ void open_plugin_cache_flush(void)
|
|||
op_update_dat(op_entry, true);
|
||||
}
|
||||
|
||||
static bool op_entry_read(int fd, int selected_item, off_t data_sz, struct open_plugin_entry_t *op_entry)
|
||||
{
|
||||
op_clear_entry(op_entry);
|
||||
return ((selected_item >= 0) && (fd >= 0) &&
|
||||
(lseek(fd, selected_item * op_entry_sz, SEEK_SET) >= 0) &&
|
||||
(read(fd, op_entry, data_sz) == data_sz) && op_entry_checksum(op_entry) > 0);
|
||||
}
|
||||
|
||||
void open_plugin_import(char *strdat)
|
||||
{
|
||||
/* Note: Destroys strdat */
|
||||
char *vect[5];
|
||||
/* expected openplugin strdat: "englishid", "name", "path", "param" */
|
||||
|
||||
if (split_string(strdat, ',', vect, 5) == 4)
|
||||
{
|
||||
/* Space for 5 values so we will fail if excess arguments or too few */
|
||||
for(int i = 0; i < 4; i++)
|
||||
{
|
||||
vect[i] = skip_whitespace(vect[i]);
|
||||
int eos = ((int)strlen(vect[i]))-2;
|
||||
/* Failure if string is not quoted */
|
||||
if (vect[i][0] != '"' || eos < 0 || vect[i][eos + 1] != '"')
|
||||
{
|
||||
logf("%s[%d] error: quoted string expected\n", __func__, i);
|
||||
return;
|
||||
}
|
||||
vect[i]++; /* skip first " */
|
||||
vect[i][eos] = '\0'; /* skip other " */
|
||||
}
|
||||
char *key = vect[1];
|
||||
int lang_id = lang_english_to_id(vect[0]);
|
||||
if (lang_id >= 0)
|
||||
key = ID2P(lang_id);
|
||||
/* if key exists it will be overwritten */
|
||||
open_plugin_add_path(key, vect[2], vect[3]);
|
||||
return;
|
||||
}
|
||||
logf("%s error: importing entries", __func__);
|
||||
}
|
||||
|
||||
void open_plugin_export(int cfg_fd)
|
||||
{
|
||||
/* NOTE: assumes cfg_fd is valid */
|
||||
char *lang_name;
|
||||
int fd;
|
||||
int index = 0;
|
||||
|
||||
struct open_plugin_entry_t *op_entry = open_plugin_get_entry();
|
||||
/* if another entry is loaded; flush it to disk before we destroy it */
|
||||
op_update_dat(op_entry, true);
|
||||
|
||||
fd = open(OPEN_PLUGIN_DAT, O_RDONLY, 0666);
|
||||
|
||||
if (fd < 0)
|
||||
{
|
||||
logf("%s error: opening %s", __func__, OPEN_PLUGIN_DAT);
|
||||
return; /* OPEN_PLUGIN_NOT_FOUND */
|
||||
}
|
||||
while (op_entry_read(fd, index++, op_entry_sz, op_entry))
|
||||
{
|
||||
/* don't save the LANG_OPEN_PLUGIN entry -- it is for internal use */
|
||||
if (op_entry->lang_id == LANG_OPEN_PLUGIN)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (op_entry->lang_id >=0)
|
||||
lang_name = P2STR(ID2P(op_entry->lang_id));
|
||||
else
|
||||
lang_name = "[USER]"; /* needs to be an invalid lang string */
|
||||
|
||||
fdprintf(cfg_fd,"%s: \"%s\", \"%s\", \"%s\", \"%s\"\n",
|
||||
"openplugin", lang_name, op_entry->name, op_entry->path, op_entry->param);
|
||||
|
||||
logf("openplugin[%d]: \"%s\", \"%s\", \"%s\", \"%s\"\n lang id: %d hash: %x, csum: %x\n",
|
||||
index, lang_name, op_entry->name, op_entry->path, op_entry->param,
|
||||
op_entry->lang_id, op_entry->hash, op_entry->checksum);
|
||||
}
|
||||
close(fd);
|
||||
logf("%s exported %d entries", __func__, index);
|
||||
}
|
||||
|
||||
#endif /* ndef __PCTOOL__ */
|
||||
|
|
|
|||
|
|
@ -84,6 +84,8 @@ int open_plugin_load_entry(const char *key);
|
|||
void open_plugin_browse(const char *key);
|
||||
int open_plugin_run(const char *key);
|
||||
void open_plugin_cache_flush(void); /* flush to disk */
|
||||
void open_plugin_import(char *strdat);
|
||||
void open_plugin_export(int cfg_fd);
|
||||
#endif
|
||||
|
||||
#endif /*ndef __PCTOOL__ */
|
||||
|
|
|
|||
|
|
@ -293,11 +293,11 @@ bool copy_filename_setting(char *buf, size_t buflen, const char *input,
|
|||
return true;
|
||||
}
|
||||
|
||||
void string_to_cfg(const char *name, char* value, bool *theme_changed)
|
||||
bool string_to_cfg(const char *name, char* value, bool *theme_changed)
|
||||
{
|
||||
const struct settings_list *setting = find_setting_by_cfgname(name);
|
||||
if (!setting)
|
||||
return;
|
||||
return false;
|
||||
|
||||
uint32_t flags = setting->flags;
|
||||
|
||||
|
|
@ -366,6 +366,7 @@ void string_to_cfg(const char *name, char* value, bool *theme_changed)
|
|||
{
|
||||
logf("Error: %s: Not Found! [%s]\r\n",
|
||||
setting->cfg_name, value);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -394,6 +395,7 @@ void string_to_cfg(const char *name, char* value, bool *theme_changed)
|
|||
break;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool settings_load_config(const char* file, bool apply)
|
||||
|
|
@ -412,7 +414,15 @@ bool settings_load_config(const char* file, bool apply)
|
|||
char *name, *value;
|
||||
if (!settings_parseline(line, &name, &value))
|
||||
continue;
|
||||
string_to_cfg(name, value, &theme_changed);
|
||||
|
||||
if (!string_to_cfg(name, value, &theme_changed))
|
||||
{
|
||||
/* if we are here then name was not a valid setting */
|
||||
if (!strcmp(name, "openplugin"))
|
||||
{
|
||||
open_plugin_import(value);
|
||||
}
|
||||
}
|
||||
} /* while(...) */
|
||||
|
||||
close(fd);
|
||||
|
|
@ -630,6 +640,12 @@ static bool settings_write_config(const char* filename, int options)
|
|||
|
||||
fdprintf(fd,"%s: %s\r\n",setting->cfg_name,value);
|
||||
} /* for(...) */
|
||||
|
||||
if (options == SETTINGS_SAVE_ALL)
|
||||
{
|
||||
/* add openplugin entries to the open settings file */
|
||||
open_plugin_export(fd);
|
||||
}
|
||||
close(fd);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -308,7 +308,7 @@ const struct settings_list* find_setting_by_cfgname(const char* name);
|
|||
bool cfg_int_to_string(const struct settings_list *setting, int val, char* buf, int buf_len);
|
||||
bool cfg_string_to_int(const struct settings_list *setting, int* out, const char* str);
|
||||
void cfg_to_string(const struct settings_list *setting, char* buf, int buf_len);
|
||||
void string_to_cfg(const char *name, char* value, bool *theme_changed);
|
||||
bool string_to_cfg(const char *name, char* value, bool *theme_changed);
|
||||
|
||||
bool copy_filename_setting(char *buf, size_t buflen, const char *input,
|
||||
const struct filename_setting *fs);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue