OSDN Git Service

This commit was manufactured by cvs2svn to create branch 'Bb55'.
[gikonavigoeson/gikonavi.git] / RoundData.pas
1 unit RoundData;
2
3 interface
4
5 uses
6         Windows, Messages, SysUtils, Classes,
7         GikoSystem, BoardGroup;
8
9 type
10         TGikoRoundType = (grtBoard, grtItem);
11         TRoundItem = class;
12
13         TRoundList = class(TObject)
14         private
15         FOldFileRead: Boolean;
16                 FBoardList: TList;
17                 FItemList: TList;
18                 function GetCount(RoundType: TGikoRoundType): Integer;
19                 function GetRoundItem(Index: Integer; RoundType: TGikoRoundType): TRoundItem;
20                 function ParseRoundBoardLine(Line: string):             Boolean;
21                 function ParseRoundThreadLine(Line: string):    Boolean;
22                 function ParseOldRoundBoardLine(Line: string):  Boolean;
23                 function ParseOldRoundThreadLine(Line: string): Boolean;
24         public
25                 RoundNameList: TStringList;
26
27                 constructor Create;
28                 destructor Destroy; override;
29                 function Add(Board: TBoard): Integer; overload;
30                 function Add(ThreadItem: TThreadItem): Integer; overload;
31                 procedure Delete(Board: TBoard); overload;
32                 procedure Delete(ThreadItem: TThreadItem); overload;
33         procedure Delete(URL: string; RoundType: TGikoRoundType); overload;
34                 procedure Clear;
35                 function Find(Board: TBoard): Integer; overload;
36                 function Find(ThreadItem: TThreadItem): Integer; overload;
37         function Find(URL: string; RoundType: TGikoRoundType): Integer; overload;
38                 property Count[RoundType: TGikoRoundType]: Integer read GetCount;
39         property OldFileRead: Boolean read FOldFileRead;
40                 property Items[Index: integer; RoundType: TGikoRoundType]: TRoundItem read GetRoundItem;
41                 procedure LoadRoundBoardFile;
42         procedure LoadRoundThreadFile;
43                 procedure SaveRoundFile;
44
45         procedure URLReplace(oldURLs: TStringList; newURLs :TStringList);
46         end;
47
48         TRoundItem = class(TObject)
49         private
50                 FItem           : TObject;
51                 FRoundType: TGikoRoundType;
52                 FTmpURL : string;
53                 FBoolData: Boolean;             //\82¢\82ë\82¢\82ë\8eg\82¤\82å\82£
54                 function GetBoardTitle : string;
55                 function GetThreadTitle : string;
56                 function GetURL : string;
57                 function GetFileName : string;
58         //! \8f\84\89ñ\96¼\8eæ\93¾
59         function GetRoundName : string;
60         public
61                 constructor Create;
62                 property Item : TObject read FItem;
63                 property RoundName: string read GetRoundName;
64                 property RoundType: TGikoRoundType read FRoundType write FRoundType;
65                 property URL : string read GetURL;
66                 property TmpURL : string read FTmpURL write FTmpURL;
67                 property BoardTitle: string read GetBoardTitle;
68                 property ThreadTitle: string read GetThreadTitle;
69                 property FileName: string read GEtFileName;
70                 property BoolData: Boolean read FBoolData write FBoolData;
71         end;
72
73 var
74         RoundList: TRoundList;
75
76 implementation
77 const
78         ROUND_BOARD_FILENAME: string = 'RoundBoard.2ch';        //\82 \82Æ\82ÅBoardGroup\82Ö\88Ú\93®
79         ROUND_ITEM_FILENAME: string  = 'RoundItem.2ch';         //\93¯\8fã
80         ROUND_INDEX_VERSION: string = '2.00';
81     ERROR_BOARD_FILENAME: string = 'ErrorBoard.2ch'; //Error\8ds\82ð\95Û\8aÇ\82·\82é
82     ERROR_ITEM_FILENAME: string = 'ErrorItem.2ch'; //Error\8ds\82ð\95Û\8aÇ\82·\82é
83 //! \8f\84\89ñ\83A\83C\83e\83\80\83R\83\93\83X\83g\83\89\83N\83^
84 constructor TRoundItem.Create;
85 begin
86         inherited Create;
87 end;
88 //! \94Â\96¼\8eæ\93¾
89 function TRoundItem.GetBoardTitle : string;
90 begin
91         Result := '';
92         if( Self.FItem <> nil) then begin
93                 if( Self.FItem is TBoard) then begin
94                         Result := TBoard(Self.FItem).Title;
95                 end else if( Self.FItem is TThreadItem) then begin
96                         Result := TThreadItem(Self.FItem).ParentBoard.Title;
97                 end;
98         end;
99 end;
100 //! \83X\83\8c\83b\83h\96¼\8eæ\93¾
101 function TRoundItem.GetThreadTitle : string;
102 begin
103         Result := '';
104         if( Self.FItem <> nil) then begin
105                 if( Self.FItem is TThreadItem) then begin
106                         Result := TThreadItem(Self.FItem).Title;
107                 end;
108         end;
109 end;
110 //! URL\8eæ\93¾
111 function TRoundItem.GetURL      : string;
112 begin
113         Result := '';
114         if( Self.FItem <> nil) then begin
115                 if( Self.FItem is TBoard) then begin
116                         Result := TBoard(Self.FItem).URL;
117                 end else if( Self.FItem is TThreadItem) then begin
118                         Result := TThreadItem(Self.FItem).URL;
119                 end;
120         end;
121 end;
122 //! \83X\83\8c\83b\83h\82Ì\83t\83@\83C\96¼\8eæ\93¾
123 function TRoundItem.GetFileName : string;
124 begin
125         Result := '';
126         if( Self.FItem <> nil) then begin
127                 if( Self.FItem is TThreadItem) then begin
128                         Result := TThreadItem(Self.FItem).FileName;
129                 end;
130         end;
131 end;
132 //! \8f\84\89ñ\96¼\8eæ\93¾
133 function TRoundItem.GetRoundName : string;
134 begin
135         Result := '';
136         if( Self.FItem <> nil) then begin
137                 if( Self.FItem is TBoard) then begin
138                         Result := TBoard(Self.FItem).RoundName;
139                 end else if( Self.FItem is TThreadItem) then begin
140                         Result := TThreadItem(Self.FItem).RoundName;
141                 end;
142         end;
143 end;
144 //! \8f\84\89ñ\83\8a\83X\83g\83R\83\93\83X\83g\83\89\83N\83^
145 constructor TRoundList.Create;
146 begin
147         inherited;
148         FBoardList := TList.Create;
149         FItemList := TList.Create;
150         RoundNameList := TStringList.Create;
151         RoundNameList.Sorted := True;
152         RoundNameList.Duplicates := dupIgnore;
153     FOldFileRead := false;
154 end;
155 //! \8f\84\89ñ\83\8a\83X\83g\83f\83X\83g\83\89\83N\83^
156 destructor TRoundList.Destroy;
157 begin
158         RoundNameList.Free;
159         Clear;
160         FBoardList.Free;
161         FItemList.Free;
162         //inherited;
163 end;
164 //! \8f\84\89ñ\97\\96ñ\92Ç\89Á\81i\94Â\81j
165 function TRoundList.Add(Board: TBoard): Integer;
166 var
167         idx: Integer;
168         Item: TRoundItem;
169 begin
170     Result := -1;
171         idx := Find(Board);
172         if idx = -1 then begin
173                 Item := TRoundItem.Create;
174                 Item.FItem := Board;
175 //              Item.BBSType := gbt2ch; //\82Æ\82è\82 \82¦\82¸
176                 Item.RoundType := grtBoard;
177                 Result := FBoardList.Add(Item);
178         end;
179 end;
180 //! \8f\84\89ñ\97\\96ñ\92Ç\89Á\81i\83X\83\8c\83b\83h\81j
181 function TRoundList.Add(ThreadItem: TThreadItem): Integer;
182 var
183         idx: Integer;
184         Item: TRoundItem;
185 begin
186     Result := -1;
187         idx := Find(ThreadItem);
188         if idx = -1 then begin
189                 Item := TRoundItem.Create;
190                 Item.FItem := ThreadItem;
191 //              Item.BBSType := gbt2ch; //\82Æ\82è\82 \82¦\82¸
192                 Item.RoundType := grtItem;
193                 Result := FItemList.Add(Item);
194         end;
195 end;
196 //! \8f\84\89ñ\97\\96ñ\8dí\8f\9c\81i\94Â\81j
197 procedure TRoundList.Delete(Board: TBoard);
198 var
199         idx: Integer;
200 begin
201         idx := Find(Board);
202         if idx <> -1 then begin
203                 TBoard(TRoundItem(FBoardList[idx]).FItem).RoundName := '';
204                 TRoundItem(FBoardList[idx]).Free;
205                 FBoardList.Delete(idx);
206         end;
207 end;
208 //! \8f\84\89ñ\97\\96ñ\8dí\8f\9c\81i\83X\83\8c\83b\83h\81j
209 procedure TRoundList.Delete(ThreadItem: TThreadItem);
210 var
211         idx: Integer;
212 begin
213         idx := Find(ThreadItem);
214         if idx <> -1 then begin
215         TThreadItem(TRoundItem(FItemList[idx]).FItem).RoundName := '';
216                 TRoundItem(FItemList[idx]).Free;
217                 FItemList.Delete(idx);
218         end;
219 end;
220 //! \8f\84\89ñ\97\\96ñ\8fÁ\8b\8e
221 procedure TRoundList.Clear;
222 var
223         i: Integer;
224 begin
225         for i := FBoardList.Count - 1 downto 0 do begin
226         if FBoardList[i] <> nil then
227                         TRoundItem(FBoardList[i]).Free;
228                 FBoardList.Delete(i);
229         end;
230     FBoardList.Capacity := FBoardList.Count;
231         for i := FItemList.Count - 1 downto 0 do begin
232         if FItemList[i] <> nil then
233                         TRoundItem(FItemList[i]).Free;
234                 FItemList.Delete(i);
235         end;
236     FItemList.Capacity := FItemList.Count;
237 end;
238 //! \8f\84\89ñ\97\\96ñ\8c\9f\8dõ\81i\94Â\81j
239 function TRoundList.Find(Board: TBoard): Integer;
240 var
241         i: Integer;
242         Item: TRoundItem;
243 begin
244         Result := -1;
245         for i := 0 to FBoardList.Count - 1 do begin
246                 Item := TRoundItem(FBoardList[i]);
247                 if Item.FRoundType <> grtBoard then Continue;
248                 if Item.FItem = Board then begin
249                         Result := i;
250                         Exit;
251                 end;
252         end;
253 end;
254 //! \8f\84\89ñ\97\\96ñ\8c\9f\8dõ\81i\83X\83\8c\83b\83h\81j
255 function TRoundList.Find(ThreadItem: TThreadItem): Integer;
256 var
257         i: Integer;
258         Item: TRoundItem;
259 begin
260         Result := -1;
261         for i := 0 to FItemList.Count - 1 do begin
262                 Item := TRoundItem(FItemList[i]);
263                 if Item.FRoundType <> grtItem then Continue;
264                 if Item.FItem = ThreadItem then begin
265                         Result := i;
266                         Exit;
267                 end;
268         end;
269 end;
270 //! \8f\84\89ñ\97\\96ñ\8c\9f\8dõ\81iURL\81{\83A\83C\83e\83\80\83^\83C\83v\81j
271 function TRoundList.Find(URL: string; RoundType: TGikoRoundType): Integer;
272 var
273         i: Integer;
274         Item: TRoundItem;
275 begin
276         Result := -1;
277     if RoundType = grtItem then begin
278                 for i := 0 to FItemList.Count - 1 do begin
279                         Item := TRoundItem(FItemList[i]);
280                         if Item.FRoundType <> RoundType then Continue;
281                         if Item.URL = URL then begin
282                                 Result := i;
283                                 Exit;
284                         end;
285                 end;
286         end else begin
287                 for i := 0 to FBoardList.Count - 1 do begin
288                         Item := TRoundItem(FBoardList[i]);
289                         if Item.FRoundType <> RoundType then Continue;
290                         if Item.URL = URL then begin
291                                 Result := i;
292                                 Exit;
293                         end;
294                 end;
295     end;
296 end;
297 //! \8f\84\89ñ\97\\96ñ\8dí\8f\9c\81iURL\81{\83A\83C\83e\83\80\83^\83C\83v\81j
298 procedure TRoundList.Delete(URL: string; RoundType: TGikoRoundType);
299 var
300         idx: Integer;
301         Item: TRoundItem;
302     board: TBoard;
303     threadItem: TThreadItem;
304 begin
305         idx := Find(URL, RoundType);
306         if idx <> -1 then begin
307
308         if RoundType = grtBoard then begin
309                         Item := TRoundItem(FBoardList[idx]);
310                         board := TBoard(Item);
311                         Item.Free;
312                         FBoardList.Delete(idx);
313                         if board <> nil then begin
314                                 board.Round := False;
315                                 board.RoundName := '';
316                         end;
317                 end else begin
318                         Item := TRoundItem(FItemList[idx]);
319                         threadItem := TThreadItem(Item.FItem);
320                         Item.Free;
321                         FItemList.Delete(idx);
322
323             if threadItem <> nil then begin
324                     threadItem.Round := false;
325                 threadItem.RoundName := '';
326             end;
327         end;
328         end;
329 end;
330 //! \8f\84\89ñ\97\\96ñ\90\94\8eæ\93¾
331 function TRoundList.GetCount(RoundType: TGikoRoundType): Integer;
332 begin
333         Result := 0;
334         if RoundType = grtBoard then
335                 Result := FBoardList.Count
336         else if RoundType = grtItem then
337                 Result := FItemList.Count;
338 end;
339 //! \8f\84\89ñ\97\\96ñ\8eæ\93¾
340 function TRoundList.GetRoundItem(Index: Integer; RoundType: TGikoRoundType): TRoundItem;
341 begin
342         Result := nil;
343         if RoundType = grtBoard then begin
344                 if (Index >= 0) and (Index < FBoardList.Count) then
345                         Result := TRoundItem(FBoardList[Index]);
346         end else if RoundType = grtItem then begin
347                 if (Index >= 0) and (Index < FItemList.Count) then
348                         Result := TRoundItem(FItemList[Index]);
349         end;
350 end;
351 //! \83{\81[\83h\8f\84\89ñ\97\\96ñ\83t\83@\83C\83\8b\93Ç\82Ý\8d\9e\82Ý
352 procedure TRoundList.LoadRoundBoardFile;
353 var
354         i: Integer;
355         sl: TStringList;
356         FileName, bFileName: string;
357         errorSl: TStringList;
358         errorFileName: string;
359         delCount: Integer;
360 begin
361         sl := TStringList.Create;
362         errorSl := TStringList.Create;
363         errorSl.Duplicates := dupIgnore;
364         try
365                 //\83{\81[\83h\8f\84\89ñ\83t\83@\83C\83\8b\93Ç\82Ý\8d\9e\82Ý
366                 FileName := GikoSys.GetConfigDir + ROUND_BOARD_FILENAME;
367                 bFileName := GikoSys.GetConfigDir + '~' + ROUND_BOARD_FILENAME;
368                 //\83G\83\89\81[\8ds\95Û\91\83t\83@\83C\83\8b\93Ç\82Ý\8d\9e\82Ý
369                 errorFileName := GikoSys.GetConfigDir + ERROR_BOARD_FILENAME;
370
371                 if FileExists(FileName) then begin
372                         sl.LoadFromFile(FileName);
373                         if FileExists(bFileName) then
374                                 DeleteFile(bFileName);
375                         //\83o\83b\83N\83A\83b\83v\97p\82Ì\83t\83@\83C\83\8b\82ð\8dì\90¬\82·\82é
376                         sl.SaveToFile(bFileName);
377                         if FileExists(errorFileName) then begin
378                                 try
379                         errorSl.LoadFromFile(errorFileName);
380                 except
381                 end;
382             end;
383             //Item := TRoundItem.Create;
384             delCount := 0;
385             //\82P\8ds\96Ú\82Í\83o\81[\83W\83\87\83\93
386                         if sl[0] = ROUND_INDEX_VERSION then begin
387                                 for i := 1 to sl.Count - 1 do begin
388                                         if not ParseRoundBoardLine(sl[i - delCount]) then begin
389                                                 errorSl.Add( sl[i - delCount] );
390                         sl.Delete(i- delCount);
391                         Inc(delCount);
392                     end;
393                                 end;
394             end else begin
395                 if FOldFileRead then begin  //\83M\83R\83i\83r\96{\91Ì\82ª\83{\81[\83h\83t\83@\83C\83\8b\82ð\82æ\82Ý\82Æ\82Á\82½\8cã\82\82á\82È\82¢\82Æ\83N\83\89\83b\83V\83\85\82·\82é\82Ì\82Å
396                                         for i := 1 to sl.Count - 1 do begin
397                                                 if not ParseOldRoundBoardLine(sl[i - delCount]) then begin
398                                                         errorSl.Add( sl[i- delCount] );
399                                 sl.Delete(i- delCount);
400                             Inc(delCount);
401                         end;
402                                         end;
403                 end else
404                         FOldFileRead := true;
405             end;
406                 end;
407         if errorSl.Count > 0 then
408                 errorSl.SaveToFile(errorFileName);
409         finally
410         errorSl.Free;
411                 sl.Free;
412         end;
413 end;
414 //! \83X\83\8c\83b\83h\8f\84\89ñ\97\\96ñ\83t\83@\83C\83\8b\93Ç\82Ý\8d\9e\82Ý
415 procedure TRoundList.LoadRoundThreadFile;
416 var
417         i: Integer;
418         sl: TStringList;
419         FileName, bFileName: string;
420     errorSl: TStringList;
421     errorFileName: string;
422     delCount: Integer;
423 begin
424     errorSl := TStringList.Create;
425         errorSl.Duplicates := dupIgnore;
426         sl := TStringList.Create;
427         try
428                 //\83X\83\8c\8f\84\89ñ\83t\83@\83C\83\8b\93Ç\82Ý\8d\9e\82Ý
429                 FileName := GikoSys.GetConfigDir + ROUND_ITEM_FILENAME;
430                 bFileName := GikoSys.GetConfigDir + '~' + ROUND_ITEM_FILENAME;
431                 //\83G\83\89\81[\8ds\95Û\91\83t\83@\83C\83\8b\93Ç\82Ý\8d\9e\82Ý
432         errorFileName := GikoSys.GetConfigDir + ERROR_ITEM_FILENAME;
433                 if FileExists(FileName) then begin
434                         sl.LoadFromFile(FileName);
435                         if FileExists(bFileName) then
436                                 DeleteFile(bFileName);
437                         sl.SaveToFile(bFileName);
438                         if FileExists(errorFileName) then begin
439                 try
440                         errorSl.LoadFromFile(errorFileName);
441                 except
442                 end;
443             end;
444             //Item := TRoundItem.Create;
445             delCount := 0;
446                         //\82P\8ds\96Ú\82Í\83o\81[\83W\83\87\83\93
447             if sl[0] = ROUND_INDEX_VERSION then begin
448                                 for i := 1 to sl.Count - 1 do begin
449                                         if not ParseRoundThreadLine(sl[i - delCount]) then begin
450                                                 errorSl.Add(sl[i - delCount]);
451                         sl.Delete(i - delCount);
452                         Inc(delCount);
453                     end;
454                 end;
455                         end else begin
456                                 LoadRoundBoardFile;
457                                 for i := 1 to sl.Count - 1 do begin
458                                         if not ParseOldRoundThreadLine(sl[i - delCount]) then begin
459                                                 errorSl.Add(sl[i - delCount]);
460                         sl.Delete(i - delCount);
461                         Inc(delCount);
462                     end;
463                                 end;
464             end;
465             if errorSl.Count > 0 then
466                 errorSl.SaveToFile(errorFileName);
467                 end;
468         finally
469                 errorSl.Free;
470                 sl.Free;
471         end;
472 end;
473 //! \8f\84\89ñ\97\\96ñ\83t\83@\83C\83\8b\95Û\91
474 procedure TRoundList.SaveRoundFile;
475 var
476         i: integer;
477         FileName: string;
478         sl: TStringList;
479         s: string;
480         Item: TRoundItem;
481 begin
482         GikoSys.ForceDirectoriesEx(GikoSys.GetConfigDir);
483
484         sl := TStringList.Create;
485         try
486                 FileName := GikoSys.GetConfigDir + ROUND_BOARD_FILENAME;
487                 sl.Add(ROUND_INDEX_VERSION);
488                 for i := 0 to FBoardList.Count - 1 do begin
489                         Item := TRoundItem(FBoardList[i]);
490                         try
491                                 if Item.TmpURL <> '' then begin
492                                         s := Item.TmpURL + #1
493                                                  + Item.BoardTitle + #1
494                                                  + Item.RoundName;
495                                 end else begin
496                                         s := Item.URL + #1
497                                                  + Item.BoardTitle + #1
498                                                  + Item.RoundName;
499                                 end;
500                                 sl.Add(s);
501                         except
502                         end;
503                 end;
504                 sl.SaveToFile(FileName);
505                 sl.Clear;
506                 FileName := GikoSys.GetConfigDir + ROUND_ITEM_FILENAME;
507                 sl.Add(ROUND_INDEX_VERSION);
508                 for i := 0 to FItemList.Count - 1 do begin
509                         Item := TRoundItem(FItemList[i]);
510                         try
511                                 if Item.TmpURL <> '' then begin
512                                         s := Item.TmpURL + #1
513                                          + Item.BoardTitle + #1
514                                          + Item.FileName + #1
515                                          + Item.ThreadTitle + #1
516                                          + Item.RoundName;
517                                 end else begin
518                                         s := Item.URL + #1
519                                          + Item.BoardTitle + #1
520                                          + Item.FileName + #1
521                                          + Item.ThreadTitle + #1
522                                          + Item.RoundName;
523                                 end;
524                                 sl.Add(s);
525                         except
526                         end;
527                 end;
528                 sl.SaveToFile(FileName);
529         finally
530                 sl.Free;
531         end;
532 end;
533 function TRoundList.ParseRoundBoardLine(Line: string): Boolean;
534 var
535         s: string;
536         roundname: string;
537         board: TBoard;
538         i: Integer;
539 begin
540         //Result := TRoundItem.Create;
541         //Result.ThreadTitle := '';
542         //Result.FileName := '';
543         //Result.RoundType := grtBoard;
544         board := nil;
545         for i := 0 to 2 do begin
546                 s := GikoSys.GetTokenIndex(Line, #1, i);
547                 try
548                         case i of
549                                 0:
550                                 begin
551                                         board := BBSsFindBoardFromURL(s);
552                                         //Result.URL := s;
553                                 end;
554                                 //1: Result.BoardTitle := s;
555                                 2: roundname := s;
556                         end;
557                 except
558                         Result := false;
559                         Exit;
560                 end;
561         end;
562         if( board <> nil ) then begin
563                 if not board.Round then begin
564                         board.RoundName := roundname;
565                         RoundNameList.Add(roundname);
566                         //RoundNameList.Find(roundname, i);
567                         //board.RoundName := PChar(RoundNameList[i]);
568                         board.Round := true;
569                 end;
570                 Result := true;
571         end else begin
572                 Result := false;
573         end;
574 end;
575
576 function TRoundList.ParseRoundThreadLine(Line: string): Boolean;
577 var
578         s: string;
579         roundname: string;
580         threadItem: TThreadItem;
581         i: Integer;
582 //    threadItem: TThreadItem;
583 begin
584         //Result := TRoundItem.Create;
585         //Result.RoundType := grtItem;
586         threadItem := nil;
587         for i := 0 to 4 do begin
588                 s := GikoSys.GetTokenIndex(Line, #1, i);
589                 try
590                         case i of
591                                 0:
592                                 begin
593                                         //Result.URL := s;
594                                         threadItem := BBSsFindThreadFromURL( s );
595                                         //if threadItem <> nil then begin
596                                         //    BoardList.Add( threadItem.ParentBoard.URL );
597                                         //end;
598                                 end;
599                                 //1: Result.BoardTitle := s;
600                                 //2: Result.FileName := s;
601                                 //3: Result.ThreadTitle := s;
602                                 4: roundname := s;
603                         end;
604                 except
605                         Result := false;
606                         Exit;
607                 end;
608         end;
609         if( threadItem <> nil ) then begin
610                 if not threadItem.Round then begin
611                         threadItem.RoundName := roundname;
612                         RoundNameList.Add(roundname);
613                         //RoundNameList.Find(roundname, i);
614                         //threadItem.RoundName := PChar(RoundNameList[i]);
615                         threadItem.Round := True;
616                 end;
617                 Result := true;
618         end else begin
619                 Result := false;
620         end;
621 end;
622
623 function TRoundList.ParseOldRoundBoardLine(Line: string): Boolean;
624         var
625         i: Integer;
626         s: string;
627         roundname: string;
628         board: TBoard;
629 begin
630         //Result := TRoundItem.Create;
631         //Result.ThreadTitle := '';
632         //Result.FileName := '';
633         //Result.RoundType := grtBoard;
634         board := nil;
635         for i := 0 to 2 do begin
636                 s := GikoSys.GetTokenIndex(Line, #1, i);
637                 try
638                         case i of
639                                 0:
640                                 begin
641                                         board := BBSs[ 0 ].FindBBSID( s );
642                                         if board = nil then begin
643                                                 raise Exception.Create('\82±\82Ì\8f\84\89ñ\82Í\93Ç\82Ý\8d\9e\82ß\82È\82¢\82æ\81i\91½\95ª\8aO\95\94\94Â\81j');
644                                         end;
645                                 end;
646                                 //1: Result.FBoardTitle := s;
647                                 2: roundname := s;
648                         end;
649                 except
650                         Result := false;
651                         Exit;
652                 end;
653         end;
654         if( board <> nil ) then begin
655                 if not board.Round then begin
656                         board.RoundName := roundname;
657                         RoundNameList.Add(roundname);
658                         //RoundNameList.Find(roundname, i);
659                         //board.RoundName := PChar(RoundNameList[i]);
660                         board.Round := true;
661                 end;
662                 Result := true;
663         end else begin
664                 Result := false;
665         end;
666 end;
667
668 function TRoundList.ParseOldRoundThreadLine(Line: string): Boolean;
669         var
670         i: Integer;
671         s: string;
672         roundname : string;
673         buf: string;
674         board: TBoard;
675         threadItem: TThreadItem;
676         bbsID: string;
677 begin
678 //      Result := TRoundItem.Create;
679 //      Result.RoundType := grtItem;
680         threadItem := nil;
681         for i := 0 to 4 do begin
682                 s := GikoSys.GetTokenIndex(Line, #1, i);
683                 try
684                         case i of
685                                 0: bbsID := s;
686                                 //1: Result.BoardTitle := s;
687                                 2:
688                                 begin
689                                         //Result.FileName := s;
690                                         board := BBSs[ 0 ].FindBBSID(bbsID);
691                                         if board <> nil then begin
692                                                 buf := Copy(board.GetSendURL,1,LastDelimiter('/', board.GetSendURL)-1);
693                                                 buf := buf + '/read.cgi/'+ board.BBSID+ '/' +ChangeFileExt(s,'') + '/l50';
694                                                 threadItem := BBSsFindThreadFromURL(buf);
695                                         end else begin
696                                                 raise Exception.Create('\82±\82Ì\8f\84\89ñ\82Í\93Ç\82Ý\8d\9e\82ß\82È\82¢\82æ');
697                                         end;
698                                 end;
699                                 //3: Result.ThreadTitle := s;
700                                 4: roundname := s;
701                         end;
702                 except
703                         Result := false;
704                         Exit;
705                 end;
706         end;
707         if( threadItem <> nil ) then begin
708                 if not threadItem.Round then begin
709                         threadItem.RoundName := roundname;
710                         RoundNameList.Add(roundname);
711                         //RoundNameList.Find(roundname, i);
712                         //threadItem.RoundName := PChar(RoundNameList[i]);
713                         threadItem.Round := true;
714                 end;
715                 Result := true;
716         end else begin
717                 Result := false;
718         end;
719
720 end;
721 procedure  TRoundList.URLReplace(oldURLs: TStringList; newURLs :TStringList);
722 var
723         i: Integer;
724         j: Integer;
725         tempString: string;
726         tmpURL: string;
727         oldHost: string;
728         oldBoardName: string;
729         newHost: string;
730         newBoardName: string;
731 begin
732         if oldURLs.Count <> newURLs.Count then
733                 Exit;
734         //\82±\82±\82©\82ç\81ABoard\82ÌURL\82Ì\95Ï\8dX
735         for j :=0 to oldURLs.Count - 1 do begin
736                 for i :=0 to FBoardList.Count - 1 do begin
737                         if TRoundItem(FBoardList[i]).URL = oldURLs[j] then
738                                 TRoundItem(FBoardList[i]).TmpURL := newURLs[j];
739                 end;
740         end;
741         //\82±\82±\82Ü\82Å\81ABoard\82ÌURL\82Ì\95Ï\8dX
742
743         //\82±\82±\82©\82ç\81AThread\82ÌURL\82Ì\95Ï\8dX
744         //\96Ê\93|\82¾\82¯\82Çthread\82Í\82»\82ê\82¼\82êURL\82ð\83`\83\83\83b\83N\82µ\82È\82ª\82ç\82â\82Á\82Ä\82©\82È\82«\82á\82¢\82¯\82È\82¢\81B
745         for i := 0 to oldURLs.Count - 1 do begin
746                 tmpURL                  := Copy(oldURLs[i], 1, Length(oldURLs[i]) -1);
747                 oldHost                 := Copy(tmpURL, 1, LastDelimiter('/', tmpURL) );
748                 oldBoardName    := Copy(tmpURL, LastDelimiter('/', tmpURL), Length(tmpURL) ) + '/';
749                 tmpURL                  := Copy(newURLs[i], 1, Length(newURLs[i]) -1);
750                 newHost                 := Copy(tmpURL, 1, LastDelimiter('/', tmpURL) );
751                 newBoardName    := Copy(tmpURL, LastDelimiter('/', tmpURL), Length(tmpURL) ) + '/';
752
753                 for j := 0 to FItemList.Count - 1 do begin
754                         tempString := TRoundItem(FItemList[j]).URL;
755                         if ( AnsiPos(oldBoardName, tempString) <> 0 ) and ( AnsiPos(oldHost, tempString ) <> 0 ) then begin
756                                 tempString := StringReplace(tempString, oldHost, newHost,[]);
757                                 TRoundItem(FItemList[j]).TmpURL := tempString;
758                         end;
759                 end;
760         end;
761         //\82±\82±\82Ü\82Å\81AThread\82ÌURL\82Ì\95Ï\8dX
762
763 end;
764
765 end.