/* * Licensed under the GNU Lesser General Public License Version 3 * * 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 3 of the license, or * (at your option) any later version. * * This software 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 . */ // generated automatically - do not change module gio.Resource; private import gio.InputStream; private import gio.c.functions; public import gio.c.types; private import glib.Bytes; private import glib.ConstructionException; private import glib.ErrorG; private import glib.GException; private import glib.Str; private import gobject.ObjectG; /** * Applications and libraries often contain binary or textual data that is * really part of the application, rather than user data. For instance * #GtkBuilder .ui files, splashscreen images, GMenu markup XML, CSS files, * icons, etc. These are often shipped as files in `$datadir/appname`, or * manually included as literal strings in the code. * * The #GResource API and the [glib-compile-resources][glib-compile-resources] program * provide a convenient and efficient alternative to this which has some nice properties. You * maintain the files as normal files, so its easy to edit them, but during the build the files * are combined into a binary bundle that is linked into the executable. This means that loading * the resource files are efficient (as they are already in memory, shared with other instances) and * simple (no need to check for things like I/O errors or locate the files in the filesystem). It * also makes it easier to create relocatable applications. * * Resource files can also be marked as compressed. Such files will be included in the resource bundle * in a compressed form, but will be automatically uncompressed when the resource is used. This * is very useful e.g. for larger text files that are parsed once (or rarely) and then thrown away. * * Resource files can also be marked to be preprocessed, by setting the value of the * `preprocess` attribute to a comma-separated list of preprocessing options. * The only options currently supported are: * * `xml-stripblanks` which will use the xmllint command * to strip ignorable whitespace from the XML file. For this to work, * the `XMLLINT` environment variable must be set to the full path to * the xmllint executable, or xmllint must be in the `PATH`; otherwise * the preprocessing step is skipped. * * `to-pixdata` which will use the gdk-pixbuf-pixdata command to convert * images to the GdkPixdata format, which allows you to create pixbufs directly using the data inside * the resource file, rather than an (uncompressed) copy if it. For this, the gdk-pixbuf-pixdata * program must be in the PATH, or the `GDK_PIXBUF_PIXDATA` environment variable must be * set to the full path to the gdk-pixbuf-pixdata executable; otherwise the resource compiler will * abort. * * Resource bundles are created by the [glib-compile-resources][glib-compile-resources] program * which takes an XML file that describes the bundle, and a set of files that the XML references. These * are combined into a binary resource bundle. * * An example resource description: * |[ * * * * data/splashscreen.png * dialog.ui * menumarkup.xml * * * ]| * * This will create a resource bundle with the following files: * |[ * /org/gtk/Example/data/splashscreen.png * /org/gtk/Example/dialog.ui * /org/gtk/Example/menumarkup.xml * ]| * * Note that all resources in the process share the same namespace, so use Java-style * path prefixes (like in the above example) to avoid conflicts. * * You can then use [glib-compile-resources][glib-compile-resources] to compile the XML to a * binary bundle that you can load with g_resource_load(). However, its more common to use the --generate-source and * --generate-header arguments to create a source file and header to link directly into your application. * This will generate `get_resource()`, `register_resource()` and * `unregister_resource()` functions, prefixed by the `--c-name` argument passed * to [glib-compile-resources][glib-compile-resources]. `get_resource()` returns * the generated #GResource object. The register and unregister functions * register the resource so its files can be accessed using * g_resources_lookup_data(). * * Once a #GResource has been created and registered all the data in it can be accessed globally in the process by * using API calls like g_resources_open_stream() to stream the data or g_resources_lookup_data() to get a direct pointer * to the data. You can also use URIs like "resource:///org/gtk/Example/data/splashscreen.png" with #GFile to access * the resource data. * * There are two forms of the generated source, the default version uses the compiler support for constructor * and destructor functions (where available) to automatically create and register the #GResource on startup * or library load time. If you pass --manual-register two functions to register/unregister the resource is instead * created. This requires an explicit initialization call in your application/library, but it works on all platforms, * even on the minor ones where this is not available. (Constructor support is available for at least Win32, Mac OS and Linux.) * * Note that resource data can point directly into the data segment of e.g. a library, so if you are unloading libraries * during runtime you need to be very careful with keeping around pointers to data from a resource, as this goes away * when the library is unloaded. However, in practice this is not generally a problem, since most resource accesses * is for your own resources, and resource data is often used once, during parsing, and then released. * * Since: 2.32 */ public class Resource { /** the main Gtk struct */ protected GResource* gResource; protected bool ownedRef; /** Get the main Gtk struct */ public GResource* getResourceStruct(bool transferOwnership = false) { if (transferOwnership) ownedRef = false; return gResource; } /** the main Gtk struct as a void* */ protected void* getStruct() { return cast(void*)gResource; } /** * Sets our main struct and passes it to the parent class. */ public this (GResource* gResource, bool ownedRef = false) { this.gResource = gResource; this.ownedRef = ownedRef; } ~this () { if ( ownedRef ) g_resource_unref(gResource); } /** */ public static GType getType() { return g_resource_get_type(); } /** * Creates a GResource from a reference to the binary resource bundle. * This will keep a reference to @data while the resource lives, so * the data should not be modified or freed. * * If you want to use this resource in the global resource namespace you need * to register it with g_resources_register(). * * Params: * data = A #GBytes * * Returns: a new #GResource, or %NULL on error * * Since: 2.32 * * Throws: GException on failure. * Throws: ConstructionException GTK+ fails to create the object. */ public this(Bytes data) { GError* err = null; auto p = g_resource_new_from_data((data is null) ? null : data.getBytesStruct(), &err); if (err !is null) { throw new GException( new ErrorG(err) ); } if(p is null) { throw new ConstructionException("null returned by new_from_data"); } this(cast(GResource*) p); } /** * Registers the resource with the process-global set of resources. * Once a resource is registered the files in it can be accessed * with the global resource lookup functions like g_resources_lookup_data(). * * Params: * resource = A #GResource * * Since: 2.32 */ public static void register(Resource resource) { g_resources_register((resource is null) ? null : resource.getResourceStruct()); } /** * Unregisters the resource from the process-global set of resources. * * Params: * resource = A #GResource * * Since: 2.32 */ public static void unregister(Resource resource) { g_resources_unregister((resource is null) ? null : resource.getResourceStruct()); } /** * Returns all the names of children at the specified @path in the resource. * The return result is a %NULL terminated list of strings which should * be released with g_strfreev(). * * If @path is invalid or does not exist in the #GResource, * %G_RESOURCE_ERROR_NOT_FOUND will be returned. * * @lookup_flags controls the behaviour of the lookup. * * Params: * path = A pathname inside the resource * lookupFlags = A #GResourceLookupFlags * * Returns: an array of constant strings * * Since: 2.32 * * Throws: GException on failure. */ public string[] enumerateChildren(string path, GResourceLookupFlags lookupFlags) { GError* err = null; auto retStr = g_resource_enumerate_children(gResource, Str.toStringz(path), lookupFlags, &err); if (err !is null) { throw new GException( new ErrorG(err) ); } scope(exit) Str.freeStringArray(retStr); return Str.toStringArray(retStr); } /** * Looks for a file at the specified @path in the resource and * if found returns information about it. * * @lookup_flags controls the behaviour of the lookup. * * Params: * path = A pathname inside the resource * lookupFlags = A #GResourceLookupFlags * size = a location to place the length of the contents of the file, * or %NULL if the length is not needed * flags = a location to place the flags about the file, * or %NULL if the length is not needed * * Returns: %TRUE if the file was found. %FALSE if there were errors * * Since: 2.32 * * Throws: GException on failure. */ public bool getInfo(string path, GResourceLookupFlags lookupFlags, out size_t size, out uint flags) { GError* err = null; auto p = g_resource_get_info(gResource, Str.toStringz(path), lookupFlags, &size, &flags, &err) != 0; if (err !is null) { throw new GException( new ErrorG(err) ); } return p; } /** * Looks for a file at the specified @path in the resource and * returns a #GBytes that lets you directly access the data in * memory. * * The data is always followed by a zero byte, so you * can safely use the data as a C string. However, that byte * is not included in the size of the GBytes. * * For uncompressed resource files this is a pointer directly into * the resource bundle, which is typically in some readonly data section * in the program binary. For compressed files we allocate memory on * the heap and automatically uncompress the data. * * @lookup_flags controls the behaviour of the lookup. * * Params: * path = A pathname inside the resource * lookupFlags = A #GResourceLookupFlags * * Returns: #GBytes or %NULL on error. * Free the returned object with g_bytes_unref() * * Since: 2.32 * * Throws: GException on failure. */ public Bytes lookupData(string path, GResourceLookupFlags lookupFlags) { GError* err = null; auto p = g_resource_lookup_data(gResource, Str.toStringz(path), lookupFlags, &err); if (err !is null) { throw new GException( new ErrorG(err) ); } if(p is null) { return null; } return new Bytes(cast(GBytes*) p, true); } /** * Looks for a file at the specified @path in the resource and * returns a #GInputStream that lets you read the data. * * @lookup_flags controls the behaviour of the lookup. * * Params: * path = A pathname inside the resource * lookupFlags = A #GResourceLookupFlags * * Returns: #GInputStream or %NULL on error. * Free the returned object with g_object_unref() * * Since: 2.32 * * Throws: GException on failure. */ public InputStream openStream(string path, GResourceLookupFlags lookupFlags) { GError* err = null; auto p = g_resource_open_stream(gResource, Str.toStringz(path), lookupFlags, &err); if (err !is null) { throw new GException( new ErrorG(err) ); } if(p is null) { return null; } return ObjectG.getDObject!(InputStream)(cast(GInputStream*) p, true); } /** * Atomically increments the reference count of @resource by one. This * function is MT-safe and may be called from any thread. * * Returns: The passed in #GResource * * Since: 2.32 */ public Resource doref() { auto p = g_resource_ref(gResource); if(p is null) { return null; } return ObjectG.getDObject!(Resource)(cast(GResource*) p, true); } /** * Atomically decrements the reference count of @resource by one. If the * reference count drops to 0, all memory allocated by the resource is * released. This function is MT-safe and may be called from any * thread. * * Since: 2.32 */ public void unref() { g_resource_unref(gResource); } /** * Loads a binary resource bundle and creates a #GResource representation of it, allowing * you to query it for data. * * If you want to use this resource in the global resource namespace you need * to register it with g_resources_register(). * * Params: * filename = the path of a filename to load, in the GLib filename encoding * * Returns: a new #GResource, or %NULL on error * * Since: 2.32 * * Throws: GException on failure. */ public static Resource load(string filename) { GError* err = null; auto p = g_resource_load(Str.toStringz(filename), &err); if (err !is null) { throw new GException( new ErrorG(err) ); } if(p is null) { return null; } return ObjectG.getDObject!(Resource)(cast(GResource*) p, true); } /** * Returns all the names of children at the specified @path in the set of * globally registered resources. * The return result is a %NULL terminated list of strings which should * be released with g_strfreev(). * * @lookup_flags controls the behaviour of the lookup. * * Params: * path = A pathname inside the resource * lookupFlags = A #GResourceLookupFlags * * Returns: an array of constant strings * * Since: 2.32 * * Throws: GException on failure. */ public static string[] resourcesEnumerateChildren(string path, GResourceLookupFlags lookupFlags) { GError* err = null; auto retStr = g_resources_enumerate_children(Str.toStringz(path), lookupFlags, &err); if (err !is null) { throw new GException( new ErrorG(err) ); } scope(exit) Str.freeStringArray(retStr); return Str.toStringArray(retStr); } /** * Looks for a file at the specified @path in the set of * globally registered resources and if found returns information about it. * * @lookup_flags controls the behaviour of the lookup. * * Params: * path = A pathname inside the resource * lookupFlags = A #GResourceLookupFlags * size = a location to place the length of the contents of the file, * or %NULL if the length is not needed * flags = a location to place the flags about the file, * or %NULL if the length is not needed * * Returns: %TRUE if the file was found. %FALSE if there were errors * * Since: 2.32 * * Throws: GException on failure. */ public static bool resourcesGetInfo(string path, GResourceLookupFlags lookupFlags, out size_t size, out uint flags) { GError* err = null; auto p = g_resources_get_info(Str.toStringz(path), lookupFlags, &size, &flags, &err) != 0; if (err !is null) { throw new GException( new ErrorG(err) ); } return p; } /** * Looks for a file at the specified @path in the set of * globally registered resources and returns a #GBytes that * lets you directly access the data in memory. * * The data is always followed by a zero byte, so you * can safely use the data as a C string. However, that byte * is not included in the size of the GBytes. * * For uncompressed resource files this is a pointer directly into * the resource bundle, which is typically in some readonly data section * in the program binary. For compressed files we allocate memory on * the heap and automatically uncompress the data. * * @lookup_flags controls the behaviour of the lookup. * * Params: * path = A pathname inside the resource * lookupFlags = A #GResourceLookupFlags * * Returns: #GBytes or %NULL on error. * Free the returned object with g_bytes_unref() * * Since: 2.32 * * Throws: GException on failure. */ public static Bytes resourcesLookupData(string path, GResourceLookupFlags lookupFlags) { GError* err = null; auto p = g_resources_lookup_data(Str.toStringz(path), lookupFlags, &err); if (err !is null) { throw new GException( new ErrorG(err) ); } if(p is null) { return null; } return new Bytes(cast(GBytes*) p, true); } /** * Looks for a file at the specified @path in the set of * globally registered resources and returns a #GInputStream * that lets you read the data. * * @lookup_flags controls the behaviour of the lookup. * * Params: * path = A pathname inside the resource * lookupFlags = A #GResourceLookupFlags * * Returns: #GInputStream or %NULL on error. * Free the returned object with g_object_unref() * * Since: 2.32 * * Throws: GException on failure. */ public static InputStream resourcesOpenStream(string path, GResourceLookupFlags lookupFlags) { GError* err = null; auto p = g_resources_open_stream(Str.toStringz(path), lookupFlags, &err); if (err !is null) { throw new GException( new ErrorG(err) ); } if(p is null) { return null; } return ObjectG.getDObject!(InputStream)(cast(GInputStream*) p, true); } }