[libbluray-devel] Updated system directory utils and moved function definitions from file.h to dirs.h
hpi1
git at videolan.org
Fri Nov 15 08:59:53 CET 2013
libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Fri Nov 15 09:49:44 2013 +0200| [33501aa84d92c0447af8a1099aa4461c492291a8] | committer: hpi1
Updated system directory utils and moved function definitions from file.h to dirs.h
> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=33501aa84d92c0447af8a1099aa4461c492291a8
---
src/Makefile.am | 1 +
src/file/dirs.h | 38 +++++++++++++++++++++++++++
src/file/dirs_darwin.c | 44 ++++++++++++++++++++++++++++++++
src/file/dirs_win32.c | 46 +++++++++++++++++++++++++++++++--
src/file/dirs_xdg.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++-
src/file/file.h | 7 -----
src/libbluray/bdj/bdj.c | 2 +-
7 files changed, 192 insertions(+), 11 deletions(-)
diff --git a/src/Makefile.am b/src/Makefile.am
index 8fd3a8c..ed45f31 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -71,6 +71,7 @@ libbluray_la_SOURCES = \
libbluray/hdmv/mobj_print.c \
file/file.h \
file/file_posix.c \
+ file/dirs.h \
file/dl.h \
file/filesystem.h \
file/filesystem.c \
diff --git a/src/file/dirs.h b/src/file/dirs.h
new file mode 100644
index 0000000..bb098af
--- /dev/null
+++ b/src/file/dirs.h
@@ -0,0 +1,38 @@
+/*
+ * This file is part of libbluray
+ * Copyright (C) 2011-2013 VideoLAN
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BLURAY_DIRS_H
+#define BLURAY_DIRS_H
+
+#include <util/attributes.h>
+
+#ifdef _WIN32
+BD_PRIVATE int win32_mkdir(const char *dir);
+#endif
+
+/*
+ * Config, cache and data dirs
+ */
+
+BD_PRIVATE const char *file_get_config_home(void);
+BD_PRIVATE const char *file_get_config_system(const char *dir);
+BD_PRIVATE const char *file_get_cache_home(void);
+BD_PRIVATE const char *file_get_data_home(void);
+
+#endif
diff --git a/src/file/dirs_darwin.c b/src/file/dirs_darwin.c
index fe4dc6b..851fc0d 100644
--- a/src/file/dirs_darwin.c
+++ b/src/file/dirs_darwin.c
@@ -32,10 +32,31 @@
#include "util/strutl.h"
#include "util/logging.h"
+#define USER_CFG_DIR "Library/Preferences"
#define USER_CACHE_DIR "Library/Caches"
#define USER_DATA_DIR "Library"
+#define SYSTEM_CFG_DIR "/Library/Preferences"
+const char *file_get_config_home(void)
+{
+ static char *dir = NULL;
+ static int init_done = 0;
+
+ if (!init_done) {
+ init_done = 1;
+
+ const char *user_home = getenv("HOME");
+ if (user_home && *user_home) {
+ return dir = str_printf("%s/%s", user_home, USER_CFG_DIR);
+ }
+
+ BD_DEBUG(DBG_FILE, "Can't find user home directory ($HOME) !\n");
+ }
+
+ return dir;
+}
+
const char *file_get_data_home(void)
{
static char *dir = NULL;
@@ -73,3 +94,26 @@ const char *file_get_cache_home(void)
return dir;
}
+
+const char *file_get_config_system(const char *dir)
+{
+ static char *dirs = NULL; // "dir1\0dir2\0...\0dirN\0\0"
+
+ if (!dirs) {
+ dirs = str_printf("%s%c%c", SYSTEM_CFG_DIR, 0, 0);
+ }
+
+ if (!dir) {
+ // first call
+ dir = dirs;
+ } else {
+ // next call
+ dir += strlen(dir) + 1;
+ if (!*dir) {
+ // end of list
+ dir = NULL;
+ }
+ }
+
+ return dir;
+}
diff --git a/src/file/dirs_win32.c b/src/file/dirs_win32.c
index 0ae832e..c34d5a2 100644
--- a/src/file/dirs_win32.c
+++ b/src/file/dirs_win32.c
@@ -21,10 +21,9 @@
# include "config.h"
#endif
-#include "file.h"
+#include "dirs.h"
#include "util/logging.h"
-#include "util/macro.h"
#include <stdio.h>
#include <string.h>
@@ -35,6 +34,19 @@
#include <direct.h>
+int win32_mkdir(const char *dir)
+{
+ wchar_t wdir[MAX_PATH];
+
+ MultiByteToWideChar(CP_UTF8, 0, dir, -1, wdir, MAX_PATH);
+ return _wmkdir(wdir);
+}
+
+const char *file_get_config_home(void)
+{
+ return file_get_data_home();
+}
+
const char *file_get_data_home(void)
{
static char *appdir = NULL;
@@ -60,3 +72,33 @@ const char *file_get_cache_home(void)
{
return file_get_data_home();
}
+
+const char *file_get_config_system(const char *dir)
+{
+ static char *appdir = NULL;
+ wchar_t wdir[MAX_PATH];
+
+ if (!dir) {
+ // first call
+
+ if (*appdir)
+ return appdir;
+
+ /* Get the "Application Data" folder for all users */
+ if (S_OK == SHGetFolderPathW(NULL, CSIDL_COMMON_APPDATA | CSIDL_FLAG_CREATE,
+ NULL, SHGFP_TYPE_CURRENT, wdir)) {
+ int len = WideCharToMultiByte (CP_UTF8, 0, wdir, -1, NULL, 0, NULL, NULL);
+ appdir = malloc(len);
+ WideCharToMultiByte (CP_UTF8, 0, wdir, -1, appdir, len, NULL, NULL);
+ return appdir;
+ } else {
+ BD_DEBUG(DBG_FILE, "Can't find common configuration directory !\n");
+ return NULL;
+ }
+ } else {
+ // next call
+ return NULL;
+ }
+
+ return dir;
+}
diff --git a/src/file/dirs_xdg.c b/src/file/dirs_xdg.c
index 7a41ece..df5d81b 100644
--- a/src/file/dirs_xdg.c
+++ b/src/file/dirs_xdg.c
@@ -21,7 +21,7 @@
# include "config.h"
#endif
-#include "file.h"
+#include "dirs.h"
#include "util/strutl.h"
#include "util/logging.h"
@@ -35,10 +35,36 @@
* http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
*/
+#define USER_CFG_DIR ".config"
#define USER_CACHE_DIR ".cache"
#define USER_DATA_DIR ".local/share"
+#define SYSTEM_CFG_DIR "/etc/xdg"
+const char *file_get_config_home(void)
+{
+ static char *dir = NULL;
+ static int init_done = 0;
+
+ if (!init_done) {
+ init_done = 1;
+
+ const char *xdg_home = getenv("XDG_CONFIG_HOME");
+ if (xdg_home && *xdg_home) {
+ return dir = str_printf("%s", xdg_home);
+ }
+
+ const char *user_home = getenv("HOME");
+ if (user_home && *user_home) {
+ return dir = str_printf("%s/%s", user_home, USER_CFG_DIR);
+ }
+
+ BD_DEBUG(DBG_FILE, "Can't find user home directory ($HOME) !\n");
+ }
+
+ return dir;
+}
+
const char *file_get_data_home(void)
{
static char *dir = NULL;
@@ -86,3 +112,40 @@ const char *file_get_cache_home(void)
return dir;
}
+
+const char *file_get_config_system(const char *dir)
+{
+ static char *dirs = NULL; // "dir1\0dir2\0...\0dirN\0\0"
+
+ if (!dirs) {
+ const char *xdg_sys = getenv("XDG_CONFIG_DIRS");
+
+ if (xdg_sys && *xdg_sys) {
+
+ dirs = calloc(1, strlen(xdg_sys) + 2);
+ strcpy(dirs, xdg_sys);
+
+ char *pt = dirs;
+ while (NULL != (pt = strchr(pt, ':'))) {
+ *pt++ = 0;
+ }
+
+ } else {
+ dirs = str_printf("%s%c%c", SYSTEM_CFG_DIR, 0, 0);
+ }
+ }
+
+ if (!dir) {
+ // first call
+ dir = dirs;
+ } else {
+ // next call
+ dir += strlen(dir) + 1;
+ if (!*dir) {
+ // end of list
+ dir = NULL;
+ }
+ }
+
+ return dir;
+}
diff --git a/src/file/file.h b/src/file/file.h
index 080485b..5ee8c01 100644
--- a/src/file/file.h
+++ b/src/file/file.h
@@ -55,11 +55,4 @@ BD_PRIVATE BD_FILE_OPEN file_open_default(void);
BD_PRIVATE extern BD_DIR_H* (*dir_open)(const char* dirname);
-/*
- * User cache and data dirs
- */
-
-BD_PRIVATE const char *file_get_data_home(void);
-BD_PRIVATE const char *file_get_cache_home(void);
-
#endif /* FILE_H_ */
diff --git a/src/libbluray/bdj/bdj.c b/src/libbluray/bdj/bdj.c
index ccb4fe3..d60d6fc 100644
--- a/src/libbluray/bdj/bdj.c
+++ b/src/libbluray/bdj/bdj.c
@@ -29,7 +29,7 @@
#include "bdj_util.h"
#include "common.h"
#include "libbluray/register.h"
-#include "file/file.h"
+#include "file/dirs.h"
#include "file/dl.h"
#include "util/strutl.h"
#include "util/macro.h"
More information about the libbluray-devel
mailing list