Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 69 additions & 19 deletions cpdb/cpdb-frontend.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
Expand All @@ -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);
}

}
/************************************************************************************************/
52 changes: 50 additions & 2 deletions cpdb/cpdb-frontend.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 *);
Expand Down Expand Up @@ -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
*
Expand All @@ -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;
Expand Down Expand Up @@ -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**/
};

/**
Expand All @@ -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 __________________________________________
Expand Down Expand Up @@ -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
}
Expand Down
15 changes: 15 additions & 0 deletions cpdb/cpdb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions cpdb/cpdb.h
Original file line number Diff line number Diff line change
Expand Up @@ -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*****/
Expand Down
8 changes: 3 additions & 5 deletions cpdb/interface/org.openprinting.Backend.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,6 @@
<arg name="choice_name" direction="in" type="s"/>
<arg name="human_readable_name" direction="out" type="s"/>
</method>
<method name="getMediaSize">
<arg name="media" direction="in" type="s"/>
<arg name="dimensions" direction="out" type="(ii)"/>
<!-- dimension contents: width, length -->
</method>
<method name="isAcceptingJobs">
<arg name="printer_id" direction="in" type="s"/>
<arg name="is_accepting" direction="out" type="b"/>
Expand All @@ -48,6 +43,9 @@
<arg name="num_options" direction="out" type="i" />
<arg name="options" direction="out" type="a(ssia(s))" />
<!--option contents: option name, default value , number of supported values , array of supported values-->
<arg name="num_media" direction="out" type="i" />
<arg name="media" direction="out" type="a(siiia(iiii))" />
<!-- media contents: media name, width, length, number of supported margins, array of margins (left, right, top, bottom) -->
</method>
<method name="getActiveJobsCount">
<arg name="printer_id" direction="in" type="s"/>
Expand Down
14 changes: 14 additions & 0 deletions demo/print_frontend.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down Expand Up @@ -331,6 +344,7 @@ void display_help()
printf("%s\n", "add-setting <option name> <option value> <printer id> <backend name>");
printf("%s\n", "clear-setting <option name> <printer id> <backend name>");
printf("%s\n", "get-media-size <media> <printer id> <backend name>");
printf("%s\n", "get-media-margins <media> <printer id> <backend name>");
printf("%s\n", "get-human-readable-option-name <printer id> <backend name> <option name>");
printf("%s\n", "get-human-readable-choice-name <printer id> <backend name> <option name> <choice name>");

Expand Down