Statistics
| Branch: | Revision:

root / trunk / Pithos.Installer / it_download.iss @ 99882980

History | View | Annotate | Download (10.3 kB)

1
[Files]
2
Source: {#emit ReadReg(HKEY_LOCAL_MACHINE,'Software\Sherlock Software\InnoTools\Downloader','InstallPath','')}\itdownload.dll; Flags: dontcopy; DestDir: {tmp}
3

    
4
[Code]
5
(*
6
 Inno Tools Downloader DLL
7
 Copyright (C) Sherlock Software 2008
8
 Version 0.3.5
9

    
10
 Contact:
11
  The author, Nicholas Sherlock, at nick@sherlocksoftware.org.
12
  Comments, questions and suggestions welcome.
13

    
14
 Website:
15
  http://www.sherlocksoftware.org/
16

    
17
 History:
18
  0.3.5 - Moved strings used in the updater example to the language file, so that they
19
          may be more easily translated.
20
          Added event functions to support the example of integration with InnoTools tray.
21
          Fixes bugs that could cause the download to hang until
22
          some mouse movements were received.
23
          Allows "detailed mode" to be turned on with ITD_SetOption
24
          Allows the HTTP agent to be set with ITD_SetOption
25
  0.3.4 - Added Brazilian Portuguese translation by Ronaldo Souza
26
  0.3.3 - The "Hilbrand Edskes" release :), lots of suggestions and corrections from him, thank you!
27
          The "Retry" button is now translated.
28
          The "Current file" progress bar is hidden if only one file is being downloaded.
29
          The page's title and description are updated in the case of failed downloads.
30
          Several updates to the translations.
31
          Several small GUI fixes.
32
  0.3.2 - Minor tweaks to the English language file and the translation example script (example4.iss)
33
          Added Dutch translation by Hilbrand Edskes
34
          Added French translation by N?o
35
  0.3.1 - Added language file examples, fixed several missing language strings
36
          Preliminary support for proxy server autodetection
37
          Allows the size of a file to be queried with ITD_GetFileSize
38
          Several small bugfixes
39
  0.3.0 - Properly supports timeouts.
40
          Fixes bug with time remaining.
41
          DLL is required again.
42
          Supports localization through ITD_LoadStrings, ITD_SetString
43
          Add mirrors for files
44
          Post HTTP documents
45
          Quick view and detailed view
46
  0.2.2 - Fixed empty strings '' in calls and added timeouts
47
  0.2.1 - Renamed identifiers to avoid name clashes
48
  0.2.0 - Converted from DLL to pure native code
49
*)
50

    
51
procedure ITD_Cancel;
52
  external 'itd_cancel@files:itdownload.dll stdcall';
53

    
54
procedure ITD_ClearFiles;
55
  external 'itd_clearfiles@files:itdownload.dll stdcall';
56

    
57
function ITD_DownloadFile(url: PChar; destfilename: PChar): integer;
58
  external 'itd_downloadfile@files:itdownload.dll stdcall';
59

    
60
function ITD_GetResultLen: integer;
61
  external 'itd_getresultlen@files:itdownload.dll stdcall';
62

    
63
procedure ITD_GetResultString(buffer: pchar; maxlen: integer);
64
  external 'itd_getresultstring@files:itdownload.dll stdcall';
65

    
66
procedure ITD_Internal_InitUI(HostHwnd: dword);
67
  external 'itd_initui@files:itdownload.dll stdcall';
68

    
69
function ITD_Internal_LoadStrings(filename: PChar): boolean;
70
  external 'itd_loadstrings@files:itdownload.dll stdcall';
71

    
72
procedure ITD_Internal_SetOption(option, value: PChar);
73
  external 'itd_setoption@files:itdownload.dll stdcall';
74

    
75
function ITD_Internal_GetFileSize(url: pchar; var size: Cardinal): boolean;
76
  external 'itd_getfilesize@files:itdownload.dll stdcall';
77

    
78
function ITD_Internal_GetString(index: integer): boolean;
79
  external 'itd_getstring@files:itdownload.dll stdcall';
80

    
81
function ITD_Internal_GetOption(option: PChar; buffer: PChar; length: integer): integer;
82
  external 'itd_getoption@files:itdownload.dll stdcall';
83

    
84
procedure ITD_Internal_SetString(index: integer; value: PChar);
85
  external 'itd_setstring@files:itdownload.dll stdcall';
86

    
87
procedure ITD_Internal_AddFile(url: PChar; destfilename: PChar);
88
  external 'itd_addfile@files:itdownload.dll stdcall';
89

    
90
procedure ITD_Internal_AddMirror(url: PChar; destfilename: PChar);
91
  external 'itd_addmirror@files:itdownload.dll stdcall';
92

    
93
procedure ITD_Internal_AddFileSize(url: PChar; destfilename: PChar; size: integer);
94
  external 'itd_addfilesize@files:itdownload.dll stdcall';
95

    
96
function ITD_Internal_DownloadFiles(surface: hwnd): integer;
97
  external 'itd_downloadfiles@files:itdownload.dll stdcall';
98

    
99
function ITD_FileCount: integer;
100
  external 'itd_filecount@files:itdownload.dll stdcall';
101

    
102
function ITD_Internal_PostPage(url, buffer: PChar; length: integer): boolean;
103
  external 'itd_postpage@files:itdownload.dll stdcall';
104

    
105

    
106
const
107
  ITDERR_SUCCESS = 0;
108
  ITDERR_USERCANCEL = 1;
109
  ITDERR_ERROR = 3;
110

    
111
  {Constants for Language String indexes:}
112
  ITDS_DownloadFailed = 104;
113

    
114
  ITDS_TitleCaption = 200;
115
  ITDS_TitleDescription = 201;
116

    
117
  ITDS_MessageFailRetryContinue = 250;
118
  ITDS_MessageFailRetry = 251;
119

    
120
  ITDS_Retry = 502;
121

    
122
  {Constants for language strings of updater example}
123
  ITDS_Update_Caption = 600;
124
  ITDS_Update_Description = 601;
125
  ITDS_Update_Checking = 602;
126
  ITDS_Update_NewAvailable = 603;
127
  ITDS_Update_NoNewAvailable = 604;
128
  ITDS_Update_WantToCheck = 605;
129
  ITDS_Update_Failed = 606;
130
  ITDS_Update_WillLaunch = 607;
131
  ITDS_Update_WillLaunchWithPath = 608;
132

    
133
  ITD_Event_DownloadPageEntered = 1;
134
  ITD_Event_DownloadPageLeft = 2;
135
  ITD_Event_DownloadFailed = 3;
136

    
137
var
138
  itd_allowcontinue: boolean;
139
  itd_retryonback: boolean;
140

    
141
  ITD_AfterSuccess: procedure(downloadPage: TWizardPage);
142
  ITD_EventHandler: procedure(event: integer);
143

    
144
procedure ITD_DownloadFiles();
145
begin
146
  ITD_Internal_DownloadFiles(0);
147
end;
148

    
149
procedure ITD_AddFile(const URL, filename: string);
150
begin
151
  ITD_Internal_AddFile(URL, filename);
152
end;
153

    
154
procedure ITD_AddMirror(const URL, filename: string);
155
begin
156
  ITD_Internal_AddMirror(URL, filename);
157
end;
158

    
159
procedure ITD_AddFileSize(const URL, filename: string; size: integer);
160
begin
161
  ITD_Internal_AddFileSize(URL, filename, size);
162
end;
163

    
164
function ITD_HandleSkipPage(sender: TWizardPage): boolean;
165
begin
166
  result := (itd_filecount = 0);
167
end;
168

    
169
procedure ITD_SetString(index: integer; value: string);
170
begin
171
  itd_internal_setstring(index, value);
172
end;
173

    
174
function ITD_GetFileSize(const url: string; var size: cardinal): boolean;
175
begin
176
  result := itd_internal_getfilesize(PChar(url), size);
177
end;
178

    
179
function ITD_LoadStrings(const filename: string): boolean;
180
begin
181
  result := itd_internal_loadstrings(filename);
182
end;
183

    
184
function ITD_GetString(index: integer): string;
185
begin
186
  itd_internal_getstring(index);
187
  setlength(result, ITD_GetResultLen);
188
  ITD_GetResultString(PChar(result), length(result));
189
end;
190

    
191
procedure ITD_NowDoDownload(sender: TWizardPage);
192
var err: integer;
193
begin
194
  wizardform.backbutton.enabled := false;
195
  wizardform.nextbutton.enabled := false;
196

    
197
  sender.caption := ITD_GetString(ITDS_TitleCaption);
198
  sender.description := ITD_GetString(ITDS_TitleDescription);
199

    
200
  err := ITD_Internal_DownloadFiles(sender.surface.handle);
201

    
202
  case err of
203
    ITDERR_SUCCESS: begin
204
        wizardform.nextbutton.enabled := true;
205
        wizardform.nextbutton.onclick(nil);
206

    
207
        if itd_aftersuccess <> nil then
208
          itd_aftersuccess(sender);
209
      end;
210
    ITDERR_USERCANCEL: ; //Don't show a message, this happens on setup close and cancel click
211
  else begin
212
    //Some unexpected error, like connection interrupted
213
      wizardform.backbutton.caption := ITD_GetString(ITDS_Retry);
214
      wizardform.backbutton.enabled := true;
215
      wizardform.backbutton.show();
216
      itd_retryonback := true;
217

    
218
      wizardform.nextbutton.enabled := itd_allowcontinue;
219

    
220
      if ITD_EventHandler <> nil then
221
        ITD_EventHandler(ITD_Event_DownloadFailed);
222

    
223
      if itd_allowcontinue then begin //Download failed, we can retry, continue, or exit
224
        sender.caption := ITD_GetString(ITDS_DownloadFailed);
225
        sender.description := ITD_GetString(ITDS_MessageFailRetryContinue);
226

    
227
        MsgBox(ITD_GetString(ITDS_MessageFailRetryContinue), mbError, MB_OK)
228
      end else begin //Download failed, we must retry or exit setup
229
        sender.caption := ITD_GetString(ITDS_DownloadFailed);
230
        sender.description := ITD_GetString(ITDS_MessageFailRetry);
231

    
232
        MsgBox(ITD_GetString(ITDS_MessageFailRetry), mbError, MB_OK)
233
      end;
234
    end;
235
  end;
236
end;
237

    
238
procedure ITD_HandleShowPage(sender: TWizardPage);
239
begin
240
  wizardform.nextbutton.enabled := false;
241
  wizardform.backbutton.hide();
242

    
243
  if ITD_EventHandler <> nil then
244
    ITD_EventHandler(ITD_Event_DownloadPageEntered);
245

    
246
  itd_nowdodownload(sender);
247
end;
248

    
249
function ITD_HandleBackClick(sender: TWizardpage): boolean;
250
begin
251
  result := false;
252
  if itd_retryonback then begin
253
    itd_retryonback := false;
254
    wizardform.backbutton.hide();
255
    itd_nowdodownload(sender);
256
  end;
257
end;
258

    
259
function ITD_HandleNextClick(sender: TWizardpage): boolean;
260
begin
261
  if ITD_EventHandler <> nil then
262
    ITD_EventHandler(ITD_Event_DownloadPageLeft);
263

    
264
  result := true;
265
end;
266

    
267
procedure ITD_Init;
268
begin
269
 //Currently a NOP. Don't count on it in future.
270
end;
271

    
272
function ITD_PostPage(const url, data: string; out response: string): boolean;
273
begin
274
  result := ITD_Internal_PostPage(PChar(url), PChar(data), length(data));
275

    
276
  if result then begin
277
    setlength(response, ITD_GetResultLen);
278
    ITD_GetResultString(PChar(response), length(response));
279
  end;
280
end;
281

    
282
function ITD_DownloadAfter(afterID: integer): TWizardPage;
283
var itd_downloadPage: TWizardPage;
284
begin
285
  itd_downloadpage := CreateCustomPage(afterID, ITD_GetString(ITDS_TitleCaption), ITD_GetString(ITDS_TitleDescription));
286

    
287
  itd_downloadpage.onactivate := @itd_handleshowpage;
288
  itd_downloadpage.onshouldskippage := @itd_handleskippage;
289
  itd_downloadpage.onbackbuttonclick := @itd_handlebackclick;
290
  itd_downloadpage.onnextbuttonclick := @itd_handlenextclick;
291

    
292
  itd_internal_initui(itd_downloadpage.surface.handle);
293

    
294
  result := itd_downloadpage;
295
end;
296

    
297
procedure ITD_SetOption(const option, value: string);
298
begin
299
  //The options which call ITD_SetString are depreciated, use ITD_SetString directly
300
  if comparetext(option, 'UI_Caption') = 0 then
301
    ITD_SetString(ITDS_TitleCaption, value)
302
  else if comparetext(option, 'UI_Description') = 0 then
303
    ITD_SetString(ITDS_TitleDescription, value)
304
  else if comparetext(option, 'UI_FailMessage') = 0 then
305
    ITD_SetString(ITDS_MessageFailRetry, value)
306
  else if comparetext(option, 'UI_FailOrContinueMessage') = 0 then
307
    ITD_SetString(ITDS_MessageFailRetryContinue, value)
308
  else if comparetext(option, 'UI_AllowContinue') = 0 then
309
    ITD_AllowContinue := (value = '1')
310
  else
311
    ITD_Internal_SetOption(option, value);
312
end;
313

    
314
function ITD_GetOption(const option: string): string;
315
begin
316
  setlength(result, 500);
317
  setlength(result, itd_internal_getoption(pchar(option), pchar(result), length(result)));
318
end;