X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/9106934d92f6af13bfe1df8cd6886e115aafe22b..85e9e947eccc72ba0e9a0b5404a014e44bd2ec3d:/src/util.c diff --git a/src/util.c b/src/util.c index 2e3e28f7..34f3abf1 100644 --- a/src/util.c +++ b/src/util.c @@ -1,6 +1,7 @@ /* * Viking - GPS data editor * Copyright (C) 2007, Guilhem Bonnefille + * Copyright (C) 2014, Rob Norris * Based on: * Copyright (C) 2003-2007, Leandro A. F. Pereira * @@ -17,82 +18,47 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + /* + * Dependencies must be just on Glib + * see ui_utils for thing that depend on Gtk + * see vikutils for things that further depend on other Viking types + */ #ifdef HAVE_CONFIG_H #include "config.h" #endif -#ifdef WINDOWS -#include -#endif - +#include #include #include #include "util.h" -#include "dialog.h" - -#ifndef WINDOWS -static gboolean spawn_command_line_async(const gchar * cmd, - const gchar * arg) -{ - gchar *cmdline = NULL; - gboolean status; - - cmdline = g_strdup_printf("%s '%s'", cmd, arg); - g_debug("Running: %s", cmdline); - - status = g_spawn_command_line_async(cmdline, NULL); +#include "globals.h" - g_free(cmdline); - - return status; -} -#endif - -void open_url(GtkWindow *parent, const gchar * url) -{ #ifdef WINDOWS - ShellExecute(NULL, NULL, (char *) url, NULL, ".\\", 0); -#else /* WINDOWS */ - const gchar *browsers[] = { - "xdg-open", "gnome-open", "kfmclient openURL", - "sensible-browser", "firefox", "epiphany", - "iceweasel", "seamonkey", "galeon", "mozilla", - "opera", "konqueror", "netscape", "links -g", - "chromium-browser", "chromium", "chrome", - "safari", "camino", "omniweb", "icab", - NULL - }; - gint i=0; - - const gchar *browser = g_getenv("BROWSER"); - if (browser == NULL || browser[0] == '\0') { - /* $BROWSER not set -> use first entry */ - browser = browsers[i++]; - } - do { - if (spawn_command_line_async(browser, url)) { - return; - } - - browser = browsers[i++]; - } while(browser); - - a_dialog_error_msg ( parent, _("Could not launch web browser.") ); -#endif /* WINDOWS */ -} +#include +#else +#include +#endif -void new_email(GtkWindow *parent, const gchar * address) +guint util_get_number_of_cpus () { - gchar *uri = g_strdup_printf("mailto:%s", address); +#if GLIB_CHECK_VERSION (2, 36, 0) + return g_get_num_processors(); +#else + long nprocs = 1; #ifdef WINDOWS - ShellExecute(NULL, NULL, (char *) uri, NULL, ".\\", 0); -#else /* WINDOWS */ - if (!spawn_command_line_async("xdg-email", uri)) - a_dialog_error_msg ( parent, _("Could not create new email.") ); -#endif /* WINDOWS */ - g_free(uri); - uri = NULL; + SYSTEM_INFO info; + GetSystemInfo(&info); + nprocs = info.dwNumberOfProcessors; +#else +#ifdef _SC_NPROCESSORS_ONLN + nprocs = sysconf(_SC_NPROCESSORS_ONLN); + if (nprocs < 1) + nprocs = 1; +#endif +#endif + return nprocs; +#endif } gchar *uri_escape(gchar *str) @@ -126,24 +92,123 @@ GList * str_array_to_glist(gchar* data[]) return g_list_reverse(gl); } -/* MAKES A COPY OF THE KEY!!! */ -gboolean split_string_from_file_on_equals ( gchar *buf, gchar **key, gchar **val ) +/** + * split_string_from_file_on_equals: + * + * @buf: the input string + * @key: newly allocated string that is before the '=' + * @val: newly allocated string after the '=' + * + * Designed for file line processing, so it ignores strings beginning with special + * characters, such as '#'; returns false in such situations. + * Also returns false if no equals character is found + * + * e.g. if buf = "GPS.parameter=42" + * key = "GPS.parameter" + * val = "42" + */ +gboolean split_string_from_file_on_equals ( const gchar *buf, gchar **key, gchar **val ) { - gchar *eq_pos; - gint len; - // comments, special characters in viking file format if ( buf == NULL || buf[0] == '\0' || buf[0] == '~' || buf[0] == '=' || buf[0] == '#' ) return FALSE; - eq_pos = strchr ( buf, '=' ); - if ( ! eq_pos ) + + if ( ! strchr ( buf, '=' ) ) return FALSE; - *key = g_strndup ( buf, eq_pos - buf ); - *val = eq_pos + 1; - len = strlen(*val); - if ( len > 0 ) - if ( (*val)[len - 1] == '\n' ) - (*val) [ len - 1 ] = '\0'; /* cut off newline */ + + gchar **strv = g_strsplit ( buf, "=", 2 ); + + gint gi = 0; + gchar *str = strv[gi]; + while ( str ) { + if ( gi == 0 ) + *key = g_strdup ( str ); + else + *val = g_strdup ( str ); + gi++; + str = strv[gi]; + } + + g_strfreev ( strv ); + + // Remove newline from val and also any other whitespace + *key = g_strstrip ( *key ); + *val = g_strstrip ( *val ); return TRUE; } +static GSList* deletion_list = NULL; + +/** + * util_add_to_deletion_list: + * + * Add a name of a file into the list that is to be deleted on program exit + * Normally this is for files that get used asynchronously, + * so we don't know when it's time to delete them - other than at this program's end + */ +void util_add_to_deletion_list ( const gchar* filename ) +{ + deletion_list = g_slist_append ( deletion_list, g_strdup (filename) ); +} + +/** + * util_remove_all_in_deletion_list: + * + * Delete all the files in the deletion list + * This should only be called on program exit + */ +void util_remove_all_in_deletion_list ( void ) +{ + while ( deletion_list ) + { + g_remove ( deletion_list->data ); + g_free ( deletion_list->data ); + deletion_list = g_slist_delete_link ( deletion_list, deletion_list ); + } +} + +/** + * Removes characters from a string, in place. + * + * @param string String to search. + * @param chars Characters to remove. + * + * @return @a string - return value is only useful when nesting function calls, e.g.: + * @code str = utils_str_remove_chars(g_strdup("f_o_o"), "_"); @endcode + * + * @see @c g_strdelimit. + **/ +gchar *util_str_remove_chars(gchar *string, const gchar *chars) +{ + const gchar *r; + gchar *w = string; + + g_return_val_if_fail(string, NULL); + if (G_UNLIKELY(EMPTY(chars))) + return string; + + foreach_str(r, string) + { + if (!strchr(chars, *r)) + *w++ = *r; + } + *w = 0x0; + return string; +} + +/** + * In 'extreme' debug mode don't remove temporary files + * thus the contents can be inspected if things go wrong + * with the trade off the user may need to delete tmp files manually + * Only use this for 'occasional' downloaded temporary files that need interpretation, + * rather than large volume items such as Bing attributions. + */ +int util_remove ( const gchar *filename ) +{ + if ( vik_debug && vik_verbose ) { + g_warning ( "Not removing file: %s", filename ); + return 0; + } + else + return g_remove ( filename ); +}