~gareththered/ubuntu/precise/libgphoto2/fix-for-981062

1 by Martin Pitt
Import upstream version 2.1.5
1
If you want to hack on gphoto2 (or a camera driver for gphoto2),
2
please follow some rules to make our work easier: 
3
4
5
licensing
6
---------
7
8
We urge you to license your contributions under the LGPL so we can
9
distribute gphoto2 under the LGPL as well.
10
11
12
patches
13
-------
14
1.1.5 by Luka Renko
Import upstream version 2.4.0
15
... are always welcome.
1.2.1 by Cyril Brulebois
Import upstream version 2.4.1
16
1.1.3 by Martin Pitt
Import upstream version 2.3.0
17
We prefer patches against the current SVN trunk very much over
1 by Martin Pitt
Import upstream version 2.1.5
18
patches against old released versions, but these are also welcome :-)
19
20
source files
21
------------
22
23
Every source file (file_name.c) should have the following layout:
24
25
/* Licence, author, etc. */
26
#include "config.h"
27
#include "file_name.h"
28
29
#include <std*.h> (i.e. stdlib, stdio, string, etc.)
30
1.1.3 by Martin Pitt
Import upstream version 2.3.0
31
#include <gphoto2/gphoto2-*.h> (what you need)
1 by Martin Pitt
Import upstream version 2.1.5
32
33
/* Source code here. */
34
35
header files
36
------------
37
38
Please use the following layout:
39
40
/* Licence, author, etc. */
41
#ifndef __FILE_NAME_H__
42
#define __FILE_NAME_H__
43
44
#include <whatever is needed for the _header_>
45
46
/* Declarations */
47
48
#endif /* __FILE_NAME_H__ */
49
50
camlib
51
------
52
53
Camera libraries are often very sensitive to changes. Therefore,
54
before you commit any changes, double check with the author that your
55
changes won't break the driver. 
56
57
If you want to write a driver for gphoto2, the easiest way to do so
58
would be to copy over the contents of camlibs/template and fill in
59
your code. 
60
61
Use something like CHECK_RESULT (see for example
62
libgphoto2/filesys.c).
63
64
Let's say you write a driver called sillycam. Please set up a file
65
called library.c containing all gphoto2-specific code (like
66
camera_init) and another two files called sillycam.c and sillycam.h
67
containing the "magic", that is all gp_port_[read,write] functions and
68
the basic logic of the communication. This makes it easier for us to
69
adapt your code if anything should change in the gphoto2-API.
70
71
Use the port provided by camera->port.
72
73
Use the filesystem provided by camera->fs and set up the callbacks so
74
that libgphoto2 can cache listings and file-information. 
75
76
Please keep track of the changes to the sillycam camlib in the file 
77
78
   camlib/sillycam/ChangeLog
79
1.1.5 by Luka Renko
Import upstream version 2.4.0
80
For test compiling and installing only the sillycam and doofuscam
81
camlibs, you can use
82
83
   make -C camlibs sillycam.la doofuscam.la
84
85
and
86
87
   make DRIVERS="sillycam.la doofuscam.la" install-drivers
88
89
respectively.
90
91
Compiling all camlibs is sped up considerably on N CPU core
92
computers using "make -jN".
93
94
95
1 by Martin Pitt
Import upstream version 2.1.5
96
97
libgphoto2
98
----------
99
100
If you add code, use the coding style of that file. This is, code like
101
102
int
103
my_func (int arg)
104
{
105
	int var, res;
106
107
	/*
108
	 * This is a multiline
109
	 * comment. Use TAB for 
110
	 * indentation!
111
	 */
112
	res = gp_some_action (var);
113
114
	/* This is a simple one-line comment */
115
	if (res < 0) {
116
		gp_log (GP_LOG_DEBUG, "Error happened!");
117
118
		/* Note that we _don't_ indent the case statements */
119
		switch (res) {
120
		case GP_ERROR:
121
			gp_log (GP_LOG_DEBUG, "Generic error");
122
			break;
123
		default:
124
			gp_log (GP_LOG_DEBUG, "Not a generic error");
125
		}
126
		return (res);
127
	}
128
129
	return (GP_OK);
130
}
131
132
Please always check the return value of gp_-functions! We defined some
133
handy macros all over the place (like CHECK_RESULT) - by using those,
134
you'll avoid lots of if {} else {}. 
135
136
Emacs users may define and use a gphoto-c-mode by putting the
137
following stuff into their .emacs file:
138
139
-----8<------------------------------------------------
140
141
;;* gphoto-c-mode
142
;;*=====================================================================
143
(defun gphoto-c-mode ()
144
  "C mode with adjusted defaults for gphoto hacking"
145
  (interactive)
146
  (c-mode)
147
  (c-set-style "linux")
148
  (setq indent-tabs-mode t)
149
  (font-lock-mode))
150
151
;; 
152
(setq auto-mode-alist (cons '("/home/user/src/gphoto.*\\.[ch]$" . gphoto-c-mode)
153
			    auto-mode-alist))
154
155
-----8<------------------------------------------------
156
157
compatibility
158
-------------
159
160
One gphoto2 has been officially launched as a 2.0 version, it is important
161
that the API does not change frequently.  It is annoying to users when they
162
have to upgrade all sort of libraries and applications just to get an
163
upgraded camera driver.  Once the 2.0 release has been made, try to
164
follow these guidelines:
165
166
    - New versions of the gphoto2 core libraries in the 2.0 series shall
167
    work with all older 2.0 camera libraries
168
169
    - New versions of the gphoto2 camera libraries in the 2.0 series shall
170
    work with all older 2.0 core libraries (this one may be relaxed)
171
172
    - Before fixing 2.0 in stone, look for weaknesses in the current
173
    APIs that may preclude enhancements in the future.  For instance, there
174
    should be some filler entries added to the end of struct _CameraFunctions
175
    so that a newer camera library that tries to fill in an entry that
176
    is added in gphoto2 ver. 2.1 that doesn't exist there now won't
177
    overwrite something important.
178
179
    - Try to work using the existing API instead of making minor
180
    changes here and there; think about whether the change you're proposing
181
    will demonstratively benefit gphoto2 or it's just a "nice to have"
182
183
    - Instead of adding a new parameter to a function, create a new function
184
    that enhances the other one (where appropriate)
185
186
    - If a new parameter is absolutely needed in an existing function
187
    call, rename the function with the new parameter, but leave the
188
    existing function as is, calling the new function with a default value
189
    for the new parameter
190
191
    - When adding entries to a common structure, add them to the end of the
192
    struct so that the other members aren't shifted around.  Consider what
193
    will happen if that member is not filled in by an older application.
194
195
    - Don't delete entries from a common struct; instead, just rename them
196
    into filler entries.
197
198
    - If there is a very good reason to break compatibility, wait until
199
    release 3.0 to make those changes
200
201
    - Delay the release of 3.0 until the benefits outweigh the consequences
202
    to the user of an incompatible library version.
203
204
205
portability
206
-----------
207
208
Please remember that people will be running gphoto2 on a wide variety
209
of operating systems and CPUs and will be compiling it on a wide
210
variety of C compilers.  As you write your code, be sure not to make
211
any assumptions in your code that aren't in the ANSI C89 standard.
212
If your code absolutely needs some feature or header file that isn't
213
available everywhere, write an autoconf test so that the configure
214
script will detect if that feature is available at compile time and
215
provide an alternative for those compilers that don't support it.
216
217
There are lots of subtle portability issues that you should keep in
218
the back of your mind.  Following are some of the major ones that affect
219
gphoto2.  See the paper "Notes on Writing Portable Programs in C" at
220
<URL:http://www.literateprogramming.com/portableC.pdf> or "Writing
221
Portable C with GNU Autotools" at
222
<URL:http://sources.redhat.com/autobook/autobook/autobook_110.html#SEC110>
223
for more details.
224
225
226
* A char can be signed or unsigned.
227
228
Use 'signed char' or 'unsigned char', or int8_t or uint8_t from _stdint.h,
229
to be sure to get the type you want when it is important.
230
231
232
* A pointer is not necessarily an int.
233
234
Don't cast a pointer to an int and vice-versa.
235
236
237
* An int can be almost any width.
238
239
Don't assume that it's 32 or 16 bits or any other value.  Instead,
240
if you need a variable of a certain size, include the gphoto2 header
241
file _stdint.h (or gphoto2-endian.h) and use the C99-style fixed-width
242
types declared therein.  If you don't really care about the size of a
243
variable (e.g. as the index variable in a small for loop), you can still
244
use an int as it's often the most efficient type for each processor.
245
It's usually the case that a char is 8 bits, int is at least 16 bits,
246
and a long is at least 32 bits.  Never assume that int or long (or char,
247
for that matter) have a specific size, or that they will overflow at a
248
particular point.  Use a size-specific type (e.g. uint32_t) if necessary.
249
250
251
* The sequence of bytes received from a camera isn't necessarily the
252
same as how those bytes are stored in a C struct in memory.
253
254
Many compilers will place padding bytes between the elements of a C
255
struct to improve run-time efficiency on the target processor.  This
256
means that if you read a camera packet directly into such a struct,
257
the bytes will not line up and your program will use the wrong values.
258
259
A similar problem occurs even if you read just a couple of bytes
260
into an int, if gphoto is running on a processor with a different
261
"endianness" than the camera.
262
263
The most portable solution is to use the macros available in the
264
gphoto2-endian.h header file.  When you read a packet from a camera
265
(writing is similar), use a uint8_t array or heap space to store the
266
raw packet.  Extract each member of the packet out of the array one at a
267
time using a macro like be32atoh from gphoto2-endian.h.  Those macros
268
take care of both those problems at once.
269
270
The macros have the form AANN[a]toh or htoAANN[a], where AA is `le'
271
(little-endian) or `be' (big-endian), NN is 16 or 32 (bits in the
272
word) and `a', if present, means that the preceding type is located in
273
a byte array, not an integer. `h' refers to `host', and could be big
274
or little-endian depending on the current CPU.  Upper-case versions of
275
these macros (where appropriate) do the conversion in place.  Do a
276
'man ntohl' to find out more about why these are needed, and the generated
277
gphoto2-endian.h file for more descriptions.
278
279
280
* Your code won't necessarily be compiled with gcc.
281
282
gcc is a great C compiler, but it isn't installed on everybody's
283
systems (yet!).  Avoid use of proprietary gcc language extensions and
284
features that aren't available in ANSI C89 compilers.  Sure, there's
285
probably some code that would be more elegant using a gcc language
286
extension, but somebody, somewhere will be denied the use of the best
287
digital camera application in existence because of it.
288
289
This also applies to new standard C features that appeared in the
290
C99 specification of the language.  There is not much support yet
291
in the installed base of C compilers to allow unrestricted use, but
292
this will change as time goes by.  In the meantime, use autoconf to
293
detect if the feature is available at run-time and act appropriately
294
(for an extreme example, see how configure handles the C99 header
295
file <stdint.h> or inline keyword).
296
297
Although one-line comments starting with // have been available
298
in most compilers for several years, they were only officially
299
added to the ANSI C99 spec and some compilers out there still
300
don't support them.  The "inline" keyword also falls into the same
301
category, but configure tests for this feature at compile time
302
and supplies the appropriate inline keyword as a macro.  Finally,
303
don't add compiler-specific flags to make files directly, as many
304
of them are specific to one compiler and will cause the build to
305
fail when using another.
306
307
308
Local Variables:
309
mode:text
310
End: