~ximion/listaller/master

« back to all changes in this revision

Viewing changes to lib/libinstaller.lpr

  • Committer: Matthias Klumpp
  • Date: 2009-12-30 22:33:48 UTC
  • Revision ID: git-v1:9eb5299c9fc4fc3bc980b625e4876139716bb101
Restructured source code

Moved all additional code to /src, created dirs for 3rd-party components,
all libraries go to /lib, daemons to /helper, source code documentation to
/docs, all bindings to /bindings.
Included configure script which needs a little wor now.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
{ Copyright (C) 2008-2009 Matthias Klumpp
 
2
 
 
3
  Authors:
 
4
   Matthias Klumpp
 
5
 
 
6
  This library is free software: you can redistribute it and/or modify it under
 
7
  the terms of the GNU General Public License as published by the Free Software
 
8
  Foundation, version 3.
 
9
 
 
10
  This library is distributed in the hope that it will be useful, but WITHOUT
 
11
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 
12
  FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 
13
 
 
14
  You should have received a copy of the GNU General Public License v3
 
15
  along with this library. If not, see <http://www.gnu.org/licenses/>.}
 
16
//** Listaller library for all IPK installation related processes
 
17
library libinstaller;
 
18
 
 
19
{$mode objfpc}{$H+}
 
20
 
 
21
uses
 
22
  cthreads, Classes, ipkHandle, SysUtils, Controls, liCommon, liTypes,
 
23
  management, liBasic;
 
24
 
 
25
 
 
26
//////////////////////////////////////////////////////////////////////////////////////
 
27
//Exported helper functions
 
28
 
 
29
function li_new_stringlist: Pointer;cdecl;
 
30
begin
 
31
 Result:=TStringList.Create;
 
32
end;
 
33
 
 
34
function li_free_stringlist(lst: PStringList): Boolean;cdecl;
 
35
begin
 
36
Result:=true;
 
37
try
 
38
 lst^.Free;
 
39
except
 
40
 Result:=false;
 
41
end;
 
42
end;
 
43
 
 
44
function li_stringlist_read_line(lst: PStringList;ln: Integer): PChar;cdecl;
 
45
begin
 
46
 if (ln < lst^.Count)and(ln > -1) then
 
47
 begin
 
48
  Result:=PChar(lst^[ln]);
 
49
 end else Result:='List index out of bounds.';
 
50
end;
 
51
 
 
52
function li_stringlist_write_line(lst: PStringList;ln: Integer;val: PChar): Boolean;cdecl;
 
53
begin
 
54
 if (ln < lst^.Count)and(ln > -1) then
 
55
 begin
 
56
  Result:=true;
 
57
  lst^[ln]:=val;
 
58
 end else Result:=false;
 
59
end;
 
60
 
 
61
/////////////////////////////////////////////////////////////////////////////////////
 
62
//Installer part
 
63
 
 
64
//** Removes an application that was installed with an IPK package
 
65
function li_remove_ipk_installed_app(appname, appid: PChar;msgcall: TMessageCall;poschange: TProgressCall;fastmode: Boolean): Boolean;cdecl;
 
66
begin
 
67
Result:=true;
 
68
try
 
69
 UninstallIPKApp(appname, appid,msgcall,poschange, fastmode, true)
 
70
except
 
71
 Result:=false;
 
72
end;
 
73
end;
 
74
 
 
75
//** Creates a new installation object
 
76
function li_setup_new: Pointer;cdecl;
 
77
begin
 
78
 Result:=TInstallation.Create;
 
79
end;
 
80
 
 
81
//** Removes an TInstallation object
 
82
procedure li_setup_free(setup: PInstallation);cdecl;
 
83
begin
 
84
 setup^.Free;
 
85
end;
 
86
 
 
87
//** Initializes the setup
 
88
function li_setup_init(setup: PInstallation;pkname: PChar): PChar;cdecl;
 
89
begin
 
90
 Result:='';
 
91
 if not setup^.UserRequestRegistered then
 
92
 begin
 
93
  p_warning('No user request callback is registered!');
 
94
 end;
 
95
 
 
96
 try
 
97
  setup^.Initialize(pkname);
 
98
 except
 
99
  Result:=PChar('Failed to initialize setup package '+ExtractFileName(pkname)+' !');
 
100
 end;
 
101
end;
 
102
 
 
103
//** Register progress changes (main)
 
104
function li_setup_register_main_progress_call(setup: PInstallation;call: TProgressCall;user_data: Pointer): Boolean;cdecl;
 
105
begin
 
106
 Result:=true;
 
107
 try
 
108
   setup^.RegOnProgressMainChange(call,user_data);
 
109
 except
 
110
  Result:=false;
 
111
 end;
 
112
end;
 
113
 
 
114
//** Register progress changes (extra)
 
115
function li_setup_register_extra_progress_call(setup: PInstallation;call: TProgressCall;user_data: Pointer): Boolean;cdecl;
 
116
begin
 
117
 Result:=true;
 
118
 try
 
119
  setup^.RegOnProgressExtraChange(call,user_data);
 
120
 except
 
121
  Result:=false;
 
122
 end;
 
123
end;
 
124
 
 
125
//** Message call
 
126
function li_setup_register_message_call(setup: PInstallation;call: TMessageCall;user_data: Pointer): Boolean;cdecl;
 
127
begin
 
128
 Result:=true;
 
129
 try
 
130
  setup^.RegOnMessage(call,user_data);
 
131
 except
 
132
  Result:=false;
 
133
 end;
 
134
end;
 
135
 
 
136
//** Step message call
 
137
function li_setup_register_step_message_call(setup: PInstallation;call: TMessageCall;user_data: Pointer): Boolean;cdecl;
 
138
begin
 
139
 Result:=true;
 
140
 try
 
141
  setup^.RegOnStepMessage(call,user_data);
 
142
 except
 
143
  Result:=false;
 
144
 end;
 
145
end;
 
146
 
 
147
//** User request message call
 
148
function li_setup_register_user_request_call(setup: PInstallation;call: TRequestCall;user_data: Pointer): Boolean;cdecl;
 
149
begin
 
150
 Result:=true;
 
151
 try
 
152
  setup^.RegOnUsrRequest(call,user_data);
 
153
 except
 
154
  Result:=false;
 
155
 end;
 
156
end;
 
157
 
 
158
//** Installation type
 
159
function li_setup_pkgtype(setup: PInstallation): TPkgType;cdecl;
 
160
begin
 
161
  Result:=setup^.pType;
 
162
end;
 
163
 
 
164
//** Set installation testmode
 
165
procedure li_testmode(st: Boolean);cdecl;
 
166
begin
 
167
  Testmode:=st;
 
168
end;
 
169
 
 
170
//** Set actions which should be forced
 
171
procedure li_setup_set_forced(setup: PInstallation;str: PChar);cdecl;
 
172
begin
 
173
  setup^.ForceActions:=str;
 
174
end;
 
175
 
 
176
//** Set TInstallation to superuser mode
 
177
procedure li_setup_set_su_mode(setup: PInstallation;b: Boolean);cdecl;
 
178
begin
 
179
 setup^.SuperuserMode:=b;
 
180
end;
 
181
 
 
182
//** Read disallows property
 
183
function li_setup_disallows(setup: PInstallation): PChar;cdecl;
 
184
begin
 
185
  Result:=PChar(setup^.Disallows);
 
186
end;
 
187
 
 
188
//** Read supported Linux distributions
 
189
function li_setup_supported_distributions(setup: PInstallation): PChar;cdecl;
 
190
begin
 
191
  Result:=PChar(setup^.Distris);
 
192
end;
 
193
 
 
194
//** Check if application is installed
 
195
function li_is_ipk_app_installed(appname: PChar;appid: PChar): Boolean;cdecl;
 
196
begin
 
197
  Result:=IsPackageInstalled(appname,appid);
 
198
end;
 
199
 
 
200
//** Readout application name
 
201
function li_setup_appname(setup: PInstallation): PChar;cdecl;
 
202
begin
 
203
  Result:=PChar(setup^.AppName);
 
204
end;
 
205
 
 
206
//** Read appversion
 
207
function li_setup_appversion(setup: PInstallation): PChar;cdecl;
 
208
begin
 
209
  Result:=PChar(setup^.AppVersion);
 
210
end;
 
211
 
 
212
//** Get package ID
 
213
function li_setup_pkgid(setup: PInstallation): PChar;cdecl;
 
214
begin
 
215
  Result:=PChar(setup^.ID);
 
216
end;
 
217
 
 
218
//** Get description
 
219
function li_setup_long_description(setup: PInstallation; list: PStringList): Boolean;cdecl;
 
220
begin
 
221
try
 
222
 Result:=true;
 
223
 setup^.ReadDescription(list^);
 
224
except
 
225
 Result:=false;
 
226
end;
 
227
end;
 
228
 
 
229
//** Get wizard image patch
 
230
function li_setup_wizard_image_path(setup: PInstallation): PChar;cdecl;
 
231
begin
 
232
  Result:=PChar(setup^.WizImage);
 
233
end;
 
234
 
 
235
//** Get license
 
236
function li_setup_license(setup: PInstallation; list: PStringList): Boolean;cdecl;
 
237
begin
 
238
try
 
239
 Result:=true;
 
240
 setup^.ReadLicense(list^);
 
241
except
 
242
 Result:=false;
 
243
end;
 
244
end;
 
245
 
 
246
//** Get profiles list
 
247
function li_setup_profiles_list(setup: PInstallation; list: PStringList): Boolean;cdecl;
 
248
begin
 
249
try
 
250
 Result:=true;
 
251
 setup^.ReadProfiles(list^);
 
252
except
 
253
 Result:=false;
 
254
end;
 
255
end;
 
256
 
 
257
//** Set current profile id
 
258
procedure li_setup_set_profileid(setup: PInstallation;id: ShortInt);cdecl;
 
259
begin
 
260
 setup^.SetCurProfile(id);
 
261
end;
 
262
 
 
263
//** Set if update source should be registered
 
264
procedure li_setup_enable_usource_registering(setup: PInstallation;b: Boolean);cdecl;
 
265
begin
 
266
 setup^.RegisterUpdateSource:=b;
 
267
end;
 
268
 
 
269
//** Read appversion
 
270
function li_setup_appicon(setup: PInstallation): PChar;cdecl;
 
271
begin
 
272
  Result:=PChar(setup^.AppIcon);
 
273
end;
 
274
 
 
275
//** Read desktopfiles
 
276
function li_setup_desktopfiles(setup: PInstallation): PChar;cdecl;
 
277
begin
 
278
  Result:=PChar(setup^.DesktopFiles);
 
279
end;
 
280
 
 
281
//** Read appcmd
 
282
function li_setup_app_exec_command(setup: PInstallation): PChar;cdecl;
 
283
begin
 
284
  Result:=PChar(setup^.CMDLn);
 
285
end;
 
286
 
 
287
//** Read path to file list
 
288
function li_setup_profile_current_filelist(setup: PInstallation): PChar;cdecl;
 
289
begin
 
290
  Result:=PChar(setup^.IFileInfo);
 
291
end;
 
292
 
 
293
//** Starts the installation
 
294
function li_setup_start(setup: PInstallation): Boolean;cdecl;
 
295
begin
 
296
  Result:=setup^.DoInstallation;
 
297
end;
 
298
 
 
299
//** Get dependencies
 
300
function li_setup_dependencies(setup: PInstallation; list: PStringList): Boolean;cdecl;
 
301
begin
 
302
try
 
303
 Result:=true;
 
304
 list^.Assign(setup^.ADeps);
 
305
except
 
306
 Result:=false;
 
307
end;
 
308
end;
 
309
 
 
310
////////////////////////////////////////////////////////////////////
 
311
//Manager part
 
312
 
 
313
//** Creates a new TAppManager object
 
314
function li_mgr_new: Pointer;cdecl;
 
315
begin
 
316
 Result:=TAppManager.Create;
 
317
end;
 
318
 
 
319
//** Removes an TAppManager object
 
320
procedure li_mgr_free(mgr: PAppManager);cdecl;
 
321
begin
 
322
 mgr^.Free;
 
323
end;
 
324
 
 
325
//** Start loading list of applications
 
326
function li_mgr_load_apps(mgr: PAppManager): Boolean;cdecl;
 
327
begin
 
328
Result:=false;
 
329
try
 
330
if not mgr^.UserRequestRegistered then begin p_error('No user request callback was registered');exit;end;
 
331
 Result:=true;
 
332
 mgr^.LoadEntries;
 
333
except
 
334
 Result:=false;
 
335
end;
 
336
end;
 
337
 
 
338
//** Register message call
 
339
function li_mgr_register_msg_call(mgr: PAppManager;call: TMessageCall;user_data: Pointer): Boolean;cdecl;
 
340
begin
 
341
 Result:=true;
 
342
 try
 
343
  mgr^.RegOnMessage(call,user_data);
 
344
 except
 
345
  Result:=false;
 
346
 end;
 
347
end;
 
348
 
 
349
//** Register application event to catch found apps
 
350
function li_mgr_register_app_call(mgr: PAppManager;call: TAppEvent): Boolean;cdecl;
 
351
begin
 
352
 Result:=true;
 
353
 try
 
354
  mgr^.OnApplication:=call;
 
355
 except
 
356
  Result:=false;
 
357
 end;
 
358
end;
 
359
 
 
360
//** Register event to recieve current progress
 
361
function li_mgr_register_progress_call(mgr: PAppManager;call: TProgressCall;user_data: Pointer): Boolean;cdecl;
 
362
begin
 
363
 Result:=true;
 
364
 try
 
365
  mgr^.RegOnProgress(call,user_data);
 
366
 except
 
367
  Result:=false;
 
368
 end;
 
369
end;
 
370
 
 
371
//** Register event to recieve user requests
 
372
function li_mgr_register_request_call(mgr: PAppManager;call: TRequestCall;user_data: Pointer): Boolean;cdecl;
 
373
begin
 
374
 Result:=true;
 
375
 try
 
376
  mgr^.RegOnRequest(call,user_data);
 
377
 except
 
378
  Result:=false;
 
379
 end;
 
380
end;
 
381
 
 
382
//** Sets if aplications should work in root mode
 
383
procedure li_mgr_set_su_mode(mgr: PAppManager;md: Boolean);cdecl;
 
384
begin
 
385
 mgr^.SuperuserMode:=md;
 
386
end;
 
387
 
 
388
//** Removes the application
 
389
function li_mgr_remove_app(mgr: PAppManager;obj: TAppInfo): Boolean;cdecl;
 
390
begin
 
391
 Result:=false;
 
392
if not mgr^.UserRequestRegistered then begin p_error('You need to register a user request callback!');exit;end;
 
393
 Result:=true;
 
394
 try
 
395
  mgr^.UninstallApp(obj);
 
396
 except
 
397
  Result:=false;
 
398
 end;
 
399
end;
 
400
 
 
401
//** Check application dependencies
 
402
function li_mgr_check_apps(mgr: PAppManager;log: PStringList;root: Boolean): Boolean;cdecl;
 
403
procedure PerformCheck;
 
404
begin
 
405
 if not mgr^.CheckApps(log^,false,root) then
 
406
 begin
 
407
  Result:=false;
 
408
 end else Result:=true;
 
409
end;
 
410
begin
 
411
if log<> nil then
 
412
  PerformCheck
 
413
else p_error('Check log != nil failed.');
 
414
end;
 
415
 
 
416
//** Fix application dependencies
 
417
function li_mgr_fix_apps(mgr: PAppManager;log: PStringList;root: Boolean): Boolean;cdecl;
 
418
procedure PerformCheck;
 
419
begin
 
420
 if not mgr^.CheckApps(log^,true,root) then
 
421
 begin
 
422
  Result:=false;
 
423
 end else Result:=true;
 
424
end;
 
425
begin
 
426
if log<> nil then
 
427
  PerformCheck
 
428
else p_error('Check log != nil failed.');
 
429
end;
 
430
 
 
431
///////////////////////
 
432
exports
 
433
 //Stringlist functions
 
434
 li_new_stringlist,
 
435
 li_free_stringlist,
 
436
 li_stringlist_read_line,
 
437
 li_stringlist_write_line,
 
438
 
 
439
 //TInstallation related functions
 
440
 li_setup_new,
 
441
 li_setup_free,
 
442
 li_setup_init,
 
443
 li_setup_set_su_mode,
 
444
 li_setup_register_main_progress_call,
 
445
 li_setup_register_extra_progress_call,
 
446
 li_setup_pkgtype,
 
447
 li_setup_disallows,
 
448
 li_setup_supported_distributions,
 
449
 li_setup_appname,
 
450
 li_setup_appversion,
 
451
 li_setup_pkgid,
 
452
 li_setup_long_description,
 
453
 li_setup_enable_usource_registering,
 
454
 li_setup_wizard_image_path,
 
455
 li_setup_license,
 
456
 li_setup_profiles_list,
 
457
 li_setup_appicon,
 
458
 li_setup_desktopfiles,
 
459
 li_setup_app_exec_command,
 
460
 li_setup_profile_current_filelist,
 
461
 li_setup_register_message_call,
 
462
 li_setup_register_step_message_call,
 
463
 li_setup_register_user_request_call,
 
464
 li_setup_start,
 
465
 li_setup_dependencies,
 
466
 li_setup_set_forced,
 
467
 li_setup_set_profileid,
 
468
 
 
469
 //Management functions
 
470
 li_mgr_new,
 
471
 li_mgr_free,
 
472
 li_mgr_load_apps,
 
473
 li_mgr_register_msg_call,
 
474
 li_mgr_register_app_call,
 
475
 li_mgr_register_progress_call,
 
476
 li_mgr_register_request_call,
 
477
 li_mgr_set_su_mode,
 
478
 li_mgr_remove_app,
 
479
 li_mgr_check_apps,
 
480
 li_mgr_fix_apps,
 
481
 
 
482
 //Other functions
 
483
 li_remove_ipk_installed_app,
 
484
 li_testmode,
 
485
 li_is_ipk_app_installed;
 
486
 
 
487
{$IFDEF WINDOWS}{$R libinstaller.rc}{$ENDIF}
 
488
 
 
489
begin
 
490
end.
 
491