use std::borrow::Cow;
use std::collections::HashSet;
use std::ffi::CStr;
use ::port::{PortType};
pub struct Abilities {
inner: ::gphoto2::CameraAbilities
}
impl Abilities {
pub fn device_type(&self) -> DeviceType {
match self.inner.device_type {
::gphoto2::GP_DEVICE_STILL_CAMERA => DeviceType::Camera,
::gphoto2::GP_DEVICE_AUDIO_PLAYER => DeviceType::Audio,
}
}
pub fn model(&self) -> Cow<str> {
unsafe {
String::from_utf8_lossy(CStr::from_ptr(self.inner.model.as_ptr()).to_bytes())
}
}
pub fn driver_status(&self) -> DriverStatus {
match self.inner.status {
::gphoto2::GP_DRIVER_STATUS_PRODUCTION => DriverStatus::Production,
::gphoto2::GP_DRIVER_STATUS_TESTING => DriverStatus::Testing,
::gphoto2::GP_DRIVER_STATUS_EXPERIMENTAL => DriverStatus::Experimental,
::gphoto2::GP_DRIVER_STATUS_DEPRECATED => DriverStatus::Deprecated,
}
}
pub fn port_types(&self) -> HashSet<PortType> {
let mut port_types = HashSet::<PortType>::new();
if self.inner.port & ::gphoto2::GP_PORT_SERIAL != 0 {
port_types.insert(PortType::Serial);
}
if self.inner.port & ::gphoto2::GP_PORT_USB != 0 {
port_types.insert(PortType::USB);
}
if self.inner.port & ::gphoto2::GP_PORT_DISK != 0 {
port_types.insert(PortType::Disk);
}
if self.inner.port & ::gphoto2::GP_PORT_PTPIP != 0 {
port_types.insert(PortType::PTPIP);
}
if self.inner.port & ::gphoto2::GP_PORT_USB_DISK_DIRECT != 0 {
port_types.insert(PortType::Direct);
}
if self.inner.port & ::gphoto2::GP_PORT_USB_SCSI != 0 {
port_types.insert(PortType::SCSI);
}
port_types
}
pub fn speeds(&self) -> Vec<usize> {
self.inner.speed.iter().take_while(|&n| *n != 0).map(|&n| n as usize).collect()
}
pub fn camera_operations(&self) -> HashSet<CameraOperation> {
let mut operations = HashSet::<CameraOperation>::new();
if self.inner.operations & ::gphoto2::GP_OPERATION_CONFIG != 0 {
operations.insert(CameraOperation::Config);
}
if self.inner.operations & ::gphoto2::GP_OPERATION_CAPTURE_IMAGE != 0 {
operations.insert(CameraOperation::CaptureImage);
}
if self.inner.operations & ::gphoto2::GP_OPERATION_CAPTURE_VIDEO != 0 {
operations.insert(CameraOperation::CaptureVideo);
}
if self.inner.operations & ::gphoto2::GP_OPERATION_CAPTURE_AUDIO != 0 {
operations.insert(CameraOperation::CaptureAudio);
}
if self.inner.operations & ::gphoto2::GP_OPERATION_CAPTURE_PREVIEW != 0 {
operations.insert(CameraOperation::CapturePreview);
}
if self.inner.operations & ::gphoto2::GP_OPERATION_TRIGGER_CAPTURE != 0 {
operations.insert(CameraOperation::TriggerCapture);
}
operations
}
pub fn file_operations(&self) -> HashSet<FileOperation> {
let mut operations = HashSet::<FileOperation>::new();
if self.inner.file_operations & ::gphoto2::GP_FILE_OPERATION_DELETE != 0 {
operations.insert(FileOperation::Delete);
}
if self.inner.file_operations & ::gphoto2::GP_FILE_OPERATION_PREVIEW != 0 {
operations.insert(FileOperation::Preview);
}
if self.inner.file_operations & ::gphoto2::GP_FILE_OPERATION_RAW != 0 {
operations.insert(FileOperation::Raw);
}
if self.inner.file_operations & ::gphoto2::GP_FILE_OPERATION_AUDIO != 0 {
operations.insert(FileOperation::Audio);
}
if self.inner.file_operations & ::gphoto2::GP_FILE_OPERATION_EXIF != 0 {
operations.insert(FileOperation::EXIF);
}
operations
}
pub fn folder_operations(&self) -> HashSet<FolderOperation> {
let mut operations = HashSet::<FolderOperation>::new();
if self.inner.folder_operations & ::gphoto2::GP_FOLDER_OPERATION_DELETE_ALL != 0 {
operations.insert(FolderOperation::DeleteAll);
}
if self.inner.folder_operations & ::gphoto2::GP_FOLDER_OPERATION_PUT_FILE != 0 {
operations.insert(FolderOperation::PutFile);
}
if self.inner.folder_operations & ::gphoto2::GP_FOLDER_OPERATION_MAKE_DIR != 0 {
operations.insert(FolderOperation::MakeDirectory);
}
if self.inner.folder_operations & ::gphoto2::GP_FOLDER_OPERATION_REMOVE_DIR != 0 {
operations.insert(FolderOperation::RemoveDirectory);
}
operations
}
pub fn usb_vendor(&self) -> u16 {
self.inner.usb_vendor as u16
}
pub fn usb_product(&self) -> u16 {
self.inner.usb_product as u16
}
pub fn usb_class(&self) -> u8 {
self.inner.usb_class as u8
}
pub fn usb_subclass(&self) -> u8 {
self.inner.usb_subclass as u8
}
pub fn usb_protocol(&self) -> u8 {
self.inner.usb_protocol as u8
}
}
#[derive(Debug,PartialEq,Eq,Clone,Copy,Hash)]
pub enum DeviceType {
Camera,
Audio,
}
#[derive(Debug,PartialEq,Eq,Clone,Copy,Hash)]
pub enum DriverStatus {
Production,
Testing,
Experimental,
Deprecated,
}
#[derive(Debug,PartialEq,Eq,Clone,Copy,Hash)]
pub enum CameraOperation {
Config,
CaptureImage,
CaptureVideo,
CaptureAudio,
CapturePreview,
TriggerCapture,
}
#[derive(Debug,PartialEq,Eq,Clone,Copy,Hash)]
pub enum FileOperation {
Delete,
Preview,
Raw,
Audio,
EXIF,
}
#[derive(Debug,PartialEq,Eq,Clone,Copy,Hash)]
pub enum FolderOperation {
DeleteAll,
PutFile,
MakeDirectory,
RemoveDirectory,
}
#[doc(hidden)]
pub fn from_libgphoto2(abilities: ::gphoto2::CameraAbilities) -> Abilities {
Abilities { inner: abilities }
}