Menu

[r111]: / trunk / Src / UAppInfo.pas  Maximize  Restore  History

Download this file

381 lines (346 with data), 14.1 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
{
* UAppInfo.pas
*
* Class that provides information about the application.
*
* v0.1 of 30 Jan 2005 - Original version that accessed config file directly.
* v0.2 of 18 Feb 2005 - Deleted unused TAppLocations.GeneratorDir method.
* - Deleted unused TAppInfo constructor, destructor and
* fFindHistory field.
* v0.3 of 21 Apr 2005 - Total rewrite of TAppInfo object that accesses
* sections via identifiers rather than names, implements
* subsection names and provides direct access to data
* items within sections and to whole sections via new
* object that encapsulates them and their data. All
* section and data specific methods were deleted.
* IniFileName method renamed as StorageFileName.
* - Added new IAppSectionInfo interface to the new section
* encapsulation object.
* v0.4 of 25 Apr 2005 - Added new Source Output storage section.
* v0.5 of 08 Jan 2006 - Added new ItemExists method to IAppSectionInfo and its
* implememtaion.
* v0.6 of 04 Apr 2006 - Major revision:
* - Removed AppInfo object and associated code to new
* USettings unit and renamed and revised there.
* - Renamed TAppLocations to TAppInfo. This class will
* be extended at a later stage to provide more than
* application locations.
* v0.7 of 07 Apr 2006 - Several additions were made to TAppInfo:
* - Added support for setting and querying application
* registration.
* - Added support for generating and storing unique key
* for application.
* - Added support for returning various pieces of
* version information about the application.
* v1.0 of 28 May 2006 - Improved and corrected comments.
* - Changed methods that created instance of TVersionInfo
* to call new static functions instead.
* - Made TAppInfo.RegistrationCode private.
* - Added new TAppInfo.AppExeDir and TAppInfo.AppExeFile
* methods.
* v1.1 of 26 Oct 2006 - Added new TAppInfo.LicenseFileName method.
* v1.2 of 11 Nov 2006 - Added new TAppInfo.HelpFileName method to return path
* to help file.
* v1.3 of 14 Nov 2006 - Removed now unused TAppInfo.LicenseFileName method.
* v1.4 of 11 Feb 2007 - Added new TAppInfo.ContribFileName method to return
* path to contributors file.
* v1.5 of 22 Sep 2007 - Added TAppInfo.TestersFileName method to return path
* to testers file.
* v1.6 of 13 Aug 2008 - Renamed TAppDir.AppDir as TAppDir.UserAppDir.
* - Added new TAppDir.CommonAppDir class method.
* v1.7 of 24 Aug 2008 - Changed TAppInfo.GenerateKey to use SystemIDStr to
* build ID string rather using previous method that used
* MAC Address since MAC address code doesn't work on
* Windows Vista.
* - Removed obsolete TAppInfo methods: ContribFileName,
* TestersFileName and MasterFileName.
* v1.8 of 26 Aug 2008 - Added new TAppInfo.UserDataDir method that returns
* directory where user database is stored.
* v1.9 of 04 Oct 2008 - Changed TAppInfo to derive from TNoConstructObject and
* hence prevented it from being constructed.
* - Made private section strict.
* v1.10 of 11 Jan 2009 - Replaced direct call to MD5 routines with call to
* TCheckSum static class.
* v1.11 of 13 May 2009 - Added new class consts to TAppInfo: CompanyName,
* ProgramName, FullProgramName and ProgamID. These
* value were previosly provided by the UGlobals unit.
* v1.12 of 23 May 2009 - Changed user database sub-directory to UserData.3 from
* UserData to prevent making data in UserData unreadable
* by CodeSnip versions before release 3.
*
*
* ***** BEGIN LICENSE BLOCK *****
*
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
*
* The Original Code is UAppInfo.pas
*
* The Initial Developer of the Original Code is Peter Johnson
* (http://www.delphidabbler.com/).
*
* Portions created by the Initial Developer are Copyright (C) 2005-2009 Peter
* Johnson. All Rights Reserved.
*
* ***** END LICENSE BLOCK *****
}
unit UAppInfo;
interface
uses
// Project
UBaseObjects;
type
{
TAppInfo:
Static class that provides information about the application.
}
TAppInfo = class(TNoConstructObject)
strict private
class function GenerateKey: string;
{Generates unique program key for application in deterministic way.
@return Required key.
}
class function RegistrationCode: string;
{Reads program's registration code from persistent storage.
@return Registration code or '' if not registered.
}
public
const CompanyName = 'DelphiDabbler';
{Name of "company" that owns this program}
const ProgramName = 'CodeSnip';
{Name of program}
const FullProgramName = CompanyName + ' ' + ProgramName;
{Full name of program, including company name}
const ProgramID = 'codesnip';
{Machine readable identifier of program}
class function UserAppDir: string;
{Gets the CodeSnip data directory stored within the user's application
data directory.
@return Full path to per-user application data directory.
}
class function CommonAppDir: string;
{Gets the CodeSnip data directory stored within the common application
data directory.
@return Full path to common application data directory.
}
class function AppDataDir: string;
{Returns the directory where CodeSnip stores the "database" files.
@return Full path to database sub directory.
}
class function UserDataDir: string;
{Returns the directory where CodeSnip stores the user's "database" files.
@return Full path to database sub directory.
}
class function AppExeDir: string;
{Returns the directory of CodeSnip's executable files.
@return Full path to executable files directory.
}
class function AppExeFile: string;
{Returns name of CodeSnip's executable file. Adapts if file has been
renamed since compilation.
@return Name of executable file.
}
class function HelpFileName: string;
{Returns name of CodeSnip's help file.
@return Name of help file.
}
class function ProgramReleaseInfo: string;
{Gets information about the current program release.
@return Release information.
}
class function ProgramReleaseVersion: string;
{Gets current version number of current release of program.
@return Version number as dotted quad.
}
class function ProgramFileVersion: string;
{Gets version number of program's executable file.
@return Version number as dotted quad.
}
class function ProgramCopyright: string;
{Gets program's copyright information.
@return Copyright details.
}
class function ProgramKey: string;
{Gets program's unique identifying key. This key should be different on
each installation. If key does not exist it is created.
@return 32 digit key.
}
class procedure RegisterProgram(const Code, Name: string);
{Registers program by storing registration code and user name in
persistent storage.
@param Code [in] Registration code.
@param Name [in] Registered user name.
}
class function IsRegistered: Boolean;
{Checks if program is registered.
@return True if program registered.
}
class function RegisteredUser: string;
{Reads name of registered user from persistent storage.
@return User name or '' if not registered.
}
end;
implementation
uses
// Delphi
SHFolder, SysUtils,
// Project
UCheckSum, USettings, USystemID, UVersionInfo, UUtils;
{ TAppInfo }
class function TAppInfo.AppDataDir: string;
{Returns the directory where CodeSnip stores the "database" files.
@return Full path to database sub directory.
}
begin
Result := CommonAppDir + '\Data';
end;
class function TAppInfo.AppExeDir: string;
{Returns the directory of CodeSnip's executable files.
@return Full path to executable files directory.
}
begin
Result := ExtractFileDir(ParamStr(0));
end;
class function TAppInfo.AppExeFile: string;
{Returns name of CodeSnip's executable file. Adapts if file has been renamed
since compilation.
@return Name of executable file.
}
begin
Result := ExtractFileName(ParamStr(0));
end;
class function TAppInfo.CommonAppDir: string;
{Gets the CodeSnip data directory stored within the common application data
directory.
@return Full path to common application data directory.
}
begin
Result := SpecialFolderPath(CSIDL_COMMON_APPDATA)
+ '\DelphiDabbler\CodeSnip';
end;
class function TAppInfo.GenerateKey: string;
{Generates unique program key for application in deterministic way.
@return Required key.
}
begin
Result := UpperCase(TCheckSum.Calculate(USystemID.SystemIDStr));
end;
class function TAppInfo.HelpFileName: string;
{Returns name of CodeSnip's help file.
@return Name of help file.
}
begin
Result := AppExeDir + '\CodeSnip.chm';
end;
class function TAppInfo.IsRegistered: Boolean;
{Checks if program is registered.
@return True if program registered.
}
begin
Result := RegistrationCode <> '';
end;
class function TAppInfo.ProgramCopyright: string;
{Gets program's copyright information.
@return Copyright details.
}
begin
Result := TVersionInfo.LegalCopyrightStr;
end;
class function TAppInfo.ProgramFileVersion: string;
{Gets version number of program's executable file.
@return Version number as dotted quad.
}
begin
Result := TVersionInfo.FileVersionNumberStr;
end;
class function TAppInfo.ProgramKey: string;
{Gets program's unique identifying key. This key should be different on each
installation. If key does not exist it is created.
@return 32 digit key.
}
var
Section: ISettingsSection; // persistent storage where key is recorded
begin
// Try to get key from storage
Section := Settings.ReadSection(ssApplication);
Result := Section.ItemValues['Key'];
if Result = '' then
begin
// Key not present: create and store it
Result := GenerateKey;
Section.ItemValues['Key'] := Result;
Section.Save;
end;
end;
class function TAppInfo.ProgramReleaseInfo: string;
{Gets information about the current program release.
@return Release information.
}
begin
Result := TVersionInfo.ProductVersionStr;
end;
class function TAppInfo.ProgramReleaseVersion: string;
{Gets current version number of current release of program.
@return Version number as dotted quad.
}
begin
Result := TVersionInfo.ProductVersionNumberStr;
end;
class function TAppInfo.RegisteredUser: string;
{Reads name of registered user from persistent storage.
@return User name or '' if not registered.
}
var
Section: ISettingsSection; // persistent storage where name is recorded
begin
Section := Settings.ReadSection(ssApplication);
Result := Section.ItemValues['RegName'];
end;
class procedure TAppInfo.RegisterProgram(const Code, Name: string);
{Registers program by storing registration code and user name in persistent
storage.
@param Code [in] Registration code.
@param Name [in] Registered user name.
}
var
Section: ISettingsSection; // persistent storage where code is to be recorded
begin
Section := Settings.ReadSection(ssApplication);
Section.ItemValues['RegCode'] := Code;
Section.ItemValues['RegName'] := Name;
Section.Save;
end;
class function TAppInfo.RegistrationCode: string;
{Reads program's registration code from persistent storage.
@return Registration code or '' if not registered.
}
var
Section: ISettingsSection; // persistent storage where code is recorded
begin
Section := Settings.ReadSection(ssApplication);
Result := Section.ItemValues['RegCode'];
end;
class function TAppInfo.UserAppDir: string;
{Gets the CodeSnip data directory stored within the user's application data
directory.
@return Full path to per-user application data directory.
}
begin
Result := SpecialFolderPath(CSIDL_APPDATA)
+ '\DelphiDabbler\CodeSnip';
end;
class function TAppInfo.UserDataDir: string;
{Returns the directory where CodeSnip stores the user's "database" files.
@return Full path to database sub directory.
}
begin
Result := UserAppDir + '\UserData.3';
end;
end.
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.