MATERIA period 568 から発表された次世代リクエストヘッダ SHIORI/3.0 に移行してみました。正式じゃないのでいつ変更されるとも知れませんが(^-^;)
アップデートが遅れてる理由は、どうにも安定しなかったからで……。あちこち試してる間にバランスが取れたようなので本日更新。
でもいつエンバグするか知れたもんじゃないなぁ(笑)
const AST: function(const S1,S2:String): Boolean= SysUtils.AnsiSameText; function GetString( ID:String ): String; begin if AST( ID, 'name' ) then Result := 'Opration HIINA' else if AST( ID, 'version' ) then Result := GetDllVersion( GhostDescript.KernelLib ) else if AST( ID, 'username' ) then Result := UserName else if AST( ID, 'sakura.portalsites' ) then Result := GhostDescript.PortalSightList else if AST( ID, 'sakura.recommendsites' ) then Result := GhostDescript.RecommendSightList else if AST( ID, 'kero.recommendsites' ) then Result := GhostDescript.UnrecommendSightList else Result := GhostDescript.Read( ID, '' ); if (Result <> '') then Result := MakeResponce( rrOK, BuildScript( Result ) ); end; function Get( Header:TRequestStrings ): String; begin (* ゴースト設定を読みこむ *) Result := GetString( Header.Values['ID'] ); (* ゴースト設定ではないみたいなのでイベントとして処理してみる *) if (Result = '') then Result := GetEvent( Header ); (* 未対応ヘッダはログへ落とす *) if (Result = '') then if not AMT( Header.Values['ID'], ['OnSecondChange','OnMouseMove','OnMouseClick','OnMinuteChange','OnKeyPress'] ) then DebugfOut( 'NotImplement in Get()', Header.Values['ID'] ); end; function request( H:HGLOBAL; var Len:LongInt ): HGLOBAL; cdecl; var I : Integer; Cmd: String; Scr: String; function Requested( Head:String ):Boolean; begin Result := AST( Cmd, Head ) end; begin (* リクエストヘッダを TStrings で扱えるようにしてやる *) RequestHeader.Text := GlobalHandleToStr( H, Len, True ); for I:=0 to RequestHeader.Count-1 do RequestHeader.Strings[I] := StringReplace( RequestHeader.Strings[I], ': ', '=', [] ); (* ヘッダを調べて処理の分岐 *) try Cmd := RequestHeader.Strings[0]; // Requested 内で繰り返し呼ぶより、ちょっとは高速化するかな~って Scr := ''; if Requested( 'GET SHIORI/3.0' ) then Scr := Get( RequestHeader ) else if Requested( 'NOTIFY SHIORI/3.0' ) then Scr := Notify( RequestHeader ) else if Requested( 'TRANSLATE SHIORI/3.0' ) then Scr := Script( RequestHeader ) else if Requested( 'GET Version SHIORI/2.0' ) then Scr := MakeResponce( rrOK ) else if Requested( 'GET Status SHIORI/2.0' ) then Scr := MakeResponce( rrNoContent ) else begin (* 未対応ヘッダ *) DebugfOut( 'NotImplement in Request()' ); Scr := MakeResponce( rrNoContent ); end; if (Scr = '') then Scr := MakeResponce( rrNoContent ); except DebugfOut( 'Error in Request()' ); end; (* リザルトヘッダの作成 *) Result := GetGlobalMemory( Scr+TERMINAL, Len ); end; |