using System;
using System.IO;

using EOSDigital.SDK;

namespace EOSDigital.API
{
	public interface ICamera
	{
		/// <summary>
		/// Fires if any process reports progress
		/// </summary>
		event ProgressHandler ProgressChanged;

		/// <summary>
		/// Fires if the live view image is updated
		/// </summary>
		event LiveViewUpdate LiveViewUpdated;

		/// <summary>
		/// Fires if an image is ready for download.
		/// Call the <see cref="DownloadFile(DownloadInfo,string)"/> or <see cref="DownloadFile(DownloadInfo)"/> method to get the image or <see cref="CancelDownload"/> to cancel.
		/// </summary>
		event DownloadHandler DownloadReady;

		/// <summary>
		/// Fires if a property has changed
		/// </summary>
		event PropertyChangeHandler PropertyChanged;

		/// <summary>
		/// Fires if a state has changed
		/// </summary>
		event StateChangeHandler StateChanged;

		/// <summary>
		/// Fires if an object has changed
		/// </summary>
		event ObjectChangeHandler ObjectChanged;

		/// <summary>
		/// This event fires if the camera is disconnected or has shut down
		/// </summary>
		event CameraUpdateHandler CameraHasShutdown;

		/// <summary>
		/// This event fires when the live view loop has ended
		/// </summary>
		event CameraUpdateHandler LiveViewStopped;

		/// <summary>
		/// Pointer to the SDKs camera object
		/// </summary>
		IntPtr Reference { get; }

		/// <summary>
		/// An ID for the camera object in this session. It's essentially the pointer of the Canon SDK camera object
		/// </summary>
		long ID { get; }

		/// <summary>
		/// States if a session with this camera is open
		/// </summary>
		bool SessionOpen { get; }

		/// <summary>
		/// States if the camera is disposed. If true, it can't be used anymore
		/// </summary>
		bool IsDisposed { get; }

		/// <summary>
		/// The name of the camera (can be retrieved without an open session)
		/// </summary>
		string DeviceName { get; }

		/// <summary>
		/// The name of the port the camera is connected to (can be retrieved without an open session)
		/// </summary>
		string PortName { get; }

		/// <summary>
		/// States if the live view is running on the computer or not
		/// </summary>
		bool IsLiveViewOn { get; }

		/// <summary>
		/// States if Record property is available for this camera
		/// </summary>
		bool IsRecordAvailable { get; }


		/// <summary>
		/// Open a new session with camera
		/// </summary>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		void OpenSession();


		/// <summary>
		/// Close session with camera
		/// </summary>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		void CloseSession();


		/// <summary>
		/// Releases all data and closes session
		/// </summary>
		void Dispose();


		/// <summary>
		/// Takes a photo with the current camera settings with the TakePicture command
		/// </summary>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		void TakePhoto();


		/// <summary>
		/// Takes a photo with the current camera settings asynchronously with the TakePicture command
		/// </summary>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		void TakePhotoAsync();


		/// <summary>
		/// Takes a photo with the current camera settings with the PressShutterButton command
		/// </summary>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		void TakePhotoShutter();


		/// <summary>
		/// Takes a photo with the current camera settings asynchronously with the PressShutterButton command
		/// </summary>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		void TakePhotoShutterAsync();


		/// <summary>
		/// Takes a bulb photo with the current camera settings.
		/// The Tv camera value must be set to Bulb before calling this
		/// </summary>
		/// <param name="bulbTime">The time in ms for how long the shutter will be open</param>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		void TakePhotoBulb(int bulbTime);


		/// <summary>
		/// Takes a bulb photo with the current camera settings asynchronously.
		/// The Tv camera value must be set to Bulb before calling this
		/// </summary>
		/// <param name="bulbTime">The time in ms for how long the shutter will be open</param>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		void TakePhotoBulbAsync(int bulbTime);


		/// <summary>
		/// Downloads a file to given directory with the filename in the <see cref="DownloadInfo"/>
		/// </summary>
		/// <param name="Info">The <see cref="DownloadInfo"/> that is provided by the <see cref="DownloadReady"/> event</param>
		/// <param name="directory">The directory where the file will be saved to</param>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="ArgumentNullException">The DownloadInfo is null</exception>
		void DownloadFile(IDownloadInfo Info, string directory);


		/// <summary>
		/// Downloads a file into a stream
		/// </summary>
		/// <param name="Info">The <see cref="DownloadInfo"/> that is provided by the <see cref="DownloadReady"/> event</param>
		/// <returns>The stream containing the file data</returns>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="ArgumentNullException">The DownloadInfo is null</exception>
		Stream DownloadFile(IDownloadInfo Info);


		/// <summary>
		/// Cancels the download of an image
		/// </summary>
		/// <param name="Info">The DownloadInfo that is provided by the "<see cref="DownloadReady"/>" event</param>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="ArgumentNullException">The DownloadInfo is null</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		void CancelDownload(IDownloadInfo Info);


		/// <summary>
		/// Gets all volumes available on the camera
		/// </summary>
		/// <returns>An array of CameraFileEntries that are the volumes</returns>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		CameraFileEntry[] GetAllVolumes();


		/// <summary>
		/// Gets all volumes, folders and files existing on the camera
		/// </summary>
		/// <returns>A <see cref="CameraFileEntry"/> that contains all the information</returns>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		CameraFileEntry GetAllEntries();


		/// <summary>
		/// Gets all images saved on the cameras memory card(s)
		/// </summary>
		/// <returns>An array of CameraFileEntries that are the images</returns>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		CameraFileEntry[] GetAllImages();


		/// <summary>
		/// Formats a given camera volume. Get the available volumes with <see cref="GetAllVolumes"/>
		/// <para>Warning: All data on this volume will be lost!</para>
		/// </summary>
		/// <param name="volume">The volume that will get formatted</param>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="ArgumentException">CameraFileEntry is not a volume</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		void FormatVolume(CameraFileEntry volume);


		/// <summary>
		/// Downloads all given files into a folder. To get all images on the camera, use
		/// <see cref="GetAllImages"/> or for all files <see cref="GetAllEntries"/>
		/// <para>
		/// Note: All given CameraFileEntries will be disposed after this.
		/// Call <see cref="GetAllImages"/> or <see cref="GetAllEntries"/> to get valid entries again.
		/// </para>
		/// </summary>
		/// <param name="folderpath">The path to the folder where the files will be saved to</param>
		/// <param name="files">The files that will be downloaded</param>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		void DownloadFiles(string folderpath, CameraFileEntry[] files);


		/// <summary>
		/// Deletes all given files on the camera.
		/// To get all images on the camera, use <see cref="GetAllImages"/> or for all files <see cref="GetAllEntries"/>
		/// <para>Warning: All given files will be lost!</para>
		/// </summary>
		/// <param name="files">The images that will be deleted</param>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		void DeleteFiles(CameraFileEntry[] files);


		/// <summary>
		/// Tells the camera how much space is available on the host PC
		/// </summary>
		/// <param name="bytesPerSector">Bytes per HD sector</param>
		/// <param name="numberOfFreeClusters">Number of free clusters on the HD</param>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		void SetCapacity(int bytesPerSector, int numberOfFreeClusters);


		/// <summary>
		/// Locks or unlocks the camera UI
		/// </summary>
		/// <param name="lockState">True to lock, false to unlock</param>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		void UILock(bool lockState);


		/// <summary>
		/// Gets the list of possible values for the current camera to set.
		/// Only the PropertyIDs "AEModeSelect", "ISO", "Av", "Tv", "MeteringMode" and "ExposureCompensation" are allowed.
		/// </summary>
		/// <param name="propId">The property ID</param>
		/// <returns>A list of available values for the given property ID</returns>
		CameraValue[] GetSettingsList(PropertyID propId);


		/// <summary>
		/// Sends a command safely to the camera
		/// </summary>
		/// <param name="command">The command</param>
		/// <param name="inParam">Additional parameter</param>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		void SendCommand(CameraCommand command, int inParam = 0);


		/// <summary>
		/// Sends a Status Command to the camera
		/// </summary>
		/// <param name="command">The command</param>
		/// <param name="inParam">Additional parameter</param>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		void SendStatusCommand(CameraStatusCommand command, int inParam = 0);


		/// <summary>
		/// Starts the live view
		/// </summary>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		void StartLiveView();


		/// <summary>
		/// Stops the live view
		/// </summary>
		/// <param name="LVOff">If true, the live view is shut off, if false, the live view will be shown on the cameras screen</param>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		void StopLiveView(bool LVOff = true);


		/// <summary>
		/// Starts recording a video
		/// <para>Note: The camera has to be set into filming mode before using this (usually a physical switch on the camera)</para>
		/// <para>This works only on cameras that support filming</para>
		/// </summary>
		/// <param name="PCLiveview">If true, the live view will be transferred to the computer otherwise it's shown on the camera</param>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="InvalidOperationException">The camera is not in film mode</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		void StartFilming(bool PCLiveview);


		/// <summary>
		/// Stops recording a video
		/// </summary>
		/// <param name="saveFilm">If true, the <see cref="DownloadReady"/> event will fire as soon as the video file is created on the camera</param>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		void StopFilming(bool saveFilm);


		/// <summary>
		/// Stops recording a video
		/// </summary>
		/// <param name="saveFilm">If true, the <see cref="DownloadReady"/> event will fire as soon as the video file is created on the camera</param>
		/// <param name="stopLiveView">If true, the PC live view will stop and will only be shown on the camera</param>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		void StopFilming(bool saveFilm, bool stopLiveView);


		/// <summary>
		/// Sets a value for the given property ID
		/// </summary>
		/// <param name="propID">The property ID</param>
		/// <param name="value">The value which will be set</param>
		/// <param name="inParam">Additional property information</param>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		void SetSetting(PropertyID propID, object value, int inParam = 0);


		/// <summary>
		/// Sets a string value for the given property ID
		/// </summary>
		/// <param name="propID">The property ID</param>
		/// <param name="value">The value which will be set</param>
		/// <param name="inParam">Additional property information</param>
		/// <param name="MAX">The maximum length of the string</param>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		void SetSetting(PropertyID propID, string value, int inParam = 0, int MAX = 32);


		/// <summary>
		/// Sets a struct value for the given property ID
		/// </summary>
		/// <param name="propID">The property ID</param>
		/// <param name="value">The value which will be set</param>
		/// <param name="inParam">Additional property information</param>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		void SetStructSetting<T>(PropertyID propID, T value, int inParam = 0) where T : struct;


		/// <summary>
		/// Gets the current setting of given property ID
		/// </summary>
		/// <param name="propID">The property ID</param>
		/// <param name="inParam">Additional property information</param>
		/// <returns>The current setting of the camera</returns>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		bool GetBoolSetting(PropertyID propID, int inParam = 0);


		/// <summary>
		/// Gets the current setting of given property ID
		/// </summary>
		/// <param name="propID">The property ID</param>
		/// <param name="inParam">Additional property information</param>
		/// <returns>The current setting of the camera</returns>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		byte GetByteSetting(PropertyID propID, int inParam = 0);


		/// <summary>
		/// Gets the current setting of given property ID
		/// </summary>
		/// <param name="propID">The property ID</param>
		/// <param name="inParam">Additional property information</param>
		/// <returns>The current setting of the camera</returns>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		short GetInt16Setting(PropertyID propID, int inParam = 0);


		/// <summary>
		/// Gets the current setting of given property ID
		/// </summary>
		/// <param name="propID">The property ID</param>
		/// <param name="inParam">Additional property information</param>
		/// <returns>The current setting of the camera</returns>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		ushort GetUInt16Setting(PropertyID propID, int inParam = 0);


		/// <summary>
		/// Gets the current setting of given property ID
		/// </summary>
		/// <param name="propID">The property ID</param>
		/// <param name="inParam">Additional property information</param>
		/// <returns>The current setting of the camera</returns>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		uint GetUInt32Setting(PropertyID propID, int inParam = 0);


		/// <summary>
		/// Gets the current setting of given property ID
		/// </summary>
		/// <param name="propID">The property ID</param>
		/// <param name="inParam">Additional property information</param>
		/// <returns>The current setting of the camera</returns>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		int GetInt32Setting(PropertyID propID, int inParam = 0);


		/// <summary>
		/// Gets the current setting of given property ID as a string
		/// </summary>
		/// <param name="propID">The property ID</param>
		/// <param name="inParam">Additional property information</param>
		/// <returns>The current setting of the camera</returns>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		string GetStringSetting(PropertyID propID, int inParam = 0);


		/// <summary>
		/// Gets the current setting of given property ID as a integer array
		/// </summary>
		/// <param name="propID">The property ID</param>
		/// <param name="inParam">Additional property information</param>
		/// <returns>The current setting of the camera</returns>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		bool[] GetBoolArrSetting(PropertyID propID, int inParam = 0);


		/// <summary>
		/// Gets the current setting of given property ID as a integer array
		/// </summary>
		/// <param name="propID">The property ID</param>
		/// <param name="inParam">Additional property information</param>
		/// <returns>The current setting of the camera</returns>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		short[] GetInt16ArrSetting(PropertyID propID, int inParam = 0);


		/// <summary>
		/// Gets the current setting of given property ID as a integer array
		/// </summary>
		/// <param name="propID">The property ID</param>
		/// <param name="inParam">Additional property information</param>
		/// <returns>The current setting of the camera</returns>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		int[] GetInt32ArrSetting(PropertyID propID, int inParam = 0);


		/// <summary>
		/// Gets the current setting of given property ID as a integer array
		/// </summary>
		/// <param name="propID">The property ID</param>
		/// <param name="inParam">Additional property information</param>
		/// <returns>The current setting of the camera</returns>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		byte[] GetByteArrSetting(PropertyID propID, int inParam = 0);


		/// <summary>
		/// Gets the current setting of given property ID as a unsigned integer array
		/// </summary>
		/// <param name="propID">The property ID</param>
		/// <param name="inParam">Additional property information</param>
		/// <returns>The current setting of the camera</returns>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		uint[] GetUInt32ArrSetting(PropertyID propID, int inParam = 0);


		/// <summary>
		/// Gets the current setting of given property ID as a rational array
		/// </summary>
		/// <param name="propID">The property ID</param>
		/// <param name="inParam">Additional property information</param>
		/// <returns>The current setting of the camera</returns>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		Rational[] GetRationalArrSetting(PropertyID propID, int inParam = 0);


		/// <summary>
		/// Gets the current setting of given property ID as a struct
		/// </summary>
		/// <param name="propID">The property ID</param>
		/// <param name="inParam">Additional property information</param>
		/// <typeparam name="T">One of the EDSDK structs</typeparam>
		/// <returns>The current setting of the camera</returns>
		/// <exception cref="ObjectDisposedException">Camera is disposed</exception>
		/// <exception cref="CameraSessionException">Session is closed</exception>
		/// <exception cref="SDKStateException">Canon SDK is not initialized</exception>
		/// <exception cref="SDKException">An SDK call failed</exception>
		T GetStructSetting<T>(PropertyID propID, int inParam = 0) where T : struct;


		/// <summary>
		/// There is an overflow bug in the SDK that messes up the Evf_OutputDevice property.
		/// With this method you can get the adjusted and correct value.
		/// </summary>
		/// <returns>The current output device of the live view</returns>
		EvfOutputDevice GetEvf_OutputDevice();
	}
}