gPhoto Daemon
--------------------------------------------------------------------

(note: this is a specification. it is not implemented!)

The gPhoto daemon uses the following protocol description. It provides an
interactive way for program to talk and use gPhoto without needing to
have any sort of C bindings.

This document needs better formatting (color syntax highlighting, structure)

Overview
--------------------------------------------------------------------
- The program provides gPhoto with a series of commands. gPhoto can
  also send message to the program through 4 notification commands.

- The arguments to a command are either a number or a string. 
  If it's a string, you must put double-quotes around it.

- All commands to gPhoto are answered by an "OK" or "ERROR", possibly
  followed by additional data.

- Designed around simplicity and flexibility.

- Picture numbering begins at ZERO!

- Notification will come after issuing a command. 

Example
--------------------------------------------------------------------

'>' indicates commands from the program to gPhoto
'<' indicates commands from gPhoto to the program

To put gphoto2 into a daemon mode, you must run it as "gphoto2 -S".
You can open a pipe and then read/write to that file descriptor.

here is a session:

>	notification_set 1
<	OK
>	camera_list
<	OK
<	3
<	Olympus D-220L
<	Kodak DC210+
<	Epson 650Z
>	camera_Set "Epson 650Z"
<	OK
>	folder_list "/"
<	OK
<	5
<	birthday/
<	PIC0001.JPG
<	PIC0002.JPG
<	PIC0003.JPG
<	PIC0004.JPG
>	folder_set "/"
<	OK
>	file_count
<	OK
<	4
>	file_get 0 "/home/scottf" "file0.jpg"
<	confirm "Files exists. Overwrite?"
>	confirm 1
<	OK
<	/home/scottf/file0.jpg
>	file_get 1 "/home/scottf" "file1.jpg"
<	OK
<	/home/scottf/file1.jpg
>	file_get 2 "/home/scottf" "file2.jpg"
<	confirm "File exists. Overwrite?"
>	confirm 0
<	ERROR "Did not save /home/scottf/file2.jpg"

Commands to the gPhoto daemon
--------------------------------------------------------------------
setting_set key value
	Description: Saves the value of "key" as "value"
	    Outputs: OK or ERROR

	    Example: > setting_set "foo" "bar"
		     < OK
	
setting_get key
	Description: Retrieves the value of "key"
	    Outputs: OK or ERROR
		     if OK, followed by the value of the key

	    Example: > setting_get "foo"
		     < OK
		     < bar

notification_set number
	Description: Turns on (value = 1) or off (value = 0) notification
	    Default: 0
	    Outputs: OK or ERROR

	    Example: > debug_set 1
		     < OK
	

debug_set number
	Description: Turns on (value = 1) or off (value = 0) debugging
	    Default: 0
	    Outputs: OK or ERROR

	    Example: > debug_set 1
		     < OK

camera_list
	Description: Lists the number of cameras and all the camera model names
	    Outputs: OK or ERROR
		     if OK, followed by number of cameras, followed by camera models

	    Example: > camera_count
		     < OK
		     < 3
		     < Olympus D-220L
		     < Kodak DC210+
		     < Epson 650Z
camera_set name
	Description: Sets the camera name as the chosen camera model
	    Outputs: OK or ERROR

	    Example: > camera_set "Canon S10"
		     < OK

camera_abilities [name]
	Description: Determines the camera's abilities. The camera name is optional.
		     If not specified, uses currently set camera.
		     Please reference gphoto2-datatypes.h for available abilities and
		     descriptions.
	    Outputs: OK or ERROR
		     if OK, followed by number of abilities, followed by abilities

	    Example: > camera_abilities "Olympus 3030Z"
		     < OK
		     < 13
		     < "usb"=1
		     < "parallel"=0
		     < "ieee1394"=0
		     < "serial"=1
		     < "speed"=9600
		     < "speed"=19200
		     < "speed"=38400
		     < "speed"=57600
		     < "speed"=115200
		     < "file_delete"=1
		     < "file_preview"=1
		     < "file_put"=0
		     < "file_capture"=1
		     < "config"=1

folder_list path
	Description: Display the contents of the folder path on the camera.
	    Outputs: OK or ERROR
	    	     if OK, followed by number of entries, followed by the list.
		     an entry in the list has a trailing '/' if it is a folder.

	    Example: > folder_list "/"
		     < OK
		     < 4
		     < birthday/
		     < mountains/
		     < PIC001.JPG
		     < PIC002.JPG

folder_set path
	Description: Sets the current folder.
	    Outputs: OK or ERROR

	    Example: > folder_set "/"
		     < OK

file_count
	Description: Determines the number of files (pictures, sounds, etc.) in the 
		     current folder.
	    Outputs: OK or ERROR
		     if OK, followed by number of files

	    Example: > file_count
		     < OK
		     < 12

file_get number	[directory] [filename]
	Description: Downloads picture #number from the current folder
		 	* if directory is specified, picture is saved to that directory using
			  the camera-recommended filename.
			* if directory and filename is specified, picture is saved as filename 
			  in the directory.
	    Outputs: OK or ERROR
	    	     if OK:
			if just number is specified:
				followed by mime-type, size of picture, and picture data
		     	if directory and/or filename is specified:
				followed by path and filename of picture

	    Example: > file_get 12
		     < OK
		     < image/jpeg
		     < 98012
		     < image data ... . . . ....
		or
		     > file_get 12 "/home/scottf/"
		     < OK
		     < /home/scottf/PIC0012.JPG
		or
		     > file_get 12 "/home/scottf/" "picture12.jpg"
		     < OK
		     < /home/scottf/picture12.jpg

file_get_preview number	[directory] [filename]
	Description: Downloads preview (thumbnail) #number from the current folder
		 	* if directory is specified, preview is saved to that directory using
			  the camera-recommended filename.
			* if directory and filename is specified, picture is saved as filename 
			  in the directory.
	    Outputs: OK or ERROR
	    	     if OK:
			if just number is specified:
				followed by mime-type, size of preview, and preview data
		     	if directory and/or filename is specified:
				followed by path and filename of preview

	    Example: > file_get_preview 12
		     < OK
		     < image/jpeg
		     < 12453
		     < image data ... . . . ....
		or
		     > file_get_preview 12 "/home/scottf/"
		     < OK
		     < /home/scottf/THUMB0012.JPG
		or
		     > file_get_preview 12 "/home/scottf/" "thumbnail12.jpg"
		     < OK
		     < /home/scottf/thumbnail12.jpg

file_put filename
	Description: Uploads the file specified by filename to the camera into the current folder
	    Outputs: OK or ERROR

	    Example: > file_put /home/scottf/picture02.jpg
		     < OK

file_delete number
	Description: Deletes the file #number in the current folder
	    Outputs: OK or ERROR

	    Example: > file_delete 12
		     < OK
config_get
	Description: Gets a set of meta-widgets that describe camera configuration options.
		     (needs explanation on structure)
			widget-type "label" value [min max step | choice]
		     * WINDOW and PAGE are containers. any widget coming after that is put into
		       the container.
		     * value is a number, except for TEXT (then value requires double-quotes)
	    Outputs: OK or ERROR
		     if OK, followed by number of lines, followed by the meta-widgets

	    Example: > config_get
		     < OK
		     < 15
		     < WINDOW "Olympus Configuration"
		     < PAGE "Quality"
		     < RADIO "Resolution" 0 "Standard"
		     < RADIO "Resolution" 1 "High"
		     < RADIO "Resolution" 0 "Best"
		     < RADIO "Compression" 0 "None"
		     < RADIO "Compression" 0 "Low"
		     < RADIO "Compression" 1 "High"
		     < PAGE "Miscellaneous"
		     < RANGE "Zoom" 3.00 
		     < TEXT "Camera Name" "Scott's Olympus D-220L"
		     < MENU "Flash Setting" 0 "Red-eye reduction"
		     < MENU "Flash Setting" 1 "Auto"
		     < MENU "Flash Setting" 0 "Forced"
		     < MENU "Flash Setting" 0 "Blind me"

config_set "label"=[choice|value] "label"=[choice|value] "label"=[choice|value] ...
	Description: Sets the camera configuration 
			* if RADIO or MENU, "label"="choice"
			* for others, "label"=value
	    Outputs: OK

	    Example: > config_set "Resolution"="Best" "Compression"="None" "Zoom"=0.00
		     < OK

capture_to_disk path [filename]
	Description: Causes camera to press the shutter, then download and save to disk.
		    	filename is optional
	    Outputs: OK or ERROR
		     if OK, followed by picture filename

	    Example: > capture_to_disk "/home/scottf"
		     < OK
		     < /home/scottf/PIC00012.JPG
		or
		     > capture_to_disk "/home/scottf" "livepicture.jpg"
		     < OK
		     < /home/scottflivepicture.jpg

about
	Description: Displays information about the camera library
	    Outputs: OK or ERROR
	    	     if OK, followed by number of lines, then camera library information

	    Example: > about
		     < OK
		     < 3
		     < Scott <scottf@unr.edu>
		     < Camera library for foo-bar cameras
		     < These cameras are kinda silly.

manual
	Description: Displays the camera library manual
	    Outputs: OK or ERROR
	    	     if OK, followed by number of lines, then camera library manual

	    Example: > manual
		     < OK
		     < 5
		     < This camera library is a good library.
		     < It does not support capturing image though.
		     < The company that make the camera helped 
		     < by providing information about the communication
		     < protocol.

summary
	Description: Displays the camera summary
	    Outputs: OK or ERROR
	    	     if OK, followed by number of lines, then camera summary

	    Example: > summary
		     < OK
		     < 3
		     < Battery Percent = 65%
		     < Free memory is 31Meg
		     < My height is around 6'4"

gPhoto notifications
--------------------------------------------------------------------
These depend on whether or not "notification_set" has been called.
By default, they are turned off. Use "notification_set 1" to turn them
on.

progress number
	Description: Should display the percent done in the current operation
	   Response: none
	    Example: < progress 50 

message "string"
	Description: Should display a message to the user (pop-up window)
	   Response: none

	    Example: < message "Don't you want to be a pepper too?"

status "string"
	Description: Should display the status to the user (status bar)
	   Response: none

	    Example: < status "Done with current operation."

confirm "string"
	Description: Should display a "yes" or "no" confirmation box to the user.
	   Response: confirm 0 (no), confirm 1 (yes), or ERROR

	    Example: < confirm "Do you want to delete that file?"
		     > confirm 1
		     (gPhoto will not answer this).
