summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2012-01-02 14:14:41 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2012-01-02 14:14:41 +0000
commitcd3800287297bdcd9fb8c90ee01a2414be3b9312 (patch)
tree93c4718a5f8dab79f9fd3c0af22c7ab1fc892a26 /src
parent8259ceddd02f76a337bb7037cdf5b86872ad09c6 (diff)
change units to the IEC standard (and the Ubuntu units policy) for base2 (/1024) - KiB/GiB etc. this is instead of KB/s etc which Windows and many other apps use for base2. I've tried to fix up the translations as best as I can.
Diffstat (limited to 'src')
-rw-r--r--src/json.c20
-rw-r--r--src/json.h2
-rw-r--r--src/torrent.c1
-rw-r--r--src/trg-cell-renderer-speed.c2
-rw-r--r--src/trg-client.c5
-rw-r--r--src/trg-general-panel.c4
-rw-r--r--src/trg-json-widgets.c1
-rw-r--r--src/trg-main-window.c6
-rw-r--r--src/trg-remote-prefs-dialog.c10
-rw-r--r--src/trg-status-bar.c4
-rw-r--r--src/trg-torrent-graph.c2
-rw-r--r--src/trg-torrent-props-dialog.c4
-rw-r--r--src/util.c388
-rw-r--r--src/util.h37
14 files changed, 312 insertions, 174 deletions
diff --git a/src/json.c b/src/json.c
index 0ffc2fa..38bcf76 100644
--- a/src/json.c
+++ b/src/json.c
@@ -92,3 +92,23 @@ JsonObject *get_arguments(JsonObject * req)
{
return json_object_get_object_member(req, PARAM_ARGUMENTS);
}
+
+gdouble json_double_to_progress(JsonNode * n)
+{
+ return json_node_really_get_double(n) * 100.0;
+}
+
+gdouble json_node_really_get_double(JsonNode * node)
+{
+ GValue a = { 0 };
+
+ json_node_get_value(node, &a);
+ switch (G_VALUE_TYPE(&a)) {
+ case G_TYPE_INT64:
+ return (gdouble) g_value_get_int64(&a);
+ case G_TYPE_DOUBLE:
+ return g_value_get_double(&a);
+ default:
+ return 0.0;
+ }
+}
diff --git a/src/json.h b/src/json.h
index 2c5dace..c321de9 100644
--- a/src/json.h
+++ b/src/json.h
@@ -29,5 +29,7 @@ gchar *trg_serialize(JsonNode * req);
JsonObject *trg_deserialize(trg_response * response, GError ** error);
JsonObject *get_arguments(JsonObject * req);
JsonObject *node_get_arguments(JsonNode * req);
+gdouble json_double_to_progress(JsonNode * n);
+gdouble json_node_really_get_double(JsonNode * node);
#endif /* JSON_H_ */
diff --git a/src/torrent.c b/src/torrent.c
index ab123c3..45e77c8 100644
--- a/src/torrent.c
+++ b/src/torrent.c
@@ -23,6 +23,7 @@
#include <json-glib/json-glib.h>
#include "trg-client.h"
+#include "json.h"
#include "torrent.h"
#include "protocol-constants.h"
#include "util.h"
diff --git a/src/trg-cell-renderer-speed.c b/src/trg-cell-renderer-speed.c
index 9f87561..ed921ea 100644
--- a/src/trg-cell-renderer-speed.c
+++ b/src/trg-cell-renderer-speed.c
@@ -66,7 +66,7 @@ trg_cell_renderer_speed_set_property(GObject * object, guint property_id,
if (priv->speed_value > 0) {
char speedString[32];
trg_strlspeed(speedString,
- priv->speed_value / KILOBYTE_FACTOR);
+ priv->speed_value / disk_K);
g_object_set(object, "text", speedString, NULL);
} else {
g_object_set(object, "text", "", NULL);
diff --git a/src/trg-client.c b/src/trg-client.c
index 5304a81..ff5eb2a 100644
--- a/src/trg-client.c
+++ b/src/trg-client.c
@@ -23,6 +23,7 @@
#include <string.h>
#include <glib.h>
#include <glib/gprintf.h>
+#include <glib/gi18n.h>
#ifdef HAVE_LIBPROXY
#include <proxy.h>
@@ -156,6 +157,10 @@ TrgClient *trg_client_new(void)
priv->pool = g_thread_pool_new((GFunc) dispatch_async_threadfunc, tc,
DISPATCH_POOL_SIZE, TRUE, NULL);
+ tr_formatter_size_init( disk_K, _(disk_K_str), _(disk_M_str), _(disk_G_str), _(disk_T_str) );
+ tr_formatter_speed_init( speed_K, _(speed_K_str), _(speed_M_str), _(speed_G_str), _(speed_T_str) );
+
+
return tc;
}
diff --git a/src/trg-general-panel.c b/src/trg-general-panel.c
index ac5e9ba..6d88c3f 100644
--- a/src/trg-general-panel.c
+++ b/src/trg-general-panel.c
@@ -126,10 +126,10 @@ void trg_general_panel_update(TrgGeneralPanel * panel, JsonObject * t,
trg_strlsize(buf, torrent_get_size(t));
gtk_label_set_text(GTK_LABEL(priv->gen_size_label), buf);
- trg_strlspeed(buf, torrent_get_rate_down(t) / KILOBYTE_FACTOR);
+ trg_strlspeed(buf, torrent_get_rate_down(t) / disk_K);
gtk_label_set_text(GTK_LABEL(priv->gen_down_rate_label), buf);
- trg_strlspeed(buf, torrent_get_rate_up(t) / KILOBYTE_FACTOR);
+ trg_strlspeed(buf, torrent_get_rate_up(t) / disk_K);
gtk_label_set_text(GTK_LABEL(priv->gen_up_rate_label), buf);
uploaded = torrent_get_uploaded(t);
diff --git a/src/trg-json-widgets.c b/src/trg-json-widgets.c
index abdaf27..1814769 100644
--- a/src/trg-json-widgets.c
+++ b/src/trg-json-widgets.c
@@ -21,6 +21,7 @@
#include <json-glib/json-glib.h>
#include "trg-json-widgets.h"
+#include "json.h"
#include "util.h"
/* Functions for creating widgets that load/save their state from/to a JSON
diff --git a/src/trg-main-window.c b/src/trg-main-window.c
index ee49419..8ad7f3a 100644
--- a/src/trg-main-window.c
+++ b/src/trg-main-window.c
@@ -1745,14 +1745,10 @@ static GtkWidget *limit_item_new(TrgMainWindow * win, GtkWidget * menu,
GtkWidget *item;
gboolean active = limit < 0 ? FALSE : (currentLimit == (gint64) limit);
- if (limit >= 1000)
- g_snprintf(speed, sizeof(speed), "%.2f MB/s", limit / 1024);
- else
- g_snprintf(speed, sizeof(speed), "%.0f KB/s", limit);
+ trg_strlspeed(speed, limit);
item = gtk_check_menu_item_new_with_label(speed);
- /* Yeah, I know it's unsafe to cast from a float to an int, but its safe here */
g_object_set_data(G_OBJECT(item), "limit",
GINT_TO_POINTER((gint) limit));
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), active);
diff --git a/src/trg-remote-prefs-dialog.c b/src/trg-remote-prefs-dialog.c
index c698046..1511ecc 100644
--- a/src/trg-remote-prefs-dialog.c
+++ b/src/trg-remote-prefs-dialog.c
@@ -262,14 +262,14 @@ static GtkWidget *trg_rprefs_bandwidthPage(TrgRemotePrefsDialog * win,
hig_workarea_add_section_title(t, &row, _("Bandwidth limits"));
tb = trg_json_widget_check_new(&priv->widgets, json,
- SGET_SPEED_LIMIT_DOWN_ENABLED, _("Down Limit (KB/s)"),
+ SGET_SPEED_LIMIT_DOWN_ENABLED, _("Down Limit (KiB/s)"),
NULL);
w = trg_json_widget_spin_new(&priv->widgets, json, SGET_SPEED_LIMIT_DOWN,
tb, 0, INT_MAX, 5);
hig_workarea_add_row_w(t, &row, tb, w, NULL);
tb = trg_json_widget_check_new(&priv->widgets, json,
- SGET_SPEED_LIMIT_UP_ENABLED, _("Up Limit (KB/s)"), NULL);
+ SGET_SPEED_LIMIT_UP_ENABLED, _("Up Limit (KiB/s)"), NULL);
w = trg_json_widget_spin_new(&priv->widgets, json, SGET_SPEED_LIMIT_UP, tb,
0, INT_MAX, 5);
hig_workarea_add_row_w(t, &row, tb, w, NULL);
@@ -288,11 +288,11 @@ static GtkWidget *trg_rprefs_bandwidthPage(TrgRemotePrefsDialog * win,
w = trg_rprefs_alt_speed_spin_new(&priv->widgets, json, SGET_ALT_SPEED_DOWN,
priv->alt_check, tb);
- hig_workarea_add_row(t, &row, _("Alternate down limit (KB/s)"), w, w);
+ hig_workarea_add_row(t, &row, _("Alternate down limit (KiB/s)"), w, w);
w = trg_rprefs_alt_speed_spin_new(&priv->widgets, json, SGET_ALT_SPEED_UP,
priv->alt_check, tb);
- hig_workarea_add_row(t, &row, _("Alternate up limit (KB/s)"), w, w);
+ hig_workarea_add_row(t, &row, _("Alternate up limit (KiB/s)"), w, w);
return t;
}
@@ -542,7 +542,7 @@ static GtkWidget *trg_rprefs_generalPage(TrgRemotePrefsDialog * win,
if (cache_size_mb >= 0) {
w = trg_json_widget_spin_new(&priv->widgets, s, SGET_CACHE_SIZE_MB,
NULL, 0, INT_MAX, 1);
- hig_workarea_add_row(t, &row, _("Cache size (MB)"), w, w);
+ hig_workarea_add_row(t, &row, _("Cache size (MiB)"), w, w);
}
hig_workarea_add_section_title(t, &row, _("Behavior"));
diff --git a/src/trg-status-bar.c b/src/trg-status-bar.c
index dc9d4e8..91699cb 100644
--- a/src/trg-status-bar.c
+++ b/src/trg-status-bar.c
@@ -181,8 +181,8 @@ void trg_status_bar_update(TrgStatusBar * sb,
session, SGET_SPEED_LIMIT_UP) :
-1;
- trg_strlspeed(downRateTotalString, stats->downRateTotal / KILOBYTE_FACTOR);
- trg_strlspeed(upRateTotalString, stats->upRateTotal / KILOBYTE_FACTOR);
+ trg_strlspeed(downRateTotalString, stats->downRateTotal / disk_K);
+ trg_strlspeed(upRateTotalString, stats->upRateTotal / disk_K);
if (uplimitraw >= 0) {
gchar uplimitstring[32];
diff --git a/src/trg-torrent-graph.c b/src/trg-torrent-graph.c
index 1b22375..94c4ecc 100644
--- a/src/trg-torrent-graph.c
+++ b/src/trg-torrent-graph.c
@@ -400,7 +400,7 @@ static void trg_torrent_graph_update_net(TrgTorrentGraph * g)
fp[0] = 1.0f * priv->out / priv->max;
fp[1] = 1.0f * priv->in / priv->max;
- trg_strlspeed(speed, (gint64) (priv->out / KILOBYTE_FACTOR));
+ trg_strlspeed(speed, (gint64) (priv->out / disk_K));
labelMarkup =
g_markup_printf_escaped("<span font_size=\"small\" color=\""
GRAPH_OUT_COLOR "\">%s: %s</span>",
diff --git a/src/trg-torrent-props-dialog.c b/src/trg-torrent-props-dialog.c
index 1ab2f8a..399405b 100644
--- a/src/trg-torrent-props-dialog.c
+++ b/src/trg-torrent-props-dialog.c
@@ -195,7 +195,7 @@ static GtkWidget *trg_props_limitsPage(TrgTorrentPropsDialog * win,
tb = trg_json_widget_check_new(&priv->widgets, json,
FIELD_DOWNLOAD_LIMITED,
- _("Limit download speed (KB/s)"), NULL);
+ _("Limit download speed (KiB/s)"), NULL);
w = trg_json_widget_spin_new(&priv->widgets, json,
FIELD_DOWNLOAD_LIMIT, tb, 0, INT_MAX,
1);
@@ -203,7 +203,7 @@ static GtkWidget *trg_props_limitsPage(TrgTorrentPropsDialog * win,
tb = trg_json_widget_check_new(&priv->widgets, json,
FIELD_UPLOAD_LIMITED,
- _("Limit upload speed (KB/s)"), NULL);
+ _("Limit upload speed (KiB/s)"), NULL);
w = trg_json_widget_spin_new(&priv->widgets, json,
FIELD_UPLOAD_LIMIT, tb, 0, INT_MAX,
1);
diff --git a/src/util.c b/src/util.c
index b103cff..ef03482 100644
--- a/src/util.c
+++ b/src/util.c
@@ -17,7 +17,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-/* Most of these functions are taken from the Transmission Project. */
+/* Many of these functions are taken from the Transmission Project. */
#include <stdlib.h>
#include <math.h>
@@ -33,6 +33,138 @@
#include "util.h"
+/***
+**** The code for formatting size and speeds, taken from Transmission.
+***/
+
+const int disk_K = 1024;
+const char * disk_K_str = N_("KiB");
+const char * disk_M_str = N_("MiB");
+const char * disk_G_str = N_("GiB");
+const char * disk_T_str = N_("TiB");
+
+const int speed_K = 1024;
+const char * speed_K_str = N_("KiB/s");
+const char * speed_M_str = N_("MiB/s");
+const char * speed_G_str = N_("GiB/s");
+const char * speed_T_str = N_("TiB/s");
+
+struct formatter_unit
+{
+ char * name;
+ gint64 value;
+};
+
+struct formatter_units
+{
+ struct formatter_unit units[4];
+};
+
+enum { TR_FMT_KB, TR_FMT_MB, TR_FMT_GB, TR_FMT_TB };
+
+static void
+formatter_init( struct formatter_units * units,
+ unsigned int kilo,
+ const char * kb, const char * mb,
+ const char * gb, const char * tb )
+{
+ guint64 value = kilo;
+ units->units[TR_FMT_KB].name = g_strdup( kb );
+ units->units[TR_FMT_KB].value = value;
+
+ value *= kilo;
+ units->units[TR_FMT_MB].name = g_strdup( mb );
+ units->units[TR_FMT_MB].value = value;
+
+ value *= kilo;
+ units->units[TR_FMT_GB].name = g_strdup( gb );
+ units->units[TR_FMT_GB].value = value;
+
+ value *= kilo;
+ units->units[TR_FMT_TB].name = g_strdup( tb );
+ units->units[TR_FMT_TB].value = value;
+}
+
+static char*
+formatter_get_size_str( const struct formatter_units * u,
+ char * buf, gint64 bytes, size_t buflen )
+{
+ int precision;
+ double value;
+ const char * units;
+ const struct formatter_unit * unit;
+
+ if( bytes < u->units[1].value ) unit = &u->units[0];
+ else if( bytes < u->units[2].value ) unit = &u->units[1];
+ else if( bytes < u->units[3].value ) unit = &u->units[2];
+ else unit = &u->units[3];
+
+ value = (double)bytes / unit->value;
+ units = unit->name;
+ if( unit->value == 1 )
+ precision = 0;
+ else if( value < 100 )
+ precision = 2;
+ else
+ precision = 1;
+ tr_snprintf( buf, buflen, "%.*f %s", precision, value, units );
+ return buf;
+}
+
+static struct formatter_units size_units;
+
+void
+tr_formatter_size_init( unsigned int kilo,
+ const char * kb, const char * mb,
+ const char * gb, const char * tb )
+{
+ formatter_init( &size_units, kilo, kb, mb, gb, tb );
+}
+
+char*
+tr_formatter_size_B( char * buf, gint64 bytes, size_t buflen )
+{
+ return formatter_get_size_str( &size_units, buf, bytes, buflen );
+}
+
+static struct formatter_units speed_units;
+
+unsigned int tr_speed_K = 0u;
+
+void
+tr_formatter_speed_init( unsigned int kilo,
+ const char * kb, const char * mb,
+ const char * gb, const char * tb )
+{
+ tr_speed_K = kilo;
+ formatter_init( &speed_units, kilo, kb, mb, gb, tb );
+}
+
+char*
+tr_formatter_speed_KBps( char * buf, double KBps, size_t buflen )
+{
+ const double K = speed_units.units[TR_FMT_KB].value;
+ double speed = KBps;
+
+ if( speed <= 999.95 ) /* 0.0 KB to 999.9 KB */
+ tr_snprintf( buf, buflen, "%d %s", (int)speed, speed_units.units[TR_FMT_KB].name );
+ else {
+ speed /= K;
+ if( speed <= 99.995 ) /* 0.98 MB to 99.99 MB */
+ tr_snprintf( buf, buflen, "%.2f %s", speed, speed_units.units[TR_FMT_MB].name );
+ else if (speed <= 999.95) /* 100.0 MB to 999.9 MB */
+ tr_snprintf( buf, buflen, "%.1f %s", speed, speed_units.units[TR_FMT_MB].name );
+ else {
+ speed /= K;
+ tr_snprintf( buf, buflen, "%.1f %s", speed, speed_units.units[TR_FMT_GB].name );
+ }
+ }
+
+ return buf;
+}
+
+/* URL checkers. */
+
gboolean is_magnet(gchar * string)
{
return g_str_has_prefix(string, "magnet:");
@@ -44,22 +176,40 @@ gboolean is_url(gchar * string)
return g_regex_match_simple("^http[s]?://", string, 0, 0);
}
-void add_file_id_to_array(JsonObject * args, gchar * key, gint index)
+/*
+ * Glib-ish Utility functions.
+ */
+
+gchar *trg_base64encode(const gchar * filename)
{
- JsonArray *array;
- if (json_object_has_member(args, key)) {
- array = json_object_get_array_member(args, key);
+ GError *error = NULL;
+ GMappedFile *mf = g_mapped_file_new(filename, FALSE, &error);
+ gchar *b64out = NULL;
+
+ if (error) {
+ g_error("%s", error->message);
+ g_error_free(error);
} else {
- array = json_array_new();
- json_object_set_array_member(args, key, array);
+ b64out =
+ g_base64_encode((guchar *) g_mapped_file_get_contents(mf),
+ g_mapped_file_get_length(mf));
}
- json_array_add_int_element(array, index);
+
+ g_mapped_file_unref(mf);
+
+ return b64out;
}
-void g_str_slist_free(GSList * list)
+gchar *trg_gregex_get_first(GRegex * rx, const gchar * src)
{
- g_slist_foreach(list, (GFunc) g_free, NULL);
- g_slist_free(list);
+ GMatchInfo *mi = NULL;
+ gchar *dst = NULL;
+ g_regex_match(rx, src, 0, &mi);
+ if (mi) {
+ dst = g_match_info_fetch(mi, 1);
+ g_match_info_free(mi);
+ }
+ return dst;
}
GRegex *trg_uri_host_regex_new(void)
@@ -70,6 +220,76 @@ GRegex *trg_uri_host_regex_new(void)
G_REGEX_OPTIMIZE, 0, NULL);
}
+void g_str_slist_free(GSList * list)
+{
+ g_slist_foreach(list, (GFunc) g_free, NULL);
+ g_slist_free(list);
+}
+
+void rm_trailing_slashes(gchar * str)
+{
+ if (!str)
+ return;
+
+ int i, len;
+ if ((len = strlen(str)) < 1)
+ return;
+
+ for (i = strlen(str) - 1; str[i]; i--) {
+ if (str[i] == '/')
+ str[i] = '\0';
+ else
+ return;
+ }
+}
+
+/* Working with torrents.. */
+
+void add_file_id_to_array(JsonObject * args, gchar * key, gint index)
+{
+ JsonArray *array;
+ if (json_object_has_member(args, key)) {
+ array = json_object_get_array_member(args, key);
+ } else {
+ array = json_array_new();
+ json_object_set_array_member(args, key, array);
+ }
+ json_array_add_int_element(array, index);
+}
+
+/* GTK utilities. */
+
+GtkWidget *gtr_combo_box_new_enum(const char *text_1, ...)
+{
+ GtkWidget *w;
+ GtkCellRenderer *r;
+ GtkListStore *store;
+ va_list vl;
+ const char *text;
+ va_start(vl, text_1);
+
+ store = gtk_list_store_new(2, G_TYPE_INT, G_TYPE_STRING);
+
+ text = text_1;
+ if (text != NULL)
+ do {
+ const int val = va_arg(vl, int);
+ gtk_list_store_insert_with_values(store, NULL, INT_MAX, 0, val,
+ 1, text, -1);
+ text = va_arg(vl, const char *);
+ }
+ while (text != NULL);
+
+ w = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
+ r = gtk_cell_renderer_text_new();
+ gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(w), r, TRUE);
+ gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(w), r, "text", 1, NULL);
+
+ /* cleanup */
+ g_object_unref(store);
+ return w;
+}
+
GtkWidget *my_scrolledwin_new(GtkWidget * child)
{
GtkWidget *scrolled_win = gtk_scrolled_window_new(NULL, NULL);
@@ -80,16 +300,15 @@ GtkWidget *my_scrolledwin_new(GtkWidget * child)
return scrolled_win;
}
-gchar *trg_gregex_get_first(GRegex * rx, const gchar * src)
+/* gtk_widget_set_sensitive() was introduced in 2.18, we can have a minimum of
+ * 2.16 otherwise. */
+
+void trg_widget_set_visible(GtkWidget * w, gboolean visible)
{
- GMatchInfo *mi = NULL;
- gchar *dst = NULL;
- g_regex_match(rx, src, 0, &mi);
- if (mi) {
- dst = g_match_info_fetch(mi, 1);
- g_match_info_free(mi);
- }
- return dst;
+ if (visible)
+ gtk_widget_show(w);
+ else
+ gtk_widget_hide(w);
}
void trg_error_dialog(GtkWindow * parent, trg_response * response)
@@ -125,6 +344,8 @@ gchar *make_error_message(JsonObject * response, int status)
}
}
+/* Formatters and Transmission basic utility functions.. */
+
char *tr_strlpercent(char *buf, double x, size_t buflen)
{
return tr_strpercent(buf, x, buflen);
@@ -172,34 +393,6 @@ char *tr_strlratio(char *buf, double ratio, size_t buflen)
return tr_strratio(buf, buflen, ratio, "\xE2\x88\x9E");
}
-char *tr_strlsize(char *buf, guint64 size, size_t buflen)
-{
- if (!size)
- g_strlcpy(buf, _("None"), buflen);
- else {
- char *tmp = g_format_size_for_display(size);
- g_strlcpy(buf, tmp, buflen);
- g_free(tmp);
- }
- return buf;
-}
-
-char *tr_strlspeed(char *buf, double kb_sec, size_t buflen)
-{
- const double speed = kb_sec;
-
- if (speed < 1000.0) /* 0.0 KB to 999.9 KB */
- g_snprintf(buf, buflen, _("%.1f KB/s"), speed);
- else if (speed < 102400.0) /* 0.98 MB to 99.99 MB */
- g_snprintf(buf, buflen, _("%.2f MB/s"), (speed / KILOBYTE_FACTOR));
- else if (speed < 1024000.0) /* 100.0 MB to 999.9 MB */
- g_snprintf(buf, buflen, _("%.1f MB/s"), (speed / MEGABYTE_FACTOR));
- else /* insane speeds */
- g_snprintf(buf, buflen, _("%.2f GB/s"), (speed / GIGABYTE_FACTOR));
-
- return buf;
-}
-
char *tr_strltime_short(char *buf, long seconds, size_t buflen)
{
int hours, minutes;
@@ -337,102 +530,3 @@ evutil_vsnprintf(char *buf, size_t buflen, const char *format, va_list ap)
return r;
#endif
}
-
-void rm_trailing_slashes(gchar * str)
-{
- if (!str)
- return;
-
- int i, len;
- if ((len = strlen(str)) < 1)
- return;
-
- for (i = strlen(str) - 1; str[i]; i--) {
- if (str[i] == '/')
- str[i] = '\0';
- else
- return;
- }
-}
-
-/* gtk_widget_set_sensitive() was introduced in 2.18, we can have a minimum of
- * 2.16 otherwise. */
-
-void trg_widget_set_visible(GtkWidget * w, gboolean visible)
-{
- if (visible)
- gtk_widget_show(w);
- else
- gtk_widget_hide(w);
-}
-
-gdouble json_double_to_progress(JsonNode * n)
-{
- return json_node_really_get_double(n) * 100.0;
-}
-
-gdouble json_node_really_get_double(JsonNode * node)
-{
- GValue a = { 0 };
-
- json_node_get_value(node, &a);
- switch (G_VALUE_TYPE(&a)) {
- case G_TYPE_INT64:
- return (gdouble) g_value_get_int64(&a);
- case G_TYPE_DOUBLE:
- return g_value_get_double(&a);
- default:
- return 0.0;
- }
-}
-
-gchar *trg_base64encode(const gchar * filename)
-{
- GError *error = NULL;
- GMappedFile *mf = g_mapped_file_new(filename, FALSE, &error);
- gchar *b64out = NULL;
-
- if (error) {
- g_error("%s", error->message);
- g_error_free(error);
- } else {
- b64out =
- g_base64_encode((guchar *) g_mapped_file_get_contents(mf),
- g_mapped_file_get_length(mf));
- }
-
- g_mapped_file_unref(mf);
-
- return b64out;
-}
-
-GtkWidget *gtr_combo_box_new_enum(const char *text_1, ...)
-{
- GtkWidget *w;
- GtkCellRenderer *r;
- GtkListStore *store;
- va_list vl;
- const char *text;
- va_start(vl, text_1);
-
- store = gtk_list_store_new(2, G_TYPE_INT, G_TYPE_STRING);
-
- text = text_1;
- if (text != NULL)
- do {
- const int val = va_arg(vl, int);
- gtk_list_store_insert_with_values(store, NULL, INT_MAX, 0, val,
- 1, text, -1);
- text = va_arg(vl, const char *);
- }
- while (text != NULL);
-
- w = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
- r = gtk_cell_renderer_text_new();
- gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(w), r, TRUE);
- gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(w), r, "text", 1, NULL);
-
- /* cleanup */
- g_object_unref(store);
- return w;
-}
diff --git a/src/util.h b/src/util.h
index 6dd6e23..990cafa 100644
--- a/src/util.h
+++ b/src/util.h
@@ -28,16 +28,25 @@
#include "trg-client.h"
-#define trg_strlspeed(a, b) tr_strlspeed(a, b, sizeof(a))
+#define trg_strlspeed(a, b) tr_formatter_speed_KBps(a, b, sizeof(a))
#define trg_strlpercent(a, b) tr_strlpercent(a, b, sizeof(a))
-#define trg_strlsize(a, b) tr_strlsize(a, b, sizeof(a))
+#define trg_strlsize(a, b) tr_formatter_size_B(a, b, sizeof(a))
#define trg_strlratio(a, b) tr_strlratio(a, b, sizeof(a))
#define TR_RATIO_NA -1
#define TR_RATIO_INF -2
-#define KILOBYTE_FACTOR 1024.0
-#define MEGABYTE_FACTOR ( 1024.0 * 1024.0 )
-#define GIGABYTE_FACTOR ( 1024.0 * 1024.0 * 1024.0 )
+
+extern const int disk_K;
+extern const char * disk_K_str;
+extern const char * disk_M_str;
+extern const char * disk_G_str;
+extern const char * disk_T_str;
+
+extern const int speed_K;
+extern const char * speed_K_str;
+extern const char * speed_M_str;
+extern const char * speed_G_str;
+extern const char * speed_T_str;
void add_file_id_to_array(JsonObject * args, gchar * key, gint index);
void g_str_slist_free(GSList * list);
@@ -46,6 +55,20 @@ gchar *trg_gregex_get_first(GRegex * rx, const gchar * uri);
gchar *make_error_message(JsonObject * response, int status);
void trg_error_dialog(GtkWindow * parent, trg_response * response);
+void
+tr_formatter_size_init( unsigned int kilo,
+ const char * kb, const char * mb,
+ const char * gb, const char * tb );
+char*
+tr_formatter_size_B( char * buf, gint64 bytes, size_t buflen );
+
+void
+tr_formatter_speed_init( unsigned int kilo,
+ const char * kb, const char * mb,
+ const char * gb, const char * tb );
+char*
+tr_formatter_speed_KBps( char * buf, double KBps, size_t buflen );
+
char *tr_strltime_long(char *buf, long seconds, size_t buflen);
char *tr_strltime_short(char *buf, long seconds, size_t buflen);
char *tr_strpercent(char *buf, double x, size_t buflen);
@@ -53,8 +76,6 @@ char *tr_strlpercent(char *buf, double x, size_t buflen);
char *tr_strratio(char *buf, size_t buflen, double ratio,
const char *infinity);
char *tr_strlratio(char *buf, double ratio, size_t buflen);
-char *tr_strlspeed(char *buf, double kb_sec, size_t buflen);
-char *tr_strlsize(char *buf, guint64 size, size_t buflen);
char *gtr_localtime(time_t time);
char *gtr_localtime2(char *buf, time_t time, size_t buflen);
int tr_snprintf(char *buf, size_t buflen, const char *fmt, ...);
@@ -65,12 +86,10 @@ int evutil_vsnprintf(char *buf, size_t buflen, const char *format,
va_list ap);
void rm_trailing_slashes(gchar * str);
void trg_widget_set_visible(GtkWidget * w, gboolean visible);
-gdouble json_double_to_progress(JsonNode * n);
gchar *trg_base64encode(const gchar * filename);
GtkWidget *my_scrolledwin_new(GtkWidget * child);
gboolean is_url(gchar * string);
gboolean is_magnet(gchar * string);
-gdouble json_node_really_get_double(JsonNode * node);
GtkWidget *gtr_combo_box_new_enum(const char *text_1, ...);
#endif /* UTIL_H_ */