Guest User

Untitled

a guest
Jun 17th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.20 KB | None | 0 0
  1.  unit ROAction;
  2.  
  3. interface
  4.  
  5. uses
  6.   Classes,
  7.   Controls,
  8.   ROConnection,
  9.   GuardianServerServiceLibrary_Intf,
  10.   uROEventRepository,
  11.   Messages,
  12.   Windows,
  13.   DB,
  14.   InvokeRegistry;
  15.  
  16.  
  17. type
  18.   TCancellationToken = class
  19.   private
  20.     FIsCancellationRequested: Boolean;
  21.     function GetCancellationRequested: Boolean;
  22.     procedure SetCancellationRequested(const Value: Boolean);
  23.   public
  24.     procedure Reset;
  25.     property IsCancellationRequested: Boolean read GetCancellationRequested write SetCancellationRequested;
  26.   end;
  27.  
  28.   TROAction = class(TInterfacedObject, IGuardianServerEvents)
  29.   private
  30.     FSessionID: String;
  31.     FROEventReceiver: TROEventReceiver;
  32.     FROConnection: TROConnection;
  33.     FTransaction: TransactionRequestData;
  34.     FResponseMessage: ResponseMessageData;
  35.     FCancellationToken: TCancellationToken;
  36.     FRequestList: RequestMessageArray;
  37.     FRequestComplete: Boolean;
  38.     FRequestTimeout: Boolean;
  39.     FRequestActionTypeData: RequestActionTypeData;
  40.     function GetROConnection: TROConnection;
  41.     function GetRequestList: RequestMessageArray;
  42.     procedure OnSubmitResponse(const ResponseMessage: ResponseMessageData;
  43.       const TransactionMessage: TransactionRequestData);
  44.     function GetActionType: RequestActionTypeData;
  45.     procedure SetActionType(const Value: RequestActionTypeData);
  46.     function GetResponseMesssage: ResponseMessageData;
  47.     procedure SetResponseMessage(const Value: ResponseMessageData);
  48.   public
  49.     constructor Create(ROConnection: TROConnection; CancellationToken: TCancellationToken = nil; CommandTimeout: Integer = DEFAULT_COMMAND_TIMEOUT);
  50.     destructor Destroy; override;
  51.     procedure CancelRequest;
  52.     procedure OpenRequest;
  53.   public
  54.     property RequestList: RequestMessageArray read GetRequestList;
  55.     property ResponseMessage: ResponseMessageData read GetResponseMesssage write SetResponseMessage;
  56.     property ROConnection: TROConnection read GetROConnection;
  57.     property RequestComplete: Boolean read FRequestComplete;
  58.     property RequestTimeout: Boolean read FRequestTimeout;
  59.     property ActionType: RequestActionTypeData read GetActionType write SetActionType;
  60.   end;
  61. implementation
  62.  
  63. uses
  64.   SysUtils,
  65.   Forms;
  66.  
  67.  
  68. { TROAction }
  69.  
  70. constructor TROAction.Create(ROConnection: TROConnection; CancellationToken: TCancellationToken = nil; CommandTimeout: Integer = DEFAULT_COMMAND_TIMEOUT);
  71. begin
  72.   _AddRef;
  73.  
  74.   FROEventReceiver := TROEventReceiver.Create(nil);
  75.   FROEventReceiver.Interval := 0;
  76.   FROEventReceiver.Channel := ROConnection.RORemoteService.Channel;
  77.   FROEventReceiver.Message := ROConnection.RORemoteService.Message;
  78.   FROEventReceiver.ServiceName := ROConnection.RORemoteService.ServiceName;
  79.   FROEventReceiver.RegisterEventHandlers([EID_GuardianServerEvents], [Self]);
  80.   FROEventReceiver.Activate;
  81.  
  82.   FROConnection := ROConnection;
  83.  
  84.   FCancellationToken := CancellationToken;
  85.   if Assigned(FCancellationToken) then
  86.     FCancellationToken.Reset;
  87.   FTransaction := TransactionRequestData.Create;
  88.   FTransaction.Timeout := CommandTimeout * 1000;
  89.   FRequestList := FTransaction.Items;
  90.   FRequestComplete := false;
  91. end;
  92.  
  93. destructor TROAction.Destroy;
  94. begin
  95.   if Assigned(FROEventReceiver) then
  96.   begin
  97.     FROEventReceiver.UnregisterEventHandlers([EID_GuardianServerEvents]);
  98.     FROEventReceiver.Deactivate;
  99.   end;
  100.   FreeAndNil(FTransaction);
  101.   FreeAndNil(FROEventReceiver);
  102.   FreeAndNil(FResponseMessage);
  103.   inherited;
  104. end;
  105.  
  106. function TROAction.GetActionType: RequestActionTypeData;
  107. begin
  108.   Result := FRequestActionTypeData;
  109. end;
  110.  
  111. function TROAction.GetRequestList: RequestMessageArray;
  112. begin
  113.   Result := FRequestList;
  114. end;
  115.  
  116. function TROAction.GetResponseMesssage: ResponseMessageData;
  117. begin
  118.   Result := FResponseMessage;
  119. end;
  120.  
  121. function TROAction.GetROConnection: TROConnection;
  122. begin
  123.   Result := FROConnection;
  124. end;
  125.  
  126. procedure TROAction.OpenRequest;
  127. var
  128.   i: Integer;
  129.   start, duration: LongInt;
  130. begin
  131.   if Assigned(ROConnection) then
  132.   begin
  133.     FTransaction.SessionID := ROConnection.GuardianServiceClient.ServiceLogin;
  134.     // if action is not set for transaction get it from first message
  135.     if (FTransaction.MessageType = RequestActionTypeData_None) then
  136.     begin
  137.       if (FTransaction.Items.Count > 0) then
  138.       begin
  139.         FTransaction.MessageType := FTransaction.Items[0].MessageType;
  140.       end;  
  141.     end;
  142.    
  143.     ROConnection.GuardianServiceClient.SubmitTransaction(FTransaction);
  144.     i := 0;
  145.     start := GetTickCount;
  146.     FRequestTimeout := false;
  147.     while ((not RequestComplete) and (not RequestTimeout)) do
  148.     begin
  149.        Inc(i);
  150.        if (i > 20) then
  151.        begin
  152.          duration := GetTickCount - start;
  153.          FRequestTimeout := (duration > (FTransaction.Timeout+500));
  154.  
  155.          i := 0;
  156.          Application.ProcessMessages;
  157.        end;
  158.     end;
  159.   end;
  160. end;
  161.  
  162. procedure TROAction.SetActionType(const Value: RequestActionTypeData);
  163. begin
  164.   FRequestActionTypeData := Value;
  165. end;
  166.  
  167. procedure TROAction.SetResponseMessage(const Value: ResponseMessageData);
  168. begin
  169.   FResponseMessage := ResponseMessageData(Value.Clone());
  170. end;
  171.  
  172. procedure TROAction.OnSubmitResponse(const ResponseMessage: ResponseMessageData; const TransactionMessage: TransactionRequestData);
  173.  
  174. begin
  175.   FRequestComplete := (ResponseMessage.Status in [MessageStatusData_Cancelled, MessageStatusData_Error, MessageStatusData_Done]);
  176.   if (FRequestComplete) then
  177.   begin
  178.     if (TransactionMessage.MessageType = RequestActionTypeData_Login) then
  179.       Self.ResponseMessage := LoginResponseData(ResponseMessage)
  180.     else
  181.       Self.ResponseMessage := ResponseMessage
  182.   end;
  183. end;
  184.  
  185. //procedure TROAction.SetLengthRequestParams(Length: Integer);
  186. //begin
  187. //  SetLength(FRequestParams, Length);
  188. //end;
  189.  
  190. procedure TROAction.CancelRequest;
  191. begin
  192. //  if Assigned(FSoapActionThread) then
  193. //    FSoapActionThread.CancelRequest;
  194. end;
  195.  
  196. { TCancellationToken }
  197.  
  198. function TCancellationToken.GetCancellationRequested: Boolean;
  199. begin
  200.   Result := FIsCancellationRequested;
  201. end;
  202.  
  203. procedure TCancellationToken.Reset;
  204. begin
  205.   FIsCancellationRequested := false;
  206. end;
  207.  
  208. procedure TCancellationToken.SetCancellationRequested(const Value: Boolean);
  209. begin
  210.   FIsCancellationRequested := value;
  211. end;
  212.  
  213. end.
Add Comment
Please, Sign In to add comment