Menu

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

Download this file

239 lines (203 with data), 7.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
{
* UNews.pas
*
* Maintains a list of news items for display by program and reads list from
* formatted data stream.
*
* v0.1 of 01 May 2006 - Original version.
* v1.0 of 25 May 2006 - Improved and corrected comments.
* - Changed exception used to detect bugs from Exception
* type to EBug.
* v1.1 of 12 May 2007 - 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.
* v1.2 of 12 Jul 2009 - Replaced reference to UDataStreamReader unit with
* UDataStreamIO.
* - Made TNews and TNewsItems private sections strict.
*
*
* ***** 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-2009 Peter
* Johnson. All Rights Reserved.
*
* ***** END LICENSE BLOCK *****
}
unit UNews;
interface
uses
// Delphi
Classes, Contnrs,
// Project
UDataStreamIO;
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)
strict 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)
strict 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.