@@ -23,13 +23,40 @@ cpdb_frontend_obj_t *cpdbGetNewFrontendObj(char *instance_name,
2323 f -> add_cb = add_cb ;
2424 f -> rem_cb = rem_cb ;
2525 f -> num_backends = 0 ;
26- f -> backend = g_hash_table_new (g_str_hash , g_str_equal );
26+ f -> backend = g_hash_table_new_full (g_str_hash ,
27+ g_str_equal ,
28+ free ,
29+ g_object_unref );
2730 f -> num_printers = 0 ;
28- f -> printer = g_hash_table_new (g_str_hash , g_str_equal );
31+ f -> printer = g_hash_table_new_full (g_str_hash ,
32+ g_str_equal ,
33+ free ,
34+ (GDestroyNotify ) cpdbDeletePrinterObj );
2935 f -> last_saved_settings = cpdbReadSettingsFromDisk ();
3036 return f ;
3137}
3238
39+ void cpdbDeleteFrontendObj (cpdb_frontend_obj_t * f )
40+ {
41+ if (f == NULL )
42+ return ;
43+
44+ cpdbDisconnectFromDBus (f );
45+
46+ if (f -> skeleton )
47+ g_object_unref (f -> skeleton );
48+ if (f -> bus_name )
49+ free (f -> bus_name );
50+ if (f -> backend )
51+ g_hash_table_destroy (f -> backend );
52+ if (f -> printer )
53+ g_hash_table_destroy (f -> printer );
54+ if (f -> last_saved_settings )
55+ cpdbDeleteSettings (f -> last_saved_settings );
56+
57+ free (f );
58+ }
59+
3360static void on_printer_added (GDBusConnection * connection ,
3461 const gchar * sender_name ,
3562 const gchar * object_path ,
@@ -169,6 +196,9 @@ void cpdbConnectToDBus(cpdb_frontend_obj_t *f)
169196
170197void cpdbDisconnectFromDBus (cpdb_frontend_obj_t * f )
171198{
199+ if (f -> connection == NULL || g_dbus_connection_is_closed (f -> connection ))
200+ return ;
201+
172202 print_frontend_emit_stop_listing (f -> skeleton );
173203 g_dbus_connection_flush_sync (f -> connection , NULL , NULL );
174204
@@ -272,6 +302,7 @@ gboolean cpdbAddPrinter(cpdb_frontend_obj_t *f,
272302 CPDB_DEBUG_LEVEL_ERR );
273303 return FALSE;
274304 }
305+ g_object_ref (p -> backend_proxy );
275306
276307 g_hash_table_insert (f -> printer , cpdbConcatSep (p -> id , p -> backend_name ), p );
277308 f -> num_printers ++ ;
@@ -298,20 +329,17 @@ cpdb_printer_obj_t *cpdbRemovePrinter(cpdb_frontend_obj_t *f,
298329 return p ;
299330}
300331
301- void
302- cpdbRefreshPrinterList (cpdb_frontend_obj_t * f )
332+ void cpdbRefreshPrinterList (cpdb_frontend_obj_t * f )
303333{
304334 print_frontend_emit_refresh_backend (f -> skeleton );
305335}
306336
307- void
308- cpdbHideRemotePrinters (cpdb_frontend_obj_t * f )
337+ void cpdbHideRemotePrinters (cpdb_frontend_obj_t * f )
309338{
310339 print_frontend_emit_hide_remote_printers (f -> skeleton );
311340}
312341
313- void
314- cpdbUnhideRemotePrinters (cpdb_frontend_obj_t * f )
342+ void cpdbUnhideRemotePrinters (cpdb_frontend_obj_t * f )
315343{
316344 print_frontend_emit_unhide_remote_printers (f -> skeleton );
317345}
@@ -659,6 +687,24 @@ cpdb_printer_obj_t *cpdbGetNewPrinterObj()
659687 return p ;
660688}
661689
690+ void cpdbDeletePrinterObj (cpdb_printer_obj_t * p )
691+ {
692+ if (p == NULL )
693+ return ;
694+
695+ if (p -> backend_name )
696+ free (p -> backend_name );
697+ if (p -> backend_proxy )
698+ g_object_unref (p -> backend_proxy );
699+ if (p -> options )
700+ cpdbDeleteOptions (p -> options );
701+
702+ if (p -> settings )
703+ cpdbDeleteSettings (p -> settings );
704+
705+ free (p );
706+ }
707+
662708void cpdbFillBasicOptions (cpdb_printer_obj_t * p ,
663709 GVariant * gv )
664710{
@@ -1277,7 +1323,7 @@ cpdb_settings_t *cpdbGetNewSettings()
12771323{
12781324 cpdb_settings_t * s = g_new0 (cpdb_settings_t , 1 );
12791325 s -> count = 0 ;
1280- s -> table = g_hash_table_new (g_str_hash , g_str_equal );
1326+ s -> table = g_hash_table_new_full (g_str_hash , g_str_equal , free , free );
12811327 return s ;
12821328}
12831329
@@ -1464,12 +1510,13 @@ cpdb_settings_t *cpdbReadSettingsFromDisk()
14641510
14651511void cpdbDeleteSettings (cpdb_settings_t * s )
14661512{
1467- if (s )
1468- {
1469- GHashTable * h = s -> table ;
1470- free (s );
1471- g_hash_table_destroy (h );
1472- }
1513+ if (s == NULL )
1514+ return ;
1515+
1516+ if (s -> table )
1517+ g_hash_table_destroy (s -> table );
1518+
1519+ free (s );
14731520}
14741521/**
14751522________________________________________________ cpdb_options_t __________________________________________
@@ -1478,11 +1525,30 @@ cpdb_options_t *cpdbGetNewOptions()
14781525{
14791526 cpdb_options_t * o = g_new0 (cpdb_options_t , 1 );
14801527 o -> count = 0 ;
1481- o -> table = g_hash_table_new (g_str_hash , g_str_equal );
1482- o -> media = g_hash_table_new (g_str_hash , g_str_equal );
1528+ o -> table = g_hash_table_new_full (g_str_hash ,
1529+ g_str_equal ,
1530+ NULL ,
1531+ (GDestroyNotify ) cpdbDeleteOption );
1532+ o -> media = g_hash_table_new_full (g_str_hash ,
1533+ g_str_equal ,
1534+ NULL ,
1535+ (GDestroyNotify ) cpdbDeleteMedia );
14831536 return o ;
14841537}
14851538
1539+ void cpdbDeleteOptions (cpdb_options_t * opts )
1540+ {
1541+ if (opts == NULL )
1542+ return ;
1543+
1544+ if (opts -> table )
1545+ g_hash_table_destroy (opts -> table );
1546+ if (opts -> media )
1547+ g_hash_table_destroy (opts -> media );
1548+
1549+ free (opts );
1550+ }
1551+
14861552/**************cpdb_option_t************************************/
14871553void cpdbPrintOption (const cpdb_option_t * opt )
14881554{
@@ -1496,6 +1562,53 @@ void cpdbPrintOption(const cpdb_option_t *opt)
14961562 printf (" --> DEFAULT: %s\n\n" , opt -> default_value );
14971563}
14981564
1565+ void cpdbDeleteOption (cpdb_option_t * opt )
1566+ {
1567+ if (opt == NULL )
1568+ return ;
1569+
1570+ if (opt -> option_name )
1571+ free (opt -> option_name );
1572+ if (opt -> supported_values )
1573+ free (opt -> supported_values );
1574+ if (opt -> default_value )
1575+ free (opt -> default_value );
1576+
1577+ free (opt );
1578+ }
1579+
1580+ /**************cpdb_option_t************************************/
1581+ void cpdbPrintMedia (cpdb_media_t * media )
1582+ {
1583+ printf ("[+] Media: %s\n" , media -> name );
1584+ printf (" * width = %d\n" , media -> width );
1585+ printf (" * length = %d\n" , media -> length );
1586+ printf (" --> Supported margins: %d\n" , media -> num_margins );
1587+ printf (" left, right, top, bottom\n" );
1588+ for (int i = 0 ; i < media -> num_margins ; i ++ )
1589+ {
1590+ printf (" * %d, %d, %d, %d,\n" ,
1591+ media -> margins [i ].left ,
1592+ media -> margins [i ].right ,
1593+ media -> margins [i ].top ,
1594+ media -> margins [i ].bottom );
1595+ }
1596+ printf ("\n" );
1597+ }
1598+
1599+ void cpdbDeleteMedia (cpdb_media_t * media )
1600+ {
1601+ if (media == NULL )
1602+ return ;
1603+
1604+ if (media -> name )
1605+ free (media -> name );
1606+ if (media -> margins )
1607+ free (media -> margins );
1608+
1609+ free (media );
1610+ }
1611+
14991612/**
15001613 * ________________________________ cpdb_job_t __________________________
15011614 */
0 commit comments