Implemented 3rd party package policy to no break SSU.
[hildon-application-manager:mainline.git] / src / apt-worker-proto.h
1 /*
2  * This file is part of the hildon-application-manager.
3  *
4  * Copyright (C) 2005, 2006, 2007, 2008 Nokia Corporation.  All Rights reserved.
5  *
6  * Contact: Marius Vollmer <marius.vollmer@nokia.com>
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License version
10  * 2 as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20  * 02110-1301 USA
21  *
22  */
23
24 #ifndef APT_WORKER_PROTO_H
25 #define APT_WORKER_PROTO_H
26
27 #include <stdlib.h>
28
29 extern "C" {
30 #include "xexp.h"
31 }
32
33 /* No, this is not D-Bus. */
34
35 enum apt_command {
36   APTCMD_NOOP,
37
38   APTCMD_STATUS,
39
40   APTCMD_GET_PACKAGE_LIST,
41   APTCMD_GET_PACKAGE_INFO,
42   APTCMD_GET_PACKAGE_DETAILS,
43
44   APTCMD_CHECK_UPDATES,        // needs network
45   APTCMD_GET_CATALOGUES,
46   APTCMD_SET_CATALOGUES,
47   APTCMD_ADD_TEMP_CATALOGUES,
48   APTCMD_RM_TEMP_CATALOGUES,
49
50   APTCMD_INSTALL_CHECK,
51   APTCMD_DOWNLOAD_PACKAGE,      // needs network
52   APTCMD_INSTALL_PACKAGE,      // needs network
53
54   APTCMD_REMOVE_CHECK,
55   APTCMD_REMOVE_PACKAGE,
56
57   APTCMD_GET_FILE_DETAILS,
58   APTCMD_INSTALL_FILE,
59
60   APTCMD_CLEAN,
61
62   APTCMD_SAVE_BACKUP_DATA,
63
64   APTCMD_GET_SYSTEM_UPDATE_PACKAGES,
65   APTCMD_REBOOT,
66   APTCMD_SET_OPTIONS,
67   APTCMD_SET_ENV,
68
69   APTCMD_MAX
70 };
71
72 struct apt_request_header {
73   int cmd;
74   int seq;
75   int len;
76 };
77
78 struct apt_response_header {
79   int cmd;
80   int seq;
81   int len;
82 };
83
84 enum apt_proto_result_code {
85   rescode_success,              // (success)
86   rescode_partial_success,
87   rescode_cancelled,
88   rescode_failure,              // Operation failed
89   rescode_download_failed,      // Download failed
90   rescode_package_corrupted,    // Package corrupted
91   rescode_packages_not_found,   // Unable to download.  The
92                                 // package was not found.
93   rescode_out_of_space          // Not enough memory in target location
94 };
95
96 // Encoding and decoding of data types
97 //
98 // All strings are in UTF-8.
99
100 struct apt_proto_encoder {
101
102   apt_proto_encoder ();
103   ~apt_proto_encoder ();
104   
105   void reset ();
106
107   void encode_mem (const void *, int);
108   void encode_int (int);
109   void encode_int64 (int64_t);
110   void encode_string (const char *);
111   void encode_stringn (const char *, int len);
112   void encode_xexp (xexp *x);
113
114   char *get_buf ();
115   int get_len ();
116
117 private:
118   char *buf;
119   int buf_len;
120   int len;
121
122   void grow (int delta);
123   void encode_mem_plus_zeros (const void *, int, int);
124 };
125
126 struct apt_proto_decoder {
127
128   apt_proto_decoder ();
129   apt_proto_decoder (const char *data, int len);
130   ~apt_proto_decoder ();
131   
132   void reset (const char *data, int len);
133
134   void decode_mem (void *, int);
135   int decode_int ();
136   int64_t decode_int64 ();
137   const char *decode_string_in_place ();
138   char *decode_string_dup ();
139   xexp *decode_xexp ();
140
141   bool at_end ();
142   bool corrupted ();
143
144 private:
145   const char *buf, *ptr;
146   int len;
147   bool corrupted_flag, at_end_flag;
148 };
149
150 // NOOP - do nothing, no parameters, no results
151
152 // STATUS - status report
153 //
154 // This command is special: you never send a request for it but
155 // instead you will receive STATUS responses whenever apt-worker has
156 // some progress to announce.
157 //
158 // The response always has seq == -1.  It contains:
159 //
160 // - operation (int).  See enum below.
161 // - already (int).    Amount of work already done.
162 // - total (int).      Total amount of work to do.
163
164 enum apt_proto_operation {
165   op_downloading,
166   op_general
167 };
168
169 // GET_PACKAGE_LIST - get a list of packages with their names,
170 //                    versions, and assorted information
171 //
172 // Parameters:
173 //
174 // - only_user (int).      Whether to return only packages from sections
175 //                         starting with "user/".
176 // - only_installed (int). Include only packages that are installed.
177 // - only_available (int). Include only packages that are available.
178 // - pattern (string).     Include only packages that match pattern.
179 // - show_magic_sys (int). Include the artificial "magic:sys" package.
180 //
181 // The response starts with an int that tells whether the request
182 // succeeded.  When that int is 0, no data follows.  When it is 1 then
183 // the response contains for each interesting package:
184 //
185 // - name (string) 
186 // - broken (int)
187 // - installed_version or null (string) 
188 // - installed_size (int64)
189 // - installed_section or null (string)
190 // - installed_pretty_name or null (string)
191 // - installed_short_description or null (string)
192 // - installed_icon or null (string).
193 // - available_version or null (string) 
194 // - available_section (string)
195 // - available_pretty_name or null (string)
196 // - available_short_description or null (string)
197 // - available_icon or null (string)
198 // - flags (int)
199 //
200 // When the available_short_description would be identical to the
201 // installed_short_description, it is set to null.  Likewise for the
202 // icon.
203
204 // UPDATE_PACKAGE_CACHE - recreate package cache
205 //
206 // Parameters:
207 //
208 // - http_proxy (string).    The value of the http_proxy envvar to use.
209 // - https_proxy (string).   The value of the https_proxy envvar to use.
210 //
211 // Response contains:
212 //
213 // - catalogue_report (xexp).  The current catalogue configuration with 
214 //                             error messages attached.
215 // - result_code (int).      
216 //
217 // Error messages appear in the catalogue_report as well as on
218 // stdout/stderr of the apt-worker process.
219
220
221 // GET_SOURCES_LIST - read the main sources.list files, unparsed.
222 //
223 // No parameters.
224 //
225 // Response contains:
226 //
227 // - source_lines (string)*,(null).
228 // - success (int).
229
230 // SET_SOURCES_LIST - write the main sources.list files, unparsed.
231 //
232 // Parameters:
233 //
234 // - source_lines (string)*,(null).
235 //
236 // Response:
237 //
238 // - success (int).
239
240 // GET_CATALOGUES - read the system wide catalogue configuration
241 //
242 // No parameters.
243 //
244 // Response contains:
245 //
246 // - catalogues (xexp).
247 //
248 // The xexp is NULL on errors.
249
250 // SET_CATALOGUES - write the system wide catalogue configuration
251 //
252 // Parameters.
253 //
254 // - catalogues (xexp).
255 //
256 // Response contains:
257 //
258 // - success (int).
259
260 // GET_PACKAGE_INFO - get some more information about a specific
261 //                    package.  This information is used to augment
262 //                    the displayed list of packages but it is
263 //                    sufficiently expensive to calculate so that we
264 //                    dont want to include it in the GET_PACKAGE_LIST
265 //                    response.
266 //
267 // Parameters:
268 //
269 // - name (string).                Name of the package.
270 // - only_installable_info (int).
271 //
272 // Response:
273 //
274 // - info (apt_proto_package_info).
275
276 enum apt_proto_able_status {
277   status_unknown,
278   status_able,
279   status_unable,                   // unknown reason
280   status_conflicting,
281   status_missing,
282   status_needed,
283   status_corrupted,
284   status_incompatible,             // incompatible in general
285   status_incompatible_current,     // incompatible with current OS
286   status_system_update_unremovable,// could be removed but it's a bad idea
287   status_not_found,                // there is no such package
288   status_incompatible_thirdparty   // package that breaks the SSU policy
289 };
290
291 enum apt_proto_install_flags {
292   pkgflag_close_apps       =  1,
293   pkgflag_suggest_backup   =  2,
294   pkgflag_reboot           =  4,
295   pkgflag_system_update    =  8,
296   pkgflag_flash_and_reboot = 16
297 };
298
299 struct apt_proto_package_info {
300   int installable_status;
301   int64_t download_size;
302   int64_t install_user_size_delta;
303   int64_t required_free_space;
304   int install_flags;
305
306   int removable_status;
307   int64_t remove_user_size_delta;
308 };
309
310 // GET_PACKAGE_DETAILS - get a lot of details about a specific
311 //                       package.  This is intended for the "Details"
312 //                       dialog, of course.
313 //
314 // Parameters:
315 //
316 // - name (string).
317 // - version (string).
318 // - summary_kind (int).  0 == none, 1 == install, 2 == remove
319 //
320 // Response:
321 //
322 // - maintainer (string).
323 // - description (string).
324 // - repository (string).
325 // - dependencies (deptype,string)*,(deptype_end).
326 // - summary (sumtype,string)*,(sumtype_end).
327
328 enum apt_proto_deptype { 
329   deptype_end,
330   deptype_depends,
331   deptype_conflicts
332 };
333
334 enum apt_proto_sumtype {
335   sumtype_end,
336   sumtype_installing,
337   sumtype_upgrading,
338   sumtype_removing,
339   sumtype_needed_by,
340   sumtype_missing,
341   sumtype_conflicting,
342   sumtype_max
343 };
344
345 // INSTALL_CHECK - Check for non-authenticated and non-certified
346 //                 packages and gather information about the
347 //                 installation.
348 //
349 // This will setup the download operation and figure out the kind of
350 // trust we have in the packages that will be installed.  It will also
351 // report information about which packages will be upgraded to which
352 // version.
353 //
354 // Parameters:
355 //
356 // - name (string).  The package to be installed.
357 //
358 // Response:
359 //
360 // - summary (pkgtrust,string)*,(pktrust_end)
361 // - upgrades (string,string)*,(null)   First string is package name,
362 //                                      second is version.
363 // - success (int).
364
365 enum apt_proto_pkgtrust {
366   pkgtrust_end,
367   pkgtrust_not_certified,
368   pkgtrust_domains_violated
369 };
370
371 // INSTALL_PACKAGE - Do the actual installation of a package
372 //
373 // Parameters:
374 //
375 // - name (string).              The package to be installed.
376 // - alt_download_root (string). Alternative download root filesystem.
377 // - http_proxy (string).        The value of the http_proxy envvar to use.
378 // - https_proxy (string).       The value of the https_proxy envvar to use.
379 // - check_free_space (int).     Whether or not to check the
380 //                               "Required-Free-Space" field of the packages
381 // Response:
382 //
383 // - result_code (int).
384
385
386 // REMOVE_CHECK - Return the names of packages that would be removed
387 //                if the given package would be removed with
388 //                REMOVE_PACKAGE.  Also, the union of all the flags of
389 //                the to-be-removed packages is returned.
390 //
391 // Parameters:
392 //
393 // - name (string).
394 //
395 // Response:
396 //
397 // - names (string)*,(null).
398
399
400 // REMOVE_PACKAGE - remove one package
401 //
402 // Parameters:
403 //
404 // - name (string).
405 //
406 // Response:
407 //
408 // - success (int).
409
410
411 // CLEAN - empty the cache of downloaded archives
412 //
413 // No parameters.
414 //
415 // Response:
416 //
417 // - success (int).
418
419
420 // GET_FILE_DETAILS - Get details about a package in a .deb file.
421 //                    This is more or less the union of the
422 //                    information provided by GET_PACKAGE_LIST,
423 //                    GET_PACKAGE_INFO and GET_PACKAGE_DETAILS for a
424 //                    package.
425 //
426 // Parameters:
427 //
428 // - only_user (int).    - if true, declare all non-user packages incompatible
429 // - filename (string).
430 //
431 // Response:
432 //
433 // - name (string).
434 // - pretty_name (string).
435 // - installed_version (string).
436 // - installed_size (int64_t).
437 // - available_version (string).
438 // - maintainer (string).
439 // - available_section (string).
440 // - installable_status (int).
441 // - install_user_size_delta (int64_t).
442 // - description (string).
443 // - available_icon (string).
444 // - summary (symtype,string)*,(sumtype_end).
445
446
447 // INSTALL_FILE - install a package from a .deb file
448 //
449 // Parameters:
450 //
451 // - filename (string).
452 //
453 // Response:
454 //
455 // - success (int).
456 //
457 // This command is not smart about what is going on.  It just call
458 // "dpkg --install" and reports whether it worked or not.  If "dpkg
459 // --install" fails, "dpkg --purge" is called automatically as an
460 // attempt to clean up.
461
462 // REBOOT - Run /sbin/reboot.
463 //
464 // Parameter: none.
465 // Response: empty.
466
467 // SET_OPTIONS - set the backend options.
468 //
469 // Parameters:
470 //
471 // - options (string).  Same as when invoking apt-worker.
472 //
473 // Response: empty.
474
475 #endif /* !APT_WORKER_PROTO_H */