Jump to content

How to get TUNIGUISession from TUNIExtServer?


altagur

Recommended Posts

I need to post files to client. I am not find such event in unigui. I am catch event in

procedure TIdCustomHTTPServer.DoCommandGet where

TMethod(FOnCommandGet).Data is TUniExtServer

 

How to get current TUniExtSession from TUniExtServer and while such requests

 

localhost:8077/tmp/myfile.jpg?cmd=1&id=2

 

not translated by TUniExtServer to procedure TIdExtSession.HandleRequest()?

 

 

Please help me. I need drop file from brauser to desctop in google chrome i altready write javascript and now need catch file request to generate file dinamically from database. For this i need MainDataModule from UniSession in TIdCustomHTTPServer.DoCommandGet or translation localhost:8077/tmp/myfile.jpg?cmd=1&id=2 to TIdExtSession.HandleRequest or event in unigui for user manual params and request handling

 

 

 

Please help :(

Link to comment
Share on other sites

for handling requests like localhost:8077?cmd=1&id=12375

 

define project define GUR if main database module named MainData from file dtHtmlMain

 

In module ExtHTTPServer; in uses after implementation insert uses

 

implementation

uses
{$IFDEF GUR}
   UniGUIApplication,dtHtmlMain,
{$ENDIF}
 

 

and change TIdExtSession.HandleRequest(

 

 

procedure TIdExtSession.HandleRequest(ARequest: TIdHTTPRequestInfo; AResponse: TIdHTTPResponseInfo);
(* added *)
{$WARNINGS OFF}
(* added *)
  function CheckIfFileIsModified(FileName: string): Boolean;
  const
    FCompareDateFmt = 'yyyymmddhhnnss';
  var
    FFileDateTime: TDateTime;
  begin
    Result := True;
    if (ARequest.RawHeaders.Values['if-Modified-Since'] <> '') then begin
      FFileDateTime := FileDateToDateTime(FileAge(FileName));
      Result := not SameText(FormatDateTime(FCompareDateFmt, FFileDateTime),
        FormatDateTime(FCompareDateFmt, StrInternetToDateTime(ARequest.RawHeaders.Values['if-Modified-Since'])));
    end;
  end;

  function TryToServeFile: boolean;
  var
    FileName: string;
    FileDateTime: TDateTime;
  begin
    FileName := ExtractFilePath(ParamStr(0));
    FileName := StringReplace(FileName, ExtractFileDrive(FileName), '', []);
    if (Length(ARequest.Document) > 1) and (ARequest.Document[1]in ['/', '\']) then
      FileName := FileName + Copy(ARequest.Document, 2, MaxInt)
    else
      FileName := FileName + ARequest.Document;
    FileName := ExpandFilename(FileName);
    if FileExists(FileName) then
    begin
      Result := True;
      if CheckIfFileIsModified(FileName) then
      begin
        AResponse.ContentStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
        AResponse.FreeContentStream := True;
        AResponse.ContentLength := AResponse.ContentStream.Size;
        FileDateTime := FileDateToDateTime(FileAge(FileName));
        AResponse.LastModified := FileDateTime;
        AResponse.ContentType  := FileType2MimeType(FileName);
      end
      else
        AResponse.ResponseNo := 304; //Not Modified, use cache version
    end
    else
    begin
(* added *)
      AResponse.ResponseNo := 404; //Not found
(* added *)
      Result := false;
    end;
  end;

  function TryToServeDiskFile(FileName: String): boolean;
  var
    FileDateTime: TDateTime;
  begin
    if FileExists(FileName) then
    begin
      Result := True;
      if CheckIfFileIsModified(FileName) then
      begin
        AResponse.ContentStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
        AResponse.FreeContentStream := True;
        AResponse.ContentLength := AResponse.ContentStream.Size;
        FileDateTime := FileDateToDateTime(FileAge(FileName));
        AResponse.LastModified := FileDateTime;
        AResponse.ContentType  := FileType2MimeType(FileName);
      end
      else
        AResponse.ResponseNo := 304; //Not Modified, use cache version
    end
    else
    begin
(* added *)
      AResponse.ResponseNo := 404; //Not found
(* added *)
      Result := false;
    end;
  end;

(* added *)
{$WARNINGS ON}
(* added *)

type
  MethodCall = procedure of object;
var
  PageMethod : TMethod;
  MethodCode : pointer;
{$IFDEF GUR}
var
  AID: variant;
  ACmd: Integer;
  AFileName: String;
{$ENDIF}
begin
(* deleted *)
//CurrentFCGIThread := Self;
(* deleted *)

(* added *)
  SetCurrentFCGIThread(Self);
(* added *)
  FCurrentRequest   := ARequest;
  FCurrentResponse  := AResponse;
//  FCurrentResponse.CacheControl:='no-cache';

(* deleted *)
{
  if ARequest.Cookies.GetCookieIndex(0, 'FCGIThread') = -1 then
    with AResponse.Cookies.Add do begin
      CookieName := 'FCGIThread';
      Value      := SessionID;
      ARequest.Cookies.AddSrcCookie(CookieText);
    end;

  AResponse.ContentType := 'text/html'; // this changes charset in D2011 see #0000531
}
(* deleted *)
  if Length(ARequest.Params.Values['cmd'])>0 then
    begin
    Response := '';
    end;

  Response := '';
  FParams.DelimitedText := FCurrentRequest.UnParsedParams;
  if BeforeHandleRequest then
    if PathInfo = '' then
      begin
{$IFDEF GUR}
      if Length(ARequest.Params.Values['cmd'])>0 then
        begin
        ACmd := StrToInt(ARequest.Params.Values['cmd']);
        case ACmd of
          0: // file
            begin
            AID := StrToFloat(ARequest.Params.Values['id']);
            if TMainData(TUNIGUISession(Self).UniMainModule).PutToTmpFile(AID, AFileName) then //; if FileExists(FILE_ROOT + ARequestInfo.Document) then
              begin
              TryToServeDiskFile(AFileName); //AResponse.ServeFile(AContext, AFileName);
              end;
            end;
        end;
        end //;
      else
{$ENDIF}
        Home;
      end
    else
    begin
      MethodCode := MethodAddress(PathInfo);
      if MethodCode <> nil then
      begin
        PageMethod.Code := MethodCode;
        PageMethod.Data := Self;
        try
{$IFDEF GUR}
          if Length(ARequest.Params.Values['cmd'])>0 then
            begin
            ACmd := StrToInt(ARequest.Params.Values['cmd']);
            case ACmd of
              0: // file
                begin
                AID := StrToFloat(ARequest.Params.Values['id']);
                if TMainData(TUNIGUISession(Self).UniMainModule).PutToTmpFile(AID, AFileName) then //; if FileExists(FILE_ROOT + ARequestInfo.Document) then
                  begin
                  TryToServeDiskFile(AFileName); //AResponse.ServeFile(AContext, AFileName);
                  end;
                end;
            end;
            end //;
          else
{$ENDIF}
          MethodCall(PageMethod); // Call published method
        except
          on E : Exception do
            OnError(E, E.Message, PathInfo, FCurrentRequest.UnParsedParams);
        end;
      end
      else
      begin
        if not TryToServeFile then
          OnNotFoundError;
      end;
    end;
  AfterHandleRequest;
  if not Assigned(AResponse.ContentStream) and (Response <> '') and (AResponse.ResponseNo <> 304) then
    FCurrentResponse.ContentText := Response;
end;
 

 

 

In tunihtmlframe you can define startdrag function

 

<script type="text/javascript">

 

function dragStart(evt)
{
 
    fID = MyForm.MyLabel.text;

  files = "application/octet-stream:"+fName+":"+document.location+"?cmd=0&id="+fID;
  event.dataTransfer.setData("DownloadURL",files);
  return true;
}
 

 

and register procedure

 

var box = document.getElementById(MYForm.MyGrid.id);

 box.addEventListener("dragstart", dragStart, false);
</script>

 

 

Its way to dragdrop files from tunidbgrid in browser to desctop Work only in googlechrome.

 

Possible unigui developers included event in MainModule  on with done like

 

    function TUniguiSession.BeforeHandleRequest : boolean; override;

begin

   if Assigned (MainDataModule.FOnBeforeHanle) then

     Result := MainDataModule.FOnBeforeHanle(CurrentRequest ,CurrentResponse)

   else inherited;

)

 

 

 

end;
 

Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...