summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorHans Ulrich Niedermann <gp@n-dimensional.de>2001-10-11 15:00:05 +0000
committerHans Ulrich Niedermann <gp@n-dimensional.de>2001-10-11 15:00:05 +0000
commit2c801c35bbae83351f7aa5f3a32927ebbe1339e9 (patch)
treeb8562aba9ca7561bfc75620e976fff0a587b9239 /doc
parentbf36dc9fd49526bb598d5b894e9226e2211c92c2 (diff)
downloadlibgphoto2-2c801c35bbae83351f7aa5f3a32927ebbe1339e9.tar.gz
moved doc files from docs/ to doc/
git-svn-id: https://svn.code.sf.net/p/gphoto/code/trunk/libgphoto2@2481 67ed7778-7388-44ab-90cf-0a291f65f57c
Diffstat (limited to 'doc')
-rw-r--r--doc/build_OS2.txt19
-rw-r--r--doc/camlib_devel-portmon.eps458
-rw-r--r--doc/camlib_devel-repeater.eps515
-rw-r--r--doc/camlib_devel-y.eps464
-rw-r--r--doc/camlib_devel.lyx1096
-rw-r--r--doc/camlib_devel.sgml620
-rw-r--r--doc/camlib_devel.txt507
-rw-r--r--doc/frontend_devel.lyx64
-rw-r--r--doc/frontend_devel.sgml30
-rw-r--r--doc/frontend_devel.txt23
10 files changed, 3796 insertions, 0 deletions
diff --git a/doc/build_OS2.txt b/doc/build_OS2.txt
new file mode 100644
index 000000000..2afb2b4c5
--- /dev/null
+++ b/doc/build_OS2.txt
@@ -0,0 +1,19 @@
+30-7-2000
+bvl: initial release
+about this Document:
+
+This document is a summary of what is needed to build gphoto2 on OS/2
+
+make : nmake v3 available on hobbes,
+ http://hobbes.nmsu.edu/pub/os2/dev/util/nmakew.zip
+
+compile : gcc version 2.8.1
+ http://hobbes.nmsu.edu/cgi-bin/h-browse?sh=1&dir=/pub/os2/dev/emx/v0.9d
+
+libraries : pthreads
+ unfortunatly I don't know whih version I use here but the one from netlabs should be working
+ ftp://ftp.netlabs.org/pub/pthreads/
+
+make sure the emx\lib directory is added to your lib environment 'SET LIB=x:\EMX\LIB'
+alse the pthreads DLL's and LIB's should be in the EMX tree
+
diff --git a/doc/camlib_devel-portmon.eps b/doc/camlib_devel-portmon.eps
new file mode 100644
index 000000000..c2ce65327
--- /dev/null
+++ b/doc/camlib_devel-portmon.eps
@@ -0,0 +1,458 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: Untitled-1
+%%Creator: Dia v0.83
+%%CreationDate: Thu Apr 13 18:39:05 2000
+%%For: a user
+%%Magnification: 1.0000
+%%Orientation: Portrait
+%%BoundingBox: 0 0 320 208
+%%Pages: 1
+%%BeginSetup
+%%EndSetup
+%%EndComments
+[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon
+/less /equal /greater /question /at /A /B /C /D /E
+/F /G /H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W /X /Y
+/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c
+/d /e /f /g /h /i /j /k /l /m
+/n /o /p /q /r /s /t /u /v /w
+/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright
+/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior
+/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf
+/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde
+/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex
+/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring
+/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave
+/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def
+/Times-Roman-latin1
+ /Times-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-Italic-latin1
+ /Times-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-Bold-latin1
+ /Times-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-BoldItalic-latin1
+ /Times-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-Book-latin1
+ /AvantGarde-Book findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-BookOblique-latin1
+ /AvantGarde-BookOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-Demi-latin1
+ /AvantGarde-Demi findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-DemiOblique-latin1
+ /AvantGarde-DemiOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-Light-latin1
+ /Bookman-Light findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-LightItalic-latin1
+ /Bookman-LightItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-Demi-latin1
+ /Bookman-Demi findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-DemiItalic-latin1
+ /Bookman-DemiItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-latin1
+ /Courier findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-Oblique-latin1
+ /Courier-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-Bold-latin1
+ /Courier-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-BoldOblique-latin1
+ /Courier-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-latin1
+ /Helvetica findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Oblique-latin1
+ /Helvetica-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Bold-latin1
+ /Helvetica-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-BoldOblique-latin1
+ /Helvetica-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-latin1
+ /Helvetica-Narrow findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-Oblique-latin1
+ /Helvetica-Narrow-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-Bold-latin1
+ /Helvetica-Narrow-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-BoldOblique-latin1
+ /Helvetica-Narrow-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Roman-latin1
+ /NewCenturySchoolbook-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Italic-latin1
+ /NewCenturySchoolbook-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Bold-latin1
+ /NewCenturySchoolbook-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-BoldItalic-latin1
+ /NewCenturySchoolbook-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Roman-latin1
+ /Palatino-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Italic-latin1
+ /Palatino-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Bold-latin1
+ /Palatino-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-BoldItalic-latin1
+ /Palatino-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Symbol-latin1
+ /Symbol findfont
+definefont pop
+/ZapfChancery-MediumItalic-latin1
+ /ZapfChancery-MediumItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/ZapfDingbats-latin1
+ /ZapfDingbats findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/cp {closepath} bind def
+/c {curveto} bind def
+/f {fill} bind def
+/a {arc} bind def
+/ef {eofill} bind def
+/ex {exch} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth pop} bind def
+/tr {translate} bind def
+
+/ellipsedict 8 dict def
+ellipsedict /mtrx matrix put
+/ellipse
+{ ellipsedict begin
+ /endangle exch def
+ /startangle exch def
+ /yrad exch def
+ /xrad exch def
+ /y exch def
+ /x exch def /savematrix mtrx currentmatrix def
+ x y tr xrad yrad sc
+ 0 0 1 startangle endangle arc
+ savematrix setmatrix
+ end
+} def
+
+/colortogray {
+/rgbdata exch store
+rgbdata length 3 idiv
+/npixls exch store
+/rgbindx 0 store
+0 1 npixls 1 sub {
+grays exch
+rgbdata rgbindx get 20 mul
+rgbdata rgbindx 1 add get 32 mul
+rgbdata rgbindx 2 add get 12 mul
+add add 64 idiv
+put
+/rgbindx rgbindx 3 add store
+} for
+grays 0 npixls getinterval
+} bind def
+/mergeprocs {
+dup length
+3 -1 roll
+dup
+length
+dup
+5 1 roll
+3 -1 roll
+add
+array cvx
+dup
+3 -1 roll
+0 exch
+putinterval
+dup
+4 2 roll
+putinterval
+} bind def
+/colorimage {
+pop pop
+{colortogray} mergeprocs
+image
+} bind def
+
+28.346000 -28.346000 scale
+-5.950000 -11.256637 translate
+%%EndProlog
+
+
+1.000000 1.000000 1.000000 srgb
+n 6.000000 4.000000 m 6.000000 6.000000 l 10.000000 6.000000 l 10.000000 4.000000 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 6.000000 4.000000 m 6.000000 6.000000 l 10.000000 6.000000 l 10.000000 4.000000 l cp s
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+() dup sw 2 div 6.000000 ex sub 5.000000 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+(Camera) dup sw 2 div 8.000000 ex sub 5.000000 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+() dup sw 2 div 8.000000 ex sub 5.000000 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+() dup sw 2 div 7.000000 ex sub 5.000000 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+() dup sw 2 div 10.000000 ex sub 7.000000 m gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 10.000000 5.000000 m 14.000000 5.000000 l s
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 10.800000 4.600000 m 10.000000 5.000000 l 10.800000 5.400000 l f
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 13.200000 5.400000 m 14.000000 5.000000 l 13.200000 4.600000 l f
+0.080000 slw
+0 slj
+[] 0 sd
+0.700000 0.700000 0.700000 srgb
+n 14.250000 4.200000 m 14.250000 7.700000 l 15.750000 7.700000 l 15.750000 4.200000 l f
+0.000000 0.000000 0.000000 srgb
+n 14.250000 4.200000 m 14.250000 7.700000 l 15.750000 7.700000 l 15.750000 4.200000 l cp s
+0.010000 slw
+0.000000 0.000000 0.000000 srgb
+n 14.400000 4.410000 m 14.400000 4.810000 l 15.600000 4.810000 l 15.600000 4.410000 l cp s
+0.000000 0.000000 0.000000 srgb
+n 14.400000 4.810000 m 14.400000 5.210000 l 15.600000 5.210000 l 15.600000 4.810000 l cp s
+0.000000 0.000000 0.000000 srgb
+n 14.400000 5.210000 m 14.400000 5.610000 l 15.600000 5.610000 l 15.600000 5.210000 l cp s
+0.000000 0.000000 0.000000 srgb
+n 14.400000 5.610000 m 14.400000 6.010000 l 15.600000 6.010000 l 15.600000 5.610000 l cp s
+0.000000 0.000000 0.000000 srgb
+n 14.400000 6.090000 m 14.400000 6.330000 l 15.150000 6.330000 l 15.150000 6.090000 l cp s
+0.000000 1.000000 0.000000 srgb
+n 15.525000 6.130000 0.052500 0.052500 0 360 ellipse f
+0.000000 0.000000 0.000000 srgb
+n 15.525000 6.130000 0.052500 0.052500 0 360 ellipse cp s
+1.000000 1.000000 0.000000 srgb
+n 15.525000 6.290000 0.052500 0.052500 0 360 ellipse f
+0.000000 0.000000 0.000000 srgb
+n 15.525000 6.290000 0.052500 0.052500 0 360 ellipse cp s
+1.000000 1.000000 1.000000 srgb
+n 15.225000 6.170000 m 15.225000 6.330000 l 15.405000 6.330000 l 15.405000 6.170000 l f
+0.000000 0.000000 0.000000 srgb
+n 15.225000 6.170000 m 15.225000 6.330000 l 15.405000 6.330000 l 15.405000 6.170000 l cp s
+0.080000 slw
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 14.500000 6.650000 m 14.500000 7.525000 l s
+0.000000 0.000000 0.000000 srgb
+n 14.750000 6.650000 m 14.750000 7.525000 l s
+0.000000 0.000000 0.000000 srgb
+n 15.000000 6.650000 m 15.000000 7.525000 l s
+0.000000 0.000000 0.000000 srgb
+n 15.250000 6.650000 m 15.250000 7.525000 l s
+0.000000 0.000000 0.000000 srgb
+n 15.500000 6.650000 m 15.500000 7.525000 l s
+0.600000 0.600000 0.600000 srgb
+n 13.950000 8.000000 m 14.250000 7.400000 l 14.250000 7.700000 l 15.750000 7.700000 l 15.750000 7.400000 l 16.050000 8.000000 l f
+0.000000 0.000000 0.000000 srgb
+n 13.950000 8.000000 m 14.250000 7.400000 l 14.250000 7.700000 l 15.750000 7.700000 l 15.750000 7.400000 l 16.050000 8.000000 l cp s
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+(Host) dup sw 2 div 15.000000 ex sub 9.000000 m gs 1 -1 sc sh gr
+0.000000 0.000000 0.000000 srgb
+(running) dup sw 2 div 15.000000 ex sub 10.000000 m gs 1 -1 sc sh gr
+0.000000 0.000000 0.000000 srgb
+(PortMon) dup sw 2 div 15.000000 ex sub 11.000000 m gs 1 -1 sc sh gr
+showpage
diff --git a/doc/camlib_devel-repeater.eps b/doc/camlib_devel-repeater.eps
new file mode 100644
index 000000000..efe1e3d5a
--- /dev/null
+++ b/doc/camlib_devel-repeater.eps
@@ -0,0 +1,515 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: Untitled-1
+%%Creator: Dia v0.83
+%%CreationDate: Thu Apr 13 18:17:06 2000
+%%For: a user
+%%Magnification: 1.0000
+%%Orientation: Portrait
+%%BoundingBox: 0 0 408 151
+%%Pages: 1
+%%BeginSetup
+%%EndSetup
+%%EndComments
+[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon
+/less /equal /greater /question /at /A /B /C /D /E
+/F /G /H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W /X /Y
+/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c
+/d /e /f /g /h /i /j /k /l /m
+/n /o /p /q /r /s /t /u /v /w
+/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright
+/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior
+/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf
+/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde
+/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex
+/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring
+/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave
+/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def
+/Times-Roman-latin1
+ /Times-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-Italic-latin1
+ /Times-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-Bold-latin1
+ /Times-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-BoldItalic-latin1
+ /Times-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-Book-latin1
+ /AvantGarde-Book findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-BookOblique-latin1
+ /AvantGarde-BookOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-Demi-latin1
+ /AvantGarde-Demi findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-DemiOblique-latin1
+ /AvantGarde-DemiOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-Light-latin1
+ /Bookman-Light findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-LightItalic-latin1
+ /Bookman-LightItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-Demi-latin1
+ /Bookman-Demi findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-DemiItalic-latin1
+ /Bookman-DemiItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-latin1
+ /Courier findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-Oblique-latin1
+ /Courier-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-Bold-latin1
+ /Courier-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-BoldOblique-latin1
+ /Courier-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-latin1
+ /Helvetica findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Oblique-latin1
+ /Helvetica-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Bold-latin1
+ /Helvetica-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-BoldOblique-latin1
+ /Helvetica-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-latin1
+ /Helvetica-Narrow findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-Oblique-latin1
+ /Helvetica-Narrow-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-Bold-latin1
+ /Helvetica-Narrow-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-BoldOblique-latin1
+ /Helvetica-Narrow-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Roman-latin1
+ /NewCenturySchoolbook-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Italic-latin1
+ /NewCenturySchoolbook-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Bold-latin1
+ /NewCenturySchoolbook-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-BoldItalic-latin1
+ /NewCenturySchoolbook-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Roman-latin1
+ /Palatino-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Italic-latin1
+ /Palatino-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Bold-latin1
+ /Palatino-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-BoldItalic-latin1
+ /Palatino-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Symbol-latin1
+ /Symbol findfont
+definefont pop
+/ZapfChancery-MediumItalic-latin1
+ /ZapfChancery-MediumItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/ZapfDingbats-latin1
+ /ZapfDingbats findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/cp {closepath} bind def
+/c {curveto} bind def
+/f {fill} bind def
+/a {arc} bind def
+/ef {eofill} bind def
+/ex {exch} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth pop} bind def
+/tr {translate} bind def
+
+/ellipsedict 8 dict def
+ellipsedict /mtrx matrix put
+/ellipse
+{ ellipsedict begin
+ /endangle exch def
+ /startangle exch def
+ /yrad exch def
+ /xrad exch def
+ /y exch def
+ /x exch def /savematrix mtrx currentmatrix def
+ x y tr xrad yrad sc
+ 0 0 1 startangle endangle arc
+ savematrix setmatrix
+ end
+} def
+
+/colortogray {
+/rgbdata exch store
+rgbdata length 3 idiv
+/npixls exch store
+/rgbindx 0 store
+0 1 npixls 1 sub {
+grays exch
+rgbdata rgbindx get 20 mul
+rgbdata rgbindx 1 add get 32 mul
+rgbdata rgbindx 2 add get 12 mul
+add add 64 idiv
+put
+/rgbindx rgbindx 3 add store
+} for
+grays 0 npixls getinterval
+} bind def
+/mergeprocs {
+dup length
+3 -1 roll
+dup
+length
+dup
+5 1 roll
+3 -1 roll
+add
+array cvx
+dup
+3 -1 roll
+0 exch
+putinterval
+dup
+4 2 roll
+putinterval
+} bind def
+/colorimage {
+pop pop
+{colortogray} mergeprocs
+image
+} bind def
+
+28.346000 -28.346000 scale
+-5.950000 -9.256637 translate
+%%EndProlog
+
+
+1.000000 1.000000 1.000000 srgb
+n 6.000000 4.000000 m 6.000000 6.000000 l 10.000000 6.000000 l 10.000000 4.000000 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 6.000000 4.000000 m 6.000000 6.000000 l 10.000000 6.000000 l 10.000000 4.000000 l cp s
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+() dup sw 2 div 6.000000 ex sub 5.000000 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+(Camera) dup sw 2 div 8.000000 ex sub 5.000000 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+() dup sw 2 div 8.000000 ex sub 5.000000 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+() dup sw 2 div 7.000000 ex sub 5.000000 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+() dup sw 2 div 10.000000 ex sub 7.000000 m gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 10.000000 5.000000 m 13.000000 5.000000 l s
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 10.800000 4.600000 m 10.000000 5.000000 l 10.800000 5.400000 l f
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 12.200000 5.400000 m 13.000000 5.000000 l 12.200000 4.600000 l f
+0.080000 slw
+0 slj
+[] 0 sd
+0.700000 0.700000 0.700000 srgb
+n 13.250000 4.200000 m 13.250000 7.700000 l 14.750000 7.700000 l 14.750000 4.200000 l f
+0.000000 0.000000 0.000000 srgb
+n 13.250000 4.200000 m 13.250000 7.700000 l 14.750000 7.700000 l 14.750000 4.200000 l cp s
+0.010000 slw
+0.000000 0.000000 0.000000 srgb
+n 13.400000 4.410000 m 13.400000 4.810000 l 14.600000 4.810000 l 14.600000 4.410000 l cp s
+0.000000 0.000000 0.000000 srgb
+n 13.400000 4.810000 m 13.400000 5.210000 l 14.600000 5.210000 l 14.600000 4.810000 l cp s
+0.000000 0.000000 0.000000 srgb
+n 13.400000 5.210000 m 13.400000 5.610000 l 14.600000 5.610000 l 14.600000 5.210000 l cp s
+0.000000 0.000000 0.000000 srgb
+n 13.400000 5.610000 m 13.400000 6.010000 l 14.600000 6.010000 l 14.600000 5.610000 l cp s
+0.000000 0.000000 0.000000 srgb
+n 13.400000 6.090000 m 13.400000 6.330000 l 14.150000 6.330000 l 14.150000 6.090000 l cp s
+0.000000 1.000000 0.000000 srgb
+n 14.525000 6.130000 0.052500 0.052500 0 360 ellipse f
+0.000000 0.000000 0.000000 srgb
+n 14.525000 6.130000 0.052500 0.052500 0 360 ellipse cp s
+1.000000 1.000000 0.000000 srgb
+n 14.525000 6.290000 0.052500 0.052500 0 360 ellipse f
+0.000000 0.000000 0.000000 srgb
+n 14.525000 6.290000 0.052500 0.052500 0 360 ellipse cp s
+1.000000 1.000000 1.000000 srgb
+n 14.225000 6.170000 m 14.225000 6.330000 l 14.405000 6.330000 l 14.405000 6.170000 l f
+0.000000 0.000000 0.000000 srgb
+n 14.225000 6.170000 m 14.225000 6.330000 l 14.405000 6.330000 l 14.405000 6.170000 l cp s
+0.080000 slw
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 13.500000 6.650000 m 13.500000 7.525000 l s
+0.000000 0.000000 0.000000 srgb
+n 13.750000 6.650000 m 13.750000 7.525000 l s
+0.000000 0.000000 0.000000 srgb
+n 14.000000 6.650000 m 14.000000 7.525000 l s
+0.000000 0.000000 0.000000 srgb
+n 14.250000 6.650000 m 14.250000 7.525000 l s
+0.000000 0.000000 0.000000 srgb
+n 14.500000 6.650000 m 14.500000 7.525000 l s
+0.600000 0.600000 0.600000 srgb
+n 12.950000 8.000000 m 13.250000 7.400000 l 13.250000 7.700000 l 14.750000 7.700000 l 14.750000 7.400000 l 15.050000 8.000000 l f
+0.000000 0.000000 0.000000 srgb
+n 12.950000 8.000000 m 13.250000 7.400000 l 13.250000 7.700000 l 14.750000 7.700000 l 14.750000 7.400000 l 15.050000 8.000000 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 15.000000 5.000000 m 18.000000 5.000000 l s
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 15.800000 4.600000 m 15.000000 5.000000 l 15.800000 5.400000 l f
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 17.200000 5.400000 m 18.000000 5.000000 l 17.200000 4.600000 l f
+0.080000 slw
+0 slj
+[] 0 sd
+0.700000 0.700000 0.700000 srgb
+n 18.250000 4.200000 m 18.250000 7.700000 l 19.750000 7.700000 l 19.750000 4.200000 l f
+0.000000 0.000000 0.000000 srgb
+n 18.250000 4.200000 m 18.250000 7.700000 l 19.750000 7.700000 l 19.750000 4.200000 l cp s
+0.010000 slw
+0.000000 0.000000 0.000000 srgb
+n 18.400000 4.410000 m 18.400000 4.810000 l 19.600000 4.810000 l 19.600000 4.410000 l cp s
+0.000000 0.000000 0.000000 srgb
+n 18.400000 4.810000 m 18.400000 5.210000 l 19.600000 5.210000 l 19.600000 4.810000 l cp s
+0.000000 0.000000 0.000000 srgb
+n 18.400000 5.210000 m 18.400000 5.610000 l 19.600000 5.610000 l 19.600000 5.210000 l cp s
+0.000000 0.000000 0.000000 srgb
+n 18.400000 5.610000 m 18.400000 6.010000 l 19.600000 6.010000 l 19.600000 5.610000 l cp s
+0.000000 0.000000 0.000000 srgb
+n 18.400000 6.090000 m 18.400000 6.330000 l 19.150000 6.330000 l 19.150000 6.090000 l cp s
+0.000000 1.000000 0.000000 srgb
+n 19.525000 6.130000 0.052500 0.052500 0 360 ellipse f
+0.000000 0.000000 0.000000 srgb
+n 19.525000 6.130000 0.052500 0.052500 0 360 ellipse cp s
+1.000000 1.000000 0.000000 srgb
+n 19.525000 6.290000 0.052500 0.052500 0 360 ellipse f
+0.000000 0.000000 0.000000 srgb
+n 19.525000 6.290000 0.052500 0.052500 0 360 ellipse cp s
+1.000000 1.000000 1.000000 srgb
+n 19.225000 6.170000 m 19.225000 6.330000 l 19.405000 6.330000 l 19.405000 6.170000 l f
+0.000000 0.000000 0.000000 srgb
+n 19.225000 6.170000 m 19.225000 6.330000 l 19.405000 6.330000 l 19.405000 6.170000 l cp s
+0.080000 slw
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 18.500000 6.650000 m 18.500000 7.525000 l s
+0.000000 0.000000 0.000000 srgb
+n 18.750000 6.650000 m 18.750000 7.525000 l s
+0.000000 0.000000 0.000000 srgb
+n 19.000000 6.650000 m 19.000000 7.525000 l s
+0.000000 0.000000 0.000000 srgb
+n 19.250000 6.650000 m 19.250000 7.525000 l s
+0.000000 0.000000 0.000000 srgb
+n 19.500000 6.650000 m 19.500000 7.525000 l s
+0.600000 0.600000 0.600000 srgb
+n 17.950000 8.000000 m 18.250000 7.400000 l 18.250000 7.700000 l 19.750000 7.700000 l 19.750000 7.400000 l 20.050000 8.000000 l f
+0.000000 0.000000 0.000000 srgb
+n 17.950000 8.000000 m 18.250000 7.400000 l 18.250000 7.700000 l 19.750000 7.700000 l 19.750000 7.400000 l 20.050000 8.000000 l cp s
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+(Repeater) dup sw 2 div 14.000000 ex sub 9.000000 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+(Host) dup sw 2 div 19.000000 ex sub 9.000000 m gs 1 -1 sc sh gr
+showpage
diff --git a/doc/camlib_devel-y.eps b/doc/camlib_devel-y.eps
new file mode 100644
index 000000000..ff3760aee
--- /dev/null
+++ b/doc/camlib_devel-y.eps
@@ -0,0 +1,464 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: Untitled-1
+%%Creator: Dia v0.83
+%%CreationDate: Thu Apr 13 18:51:15 2000
+%%For: a user
+%%Magnification: 1.0000
+%%Orientation: Portrait
+%%BoundingBox: 0 0 294 151
+%%Pages: 1
+%%BeginSetup
+%%EndSetup
+%%EndComments
+[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon
+/less /equal /greater /question /at /A /B /C /D /E
+/F /G /H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W /X /Y
+/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c
+/d /e /f /g /h /i /j /k /l /m
+/n /o /p /q /r /s /t /u /v /w
+/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright
+/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior
+/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf
+/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde
+/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex
+/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring
+/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave
+/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def
+/Times-Roman-latin1
+ /Times-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-Italic-latin1
+ /Times-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-Bold-latin1
+ /Times-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-BoldItalic-latin1
+ /Times-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-Book-latin1
+ /AvantGarde-Book findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-BookOblique-latin1
+ /AvantGarde-BookOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-Demi-latin1
+ /AvantGarde-Demi findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-DemiOblique-latin1
+ /AvantGarde-DemiOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-Light-latin1
+ /Bookman-Light findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-LightItalic-latin1
+ /Bookman-LightItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-Demi-latin1
+ /Bookman-Demi findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-DemiItalic-latin1
+ /Bookman-DemiItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-latin1
+ /Courier findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-Oblique-latin1
+ /Courier-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-Bold-latin1
+ /Courier-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-BoldOblique-latin1
+ /Courier-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-latin1
+ /Helvetica findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Oblique-latin1
+ /Helvetica-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Bold-latin1
+ /Helvetica-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-BoldOblique-latin1
+ /Helvetica-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-latin1
+ /Helvetica-Narrow findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-Oblique-latin1
+ /Helvetica-Narrow-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-Bold-latin1
+ /Helvetica-Narrow-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-BoldOblique-latin1
+ /Helvetica-Narrow-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Roman-latin1
+ /NewCenturySchoolbook-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Italic-latin1
+ /NewCenturySchoolbook-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Bold-latin1
+ /NewCenturySchoolbook-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-BoldItalic-latin1
+ /NewCenturySchoolbook-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Roman-latin1
+ /Palatino-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Italic-latin1
+ /Palatino-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Bold-latin1
+ /Palatino-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-BoldItalic-latin1
+ /Palatino-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Symbol-latin1
+ /Symbol findfont
+definefont pop
+/ZapfChancery-MediumItalic-latin1
+ /ZapfChancery-MediumItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/ZapfDingbats-latin1
+ /ZapfDingbats findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/cp {closepath} bind def
+/c {curveto} bind def
+/f {fill} bind def
+/a {arc} bind def
+/ef {eofill} bind def
+/ex {exch} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth pop} bind def
+/tr {translate} bind def
+
+/ellipsedict 8 dict def
+ellipsedict /mtrx matrix put
+/ellipse
+{ ellipsedict begin
+ /endangle exch def
+ /startangle exch def
+ /yrad exch def
+ /xrad exch def
+ /y exch def
+ /x exch def /savematrix mtrx currentmatrix def
+ x y tr xrad yrad sc
+ 0 0 1 startangle endangle arc
+ savematrix setmatrix
+ end
+} def
+
+/colortogray {
+/rgbdata exch store
+rgbdata length 3 idiv
+/npixls exch store
+/rgbindx 0 store
+0 1 npixls 1 sub {
+grays exch
+rgbdata rgbindx get 20 mul
+rgbdata rgbindx 1 add get 32 mul
+rgbdata rgbindx 2 add get 12 mul
+add add 64 idiv
+put
+/rgbindx rgbindx 3 add store
+} for
+grays 0 npixls getinterval
+} bind def
+/mergeprocs {
+dup length
+3 -1 roll
+dup
+length
+dup
+5 1 roll
+3 -1 roll
+add
+array cvx
+dup
+3 -1 roll
+0 exch
+putinterval
+dup
+4 2 roll
+putinterval
+} bind def
+/colorimage {
+pop pop
+{colortogray} mergeprocs
+image
+} bind def
+
+28.346000 -28.346000 scale
+-5.950000 -9.256637 translate
+%%EndProlog
+
+
+1.000000 1.000000 1.000000 srgb
+n 6.000000 4.000000 m 6.000000 6.000000 l 10.000000 6.000000 l 10.000000 4.000000 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 6.000000 4.000000 m 6.000000 6.000000 l 10.000000 6.000000 l 10.000000 4.000000 l cp s
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+() dup sw 2 div 6.000000 ex sub 5.000000 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+(Camera) dup sw 2 div 8.000000 ex sub 5.000000 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+() dup sw 2 div 8.000000 ex sub 5.000000 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+() dup sw 2 div 7.000000 ex sub 5.000000 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+() dup sw 2 div 10.000000 ex sub 7.000000 m gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 10.000000 5.000000 m 14.000000 5.000000 l s
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 10.800000 4.600000 m 10.000000 5.000000 l 10.800000 5.400000 l f
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 13.200000 5.400000 m 14.000000 5.000000 l 13.200000 4.600000 l f
+0.080000 slw
+0 slj
+[] 0 sd
+0.700000 0.700000 0.700000 srgb
+n 14.250000 4.200000 m 14.250000 7.700000 l 15.750000 7.700000 l 15.750000 4.200000 l f
+0.000000 0.000000 0.000000 srgb
+n 14.250000 4.200000 m 14.250000 7.700000 l 15.750000 7.700000 l 15.750000 4.200000 l cp s
+0.010000 slw
+0.000000 0.000000 0.000000 srgb
+n 14.400000 4.410000 m 14.400000 4.810000 l 15.600000 4.810000 l 15.600000 4.410000 l cp s
+0.000000 0.000000 0.000000 srgb
+n 14.400000 4.810000 m 14.400000 5.210000 l 15.600000 5.210000 l 15.600000 4.810000 l cp s
+0.000000 0.000000 0.000000 srgb
+n 14.400000 5.210000 m 14.400000 5.610000 l 15.600000 5.610000 l 15.600000 5.210000 l cp s
+0.000000 0.000000 0.000000 srgb
+n 14.400000 5.610000 m 14.400000 6.010000 l 15.600000 6.010000 l 15.600000 5.610000 l cp s
+0.000000 0.000000 0.000000 srgb
+n 14.400000 6.090000 m 14.400000 6.330000 l 15.150000 6.330000 l 15.150000 6.090000 l cp s
+0.000000 1.000000 0.000000 srgb
+n 15.525000 6.130000 0.052500 0.052500 0 360 ellipse f
+0.000000 0.000000 0.000000 srgb
+n 15.525000 6.130000 0.052500 0.052500 0 360 ellipse cp s
+1.000000 1.000000 0.000000 srgb
+n 15.525000 6.290000 0.052500 0.052500 0 360 ellipse f
+0.000000 0.000000 0.000000 srgb
+n 15.525000 6.290000 0.052500 0.052500 0 360 ellipse cp s
+1.000000 1.000000 1.000000 srgb
+n 15.225000 6.170000 m 15.225000 6.330000 l 15.405000 6.330000 l 15.405000 6.170000 l f
+0.000000 0.000000 0.000000 srgb
+n 15.225000 6.170000 m 15.225000 6.330000 l 15.405000 6.330000 l 15.405000 6.170000 l cp s
+0.080000 slw
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 14.500000 6.650000 m 14.500000 7.525000 l s
+0.000000 0.000000 0.000000 srgb
+n 14.750000 6.650000 m 14.750000 7.525000 l s
+0.000000 0.000000 0.000000 srgb
+n 15.000000 6.650000 m 15.000000 7.525000 l s
+0.000000 0.000000 0.000000 srgb
+n 15.250000 6.650000 m 15.250000 7.525000 l s
+0.000000 0.000000 0.000000 srgb
+n 15.500000 6.650000 m 15.500000 7.525000 l s
+0.600000 0.600000 0.600000 srgb
+n 13.950000 8.000000 m 14.250000 7.400000 l 14.250000 7.700000 l 15.750000 7.700000 l 15.750000 7.400000 l 16.050000 8.000000 l f
+0.000000 0.000000 0.000000 srgb
+n 13.950000 8.000000 m 14.250000 7.400000 l 14.250000 7.700000 l 15.750000 7.700000 l 15.750000 7.400000 l 16.050000 8.000000 l cp s
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+(Host) dup sw 2 div 15.000000 ex sub 9.000000 m gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 12.000000 5.000000 m 12.000000 6.000000 l 14.000000 6.000000 l 14.000000 6.000000 l s
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 13.200000 6.400000 m 14.000000 6.000000 l 13.200000 5.600000 l f
+showpage
diff --git a/doc/camlib_devel.lyx b/doc/camlib_devel.lyx
new file mode 100644
index 000000000..b1e8fc2fe
--- /dev/null
+++ b/doc/camlib_devel.lyx
@@ -0,0 +1,1096 @@
+#LyX 1.1 created this file. For more info see http://www.lyx.org/
+\lyxformat 2.15
+\textclass linuxdoc
+\language default
+\inputencoding latin1
+\fontscheme default
+\graphics default
+\paperfontsize default
+\spacing single
+\papersize Default
+\paperpackage a4
+\use_geometry 0
+\use_amsmath 0
+\paperorientation portrait
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\defskip medskip
+\quotes_language english
+\quotes_times 2
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+
+\layout Title
+\added_space_top vfill \added_space_bottom vfill
+gPhoto2 Camera Library Developer's Guide
+\layout Author
+
+Scott Fritzinger
+\newline
+2000-07-26
+\newline
+Revision 1
+\layout Standard
+
+
+\begin_inset LatexCommand \tableofcontents{}
+
+\end_inset
+
+
+\layout Section
+
+Reverse Engineering the Camera Protocol
+\layout Standard
+
+The most difficult part for most developers is obtaining the transfer protocol.
+ If the OEM's are lucky enough, they will simply provide us with the protocol
+ specifications for their cameras and the drivers will be written at no
+ cost to them.
+ Most OEM's refuse to do so though, citing trade secrets or company policy;
+ this is truly unfortunate in that they have effectively told their own
+ customers who use operating systems other than Windows and the Mac that
+ they don't want their future business and that they aren't valued customer
+ to begin with.
+\layout Standard
+
+When OEM's do not cooperate, the developer is left to determine the protocol
+ him/herself through reverse engineering.
+
+\layout Subsection
+
+Sniffing the Protocol
+\layout Standard
+
+What follows are the most common setups for sniffing camera protocol traffic.
+ In all setups, a host computer runs the native camera drivers.; typically,
+ the Windows serial port drivers are used for reverse engineering.
+ The drivers are run through a series of functions that include getting
+ a picture index, downloading thumbnails, download full images, deleting
+ images, camera configuration options, in addition to any other features
+ a camera might have.
+ During these operations, one or more of the following methods are used
+ to capture the communication between the host computer and the camera.
+\layout Subsubsection
+
+Serial Repeater
+\layout Standard
+
+A serial repeater consists of the host computer, a computer used as a repeater,
+ and the camera.
+ The setup is shown in figure .
+\layout Standard
+
+The repeater runs special software which reads data from one serial port,
+ logs the communication, and then outputs the data to the other serial port.
+ Data that is from the host computer to the camera and from the camera to
+ the host computer is logged sequentially in a single log file.
+ Information logged includes hexadecimal data values, direction of the communica
+tion, as well as time stamps for synchronization.
+ An example sniffer to use for this configuration is
+\begin_inset Quotes eld
+\end_inset
+
+sersniff
+\begin_inset Quotes erd
+\end_inset
+
+.
+\layout Subsubsection
+
+
+\begin_inset Quotes eld
+\end_inset
+
+Y
+\begin_inset Quotes erd
+\end_inset
+
+ Serial Cable
+\layout Standard
+
+To avoid using two computers, a Y serial cable can be used.
+ The
+\begin_inset Quotes eld
+\end_inset
+
+trunk
+\begin_inset Quotes erd
+\end_inset
+
+ end of the serial cable attaches to the camera's serial transfer cable,
+ while the two
+\begin_inset Quotes eld
+\end_inset
+
+branches
+\begin_inset Quotes erd
+\end_inset
+
+ plug in to two serial ports on the host computer.
+ Figure shows this setup.
+\layout Standard
+
+The camera drivers use one of the serial ports on the host computer, while
+ the other port is opened with a hexadecimal monitor application that dumps
+ all communications on the port to a file.
+ The downside to this approach is the developer would have to determine
+ which sets of data was generated by the camera or the host computer.
+ Also, a Y cable would have to be either built or purchased from an electronics
+ supply store.
+\layout Subsubsection
+
+Virtual Device Driver Hooks
+\layout Standard
+
+The Windows platform allows virtual device drivers to
+\begin_inset Quotes eld
+\end_inset
+
+hook
+\begin_inset Quotes erd
+\end_inset
+
+ into other drivers to provide additional functionality or feature enhancements.
+ A combination GUI and device driver named PortMon by Systems Internals
+ is a communications debugging utility that hooks into the existing Windows
+ serial device driver (vcomm.vxd) and logs communications.
+ Figure shows this equipment arrangement.
+\layout Standard
+
+This setup allows the developer to not use any extra hardware by simply
+ relying on software.
+ This is perhaps the easiest method for capturing camera data.
+\layout Subsection
+
+Making Sense Out of the Protocol
+\layout Standard
+
+What follows are some pointers on decoding camera protocols.
+ It uses a protocol that isn't really any camera protocol in particular,
+ but should demonstrate some commonalities between most camera protocols.
+\layout Enumerate
+
+Cameras like to ping.
+ This is the in the form of an "ACK"" command that is different for different
+ cameras.
+ Basically, it is usually a short packet (probably 1 byte) that is sent
+ both ways in order for the camera to know the computer is there or vice
+ versa.
+ It is also sometimes used to wake up a camera that has gone into power-save
+ mode.
+ It usually starts out the communications, as well as confirms each packet
+ in any sort of "mass" transfer.
+ The opposite, a "NAK", is sent to basically say the last packet was not
+ received, or an error has occured.
+ Again, this is usually just a single byte as well.
+\newline
+
+\newline
+Example:
+\newline
+Computer: 01
+\newline
+Camera : 01
+\newline
+
+\newline
+The Camera sent an ACK ("01") and the Computer responded with an ACK as
+ well.
+\layout Enumerate
+
+Transfers are usually in "reverse network order", meaning least significant
+ bytes come before most significant bytes.
+ For example,
+\begin_inset Quotes eld
+\end_inset
+
+00 08
+\begin_inset Quotes erd
+\end_inset
+
+ should actually be reassembled as
+\begin_inset Quotes eld
+\end_inset
+
+08 00
+\begin_inset Quotes erd
+\end_inset
+
+.
+
+\layout Enumerate
+
+Most protocols use starting and stopping bytes.
+
+\newline
+
+\newline
+Example:
+\newline
+Computer: 03 50 00 0f e0 04
+\newline
+Camera : 03 03 00 3f 03 04
+\newline
+Computer: 01
+\newline
+
+\newline
+For this example, notice the packets begin with "03" and end with "04" (don't
+ pay attention to what is between them).
+ Also notice the Computer sent an "ACK" to confirm it got the packet.
+\layout Enumerate
+
+Packets usually have a "command" byte, which tells either the computer or
+ the camera what to do.
+ Let's say you told the software to retrieve the number of pictures, which
+ at the time happened to be "8", and you got the following:
+\newline
+
+\newline
+Computer: 03 01 00 00 00 04
+\newline
+Camera : 03 01 00 00 08 04
+\newline
+Computer: 01
+\newline
+
+\newline
+In this example, you notice the "03" and "04" specifying the start and stop
+ of the packet.
+ Also, you notice the second byte in the Computer packet is "01".
+ The camera responds with the above packet, and low and behold, you see
+ the number 8 in the same packet.
+ It would appear, initially, that the second byte is used as a command byte,
+ and that "01" specifies the camera to return the number of pictures.
+ This may very well be right, but don't jump into it yet.
+ Make sure you look at a bunch of similar situations to confirm this.
+ (Again, notice the "ACK" sent by the computer).
+\layout Enumerate
+
+Most protocols have a "data size" byte(s) in data packets.
+ Let's say that you told the camera to retrieve thumbnail 8 and you get
+ the following:
+\newline
+
+\newline
+Computer: 03 02 00 00 08 04
+\newline
+Camera : 03 02 00 0F (15 bytes) 04
+\newline
+Computer: 01
+\newline
+
+\newline
+OK, here's a brief breakdown of this transaction:
+\newline
+
+\newline
+-Looks like the command to retrieve a thumbnail is "02" (2nd byte in the
+ computer packet), and that the byte that is "08" specifies which thumbnail
+ to return.
+\newline
+-The camera responds with a "02" in the command field, specifying it is
+ returning a thumbnail, and then sends "0F", and 15 bytes of data.
+
+\newline
+-It looks like the byte "0F" specifies how many bytes are after it in the
+ same packet.
+ This is a data size byte.
+
+\newline
+(Note: this is a simplistic example.
+ No thumbnail will only be 15 bytes :) this leads up to the next thing to
+ consider)
+\layout Enumerate
+
+Most protocols have an "order" or "counter" byte.
+ This is used so that, in large data transfers where the picture may be
+ split up into several different packets, the computer knows how to reassemble
+ all the data.
+ The entire thumbnail more than likely will not be contained in a single
+ packet for logistical reasons, so they break up the data into many different
+ packets and give each packet a unique number (or
+\begin_inset Quotes eld
+\end_inset
+
+order
+\begin_inset Quotes erd
+\end_inset
+
+ byte).
+ Let's say you told your camera to return thumbnail 8 (which is, as mentioned,
+ pretty big), and you get the following:
+\newline
+
+\newline
+Computer: 02 03 00 00 08 03
+\newline
+Camera : 02 03 00 0F (15 bytes) 03
+\newline
+Computer: 01
+\newline
+Camera : 02 03 01 0F (15 bytes) 03
+\newline
+Computer: 01
+\newline
+Camera : 02 03 02 0F (15 bytes) 03
+\newline
+Computer: 01
+\newline
+...
+ 5 more packets and ACKs ...
+\newline
+Camera : 02 03 08 09 (9 bytes) 03
+\newline
+Computer: 01
+\newline
+
+\newline
+You notice that the 3rd byte of each of the camera packets increments with
+ each packet sent from the camera.
+ This looks like it is an order (counter) byte.
+ the computer can then reassemble the data from all the packets in order
+ to reproduce the image.
+\layout Enumerate
+
+Most protocols have some sort of error detection byte(s) at the end of the
+ packet.
+ This is usually a simple checksum (summation of bytes), or a CRC (a somewhat
+ complex algorithm that reduces the probability of mis-diagnosing a packet
+ with errors by magnitudes).
+ These bytes can take into account only the data, or maybe the entire packet
+ excluding those error detection bytes.
+ If this isn't a known scheme, this winds up being the hardest part of reimpleme
+nting the protocol.
+ Lets take the above example again, this time we'll add a couple bytes on
+ the end for error detection:
+\newline
+
+\newline
+Computer: 02 03 00 00 08 03
+\newline
+Camera : 02 03 00 0F (15 bytes) 0f 02 03
+\newline
+Computer: 01
+\newline
+Camera : 02 03 01 0F (15 bytes) 0e 00 03
+\newline
+Computer: 02
+\newline
+Camera : 02 03 01 0F (15 bytes) fa d0 03
+\newline
+Computer: 01
+\newline
+Camera : 02 03 02 0F (15 bytes) fa d0 03
+\newline
+Computer: 01
+\newline
+...
+ 5 more packets and ACKs
+\newline
+Camera : 02 03 08 09 (9 bytes) d7 38 03
+\newline
+Computer: 01
+\newline
+
+\newline
+Notice how the error detection bytes are usually different for each packet.
+ These may be checksums, or CRC's, or something else.
+ Only way to find out really is to try each one, on different combinations
+ of packet parts (data, order byte, command byte, etc...) and see if you get
+ the same thing.
+ Try this on the shorter packets to make life easier.
+\newline
+
+\newline
+Look at one more thing that sticks out in this transaction: for packet with
+ order byte
+\begin_inset Quotes eld
+\end_inset
+
+01
+\begin_inset Quotes erd
+\end_inset
+
+, the Computer responded with a "02
+\begin_inset Quotes erd
+\end_inset
+
+.
+ and the Camera then resent the same packet it just did.
+ This shows that the NAK byte is "02", and this could happen because maybe
+ the error detection bytes didn't match with the data, or maybe something
+ else happened.
+ either way, the camera resent the last packet, and now you know how the
+ camera can recover from transfer errors.
+ If you didn't get the packet you were expecting, send the camera a NAK
+ and it will resend the same packet again.
+\layout Section
+
+Understanding the gPhoto2 Design
+\layout Standard
+
+The gPhoto2 design is the same three-tiered structure that has worked extremely
+ well in the past with other software packages.
+ Here is a listing of the 3 tiers:
+\layout Itemize
+
+the camera library
+\layout Itemize
+
+the I/O library
+\layout Itemize
+
+the front-end
+\layout Itemize
+
+the
+\begin_inset Quotes eld
+\end_inset
+
+core
+\begin_inset Quotes erd
+\end_inset
+
+
+\layout Subsection
+
+Role of the Camera Library
+\layout Standard
+
+The camera library is in charge of talking directly with the camera.
+ The library uses the gPhoto2 Camera API in order to provide a common access-met
+hod for the library itself.
+ Being dynamically linked, the libraries are loaded at run-time depending
+ on the camera model the end-user would like to access.
+
+\layout Standard
+
+In order to provide flexilibity with variations in camera design, there
+ are camera
+\begin_inset Quotes eld
+\end_inset
+
+abilities
+\begin_inset Quotes erd
+\end_inset
+
+ which list, well, the abilities of each camera model.
+ Some camera may support serial port connections only, while others may
+ be able to use USB and a serial port.
+ We've run into cameras that don't support thumbnailing on the camera so
+ there is an
+\begin_inset Quotes eld
+\end_inset
+
+abilities
+\begin_inset Quotes erd
+\end_inset
+
+ field to specify whether or not the camera supports thumbnailing.
+ The
+\begin_inset Quotes eld
+\end_inset
+
+abilities
+\begin_inset Quotes erd
+\end_inset
+
+ also list other things such as supported serial transfer speeds, file deletion,
+ and other functionality.
+\layout Standard
+
+The camera libraries only make functions calls to the I/O library and to
+ the gPhoto2 core.
+\layout Standard
+
+There is more information on the specifics of the camera library in section
+ 3 of this document.
+\layout Subsection
+
+Role of the I/O Library
+\layout Standard
+
+The gPhoto2 I/O library is a platform-independent communications library
+ that support serial, parallel, USB, firewire, and network connections.
+ It is a work-in-progress with a constantly expanding list of supported
+ platforms.
+ This library uses the gPhoto2 I/O library API for accessing communications
+ devices.
+ It enumerates the devices available on a system, and provides read/write
+ access.
+\layout Standard
+
+The camera libraries all use the I/O library for communications with the
+ cameras.
+ By doing having all communications go through a single library, the camera
+ libraries become as portable as the I/O library.
+ Porting gPhoto2 to other platforms become extremely easy.
+\layout Standard
+
+There is more information on the specifics of the I/O library in section
+ 3 of this document.
+\layout Subsection
+
+Role of the Front-end
+\layout Standard
+
+The front-end is the application that the user interacts with.
+ It is usually a command-line program, or a graphical point-and-click interface.
+ The front-end talks only with the gPhoto2 core in order to retrieve pictures
+ and perform other functions with the camera.
+\layout Subsection
+
+Role of the gPhoto2 Core
+\layout Standard
+
+The gPhoto2
+\begin_inset Quotes eld
+\end_inset
+
+core
+\begin_inset Quotes erd
+\end_inset
+
+ is the heart of gPhoto2.
+ It provides services to both the camera libraries and the front-ends.
+ Most of the services deal with error-checking and enumeration of devices
+ (cameras, I/O devices, etc...).
+ The core performs validity checking on data passed to/from the front-end
+ or the camera library.
+\layout Standard
+
+You could consider the core a translator/interpreter/spell-checker/army-general
+ in the
+\begin_inset Quotes eld
+\end_inset
+
+big picture
+\begin_inset Quotes erd
+\end_inset
+
+ of gPhoto2.
+ It does the grunt-work and performs the coordination of the other parts.
+\layout Section
+
+Implementing the Library
+\layout Standard
+
+gPhoto2 camera libraries use the gPhoto2 Camera API (CAPI) for implementation.
+ Here is a listing of the CAPI functions:
+\layout Standard
+
+camera_id
+\layout Standard
+
+camera_abilities
+\layout Standard
+
+camera_init
+\layout Standard
+
+camera_exit
+\layout Standard
+
+camera_folder_list
+\layout Standard
+
+camera_file_list
+\protected_separator
+
+\layout Standard
+
+camera_file_get
+\layout Standard
+
+camera_file_get_preview
+\layout Standard
+
+camera_file_put
+\layout Standard
+
+camera_file_delete
+\layout Standard
+
+camera_config_get
+\layout Standard
+
+camera_config_set
+\layout Standard
+
+camera_capture
+\layout Standard
+
+camera_summary
+\layout Standard
+
+camera_manual
+\layout Standard
+
+camera_about
+\newline
+
+\layout Standard
+
+Section 3.1 details the purpose of each of these functions, while Section
+ 3.2 discusses how to use the I/O library.
+\layout Subsection
+
+Camera API
+\layout Standard
+
+The CAPI provides the full set of functions for doing various tasks with
+ the camera.
+ All CAPI functions return either GP_OK for succesful execution , or GP_ERROR
+ for a failure of execution
+\layout Standard
+
+What follows is a listing of the functions, including prototypes and data
+ exchange:
+\layout Subsubsection
+
+camera_id
+\layout Standard
+
+
+\series bold
+Purpose:
+\series default
+Retrieve the unique id for the camera library.
+\layout Standard
+
+
+\series bold
+Prototype:
+\series default
+int camera_id (CameraText *id);
+\layout Standard
+
+
+\series bold
+Arguments:
+\layout Standard
+
+CameraText *id : unique string to represent the camera library
+\newline
+
+\layout Standard
+
+In order to guarantee that only once instance of the camera library is loaded
+ for each instance of the core, the camera library must copy a unique string
+ into the
+\begin_inset Quotes eld
+\end_inset
+
+id
+\begin_inset Quotes erd
+\end_inset
+
+.
+ Please consult the gPhoto developers to determine which string you should
+ use.
+\newline
+
+\layout Standard
+
+
+\series bold
+Example:
+\layout Standard
+
+int camera_id(CameraText *id) {
+\layout Standard
+
+strcpy(id->text,
+\begin_inset Quotes eld
+\end_inset
+
+my-unique-string
+\begin_inset Quotes erd
+\end_inset
+
+);
+\layout Standard
+
+return (GP_OK);
+\layout Standard
+
+}
+\layout Subsubsection
+
+camera_abilities
+\layout Standard
+
+
+\series bold
+Purpose:
+\series default
+Retrieve the list of supported cameras and the abilities for each camera
+\layout Standard
+
+
+\series bold
+Prototype:
+\series default
+int camera_abilities (CameraAbilitiesList *list);
+\layout Standard
+
+
+\series bold
+Arguments:
+\series default
+d
+\layout Standard
+
+CameraAbilities *abilities : the list of abilities for the supported cameras
+\layout Standard
+
+int *count : the number of
+\layout Subsubsection
+
+camera_init
+\layout Standard
+
+
+\series bold
+Purpose:
+\series default
+Initialize the camera
+\layout Standard
+
+
+\series bold
+Prototype:
+\series default
+int camera_init (Camera *camera, CameraInit *init);
+\layout Standard
+
+
+\series bold
+Arguments:
+\series default
+d
+\layout Subsubsection
+
+camera_exit
+\layout Standard
+
+
+\series bold
+Purpose:
+\series default
+Close the camera
+\layout Standard
+
+
+\series bold
+Prototype:
+\series default
+int camera_exit (Camera *camera);
+\layout Standard
+
+
+\series bold
+Arguments:
+\series default
+d
+\layout Subsubsection
+
+camera_file_list
+\layout Standard
+
+
+\series bold
+Purpose:
+\series default
+List the files in a particular folder on the camera
+\layout Standard
+
+
+\series bold
+Prototype:
+\series default
+int camera_file_list(Camera *camera, CameraList *list, char *folder);
+\layout Standard
+
+
+\series bold
+Arguments:
+\series default
+d
+\layout Subsubsection
+
+camera_folder_list
+\layout Standard
+
+
+\series bold
+Purpose:
+\series default
+List the subfolders in a particular folder on the camera
+\layout Standard
+
+
+\series bold
+Prototype:
+\series default
+int camera_folder_list(Camera *camera, CameraList *list, char *folder);
+
+\layout Standard
+
+
+\series bold
+Arguments:
+\series default
+d
+\layout Subsubsection
+
+camera_file_get
+\layout Standard
+
+
+\series bold
+Purpose:
+\series default
+Retrieve a file from the camera
+\layout Standard
+
+
+\series bold
+Prototype:
+\series default
+int camera_file_get (Camera *camera, CameraFile *file, char *folder, char
+ *filename);
+\layout Standard
+
+
+\series bold
+Arguments:
+\series default
+d
+\layout Subsubsection
+
+camera_file_get_preview
+\layout Standard
+
+
+\series bold
+Purpose:
+\series default
+Retrieve a file's preview from the camera
+\layout Standard
+
+
+\series bold
+Prototype:
+\series default
+int camera_file_get_preview (Camera *camera, CameraFile *file, char *folder,
+ char *filename);
+\layout Standard
+
+
+\series bold
+Arguments:
+\series default
+d
+\layout Subsubsection
+
+camera_file_put
+\layout Standard
+
+
+\series bold
+Purpose:
+\series default
+Place (upload) a file to the camera
+\layout Standard
+
+
+\series bold
+Prototype:
+\series default
+int camera_file_put (Camera *camera, CameraFile *file, char *folder);
+\layout Standard
+
+
+\series bold
+Arguments:
+\series default
+d
+\layout Subsubsection
+
+camera_file_delete
+\layout Standard
+
+
+\series bold
+Purpose:
+\series default
+Delete a file from the camera
+\layout Standard
+
+
+\series bold
+Prototype:
+\series default
+int camera_file_delete (Camera *camera, char *folder, char *filename);
+\layout Standard
+
+
+\series bold
+Arguments:
+\series default
+d
+\layout Subsubsection
+
+camera_config_get
+\layout Standard
+
+
+\series bold
+Purpose:
+\series default
+Retrieve the configuration window.
+\layout Standard
+
+
+\series bold
+Prototype:
+\series default
+int camera_config_get (Camera *camera, CameraWidget *window);
+\layout Standard
+
+
+\series bold
+Arguments:
+\series default
+d
+\layout Subsubsection
+
+camera_config_set
+\layout Standard
+
+
+\series bold
+Purpose:
+\series default
+Set camera configuration
+\layout Standard
+
+
+\series bold
+Prototype:
+\series default
+int camera_config_set (Camera *camera, CameraSetting *setting, int count);
+
+\layout Standard
+
+
+\series bold
+Arguments:
+\series default
+d
+\layout Subsubsection
+
+camera_capture
+\layout Standard
+
+
+\series bold
+Purpose:
+\series default
+Retrieve live data from the camera
+\layout Standard
+
+
+\series bold
+Prototype:
+\series default
+int camera_capture (Camera *camera, CameraFile *file, CameraCaptureInfo
+ *info);
+\layout Standard
+
+
+\series bold
+Arguments:
+\series default
+d
+\layout Subsubsection
+
+camera_summary
+\layout Standard
+
+
+\series bold
+Purpose:
+\series default
+Retrieve the camera summary information
+\layout Standard
+
+
+\series bold
+Prototype:
+\series default
+int camera_summary (Camera *camera, CameraText *summary);
+\layout Standard
+
+
+\series bold
+Arguments:
+\series default
+d
+\layout Subsubsection
+
+camera_manual
+\layout Standard
+
+
+\series bold
+Purpose:
+\series default
+Retrieve the camera user's guide (manual)
+\layout Standard
+
+
+\series bold
+Prototype:
+\series default
+int camera_manual (Camera *camera, CameraText *manual);
+\layout Standard
+
+
+\series bold
+Arguments:
+\series default
+d
+\layout Subsubsection
+
+camera_about
+\layout Standard
+
+
+\series bold
+Purpose:
+\series default
+Retrieve information about the camera library
+\layout Standard
+
+
+\series bold
+Prototype:
+\series default
+int camera_about (Camera *camera, CameraText *about);
+\layout Standard
+
+
+\series bold
+Arguments:
+\series default
+d
+\layout Subsection
+
+The gPhoto2 I/O Library
+\the_end
diff --git a/doc/camlib_devel.sgml b/doc/camlib_devel.sgml
new file mode 100644
index 000000000..505f19352
--- /dev/null
+++ b/doc/camlib_devel.sgml
@@ -0,0 +1,620 @@
+<!doctype linuxdoc system>
+
+<!-- LyX 1.1 created this file. For more info see http://www.lyx.org/ -->
+<article>
+<title>
+gPhoto2 Camera Library Developer's Guide
+</title>
+<author>
+Scott Fritzinger
+2000-07-26
+Revision 1
+</author>
+<toc>
+<sect>
+Reverse Engineering the Camera Protocol
+<p>
+The most difficult part for most developers is obtaining the transfer protocol.
+ If the OEM's are lucky enough, they will simply provide us with the protocol
+ specifications for their cameras and the drivers will be written at no cost
+ to them. Most OEM's refuse to do so though, citing trade secrets or company
+ policy; this is truly unfortunate in that they have effectively told their
+ own customers who use operating systems other than Windows and the Mac that
+ they don't want their future business and that they aren't valued customer
+ to begin with.
+</p>
+<p>
+When OEM's do not cooperate, the developer is left to determine the protocol
+ him/herself through reverse engineering.
+</p>
+<sect1>
+Sniffing the Protocol
+<p>
+What follows are the most common setups for sniffing camera protocol traffic.
+ In all setups, a host computer runs the native camera drivers.; typically,
+ the Windows serial port drivers are used for reverse engineering. The drivers
+ are run through a series of functions that include getting a picture index,
+ downloading thumbnails, download full images, deleting images, camera configuration
+ options, in addition to any other features a camera might have. During these
+ operations, one or more of the following methods are used to capture the communication
+ between the host computer and the camera.
+</p>
+<sect2>
+Serial Repeater
+<p>
+A serial repeater consists of the host computer, a computer used as a repeater,
+ and the camera. The setup is shown in figure .
+</p>
+<p>
+The repeater runs special software which reads data from one serial port,
+ logs the communication, and then outputs the data to the other serial port.
+ Data that is from the host computer to the camera and from the camera to the
+ host computer is logged sequentially in a single log file. Information logged
+ includes hexadecimal data values, direction of the communication, as well as
+ time stamps for synchronization. An example sniffer to use for this configuration
+ is "sersniff".
+</p>
+<sect2>
+"Y" Serial Cable
+<p>
+To avoid using two computers, a Y serial cable can be used. The "trunk" end
+ of the serial cable attaches to the camera's serial transfer cable, while the
+ two "branches" plug in to two serial ports on the host computer. Figure shows
+ this setup.
+</p>
+<p>
+The camera drivers use one of the serial ports on the host computer, while
+ the other port is opened with a hexadecimal monitor application that dumps
+ all communications on the port to a file. The downside to this approach is
+ the developer would have to determine which sets of data was generated by the
+ camera or the host computer. Also, a Y cable would have to be either built
+ or purchased from an electronics supply store.
+</p>
+<sect2>
+Virtual Device Driver Hooks
+<p>
+The Windows platform allows virtual device drivers to "hook" into other drivers
+ to provide additional functionality or feature enhancements. A combination
+ GUI and device driver named PortMon by Systems Internals is a communications
+ debugging utility that hooks into the existing Windows serial device driver
+ (vcomm.vxd) and logs communications. Figure shows this equipment arrangement.
+</p>
+<p>
+This setup allows the developer to not use any extra hardware by simply
+ relying on software. This is perhaps the easiest method for capturing camera
+ data.
+</p>
+<sect1>
+Making Sense Out of the Protocol
+<p>
+What follows are some pointers on decoding camera protocols. It uses a
+ protocol that isn't really any camera protocol in particular, but should demonstrate
+ some commonalities between most camera protocols.
+</p>
+<p>
+<enum>
+ <item>
+Cameras like to ping. This is the in the form of an &quot;ACK&quot;&quot;
+ command that is different for different cameras. Basically, it is usually a
+ short packet (probably 1 byte) that is sent both ways in order for the camera
+ to know the computer is there or vice versa. It is also sometimes used to wake
+ up a camera that has gone into power-save mode. It usually starts out the communications,
+ as well as confirms each packet in any sort of &quot;mass&quot; transfer. The
+ opposite, a &quot;NAK&quot;, is sent to basically say the last packet was not
+ received, or an error has occured. Again, this is usually just a single byte
+ as well.
+
+Example:
+Computer: 01
+Camera : 01
+
+The Camera sent an ACK (&quot;01&quot;)
+ and the Computer responded with an ACK as well.
+ <item>
+Transfers are usually in &quot;reverse network order&quot;, meaning least
+ significant bytes come before most significant bytes. For example, "00 08" should
+ actually be reassembled as "08 00".
+ <item>
+Most protocols use starting and stopping bytes.
+
+Example:
+Computer: 03
+ 50 00 0f e0 04
+Camera : 03 03 00 3f 03 04
+Computer: 01
+
+For this example,
+ notice the packets begin with &quot;03&quot; and end with &quot;04&quot; (don't
+ pay attention to what is between them). Also notice the Computer sent an &quot;ACK&quot;
+ to confirm it got the packet.
+ <item>
+Packets usually have a &quot;command&quot; byte, which tells either the
+ computer or the camera what to do. Let's say you told the software to retrieve
+ the number of pictures, which at the time happened to be &quot;8&quot;, and
+ you got the following:
+
+Computer: 03 01 00 00 00 04
+Camera : 03 01 00 00 08
+ 04
+Computer: 01
+
+In this example, you notice the &quot;03&quot; and &quot;04&quot;
+ specifying the start and stop of the packet. Also, you notice the second byte
+ in the Computer packet is &quot;01&quot;. The camera responds with the above
+ packet, and low and behold, you see the number 8 in the same packet. It would
+ appear, initially, that the second byte is used as a command byte, and that
+ &quot;01&quot; specifies the camera to return the number of pictures. This
+ may very well be right, but don't jump into it yet. Make sure you look at a
+ bunch of similar situations to confirm this. (Again, notice the &quot;ACK&quot;
+ sent by the computer).
+ <item>
+Most protocols have a &quot;data size&quot; byte(s) in data packets. Let's
+ say that you told the camera to retrieve thumbnail 8 and you get the following:
+
+Computer:
+ 03 02 00 00 08 04
+Camera : 03 02 00 0F (15 bytes) 04
+Computer: 01
+
+OK, here's
+ a brief breakdown of this transaction:
+
+-Looks like the command to retrieve
+ a thumbnail is &quot;02&quot; (2nd byte in the computer packet), and that the
+ byte that is &quot;08&quot; specifies which thumbnail to return.
+-The camera
+ responds with a &quot;02&quot; in the command field, specifying it is returning
+ a thumbnail, and then sends &quot;0F&quot;, and 15 bytes of data.
+-It looks
+ like the byte &quot;0F&quot; specifies how many bytes are after it in the same
+ packet. This is a data size byte.
+(Note: this is a simplistic example. No
+ thumbnail will only be 15 bytes :) this leads up to the next thing to consider)
+ <item>
+Most protocols have an &quot;order&quot; or &quot;counter&quot; byte. This
+ is used so that, in large data transfers where the picture may be split up
+ into several different packets, the computer knows how to reassemble all the
+ data. The entire thumbnail more than likely will not be contained in a single
+ packet for logistical reasons, so they break up the data into many different
+ packets and give each packet a unique number (or "order" byte). Let's say you
+ told your camera to return thumbnail 8 (which is, as mentioned, pretty big),
+ and you get the following:
+
+Computer: 02 03 00 00 08 03
+Camera : 02 03 00
+ 0F (15 bytes) 03
+Computer: 01
+Camera : 02 03 01 0F (15 bytes) 03
+Computer:
+ 01
+Camera : 02 03 02 0F (15 bytes) 03
+Computer: 01
+... 5 more packets and ACKs
+ ...
+Camera : 02 03 08 09 (9 bytes) 03
+Computer: 01
+
+You notice that the 3rd
+ byte of each of the camera packets increments with each packet sent from the
+ camera. This looks like it is an order (counter) byte. the computer can then
+ reassemble the data from all the packets in order to reproduce the image.
+ <item>
+Most protocols have some sort of error detection byte(s) at the end of
+ the packet. This is usually a simple checksum (summation of bytes), or a CRC
+ (a somewhat complex algorithm that reduces the probability of mis-diagnosing
+ a packet with errors by magnitudes). These bytes can take into account only
+ the data, or maybe the entire packet excluding those error detection bytes.
+ If this isn't a known scheme, this winds up being the hardest part of reimplementing
+ the protocol. Lets take the above example again, this time we'll add a couple
+ bytes on the end for error detection:
+
+Computer: 02 03 00 00 08 03
+Camera :
+ 02 03 00 0F (15 bytes) 0f 02 03
+Computer: 01
+Camera : 02 03 01 0F (15 bytes)
+ 0e 00 03
+Computer: 02
+Camera : 02 03 01 0F (15 bytes) fa d0 03
+Computer: 01
+Camera
+ : 02 03 02 0F (15 bytes) fa d0 03
+Computer: 01
+... 5 more packets and ACKs
+Camera
+ : 02 03 08 09 (9 bytes) d7 38 03
+Computer: 01
+
+Notice how the error detection
+ bytes are usually different for each packet. These may be checksums, or CRC's,
+ or something else. Only way to find out really is to try each one, on different
+ combinations of packet parts (data, order byte, command byte, etc...) and see
+ if you get the same thing. Try this on the shorter packets to make life easier.
+
+Look
+ at one more thing that sticks out in this transaction: for packet with order
+ byte "01", the Computer responded with a &quot;02". and the Camera then resent
+ the same packet it just did. This shows that the NAK byte is &quot;02&quot;,
+ and this could happen because maybe the error detection bytes didn't match
+ with the data, or maybe something else happened. either way, the camera resent
+ the last packet, and now you know how the camera can recover from transfer
+ errors. If you didn't get the packet you were expecting, send the camera a
+ NAK and it will resend the same packet again.
+</enum>
+</p><sect>
+Understanding the gPhoto2 Design
+<p>
+The gPhoto2 design is the same three-tiered structure that has worked extremely
+ well in the past with other software packages. Here is a listing of the 3 tiers:
+</p>
+<p>
+<itemize>
+ <item>
+the camera library
+ <item>
+the I/O library
+ <item>
+the front-end
+ <item>
+the "core"
+</itemize>
+</p><sect1>
+Role of the Camera Library
+<p>
+The camera library is in charge of talking directly with the camera. The
+ library uses the gPhoto2 Camera API in order to provide a common access-method
+ for the library itself. Being dynamically linked, the libraries are loaded
+ at run-time depending on the camera model the end-user would like to access.
+
+</p>
+<p>
+In order to provide flexilibity with variations in camera design, there
+ are camera "abilities" which list, well, the abilities of each camera model.
+ Some camera may support serial port connections only, while others may be able
+ to use USB and a serial port. We've run into cameras that don't support thumbnailing
+ on the camera so there is an "abilities" field to specify whether or not the
+ camera supports thumbnailing. The "abilities" also list other things such as
+ supported serial transfer speeds, file deletion, and other functionality.
+</p>
+<p>
+The camera libraries only make functions calls to the I/O library and to
+ the gPhoto2 core.
+</p>
+<p>
+There is more information on the specifics of the camera library in section
+ 3 of this document.
+</p>
+<sect1>
+Role of the I/O Library
+<p>
+The gPhoto2 I/O library is a platform-independent communications library
+ that support serial, parallel, USB, firewire, and network connections. It is
+ a work-in-progress with a constantly expanding list of supported platforms.
+ This library uses the gPhoto2 I/O library API for accessing communications
+ devices. It enumerates the devices available on a system, and provides read/write
+ access.
+</p>
+<p>
+The camera libraries all use the I/O library for communications with the
+ cameras. By doing having all communications go through a single library, the
+ camera libraries become as portable as the I/O library. Porting gPhoto2 to
+ other platforms become extremely easy.
+</p>
+<p>
+There is more information on the specifics of the I/O library in section
+ 3 of this document.
+</p>
+<sect1>
+Role of the Front-end
+<p>
+The front-end is the application that the user interacts with. It is usually
+ a command-line program, or a graphical point-and-click interface. The front-end
+ talks only with the gPhoto2 core in order to retrieve pictures and perform
+ other functions with the camera.
+</p>
+<sect1>
+Role of the gPhoto2 Core
+<p>
+The gPhoto2 "core" is the heart of gPhoto2. It provides services to both
+ the camera libraries and the front-ends. Most of the services deal with error-checking
+ and enumeration of devices (cameras, I/O devices, etc...). The core performs
+ validity checking on data passed to/from the front-end or the camera library.
+</p>
+<p>
+You could consider the core a translator/interpreter/spell-checker/army-general
+ in the "big picture" of gPhoto2. It does the grunt-work and performs the coordination
+ of the other parts.
+</p>
+<sect>
+Implementing the Library
+<p>
+gPhoto2 camera libraries use the gPhoto2 Camera API (CAPI) for implementation.
+ Here is a listing of the CAPI functions:
+</p>
+<p>
+camera_id
+</p>
+<p>
+camera_abilities
+</p>
+<p>
+camera_init
+</p>
+<p>
+camera_exit
+</p>
+<p>
+camera_folder_list
+</p>
+<p>
+camera_file_list
+</p>
+<p>
+camera_file_get
+</p>
+<p>
+camera_file_get_preview
+</p>
+<p>
+camera_file_put
+</p>
+<p>
+camera_file_delete
+</p>
+<p>
+camera_config_get
+</p>
+<p>
+camera_config_set
+</p>
+<p>
+camera_capture
+</p>
+<p>
+camera_summary
+</p>
+<p>
+camera_manual
+</p>
+<p>
+camera_about
+
+</p>
+<p>
+Section 3.1 details the purpose of each of these functions, while Section
+ 3.2 discusses how to use the I/O library.
+</p>
+<sect1>
+Camera API
+<p>
+The CAPI provides the full set of functions for doing various tasks with
+ the camera. All CAPI functions return either GP_OK for succesful execution
+ , or GP_ERROR for a failure of execution
+</p>
+<p>
+What follows is a listing of the functions, including prototypes and data
+ exchange:
+</p>
+<sect2>
+camera_id
+<p>
+<bf>Purpose: </bf>Retrieve the unique id for the camera library.
+</p>
+<p>
+<bf>Prototype: </bf>int camera_id (CameraText *id);
+</p>
+<p>
+<bf>Arguments: </bf>
+</p>
+<p>
+CameraText *id : unique string to represent the camera library
+
+</p>
+<p>
+In order to guarantee that only once instance of the camera library is
+ loaded for each instance of the core, the camera library must copy a unique
+ string into the "id". Please consult the gPhoto developers to determine which
+ string you should use.
+
+</p>
+<p>
+<bf>Example:</bf>
+</p>
+<p>
+int camera_id(CameraText *id) &lcub;
+</p>
+<p>
+strcpy(id-&gt;text, "my-unique-string");
+</p>
+<p>
+return (GP_OK);
+</p>
+<p>
+&rcub;
+</p>
+<sect2>
+camera_abilities
+<p>
+<bf>Purpose: </bf>Retrieve the list of supported cameras and the abilities for each
+ camera
+</p>
+<p>
+<bf>Prototype: </bf>int camera_abilities (CameraAbilitiesList *list);
+</p>
+<p>
+<bf>Arguments: </bf>d
+</p>
+<p>
+CameraAbilities *abilities : the list of abilities for the supported cameras
+</p>
+<p>
+int *count : the number of
+</p>
+<sect2>
+camera_init
+<p>
+<bf>Purpose: </bf>Initialize the camera
+</p>
+<p>
+<bf>Prototype: </bf>int camera_init (Camera *camera, CameraInit *init);
+</p>
+<p>
+<bf>Arguments: </bf>d
+</p>
+<sect2>
+camera_exit
+<p>
+<bf>Purpose: </bf>Close the camera
+</p>
+<p>
+<bf>Prototype: </bf>int camera_exit (Camera *camera);
+</p>
+<p>
+<bf>Arguments: </bf>d
+</p>
+<sect2>
+camera_file_list
+<p>
+<bf>Purpose: </bf>List the files in a particular folder on the camera
+</p>
+<p>
+<bf>Prototype: </bf>int camera_file_list(Camera *camera, CameraList *list, char
+ *folder);
+</p>
+<p>
+<bf>Arguments: </bf>d
+</p>
+<sect2>
+camera_folder_list
+<p>
+<bf>Purpose: </bf>List the subfolders in a particular folder on the camera
+</p>
+<p>
+<bf>Prototype: </bf>int camera_folder_list(Camera *camera, CameraList *list, char
+ *folder);
+</p>
+<p>
+<bf>Arguments: </bf>d
+</p>
+<sect2>
+camera_file_get
+<p>
+<bf>Purpose: </bf>Retrieve a file from the camera
+</p>
+<p>
+<bf>Prototype: </bf>int camera_file_get (Camera *camera, CameraFile *file, char
+ *folder, char *filename);
+</p>
+<p>
+<bf>Arguments: </bf>d
+</p>
+<sect2>
+camera_file_get_preview
+<p>
+<bf>Purpose: </bf>Retrieve a file's preview from the camera
+</p>
+<p>
+<bf>Prototype: </bf>int camera_file_get_preview (Camera *camera, CameraFile *file,
+ char *folder, char *filename);
+</p>
+<p>
+<bf>Arguments: </bf>d
+</p>
+<sect2>
+camera_file_put
+<p>
+<bf>Purpose: </bf>Place (upload) a file to the camera
+</p>
+<p>
+<bf>Prototype: </bf>int camera_file_put (Camera *camera, CameraFile *file, char
+ *folder);
+</p>
+<p>
+<bf>Arguments: </bf>d
+</p>
+<sect2>
+camera_file_delete
+<p>
+<bf>Purpose: </bf>Delete a file from the camera
+</p>
+<p>
+<bf>Prototype: </bf>int camera_file_delete (Camera *camera, char *folder, char *filename);
+
+</p>
+<p>
+<bf>Arguments: </bf>d
+</p>
+<sect2>
+camera_config_get
+<p>
+<bf>Purpose: </bf>Retrieve the configuration window.
+</p>
+<p>
+<bf>Prototype: </bf>int camera_config_get (Camera *camera, CameraWidget *window);
+
+</p>
+<p>
+<bf>Arguments: </bf>d
+</p>
+<sect2>
+camera_config_set
+<p>
+<bf>Purpose: </bf>Set camera configuration
+</p>
+<p>
+<bf>Prototype: </bf>int camera_config_set (Camera *camera, CameraSetting *setting,
+ int count);
+</p>
+<p>
+<bf>Arguments: </bf>d
+</p>
+<sect2>
+camera_capture
+<p>
+<bf>Purpose: </bf>Retrieve live data from the camera
+</p>
+<p>
+<bf>Prototype: </bf>int camera_capture (Camera *camera, CameraFile *file, CameraCaptureInfo
+ *info);
+</p>
+<p>
+<bf>Arguments: </bf>d
+</p>
+<sect2>
+camera_summary
+<p>
+<bf>Purpose: </bf>Retrieve the camera summary information
+</p>
+<p>
+<bf>Prototype: </bf>int camera_summary (Camera *camera, CameraText *summary);
+</p>
+<p>
+<bf>Arguments: </bf>d
+</p>
+<sect2>
+camera_manual
+<p>
+<bf>Purpose: </bf>Retrieve the camera user's guide (manual)
+</p>
+<p>
+<bf>Prototype: </bf>int camera_manual (Camera *camera, CameraText *manual);
+</p>
+<p>
+<bf>Arguments: </bf>d
+</p>
+<sect2>
+camera_about
+<p>
+<bf>Purpose: </bf>Retrieve information about the camera library
+</p>
+<p>
+<bf>Prototype: </bf>int camera_about (Camera *camera, CameraText *about);
+</p>
+<p>
+<bf>Arguments: </bf>d
+</p>
+<sect1>
+The gPhoto2 I/O Library
+
+
+</article>
diff --git a/doc/camlib_devel.txt b/doc/camlib_devel.txt
new file mode 100644
index 000000000..e875d03e3
--- /dev/null
+++ b/doc/camlib_devel.txt
@@ -0,0 +1,507 @@
+
+
+gPhoto2 Camera Library Developer's Guide
+
+Scott Fritzinger
+2000-07-26
+Revision 1
+
+\tableofcontents{}
+
+1 Reverse Engineering the Camera Protocol
+
+The most difficult part for most developers is obtaining the transfer
+protocol. If the OEM's are lucky enough, they will simply provide
+us with the protocol specifications for their cameras and the drivers
+will be written at no cost to them. Most OEM's refuse to do so though,
+citing trade secrets or company policy; this is truly unfortunate
+in that they have effectively told their own customers who use operating
+systems other than Windows and the Mac that they don't want their
+future business and that they aren't valued customer to begin with.
+
+When OEM's do not cooperate, the developer is left to determine the
+protocol him/herself through reverse engineering.
+
+1.1 Sniffing the Protocol
+
+What follows are the most common setups for sniffing camera protocol
+traffic. In all setups, a host computer runs the native camera drivers.;
+typically, the Windows serial port drivers are used for reverse engineering.
+The drivers are run through a series of functions that include getting
+a picture index, downloading thumbnails, download full images, deleting
+images, camera configuration options, in addition to any other features
+a camera might have. During these operations, one or more of the following
+methods are used to capture the communication between the host computer
+and the camera.
+
+1.1.1 Serial Repeater
+
+A serial repeater consists of the host computer, a computer used as
+a repeater, and the camera. The setup is shown in figure .
+
+The repeater runs special software which reads data from one serial
+port, logs the communication, and then outputs the data to the other
+serial port. Data that is from the host computer to the camera and
+from the camera to the host computer is logged sequentially in a single
+log file. Information logged includes hexadecimal data values, direction
+of the communication, as well as time stamps for synchronization.
+An example sniffer to use for this configuration is ``sersniff''.
+
+1.1.2 ``Y'' Serial Cable
+
+To avoid using two computers, a Y serial cable can be used. The ``trunk''
+end of the serial cable attaches to the camera's serial transfer cable,
+while the two ``branches'' plug in to two serial ports on the host
+computer. Figure shows this setup.
+
+The camera drivers use one of the serial ports on the host computer,
+while the other port is opened with a hexadecimal monitor application
+that dumps all communications on the port to a file. The downside
+to this approach is the developer would have to determine which sets
+of data was generated by the camera or the host computer. Also, a
+Y cable would have to be either built or purchased from an electronics
+supply store.
+
+1.1.3 Virtual Device Driver Hooks
+
+The Windows platform allows virtual device drivers to ``hook'' into
+other drivers to provide additional functionality or feature enhancements.
+A combination GUI and device driver named PortMon by Systems Internals
+is a communications debugging utility that hooks into the existing
+Windows serial device driver (vcomm.vxd) and logs communications.
+Figure shows this equipment arrangement.
+
+This setup allows the developer to not use any extra hardware by simply
+relying on software. This is perhaps the easiest method for capturing
+camera data.
+
+1.2 Making Sense Out of the Protocol
+
+What follows are some pointers on decoding camera protocols. It uses
+a protocol that isn't really any camera protocol in particular, but
+should demonstrate some commonalities between most camera protocols.
+
+1. Cameras like to ping. This is the in the form of an "ACK"" command
+ that is different for different cameras. Basically, it is usually
+ a short packet (probably 1 byte) that is sent both ways in order
+ for the camera to know the computer is there or vice versa. It is
+ also sometimes used to wake up a camera that has gone into power-save
+ mode. It usually starts out the communications, as well as confirms
+ each packet in any sort of "mass" transfer. The opposite, a "NAK",
+ is sent to basically say the last packet was not received, or an
+ error has occured. Again, this is usually just a single byte as
+ well.
+
+ Example:
+ Computer: 01
+ Camera : 01
+
+ The Camera sent an ACK ("01") and the Computer responded with an
+ ACK as well.
+
+2. Transfers are usually in "reverse network order", meaning least significant
+ bytes come before most significant bytes. For example, ``00 08''
+ should actually be reassembled as ``08 00''.
+
+3. Most protocols use starting and stopping bytes.
+
+ Example:
+ Computer: 03 50 00 0f e0 04
+ Camera : 03 03 00 3f 03 04
+ Computer: 01
+
+ For this example, notice the packets begin with "03" and end with
+ "04" (don't pay attention to what is between them). Also notice
+ the Computer sent an "ACK" to confirm it got the packet.
+
+4. Packets usually have a "command" byte, which tells either the computer
+ or the camera what to do. Let's say you told the software to retrieve
+ the number of pictures, which at the time happened to be "8", and
+ you got the following:
+
+ Computer: 03 01 00 00 00 04
+ Camera : 03 01 00 00 08 04
+ Computer: 01
+
+ In this example, you notice the "03" and "04" specifying the start
+ and stop of the packet. Also, you notice the second byte in the
+ Computer packet is "01". The camera responds with the above packet,
+ and low and behold, you see the number 8 in the same packet. It
+ would appear, initially, that the second byte is used as a command
+ byte, and that "01" specifies the camera to return the number of
+ pictures. This may very well be right, but don't jump into it yet.
+ Make sure you look at a bunch of similar situations to confirm this.
+ (Again, notice the "ACK" sent by the computer).
+
+5. Most protocols have a "data size" byte(s) in data packets. Let's
+ say that you told the camera to retrieve thumbnail 8 and you get
+ the following:
+
+ Computer: 03 02 00 00 08 04
+ Camera : 03 02 00 0F (15 bytes) 04
+ Computer: 01
+
+ OK, here's a brief breakdown of this transaction:
+
+ -Looks like the command to retrieve a thumbnail is "02" (2nd byte
+ in the computer packet), and that the byte that is "08" specifies
+ which thumbnail to return.
+ -The camera responds with a "02" in the command field, specifying
+ it is returning a thumbnail, and then sends "0F", and 15 bytes of
+ data.
+ -It looks like the byte "0F" specifies how many bytes are after it
+ in the same packet. This is a data size byte.
+ (Note: this is a simplistic example. No thumbnail will only be 15
+ bytes :) this leads up to the next thing to consider)
+
+6. Most protocols have an "order" or "counter" byte. This is used so
+ that, in large data transfers where the picture may be split up
+ into several different packets, the computer knows how to reassemble
+ all the data. The entire thumbnail more than likely will not be
+ contained in a single packet for logistical reasons, so they break
+ up the data into many different packets and give each packet a unique
+ number (or ``order'' byte). Let's say you told your camera to return
+ thumbnail 8 (which is, as mentioned, pretty big), and you get the
+ following:
+
+ Computer: 02 03 00 00 08 03
+ Camera : 02 03 00 0F (15 bytes) 03
+ Computer: 01
+ Camera : 02 03 01 0F (15 bytes) 03
+ Computer: 01
+ Camera : 02 03 02 0F (15 bytes) 03
+ Computer: 01
+ ... 5 more packets and ACKs ...
+ Camera : 02 03 08 09 (9 bytes) 03
+ Computer: 01
+
+ You notice that the 3rd byte of each of the camera packets increments
+ with each packet sent from the camera. This looks like it is an
+ order (counter) byte. the computer can then reassemble the data
+ from all the packets in order to reproduce the image.
+
+7. Most protocols have some sort of error detection byte(s) at the end
+ of the packet. This is usually a simple checksum (summation of bytes),
+ or a CRC (a somewhat complex algorithm that reduces the probability
+ of mis-diagnosing a packet with errors by magnitudes). These bytes
+ can take into account only the data, or maybe the entire packet
+ excluding those error detection bytes. If this isn't a known scheme,
+ this winds up being the hardest part of reimplementing the protocol.
+ Lets take the above example again, this time we'll add a couple
+ bytes on the end for error detection:
+
+ Computer: 02 03 00 00 08 03
+ Camera : 02 03 00 0F (15 bytes) 0f 02 03
+ Computer: 01
+ Camera : 02 03 01 0F (15 bytes) 0e 00 03
+ Computer: 02
+ Camera : 02 03 01 0F (15 bytes) fa d0 03
+ Computer: 01
+ Camera : 02 03 02 0F (15 bytes) fa d0 03
+ Computer: 01
+ ... 5 more packets and ACKs
+ Camera : 02 03 08 09 (9 bytes) d7 38 03
+ Computer: 01
+
+ Notice how the error detection bytes are usually different for each
+ packet. These may be checksums, or CRC's, or something else. Only
+ way to find out really is to try each one, on different combinations
+ of packet parts (data, order byte, command byte, etc...) and see
+ if you get the same thing. Try this on the shorter packets to make
+ life easier.
+
+ Look at one more thing that sticks out in this transaction: for packet
+ with order byte ``01'', the Computer responded with a "02''. and
+ the Camera then resent the same packet it just did. This shows that
+ the NAK byte is "02", and this could happen because maybe the error
+ detection bytes didn't match with the data, or maybe something else
+ happened. either way, the camera resent the last packet, and now
+ you know how the camera can recover from transfer errors. If you
+ didn't get the packet you were expecting, send the camera a NAK
+ and it will resend the same packet again.
+
+2 Understanding the gPhoto2 Design
+
+The gPhoto2 design is the same three-tiered structure that has worked
+extremely well in the past with other software packages. Here is a
+listing of the 3 tiers:
+
+* the camera library
+
+* the I/O library
+
+* the front-end
+
+* the ``core''
+
+2.1 Role of the Camera Library
+
+The camera library is in charge of talking directly with the camera.
+The library uses the gPhoto2 Camera API in order to provide a common
+access-method for the library itself. Being dynamically linked, the
+libraries are loaded at run-time depending on the camera model the
+end-user would like to access.
+
+In order to provide flexilibity with variations in camera design, there
+are camera ``abilities'' which list, well, the abilities of each camera
+model. Some camera may support serial port connections only, while
+others may be able to use USB and a serial port. We've run into cameras
+that don't support thumbnailing on the camera so there is an ``abilities''
+field to specify whether or not the camera supports thumbnailing.
+The ``abilities'' also list other things such as supported serial
+transfer speeds, file deletion, and other functionality.
+
+The camera libraries only make functions calls to the I/O library and
+to the gPhoto2 core.
+
+There is more information on the specifics of the camera library in
+section 3 of this document.
+
+2.2 Role of the I/O Library
+
+The gPhoto2 I/O library is a platform-independent communications library
+that support serial, parallel, USB, firewire, and network connections.
+It is a work-in-progress with a constantly expanding list of supported
+platforms. This library uses the gPhoto2 I/O library API for accessing
+communications devices. It enumerates the devices available on a system,
+and provides read/write access.
+
+The camera libraries all use the I/O library for communications with
+the cameras. By doing having all communications go through a single
+library, the camera libraries become as portable as the I/O library.
+Porting gPhoto2 to other platforms become extremely easy.
+
+There is more information on the specifics of the I/O library in section
+3 of this document.
+
+2.3 Role of the Front-end
+
+The front-end is the application that the user interacts with. It is
+usually a command-line program, or a graphical point-and-click interface.
+The front-end talks only with the gPhoto2 core in order to retrieve
+pictures and perform other functions with the camera.
+
+2.4 Role of the gPhoto2 Core
+
+The gPhoto2 ``core'' is the heart of gPhoto2. It provides services
+to both the camera libraries and the front-ends. Most of the services
+deal with error-checking and enumeration of devices (cameras, I/O
+devices, etc...). The core performs validity checking on data passed
+to/from the front-end or the camera library.
+
+You could consider the core a translator/interpreter/spell-checker/army-general
+in the ``big picture'' of gPhoto2. It does the grunt-work and performs
+the coordination of the other parts.
+
+3 Implementing the Library
+
+gPhoto2 camera libraries use the gPhoto2 Camera API (CAPI) for implementation.
+Here is a listing of the CAPI functions:
+
+camera_id
+
+camera_abilities
+
+camera_init
+
+camera_exit
+
+camera_folder_list
+
+camera_file_list
+
+camera_file_get
+
+camera_file_get_preview
+
+camera_file_put
+
+camera_file_delete
+
+camera_config_get
+
+camera_config_set
+
+camera_capture
+
+camera_summary
+
+camera_manual
+
+camera_about
+
+
+Section 3.1 details the purpose of each of these functions, while Section
+3.2 discusses how to use the I/O library.
+
+3.1 Camera API
+
+The CAPI provides the full set of functions for doing various tasks
+with the camera. All CAPI functions return either GP_OK for succesful
+execution , or GP_ERROR for a failure of execution
+
+What follows is a listing of the functions, including prototypes and
+data exchange:
+
+3.1.1 camera_id
+
+Purpose: Retrieve the unique id for the camera library.
+
+Prototype: int camera_id (CameraText *id);
+
+Arguments:
+
+CameraText *id : unique string to represent the camera library
+
+
+In order to guarantee that only once instance of the camera library
+is loaded for each instance of the core, the camera library must copy
+a unique string into the ``id''. Please consult the gPhoto developers
+to determine which string you should use.
+
+
+Example:
+
+int camera_id(CameraText *id) {
+
+strcpy(id->text, ``my-unique-string'');
+
+return (GP_OK);
+
+}
+
+3.1.2 camera_abilities
+
+Purpose: Retrieve the list of supported cameras and the abilities for
+each camera
+
+Prototype: int camera_abilities (CameraAbilitiesList *list);
+
+Arguments: d
+
+CameraAbilities *abilities : the list of abilities for the supported
+cameras
+
+int *count : the number of
+
+3.1.3 camera_init
+
+Purpose: Initialize the camera
+
+Prototype: int camera_init (Camera *camera, CameraInit *init);
+
+Arguments: d
+
+3.1.4 camera_exit
+
+Purpose: Close the camera
+
+Prototype: int camera_exit (Camera *camera);
+
+Arguments: d
+
+3.1.5 camera_file_list
+
+Purpose: List the files in a particular folder on the camera
+
+Prototype: int camera_file_list(Camera *camera, CameraList *list, char
+*folder);
+
+Arguments: d
+
+3.1.6 camera_folder_list
+
+Purpose: List the subfolders in a particular folder on the camera
+
+Prototype: int camera_folder_list(Camera *camera, CameraList *list,
+char *folder);
+
+Arguments: d
+
+3.1.7 camera_file_get
+
+Purpose: Retrieve a file from the camera
+
+Prototype: int camera_file_get (Camera *camera, CameraFile *file, char
+*folder, char *filename);
+
+Arguments: d
+
+3.1.8 camera_file_get_preview
+
+Purpose: Retrieve a file's preview from the camera
+
+Prototype: int camera_file_get_preview (Camera *camera, CameraFile
+*file, char *folder, char *filename);
+
+Arguments: d
+
+3.1.9 camera_file_put
+
+Purpose: Place (upload) a file to the camera
+
+Prototype: int camera_file_put (Camera *camera, CameraFile *file, char
+*folder);
+
+Arguments: d
+
+3.1.10 camera_file_delete
+
+Purpose: Delete a file from the camera
+
+Prototype: int camera_file_delete (Camera *camera, char *folder, char
+*filename);
+
+Arguments: d
+
+3.1.11 camera_config_get
+
+Purpose: Retrieve the configuration window.
+
+Prototype: int camera_config_get (Camera *camera, CameraWidget *window);
+
+Arguments: d
+
+3.1.12 camera_config_set
+
+Purpose: Set camera configuration
+
+Prototype: int camera_config_set (Camera *camera, CameraSetting *setting,
+int count);
+
+Arguments: d
+
+3.1.13 camera_capture
+
+Purpose: Retrieve live data from the camera
+
+Prototype: int camera_capture (Camera *camera, CameraFile *file, CameraCaptureInfo
+*info);
+
+Arguments: d
+
+3.1.14 camera_summary
+
+Purpose: Retrieve the camera summary information
+
+Prototype: int camera_summary (Camera *camera, CameraText *summary);
+
+Arguments: d
+
+3.1.15 camera_manual
+
+Purpose: Retrieve the camera user's guide (manual)
+
+Prototype: int camera_manual (Camera *camera, CameraText *manual);
+
+Arguments: d
+
+3.1.16 camera_about
+
+Purpose: Retrieve information about the camera library
+
+Prototype: int camera_about (Camera *camera, CameraText *about);
+
+Arguments: d
+
+3.2 The gPhoto2 I/O Library
diff --git a/doc/frontend_devel.lyx b/doc/frontend_devel.lyx
new file mode 100644
index 000000000..dbbb6068d
--- /dev/null
+++ b/doc/frontend_devel.lyx
@@ -0,0 +1,64 @@
+#LyX 1.1 created this file. For more info see http://www.lyx.org/
+\lyxformat 2.15
+\textclass linuxdoc
+\language default
+\inputencoding latin1
+\fontscheme default
+\graphics default
+\paperfontsize default
+\spacing single
+\papersize Default
+\paperpackage a4
+\use_geometry 0
+\use_amsmath 0
+\paperorientation portrait
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\defskip medskip
+\quotes_language english
+\quotes_times 2
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+
+\layout Title
+\added_space_top vfill \added_space_bottom vfill
+gPhoto Front-end Developer's Guide
+\layout Author
+
+Scott Fritzinger
+\newline
+2000-07-26
+\newline
+Revision 1
+\layout Standard
+
+
+\begin_inset LatexCommand \tableofcontents{}
+
+\end_inset
+
+
+\layout Section
+
+Understanding the gPhoto2 Structure
+\layout Subsection
+
+Role of the gPhoto2 Core
+\layout Subsection
+
+Role of the Camera Library
+\layout Subsection
+
+Role of the Front-end
+\layout Section
+
+Implementing the Front-end
+\layout Subsection
+
+gPhoto2 Core API
+\layout Subsection
+
+Functions Required By the Front-end
+\the_end
diff --git a/doc/frontend_devel.sgml b/doc/frontend_devel.sgml
new file mode 100644
index 000000000..554f4cb1e
--- /dev/null
+++ b/doc/frontend_devel.sgml
@@ -0,0 +1,30 @@
+<!doctype linuxdoc system>
+
+<!-- LyX 1.1 created this file. For more info see http://www.lyx.org/ -->
+<article>
+<title>
+gPhoto Front-end Developer's Guide
+</title>
+<author>
+Scott Fritzinger
+2000-07-26
+Revision 1
+</author>
+<toc>
+<sect>
+Understanding the gPhoto2 Structure
+<sect1>
+Role of the gPhoto2 Core
+<sect1>
+Role of the Camera Library
+<sect1>
+Role of the Front-end
+<sect>
+Implementing the Front-end
+<sect1>
+gPhoto2 Core API
+<sect1>
+Functions Required By the Front-end
+
+
+</article>
diff --git a/doc/frontend_devel.txt b/doc/frontend_devel.txt
new file mode 100644
index 000000000..bf3369736
--- /dev/null
+++ b/doc/frontend_devel.txt
@@ -0,0 +1,23 @@
+
+
+gPhoto Front-end Developer's Guide
+
+Scott Fritzinger
+2000-07-26
+Revision 1
+
+\tableofcontents{}
+
+1 Understanding the gPhoto2 Structure
+
+1.1 Role of the gPhoto2 Core
+
+1.2 Role of the Camera Library
+
+1.3 Role of the Front-end
+
+2 Implementing the Front-end
+
+2.1 gPhoto2 Core API
+
+2.2 Functions Required By the Front-end