Develop and Download Open Source Software

Browse CVS Repository

Contents of /gikonavigoeson/gikonavi/ExternalBoardPlugInMain.pas

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.13 - (show annotations) (download) (as text)
Mon Sep 6 16:41:17 2004 UTC (19 years, 7 months ago) by h677
Branch: MAIN
CVS Tags: v1_49_0_540, v1_49_0_542, v1_49_0_545, v1_49_0_544, v1_49_0_546, v1_49_0_541
Changes since 1.12: +5 -1 lines
File MIME type: text/x-pascal
、キ、ソ、鬢ミJBBSヘム、ホイ盞??ー・チ・ァ・テ・ッ、ホ・ウ。シ・ノトノイテ

1 unit ExternalBoardPlugInMain;
2
3 interface
4
5 uses
6 Windows, Classes, SysUtils, Menus,
7 IdHTTP, IdComponent, IdGlobal, IdException,
8 AbonUnit;
9
10 type
11
12 // 繝?繧ヲ繝ウ繝ュ繝シ繝峨′謌仙粥縺励◆縺九←縺?°
13 TDownloadState = (dsWait, dsWork, dsComplete, dsDiffComplete, dsNotModify, dsAbort, dsError);
14
15 // 謖?ョ壹@縺 URL 繧偵%縺ョ繝励Λ繧ー繧、繝ウ縺ァ蜿励¢莉倥¢繧九°縺ゥ縺?°
16 TAcceptType = (atNoAccept, atBBS, atBoard, atThread);
17
18 // 繝。繝九Η繝シ繝上Φ繝峨Λ
19 TMenuHandler = procedure(
20 inHandle : HMENU // 繝。繝九Η繝シ繝上Φ繝峨Ν
21 ); stdcall;
22
23 // *************************************************************************
24 // 繝励Λ繧ー繧、繝ウ縺?豁」縺励¥)繝ュ繝シ繝峨&繧後◆
25 // *************************************************************************
26 TOnLoad = procedure (
27 inInstance : DWORD // 繝励Λ繧ー繧、繝ウ縺ョ繧、繝ウ繧ケ繧ソ繝ウ繧ケ
28 ); stdcall;
29
30 // *************************************************************************
31 // 繝励Λ繧ー繧、繝ウ縺ョ繝舌?繧ク繝ァ繝ウ
32 // *************************************************************************
33 TOnVersionInfo = procedure(
34 var outAgent : PChar; // 繝舌?繧ク繝ァ繝ウ繧剃ク?蛻?性縺セ縺ェ縺?エ皮イ九↑蜷咲ァー
35 var outMajor : DWORD; // 繝。繧ク繝」繝シ繝舌?繧ク繝ァ繝ウ
36 var outMinor : DWORD; // 繝槭う繝翫?繝舌?繧ク繝ァ繝ウ
37 var outRelease : PChar; // 繝ェ繝ェ繝シ繧ケ谿オ髫主錐
38 var outRevision : DWORD // 繝ェ繝薙ず繝ァ繝ウ繝翫Φ繝舌?
39 ); stdcall;
40
41 // *************************************************************************
42 // 謖?ョ壹@縺 URL 繧偵%縺ョ繝励Λ繧ー繧、繝ウ縺ァ蜿励¢莉倥¢繧九°縺ゥ縺?°
43 // *************************************************************************
44 TOnAcceptURL = function(
45 inURL : PChar // 蛻、譁ュ繧剃サー縺?〒縺?k URL
46 ): TAcceptType; stdcall; // URL 縺ョ遞ョ鬘?/span>
47
48 // *************************************************************************
49 // 繝。繝九Η繝シ繝上Φ繝峨Λ
50 // *************************************************************************
51 TOnPlugInMenu = procedure(
52 inInstance : DWORD // 繝。繝九Η繝シ繝上Φ繝峨Ν
53 ); stdcall;
54
55 // *************************************************************************
56 // 繧ケ繝ャ荳?隕ァ縺ョ URL 縺九i繧ケ繝ャ繝?ラ縺ョ URL 繧貞ー弱″蜃コ縺?/span>
57 // *************************************************************************
58 TOnListURL2ThreadURL = function(
59 inListURL : PChar; // 繧ケ繝ャ荳?隕ァ繧堤、コ縺励◆ URL
60 inFileName : PChar // 繧ケ繝ャ繝?ラ繝輔ぃ繧、繝ォ蜷?/span>
61 ) : PChar; stdcall; // 繧ケ繝ャ繝?ラ縺ョ URL
62
63
64 function CreateResultString(
65 resultStr : string
66 ) : PChar; stdcall;
67
68 procedure DisposeResultString(
69 resultStr : PChar
70 ); stdcall;
71
72 var
73 socket : TIdHTTP;
74
75 implementation
76
77 uses ExternalBoardManager, ExternalThreadItem, GikoSystem, BoardGroup, Giko;
78
79 // *************************************************************************
80 // 謌サ繧雁?、縺 PChar 縺ァ縺ゅk API 縺ョ繝。繝「繝ェ繧堤「コ菫昴☆繧?/span>
81 // *************************************************************************
82 function CreateResultString(
83 resultStr : string
84 ) : PChar; stdcall;
85 var
86 tmp : PChar;
87 begin
88
89 tmp := PChar( resultStr );
90 GetMem( Result, Length( tmp ) + 1 );
91 Move( tmp^, Result^, Length( tmp ) + 1 );
92
93 end;
94
95 // *************************************************************************
96 // 謌サ繧雁?、縺 PChar 縺ァ縺ゅk API 縺ョ繝。繝「繝ェ繧帝幕謾セ縺吶k
97 // *************************************************************************
98 procedure DisposeResultString(
99 resultStr : PChar
100 ); stdcall;
101 begin
102
103 FreeMem( resultStr );
104
105 end;
106
107 // *************************************************************************
108 // 繝励Ο繧ー繝ゥ繝?譛ャ菴薙?繝舌?繧ク繝ァ繝ウ繧貞叙蠕励☆繧?/span>
109 // *************************************************************************
110 procedure VersionInfo(
111 var outAgent : PChar; // 繝舌?繧ク繝ァ繝ウ繧剃ク?蛻?性縺セ縺ェ縺?エ皮イ九↑蜷咲ァー
112 var outMajor : DWORD; // 繝。繧ク繝」繝シ繝舌?繧ク繝ァ繝ウ
113 var outMinor : DWORD; // 繝槭う繝翫?繝舌?繧ク繝ァ繝ウ
114 var outRelease : PChar; // 繝ェ繝ェ繝シ繧ケ谿オ髫主錐
115 var outRevision : DWORD // 繝ェ繝薙ず繝ァ繝ウ繝翫Φ繝舌?
116 ); stdcall;
117 begin
118
119 {$IFDEF DEBUG}
120 Writeln('ExternalBoardManager.VersionInfo');
121 {$ENDIF}
122 outAgent := CreateResultString( PChar( APP_NAME ) );
123 outMajor := 1;
124 outMinor := 0;
125 outRelease := CreateResultString( PChar( BETA_VERSION_NAME_E ) );
126 outRevision := BETA_VERSION;
127
128 end;
129
130 // *************************************************************************
131 // 繝。繝?そ繝シ繧ク繧定。ィ遉コ縺吶k
132 // *************************************************************************
133 procedure InternalPrint(
134 inMessage : PChar // 繝。繝?そ繝シ繧ク
135 ); stdcall;
136 begin
137
138 GikoForm.AddMessageList( inMessage, nil, gmiWhat );
139
140 end;
141
142 // *************************************************************************
143 // 繝?ヰ繝?げ繝。繝?そ繝シ繧ク繧定。ィ遉コ縺吶k
144 // *************************************************************************
145 procedure InternalDebugPrint(
146 inMessage : PChar // 繝。繝?そ繝シ繧ク
147 ); stdcall;
148 begin
149
150 {$IFDEF DEBUG}
151 Writeln( inMessage );
152 {$ENDIF}
153
154 end;
155
156 // *************************************************************************
157 // 繧ス繧ア繝?ヨ繧貞?譛溷喧縺吶k(髮醍畑髢「謨ー)
158 // *************************************************************************
159 procedure InitializeSocket(
160 inSocket : TIdHTTP
161 );
162 begin
163
164 if inSocket <> nil then begin
165 // 繧、繝吶Φ繝医?險ュ螳?/span>
166 if Assigned( OnWork ) then
167 inSocket.OnWork := OnWork;
168 if Assigned( OnWorkBegin ) then
169 inSocket.OnWorkBegin := OnWorkBegin;
170 if Assigned( OnWorkEnd ) then
171 inSocket.OnWorkEnd := OnWorkEnd;
172
173 // 騾壻ソ。縺ォ髢「縺吶k險ュ螳?/span>
174 inSocket.Request.CustomHeaders.Clear;
175 inSocket.Response.Clear;
176 inSocket.Request.Clear;
177
178 inSocket.Request.UserAgent := GikoSys.GetUserAgent;
179 inSocket.RecvBufferSize := Gikosys.Setting.RecvBufferSize;
180 inSocket.ProxyParams.BasicAuthentication := False;
181 {$IFDEF DEBUG}
182 Writeln('------------------------------------------------------------');
183 {$ENDIF}
184 //inSocket.AllowCookies := False;
185 if GikoSys.Setting.ReadProxy then begin
186 if GikoSys.Setting.ProxyProtocol then
187 inSocket.ProtocolVersion := pv1_1
188 else
189 inSocket.ProtocolVersion := pv1_0;
190 inSocket.ProxyParams.ProxyServer := GikoSys.Setting.ReadProxyAddress;
191 inSocket.ProxyParams.ProxyPort := GikoSys.Setting.ReadProxyPort;
192 inSocket.ProxyParams.ProxyUsername := GikoSys.Setting.ReadProxyUserID;
193 inSocket.ProxyParams.ProxyPassword := GikoSys.Setting.ReadProxyPassword;
194 if GikoSys.Setting.ReadProxyUserID <> '' then
195 inSocket.ProxyParams.BasicAuthentication := True;
196 {$IFDEF DEBUG}
197 Writeln('繝励Ο繧ュ繧キ險ュ螳壹≠繧?#39;);
198 Writeln('繝帙せ繝? ' + GikoSys.Setting.ReadProxyAddress);
199 Writeln('繝昴?繝? ' + IntToStr( GikoSys.Setting.ReadProxyPort ));
200 {$ENDIF}
201 end else begin
202 if GikoSys.Setting.Protocol then
203 inSocket.ProtocolVersion := pv1_1
204 else
205 inSocket.ProtocolVersion := pv1_0;
206 inSocket.ProxyParams.ProxyServer := '';
207 inSocket.ProxyParams.ProxyPort := 80;
208 inSocket.ProxyParams.ProxyUsername := '';
209 inSocket.ProxyParams.ProxyPassword := '';
210 {$IFDEF DEBUG}
211 Writeln('繝励Ο繧ュ繧キ險ュ螳壹↑縺?#39;);
212 {$ENDIF}
213 end;
214 end;
215
216 end;
217
218 // *************************************************************************
219 // 謖?ョ壹@縺 URL 繧偵ム繧ヲ繝ウ繝ュ繝シ繝峨@縺ヲ霑斐☆
220 // *************************************************************************
221 function InternalDownload(
222 inURL : PChar; // 繝?繧ヲ繝ウ繝ュ繝シ繝峨☆繧 URL
223 var ioModified : Double; // 譛?蠕後↓蜿門セ励@縺滓律譎?/span>
224 var outResultData : PChar; // 繝?繧ヲ繝ウ繝ュ繝シ繝峨&繧後◆譁?ュ怜?
225 inRangeStart : DWORD; // 髢句ァ倶ス咲スョ
226 inRangeEnd : DWORD // 邨ゆコ?ス咲スョ
227 ) : Longint; stdcall; // 繝ャ繧ケ繝昴Φ繧ケ繧ウ繝シ繝?/span>
228 var
229 // httpSocket : TIdHTTP;
230 resStream : TMemoryStream;
231 content : string;
232
233 begin
234
235 {$IFDEF DEBUG}
236 Writeln('ExternalBoardManager.InternalDownload');
237 {$ENDIF}
238 // Result := -1;
239
240 socket := TIdHTTP.Create( nil );
241 try
242 InitializeSocket( socket );
243
244 socket.Request.ContentRangeStart := inRangeStart;
245 socket.Request.ContentRangeEnd := inRangeEnd;
246 if (ioModified <> 0) and (ioModified <> ZERO_DATE) then
247 socket.Request.LastModified := ioModified - OffsetFromUTC;
248 if inRangeStart = 0 then
249 socket.Request.AcceptEncoding := 'gzip'
250 else
251 socket.Request.AcceptEncoding := '';
252 socket.Request.Accept := 'text/html';
253
254 resStream := TMemoryStream.Create;
255 try
256 try
257 resStream.Clear;
258 {$IFDEF DEBUG}
259 Writeln('URL: ' + inURL);
260 {$ENDIF}
261 socket.Get( inURL, resStream );
262 {$IFDEF DEBUG}
263 Writeln('蜿門セ励〒萓句、悶↑縺?#39;);
264 {$ENDIF}
265
266 content := GikoSys.GzipDecompress( resStream, socket.Response.ContentEncoding );
267
268 ioModified := socket.Response.LastModified;
269
270 Result := socket.ResponseCode;
271 if (Length( content ) = 0) and (Result = 206) then
272 Result := 304;
273 if ( AnsiPos('http://jbbs.livedoor.com/', inURL) > 0 ) and (Result = 200) then begin
274 if( AnsiPos('STORAGE IN', socket.Response.RawHeaders.Text) > 0 ) then begin
275 Result := 302;
276 end;
277 end;
278 outResultData := CreateResultString( content );
279 except
280 on E: EIdSocketError do begin
281 ioModified := ZERO_DATE;
282 outResultData := nil;
283 Result := socket.ResponseCode;
284 end;
285 on E: EIdConnectException do begin
286 ioModified := ZERO_DATE;
287 outResultData := nil;
288 Result := socket.ResponseCode;
289 //Item.ErrText := E.Message;
290 end;
291 //荳ュ譁ュ縺輔l縺溘→縺阪さ繧ウ縺ォ蜈・繧?/span>
292 on E: EIdClosedSocket do begin
293 ioModified := ZERO_DATE;
294 outResultData := nil;
295 Result := 408; //譌「縺ォ荳?驛ィDL謌仙粥縺励※縺?k縺ィ繝ャ繧ケ繝昴Φ繧ケ繧ウ繝シ繝峨′200縺ョ縺セ縺セ縺ォ
296 //縺ェ縺」縺ヲ縺励∪縺??縺ァ縲∵?遉コ逧?↓繧ィ繝ゥ繝シ繧ウ繝シ繝峨r霑斐☆
297 end;
298 on E: Exception do begin
299 {$IFDEF DEBUG}
300 Writeln('蜿門セ励〒萓句、悶≠繧?#39;);
301 Writeln('E.Message: ' + E.Message);
302 {$ENDIF}
303 ioModified := ZERO_DATE;
304 outResultData := nil;
305 Result := socket.ResponseCode;
306 //Item.ErrText := E.Message;
307 end;
308 end;
309 finally
310 resStream.Free;
311 end;
312
313 finally
314 socket.Free;
315 socket := nil;
316 end;
317
318 end;
319
320 // *************************************************************************
321 // 謖?ョ壹@縺 URL 縺ク繝??繧ソ繧帝?∽ソ。縺吶k
322 // *************************************************************************
323 function InternalPost(
324 inURL : PChar; // 騾∽ソ。縺吶k URL
325 inSource : PChar; // 騾∽ソ。縺吶k蜀?ョケ
326 var outResultData : PChar // 霑斐▲縺ヲ縺阪◆譁?ュ怜?
327 ) : Longint; stdcall; // 繝ャ繧ケ繝昴Φ繧ケ繧ウ繝シ繝?/span>
328 var
329 httpSocket : TIdHTTP;
330 content : string;
331 resStream : TStringStream;
332 sourceStream : TStringStream;
333 tmpURL, Protocol, Host, Path, Document, Port, Bookmark : string;
334 begin
335
336 {$IFDEF DEBUG}
337 Writeln('ExternalBoardManager.InternalPost');
338 {$ENDIF}
339 Result := -1;
340
341 httpSocket := TIdHTTP.Create( nil );
342 try
343 InitializeSocket( httpSocket );
344 tmpURL := string(inURL);
345 GikoSys.ParseURI(tmpURL, Protocol,Host, Path, Document, Port, Bookmark);
346 httpSocket.Request.CustomHeaders.Add('Pragma: no-cache');
347 httpSocket.Request.AcceptLanguage := 'ja';
348 httpSocket.Request.Accept := 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*';
349 httpSocket.Request.ContentType := 'application/x-www-form-urlencoded';
350 httpSocket.Request.Referer := Protocol + '://' + Host;
351 resStream := TStringStream.Create( content );
352 sourceStream := TStringStream.Create( string( inSource ) );
353 try
354 try
355 {$IFDEF DEBUG}
356 Writeln('URL: ' + inURL);
357 Writeln('Source: ' + inSource);
358 {$ENDIF}
359 httpSocket.Post( string( inURL ), sourceStream, resStream );
360 {$IFDEF DEBUG}
361 Writeln('蜿門セ励〒萓句、悶↑縺?#39;);
362 {$ENDIF}
363
364 Result := httpSocket.ResponseCode;
365
366 outResultData := CreateResultString( resStream.DataString );
367 except
368 on E: EIdSocketError do begin
369 outResultData := nil;
370 end;
371 on E: EIdConnectException do begin
372 outResultData := nil;
373 end;
374 on E: Exception do begin
375 {$IFDEF DEBUG}
376 Writeln('蜿門セ励〒萓句、悶≠繧?#39;);
377 Writeln('E.Message: ' + E.Message);
378 {$ENDIF}
379 outResultData := CreateResultString( resStream.DataString );
380 Result := httpSocket.ResponseCode;
381 end;
382 end;
383 finally
384 resStream.Free;
385 sourceStream.Free;
386 end;
387 finally
388 httpSocket.Free;
389 end;
390
391 end;
392
393 // *************************************************************************
394 // ?偵■繧?s縺ュ繧九? dat 蠖「蠑上r繝ュ繝シ繧ォ繝ォ縺ゅ⊂縲懊s縺ォ騾壹☆
395 // *************************************************************************
396
397 function InternalAbon(
398 inDatText : PChar; // 蜷榊燕<>繝。繝シ繝ォ<>譌・莉露D<>譛ャ譁?lt;>[謾ケ陦珪 縺ァ讒区?縺輔l縺溘ユ繧ュ繧ケ繝?/span>
399 inDatPath : PChar // dat 繝輔ぃ繧、繝ォ縺ョ繝輔Ν繝代せ
400
401 ) : PChar; stdcall; // 縺ゅ⊂縲懊s貂医∩縺ョ dat 蠖「蠑上ユ繧ュ繧ケ繝?/span>
402 var
403 datList : TStringList;
404 FileName : String;
405 begin
406
407 datList := TStringList.Create;
408 try
409 datList.Text := string( inDatText );
410 FileName := string( inDatPath );
411 GikoSys.FAbon.IndividualAbon( datList, ChangeFileExt(FileName,'.NG'));
412 GikoSys.FAbon.Execute( datList );
413 GikoSys.FSelectResFilter.Execute( datList );
414
415 Result := CreateResultString( datList.Text );
416 finally
417 datList.Free;
418 end;
419
420
421 end;
422 // *************************************************************************
423 // ?偵■繧?s縺ュ繧九? dat 蠖「蠑上r繝ュ繝シ繧ォ繝ォ縺ゅ⊂縲懊s縺ォ騾壹☆
424 // 縺溘□縺励??シ代Ξ繧ケ縺壹▽
425 // *************************************************************************
426
427 function InternalAbonForOne(
428 inDatText : PChar; // 蜷榊燕<>繝。繝シ繝ォ<>譌・莉露D<>譛ャ譁?lt;>[謾ケ陦珪 縺ァ讒区?縺輔l縺溘ユ繧ュ繧ケ繝?/span>
429 inDatPath : PChar; // dat 繝輔ぃ繧、繝ォ縺ョ繝輔Ν繝代せ
430 inNo : Integer // 隕∵アゅ&繧後◆繝ャ繧ケ逡ェ蜿キ
431 ) : PChar; stdcall; // 縺ゅ⊂縲懊s貂医∩縺ョ dat 蠖「蠑上ユ繧ュ繧ケ繝?/span>
432 var
433 datString : String;
434 FileName : String;
435 begin
436
437 datString := string( inDatText );
438 FileName := string( inDatPath );
439 GikoSys.FAbon.IndividualAbon( datString, ChangeFileExt(FileName,'.NG'), inNo);
440 GikoSys.FAbon.Execute( datString , inNo);
441 GikoSys.FSelectResFilter.Execute( datString , inNo );
442
443 Result := CreateResultString( datString );
444
445 end;
446
447 // *************************************************************************
448 // ?偵■繧?s縺ュ繧九? dat 蠖「蠑 1 陦後r HTML 縺ォ螟画鋤縺吶k
449 // *************************************************************************
450 function InternalDat2HTML(
451 inDatRes : PChar; // 蜷榊燕<>繝。繝シ繝ォ<>譌・莉露D<>譛ャ譁?lt;> 縺ァ讒区?縺輔l縺溘ユ繧ュ繧ケ繝?/span>
452 inResNo : DWORD; // 繝ャ繧ケ逡ェ蜿キ
453 inIsNew : Boolean // 譁ー逹?繝ャ繧ケ縺ェ繧 True
454 ) : PChar; stdcall; // 謨エ蠖「縺輔l縺 HTML
455 var
456 board : TBoard;
457 threadItem : TThreadItem;
458 begin
459
460 // 繝?繝溘?縺ョ繧ッ繝ゥ繧ケ
461 board := TBoard.Create( nil, 'about://dummy/' );
462 threadItem := TThreadItem.Create( nil, 'about://dummy/test/read.cgi/dummy/' );
463 try
464 try
465 board.Add( threadItem );
466
467 Result := ThreadItemDat2HTML( DWORD( threadItem ), inDatRes, inResNo, inIsNew );
468 except
469 Result := nil;
470 end;
471 finally
472 board.Free;
473 end;
474
475 end;
476
477 // *************************************************************************
478 // 繝励Λ繧ー繧、繝ウ繝。繝九Η繝シ縺ォ鬆?岼繧定ソス蜉?
479 // *************************************************************************
480 function AddPlugInMenu(
481 inInstance : DWORD; // 繝励Λ繧ー繧、繝ウ縺ョ繧、繝ウ繧ケ繧ソ繝ウ繧ケ
482 inCaption : PChar // 繝。繝九Η繝シ縺ォ陦ィ遉コ縺吶k譁?ュ怜?
483 ) : HMENU; stdcall; // 繝。繝九Η繝シ繝上Φ繝峨Ν縲∬ソス蜉?縺ォ螟ア謨励@縺溷?エ蜷医? NULL
484 var
485 newItem : TMenuItem;
486 begin
487
488 try
489 newItem := TMenuItem.Create( nil );
490 newItem.Caption := inCaption;
491 newItem.Tag := inInstance;
492 newItem.OnClick := GikoForm.OnPlugInMenuItem;
493 GikoForm.PlugInMenu.Add( newItem );
494
495 Result := newItem.Handle;
496 except
497 Result := 0;
498 end;
499
500 end;
501
502 // *************************************************************************
503 // 繝励Λ繧ー繧、繝ウ繝。繝九Η繝シ縺九i鬆?岼繧貞炎髯、
504 // *************************************************************************
505 procedure RemovePlugInMenu(
506 inHandle : HMENU // 繝。繝九Η繝シ繝上Φ繝峨Ν
507 ); stdcall;
508 var
509 i : Integer;
510 begin
511
512 for i := GikoForm.PlugInMenu.Count - 1 downto 0 do begin
513 if GikoForm.PlugInMenu.Items[ i ].Handle = inHandle then begin
514 GikoForm.PlugInMenu.items[i].Free;
515 //GikoForm.PlugInMenu.Delete( i );
516 Break;
517 end;
518 end;
519
520 end;
521
522 exports
523 CreateResultString,
524 DisposeResultString,
525 VersionInfo,
526 InternalPrint,
527 InternalDebugPrint,
528 InternalDownload,
529 InternalPost,
530 InternalAbon,
531 InternalAbonForOne,
532 InternalDat2HTML,
533 AddPlugInMenu,
534 RemovePlugInMenu;
535
536 end.

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26