2 * (LIBGLABELS) Template library for GLABELS
4 * paper.c: paper module
6 * Copyright (C) 2003, 2004 Jim Evins <evins@snaught.com>.
8 * This file is part of the LIBGLABELS library.
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Library General Public
12 * License as published by the Free Software Foundation; either
13 * version 2 of the License, or (at your option) any later version.
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Library General Public License for more details.
20 * You should have received a copy of the GNU Library General Public
21 * License along with this library; if not, write to the Free
22 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
26 #include "libglabels-private.h"
31 #include "xml-paper.h"
33 /*===========================================*/
35 /*===========================================*/
37 /*===========================================*/
39 /*===========================================*/
41 static GList *papers = NULL;
43 /*===========================================*/
44 /* Local function prototypes */
45 /*===========================================*/
47 static GList *read_papers (void);
48 static GList *read_paper_files_from_dir (GList *papers,
49 const gchar *dirname);
52 /*****************************************************************************/
53 /* Initialize module. */
54 /*****************************************************************************/
61 return; /* Already initialized. */
64 papers = read_papers ();
66 /* Create and append an "Other" entry. */
67 other = gl_paper_new ("Other", _("Other"), 0.0, 0.0);
68 papers = g_list_append (papers, other);
71 /*****************************************************************************/
72 /* Create a new paper structure. */
73 /*****************************************************************************/
75 gl_paper_new (gchar *id,
82 paper = g_new0 (glPaper,1);
83 paper->id = g_strdup (id);
84 paper->name = g_strdup (name);
86 paper->height = height;
91 /*****************************************************************************/
93 /*****************************************************************************/
94 glPaper *gl_paper_dup (const glPaper *orig_paper)
98 g_return_val_if_fail (orig_paper, NULL);
100 paper = g_new0 (glPaper,1);
102 paper->id = g_strdup (orig_paper->id);
103 paper->name = g_strdup (orig_paper->name);
104 paper->width = orig_paper->width;
105 paper->height = orig_paper->height;
110 /*****************************************************************************/
111 /* Free up a paper. */
112 /*****************************************************************************/
113 void gl_paper_free (glPaper *paper)
116 if ( paper != NULL ) {
121 g_free (paper->name);
129 /*****************************************************************************/
130 /* Get a list of known page size ids */
131 /*****************************************************************************/
133 gl_paper_get_id_list (void)
143 for ( p=papers; p != NULL; p=p->next ) {
144 paper = (glPaper *)p->data;
145 ids = g_list_append (ids, g_strdup (paper->id));
151 /*****************************************************************************/
152 /* Free a list of page size ids. */
153 /*****************************************************************************/
155 gl_paper_free_id_list (GList *ids)
159 for (p = ids; p != NULL; p = p->next) {
167 /*****************************************************************************/
168 /* Get a list of known page size names */
169 /*****************************************************************************/
171 gl_paper_get_name_list (void)
181 for ( p=papers; p != NULL; p=p->next ) {
182 paper = (glPaper *)p->data;
183 names = g_list_append (names, g_strdup (paper->name));
189 /*****************************************************************************/
190 /* Free a list of page size names. */
191 /*****************************************************************************/
193 gl_paper_free_name_list (GList *names)
197 for (p = names; p != NULL; p = p->next) {
205 /*****************************************************************************/
206 /* Is page size id known? */
207 /*****************************************************************************/
209 gl_paper_is_id_known (const gchar *id)
222 for (p = papers; p != NULL; p = p->next) {
223 paper = (glPaper *) p->data;
224 if (g_strcasecmp (paper->id, id) == 0) {
232 /*****************************************************************************/
233 /* Is page size id "Other?" */
234 /*****************************************************************************/
236 gl_paper_is_id_other (const gchar *id)
242 return (g_strcasecmp (id, "Other") == 0);
245 /*****************************************************************************/
246 /* Return a paper structure from id. */
247 /*****************************************************************************/
249 gl_paper_from_id (const gchar *id)
259 /* If no id, return first paper as a default */
260 return gl_paper_dup ((glPaper *) papers->data);
263 for (p = papers; p != NULL; p = p->next) {
264 paper = (glPaper *) p->data;
265 if (g_strcasecmp (paper->id, id) == 0) {
266 return gl_paper_dup (paper);
273 /*****************************************************************************/
274 /* Return a paper structure from name. */
275 /*****************************************************************************/
277 gl_paper_from_name (const gchar *name)
287 /* If no name, return first paper as a default */
288 return gl_paper_dup ((glPaper *) papers->data);
291 for (p = papers; p != NULL; p = p->next) {
292 paper = (glPaper *) p->data;
293 if (g_strcasecmp (paper->name, name) == 0) {
294 return gl_paper_dup (paper);
301 /*****************************************************************************/
302 /* Lookup paper id from name. */
303 /*****************************************************************************/
305 gl_paper_lookup_id_from_name (const gchar *name)
307 glPaper *paper = NULL;
310 g_return_val_if_fail (name, NULL);
312 paper = gl_paper_from_name (name);
313 if ( paper != NULL ) {
314 id = g_strdup (paper->id);
315 gl_paper_free (paper);
322 /*****************************************************************************/
323 /* Lookup paper name from id. */
324 /*****************************************************************************/
326 gl_paper_lookup_name_from_id (const gchar *id)
328 glPaper *paper = NULL;
331 g_return_val_if_fail (id, NULL);
333 paper = gl_paper_from_id (id);
334 if ( paper != NULL ) {
335 name = g_strdup (paper->name);
336 gl_paper_free (paper);
343 /*--------------------------------------------------------------------------*/
344 /* PRIVATE. Read papers from various files. */
345 /*--------------------------------------------------------------------------*/
350 GList *papers = NULL;
352 data_dir = GL_SYSTEM_DATA_DIR;
353 papers = read_paper_files_from_dir (papers, data_dir);
356 data_dir = GL_USER_DATA_DIR;
357 papers = read_paper_files_from_dir (papers, data_dir);
360 if (papers == NULL) {
361 g_warning (_("No paper files found!"));
367 /*--------------------------------------------------------------------------*/
368 /* PRIVATE. Read all paper files from given directory. Append to list. */
369 /*--------------------------------------------------------------------------*/
371 read_paper_files_from_dir (GList *papers,
372 const gchar *dirname)
375 const gchar *filename, *extension;
376 gchar *full_filename = NULL;
377 GError *gerror = NULL;
378 GList *new_papers = NULL;
380 if (dirname == NULL) {
384 if (!g_file_test (dirname, G_FILE_TEST_EXISTS)) {
388 dp = g_dir_open (dirname, 0, &gerror);
389 if (gerror != NULL) {
390 g_warning ("cannot open data directory: %s", gerror->message );
394 while ((filename = g_dir_read_name (dp)) != NULL) {
396 extension = strrchr (filename, '.');
398 if (extension != NULL) {
400 if ( (g_strcasecmp (extension, ".paper") == 0)
401 || (g_strcasecmp (filename, "paper-sizes.xml") == 0) ) {
404 g_build_filename (dirname, filename, NULL);
406 gl_xml_paper_read_papers_from_file (full_filename);
407 g_free (full_filename);
409 papers = g_list_concat (papers, new_papers);
423 /*****************************************************************************/
424 /* Print known papers (for debugging purposes) */
425 /*****************************************************************************/
427 gl_paper_print_known_papers (void)
436 g_print ("%s():\n", __FUNCTION__);
437 for (p = papers; p != NULL; p = p->next) {
438 paper = (glPaper *) p->data;
440 g_print ("PAPER id=\"%s\", name=\"%s\", width=%gpts, height=%gpts\n",
441 paper->id, paper->name, paper->width, paper->height);