Skip to content

Commit f30fd60

Browse files
support for each media having different multiple margins (OpenPrinting#8)
1 parent d5d2b2e commit f30fd60

File tree

6 files changed

+152
-26
lines changed

6 files changed

+152
-26
lines changed

cpdb/cpdb-frontend.c

Lines changed: 69 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -421,13 +421,13 @@ cpdb_options_t *cpdbGetAllOptions(cpdb_printer_obj_t *p)
421421

422422
p->options = cpdbGetNewOptions();
423423
GError *error = NULL;
424-
int num_options;
425-
GVariant *var;
424+
int num_options, num_media;
425+
GVariant *var, *media_var;
426426
print_backend_call_get_all_options_sync(p->backend_proxy, p->id,
427-
&num_options, &var, NULL, &error);
427+
&num_options, &var, &num_media, &media_var, NULL, &error);
428428
if (!error)
429429
{
430-
cpdbUnpackOptions(var, num_options, p->options);
430+
cpdbUnpackOptions(num_options, var, num_media, media_var, p->options);
431431
return p->options;
432432
}
433433
else
@@ -651,18 +651,40 @@ char *cpdbGetHumanReadableChoiceName(cpdb_printer_obj_t *p, const char *option_n
651651
}
652652
}
653653

654-
void cpdbGetMediaSize(cpdb_printer_obj_t *p, const char *media_size, int *width, int *length)
654+
cpdb_media_t *cpdbGetMedia(cpdb_printer_obj_t *p, const char *media)
655655
{
656-
GError *error = NULL;
657-
GVariant *var;
658-
print_backend_call_get_media_size_sync(p->backend_proxy, media_size,
659-
&var, NULL, &error);
660-
if (!error)
661-
g_variant_get(var, "(ii)", width, length);
662-
else
656+
cpdbGetAllOptions(p);
657+
658+
return (cpdb_media_t *) g_hash_table_lookup(p->options->media, media);
659+
}
660+
661+
void cpdbGetMediaSize(cpdb_printer_obj_t *p, const char *media, int *width, int *length)
662+
{
663+
cpdb_media_t *m = cpdbGetMedia(p, media);
664+
if (m)
663665
{
664-
CPDB_DEBUG_LOG("Error getting media size", error->message, CPDB_DEBUG_LEVEL_ERR);
665-
}
666+
*width = m->width;
667+
*length = m->length;
668+
}
669+
else
670+
{
671+
*width = 0;
672+
*length = 0;
673+
}
674+
}
675+
676+
int cpdbGetMediaMargins(cpdb_printer_obj_t *p, const char *media, cpdb_margin_t **margins)
677+
{
678+
int num_margins = 0;
679+
cpdb_media_t *m = cpdbGetMedia(p, media);
680+
681+
if (m)
682+
{
683+
num_margins = m->num_margins;
684+
*margins = m->margins;
685+
}
686+
687+
return num_margins;
666688
}
667689

668690
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
674696

675697
p->options = cpdbGetNewOptions();
676698
GError *error = NULL;
677-
int num_options;
678-
GVariant *var;
699+
int num_options, num_media;
700+
GVariant *var, *media_var;
679701

680-
print_backend_call_get_all_options_finish (proxy, &num_options, &var, res, &error);
702+
print_backend_call_get_all_options_finish (proxy, &num_options, &var, &num_media, &media_var, res, &error);
681703

682704
if (!error)
683705
{
684-
cpdbUnpackOptions(var, num_options, p->options);
706+
cpdbUnpackOptions(num_options, var, num_media, media_var, p->options);
685707
caller_cb(p, TRUE, a->user_data);
686708
}
687709
else
@@ -848,6 +870,7 @@ cpdb_options_t *cpdbGetNewOptions()
848870
cpdb_options_t *o = g_new0(cpdb_options_t, 1);
849871
o->count = 0;
850872
o->table = g_hash_table_new(g_str_hash, g_str_equal);
873+
o->media = g_hash_table_new(g_str_hash, g_str_equal);
851874
return o;
852875
}
853876

@@ -913,7 +936,7 @@ char *cpdbConcat(const char *printer_id, const char *backend_name)
913936
return str;
914937
}
915938

916-
void cpdbUnpackOptions(GVariant *var, int num_options, cpdb_options_t *options)
939+
void cpdbUnpackOptions(int num_options, GVariant *var, int num_media, GVariant *media_var, cpdb_options_t *options)
917940
{
918941
options->count = num_options;
919942
int i, j;
@@ -940,5 +963,32 @@ void cpdbUnpackOptions(GVariant *var, int num_options, cpdb_options_t *options)
940963
}
941964
g_hash_table_insert(options->table, (gpointer)opt->option_name, (gpointer)opt);
942965
}
966+
967+
options->media_count = num_media;
968+
int width, length, num_mar;
969+
GVariantIter *media_iter, *margin_iter;
970+
g_variant_get(media_var, "a(siiia(iiii))", &media_iter);
971+
cpdb_media_t *media;
972+
for (i = 0; i < num_media; i++)
973+
{
974+
media = g_new0(cpdb_media_t, 1);
975+
g_variant_iter_loop(media_iter, "(siiia(iiii))",
976+
&name, &width, &length, &num_mar, &margin_iter);
977+
media->name = cpdbGetStringCopy(name);
978+
media->width = width;
979+
media->length = length;
980+
media->num_margins = num_mar;
981+
media->margins = malloc(sizeof(cpdb_printer_obj_t) * num_mar);
982+
for (j = 0; j < num_mar; j++)
983+
{
984+
g_variant_iter_loop(margin_iter, "(iiii)",
985+
&media->margins[j].left,
986+
&media->margins[j].right,
987+
&media->margins[j].top,
988+
&media->margins[j].bottom);
989+
}
990+
g_hash_table_insert(options->media, (gpointer)media->name, (gpointer) media);
991+
}
992+
943993
}
944994
/************************************************************************************************/

cpdb/cpdb-frontend.h

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ typedef struct cpdb_async_obj_s cpdb_async_obj_t;
3030
typedef struct cpdb_settings_s cpdb_settings_t;
3131
typedef struct cpdb_options_s cpdb_options_t;
3232
typedef struct cpdb_option_s cpdb_option_t;
33+
typedef struct cpdb_margin_s cpdb_margin_t;
34+
typedef struct cpdb_media_s cpdb_media_t;
3335
typedef struct cpdb_job_s cpdb_job_t;
3436

3537
typedef int (*cpdb_event_callback)(cpdb_printer_obj_t *);
@@ -348,6 +350,13 @@ char *cpdbGetHumanReadableOptionName(cpdb_printer_obj_t *p, const char *option_n
348350
*/
349351
char *cpdbGetHumanReadableChoiceName(cpdb_printer_obj_t *p, const char *option_name, const char *choice_name);
350352

353+
/**
354+
* Get a single cpdb_media_t struct corresponding to the give media name
355+
*
356+
* @param media : name of media-size
357+
*/
358+
cpdb_media_t *cpdbGetMedia(cpdb_printer_obj_t *p, const char *media);
359+
351360
/**
352361
* Finds the dimension for a given media-size
353362
*
@@ -357,6 +366,14 @@ char *cpdbGetHumanReadableChoiceName(cpdb_printer_obj_t *p, const char *option_n
357366
*/
358367
void cpdbGetMediaSize(cpdb_printer_obj_t *p, const char *media, int *width, int *length);
359368

369+
/**
370+
* Find the margins for a given media-size
371+
*
372+
* @param media : name of media-size
373+
* @param margins : margins array
374+
*/
375+
int cpdbGetMediaMargins(cpdb_printer_obj_t *p, const char *media, cpdb_margin_t **margins);
376+
360377

361378
struct cpdb_async_obj_s {
362379
cpdb_printer_obj_t *p;
@@ -447,8 +464,9 @@ ______________________________________ cpdb_options_t __________________________
447464
**/
448465
struct cpdb_options_s
449466
{
450-
int count;
467+
int count; int media_count;
451468
GHashTable *table; /**[name] --> cpdb_option_t struct**/
469+
GHashTable *media; /**[name] --> cpdb_media_t struct**/
452470
};
453471

454472
/**
@@ -470,6 +488,36 @@ struct cpdb_option_s
470488
};
471489
void cpdbPrintOption(const cpdb_option_t *opt);
472490

491+
/************************************************************************************************/
492+
493+
/**
494+
______________________________________ cpdb_margin_t __________________________________________
495+
496+
**/
497+
498+
struct cpdb_margin_s
499+
{
500+
int left;
501+
int right;
502+
int top;
503+
int bottom;
504+
};
505+
506+
/************************************************************************************************/
507+
/**
508+
______________________________________ cpdb_media_t __________________________________________
509+
510+
**/
511+
512+
struct cpdb_media_s
513+
{
514+
const char *name;
515+
int width;
516+
int length;
517+
int num_margins;
518+
cpdb_margin_t *margins;
519+
};
520+
473521
/************************************************************************************************/
474522
/**
475523
______________________________________ cpdb_job_t __________________________________________
@@ -497,7 +545,7 @@ char *cpdbConcat(const char *printer_id, const char *backend_name);
497545
* 'Unpack' (Deserialize) the GVariant returned in cpdbGetAllOptions
498546
* and fill the cpdb_options_t structure approriately
499547
*/
500-
void cpdbUnpackOptions(GVariant *var, int num_options, cpdb_options_t *options);
548+
void cpdbUnpackOptions(int num_options, GVariant *var, int num_media, GVariant *media_var, cpdb_options_t *options);
501549

502550
#ifdef __cplusplus
503551
}

cpdb/cpdb.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,21 @@ GVariant *cpdbPackStringArray(int num_val, char **val)
6363
return values;
6464
}
6565

66+
GVariant *cpdbPackMediaArray(int num_val, int (*margins)[4])
67+
{
68+
GVariantBuilder *builder;
69+
GVariant *values;
70+
builder = g_variant_builder_new(G_VARIANT_TYPE("a(iiii)"));
71+
for (int i = 0; i < num_val; i++)
72+
{
73+
g_variant_builder_add(builder, "(iiii)",
74+
margins[i][0], margins[i][1], margins[i][2], margins[i][3]);
75+
}
76+
77+
values = g_variant_new("a(iiii)", builder);
78+
return values;
79+
}
80+
6681
char *cpdbGetAbsolutePath(const char *file_path)
6782
{
6883
if (!file_path)

cpdb/cpdb.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ gboolean cpdbGetBoolean(const char *);
2828
char *cpdbGetStringCopy(const char *);
2929
void cpdbUnpackStringArray(GVariant *variant, int num_val, char ***val);
3030
GVariant *cpdbPackStringArray(int num_val, char **val);
31+
GVariant *cpdbPackMediaArray(int num_val, int (*margins)[4]);
3132
char *cpdbGetAbsolutePath(const char *file_path);
3233
char *cpdbExtractFileName(const char* file_path);
3334
/*********LISTING OF ALL POSSIBLE OPTIONS*****/

cpdb/interface/org.openprinting.Backend.xml

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,6 @@
3434
<arg name="choice_name" direction="in" type="s"/>
3535
<arg name="human_readable_name" direction="out" type="s"/>
3636
</method>
37-
<method name="getMediaSize">
38-
<arg name="media" direction="in" type="s"/>
39-
<arg name="dimensions" direction="out" type="(ii)"/>
40-
<!-- dimension contents: width, length -->
41-
</method>
4237
<method name="isAcceptingJobs">
4338
<arg name="printer_id" direction="in" type="s"/>
4439
<arg name="is_accepting" direction="out" type="b"/>
@@ -48,6 +43,9 @@
4843
<arg name="num_options" direction="out" type="i" />
4944
<arg name="options" direction="out" type="a(ssia(s))" />
5045
<!--option contents: option name, default value , number of supported values , array of supported values-->
46+
<arg name="num_media" direction="out" type="i" />
47+
<arg name="media" direction="out" type="a(siiia(iiii))" />
48+
<!-- media contents: media name, width, length, number of supported margins, array of margins (left, right, top, bottom) -->
5149
</method>
5250
<method name="getActiveJobsCount">
5351
<arg name="printer_id" direction="in" type="s"/>

demo/print_frontend.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,19 @@ gpointer parse_commands(gpointer user_data)
289289
cpdbGetMediaSize(p, media, &width, &length);
290290
printf("%dx%d\n", width, length);
291291
}
292+
else if (strcmp(buf, "get-media-margins") == 0)
293+
{
294+
char printer_id[100];
295+
char backend_name[100];
296+
char media[100];
297+
scanf("%s%s%s", media, printer_id, backend_name);
298+
cpdb_printer_obj_t *p = cpdbFindPrinterObj(f, printer_id, backend_name);
299+
300+
cpdb_margin_t *margins;
301+
int num_margins = cpdbGetMediaMargins(p, media, &margins);
302+
for (int i = 0; i < num_margins; i++)
303+
printf("%d %d %d %d\n", margins[i].left, margins[i].right, margins[i].top, margins[i].bottom);
304+
}
292305
else if (strcmp(buf, "acquire-details") == 0)
293306
{
294307
char printer_id[100];
@@ -331,6 +344,7 @@ void display_help()
331344
printf("%s\n", "add-setting <option name> <option value> <printer id> <backend name>");
332345
printf("%s\n", "clear-setting <option name> <printer id> <backend name>");
333346
printf("%s\n", "get-media-size <media> <printer id> <backend name>");
347+
printf("%s\n", "get-media-margins <media> <printer id> <backend name>");
334348
printf("%s\n", "get-human-readable-option-name <printer id> <backend name> <option name>");
335349
printf("%s\n", "get-human-readable-choice-name <printer id> <backend name> <option name> <choice name>");
336350

0 commit comments

Comments
 (0)