root/trunk/InstallerServiceClass.pas

Revision 155, 13.4 kB (checked in by sagrer, 2 years ago)
  1. Функционал переводов отвязан от класса консольной утилиты, выдернут в новый класс в новый модуль TranslManager?.pas. При подключении модуля создается глобальный объект TranslMan? и доступна глобальная функция _() которая по сути обертка над методом _() класса TMOExtractor. Все это нужно чтобы не было привязки функционала локализации к классу консольного приложения.
  2. В связи с вышеизложенным поправлены исходники всех проектов, использовавших старый способ подключения переводов.
  3. Локализация прикручена к VerRevUpdater?, он же локализован на русский язык - выполнено #36.
  • Property svnmailer:content-charset set to cp1251
Line 
1 ///////////////////////////////////////////////////////////
2 //                     GGBuildTools                      //
3 //    Набор утилит для сборки проектов Gipat Group       //
4 //             Copyright (C) 2007 Gipat Group            //
5 //              Распространяется на условиях             //
6 //    Gipat Group's opened EI-editor-utility license     //
7 //                      версии 1.0                       //
8 //                                                       //
9 //                  www.gipatgroup.org                   //
10 ///////////////////////////////////////////////////////////
11
12 //К работе над данным файлом приложили руки, ноги.... короче аффтары:
13 // 1) Sagrer (sagrer@yandex.ru)
14
15 ////////////////////////////////////////////////////////////////////////
16
17 ////////////////////////////////////////////////////////
18 //          Служебный класс для Installer             //
19 ////////////////////////////////////////////////////////
20
21 unit InstallerServiceClass;
22
23 {$mode objfpc}{$H+}
24
25 interface
26
27 uses
28   Classes, SysUtils, forms, Registry, ExtraFunctionsLcl, GGBuildToolsShared, GGConsUtilServiceClass, ExtraFileUtilsLCL,
29   TranslManager;
30  
31 const
32   GGBT_InstallerAppName = 'Installer';
33  
34 type
35   TInstallerServiceClass = class (TGGConsUtilServiceClass)       //Класс с основным функционалом и данными инсталлера
36   private
37   protected
38   public
39     //Переменные
40     Registr : TRegistry;               //Объект класса для работы с виндовым реестром.
41     InstalledTools : RInstalledTools;  //Инфа про установленные тулсы
42    
43     //Конструкторы-деструкторы...
44     constructor Create; override;
45     destructor Destroy; override;
46    
47     //Другие методы...
48     procedure DoWork;        override;   //Выполнить боевую задачу %).
49     procedure InstallIt;                 //Выполнить инсталляцию.
50     procedure ShowDescription; override; //Вывести описание утилиты.
51    
52   end;
53  
54 var
55   InstServClass : TInstallerServiceClass;
56
57 implementation
58
59 /////////////////////////////////////////////
60 //         TInstallerServiceClass          //
61 /////////////////////////////////////////////
62
63 //-----------------------------------------//
64 //        Конструкторы-деструкторы...      //
65 //-----------------------------------------//
66
67 constructor TInstallerServiceClass.Create;
68 begin
69   //Проставить дефолтные значения...
70   InstalledTools.IssBuilder_installed := false;
71   InstalledTools.StarterModBuilder_installed := false;
72   InstalledTools.StarterModSynchronizator_installed := false;
73   InstalledTools.VerRevUpdater_installed := false;
74  
75   //Создать вложенные объекты классов...
76   Registr := TRegistry.Create;
77  
78   //Вбить имя приложения.
79   Self.GGConsAppName := GGBT_InstallerAppName;
80  
81   //Выполнить конструктор предка...
82   inherited;
83 end;
84
85 destructor TInstallerServiceClass.Destroy;
86 begin
87   //Выкидываем мусор
88   Registr.Free;
89
90   //Выполнить унаследованный деструктор
91   inherited;
92 end;
93
94 //------------------------------------------//
95 //             Другие методы...             //
96 //------------------------------------------//
97
98 procedure TInstallerServiceClass.DoWork;
99 //Выполнить боевую задачу %).
100 begin
101   //Выполнить нужно одну из задач - по её завершении ProcessFurther := false
102   //и дальше нифига не выполняется.
103  
104   //Выполнить унаследованную функцию
105   inherited;
106  
107   //Если ничего до сих пор не выполнилось - то выполняем боевую задачу....
108   if ProcessFurther = true then begin
109     //Блокировка других веток
110     ProcessFurther := false;
111     //Работаем....
112     InstallIt;
113   end;
114  
115 end;
116
117 procedure TInstallerServiceClass.InstallIt;
118 var
119   CurPath, CurVer, ExePath, OldPath, Answer : string;
120   NeedInstall, WasOldPath, OldVersionInstalled : boolean;
121 begin
122   //Выполнить инсталляцию.
123  
124   //Все очень просто. Проверяем ключ реестра проги, если он есть - смотрим тот ли там путь,
125   //если не тот - спрашиваем регистрировать ли путь, затем смотрим PATH, если там
126   //есть старый путь - удаляем. Затем добавляем новый путь в переменную и ключег в реестр.
127  
128   NeedInstall := false;   //По умолчанию - ниче трогать не надо %).
129   WasOldPath := false;   //И считаем что по другим путям ниче не установлено.
130   ExePath := DelLastSlash(ExtractFilePath(Application.ExeName))+'\bin';   //Сразу получим путь к GGBuildTools.
131   OldVersionInstalled := false;   //Считаем что более старой версии не установлено.
132  
133   //Выводим сначала версию...
134   ShowVersion();
135   //Отделяющая строка.
136   Writeln();
137  
138   //Пишем что собираем инфу...
139   Writeln(_('Gathering infirmation...'));
140   Writeln('');
141  
142   //Итак, проверям ключ реестра...
143   Registr.RootKey := HKEY_CURRENT_USER;
144   if Registr.OpenKey('\Software\Gipat Group\'+AllProjectName,false) = true then begin
145   //if Registr.KeyExists('\Software\Gipat Group\'+AllProjectName,false) = true then begin    //#LCL-BUG
146     //Registr.OpenKey('\Software\Gipat Group\'+AllProjectName,false);                        //#LCL-BUG
147    
148     //Есть такой ключег... смотрим чего там внутрях %).
149     CurPath := Registr.ReadString('path');
150     CurVer := Registr.ReadString('ver');
151     Registr.CloseKey;
152    
153     //Ок. Теперь - проверяем, правильный ли там путь...
154     if UpperCase(DelLastSlash(ExtractFilePath(Application.ExeName))) <> UpperCase(DelLastSlash(CurPath)) then begin
155       //Не, не совпало.
156       WasOldPath := true;
157       OldPath := DelLastSlash(CurPath);
158     end;
159    
160     //Теперь смотрим на номер версии...
161     if IsNewVersion(CurVer,Self.AppVersion.GenerateDotsVersionString()) = true then begin
162       //Если стоит старая версия...
163       OldVersionInstalled := true;
164     end;
165    
166     //Если эта версия уже установлена, по этому же пути - то нет смысла еще раз
167     //устанавливаться, о чем и сообщаем %).
168     if (WasOldPath = false) and (OldVersionInstalled = false) then begin
169       Writeln(_('This version is already installed into this directory.'));
170       Writeln(_('So, we no need to reinstall now.'));
171       Writeln(_('Installation aborted %)'));
172     end;
173    
174     //Теперь выясняем вопрос о необходимости переустановки...
175    
176     //Если был прописан другой путь.
177     If WasOldPath = true then begin
178       //Спрашиваем если нужно.
179       if DoSilent <> true then begin
180         Writeln(_('Another version is installed with path:'));
181         Writeln(OldPath);
182         Write(_('Continue installing this version, deinstalling this another? (y/n) > '));
183         Readln(Answer);
184       end
185       else begin
186         Writeln(_('Another version is installed with path:'));
187         Writeln(OldPath);
188         Writeln(_('I''ll deinstall this another!'));
189         Answer := 'y';
190       end;
191      
192       if UpperCase(Answer) = 'Y' then begin
193         NeedInstall := true;  //Отмечаем необходимость переустановки.
194       end;
195     end;
196
197     //Если была прописана другая версия, но с путем все было ок.
198     If (WasOldPath = false) and (OldVersionInstalled = true) then begin
199       //Нужно спросить (если нужно %) ) обновлять ли на новую версию.
200       if DoSilent <> true then begin
201         Writeln(_('Older version ( ')+CurVer+_(' ) is installed.'));
202         Write(_('Update (y) or cancel (n) ? (y/n) > '));
203         Readln(Answer);
204       end
205       else begin
206         Writeln(_('Older version ( ')+CurVer+_(' ) is installed.'));
207         Writeln(_('Updating!'));
208         Answer := 'y';
209       end;
210      
211       if UpperCase(Answer) = 'Y' then begin
212         NeedInstall := true;  //Отмечаем необходимость переустановки.
213       end;
214     end;
215    
216   end
217   else begin
218     //Нету нифига в реестре. Просто переустанавливаем...
219     NeedInstall := true;
220   end;
221  
222   //Запрос на собсно установку %)
223   if NeedInstall = true then begin
224     if DoSilent = false then begin
225       Write(_('All is ready. Really want to install? (y/n) > '));
226       Readln(Answer);
227       if UpperCase(Answer) <> 'Y' then begin
228         NeedInstall := false;  //Облом, отмена установки.
229         Writeln(_('Ok, canceled.'));
230       end
231       else begin
232         Writeln(_('Ok, installing is confirmed.'));
233       end;
234     end
235     else begin
236       Writeln(_('All is ready. Installing is confirmed automatically.'));
237     end;
238   end;
239  
240   //Теперь собсно установка.
241   if NeedInstall = true then begin
242  
243     Writeln('');
244     Writeln('');
245     Writeln('');
246     Writeln(_('Installing started!'));
247     Writeln('');
248     Writeln('');
249
250 ///////////////////////////
251
252     //Проверяем наличие тулсов...
253     Writeln(_('Checking tools: '));
254
255     Write(_('IssBuilder                              '));
256     if FileExists(DelLastSlash(ExePath)+'\IssBuilder.exe') = true then begin
257       //Экзешнег присутствует...
258       InstalledTools.IssBuilder_installed := true;
259       Writeln(_('[  OK  ]'));
260     end
261     else begin
262       //Нету нифигга.
263       InstalledTools.IssBuilder_installed := false;
264       Writeln(_('[ FAIL ]'));
265     end;
266    
267     Write(_('VerRevUpdater                           '));
268     if FileExists(DelLastSlash(ExePath)+'\VerRevUpdater.exe') = true then begin
269       //Экзешнег присутствует...
270       InstalledTools.VerRevUpdater_installed := true;
271       Writeln(_('[  OK  ]'));
272     end
273     else begin
274       //Нету нифигга.
275       InstalledTools.VerRevUpdater_installed := false;
276       Writeln(_('[ FAIL ]'));
277     end;
278    
279     Write(_('StarterModBuilder                       '));
280     if FileExists(DelLastSlash(ExePath)+'\StarterModBuilder.exe') = true then begin
281       //Экзешнег присутствует...
282       InstalledTools.StarterModBuilder_installed := true;
283       Writeln(_('[  OK  ]'));
284     end
285     else begin
286       //Нету нифигга.
287       InstalledTools.StarterModBuilder_installed := false;
288       Writeln(_('[ FAIL ]'));
289     end;
290    
291     Write(_('StarterModSynchtonizator                '));
292     if FileExists(DelLastSlash(ExePath)+'\StarterModSynchronizator.exe') = true then begin
293       //Экзешнег присутствует...
294       InstalledTools.StarterModSynchronizator_installed := true;
295       Writeln(_('[  OK  ]'));
296     end
297     else begin
298       //Нету нифигга.
299       InstalledTools.StarterModSynchronizator_installed := false;
300       Writeln(_('[ FAIL ]'));
301     end;
302    
303     Write(_('SourcePackBuilder                       '));
304     if FileExists(DelLastSlash(ExePath)+'\SourcePackBuilder.exe') = true then begin
305       //Экзешнег присутствует...
306       InstalledTools.SourcePackBuilder_installed := true;
307       Writeln(_('[  OK  ]'));
308     end
309     else begin
310       //Нету нифигга.
311       InstalledTools.SourcePackBuilder_installed := false;
312       Writeln(_('[ FAIL ]'));
313     end;
314    
315     Writeln('');
316    
317 /////////////////////////////
318
319     //Если что-то было зарегистрировано по старому пути...
320     if WasOldPath = true then begin
321       //Просто удаляем старый путь.
322       if EnvPathRemove(OldPath,true,true) = true then begin
323         Writeln(_('Deleted old path from environment.'));
324       end;
325     end;
326    
327     //Теперь - если нужно - удаляем старый раздел реестра...
328     if Registr.OpenKey('\Software\Gipat Group\'+AllProjectName,false) = true then begin
329       Registr.CloseKey();
330       Registr.DeleteKey('\Software\Gipat Group\'+AllProjectName);
331       Writeln(_('Deleted old registry key.'));
332     end;
333    
334     //Дальше - типо стандартный инсталл.
335     Writeln('');
336     Writeln(_('Standard installation started.'));
337     Writeln('');
338     //Добавляем переменную в User path-а.
339     Write(_('Adding into PATH wariable: '));
340     if not ( (OldVersionInstalled = true) and (WasOldPath = false) ) then begin
341       //Новый путь нужно вбить во всех случаях, кроме как когда поменялась только версия но не путь.
342       EnvPathAdd(DelLastSlash(ExePath),EnvPathAdd_User);
343     end;
344     Writeln(DelLastSlash(ExePath));
345     Writeln(_('done.'));
346     Writeln('');
347     //Создаем ключег в реестре.
348     Writeln(_('Registering in a registry...'));
349     Registr.RootKey := HKEY_CURRENT_USER;
350     Registr.OpenKey('\Software\Gipat Group\'+AllProjectName, true);
351     //И вбиваем в него содержимое...
352     Registr.WriteString('path',DelLastSlash(ExtractFilePath(Application.ExeName)));
353     Registr.WriteString('ver',Self.AppVersion.GenerateDotsVersionString());
354     Registr.WriteBool('IssBuilder_installed',InstalledTools.IssBuilder_installed);
355     Registr.WriteBool('VerRevUpdater_installed',InstalledTools.VerRevUpdater_installed);
356     Registr.WriteBool('StarterModBuilder_installed',InstalledTools.StarterModBuilder_installed);
357     Registr.WriteBool('StarterModSynchronizator_installed',InstalledTools.StarterModSynchronizator_installed);
358     Registr.WriteBool('SourcePackBuilder_installed',InstalledTools.SourcePackBuilder_installed);
359     //Закрываем ключег...
360     Registr.CloseKey;
361     Writeln(_('done.'));
362     Writeln('');
363     //Сообсчаем об успешном завершении инсталляции.
364     Writeln(_('Installation completed succesfully!'));
365     Writeln('');
366   end;
367  
368 end;
369
370 procedure TInstallerServiceClass.ShowDescription;
371 //Вывести описание утилиты.
372 begin
373   inherited;
374   Writeln(_('Description:'));
375   Writeln(_('             Installs ')+AllProjectName+_(' to your system. No files copying, only'));
376   Writeln(_('             registering in windows registry and environment variables.'));
377 end;
378
379
380 /////////////////////////////////
381 initialization
382
383 begin
384   //Инициализация %). Выделим память, создадим всякую херню... как обычно в общем %)
385   InstServClass := TInstallerServiceClass.Create;
386   //Включим перевод с языка по умолчанию.
387   TranslMan.EnableLanguageDefault;
388 end;
389
390 finalization
391 //Мочим все лишнее...
392 begin
393   InstServClass.Free;
394 end;
395
396 end.
397
Note: See TracBrowser for help on using the browser.