1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
/* Copyright 2016 Software Freedom Conservancy Inc.
*
* This software is licensed under the GNU Lesser General Public License
* (version 2.1 or later). See the COPYING file in this distribution.
*/
public class DiscoveredCamera {
public GPhoto.Camera gcamera;
public string uri;
public string display_name;
public string? icon;
private string port;
private string camera_name;
private string[] mount_uris;
public DiscoveredCamera(string name, string port, GPhoto.PortInfo port_info, GPhoto.CameraAbilities camera_abilities) throws GPhotoError {
this.port = port;
this.camera_name = name;
this.uri = "gphoto2://[%s]".printf(port);
this.mount_uris = new string[0];
this.mount_uris += this.uri;
this.mount_uris += "mtp://[%s]".printf(port);
var res = GPhoto.Camera.create(out this.gcamera);
if (res != GPhoto.Result.OK) {
throw new GPhotoError.LIBRARY("[%d] Unable to create camera object for %s: %s",
(int) res, name, res.as_string());
}
res = gcamera.set_abilities(camera_abilities);
if (res != GPhoto.Result.OK) {
throw new GPhotoError.LIBRARY("[%d] Unable to set camera abilities for %s: %s",
(int) res, name, res.as_string());
}
res = gcamera.set_port_info(port_info);
if (res != GPhoto.Result.OK) {
throw new GPhotoError.LIBRARY("[%d] Unable to set port infor for %s: %s",
(int) res, name, res.as_string());
}
var path = get_port_path(port);
if (path != null) {
var monitor = VolumeMonitor.get();
foreach (var volume in monitor.get_volumes()) {
if (volume.get_identifier(VolumeIdentifier.UNIX_DEVICE) == path) {
this.display_name = volume.get_name();
this.icon = volume.get_symbolic_icon().to_string();
}
}
#if HAVE_UDEV
var client = new GUdev.Client(null);
var device = client.query_by_device_file(path);
// Create alternative uris (used for unmount)
var serial = device.get_property("ID_SERIAL");
this.mount_uris += "gphoto2://%s".printf(serial);
this.mount_uris += "mtp://%s".printf(serial);
// Look-up alternative display names
if (display_name == null) {
display_name = device.get_sysfs_attr("product");
}
if (display_name == null) {
display_name = device.get_property("ID_MODEL");
}
#endif
}
if (port.has_prefix("disk:")) {
try {
var mount = File.new_for_path (port.substring(5)).find_enclosing_mount();
var volume = mount.get_volume();
if (volume != null) {
// Translators: First %s is the name of camera as gotten from GPhoto, second is the GVolume name, e.g. Mass storage camera (510MB volume)
display_name = _("%s (%s)").printf (name, volume.get_name ());
icon = volume.get_symbolic_icon().to_string();
} else {
// Translators: First %s is the name of camera as gotten from GPhoto, second is the GMount name, e.g. Mass storage camera (510MB volume)
display_name = _("%s (%s)").printf (name, mount.get_name ());
icon = mount.get_symbolic_icon().to_string();
}
} catch (Error e) { }
}
if (display_name == null) {
this.display_name = camera_name;
}
}
public Mount? get_mount() {
foreach (var uri in this.mount_uris) {
var f = File.new_for_uri(uri);
try {
var mount = f.find_enclosing_mount(null);
if (mount != null)
return mount;
} catch (Error error) {}
}
return null;
}
private string? get_port_path(string port) {
// Accepted format is usb:001,005
return port.has_prefix("usb:") ?
"/dev/bus/usb/%s".printf(port.substring(4).replace(",", "/")) : null;
}
}
|