6 Contnrs, Controls, Classes, SysUtils, Dialogs, Forms, HttpThread, BottleDef,
7 DateUtils, XDOM_2_3_J3;
11 TLogType = (ltBottle, ltSystemLog);
12 TLogState = (lsUnopened, lsPlaying, lsOpened);
14 THasURL = (huUndefined, huYes, huNo);
16 TLogItem = class(TPersistent)
28 procedure SetChannel(const Value: String);
29 procedure SetLogType(const Value: TLogType);
30 procedure SetMID(const Value: String);
31 procedure SetScript(const Value: String);
32 procedure SetLogTime(const Value: TDateTime);
33 procedure SetGhost(const Value: String);
34 procedure SetVotes(const Value: Integer);
35 procedure SetAgreements(const Value: Integer);
36 procedure SetState(const Value: TLogState);
37 procedure SetHasURL(const Value: THasURL);
39 constructor Create(LogType: TLogType; const MID, Channel, Script,
40 Ghost: String; LogTime: TDateTime); overload;
41 constructor Create(Source: TLogItem); overload;
42 property LogType: TLogType read FLogType write SetLogType;
43 property MID: String read FMID write SetMID;
44 property Channel: String read FChannel write SetChannel;
45 property LogTime: TDateTime read FLogTime write SetLogTime;
46 property Script: String read FScript write SetScript;
47 property Ghost: String read FGhost write SetGhost;
48 property Votes: Integer read FVotes write SetVotes;
49 property Agrees: Integer read FAgreements write SetAgreements;
50 property State: TLogState read FState write SetState;
51 property HasURL: THasURL read FHasURL write SetHasURL;
52 procedure Assign(Source: TPersistent); override;
55 TBottleLogSortType = (stLogTime, stChannel, stGhost, stScript, stVote, stAgree);
56 TBottleLogLoadFailureEvent = procedure(Sender: TObject; const Message: String) of object;
58 EXMLFileOpenException = class(Exception);
60 TBottleLogDownLoadCondition = packed record
70 TLogXMLThread = class(TThread)
74 FOnLoadFailure: TBottleLogLoadFailureEvent;
75 FOnLoaded: TNotifyEvent;
76 FLoadFailureMessage: String;
77 procedure SetOnLoaded(const Value: TNotifyEvent);
78 procedure SetOnLoadFailure(const Value: TBottleLogLoadFailureEvent);
80 procedure Execute; override;
82 procedure DoLoadFailure;
84 property OnLoaded: TNotifyEvent read FOnLoaded write SetOnLoaded;
85 property OnLoadFailure: TBottleLogLoadFailureEvent
86 read FOnLoadFailure write SetOnLoadFailure;
87 property List: TObjectList read FList;
88 constructor Create(FileName: String);
89 destructor Destroy; override;
92 TBottleLogList = class(TObjectList)
94 FOnLoaded: TNotifyEvent;
95 FHttpThread: THTTPDownloadThread;
96 FXMLThread: TLogXMLThread;
99 FOnLoadFailure: TBottleLogLoadFailureEvent;
100 FOldSortColumn: TBottleLogSortType; //
\83\8d\83O
\91\8b
101 FOldSortDesc: boolean; //
\83\8d\83O
\91\8b
102 FSelectedIndex: integer;
103 FOnLoadWork: TNotifyEvent; //
\83\8d\83O
\91\8b
105 function GetBottles(Index: integer): TLogItem;
106 procedure SetOnLoaded(const Value: TNotifyEvent);
107 procedure HttpSuccess(Sender: TObject);
108 procedure HttpFailure(Sender: TObject);
109 procedure HttpWork(Sender: TObject; LoadBytes: integer);
110 procedure XMLLoaded(Sener: TObject);
111 procedure XMLLoadFailure(Sender: TObject; const Message: String);
112 procedure SetTitle(const Value: String);
113 procedure SetOnLoadFailure(const Value: TBottleLogLoadFailureEvent);
114 procedure SetSelectedIndex(const Value: integer);
115 procedure SetOnLoadWork(const Value: TNotifyEvent);
116 procedure DoLoadFailure(const ErrorMessage: String);
118 constructor Create(const Title: String);
119 destructor Destroy; override;
120 procedure SortBottles(LogSortType: TBottleLogSortType);
121 function Bottle(MID: String): TLogItem;
122 property Bottles[Index: integer]: TLogItem read GetBottles;
123 procedure LoadFromWeb(const Cond: TBottleLogDownloadCondition);
124 property Title: String read FTitle write SetTitle;
125 procedure LoadFromStream(Stream: TStream);
126 property OnLoaded: TNotifyEvent read FOnLoaded write SetOnLoaded;
127 property OnLoadWork: TNotifyEvent read FOnLoadWork write SetOnLoadWork;
128 property OnLoadFailure: TBottleLogLoadFailureEvent read FOnLoadFailure write SetOnLoadFailure;
129 property SelectedIndex: integer read FSelectedIndex write SetSelectedIndex;
130 procedure AddScriptLog(const Script, Channel, MID, Ghost: String);
131 procedure AddSystemLog(const MessageString: String);
132 procedure SaveToText(const FileName: String);
133 procedure SaveToSstpLog(const FileName: String;
134 const WithChannel: boolean = false);
135 procedure SaveToXMLFile(const FileName: String);
136 procedure LoadFromXMLFile(const FileName: String);
137 procedure SaveToHTML(const FileName: String);
141 ASortType: TBottleLogSortType; //LogCompare
\8aÖ
\90\94\82©
\82ç
\8c©
\82¦
\82é
\82æ
\82¤
\82É
\88ê
\8e\9e\91Þ
\94ð
\97p
144 function LogCompare(Item1, Item2: Pointer): integer;
147 ////////////////////////////////////////////////////////////////////////////////
150 function LogCompare(Item1, Item2: Pointer): Integer;
152 Log1, Log2: TLogItem;
154 Log1 := TLogItem(Item1);
155 Log2 := TLogItem(Item2);
159 Result := AnsiCompareStr(Log2.MID, Log1.MID);
162 Result := AnsiCompareStr(Log1.Channel, Log2.Channel);
165 Result := AnsiCompareStr(Log1.Ghost, Log2.Ghost);
168 Result := AnsiCompareStr(Log1.Script, Log2.Script);
171 Result := Log2.Votes - Log1.Votes;
174 Result := Log2.Agrees - Log1.Agrees;
177 if ASortDesc then Result := -Result; //
\8f¸
\8f\87
182 constructor TLogItem.Create(LogType: TLogType; const MID, Channel, Script,
183 Ghost: String; LogTime: TDateTime);
185 Self.LogType := LogType;
187 Self.Script := Script;
188 Self.Channel := Channel;
190 Self.LogTime := LogTime;
191 Self.State := lsUnopened;
194 procedure TLogItem.SetChannel(const Value: String);
199 procedure TLogItem.SetLogType(const Value: TLogType);
204 procedure TLogItem.SetMID(const Value: String);
209 procedure TLogItem.SetScript(const Value: String);
214 procedure TLogItem.SetLogTime(const Value: TDateTime);
219 procedure TLogItem.SetAgreements(const Value: Integer);
221 FAgreements := Value;
224 procedure TLogItem.SetVotes(const Value: Integer);
229 procedure TLogItem.SetGhost(const Value: String);
235 procedure TLogItem.SetState(const Value: TLogState);
240 procedure TLogItem.Assign(Source: TPersistent);
243 if not (Source is TLogItem) then
246 Src := Source as TLogItem;
247 self.FScript := Src.FScript;
248 self.FChannel := Src.FChannel;
249 self.FMID := Src.FMID;
250 self.FLogTime := Src.FLogTime;
251 self.FLogType := Src.FLogType;
252 self.FGhost := Src.FGhost;
253 self.FVotes := Src.FVotes;
254 self.FAgreements := Src.FAgreements;
255 self.FState := Src.FState;
256 self.FHasURL := Src.FHasURL;
260 constructor TLogItem.Create(Source: TLogItem);
265 procedure TLogItem.SetHasURL(const Value: THasURL);
272 procedure TBottleLogList.AddScriptLog(const Script, Channel, MID,
274 var LogItem: TLogItem;
276 LogItem := TLogItem.Create(ltBottle, MID, Channel, Script, Ghost, Now());
285 procedure TBottleLogList.AddSystemLog(const MessageString: String);
286 var LogItem: TLogItem;
288 LogItem := TLogItem.Create(ltSystemLog, '', '', MessageString, '', Now());
297 function TBottleLogList.Bottle(MID: String): TLogItem;
301 for i := 0 to Count-1 do
302 if (Items[i] as TLogItem).MID = MID then begin
303 Result := Items[i] as TLogItem;
308 constructor TBottleLogList.Create(const Title: String);
313 FSelectedIndex := -1; //
\91I
\91ð
\82³
\82ê
\82Ä
\82¢
\82È
\82¢
316 destructor TBottleLogList.Destroy;
319 // FHttpThread
\82Í
\8e©
\95ª
\82ðFree
\82·
\82é
\81u
\91O
\81v
\82ÉSynchronize
\82Å
\8eQ
\8fÆ
\82ª
\8dí
\8f\9c\82³
\82ê
\82é
\82Ì
\82Å
\81A
320 // FHttpThread <> nil
\82È
\82ç
\8eÀ
\91Ì
\82ª
\91¶
\8dÝ
\82·
\82é
\82±
\82Æ
\82Í
\8am
\8eÀ
\82Å
\82 \82é
\81B
321 if FHttpThread <> nil then begin
322 FHttpThread.OnSuccess := nil;
323 FHttpThread.OnConnectionFailed := nil;
327 procedure TBottleLogList.DoLoadFailure(const ErrorMessage: String);
330 self.AddSystemLog(ErrorMessage);
331 if Assigned(FOnLoadFailure) then FOnLoadFailure(self, ErrorMessage);
334 function TBottleLogList.GetBottles(Index: integer): TLogItem;
336 Result := Items[Index] as TLogItem;
339 procedure TBottleLogList.HttpFailure(Sender: TObject);
341 if Assigned(FOnLoadFailure) then
342 DoLoadFailure('
\83T
\81[
\83o
\82Ì
\90Ú
\91±
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½');
345 procedure TBottleLogList.HttpSuccess(Sender: TObject);
346 var Stream: TStringStream;
347 StrList: TStringList;
349 Stream := TStringStream.Create(FHttpThread.RecvString);
351 StrList := TStringList.Create;
353 StrList.Text := Stream.DataString;
354 if StrList[0] <> 'Result: OK' then begin
355 if Assigned(FOnLoadFailure) then
356 DoLoadFailure('
\83T
\81[
\83o
\82ª
\83G
\83\89\81[
\82ð
\95Ô
\82µ
\82Ü
\82µ
\82½'#13#10 + Stream.DataString);
358 while StrList.Count > 0 do
359 if StrList[0] <> '' then StrList.Delete(0) else Break; //
\83w
\83b
\83_
\81[
\82ð
\8dí
\8f\9c\82·
\82é
360 if StrList.Count > 0 then StrList.Delete(0); //
\83w
\83b
\83_
\81[
\8cã
\82Ì
\8bó
\8ds
\8dí
\8f\9c
361 Stream.Seek(0, soFromBeginning);
362 Stream.Size := Length(StrList.Text);
363 Stream.WriteString(StrList.Text);
364 Stream.Seek(0, soFromBeginning);
365 LoadFromStream(Stream);
372 // nil
\82Å
\82È
\82¢
\8fê
\8d\87\82É
\82Í
\8eÀ
\91Ì
\82ª
\91¶
\8dÝ
\82·
\82é
\82±
\82Æ
\82ð
\8am
\8eÀ
\82É
\82·
\82é
373 //
\82½
\82¾
\82µ nil
\82¾
\82©
\82ç
\82Æ
\82¢
\82Á
\82Ä
\8eÀ
\91Ì
\82ª
\91¶
\8dÝ
\82µ
\82È
\82¢
\82Æ
\82Í
\8cÀ
\82ç
\82È
\82¢(FreeOnTerminate
\82Ì
\82½
\82ß)
378 procedure TBottleLogList.HttpWork(Sender: TObject; LoadBytes: integer);
381 AddSystemLog(Format('
\83_
\83E
\83\93\83\8d\81[
\83h
\92\86\82Å
\82· - %4d KB', [LoadBytes div 1024]));
382 FLoadBytes := LoadBytes;
383 if Assigned(FOnLoadWork) then FOnLoadWork(self);
386 procedure TBottleLogList.LoadFromStream(Stream: TStream);
388 SourceStream: TStringStream;
391 function S2D (const S: String): TDateTime;
393 Result := EncodeDateTime(
394 StrToInt(Copy(S, 1, 4)), StrToInt(Copy(S, 5, 2)), StrToInt(Copy(S, 7, 2)),
395 StrToInt(Copy(S, 9, 2)), StrToInt(Copy(S, 11, 2)), StrToInt(Copy(S, 13, 2)), 0);
402 SourceStream := TStringStream.Create('');
403 SourceStream.Seek(0, soFromBeginning);
404 SourceStream.CopyFrom(Stream, Stream.Size);
405 Source := TStringList.Create;
406 Source.Text := SourceStream.DataString;
408 if Source.Count = 0 then begin
409 DoLoadFailure('
\8ew
\92è
\8fð
\8c\8f\82Ì
\83\8d\83O
\82Í
\91¶
\8dÝ
\82µ
\82Ü
\82¹
\82ñ');
412 if Source[0] <> 'OK' then begin
415 while (i + 7) < Source.Count do begin
416 LogItem := TLogItem.Create(ltBottle, Source[i+1], Source[i+2],
417 Source[i+7], Source[i+3], S2D(Source[i]));
418 LogItem.Votes := StrToInt(Source[i+5]);
419 LogItem.Agrees := StrToInt(Source[i+6]);
420 LogItem.State := lsOpened;
429 On EConvertError do begin
430 DoLoadFailure('
\83T
\81[
\83o
\89\9e\93\9a\82Ì
\8c`
\8e®
\82ª
\95s
\90³
\82Å
\82·');
434 FOldSortColumn := stLogTime;
435 FOldSortDesc := false;
436 if Assigned(FOnLoaded) then FOnLoaded(Self);
439 procedure TBottleLogList.LoadFromWeb(const Cond: TBottleLogDownloadCondition);
443 AddSystemLog('
\83_
\83E
\83\93\83\8d\81[
\83h
\92\86\82Å
\82· -
\83T
\81[
\83o
\82©
\82ç
\89\9e\93\9a\91Ò
\82¿');
445 if Cond.IsRange then begin
446 Param := Format('year_lo=%d&month_lo=%d&day_lo=%d&year_hi=%d&month_hi=%d&day_hi=%d&',
447 [YearOf(DateLo), MonthOf(DateLo), DayOf(DateLo),
448 YearOf(DateHi), MonthOf(DateHi), DayOf(DateHi)]);
450 Param := Format('recent=%d&', [RecentCount]);
452 Param := Param + Format('minvote=%d&minagree=%d&channel=%s&sort=timedesc&delimiter=%%0D%%0A',
453 [MinVote, MinAgree, ParamsEncode(Channel)]);
455 FHttpThread := THTTPDownloadThread.Create(BottleServer, Pref.CgiFetchLog, Param);
456 if Pref.UseHttpProxy then begin
457 FHttpThread.ProxyServer := Pref.ProxyAddress;
458 FHttpThread.ProxyPort := Pref.ProxyPort;
460 FHttpThread.FreeOnTerminate := true;
461 FHttpThread.OnSuccess := HttpSuccess;
462 FHttpThread.OnConnectionFailed := HttpFailure;
463 FHttpThread.OnHttpWork := HttpWork;
469 procedure TBottleLogList.LoadFromXMLFile(const FileName: String);
472 AddSystemLog('
\83\8d\81[
\83h
\92\86...');
473 FXMLThread := TLogXMLThread.Create(FileName);
474 FXMLThread.FreeOnTerminate := true; //
\8f\9f\8eè
\82É
\8fÁ
\82¦
\82Ä
\82à
\82ç
\82¤
477 OnLoaded := XMLLoaded;
478 OnLoadFailure := XMLLoadFailure;
483 procedure TBottleLogList.SaveToHTML(const FileName: String);
488 Strs := TStringList.Create;
493 for i := 0 to Self.Count-1 do
495 Add('<table class="bottle">');
497 Add(' <td>' + Bottles[i].Script + '</td>');
502 SaveToFile(FileName);
509 procedure TBottleLogList.SaveToSstpLog(const FileName: String;
510 const WithChannel: boolean = false);
516 DayStr: array[1..7] of String = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
520 Str := TStringList.Create;
521 for i := 0 to Self.Count - 1 do begin
522 Item := Self.Items[i] as TLogItem;
523 if Item.LogType = ltBottle then begin
524 Date := FormatDateTime('yyyy/mm/dd hh:nn:ss ', Item.LogTime);
525 Date := Date + '(' + DayStr[DayOfWeek(Item.LogTime)] + ')';
527 Date := Date + ',' + Item.Channel +',SEND,' + Item.Script
529 Date := Date + ',0.0.0.0,SEND,' + Item.Script;
533 Str.SaveToFile(FileName);
539 procedure TBottleLogList.SaveToText(const FileName: String);
545 Str := TStringList.Create;
546 for i := 0 to Self.Count - 1 do
547 if (Self.Items[i] as TLogItem).LogType = ltBottle then
548 Str.Add((Self.Items[i] as TLogItem).Script);
549 Str.SaveToFile(FileName);
555 procedure TBottleLogList.SaveToXMLFile(const FileName: String);
557 MessageNode, Child: TdomElement;
560 Parser: TXmlToDomParser;
561 Impl: TDomImplementation;
564 Impl := TDomImplementation.create(nil);
566 Parser := TXmlToDomParser.create(nil);
567 Parser.DOMImpl := Impl;
570 DOM := Parser.fileToDom(ExtractFilePath(Application.ExeName)+'xbtl.dat');
571 //
\82±
\82ê
\82Í
\96¾
\8e¦
\93I
\82ÉFree
\82µ
\82È
\82
\82Ä
\82æ
\82¢
574 documentElement.setAttribute('saved',
575 FormatDateTime('yy/mm/dd hh:nn:ss', Now));
576 documentElement.setAttribute('generator', VersionString);
577 documentElement.setAttribute('version', '1.0');
578 for i := 0 to Self.Count-1 do begin
579 Item := Self.GetBottles(i);
580 MessageNode := createElement('message');
581 MessageNode.setAttribute('mid', Item.MID);
582 documentElement.appendChild(MessageNode);
585 Child := createElement('date');
586 Child.appendChild(createTextNode(FormatDateTime('yy/mm/dd hh:nn:ss', Item.LogTime)));
587 MessageNode.appendChild(Child);
588 //
\83`
\83\83\83\93\83l
\83\8b
589 Child := createElement('channel');
590 Child.appendChild(createTextNode(Item.Channel));
591 MessageNode.appendChild(Child);
592 //
\83X
\83N
\83\8a\83v
\83g
593 Child := createElement('script');
594 Child.appendChild(createTextNode(Item.Script));
595 MessageNode.appendChild(Child);
597 Child := createElement('votes');
598 Child.appendChild(createTextNode(IntToStr(Item.Votes)));
599 MessageNode.appendChild(Child);
601 Child := createElement('agrees');
602 Child.appendChild(createTextNode(IntToStr(Item.Agrees)));
603 MessageNode.appendChild(Child);
605 Child := createElement('ghost');
606 Child.appendChild(createTextNode(Item.Ghost));
607 MessageNode.appendChild(Child);
611 FS := TFileStream.Create(FileName, fmCreate or fmShareExclusive);
613 DOM.writeCodeAsShiftJIS(FS);
618 ShowMessage('xbtl.dat
\82ð
\8dÄ
\83C
\83\93\83X
\83g
\81[
\83\8b\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B');
621 Parser.DOMImpl.freeDocument(DOM);
629 procedure TBottleLogList.SetOnLoaded(const Value: TNotifyEvent);
634 procedure TBottleLogList.SetOnLoadFailure(
635 const Value: TBottleLogLoadFailureEvent);
637 FOnLoadFailure := Value;
640 procedure TBottleLogList.SetOnLoadWork(const Value: TNotifyEvent);
642 FOnLoadWork := Value;
645 procedure TBottleLogList.SetSelectedIndex(const Value: integer);
647 FSelectedIndex := Value;
650 procedure TBottleLogList.SetTitle(const Value: String);
655 procedure TBottleLogList.SortBottles(LogSortType: TBottleLogSortType);
657 if FOldSortColumn = LogSortType then
658 ASortDesc := not FOldSortDesc
662 ASortType := LogSortType;
663 Self.Sort(LogCompare);
664 FOldSortColumn := ASortType;
665 FOldSortDesc := ASortDesc;
668 procedure TBottleLogList.XMLLoaded(Sener: TObject);
670 Self.Assign(FXMLThread.List);
671 if Assigned(FOnLoaded) then FOnLoaded(Self);
675 procedure TBottleLogList.XMLLoadFailure(Sender: TObject;
676 const Message: String);
678 if Assigned(FOnLoadFailure) then
679 DoLoadFailure(Message);
684 constructor TLogXMLThread.Create(FileName: String);
686 inherited Create(true);
687 FList := TObjectList.Create(false); // OwnsObject = false (!!)
688 FFileName := FileName;
691 destructor TLogXMLThread.Destroy;
697 procedure TLogXMLThread.DoLoaded;
699 if Assigned(FOnLoaded) then
703 procedure TLogXMLThread.DoLoadFailure;
705 if Assigned(FOnLoadFailure) then
706 FOnLoadFailure(self, FLoadFailureMessage);
709 procedure TLogXMLThread.Execute;
710 var i, j, votes, agrees: integer;
712 ANode, Child: TdomElement;
715 Parser: TXmlToDomParser;
716 Impl: TDomImplementation;
717 Str, mid, channel, script, ghost: String;
720 Impl := TDomImplementation.create(nil);
722 Parser := TXmlToDomParser.create(nil);
723 Parser.DOMImpl := Impl;
726 DOM := Parser.fileToDom(FFileName); //
\82±
\82ê
\82Í
\96¾
\8e¦
\93I
\82ÉFree
\82µ
\82È
\82
\82Ä
\82æ
\82¢
728 if not DOM.validate(nil, erReplace) then
729 raise EXMLFileOpenException.Create('
\97L
\8cø
\82È
\83{
\83g
\83\8b\83\8d\83O
\8c`
\8e®
\82Å
\82Í
\82 \82è
\82Ü
\82¹
\82ñ
\81B');
732 if DocumentElement = nil then
734 FLoadFailureMessage := '
\97L
\8cø
\82È
\8c`
\8e®
\82Å
\82Í
\82 \82è
\82Ü
\82¹
\82ñ
\81B' +
735 '
\83\8b\81[
\83g
\83^
\83O
\82ª
\82 \82è
\82Ü
\82¹
\82ñ';
736 Synchronize(DoLoadFailure);
739 if DocumentElement.nodeName <> 'bottlelog' then
741 FLoadFailureMessage := '
\97L
\8cø
\82È
\8c`
\8e®
\82Å
\82Í
\82 \82è
\82Ü
\82¹
\82ñ
\81B' +
742 'bottlelog
\82ª
\8c©
\82Â
\82©
\82è
\82Ü
\82¹
\82ñ';
743 Synchronize(DoLoadFailure);
746 Str := DocumentElement.getAttribute('version');
749 FLoadFailureMessage := Format('
\97L
\8cø
\82È
\8c`
\8e®
\82Å
\82Í
\82 \82è
\82Ü
\82¹
\82ñ
\81B' +
750 '
\82±
\82Ì
\83\8d\83O
\83t
\83@
\83C
\83\8b\82Ì
\83o
\81[
\83W
\83\87\83\93(%s)
\82Í
\93Ç
\82Ý
\8d\9e\82ß
\82Ü
\82¹
\82ñ', [Str]);
751 Synchronize(DoLoadFailure);
754 for i := 0 to DocumentElement.childNodes.length-1 do
756 if documentElement.childNodes.item(i).nodeType <> ntElement_Node then
758 ANode := documentElement.childNodes.item(i) as TdomElement;
759 if ANode.nodeName <> 'message' then
761 mid := ANode.getAttribute('mid');
768 for j := 0 to ANode.childNodes.length-1 do
770 if ANode.childNodes.item(j).nodeType <> ntElement_Node then
772 Child := ANode.childNodes.item(j) as TdomElement;
773 if Child.nodeName = 'channel' then
774 channel := Trim(Child.textContent)
775 else if Child.nodeName = 'script' then
776 script := Trim(Child.textContent)
777 else if Child.nodeName = 'ghost' then
778 ghost := Trim(Child.textContent)
779 else if Child.nodeName = 'votes' then
780 votes := StrToIntDef(Child.textContent, 0)
781 else if Child.nodeName = 'agrees' then
782 agrees := StrToIntDef(Child.textContent, 0)
783 else if Child.nodeName = 'date' then
784 TryStrToDateTime(Trim(Child.textContent), Time);
786 Item := TLogItem.Create(ltBottle, mid, channel, script, ghost, time);
788 Item.Agrees := agrees;
789 Item.State := lsOpened;
796 Synchronize(DoLoaded);
799 on E: EParserException do
801 FLoadFailureMessage := 'XML
\89ð
\90Í
\83G
\83\89\81[
\81B' + E.Message;
802 Synchronize(DoLoadFailure);
807 FLoadFailureMessage := 'XML
\83I
\81[
\83v
\83\93\8e\9e\82É
\83G
\83\89\81[
\82ª
\94
\90¶
\82µ
\82Ü
\82µ
\82½
\81B' +
809 Synchronize(DoLoadFailure);
814 Parser.DOMImpl.freeDocument(DOM);
822 procedure TLogXMLThread.SetOnLoaded(const Value: TNotifyEvent);
827 procedure TLogXMLThread.SetOnLoadFailure(const Value: TBottleLogLoadFailureEvent);
829 FOnLoadFailure := Value;