Menu

[r50]: / trunk / Src / UNews.pas  Maximize  Restore  History

Download this file

261 lines (222 with data), 7.5 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
{ ##
@FILE UNews.pas
@COMMENTS Maintains a list of news items for display by
program and reads list from formatted data stream.
@PROJECT_NAME CodeSnip
@PROJECT_DESC Offline viewer for routines from the online
DelphiDabbler CodeSnip database.
@DEPENDENCIES None.
@HISTORY(
@REVISION(
@VERSION 0.1
@DATE 01/05/2006
@COMMENTS Original version.
)
@REVISION(
@VERSION 1.0
@DATE 25/05/2006
@COMMENTS + Improved and corrected comments.
+ Changed exception used to detect bugs from
Exception type to EBug.
)
@REVISION(
@VERSION 1.1
@DATE 12/05/2007
@COMMENTS + Removed all code that tested for program version
numbers at which news items were targetted. This
testing now performed by web service rather than
program.
+ Adapted to use revised news data format: versions
field no included in data stream.
)
)
}
{
* ***** 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 UNews.pas
*
* The Initial Developer of the Original Code is Peter Johnson
* (http://www.delphidabbler.com/).
*
* Portions created by the Initial Developer are Copyright (C) 2006-2007 Peter
* Johnson. All Rights Reserved.
*
* Contributor(s): None
*
* ***** END LICENSE BLOCK *****
}
unit UNews;
interface
uses
// Delphi
Classes, Contnrs,
// Project
UDataStreamReader;
type
{
TNewsItem:
Encapsulates a news item. Provides properties to describe it and a means
of creating object from a formatted data stream.
}
TNewsItem = class(TObject)
private
fId: SmallInt;
{Value of Id property}
fDate: TDateTime;
{Value of Date property}
fHTML: string;
{Value of HTML property}
public
constructor Create(const Reader: TDataStreamReader);
{Class constructor. Creates news item object from a data stream.
@param Reader [in] Object used to read/parse data stream.
}
property Id: SmallInt read fId;
{Unique identifier of news item}
property Date: TDateTime read fDate;
{Date news item published}
property HTML: string read fHTML;
{News item content as HTML}
end;
{
TNews:
Stores news items for display in application. Parses news items from a
data stream supplied to constructor.
}
TNews = class(TObject)
private
fNewsItems: TObjectList;
{Stores list of news items}
procedure Parse(const NewsData: TStream);
{Creates list of news items from a data stream.
@param NewsData [in] Data stream containing news items.
}
function GetCount: Integer;
{Read accessor for Count property.
@return Number of news items in list.
}
function GetItem(Idx: Integer): TNewsItem;
{Read accessor for Items[] property.
@param Idx [in] Index of required item.
@return Requested news item.
}
public
constructor Create(const NewsData: TStream);
{Class constructor. Creates list of news items described by a data stream.
@param NewsData [in] Stream containing news items.
}
destructor Destroy; override;
{Class destructor. Tears down object.
}
property Count: Integer read GetCount;
{Number of news items in list}
property Items[Idx: Integer]: TNewsItem read GetItem; default;
{Array of news items}
end;
implementation
uses
// Delphi
SysUtils;
{
News data stream format
-----------------------
Stream compriises text characters. Numbers are encoded in hex format.
File format is:
Item-count: SmallInt - number of news items in stream
followed by Item-count news item records:
Id: SmallInt - unique item identifier
Date: SizedString - publication date as MySQL date (YYYY-MM-DD)
Content: SizedString - news item content as HTML
Data types are:
SmallInt - 16 bit integer encoded as 4 hex digits
SizedString - SmallInt specifying string length followed by specified
number of characters
}
{ TNews }
constructor TNews.Create(const NewsData: TStream);
{Class constructor. Creates list of news items described by a data stream.
@param NewsData [in] Stream containing news items.
}
begin
inherited Create;
fNewsItems := TObjectList.Create(True);
Parse(NewsData);
end;
destructor TNews.Destroy;
{Class destructor. Tears down object.
}
begin
FreeAndNil(fNewsItems); // frees news items in list
inherited;
end;
function TNews.GetCount: Integer;
{Read accessor for Count property.
@return Number of news items in list.
}
begin
Result := fNewsItems.Count;
end;
function TNews.GetItem(Idx: Integer): TNewsItem;
{Read accessor for Items[] property.
@param Idx [in] Index of required item.
@return Requested news item.
}
begin
Result := fNewsItems[Idx] as TNewsItem;
end;
procedure TNews.Parse(const NewsData: TStream);
{Creates list of news items from a data stream.
@param NewsData [in] Data stream containing news items.
}
var
Reader: TDataStreamReader; // object used to interpret data stream
NumItems: SmallInt; // number of news items to create
Idx: Integer; // loops thru news items
begin
Reader := TDataStreamReader.Create(NewsData);
try
// Get number of items in data stream
NumItems := Reader.ReadSmallInt;
// Create required number of news items from stream
for Idx := 1 to NumItems do
fNewsItems.Add(TNewsItem.Create(Reader))
finally
FreeAndNil(Reader);
end;
end;
{ TNewsItem }
function MySQLDateToDateTime(const MySQLDate: string): TDateTime;
{Converts a date in MySQL format into a TDateTime.
@param MySQLDate [in] Date string in format YYYY-MM-DD.
@return Binary date value.
}
begin
Result := EncodeDate(
StrToInt(Copy(MySQLDate, 1, 4)),
StrToInt(Copy(MySQLDate, 6, 2)),
StrToInt(Copy(MySQLDate, 9, 2))
)
end;
constructor TNewsItem.Create(const Reader: TDataStreamReader);
{Class constructor. Creates news item object from a data stream.
@param Reader [in] Object used to read/parse data stream.
}
begin
inherited Create;
// Get property values from stream. Order is important
fId := Reader.ReadSmallInt;
fDate := MySQLDateToDateTime(Reader.ReadSizedString);
fHTML := Reader.ReadSizedString;
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.