1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2
/* transfer.c: this file is part of disks-admin, a gnome-system-tool frontend
3
* for disks administration.
5
* Copyright (C) 2000-2001 Ximian, Inc.
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as
9
* published by the Free Software Foundation; either version 2 of the
10
* License, or (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software
19
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
21
* Authors: Alvaro Peļæ½a Gonzalez <apg@esware.com>
22
* Carlos Garcļæ½a Campos <elkalmail@yahoo.es>
25
/* Functions for transferring information between XML tree and UI */
33
#include <sys/types.h>
36
#include "gst-disks-tool.h"
37
#include "disks-storage.h"
38
#include "disks-factory-storage.h"
39
#include "disks-partition.h"
40
#include "disks-storage-disk.h"
41
#include "disks-storage-cdrom.h"
42
#include "disks-cdrom-disc.h"
43
#include "disks-cdrom-disc-data.h"
44
#include "disks-cdrom-disc-audio.h"
45
#include "disks-cdrom-disc-mixed.h"
46
#include "disks-gui.h"
52
transfer_xml_common_to_config (GstDisksStorage *storage, xmlNodePtr disk_node)
56
gboolean present = FALSE;
58
buf = gst_xml_get_child_content (disk_node, "device");
60
g_object_set (G_OBJECT (storage), "device",
65
buf = gst_xml_get_child_content (disk_node, "alias");
67
g_object_set (G_OBJECT (storage), "alias",
72
buf = gst_xml_get_child_content (disk_node, "model");
74
g_object_set (G_OBJECT (storage), "model",
79
node = gst_xml_element_find_first (disk_node, "present");
81
present = gst_xml_element_get_bool_attr (node, "state");
82
g_object_set (G_OBJECT (storage), "present",
86
buf = gst_xml_get_child_content (disk_node, "size");
88
g_object_set (G_OBJECT (storage), "size",
89
(gulong) g_ascii_strtoull (buf, NULL, 10),
94
if (GST_IS_DISKS_STORAGE_DISK (storage)) {
96
g_object_set (G_OBJECT (storage), "icon_name",
97
"gnome-dev-harddisk", NULL);
99
g_object_set (G_OBJECT (storage), "icon_name",
100
"gnome-dev-removable", NULL);
106
transfer_xml_cdrom_to_config (GstDisksStorage *storage, xmlNodePtr disk_node)
110
node = gst_xml_element_find_first (disk_node, "empty");
112
g_object_set (G_OBJECT (storage), "empty",
113
gst_xml_element_get_bool_attr (
118
node = gst_xml_element_find_first (disk_node, "play-audio");
120
g_object_set (G_OBJECT (storage), "play_audio",
121
gst_xml_element_get_bool_attr (
125
node = gst_xml_element_find_first (disk_node, "write-cdr");
127
g_object_set (G_OBJECT (storage), "write_cdr",
128
gst_xml_element_get_bool_attr (
132
node = gst_xml_element_find_first (disk_node, "write-cdrw");
134
g_object_set (G_OBJECT (storage), "write_cdrw",
135
gst_xml_element_get_bool_attr (
139
node = gst_xml_element_find_first (disk_node, "read-dvd");
141
g_object_set (G_OBJECT (storage), "read_dvd",
142
gst_xml_element_get_bool_attr (
146
node = gst_xml_element_find_first (disk_node, "write-dvdr");
148
g_object_set (G_OBJECT (storage), "write_dvdr",
149
gst_xml_element_get_bool_attr (
153
node = gst_xml_element_find_first (disk_node, "write-dvdram");
155
g_object_set (G_OBJECT (storage), "write_dvdram",
156
gst_xml_element_get_bool_attr (
162
transfer_xml_disk_to_config (GstDisksStorage *storage, xmlNodePtr disk_node)
164
xmlNodePtr node, part_node;
165
GstDisksPartition *part = NULL;
166
GList *partitions = NULL;
170
g_object_get (G_OBJECT (storage), "partitions", &partitions, NULL);
172
for (part_node = gst_xml_element_find_first (disk_node, "partition");
174
part_node = gst_xml_element_find_next (part_node, "partition"))
178
buf = gst_xml_get_child_content (part_node, "device");
180
part = gst_disks_storage_disk_get_partition (
181
GST_DISKS_STORAGE_DISK (storage), buf);
184
part = GST_DISKS_PARTITION (gst_disks_partition_new ());
190
g_object_set (G_OBJECT (part), "device",
197
part = GST_DISKS_PARTITION (gst_disks_partition_new ());
201
buf = gst_xml_get_child_content (part_node, "type");
203
g_object_set (G_OBJECT (part), "type",
204
gst_disks_partition_get_typefs_from_name (buf),
209
buf = gst_xml_get_child_content (part_node, "point");
211
g_object_set (G_OBJECT (part), "point",
216
buf = gst_xml_get_child_content (part_node, "size");
218
g_object_set (G_OBJECT (part), "size",
219
(gulong) g_ascii_strtoull (buf, NULL, 10),
224
buf = gst_xml_get_child_content (part_node, "free");
226
g_object_set (G_OBJECT (part), "free",
227
(gulong) g_ascii_strtoull (buf, NULL, 10),
232
node = gst_xml_element_find_first (part_node, "bootable");
234
g_object_set (G_OBJECT (part), "bootable",
235
gst_xml_element_get_bool_attr (
239
node = gst_xml_element_find_first (part_node, "integritycheck");
241
g_object_set (G_OBJECT (part), "integritycheck",
242
gst_xml_element_get_bool_attr (
246
node = gst_xml_element_find_first (part_node, "mounted");
248
g_object_set (G_OBJECT (part), "mounted",
249
gst_xml_element_get_bool_attr (
253
node = gst_xml_element_find_first (part_node, "listed");
255
g_object_set (G_OBJECT (part), "listed",
256
gst_xml_element_get_bool_attr (
260
node = gst_xml_element_find_first (part_node, "detected");
262
g_object_set (G_OBJECT (part), "detected",
263
gst_xml_element_get_bool_attr (
267
g_object_set (G_OBJECT (part), "disk", storage, NULL);
270
partitions = g_list_remove (partitions, part);
272
partitions = g_list_append (partitions, part);
275
g_object_set (G_OBJECT (storage), "partitions", partitions, NULL);
280
transfer_xml_to_config (xmlNodePtr root)
282
xmlNodePtr disk_node;
283
GstDisksStorage *storage;
286
g_return_if_fail (root != NULL);
288
for (disk_node = gst_xml_element_find_first (root, "disk");
290
disk_node = gst_xml_element_find_next (disk_node, "disk"))
292
buf = gst_xml_get_child_content (disk_node, "media");
293
storage = gst_disks_factory_storage_get (buf);
296
if (GST_IS_DISKS_STORAGE (storage)) {
297
transfer_xml_common_to_config (storage, disk_node);
300
if (GST_IS_DISKS_STORAGE_CDROM (storage)) {
301
transfer_xml_cdrom_to_config (storage, disk_node);
302
} else if (GST_IS_DISKS_STORAGE_DISK (storage)) {
303
transfer_xml_disk_to_config (storage, disk_node);
307
gst_disks_tool_add_storage (GST_DISKS_TOOL (tool), storage);
311
/* Uncomment in the future */
313
transfer_config_to_xml (xmlNodePtr root)
319
transfer_xml_to_gui (GstTool *tool, gpointer data)
323
root = gst_xml_doc_get_root (tool->config);
325
transfer_xml_to_config (root);
327
gst_disks_gui_setup ();
331
transfer_gui_to_xml (GstTool *tool, gpointer data)
335
root = gst_xml_doc_get_root (tool->config);
337
/*transfer_config_to_xml (dsk, root);*/
338
/*transfer_globals_gui_to_xml (root);
339
transfer_check_data (root);*/
343
gst_disks_mount_partition (GstDisksPartition *part)
346
xmlNodePtr root, part_node, node;
347
gchar *device, *typefs, *point;
348
gboolean mounted, listed;
349
gchar *buf, *text_uid;
350
GstPartitionTypeFs type;
352
g_return_if_fail (GST_IS_DISKS_PARTITION (part));
354
g_object_get (G_OBJECT (part), "type", &type, "point", &point,
355
"device", &device, "mounted", &mounted,
356
"listed", &listed, NULL);
358
typefs = gst_disks_partition_get_typefs (type);
360
text_uid = g_strdup_printf ("%d", (guint) getuid ());
361
xml = gst_tool_run_get_directive (tool, NULL, "mount",
374
root = gst_xml_doc_get_root (xml);
376
buf = gst_xml_get_child_content (root, "error");
378
g_warning ("%s", buf);
382
part_node = gst_xml_element_find_first (root, "partition");
384
buf = gst_xml_get_child_content (part_node, "typefs");
386
g_object_set (G_OBJECT (part), "type",
387
gst_disks_partition_get_typefs_from_name (buf),
392
buf = gst_xml_get_child_content (part_node, "point");
394
g_object_set (G_OBJECT (part), "point",
399
buf = gst_xml_get_child_content (part_node, "free");
401
g_object_set (G_OBJECT (part), "free",
402
(gulong) g_ascii_strtoull (buf, NULL, 10),
407
node = gst_xml_element_find_first (part_node, "mounted");
409
g_object_set (G_OBJECT (part), "mounted",
410
gst_xml_element_get_bool_attr (
414
gst_xml_doc_destroy (xml);
419
gst_xml_doc_destroy (xml);
425
gst_disks_mount_cdrom_disc_data (GstCdromDiscData *disc_data)
428
xmlNodePtr root, cdrom_node, node;
429
gchar *device, *alias, *typefs, *point;
430
gboolean mounted, listed;
432
gchar *buf, *text_uid;
433
GstDisksStorageCdrom *cdrom;
435
g_return_if_fail (GST_IS_CDROM_DISC_DATA (disc_data));
437
cdrom = GST_DISKS_STORAGE_CDROM (gst_cdrom_disc_get_cdrom (GST_CDROM_DISC (disc_data)));
438
g_object_get (G_OBJECT (cdrom), "device", &device,
439
"alias", &alias, "listed", &listed, NULL);
441
g_object_get (G_OBJECT (disc_data), "mount-point", &point,
442
"mounted", &mounted, "size", &size, NULL);
444
typefs = g_strdup ("iso9660");
445
text_uid = g_strdup_printf ("%d", (guint) getuid ());
447
xml = gst_tool_run_get_directive (tool, NULL, "mount",
448
(listed && alias) ? alias : device,
462
root = gst_xml_doc_get_root (xml);
464
buf = gst_xml_get_child_content (root, "error");
466
g_warning ("%s", buf);
470
cdrom_node = gst_xml_element_find_first (root, "cdrom");
472
node = gst_xml_element_find_first (cdrom_node, "mounted");
474
g_object_set (G_OBJECT (disc_data), "mounted",
475
gst_xml_element_get_bool_attr (
479
buf = gst_xml_get_child_content (cdrom_node, "point");
481
g_object_set (G_OBJECT (disc_data), "mount-point",
486
buf = gst_xml_get_child_content (cdrom_node, "size");
488
g_object_set (G_OBJECT (disc_data), "size",
489
(gulong) g_ascii_strtoull (buf, NULL, 10),
491
g_object_set (G_OBJECT (cdrom), "size",
492
(gulong) g_ascii_strtoull (buf, NULL, 10),
496
gst_xml_doc_destroy (xml);
501
gst_xml_doc_destroy (xml);
508
cdrom_parse_data_info (xmlNodePtr disc_info, GstCdromDiscData *disc, GstDisksStorageCdrom *cdrom)
513
node = gst_xml_element_find_first (disc_info, "mounted");
515
g_object_set (G_OBJECT (disc), "mounted",
516
gst_xml_element_get_bool_attr (
521
buf = gst_xml_get_child_content (disc_info, "point");
523
g_object_set (G_OBJECT (disc), "mount-point",
528
buf = gst_xml_get_child_content (disc_info, "size");
530
g_object_set (G_OBJECT (disc), "size",
531
(gulong) g_ascii_strtoull (buf, NULL, 10),
533
g_object_set (G_OBJECT (cdrom), "size",
534
(gulong) g_ascii_strtoull (buf, NULL, 10),
541
cdrom_parse_audio_info (xmlNodePtr disc_info, GstCdromDiscAudio *disc)
545
buf = gst_xml_get_child_content (disc_info, "audio-tracks");
547
g_object_set (G_OBJECT (disc), "num-tracks",
548
(guint) g_ascii_strtoull (buf, NULL, 10),
553
buf = gst_xml_get_child_content (disc_info, "duration");
555
g_object_set (G_OBJECT (disc), "duration",
562
gst_disks_cdrom_get_disc_from_xml (GstDisksStorageCdrom *cdrom)
565
xmlNodePtr root, disc_info, node;
566
gchar *buf, *device, *alias;
567
gboolean empty = TRUE;
569
GstCdromDiscData *data;
570
GstCdromDiscAudio *audio;
573
g_object_get (G_OBJECT (cdrom), "device", &device,
574
"alias", &alias, "disc", &disc, NULL);
576
xml = gst_tool_run_get_directive (tool, NULL, "cdrom_disc_info",
578
alias != NULL ? alias : " ",
582
g_object_unref (G_OBJECT (disc));
586
root = gst_xml_doc_get_root (xml);
589
node = gst_xml_element_find_first (disc_info, "empty");
591
empty = gst_xml_element_get_bool_attr (node, "state");
592
g_object_set (G_OBJECT (cdrom), "empty", empty, NULL);
597
g_object_unref (G_OBJECT (disc));
600
buf = gst_xml_get_child_content (disc_info, "type-content");
602
if (g_ascii_strcasecmp (buf, "data") == 0) {
604
disc = gst_cdrom_disc_data_new ();
605
} else if (!GST_IS_CDROM_DISC_DATA (disc)) {
606
g_object_unref (G_OBJECT (disc));
607
disc = gst_cdrom_disc_data_new ();
610
cdrom_parse_data_info (disc_info, GST_CDROM_DISC_DATA (disc),
612
} else if (g_ascii_strcasecmp (buf, "audio") == 0) {
614
disc = gst_cdrom_disc_audio_new ();
615
} else if (!GST_IS_CDROM_DISC_AUDIO (disc)) {
616
g_object_unref (G_OBJECT (disc));
617
disc = gst_cdrom_disc_audio_new ();
620
cdrom_parse_audio_info (disc_info, GST_CDROM_DISC_AUDIO (disc));
621
} else if (g_ascii_strcasecmp (buf, "mixed") == 0) {
623
disc = gst_cdrom_disc_mixed_new ();
624
} else if (!GST_IS_CDROM_DISC_MIXED (disc)) {
625
g_object_unref (G_OBJECT (disc));
626
disc = gst_cdrom_disc_mixed_new ();
629
g_object_get (G_OBJECT (disc), "data", &data,
630
"audio", &audio, NULL);
633
cdrom_parse_data_info (disc_info, data, cdrom);
635
cdrom_parse_audio_info (disc_info, audio);
637
} else if (g_ascii_strcasecmp (buf, "blank") == 0) {
639
g_object_unref (G_OBJECT (disc));
644
g_object_unref (G_OBJECT (disc));
650
gst_xml_doc_destroy (xml);
653
return GST_CDROM_DISC (disc);
657
gst_disks_get_disk_info_from_xml (GstDisksStorageDisk *disk)
664
g_return_if_fail (GST_IS_DISKS_STORAGE_DISK (disk));
666
g_object_get (G_OBJECT (disk), "device", &device,
667
"present", &present, NULL);
669
xml = gst_tool_run_get_directive (tool, NULL, "disk_info",
677
root = gst_xml_doc_get_root (xml);
679
transfer_xml_common_to_config (GST_DISKS_STORAGE (disk), root);
680
transfer_xml_disk_to_config (GST_DISKS_STORAGE (disk), root);
683
gst_xml_doc_destroy (xml);