summaryrefslogtreecommitdiff
path: root/src/camera/DiscoveredCamera.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/camera/DiscoveredCamera.vala')
-rw-r--r--src/camera/DiscoveredCamera.vala119
1 files changed, 119 insertions, 0 deletions
diff --git a/src/camera/DiscoveredCamera.vala b/src/camera/DiscoveredCamera.vala
new file mode 100644
index 0000000..700af8b
--- /dev/null
+++ b/src/camera/DiscoveredCamera.vala
@@ -0,0 +1,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;
+ }
+
+}
+
+