Unit DataMgmt;

{$mode objfpc}{$H+}

Interface

Uses
  Classes, SysUtils, Graphics, HTTPSend, ShlepsUtils, Unit8, Dispatcher;



Var
    SceneFileName:String;//для работы с диалогами
    DocumentName:String;//для выяснения отличается ли загруженный от указанного в закладке
    DocumentURL,DocumentProto,DocumentPath:String;
    FileName,vFileName:String;

Function ExpandURL(ShortURL:String):String;
Function LoadTextFromURL(URL:String;S:TStringList):Boolean;
Procedure LoadImageFromURL(URL:String;Var Picture:TPicture);

Implementation


Function ExpandURL(ShortURL:String):String;
Var Proto,Path,Name:String;
Begin
  //если протокол не указан - использует текущий
  //если DocumentPath не задан - относительный путь расширяется текущей директорией
  //если DocumentPath задан или протокол хттп - относительный путь расширяется директорией текущего документа

  Path:=ExtractFilePath(ShortURL);
  Name:=ExtractFileName(ShortURL);
  If Pos('://',Path)=0 Then Begin
    If (Pos('/',Path)=1)Or(Pos(':',Path)=2) Then
      // абсолютный путь
      Result:=DocumentProto+Path+Name
    Else Result:=DocumentProto+DocumentPath+Path+Name;
  End Else Begin
    Proto:=Copy(Path,1,Pos('://',Path)+2);
    Delete(Path,1,Pos('://',Path)+2);
    If Proto='file://' Then Begin
      {$IFDEF LINUX}
        If Pos('/',Path)=1 Then
      {$ELSE}
        If Pos(':',Path)=2 Then
      {$ENDIF}
        // абсолютный путь
        Result:=Proto+Path+Name
      Else
        //относительный путь
        If DocumentPath='' Then Result:=Proto+OSPath(GetCurrentDir+'/'+Name) //относительно рабочей директории
        Else Result:=Proto+OSPath(DocumentPath+'/'+Path+Name); //относительно загруженного документа
    End;
    If Proto='http://' Then Begin
      Result:=Proto+Path+Name; //относительно загруженного документа
    End;
    If Proto='exec://' Then Begin
      Result:=Proto+Path+Name; //относительно загруженного документа
    End;
  End;
End;


Function LoadTextFromURL(URL:String;S:TStringList):Boolean;
Var Proto,Path,Name:String;
    HTTP: THTTPSend;
Begin
  Path:=ExtractFilePath(URL);
  Name:=ExtractFileName(URL);
  Proto:=Copy(Path,1,Pos('://',Path)+2);
  Delete(Path,1,Pos('://',Path)+2);
  Case Proto Of
  'file://': Begin
               Try
                 S.LoadFromFile(Path+Name);
                 Result:=True;
               Except
                 Result:=False;
               end;
             End;
  'http://': Begin
               HTTP:=THTTPSend.Create;
               If HTTPURLForm<>Nil Then Begin
                 If HTTPUrlForm.ProxyServerEdit.Text<>'' Then Begin
                   HTTP.ProxyHost:=HTTPUrlForm.ProxyServerEdit.Text;
                   HTTP.ProxyPort:=HTTPUrlForm.ProxyPortEdit.Text;
                 End;
               End;
               Try
                 If Not HTTP.HTTPMethod('GET', URL) Then Begin
                    LogMessage(1,'Error retrieving '+URL+' '+IntToStr(HTTP.Resultcode));
                    Result:=False;
                 End Else Begin
        {writeln(Http.Resultcode, ' ', Http.Resultstring);
        writeln(Http.headers.text);}
                   S.LoadFromStream(HTTP.Document);
                   Result:=True;
                 end;
               Finally
                 HTTP.Free;
               End;
             End;
  'exec://': Begin
               S.Text:=Dispatcher.ExecShellCmd(Path+Name);
//               Dispatcher.ExecCommand(Callout.Source);
             End;
  End;
End;

Procedure LoadImageFromURL(URL:String;Var Picture:TPicture);
Var Proto,Path,Name:String;
    HTTP: THTTPSend;
Begin
  Path:=ExtractFilePath(URL);
  Name:=ExtractFileName(URL);
  Proto:=Copy(Path,1,Pos('://',Path)+2);
  Delete(Path,1,Pos('://',Path)+2);
  Case Proto Of
  'file://': Begin
               If FileExists(Path+Name) Then
                 Try Picture.LoadFromFile(Path+Name);
                 finally
                 end;
             End;
  'http://': Begin
               HTTP:=THTTPSend.Create;
               If HTTPURLForm<>Nil Then Begin
                 If HTTPUrlForm.ProxyServerEdit.Text<>'' Then Begin
                   HTTP.ProxyHost:=HTTPUrlForm.ProxyServerEdit.Text;
                   HTTP.ProxyPort:=HTTPUrlForm.ProxyPortEdit.Text;
                 End;
               End;
               Try
                 If Not HTTP.HTTPMethod('GET', URL) Then Begin
                   LogMessage(1,'Error retrieving '+URL+' '+IntToStr(HTTP.Resultcode));
                 End Else Begin
                   Picture.LoadFromStream(HTTP.Document);
                 end;
               Finally
                 HTTP.Free;
               End;
             End;
  'exec://': Begin
             End;
  End;
End;

End.

