[gthumb] fixed filesize test
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] fixed filesize test
- Date: Tue, 5 Nov 2019 10:40:50 +0000 (UTC)
commit 3f1888dac1f40c790b905f71d131ea9cb3303241
Author: Paolo Bacchilega <paobac src gnome org>
Date: Mon Nov 4 22:32:19 2019 +0100
fixed filesize test
Use a guint64 to store the size to avoid an overflow for big
files.
extensions/comments/main.c | 4 +-
gthumb/gth-main-default-tests.c | 34 ++++++++-------
gthumb/gth-test-simple.c | 96 +++++++++++++++++++++++++++++++++++------
gthumb/gth-test-simple.h | 8 ++--
4 files changed, 108 insertions(+), 34 deletions(-)
---
diff --git a/extensions/comments/main.c b/extensions/comments/main.c
index 82ad35f3..ed3727a7 100644
--- a/extensions/comments/main.c
+++ b/extensions/comments/main.c
@@ -48,7 +48,7 @@ GthMetadataInfo comments_metadata_info[] = {
};
-static gint64
+static int
get_comment_for_test (GthTest *test,
GthFileData *file,
gconstpointer *data,
@@ -59,7 +59,7 @@ get_comment_for_test (GthTest *test,
}
-static gint64
+static int
get_place_for_test (GthTest *test,
GthFileData *file,
gconstpointer *data,
diff --git a/gthumb/gth-main-default-tests.c b/gthumb/gth-main-default-tests.c
index ff49973f..b9448802 100644
--- a/gthumb/gth-main-default-tests.c
+++ b/gthumb/gth-main-default-tests.c
@@ -30,7 +30,7 @@
#include "gth-time.h"
-static gint64
+static int
is_file_test (GthTest *test,
GthFileData *file_data,
gconstpointer *data,
@@ -40,7 +40,7 @@ is_file_test (GthTest *test,
}
-static gint64
+static int
is_image_test (GthTest *test,
GthFileData *file_data,
gconstpointer *data,
@@ -55,7 +55,7 @@ is_image_test (GthTest *test,
}
-static gint64
+static int
is_jpeg_test (GthTest *test,
GthFileData *file_data,
gconstpointer *data,
@@ -70,7 +70,7 @@ is_jpeg_test (GthTest *test,
}
-static gint64
+static int
is_raw_test (GthTest *test,
GthFileData *file_data,
gconstpointer *data,
@@ -85,7 +85,7 @@ is_raw_test (GthTest *test,
}
-static gint64
+static int
is_video_test (GthTest *test,
GthFileData *file_data,
gconstpointer *data,
@@ -100,7 +100,7 @@ is_video_test (GthTest *test,
}
-static gint64
+static int
is_audio_test (GthTest *test,
GthFileData *file_data,
gconstpointer *data,
@@ -115,7 +115,7 @@ is_audio_test (GthTest *test,
}
-static gint64
+static int
is_media_test (GthTest *test,
GthFileData *file_data,
gconstpointer *data,
@@ -134,7 +134,7 @@ is_media_test (GthTest *test,
}
-static gint64
+static int
is_text_test (GthTest *test,
GthFileData *file_data,
gconstpointer *data,
@@ -151,7 +151,7 @@ is_text_test (GthTest *test,
}
-static gint64
+static int
get_filename_for_test (GthTest *test,
GthFileData *file_data,
gconstpointer *data,
@@ -162,17 +162,19 @@ get_filename_for_test (GthTest *test,
}
-static gint64
+static int
get_filesize_for_test (GthTest *test,
GthFileData *file_data,
gconstpointer *data,
GDestroyNotify *data_destroy_func)
{
- return g_file_info_get_size (file_data->info);
+ guint64 *size = (guint64 *) data;
+ *size = g_file_info_get_size (file_data->info);
+ return 0;
}
-static gint64
+static int
get_modified_date_for_test (GthTest *test,
GthFileData *file_data,
gconstpointer *data,
@@ -195,7 +197,7 @@ get_modified_date_for_test (GthTest *test,
}
-static gint64
+static int
get_original_date_for_test (GthTest *test,
GthFileData *file_data,
gconstpointer *data,
@@ -219,7 +221,7 @@ get_original_date_for_test (GthTest *test,
}
-static gint64
+static int
get_embedded_title_for_test (GthTest *test,
GthFileData *file,
gconstpointer *data,
@@ -237,7 +239,7 @@ get_embedded_title_for_test (GthTest *test,
}
-static gint64
+static int
get_embedded_description_for_test (GthTest *test,
GthFileData *file,
gconstpointer *data,
@@ -255,7 +257,7 @@ get_embedded_description_for_test (GthTest *test,
}
-static gint64
+static int
get_embedded_rating_for_test (GthTest *test,
GthFileData *file,
gconstpointer *data,
diff --git a/gthumb/gth-test-simple.c b/gthumb/gth-test-simple.c
index 6de9a0ff..6b0d3e54 100644
--- a/gthumb/gth-test-simple.c
+++ b/gthumb/gth-test-simple.c
@@ -86,6 +86,7 @@ enum {
PROP_DATA_TYPE,
PROP_DATA_AS_STRING,
PROP_DATA_AS_INT,
+ PROP_DATA_AS_SIZE,
PROP_DATA_AS_DOUBLE,
PROP_DATA_AS_DATE,
PROP_GET_DATA,
@@ -99,10 +100,11 @@ enum {
struct _GthTestSimplePrivate {
GthTestDataType data_type;
union {
- char *s;
- gint64 i;
- GDate *date;
- gdouble f;
+ char *s;
+ int i;
+ guint64 size;
+ GDate *date;
+ gdouble f;
} data;
GthTestGetData get_data;
GthTestOp op;
@@ -406,11 +408,11 @@ create_control_for_size (GthTestSimple *test)
for (i = 0; i < G_N_ELEMENTS (size_data); i++) {
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (test->priv->size_combo_box),
_(size_data[i].name));
- if (! size_set && ((i == G_N_ELEMENTS (size_data) - 1) || (test->priv->data.i < size_data[i +
1].size))) {
+ if (! size_set && ((i == G_N_ELEMENTS (size_data) - 1) || (test->priv->data.size <
size_data[i + 1].size))) {
char *value;
size_idx = i;
- value = g_strdup_printf ("%.2f", (double) test->priv->data.i / size_data[i].size);
+ value = g_strdup_printf ("%.2f", (double) test->priv->data.size / size_data[i].size);
gtk_entry_set_text (GTK_ENTRY (test->priv->text_entry), value);
g_free (value);
size_set = TRUE;
@@ -702,6 +704,33 @@ test_integer (GthTestSimple *test,
}
+static gboolean
+test_size (GthTestSimple *test,
+ guint64 value)
+{
+ gboolean result = FALSE;
+
+ switch (test->priv->op) {
+ case GTH_TEST_OP_EQUAL:
+ result = (value == test->priv->data.size);
+ break;
+
+ case GTH_TEST_OP_LOWER:
+ result = (value < test->priv->data.size);
+ break;
+
+ case GTH_TEST_OP_GREATER:
+ result = (value > test->priv->data.size);
+ break;
+
+ default:
+ break;
+ }
+
+ return result;
+}
+
+
static gboolean
test_double (GthTestSimple *test,
gdouble value)
@@ -781,6 +810,18 @@ _gth_test_simple_get_int (GthTestSimple *test,
}
+static guint64
+_gth_test_simple_get_size (GthTestSimple *test,
+ GthFileData *file)
+{
+ guint64 value;
+
+ test->priv->get_data (GTH_TEST (test), file, (gpointer)&value, NULL);
+
+ return value;
+}
+
+
static gdouble
_gth_test_simple_get_double (GthTestSimple *test,
GthFileData *file)
@@ -810,10 +851,13 @@ gth_test_simple_real_match (GthTest *test,
break;
case GTH_TEST_DATA_TYPE_INT:
- case GTH_TEST_DATA_TYPE_SIZE:
result = test_integer (test_simple, _gth_test_simple_get_int (test_simple, file));
break;
+ case GTH_TEST_DATA_TYPE_SIZE:
+ result = test_size (test_simple, _gth_test_simple_get_size (test_simple, file));
+ break;
+
case GTH_TEST_DATA_TYPE_DOUBLE:
result = test_double (test_simple, _gth_test_simple_get_double (test_simple, file));
break;
@@ -833,7 +877,7 @@ gth_test_simple_real_match (GthTest *test,
break;
}
- if (test_simple->priv->negative)
+ if (test_simple->priv->negative)
result = ! result;
return result ? GTH_MATCH_YES : GTH_MATCH_NO;
@@ -864,12 +908,22 @@ gth_test_simple_real_create_element (DomDomizable *base,
break;
case GTH_TEST_DATA_TYPE_INT:
+ dom_element_set_attribute (element, "op", _g_enum_type_get_value (GTH_TYPE_TEST_OP,
self->priv->op)->value_nick);
+ if (self->priv->op != GTH_TEST_OP_NONE) {
+ if (self->priv->negative)
+ dom_element_set_attribute (element, "negative", self->priv->negative ? "true"
: "false");
+ value = g_strdup_printf ("%d", self->priv->data.i);
+ dom_element_set_attribute (element, "value", value);
+ g_free (value);
+ }
+ break;
+
case GTH_TEST_DATA_TYPE_SIZE:
dom_element_set_attribute (element, "op", _g_enum_type_get_value (GTH_TYPE_TEST_OP,
self->priv->op)->value_nick);
if (self->priv->op != GTH_TEST_OP_NONE) {
if (self->priv->negative)
dom_element_set_attribute (element, "negative", self->priv->negative ? "true"
: "false");
- value = g_strdup_printf ("%" G_GINT64_FORMAT, self->priv->data.i);
+ value = g_strdup_printf ("%" G_GUINT64_FORMAT, self->priv->data.size);
dom_element_set_attribute (element, "value", value);
g_free (value);
}
@@ -1025,7 +1079,7 @@ update_from_control_for_size (GthTestSimple *self,
size = value * size_data[gtk_combo_box_get_active (GTK_COMBO_BOX (self->priv->size_combo_box))].size;
gth_test_simple_set_data_as_size (self, size);
- if ((self->priv->data.i == 0) && (self->priv->op == GTH_TEST_OP_LOWER)) {
+ if ((self->priv->data.size == 0) && (self->priv->op == GTH_TEST_OP_LOWER)) {
if (error != NULL)
*error = g_error_new (GTH_TEST_ERROR, 0, _("The test definition is incomplete"));
return FALSE;
@@ -1176,7 +1230,7 @@ gth_test_simple_real_duplicate (GthDuplicable *duplicable)
break;
case GTH_TEST_DATA_TYPE_SIZE:
- gth_test_simple_set_data_as_size (new_test, test->priv->data.i);
+ gth_test_simple_set_data_as_size (new_test, test->priv->data.size);
break;
case GTH_TEST_DATA_TYPE_STRING:
@@ -1223,6 +1277,11 @@ gth_test_simple_set_property (GObject *object,
test->priv->data.i = g_value_get_int (value);
break;
+ case PROP_DATA_AS_SIZE:
+ _gth_test_simple_free_data (test);
+ test->priv->data.size = g_value_get_uint64 (value);
+ break;
+
case PROP_DATA_AS_DOUBLE:
_gth_test_simple_free_data (test);
test->priv->data.f = g_value_get_double (value);
@@ -1282,6 +1341,10 @@ gth_test_simple_get_property (GObject *object,
g_value_set_int (value, test->priv->data.i);
break;
+ case PROP_DATA_AS_SIZE:
+ g_value_set_uint64 (value, test->priv->data.size);
+ break;
+
case PROP_DATA_AS_DOUBLE:
g_value_set_double (value, test->priv->data.f);
break;
@@ -1360,6 +1423,15 @@ gth_test_simple_class_init (GthTestSimpleClass *class)
G_MAXINT,
0,
G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_DATA_AS_SIZE,
+ g_param_spec_uint64 ("data-as-size",
+ "Data as size",
+ "The data value as an unsigned long integer",
+ 0,
+ G_MAXUINT64,
+ 0,
+ G_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_DATA_AS_DOUBLE,
g_param_spec_double ("data-as-double",
@@ -1493,7 +1565,7 @@ gth_test_simple_set_data_as_size (GthTestSimple *test,
{
_gth_test_simple_free_data (test);
test->priv->data_type = GTH_TEST_DATA_TYPE_SIZE;
- test->priv->data.i = i;
+ test->priv->data.size = i;
}
diff --git a/gthumb/gth-test-simple.h b/gthumb/gth-test-simple.h
index 9fa7e636..fa8f9c1c 100644
--- a/gthumb/gth-test-simple.h
+++ b/gthumb/gth-test-simple.h
@@ -40,10 +40,10 @@ typedef struct _GthTestSimple GthTestSimple;
typedef struct _GthTestSimplePrivate GthTestSimplePrivate;
typedef struct _GthTestSimpleClass GthTestSimpleClass;
-typedef gint64 (*GthTestGetData) (GthTest *test,
- GthFileData *file,
- gpointer *data,
- GDestroyNotify *data_destroy_func);
+typedef int (*GthTestGetData) (GthTest *test,
+ GthFileData *file,
+ gpointer *data,
+ GDestroyNotify *data_destroy_func);
typedef enum {
GTH_TEST_DATA_TYPE_NONE,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]