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