diff options
Diffstat (limited to 'glib/src/miscutils.hg')
-rw-r--r-- | glib/src/miscutils.hg | 501 |
1 files changed, 501 insertions, 0 deletions
diff --git a/glib/src/miscutils.hg b/glib/src/miscutils.hg new file mode 100644 index 00000000..f4833f56 --- /dev/null +++ b/glib/src/miscutils.hg @@ -0,0 +1,501 @@ +/* Copyright (C) 2002 The gtkmm Development Team + * + * 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, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +_DEFS(glibmm,glib) + +#include <glibmm/arrayhandle.h> +#include <glibmm/ustring.h> + +namespace Glib +{ +_WRAP_ENUM(UserDirectory, GUserDirectory, NO_GTYPE) +_WRAP_ENUM(FormatSizeFlags, GFormatSizeFlags, NO_GTYPE) + +/** @defgroup MiscUtils Miscellaneous Utility Functions + * Miscellaneous Utility Functions -- a selection of portable utility functions. + * @{ + */ + +/** Gets a human-readable name for the application, + * as set by Glib::set_application_name(). + * This name should be localized if possible, and is intended for display to + * the user. Contrast with Glib::get_prgname(), which gets a non-localized + * name. If Glib::set_application_name() has not been called, returns the + * result of Glib::get_prgname() (which may be empty if Glib::set_prgname() + * has also not been called). + * + * @return Human-readable application name. May return <tt>""</tt>. + */ +Glib::ustring get_application_name(); + +/** Sets a human-readable name for the application. + * This name should be localized if possible, and is intended for display to + * the user. Contrast with Glib::set_prgname(), which sets a non-localized + * name. Glib::set_prgname() will be called automatically by + * <tt>gtk_init()</tt>, but Glib::set_application_name() will not. + * + * Note that for thread safety reasons, this function can only be called once. + * + * The application name will be used in contexts such as error messages, + * or when displaying an application's name in the task list. + * + * @param application_name Localized name of the application. + */ +void set_application_name(const Glib::ustring& application_name); + +/** Gets the name of the program. + * If you are using GDK or GTK+ the program name is set in <tt>gdk_init()</tt>, + * which is called by <tt>gtk_init()</tt>. The program name is found by taking + * the last component of <tt>argv[0]</tt>. + * @return The name of the program. + */ +std::string get_prgname(); + +/** Sets the name of the program. + * @param prgname The name of the program. + */ +void set_prgname(const std::string& prgname); + +/** Returns the value of an environment variable. The name and value + * are in the GLib file name encoding. On Unix, this means the actual + * bytes which might or might not be in some consistent character set + * and encoding. On Windows, it is in UTF-8. On Windows, in case the + * environment variable's value contains references to other + * environment variables, they are expanded. + * + * @param variable The environment variable to get. + * @param[out] found Whether the environment variable has been found. + * @return The value of the environment variable, or <tt>""</tt> if not found. + */ +std::string getenv(const std::string& variable, bool& found); + +/** Returns the value of an environment variable. The name and value + * are in the GLib file name encoding. On Unix, this means the actual + * bytes which might or might not be in some consistent character set + * and encoding. On Windows, it is in UTF-8. On Windows, in case the + * environment variable's value contains references to other + * environment variables, they are expanded. + * + * @param variable The environment variable to get. + * @return The value of the environment variable, or <tt>""</tt> if not found. + */ +std::string getenv(const std::string& variable); + + +/** Sets an environment variable. Both the variable's name and value + * should be in the GLib file name encoding. On Unix, this means that + * they can be any sequence of bytes. On Windows, they should be in + * UTF-8. + * + * Note that on some systems, when variables are overwritten, the memory + * used for the previous variables and its value isn't reclaimed. + * + * @param variable The environment variable to set. It must not contain '='. + * @param value The value to which the variable should be set. + * @param overwrite Whether to change the variable if it already exists. + * @result false if the environment variable couldn't be set. + */ +bool setenv(const std::string& variable, const std::string& value, bool overwrite = true); + +/** Removes an environment variable from the environment. + * + * Note that on some systems, when variables are overwritten, the memory + * used for the previous variables and its value isn't reclaimed. + * Furthermore, this function can't be guaranteed to operate in a + * threadsafe way. + * + * @param variable: the environment variable to remove. It must not contain '='. + **/ +void unsetenv(const std::string& variable); + +/** Gets the names of all variables set in the environment. + * + * Programs that want to be portable to Windows should typically use this + * function and getenv() instead of using the environ array from the C library + * directly. On Windows, the strings in the environ array are in system + * codepage encoding, while in most of the typical use cases for environment + * variables in GLib-using programs you want the UTF-8 encoding that this + * function and getenv() provide. + * + * @return Array of environment names (The generic ArrayHandle will be + * implicitly converted to any STL compatible container type). + */ +Glib::ArrayHandle<std::string> listenv(); + +/** Gets the user name of the current user. + * @return The name of the current user. + */ +std::string get_user_name(); + +/** Gets the real name of the user. + * This usually comes from the user's entry in the <tt>passwd</tt> file. + * @return The user's real name. + */ +std::string get_real_name(); + +/** Gets the current user's home directory. + * @return The current user's home directory or an empty string if not defined. + */ +std::string get_home_dir(); + +/** Gets the directory to use for temporary files. + * This is found from inspecting the environment variables <tt>TMPDIR</tt>, + * <tt>TMP</tt>, and <tt>TEMP</tt> in that order. If none of those are defined + * <tt>"/tmp"</tt> is returned on UNIX and <tt>"C:\\"</tt> on Windows. + * @return The directory to use for temporary files. + */ +std::string get_tmp_dir(); + +/** Gets the current directory. + * @return The current directory. + */ +std::string get_current_dir(); + +#ifndef GLIBMM_DISABLE_DEPRECATED +/** Returns the full path of a special directory using its logical id. + * + * On Unix this is done using the XDG special user directories. + * For compatibility with existing practise, G_USER_DIRECTORY_DESKTOP + * falls back to `$HOME/Desktop` when XDG special user directories have + * not been set up. + * + * Depending on the platform, the user might be able to change the path + * of the special directory without requiring the session to restart; GLib + * will not reflect any change once the special directories are loaded. + * + * @param directory The logical id of special directory. + * @return The path to the specified special directory, or an empty string + * if the logical id was not found. + * + * @newin{2,14} + * @deprecated Use get_user_special_dir(Glib::UserDirectory directory) instead. + */ +std::string get_user_special_dir(GUserDirectory directory); +#endif // GLIBMM_DISABLE_DEPRECATED + +/** Returns the full path of a special directory using its logical id. + * + * On Unix this is done using the XDG special user directories. + * For compatibility with existing practise, Glib::USER_DIRECTORY_DESKTOP + * falls back to `$HOME/Desktop` when XDG special user directories have + * not been set up. + * + * Depending on the platform, the user might be able to change the path + * of the special directory without requiring the session to restart; GLib + * will not reflect any change once the special directories are loaded. + * + * @param directory The logical id of special directory. + * @return The path to the specified special directory, or an empty string + * if the logical id was not found. + * + * @newin{2,46} + */ +std::string get_user_special_dir(UserDirectory directory); + +/** Returns a base directory in which to access application data such as icons + * that is customized for a particular user. + * + * On UNIX platforms this is determined using the mechanisms described in the + * XDG Base Directory Specification + * + * @newin{2,14} + */ +std::string get_user_data_dir(); + +/** Returns a base directory in which to store user-specific application + * configuration information such as user preferences and settings. + * + * On UNIX platforms this is determined using the mechanisms described in the + * XDG Base Directory Specification + * + * @newin{2,14} + */ +std::string get_user_config_dir(); + +/** Returns an ordered list of base directories in which to access system-wide application data. + * On Unix platforms this is determined using the mechanisms described in the XDG Base Directory Specification. + * + * @newin{2,18} + */ +std::vector<std::string> get_system_data_dirs(); + +/** Returns an ordered list of base directories in which to access system-wide configuration information. + * On Unix platforms this is determined using the mechanisms described in the XDG Base Directory Specification. + * + * @newin{2,18} + */ +std::vector<std::string> get_system_config_dirs(); + +/** Returns a base directory in which to store non-essential, cached data + * specific to particular user. + * + * On UNIX platforms this is determined using the mechanisms described in the + * XDG Base Directory Specification + * + * @newin{2,14} + */ +std::string get_user_cache_dir(); + +/** Returns @c true if the given @a filename is an absolute file name, i.e.\ it + * contains a full path from the root directory such as <tt>"/usr/local"</tt> + * on UNIX or <tt>"C:\\windows"</tt> on Windows systems. + * @param filename A file name. + * @return Whether @a filename is an absolute path. + */ +bool path_is_absolute(const std::string& filename); + +/** Returns the remaining part of @a filename after the root component, + * i.e.\ after the <tt>"/"</tt> on UNIX or <tt>"C:\\"</tt> on Windows. + * If @a filename is not an absolute path, <tt>""</tt> will be returned. + * @param filename A file name. + * @return The file name without the root component, or <tt>""</tt>. + */ +std::string path_skip_root(const std::string& filename); + +/** Gets the name of the file without any leading directory components. + * @param filename The name of the file. + * @return The name of the file without any leading directory components. + */ +std::string path_get_basename(const std::string& filename); + +/** Gets the directory components of a file name. + * If the file name has no directory components <tt>"."</tt> is returned. + * @param filename The name of the file. + * @return The directory components of the file. + */ +std::string path_get_dirname(const std::string& filename); + +/** Creates a filename from a series of elements using the correct + * separator for filenames. + * This function behaves identically to Glib::build_path(G_DIR_SEPARATOR_S, + * elements). No attempt is made to force the resulting filename to be an + * absolute path. If the first element is a relative path, the result will + * be a relative path. + * @param elements A container holding the elements of the path to build. + * Any STL compatible container type is accepted. + * @return The resulting path. + */ +std::string build_filename(const Glib::ArrayHandle<std::string>& elements); + +/** Creates a filename from two elements using the correct separator for filenames. + * No attempt is made to force the resulting filename to be an absolute path. + * If the first element is a relative path, the result will be a relative path. + * @param elem1 First path element. + * @param elem2 Second path element. + * @return The resulting path. + */ +std::string build_filename(const std::string& elem1, const std::string& elem2); + +/** Creates a filename from three elements using the correct separator for filenames. + * No attempt is made to force the resulting filename to be an absolute path. + * If the first element is a relative path, the result will be a relative path. + * @param elem1 First path element. + * @param elem2 Second path element. + * @param elem3 Third path element. + * @return The resulting path. + * + * @newin{2,28} + */ +std::string build_filename(const std::string& elem1, const std::string& elem2, + const std::string& elem3); + + +/** Creates a filename from four elements using the correct separator for filenames. + * No attempt is made to force the resulting filename to be an absolute path. + * If the first element is a relative path, the result will be a relative path. + * @param elem1 First path element. + * @param elem2 Second path element. + * @param elem3 Third path element. + * @param elem4 Fourth path element. + * @return The resulting path. + * + * @newin{2,28} + */ +std::string build_filename(const std::string& elem1, const std::string& elem2, + const std::string& elem3, const std::string& elem4); + +/** Creates a filename from five elements using the correct separator for filenames. + * No attempt is made to force the resulting filename to be an absolute path. + * If the first element is a relative path, the result will be a relative path. + * @param elem1 First path element. + * @param elem2 Second path element. + * @param elem3 Third path element. + * @param elem4 Fourth path element. + * @param elem5 Fifth path element. + * @return The resulting path. + */ +std::string build_filename(const std::string& elem1, const std::string& elem2, + const std::string& elem3, const std::string& elem4, + const std::string& elem5); + +/** Creates a filename from six elements using the correct separator for filenames. + * No attempt is made to force the resulting filename to be an absolute path. + * If the first element is a relative path, the result will be a relative path. + * @param elem1 First path element. + * @param elem2 Second path element. + * @param elem3 Third path element. + * @param elem4 Fourth path element. + * @param elem5 Fifth path element. + * @param elem6 Sixth path element. + * @return The resulting path. + * + * @newin{2,28} + */ +std::string build_filename(const std::string& elem1, const std::string& elem2, + const std::string& elem3, const std::string& elem4, + const std::string& elem5, const std::string& elem6); + +/** Creates a filename from seven elements using the correct separator for filenames. + * No attempt is made to force the resulting filename to be an absolute path. + * If the first element is a relative path, the result will be a relative path. + * @param elem1 First path element. + * @param elem2 Second path element. + * @param elem3 Third path element. + * @param elem4 Fourth path element. + * @param elem5 Fifth path element. + * @param elem6 Sixth path element. + * @param elem7 Seventh path element. + * @return The resulting path. + * + * @newin{2,28} + */ +std::string build_filename(const std::string& elem1, const std::string& elem2, + const std::string& elem3, const std::string& elem4, + const std::string& elem5, const std::string& elem6, + const std::string& elem7); + +/** Creates a filename from eight elements using the correct separator for filenames. + * No attempt is made to force the resulting filename to be an absolute path. + * If the first element is a relative path, the result will be a relative path. + * @param elem1 First path element. + * @param elem2 Second path element. + * @param elem3 Third path element. + * @param elem4 Fourth path element. + * @param elem5 Fifth path element. + * @param elem6 Sixth path element. + * @param elem7 Seventh path element. + * @param elem8 Eighth path element. + * @return The resulting path. + * + * @newin{2,28} + */ +std::string build_filename(const std::string& elem1, const std::string& elem2, + const std::string& elem3, const std::string& elem4, + const std::string& elem5, const std::string& elem6, + const std::string& elem7, const std::string& elem8); + +/** Creates a filename from nine elements using the correct separator for filenames. + * No attempt is made to force the resulting filename to be an absolute path. + * If the first element is a relative path, the result will be a relative path. + * @param elem1 First path element. + * @param elem2 Second path element. + * @param elem3 Third path element. + * @param elem4 Fourth path element. + * @param elem5 Fifth path element. + * @param elem6 Sixth path element. + * @param elem7 Seventh path element. + * @param elem8 Eighth path element. + * @param elem9 Ninth path element. + * @return The resulting path. + * + * @newin{2,28} + */ +std::string build_filename(const std::string& elem1, const std::string& elem2, + const std::string& elem3, const std::string& elem4, + const std::string& elem5, const std::string& elem6, + const std::string& elem7, const std::string& elem8, + const std::string& elem9); + +/** Creates a path from a series of elements using @a separator as the + * separator between elements. + * + * At the boundary between two elements, any trailing occurrences of + * @a separator in the first element, or leading occurrences of @a separator + * in the second element are removed and exactly one copy of the separator is + * inserted. + * + * Empty elements are ignored. + * + * The number of leading copies of the separator on the result is + * the same as the number of leading copies of the separator on + * the first non-empty element. + * + * The number of trailing copies of the separator on the result is the same + * as the number of trailing copies of the separator on the last non-empty + * element. (Determination of the number of trailing copies is done without + * stripping leading copies, so if the separator is <tt>"ABA"</tt>, + * <tt>"ABABA"</tt> has 1 trailing copy.) + * + * However, if there is only a single non-empty element, and there + * are no characters in that element not part of the leading or + * trailing separators, then the result is exactly the original value + * of that element. + * + * Other than for determination of the number of leading and trailing + * copies of the separator, elements consisting only of copies + * of the separator are ignored. + * + * @param separator A string used to separate the elements of the path. + * @param elements A container holding the elements of the path to build. + * Any STL compatible container type is accepted. + * @return The resulting path. + */ +std::string build_path(const std::string& separator, + const Glib::ArrayHandle<std::string>& elements); + +/** Locates the first executable named @a program in the user's path, in the + * same way that <tt>execvp()</tt> would locate it. + * Returns a string with the absolute path name, or <tt>""</tt> if the program + * is not found in the path. If @a program is already an absolute path, + * returns a copy of @a program if @a program exists and is executable, and + * <tt>""</tt> otherwise. + * + * On Windows, if @a program does not have a file type suffix, tries to append + * the suffixes in the <tt>PATHEXT</tt> environment variable (if that doesn't + * exist, the suffixes .com, .exe, and .bat) in turn, and then look for the + * resulting file name in the same way as CreateProcess() would. This means + * first in the directory where the program was loaded from, then in the + * current directory, then in the Windows 32-bit system directory, then in the + * Windows directory, and finally in the directories in the <tt>PATH</tt> + * environment variable. If the program is found, the return value contains + * the full name including the type suffix. + * + * @param program A program name. + * @return An absolute path, or <tt>""</tt>. + */ +std::string find_program_in_path(const std::string& program); + +/** Formats a size (for example the size of a file) into a human readable string. + * + * Sizes are rounded to the nearest size prefix (kB, MB, GB) + * and are displayed rounded to the nearest tenth. E.g. the file size + * 3292528 bytes will be converted into the string "3.2 MB". + * + * The prefix units base is 1000 (i.e. 1 kB is 1000 bytes), unless the + * Glib::FORMAT_SIZE_IEC_UNITS flag is set. + * + * @param size A size in bytes. + * @param flags Flags to modify the output. + * @return A formatted string containing a human readable file size. + * + * @newin{2,46} + */ +Glib::ustring format_size(guint64 size, FormatSizeFlags flags = FORMAT_SIZE_DEFAULT); + +/** @} group MiscUtils */ + +} // namespace Glib |