diff --git a/cpdb/cpdb-frontend.c b/cpdb/cpdb-frontend.c
index d317b9c..b4e5914 100644
--- a/cpdb/cpdb-frontend.c
+++ b/cpdb/cpdb-frontend.c
@@ -421,13 +421,13 @@ cpdb_options_t *cpdbGetAllOptions(cpdb_printer_obj_t *p)
p->options = cpdbGetNewOptions();
GError *error = NULL;
- int num_options;
- GVariant *var;
+ int num_options, num_media;
+ GVariant *var, *media_var;
print_backend_call_get_all_options_sync(p->backend_proxy, p->id,
- &num_options, &var, NULL, &error);
+ &num_options, &var, &num_media, &media_var, NULL, &error);
if (!error)
{
- cpdbUnpackOptions(var, num_options, p->options);
+ cpdbUnpackOptions(num_options, var, num_media, media_var, p->options);
return p->options;
}
else
@@ -651,18 +651,40 @@ char *cpdbGetHumanReadableChoiceName(cpdb_printer_obj_t *p, const char *option_n
}
}
-void cpdbGetMediaSize(cpdb_printer_obj_t *p, const char *media_size, int *width, int *length)
+cpdb_media_t *cpdbGetMedia(cpdb_printer_obj_t *p, const char *media)
{
- GError *error = NULL;
- GVariant *var;
- print_backend_call_get_media_size_sync(p->backend_proxy, media_size,
- &var, NULL, &error);
- if (!error)
- g_variant_get(var, "(ii)", width, length);
- else
+ cpdbGetAllOptions(p);
+
+ return (cpdb_media_t *) g_hash_table_lookup(p->options->media, media);
+}
+
+void cpdbGetMediaSize(cpdb_printer_obj_t *p, const char *media, int *width, int *length)
+{
+ cpdb_media_t *m = cpdbGetMedia(p, media);
+ if (m)
{
- CPDB_DEBUG_LOG("Error getting media size", error->message, CPDB_DEBUG_LEVEL_ERR);
- }
+ *width = m->width;
+ *length = m->length;
+ }
+ else
+ {
+ *width = 0;
+ *length = 0;
+ }
+}
+
+int cpdbGetMediaMargins(cpdb_printer_obj_t *p, const char *media, cpdb_margin_t **margins)
+{
+ int num_margins = 0;
+ cpdb_media_t *m = cpdbGetMedia(p, media);
+
+ if (m)
+ {
+ num_margins = m->num_margins;
+ *margins = m->margins;
+ }
+
+ return num_margins;
}
void acquire_details_cb(PrintBackend *proxy, GAsyncResult *res, gpointer user_data)
@@ -674,14 +696,14 @@ void acquire_details_cb(PrintBackend *proxy, GAsyncResult *res, gpointer user_da
p->options = cpdbGetNewOptions();
GError *error = NULL;
- int num_options;
- GVariant *var;
+ int num_options, num_media;
+ GVariant *var, *media_var;
- print_backend_call_get_all_options_finish (proxy, &num_options, &var, res, &error);
+ print_backend_call_get_all_options_finish (proxy, &num_options, &var, &num_media, &media_var, res, &error);
if (!error)
{
- cpdbUnpackOptions(var, num_options, p->options);
+ cpdbUnpackOptions(num_options, var, num_media, media_var, p->options);
caller_cb(p, TRUE, a->user_data);
}
else
@@ -848,6 +870,7 @@ cpdb_options_t *cpdbGetNewOptions()
cpdb_options_t *o = g_new0(cpdb_options_t, 1);
o->count = 0;
o->table = g_hash_table_new(g_str_hash, g_str_equal);
+ o->media = g_hash_table_new(g_str_hash, g_str_equal);
return o;
}
@@ -913,7 +936,7 @@ char *cpdbConcat(const char *printer_id, const char *backend_name)
return str;
}
-void cpdbUnpackOptions(GVariant *var, int num_options, cpdb_options_t *options)
+void cpdbUnpackOptions(int num_options, GVariant *var, int num_media, GVariant *media_var, cpdb_options_t *options)
{
options->count = num_options;
int i, j;
@@ -940,5 +963,32 @@ void cpdbUnpackOptions(GVariant *var, int num_options, cpdb_options_t *options)
}
g_hash_table_insert(options->table, (gpointer)opt->option_name, (gpointer)opt);
}
+
+ options->media_count = num_media;
+ int width, length, num_mar;
+ GVariantIter *media_iter, *margin_iter;
+ g_variant_get(media_var, "a(siiia(iiii))", &media_iter);
+ cpdb_media_t *media;
+ for (i = 0; i < num_media; i++)
+ {
+ media = g_new0(cpdb_media_t, 1);
+ g_variant_iter_loop(media_iter, "(siiia(iiii))",
+ &name, &width, &length, &num_mar, &margin_iter);
+ media->name = cpdbGetStringCopy(name);
+ media->width = width;
+ media->length = length;
+ media->num_margins = num_mar;
+ media->margins = malloc(sizeof(cpdb_printer_obj_t) * num_mar);
+ for (j = 0; j < num_mar; j++)
+ {
+ g_variant_iter_loop(margin_iter, "(iiii)",
+ &media->margins[j].left,
+ &media->margins[j].right,
+ &media->margins[j].top,
+ &media->margins[j].bottom);
+ }
+ g_hash_table_insert(options->media, (gpointer)media->name, (gpointer) media);
+ }
+
}
/************************************************************************************************/
diff --git a/cpdb/cpdb-frontend.h b/cpdb/cpdb-frontend.h
index 199a501..19dab42 100644
--- a/cpdb/cpdb-frontend.h
+++ b/cpdb/cpdb-frontend.h
@@ -30,6 +30,8 @@ typedef struct cpdb_async_obj_s cpdb_async_obj_t;
typedef struct cpdb_settings_s cpdb_settings_t;
typedef struct cpdb_options_s cpdb_options_t;
typedef struct cpdb_option_s cpdb_option_t;
+typedef struct cpdb_margin_s cpdb_margin_t;
+typedef struct cpdb_media_s cpdb_media_t;
typedef struct cpdb_job_s cpdb_job_t;
typedef int (*cpdb_event_callback)(cpdb_printer_obj_t *);
@@ -348,6 +350,13 @@ char *cpdbGetHumanReadableOptionName(cpdb_printer_obj_t *p, const char *option_n
*/
char *cpdbGetHumanReadableChoiceName(cpdb_printer_obj_t *p, const char *option_name, const char *choice_name);
+/**
+ * Get a single cpdb_media_t struct corresponding to the give media name
+ *
+ * @param media : name of media-size
+ */
+cpdb_media_t *cpdbGetMedia(cpdb_printer_obj_t *p, const char *media);
+
/**
* Finds the dimension for a given media-size
*
@@ -357,6 +366,14 @@ char *cpdbGetHumanReadableChoiceName(cpdb_printer_obj_t *p, const char *option_n
*/
void cpdbGetMediaSize(cpdb_printer_obj_t *p, const char *media, int *width, int *length);
+/**
+ * Find the margins for a given media-size
+ *
+ * @param media : name of media-size
+ * @param margins : margins array
+ */
+int cpdbGetMediaMargins(cpdb_printer_obj_t *p, const char *media, cpdb_margin_t **margins);
+
struct cpdb_async_obj_s {
cpdb_printer_obj_t *p;
@@ -447,8 +464,9 @@ ______________________________________ cpdb_options_t __________________________
**/
struct cpdb_options_s
{
- int count;
+ int count; int media_count;
GHashTable *table; /**[name] --> cpdb_option_t struct**/
+ GHashTable *media; /**[name] --> cpdb_media_t struct**/
};
/**
@@ -470,6 +488,36 @@ struct cpdb_option_s
};
void cpdbPrintOption(const cpdb_option_t *opt);
+/************************************************************************************************/
+
+/**
+______________________________________ cpdb_margin_t __________________________________________
+
+**/
+
+struct cpdb_margin_s
+{
+ int left;
+ int right;
+ int top;
+ int bottom;
+};
+
+/************************************************************************************************/
+/**
+______________________________________ cpdb_media_t __________________________________________
+
+**/
+
+struct cpdb_media_s
+{
+ const char *name;
+ int width;
+ int length;
+ int num_margins;
+ cpdb_margin_t *margins;
+};
+
/************************************************************************************************/
/**
______________________________________ cpdb_job_t __________________________________________
@@ -497,7 +545,7 @@ char *cpdbConcat(const char *printer_id, const char *backend_name);
* 'Unpack' (Deserialize) the GVariant returned in cpdbGetAllOptions
* and fill the cpdb_options_t structure approriately
*/
-void cpdbUnpackOptions(GVariant *var, int num_options, cpdb_options_t *options);
+void cpdbUnpackOptions(int num_options, GVariant *var, int num_media, GVariant *media_var, cpdb_options_t *options);
#ifdef __cplusplus
}
diff --git a/cpdb/cpdb.c b/cpdb/cpdb.c
index 9de95a1..ce15c6d 100644
--- a/cpdb/cpdb.c
+++ b/cpdb/cpdb.c
@@ -63,6 +63,21 @@ GVariant *cpdbPackStringArray(int num_val, char **val)
return values;
}
+GVariant *cpdbPackMediaArray(int num_val, int (*margins)[4])
+{
+ GVariantBuilder *builder;
+ GVariant *values;
+ builder = g_variant_builder_new(G_VARIANT_TYPE("a(iiii)"));
+ for (int i = 0; i < num_val; i++)
+ {
+ g_variant_builder_add(builder, "(iiii)",
+ margins[i][0], margins[i][1], margins[i][2], margins[i][3]);
+ }
+
+ values = g_variant_new("a(iiii)", builder);
+ return values;
+}
+
char *cpdbGetAbsolutePath(const char *file_path)
{
if (!file_path)
diff --git a/cpdb/cpdb.h b/cpdb/cpdb.h
index 1b6e9ef..8e6e45e 100644
--- a/cpdb/cpdb.h
+++ b/cpdb/cpdb.h
@@ -28,6 +28,7 @@ gboolean cpdbGetBoolean(const char *);
char *cpdbGetStringCopy(const char *);
void cpdbUnpackStringArray(GVariant *variant, int num_val, char ***val);
GVariant *cpdbPackStringArray(int num_val, char **val);
+GVariant *cpdbPackMediaArray(int num_val, int (*margins)[4]);
char *cpdbGetAbsolutePath(const char *file_path);
char *cpdbExtractFileName(const char* file_path);
/*********LISTING OF ALL POSSIBLE OPTIONS*****/
diff --git a/cpdb/interface/org.openprinting.Backend.xml b/cpdb/interface/org.openprinting.Backend.xml
index 27f07d7..e821fc0 100644
--- a/cpdb/interface/org.openprinting.Backend.xml
+++ b/cpdb/interface/org.openprinting.Backend.xml
@@ -34,11 +34,6 @@
-
-
-
-
-
@@ -48,6 +43,9 @@
+
+
+
diff --git a/demo/print_frontend.c b/demo/print_frontend.c
index 0ae2c55..24145a9 100644
--- a/demo/print_frontend.c
+++ b/demo/print_frontend.c
@@ -289,6 +289,19 @@ gpointer parse_commands(gpointer user_data)
cpdbGetMediaSize(p, media, &width, &length);
printf("%dx%d\n", width, length);
}
+ else if (strcmp(buf, "get-media-margins") == 0)
+ {
+ char printer_id[100];
+ char backend_name[100];
+ char media[100];
+ scanf("%s%s%s", media, printer_id, backend_name);
+ cpdb_printer_obj_t *p = cpdbFindPrinterObj(f, printer_id, backend_name);
+
+ cpdb_margin_t *margins;
+ int num_margins = cpdbGetMediaMargins(p, media, &margins);
+ for (int i = 0; i < num_margins; i++)
+ printf("%d %d %d %d\n", margins[i].left, margins[i].right, margins[i].top, margins[i].bottom);
+ }
else if (strcmp(buf, "acquire-details") == 0)
{
char printer_id[100];
@@ -331,6 +344,7 @@ void display_help()
printf("%s\n", "add-setting