lib: intro xdg_basedir
authorAlexis Laferrière <alexis.laf@xymus.net>
Fri, 11 Jul 2014 14:32:37 +0000 (10:32 -0400)
committerAlexis Laferrière <alexis.laf@xymus.net>
Mon, 14 Jul 2014 13:57:45 +0000 (09:57 -0400)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

lib/xdg_basedir/xdg_basedir.nit [new file with mode: 0644]

diff --git a/lib/xdg_basedir/xdg_basedir.nit b/lib/xdg_basedir/xdg_basedir.nit
new file mode 100644 (file)
index 0000000..c1ad485
--- /dev/null
@@ -0,0 +1,132 @@
+# This file is part of NIT (http://www.nitlanguage.org).
+#
+# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Services for using the XDG Base Directory specification
+#
+# This is a low-level module, it is meant to be wrapped by higher level services.
+#
+# For more information, refer to the documentation of the `libxdg-basedir`
+# project or the official specification at:
+# http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
+module xdg_basedir is pkgconfig("libxdg-basedir")
+
+in "C Header" `{
+       #include <basedir.h>
+`}
+
+# Handle to a local cache of XDG base directories
+extern class XdgBasedir `{ xdgHandle* `}
+
+       # Initialize a handle to an XDG data cache and initialize the cache.
+       new `{ return xdgInitHandle(NULL); `}
+
+       # Has this instance been correctly initialized?
+       fun is_valid: Bool do return not address_is_null
+
+       # Wipe handle of XDG data cache.
+       fun destroy `{ xdgWipeHandle(recv); `}
+
+       # Update the data cache.
+       #
+       # This should not be done frequently as it reallocates the cache.
+       # Even if updating the cache fails the handle remains valid and can
+       # be used to access XDG data as it was before `update` was called.
+       #
+       # Returns `true` if the update was successful.
+       fun update: Bool `{ return xdgUpdateData(recv); `}
+
+       # Base directory for user specific data files.
+       fun data_home: String import NativeString.to_s `{
+               return NativeString_to_s((char*)xdgDataHome(recv));
+       `}
+
+       # Base directory for user specific configuration files.
+       fun config_home: String import NativeString.to_s `{
+               return NativeString_to_s((char*)xdgConfigHome(recv));
+       `}
+
+       # Base directory for user specific non-essential data files.
+       fun cache_home: String import NativeString.to_s `{
+               return NativeString_to_s((char*)xdgCacheHome(recv));
+       `}
+
+       # Preference-ordered set of base directories to search for data files
+       # in addition to the $XDG_DATA_HOME base directory.
+       fun data_dirs: Array[String] do return native_data_dirs.to_string_array
+
+       private fun native_data_dirs: ConstPointer `{
+               return xdgDataDirectories(recv);
+       `}
+
+       # Preference-ordered set of base directories to search for data files
+       # with $XDG_DATA_HOME prepended.
+       #
+       # The base directory defined by $XDG_DATA_HOME is considered more
+       # important than any of the base directories defined by $XDG_DATA_DIRS.
+       fun searchable_data_dirs: Array[String]
+       do
+               return native_searchable_data_dirs.to_string_array
+       end
+
+       private fun native_searchable_data_dirs: ConstPointer `{
+               return xdgSearchableDataDirectories(recv);
+       `}
+
+       # Preference-ordered set of base directories to search for configuration
+       # files in addition to the $XDG_CONFIG_HOME base directory.
+       fun config_dirs: Array[String] do return native_config_dirs.to_string_array
+
+       private fun native_config_dirs: ConstPointer `{
+               return xdgConfigDirectories(recv);
+       `}
+
+       # Preference-ordered set of base directories to search for configuration
+       # files with $XDG_CONFIG_HOME prepended.
+       #
+       # The base directory defined by $XDG_CONFIG_HOME is considered more
+       # important than any of the base directories defined by $XDG_CONFIG_DIRS.
+       fun searchable_config_dirs: Array[String]
+       do
+               return native_searchable_config_dirs.to_string_array
+       end
+
+       private fun native_searchable_config_dirs: ConstPointer `{
+               return xdgSearchableConfigDirectories(recv);
+       `}
+end
+
+private extern class ConstPointer `{ const void * `}
+       # Convert a C `char **` to a Nit `Array[String]`
+       private fun to_string_array: Array[String]
+       import Array[String], Array[String].add, NativeString.to_s `{
+               char **strings = (char**)recv;
+
+               Array_of_String aos = new_Array_of_String();
+               int p = 0;
+               while (strings[p] != NULL) {
+                       Array_of_String_add(aos, NativeString_to_s((char*)strings[p]));
+                       p ++;
+               }
+
+               return aos;
+       `}
+end
+
+# Version of XDG Base Directory specification implemented in this library.
+fun xdg_basedir_spec: Float `{ return XDG_BASEDIR_SPEC; `}
+
+# Get an instance of XdgBasedir
+fun xdg_basedir: XdgBasedir do return once new XdgBasedir