ununununun

rwConnection

May 5th, 2020
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 41.95 KB | None | 0 0
  1. unit rwConnection;
  2.  
  3. interface
  4.  
  5. uses Windows, SysUtils, Messages, Forms,
  6. isBaseClasses, isObjectPool, rwConnectionInt, EvStreamUtils, isBasicUtils,
  7. evTransportInterfaces, evTransportShared, evTransportDatagrams, isThreadManager,
  8. isUtils, Dialogs, isSettings, isExceptions;
  9.  
  10. type
  11. IevRWCommClient = interface
  12. ['{BCA17F9E-0195-412F-AFB7-C5FD89DD0AF5}']
  13. function GetDatagramDispatcher: IevDatagramDispatcher;
  14. function Connect(const APort: String): TisGUID;
  15. end;
  16.  
  17. IevRWConnectionPool = interface
  18. ['{37F2FFBB-D180-48A1-BD62-7EED36B8F07D}']
  19. function CommClient: IevRWCommClient;
  20. function GetRWConnection(const ARWObjectName: String): IInterface;
  21. procedure ReturnRWConnection(const ARWConnection: IInterface);
  22. function CheckRWConnection(const ARWConnection: IInterface): Boolean;
  23. procedure SetGlobalSettings(const ARWEngineOneUse, ARWEnhancedLog: Boolean; const ARWEnhancedLogPath: String);
  24. function GetRWEnhancedLog: Boolean;
  25. function GetRWEnhancedLogPath: String;
  26. end;
  27.  
  28.  
  29. function RWConnectionPool: IevRWConnectionPool;
  30.  
  31. implementation
  32.  
  33. type
  34. TevRWCommClient = class(TevCustomTCPClient, IevRWCommClient)
  35. protected
  36. function Connect(const APort: String): TisGUID;
  37. function CreateDispatcher: IevDatagramDispatcher; override;
  38. end;
  39.  
  40. TevRWDatagramDispatcher = class(TevDatagramDispatcher)
  41. protected
  42. procedure DoOnIdle; override;
  43. end;
  44.  
  45.  
  46. TevRWConnectionPool = class(TisObjectPool, IevRWConnectionPool)
  47. private
  48. FCommClient: IevRWCommClient;
  49. FRWEngineOneUse: Boolean;
  50. FRWEnhancedLog: Boolean;
  51. FRWEnhancedLogPath: String;
  52. protected
  53. procedure DoOnConstruction; override;
  54. function CreateObject(const AObjectName: String): IisObjectFromPool; override;
  55. function CommClient: IevRWCommClient;
  56. function GetRWConnection(const ARWObjectName: String): IInterface;
  57. procedure ReturnRWConnection(const ARWConnection: IInterface);
  58. function CheckRWConnection(const ARWConnection: IInterface): Boolean;
  59. procedure SetGlobalSettings(const ARWEngineOneUse, ARWEnhancedLog: Boolean; const ARWEnhancedLogPath: String);
  60. function GetRWEnhancedLog: Boolean;
  61. function GetRWEnhancedLogPath: String;
  62. end;
  63.  
  64.  
  65. IrwProxy = interface
  66. ['{9AF24399-E147-4D98-A6E6-8DEB18AA1387}']
  67. function IsAlive: Boolean;
  68. end;
  69.  
  70. TrwProxy = class(TisObjectFromPool, IrwProxy)
  71. private
  72. FSession: IevSession;
  73. function CreateDatagram(const AMethod: String): IevDatagram;
  74. function GetExeName: String; virtual; abstract;
  75. procedure Connect;
  76. function SendRequest(const ADatagram: IevDatagram): IevDatagram;
  77. function IsAlive: Boolean;
  78. protected
  79. procedure DoOnConstruction; override;
  80. destructor Destroy; override;
  81. end;
  82.  
  83.  
  84. // Engine
  85. TrwEngineAppProxy = class(TrwProxy, IrwEngineApp)
  86. private
  87. FReportStructure: IrwReportStructure;
  88. FProcessController: IrwProcessController;
  89.  
  90. procedure OpenReportFromStream(const AStream: IevDualStream);
  91. procedure OpenReportFromClass(const AClassName: String);
  92. function GetActiveReport: IrwReportStructure;
  93. procedure CloseActiveReport;
  94. function GetReportParams: IisListOfValues;
  95. function RunActiveReport(const ARunSettings: TrwRunReportSettings): TrwReportResult;
  96. function RunReport(const AReportData: IevDualStream; const AReportName: String; out AReportResult: IevDualStream): Variant;
  97. function GetProcessController: IrwProcessController;
  98. procedure InitializeAppAdapter(const AModuleName: String; const AAppCustomData: Variant);
  99. function RWAtoPDF(const ARWAData: IevDualStream; const APDFInfo: TrwPDFFileInfo): IevDualStream;
  100. function CallAppAdapterFunction(const AFunctionName: String; const AParams: Variant): Variant;
  101. function GetClassInfo(const AClassName: String): TrwClassInfo;
  102. function ClassInheritsFrom(const AClassName, AAncestorClassName: String): Boolean;
  103. function ChangeRWAInfo(const ARWAData: IevDualStream; const ACurrentPassword: String;
  104. const ANewInfo: TrwRWAFileInfo):IevDualStream;
  105. procedure SetExternalModuleData(const AModuleName: String; const AData: IevDualStream);
  106. function OpenQueryBuilder(const AQueryData: IevDualStream; const ADescriptionView: Boolean): Boolean;
  107. function GetMainWindowHandle: Integer;
  108. function RunQuery(const AQueryData: IevDualStream; const AParams: Variant): Variant;
  109. function QueryInfo(const AItemName: String): String;
  110. function OpenQueryBuilder2(const AQueryData: IevDualStream; const ADescriptionView: Boolean): Boolean;
  111. function IsQueryBuilderFormClosed(out AQueryData: IevDualStream): Boolean;
  112. protected
  113. procedure DoOnConstruction; override;
  114. function GetExeName: String; override;
  115. end;
  116.  
  117.  
  118. TrwProcessController = class(TisInterfacedObject, IrwProcessController)
  119. private
  120. FOwner: TrwEngineAppProxy;
  121.  
  122. procedure Run(const ARunAction: TrwRunAction);
  123. procedure Pause;
  124. procedure Stop;
  125. function GetVMRegisters: TrwVMRegisters;
  126. function GetState: TrwProcessState;
  127. function CalcExpression(const AExpression: String; const ADebugSymbolInfo: String): TrwVMExpressionResult;
  128. function GetVMCallStack: Variant;
  129. procedure SetBreakpoints(const ABreakpoints: Variant);
  130. procedure OpenQueryBuilder(const AQueryData: IevDualStream; const ADescriptionView: Boolean);
  131. public
  132. constructor Create(const AOwner: TrwEngineAppProxy);
  133. end;
  134.  
  135.  
  136. TrwReportStructure = class(TisInterfacedObject, IrwReportStructure, IrwReportInputForm, IrwReportParameters)
  137. private
  138. FOwner: TrwEngineAppProxy;
  139.  
  140. // IrwReportStructure
  141. function GetReportParameters: IrwReportParameters;
  142. function GetData: IevDualStream;
  143. function GetReportInputForm: IrwReportInputForm;
  144. function GetStructureInfo: TrwReportStructureInfo;
  145. procedure Compile;
  146. procedure PrepareForRunning;
  147.  
  148. // IrwReportInputForm
  149. procedure CloseOK;
  150. procedure CloseCancel;
  151. function Show(const AParentWndHandle: Integer; const ASetupMode: Boolean): Boolean;
  152. function GetFormBounds: TrwBounds;
  153. procedure SetFormBounds(const ABounds: TrwBounds);
  154.  
  155. // IrwReportParameters
  156. function GetCount: Integer;
  157. function ParamByName(const AParamName: String): TrwReportParam;
  158. function IndexOf(const AParamName: String): Integer;
  159. function GetItems(const AIndex: Integer): TrwReportParam;
  160. function GetParamValue(const AParamName: String): Variant;
  161. procedure SetParamValue(const AParamName: String; const AValue: Variant);
  162. procedure ParamsFromStream(const AParams: IevDualStream);
  163. function ParamsToStream: IevDualStream;
  164. public
  165. constructor Create(const AOwner: TrwEngineAppProxy);
  166. end;
  167.  
  168.  
  169. // Preview
  170. TrwPreviewAppProxy = class(TrwProxy, IrwPreviewApp)
  171. private
  172. function QueryInfo(const AItemName: String): String;
  173. procedure Preview(const AReportResult: IevDualStream; const AParentWindow: Integer);
  174. procedure Print(const AReportResult: IevDualStream; const APrintJobInfo: TrwPrintJobInfo);
  175. function ReportsInGroup: Integer;
  176. procedure ClearGroup;
  177. procedure AddToGroup(const AReportResult: IevDualStream; const AReportResultInfo: TrwReportResultInfo;
  178. const APrintJobInfo: TrwPrintJobInfo);
  179. procedure PreviewGroup(const AParentWindow: Integer);
  180. procedure PrintGroup(const APrintJobInfo: TrwPrintJobInfo);
  181. function MergeGroup: IevDualStream;
  182. function GetFormBounds: TrwBounds;
  183. procedure SetFormBounds(const ABounds: TrwBounds);
  184. protected
  185. function GetExeName: String; override;
  186. end;
  187.  
  188.  
  189. // Designer
  190. TrwDesignerAppProxy = class(TrwProxy, IrwDesignerApp)
  191. private
  192. function OpenDesigner(const AReportData: IevDualStream; const AReportName: String;
  193. const ADefaultReportType: Integer): Boolean;
  194. function OpenQueryBuilder(const AQueryData: IevDualStream; const ADescriptionView: Boolean): Boolean;
  195. procedure InitializeAppAdapter(const AModuleName: String; const AAppCustomData: Variant);
  196. function CallAppAdapterFunction(const AFunctionName: String; const AParams: Variant): Variant;
  197. function RunQuery(const AQueryData: IevDualStream; const AParams: Variant): Variant;
  198. function QueryInfo(const AItemName: String): Variant;
  199. function OpenDesigner2(const AReportData: IevDualStream; const AReportName: String;
  200. const ADefaultReportType: Integer): Boolean;
  201. function IsDesignerFormClosed(out AReportData: IevDualStream): Boolean;
  202. function OpenQueryBuilder2(const AQueryData: IevDualStream; const ADescriptionView: Boolean): Boolean;
  203. function IsQueryBuilderFormClosed(out AQueryData: IevDualStream): Boolean;
  204. protected
  205. function GetExeName: String; override;
  206. end;
  207.  
  208.  
  209. var FRWConnectionPool: IevRWConnectionPool;
  210. var InitLock: IisLock;
  211. var AppMutexName: String; // Sort of unique process ID
  212. var AppMutex: THandle; // Used by RW to terminate itself if App dies
  213.  
  214.  
  215. function RWConnectionPool: IevRWConnectionPool;
  216. begin
  217. InitLock.Lock;
  218. try
  219. if not Assigned(FRWConnectionPool) then
  220. begin
  221. FRWConnectionPool := TevRWConnectionPool.Create('RW Pool Garbage Collector', nil);
  222. (RWConnectionPool as IisObjectPool).MaxPoolSize := HowManyProcessors * 2;
  223. (RWConnectionPool as IisObjectPool).ObjectExpirationTime := 15;
  224. end;
  225.  
  226. Result := FRWConnectionPool;
  227. finally
  228. InitLock.Unlock;
  229. end;
  230. end;
  231.  
  232. { TevRWConnectionPool }
  233.  
  234. function TevRWConnectionPool.CheckRWConnection(const ARWConnection: IInterface): Boolean;
  235. begin
  236. Result := (ARWConnection as IrwProxy).IsAlive;
  237. end;
  238.  
  239. function TevRWConnectionPool.CommClient: IevRWCommClient;
  240. begin
  241. Result := FCommClient;
  242. end;
  243.  
  244. function TevRWConnectionPool.CreateObject(const AObjectName: String): IisObjectFromPool;
  245. begin
  246. if AObjectName = 'RW Engine' then
  247. Result := TrwEngineAppProxy.Create(AObjectName)
  248. else if AObjectName = 'RW Designer' then
  249. Result := TrwDesignerAppProxy.Create(AObjectName)
  250. else if AObjectName = 'RW Preview' then
  251. Result := TrwPreviewAppProxy.Create(AObjectName);
  252. end;
  253.  
  254. procedure TevRWConnectionPool.DoOnConstruction;
  255. begin
  256. inherited;
  257. FCommClient := TevRWCommClient.Create;
  258. end;
  259.  
  260. function TevRWConnectionPool.GetRWConnection(const ARWObjectName: String): IInterface;
  261. begin
  262. try
  263. repeat
  264. Result := AcquireObject(ARWObjectName);
  265. until CheckRWConnection(Result);
  266. except
  267. Result := AcquireObject(ARWObjectName); // do it one more time for broken connections
  268. end;
  269. end;
  270.  
  271. procedure TevRWConnectionPool.SetGlobalSettings(const ARWEngineOneUse, ARWEnhancedLog: Boolean; const ARWEnhancedLogPath: String);
  272. begin
  273. FRWEngineOneUse:= ARWEngineOneUse;
  274. FRWEnhancedLog:= ARWEnhancedLog;
  275. FRWEnhancedLogPath:= ARWEnhancedLogPath;
  276. end;
  277.  
  278. procedure TevRWConnectionPool.ReturnRWConnection(const ARWConnection: IInterface);
  279. begin
  280. if not FRWEngineOneUse then
  281. begin
  282. if CheckRWConnection(ARWConnection) then
  283. ReturnObject(ARWConnection as IisObjectFromPool);
  284. end;
  285. end;
  286.  
  287. function TevRWConnectionPool.GetRWEnhancedLog: Boolean;
  288. begin
  289. Result := FRWEnhancedLog;
  290. end;
  291.  
  292. function TevRWConnectionPool.GetRWEnhancedLogPath: String;
  293. begin
  294. Result := FRWEnhancedLogPath;
  295. end;
  296.  
  297. { TevRWCommClient }
  298.  
  299. function TevRWCommClient.Connect(const APort: String): TisGUID;
  300. begin
  301. Result := CreateConnection('localhost', APort, '', '', '', '');
  302. end;
  303.  
  304. function TevRWCommClient.CreateDispatcher: IevDatagramDispatcher;
  305. begin
  306. Result := TevRWDatagramDispatcher.Create;
  307. Result.ThreadPoolCapacity := 2;
  308. end;
  309.  
  310. { TrwProxy }
  311.  
  312. procedure TrwProxy.Connect;
  313. var
  314. SessionID: TisGUID;
  315. sPortFile, sPort, sParam, sExe: String;
  316. i: integer;
  317. isPortFileExist: Boolean;
  318.  
  319. function ReadPortNumberFromFile(const AFileName: String): String;
  320. var
  321. sPortFileStream: IevDualStream;
  322. sErrorMessage: String;
  323. i: Integer;
  324. begin
  325. // Retry cycle upto 30 sec
  326. sErrorMessage := '';
  327. for i := 1 to 30 do
  328. try
  329. sPortFileStream := TevDualStreamHolder.CreateFromFile(AFileName);
  330. break;
  331. except
  332. on E: Exception do
  333. begin
  334. sErrorMessage := E.Message;
  335. sPortFileStream := nil;
  336. Snooze(1000);
  337. end;
  338. end;
  339.  
  340. if not Assigned(sPortFileStream) then
  341. raise EisException.CreateFmt('Cannot open communication file "%s". Error: "%s"', [AFileName, sErrorMessage]);
  342.  
  343. Result := sPortFileStream.ReadLn;
  344. end;
  345.  
  346. begin
  347. try
  348. // sPortFile := AppDir + 'rwPort'; // debugging reason
  349. // if not FileExists(sPortFile) then
  350. // begin
  351. // sParam := '';
  352. // sExe := GetExeName;
  353. // if RWConnectionPool.GetRWEnhancedLog and (RWConnectionPool.GetRWEnhancedLogPath <> '') and (sExe = 'isRWEngine.exe') then
  354. // begin
  355. // sParam := RWConnectionPool.GetRWEnhancedLogPath;
  356. // sParam := ' /RWEnhancedLog true /RWEnhancedLogPath ' + sParam;
  357. // end;
  358. // sPortFile := AppTempFolder + GetUniqueID + '.tmp';
  359. // sExe := AppDir + sExe;
  360. // sParam := '/server "' + sPortFile + '" /owner ' + AppMutexName + sParam;
  361. // RunIsolatedProcess(sExe, sParam, []);
  362. // sExe := '';
  363. // sParam := '';
  364. // end;
  365. //
  366. // // Wait for file creation upto 30 sec
  367. // for i := 1 to 300 do
  368. // begin
  369. // isPortFileExist := FileExists(sPortFile);
  370. // if isPortFileExist then
  371. // break;
  372. // Snooze(100);
  373. // end;
  374. //
  375. // if not FileExists(sPortFile) then
  376. // raise EisException.CreateFmt('Communication file "%s" is missing', [sPortFile]);
  377. //
  378. // try
  379. // sPort := ReadPortNumberFromFile(sPortFile);
  380. // finally
  381. // DeleteFile(sPortFile);
  382. // end;
  383.  
  384. sPort := '65123';
  385. SessionID := RWConnectionPool.CommClient.Connect(sPort);
  386. FSession := RWConnectionPool.CommClient.GetDatagramDispatcher.FindSessionByID(SessionID);
  387. except
  388. on E: Exception do
  389. begin
  390. E.Message := 'Cannot initialize Report Writer' + #13 + E.Message;
  391. raise;
  392. end;
  393. end;
  394. end;
  395.  
  396. function TrwProxy.CreateDatagram(const AMethod: String): IevDatagram;
  397. begin
  398. Result := TevDatagram.Create(AMethod);
  399. Result.Header.SessionID := FSession.SessionID;
  400. Result.Header.ClientAppID := AppID;
  401. end;
  402.  
  403. destructor TrwProxy.Destroy;
  404. begin
  405. if Assigned(FRWConnectionPool) then
  406. RWConnectionPool.CommClient.GetDatagramDispatcher.DeleteSession(FSession);
  407. inherited;
  408. end;
  409.  
  410. procedure TrwProxy.DoOnConstruction;
  411. begin
  412. inherited;
  413. Connect;
  414. end;
  415.  
  416.  
  417. function TrwProxy.IsAlive: Boolean;
  418. begin
  419. Result := FSession.State = ssActive;
  420. end;
  421.  
  422. function TrwProxy.SendRequest(const ADatagram: IevDatagram): IevDatagram;
  423. begin
  424. Result := FSession.SendRequest(ADatagram);
  425. end;
  426.  
  427. { TrwPreviewAppProxy }
  428.  
  429. function TrwPreviewAppProxy.GetExeName: String;
  430. begin
  431. Result := 'isRWPreview.exe';
  432. end;
  433.  
  434. procedure TrwPreviewAppProxy.AddToGroup(const AReportResult: IevDualStream;
  435. const AReportResultInfo: TrwReportResultInfo;
  436. const APrintJobInfo: TrwPrintJobInfo);
  437. var
  438. D: IevDatagram;
  439. begin
  440. D := CreateDatagram(METHOD_RWPREVIEW_ADDTOGROUP);
  441. D.Params.AddValue('AReportResult', AReportResult);
  442.  
  443. D.Params.AddValue('AReportResultInfo.Name', AReportResultInfo.Name);
  444. D.Params.AddValue('AReportResultInfo.FormatType', AReportResultInfo.FormatType);
  445. D.Params.AddValue('AReportResultInfo.SecuredMode', AReportResultInfo.SecuredMode);
  446. D.Params.AddValue('AReportResultInfo.PreviewPwd', AReportResultInfo.PreviewPwd);
  447. D.Params.AddValue('AReportResultInfo.PrintPwd', AReportResultInfo.PrintPwd);
  448.  
  449. D.Params.AddValue('APrintJobInfo.PrintJobName', APrintJobInfo.PrintJobName);
  450. D.Params.AddValue('APrintJobInfo.PrinterName', APrintJobInfo.PrinterName);
  451. D.Params.AddValue('APrintJobInfo.TrayName', APrintJobInfo.TrayName);
  452. D.Params.AddValue('APrintJobInfo.OutBinNbr', APrintJobInfo.OutBinNbr);
  453. D.Params.AddValue('APrintJobInfo.DuplexingMode', APrintJobInfo.DuplexingMode);
  454. D.Params.AddValue('APrintJobInfo.PrinterVerticalOffset', APrintJobInfo.PrinterVerticalOffset);
  455. D.Params.AddValue('APrintJobInfo.PrinterHorizontalOffset', APrintJobInfo.PrinterHorizontalOffset);
  456. D.Params.AddValue('APrintJobInfo.FirstPage', APrintJobInfo.FirstPage);
  457. D.Params.AddValue('APrintJobInfo.LastPage', APrintJobInfo.LastPage);
  458. D.Params.AddValue('APrintJobInfo.Layers', APrintJobInfo.Layers);
  459. D.Params.AddValue('APrintJobInfo.Copies', APrintJobInfo.Copies);
  460.  
  461. D := SendRequest(D);
  462. end;
  463.  
  464. procedure TrwPreviewAppProxy.ClearGroup;
  465. var
  466. D: IevDatagram;
  467. begin
  468. D := CreateDatagram(METHOD_RWPREVIEW_CLEARGROUP);
  469. D := SendRequest(D);
  470. end;
  471.  
  472. function TrwPreviewAppProxy.GetFormBounds: TrwBounds;
  473. var
  474. D: IevDatagram;
  475. begin
  476. D := CreateDatagram(METHOD_RWPREVIEW_GETFORMBOUNDS);
  477. D := SendRequest(D);
  478. Result.Left := D.Params.Value[METHOD_RESULT + '.Left'];
  479. Result.Top := D.Params.Value[METHOD_RESULT + '.Top'];
  480. Result.Width := D.Params.Value[METHOD_RESULT + '.Width'];
  481. Result.Height := D.Params.Value[METHOD_RESULT + '.Height'];
  482. end;
  483.  
  484. function TrwPreviewAppProxy.MergeGroup: IevDualStream;
  485. var
  486. D: IevDatagram;
  487. begin
  488. D := CreateDatagram(METHOD_RWPREVIEW_MERGEGROUP);
  489. D := SendRequest(D);
  490. Result := IInterface(D.Params.Value[METHOD_RESULT]) as IevDualStream;
  491. end;
  492.  
  493. procedure TrwPreviewAppProxy.Preview(const AReportResult: IevDualStream; const AParentWindow: Integer);
  494. var
  495. D: IevDatagram;
  496. begin
  497. D := CreateDatagram(METHOD_RWPREVIEW_PREVIEW);
  498. D.Params.AddValue('AReportResult', AReportResult);
  499. D.Params.AddValue('AParentWindow', AParentWindow);
  500. D := SendRequest(D);
  501. end;
  502.  
  503. procedure TrwPreviewAppProxy.PreviewGroup(const AParentWindow: Integer);
  504. var
  505. D: IevDatagram;
  506. begin
  507. D := CreateDatagram(METHOD_RWPREVIEW_PREVIEWGROUP);
  508. D.Params.AddValue('AParentWindow', AParentWindow);
  509. D := SendRequest(D);
  510. end;
  511.  
  512. procedure TrwPreviewAppProxy.Print(const AReportResult: IevDualStream;
  513. const APrintJobInfo: TrwPrintJobInfo);
  514. var
  515. D: IevDatagram;
  516. begin
  517. D := CreateDatagram(METHOD_RWPREVIEW_PRINT);
  518. D.Params.AddValue('AReportResult', AReportResult);
  519. D.Params.AddValue('APrintJobInfo.PrintJobName', APrintJobInfo.PrintJobName);
  520. D.Params.AddValue('APrintJobInfo.PrinterName', APrintJobInfo.PrinterName);
  521. D.Params.AddValue('APrintJobInfo.TrayName', APrintJobInfo.TrayName);
  522. D.Params.AddValue('APrintJobInfo.OutBinNbr', APrintJobInfo.OutBinNbr);
  523. D.Params.AddValue('APrintJobInfo.DuplexingMode', APrintJobInfo.DuplexingMode);
  524. D.Params.AddValue('APrintJobInfo.PrinterVerticalOffset', APrintJobInfo.PrinterVerticalOffset);
  525. D.Params.AddValue('APrintJobInfo.PrinterHorizontalOffset', APrintJobInfo.PrinterHorizontalOffset);
  526. D.Params.AddValue('APrintJobInfo.FirstPage', APrintJobInfo.FirstPage);
  527. D.Params.AddValue('APrintJobInfo.LastPage', APrintJobInfo.LastPage);
  528. D.Params.AddValue('APrintJobInfo.Layers', APrintJobInfo.Layers);
  529. D.Params.AddValue('APrintJobInfo.Copies', APrintJobInfo.Copies);
  530.  
  531. D := SendRequest(D);
  532. end;
  533.  
  534. procedure TrwPreviewAppProxy.PrintGroup(const APrintJobInfo: TrwPrintJobInfo);
  535. var
  536. D: IevDatagram;
  537. begin
  538. D := CreateDatagram(METHOD_RWPREVIEW_PRINTGROUP);
  539. D.Params.AddValue('APrintJobInfo.PrintJobName', APrintJobInfo.PrintJobName);
  540. D.Params.AddValue('APrintJobInfo.PrinterName', APrintJobInfo.PrinterName);
  541. D.Params.AddValue('APrintJobInfo.TrayName', APrintJobInfo.TrayName);
  542. D.Params.AddValue('APrintJobInfo.OutBinNbr', APrintJobInfo.OutBinNbr);
  543. D.Params.AddValue('APrintJobInfo.DuplexingMode', APrintJobInfo.DuplexingMode);
  544. D.Params.AddValue('APrintJobInfo.PrinterVerticalOffset', APrintJobInfo.PrinterVerticalOffset);
  545. D.Params.AddValue('APrintJobInfo.PrinterHorizontalOffset', APrintJobInfo.PrinterHorizontalOffset);
  546. D.Params.AddValue('APrintJobInfo.FirstPage', APrintJobInfo.FirstPage);
  547. D.Params.AddValue('APrintJobInfo.LastPage', APrintJobInfo.LastPage);
  548. D.Params.AddValue('APrintJobInfo.Layers', APrintJobInfo.Layers);
  549. D.Params.AddValue('APrintJobInfo.Copies', APrintJobInfo.Copies);
  550.  
  551. D := SendRequest(D);
  552. end;
  553.  
  554. function TrwPreviewAppProxy.QueryInfo(const AItemName: String): String;
  555. var
  556. D: IevDatagram;
  557. begin
  558. D := CreateDatagram(METHOD_RWPREVIEW_QUERYINFO);
  559. D.Params.AddValue('AItemName', AItemName);
  560. D := SendRequest(D);
  561. Result := D.Params.Value[METHOD_RESULT];
  562. end;
  563.  
  564. function TrwPreviewAppProxy.ReportsInGroup: Integer;
  565. var
  566. D: IevDatagram;
  567. begin
  568. D := CreateDatagram(METHOD_RWPREVIEW_REPORTSINGROUP);
  569. D := SendRequest(D);
  570. Result := D.Params.Value[METHOD_RESULT];
  571. end;
  572.  
  573. procedure TrwPreviewAppProxy.SetFormBounds(const ABounds: TrwBounds);
  574. var
  575. D: IevDatagram;
  576. begin
  577. D := CreateDatagram(METHOD_RWPREVIEW_SETFORMBOUNDS);
  578. D.Params.AddValue('ABounds.Left', ABounds.Left);
  579. D.Params.AddValue('ABounds.Top', ABounds.Top);
  580. D.Params.AddValue('ABounds.Width', ABounds.Width);
  581. D.Params.AddValue('ABounds.Height', ABounds.Height);
  582.  
  583. D := SendRequest(D);
  584. end;
  585.  
  586.  
  587. { TrwEngineAppProxy }
  588.  
  589. function TrwEngineAppProxy.CallAppAdapterFunction(
  590. const AFunctionName: String; const AParams: Variant): Variant;
  591. var
  592. D: IevDatagram;
  593. begin
  594. D := CreateDatagram(METHOD_RWENGINE_CallAppAdapterFunction);
  595. D.Params.AddValue('AFunctionName', AFunctionName);
  596. D.Params.AddValue('AParams', AParams);
  597.  
  598. D := SendRequest(D);
  599. Result := D.Params.Value[METHOD_RESULT];
  600. end;
  601.  
  602. function TrwEngineAppProxy.ChangeRWAInfo(const ARWAData: IevDualStream;
  603. const ACurrentPassword: String; const ANewInfo: TrwRWAFileInfo):IevDualStream;
  604. var
  605. D: IevDatagram;
  606. begin
  607. D := CreateDatagram(METHOD_RWENGINE_ChangeRWAInfo);
  608. D.Params.AddValue('ARWAData', ARWAData);
  609. D.Params.AddValue('ACurrentPassword', ACurrentPassword);
  610. D.Params.AddValue('ANewInfo.PreviewPassword', ANewInfo.PreviewPassword);
  611. D.Params.AddValue('ANewInfo.PrintPassword', ANewInfo.PrintPassword);
  612. D.Params.AddValue('ANewInfo.Compression', ANewInfo.Compression);
  613.  
  614. D := SendRequest(D);
  615. Result := IInterface(D.Params.Value[METHOD_RESULT]) as IevDualStream;
  616. end;
  617.  
  618. function TrwEngineAppProxy.ClassInheritsFrom(const AClassName,
  619. AAncestorClassName: String): Boolean;
  620. var
  621. D: IevDatagram;
  622. begin
  623. D := CreateDatagram(METHOD_RWENGINE_ClassInheritsFrom);
  624. D.Params.AddValue('AClassName', AClassName);
  625. D.Params.AddValue('AAncestorClassName', AAncestorClassName);
  626. D := SendRequest(D);
  627. Result := D.Params.Value[METHOD_RESULT];
  628. end;
  629.  
  630. procedure TrwEngineAppProxy.CloseActiveReport;
  631. var
  632. D: IevDatagram;
  633. begin
  634. FReportStructure := nil;
  635. D := CreateDatagram(METHOD_RWENGINE_CloseActiveReport);
  636. D := SendRequest(D);
  637. end;
  638.  
  639. procedure TrwEngineAppProxy.DoOnConstruction;
  640. begin
  641. inherited;
  642. FProcessController := TrwProcessController.Create(Self);
  643. end;
  644.  
  645. function TrwEngineAppProxy.GetActiveReport: IrwReportStructure;
  646. begin
  647. Result := FReportStructure;
  648. end;
  649.  
  650. function TrwEngineAppProxy.GetClassInfo(const AClassName: String): TrwClassInfo;
  651. var
  652. D: IevDatagram;
  653. begin
  654. D := CreateDatagram(METHOD_RWENGINE_GetClassInfo);
  655. D.Params.AddValue('AClassName', AClassName);
  656.  
  657. D := SendRequest(D);
  658. Result.ClassName := D.Params.Value[METHOD_RESULT + '.ClassName'];
  659. Result.AncestorClassName := D.Params.Value[METHOD_RESULT + '.AncestorClassName'];
  660. Result.DisplayName := D.Params.Value[METHOD_RESULT + '.DisplayName']
  661. end;
  662.  
  663. function TrwEngineAppProxy.GetExeName: String;
  664. begin
  665. Result := 'isRWEngine.exe';
  666. end;
  667.  
  668. function TrwEngineAppProxy.GetMainWindowHandle: Integer;
  669. var
  670. D: IevDatagram;
  671. begin
  672. D := CreateDatagram(METHOD_RWENGINE_GetMainWindowHandle);
  673. D := SendRequest(D);
  674. Result := D.Params.Value[METHOD_RESULT];
  675. end;
  676.  
  677. function TrwEngineAppProxy.GetProcessController: IrwProcessController;
  678. begin
  679. Result := FProcessController;
  680. end;
  681.  
  682. procedure TrwEngineAppProxy.InitializeAppAdapter(const AModuleName: String; const AAppCustomData: Variant);
  683. var
  684. D: IevDatagram;
  685. begin
  686. D := CreateDatagram(METHOD_RWENGINE_InitializeAppAdapter);
  687. D.Params.AddValue('AModuleName', AModuleName);
  688. D.Params.AddValue('AAppCustomData', AAppCustomData);
  689. D := SendRequest(D);
  690. end;
  691.  
  692. function TrwEngineAppProxy.IsQueryBuilderFormClosed(out AQueryData: IevDualStream): Boolean;
  693. var
  694. D: IevDatagram;
  695. begin
  696. D := CreateDatagram(METHOD_RWENGINE_IsQueryBuilderFormClosed);
  697. D := SendRequest(D);
  698. Result := D.Params.Value[METHOD_RESULT];
  699. AQueryData := IInterface(D.Params.Value['AQueryData']) as IevDualStream;
  700. end;
  701.  
  702. function TrwEngineAppProxy.OpenQueryBuilder(const AQueryData: IevDualStream;
  703. const ADescriptionView: Boolean): Boolean;
  704. var
  705. D: IevDatagram;
  706. begin
  707. D := CreateDatagram(METHOD_RWENGINE_OpenQueryBuilder);
  708. D.Params.AddValue('AQueryData', AQueryData);
  709. D.Params.AddValue('ADescriptionView', ADescriptionView);
  710.  
  711. D := SendRequest(D);
  712. Result := D.Params.Value[METHOD_RESULT];
  713. end;
  714.  
  715. function TrwEngineAppProxy.OpenQueryBuilder2(const AQueryData: IevDualStream;
  716. const ADescriptionView: Boolean): Boolean;
  717. var
  718. D: IevDatagram;
  719. begin
  720. D := CreateDatagram(METHOD_RWENGINE_OpenQueryBuilder2);
  721. D.Params.AddValue('AQueryData', AQueryData);
  722. D.Params.AddValue('ADescriptionView', ADescriptionView);
  723.  
  724. D := SendRequest(D);
  725. Result := D.Params.Value[METHOD_RESULT];
  726. end;
  727.  
  728. procedure TrwEngineAppProxy.OpenReportFromClass(const AClassName: String);
  729. var
  730. D: IevDatagram;
  731. begin
  732. D := CreateDatagram(METHOD_RWENGINE_OpenReportFromClass);
  733. D.Params.AddValue('AClassName', AClassName);
  734. D := SendRequest(D);
  735.  
  736. FReportStructure := TrwReportStructure.Create(Self);
  737. end;
  738.  
  739. procedure TrwEngineAppProxy.OpenReportFromStream(const AStream: IevDualStream);
  740. var
  741. D: IevDatagram;
  742. begin
  743. D := CreateDatagram(METHOD_RWENGINE_OpenReportFromStream);
  744. D.Params.AddValue('AStream', AStream);
  745. D := SendRequest(D);
  746.  
  747. FReportStructure := TrwReportStructure.Create(Self);
  748. end;
  749.  
  750. function TrwEngineAppProxy.QueryInfo(const AItemName: String): String;
  751. var
  752. D: IevDatagram;
  753. begin
  754. D := CreateDatagram(METHOD_RWENGINE_QueryInfo);
  755. D.Params.AddValue('AItemName', AItemName);
  756.  
  757. D := SendRequest(D);
  758. Result := D.Params.Value[METHOD_RESULT];
  759. end;
  760.  
  761. function TrwEngineAppProxy.GetReportParams: IisListOfValues;
  762. begin
  763. Result := nil;
  764. raise EisException.Create('Not implemented method.');
  765. end;
  766.  
  767. function TrwEngineAppProxy.RunActiveReport(const ARunSettings: TrwRunReportSettings): TrwReportResult;
  768. var
  769. D: IevDatagram;
  770. begin
  771. D := CreateDatagram(METHOD_RWENGINE_RunActiveReport);
  772. D.Params.AddValue('ARunSettings.ReturnParamsBack', ARunSettings.ReturnParamsBack);
  773. D.Params.AddValue('ARunSettings.Duplexing', ARunSettings.Duplexing);
  774. D.Params.AddValue('ARunSettings.ShowInputForm', ARunSettings.ShowInputForm);
  775. D.Params.AddValue('ARunSettings.Suspended', ARunSettings.Suspended);
  776. D.Params.AddValue('ARunSettings.ReportName', ARunSettings.ReportName);
  777.  
  778. D := SendRequest(D);
  779. Result.Data := IInterface(D.Params.Value[METHOD_RESULT + '.Data']) as IevDualStream;
  780. Result.FormatType := TrwReportResultFormatType(D.Params.Value[METHOD_RESULT + '.FormatType']);
  781. Result.PageInfo := D.Params.Value[METHOD_RESULT + '.PageInfo'];
  782. Result.MiscInfo := D.Params.Value[METHOD_RESULT + '.MiscInfo'];
  783. end;
  784.  
  785. function TrwEngineAppProxy.RunQuery(const AQueryData: IevDualStream;
  786. const AParams: Variant): Variant;
  787. var
  788. D: IevDatagram;
  789. begin
  790. D := CreateDatagram(METHOD_RWENGINE_RunQuery);
  791. D.Params.AddValue('AQueryData', AQueryData);
  792. D.Params.AddValue('AParams', AParams);
  793.  
  794. D := SendRequest(D);
  795. Result := D.Params.Value[METHOD_RESULT];
  796. end;
  797.  
  798. function TrwEngineAppProxy.RunReport(const AReportData: IevDualStream;
  799. const AReportName: String; out AReportResult: IevDualStream): Variant;
  800. var
  801. D: IevDatagram;
  802. begin
  803. D := CreateDatagram(METHOD_RWENGINE_RunReport);
  804. D.Params.AddValue('AReportData', AReportData);
  805. D.Params.AddValue('AReportName', AReportName);
  806. D := SendRequest(D);
  807.  
  808. Result := D.Params.Value[METHOD_RESULT];
  809. AReportResult := IInterface(D.Params.Value['AReportResult']) as IevDualStream;
  810. end;
  811.  
  812. function TrwEngineAppProxy.RWAtoPDF(const ARWAData: IevDualStream;
  813. const APDFInfo: TrwPDFFileInfo): IevDualStream;
  814. var
  815. D: IevDatagram;
  816. begin
  817. D := CreateDatagram(METHOD_RWENGINE_RWAtoPDF);
  818. D.Params.AddValue('ARWAData', ARWAData);
  819. D.Params.AddValue('APDFInfo.Author', APDFInfo.Author);
  820. D.Params.AddValue('APDFInfo.Creator', APDFInfo.Creator);
  821. D.Params.AddValue('APDFInfo.Subject', APDFInfo.Subject);
  822. D.Params.AddValue('APDFInfo.Title', APDFInfo.Title);
  823. D.Params.AddValue('APDFInfo.Compression', APDFInfo.Compression);
  824. D.Params.AddValue('APDFInfo.ProtectionOptions', APDFInfo.ProtectionOptions);
  825. D.Params.AddValue('APDFInfo.OwnerPassword', APDFInfo.OwnerPassword);
  826. D.Params.AddValue('APDFInfo.UserPassword', APDFInfo.UserPassword);
  827.  
  828. D := SendRequest(D);
  829. Result := IInterface(D.Params.Value[METHOD_RESULT]) as IevDualStream;
  830. end;
  831.  
  832. procedure TrwEngineAppProxy.SetExternalModuleData(
  833. const AModuleName: String; const AData: IevDualStream);
  834. var
  835. D: IevDatagram;
  836. begin
  837. D := CreateDatagram(METHOD_RWENGINE_SetExternalModuleData);
  838. D.Params.AddValue('AModuleName', AModuleName);
  839. D.Params.AddValue('AData', AData);
  840. D := SendRequest(D);
  841. end;
  842.  
  843. { TrwReportStructure }
  844.  
  845. procedure TrwReportStructure.CloseCancel;
  846. var
  847. D: IevDatagram;
  848. begin
  849. D := FOwner.CreateDatagram(METHOD_RWENGINE_RI_CloseCancel);
  850. D := FOwner.SendRequest(D);
  851. end;
  852.  
  853. procedure TrwReportStructure.CloseOK;
  854. var
  855. D: IevDatagram;
  856. begin
  857. D := FOwner.CreateDatagram(METHOD_RWENGINE_RI_CloseOK);
  858. D := FOwner.SendRequest(D);
  859. end;
  860.  
  861. procedure TrwReportStructure.Compile;
  862. var
  863. D: IevDatagram;
  864. begin
  865. D := FOwner.CreateDatagram(METHOD_RWENGINE_RS_Compile);
  866. D := FOwner.SendRequest(D);
  867. end;
  868.  
  869. constructor TrwReportStructure.Create(const AOwner: TrwEngineAppProxy);
  870. begin
  871. inherited Create;
  872. FOwner := AOwner;
  873. end;
  874.  
  875. function TrwReportStructure.GetCount: Integer;
  876. var
  877. D: IevDatagram;
  878. begin
  879. D := FOwner.CreateDatagram(METHOD_RWENGINE_RP_GetCount);
  880. D := FOwner.SendRequest(D);
  881. Result := D.Params.Value[METHOD_RESULT];
  882. end;
  883.  
  884. function TrwReportStructure.GetData: IevDualStream;
  885. var
  886. D: IevDatagram;
  887. begin
  888. D := FOwner.CreateDatagram(METHOD_RWENGINE_RS_GetData);
  889. D := FOwner.SendRequest(D);
  890. Result := IInterface(D.Params.Value[METHOD_RESULT]) as IevDualStream;
  891. end;
  892.  
  893. function TrwReportStructure.GetFormBounds: TrwBounds;
  894. var
  895. D: IevDatagram;
  896. begin
  897. D := FOwner.CreateDatagram(METHOD_RWENGINE_RI_GetFormBounds);
  898. D := FOwner.SendRequest(D);
  899.  
  900. Result.Left := D.Params.Value[METHOD_RESULT + '.Left'];
  901. Result.Top := D.Params.Value[METHOD_RESULT + '.Top'];
  902. Result.Width := D.Params.Value[METHOD_RESULT + '.Width'];
  903. Result.Height := D.Params.Value[METHOD_RESULT + '.Height'];
  904. end;
  905.  
  906. function TrwReportStructure.GetItems(const AIndex: Integer): TrwReportParam;
  907. var
  908. D: IevDatagram;
  909. begin
  910. D := FOwner.CreateDatagram(METHOD_RWENGINE_RP_GetItems);
  911. D.Params.AddValue('AIndex', AIndex);
  912.  
  913. D := FOwner.SendRequest(D);
  914. Result.Name := D.Params.Value[METHOD_RESULT + '.Name'];
  915. Result.Value := D.Params.Value[METHOD_RESULT + '.Value'];
  916. Result.RunTimeParam := D.Params.Value[METHOD_RESULT + '.RunTimeParam'];
  917. Result.ParamType := TrwReportParamType(D.Params.Value[METHOD_RESULT + '.ParamType']);
  918. end;
  919.  
  920. function TrwReportStructure.GetParamValue(const AParamName: String): Variant;
  921. var
  922. D: IevDatagram;
  923. begin
  924. D := FOwner.CreateDatagram(METHOD_RWENGINE_RP_GetParamValue);
  925. D.Params.AddValue('AParamName', AParamName);
  926. D := FOwner.SendRequest(D);
  927. Result := D.Params.Value[METHOD_RESULT];
  928. end;
  929.  
  930. function TrwReportStructure.GetReportInputForm: IrwReportInputForm;
  931. begin
  932. Result := Self;
  933. end;
  934.  
  935. function TrwReportStructure.GetReportParameters: IrwReportParameters;
  936. begin
  937. Result := Self;
  938. end;
  939.  
  940. function TrwReportStructure.GetStructureInfo: TrwReportStructureInfo;
  941. var
  942. D: IevDatagram;
  943. begin
  944. D := FOwner.CreateDatagram(METHOD_RWENGINE_RS_GetStructureInfo);
  945. D := FOwner.SendRequest(D);
  946.  
  947. Result.ReportClassName := D.Params.Value[METHOD_RESULT + '.ReportClassName'];
  948. Result.AncestorClassName := D.Params.Value[METHOD_RESULT + '.AncestorClassName'];
  949. Result.UsedLibComponents := D.Params.Value[METHOD_RESULT + '.UsedLibComponents'];
  950. Result.Description := D.Params.Value[METHOD_RESULT + '.Description'];
  951. end;
  952.  
  953. function TrwReportStructure.IndexOf(const AParamName: String): Integer;
  954. var
  955. D: IevDatagram;
  956. begin
  957. D := FOwner.CreateDatagram(METHOD_RWENGINE_RP_IndexOf);
  958. D.Params.AddValue('AParamName', AParamName);
  959. D := FOwner.SendRequest(D);
  960. Result := D.Params.Value[METHOD_RESULT];
  961. end;
  962.  
  963. function TrwReportStructure.ParamByName(const AParamName: String): TrwReportParam;
  964. var
  965. D: IevDatagram;
  966. begin
  967. D := FOwner.CreateDatagram(METHOD_RWENGINE_RP_ParamByName);
  968. D.Params.AddValue('AParamName', AParamName);
  969.  
  970. D := FOwner.SendRequest(D);
  971. Result.Name := D.Params.Value[METHOD_RESULT + '.Name'];
  972. Result.Value := D.Params.Value[METHOD_RESULT + '.Value'];
  973. Result.RunTimeParam := D.Params.Value[METHOD_RESULT + '.RunTimeParam'];
  974. Result.ParamType := TrwReportParamType(D.Params.Value[METHOD_RESULT + '.ParamType']);
  975. end;
  976.  
  977. procedure TrwReportStructure.ParamsFromStream(const AParams: IevDualStream);
  978. var
  979. D: IevDatagram;
  980. begin
  981. D := FOwner.CreateDatagram(METHOD_RWENGINE_RP_ParamsFromStream);
  982. D.Params.AddValue('AParams', AParams);
  983. D := FOwner.SendRequest(D);
  984. end;
  985.  
  986. function TrwReportStructure.ParamsToStream: IevDualStream;
  987. var
  988. D: IevDatagram;
  989. begin
  990. D := FOwner.CreateDatagram(METHOD_RWENGINE_RP_ParamsToStream);
  991. D := FOwner.SendRequest(D);
  992. Result := IInterface(D.Params.Value[METHOD_RESULT]) as IevDualStream;
  993. end;
  994.  
  995. procedure TrwReportStructure.PrepareForRunning;
  996. var
  997. D: IevDatagram;
  998. begin
  999. D := FOwner.CreateDatagram(METHOD_RWENGINE_RS_PrepareForRunning);
  1000. D := FOwner.SendRequest(D);
  1001. end;
  1002.  
  1003. procedure TrwReportStructure.SetFormBounds(const ABounds: TrwBounds);
  1004. var
  1005. D: IevDatagram;
  1006. begin
  1007. D := FOwner.CreateDatagram(METHOD_RWENGINE_RI_SetFormBounds);
  1008. D.Params.AddValue('ABounds.Left', ABounds.Left);
  1009. D.Params.AddValue('ABounds.Top', ABounds.Top);
  1010. D.Params.AddValue('ABounds.Width', ABounds.Width);
  1011. D.Params.AddValue('ABounds.Height', ABounds.Height);
  1012. D := FOwner.SendRequest(D);
  1013. end;
  1014.  
  1015. procedure TrwReportStructure.SetParamValue(const AParamName: String; const AValue: Variant);
  1016. var
  1017. D: IevDatagram;
  1018. begin
  1019. D := FOwner.CreateDatagram(METHOD_RWENGINE_RP_SetParamValue);
  1020. D.Params.AddValue('AParamName', AParamName);
  1021. D.Params.AddValue('AValue', AValue);
  1022. D := FOwner.SendRequest(D);
  1023. end;
  1024.  
  1025. function TrwReportStructure.Show(const AParentWndHandle: Integer; const ASetupMode: Boolean): Boolean;
  1026. var
  1027. D: IevDatagram;
  1028. begin
  1029. D := FOwner.CreateDatagram(METHOD_RWENGINE_RI_Show);
  1030. D.Params.AddValue('AParentWndHandle', AParentWndHandle);
  1031. D.Params.AddValue('ASetupMode', ASetupMode);
  1032. D := FOwner.SendRequest(D);
  1033. Result := D.Params.Value[METHOD_RESULT];
  1034. end;
  1035.  
  1036.  
  1037. { TrwProcessController }
  1038.  
  1039. function TrwProcessController.CalcExpression(const AExpression,
  1040. ADebugSymbolInfo: String): TrwVMExpressionResult;
  1041. var
  1042. D: IevDatagram;
  1043. begin
  1044. D := FOwner.CreateDatagram(METHOD_RWENGINE_PC_CalcExpression);
  1045. D.Params.AddValue('AExpression', AExpression);
  1046. D.Params.AddValue('ADebugSymbolInfo', ADebugSymbolInfo);
  1047. D := FOwner.SendRequest(D);
  1048. Result.ResultType := D.Params.Value[METHOD_RESULT + '.ResultType'];
  1049. Result.Result := D.Params.Value[METHOD_RESULT + '.Result'];
  1050. Result.ResultTypeText := D.Params.Value[METHOD_RESULT + '.ResultTypeText'];
  1051. Result.ResultText := D.Params.Value[METHOD_RESULT + '.ResultText'];
  1052. end;
  1053.  
  1054. constructor TrwProcessController.Create(const AOwner: TrwEngineAppProxy);
  1055. begin
  1056. inherited Create;
  1057. FOwner := AOwner;
  1058. end;
  1059.  
  1060. function TrwProcessController.GetState: TrwProcessState;
  1061. var
  1062. D: IevDatagram;
  1063. begin
  1064. D := FOwner.CreateDatagram(METHOD_RWENGINE_PC_GetState);
  1065. D := FOwner.SendRequest(D);
  1066. Result.VMState := D.Params.Value[METHOD_RESULT + '.VMState'];
  1067. Result.ExceptionText := D.Params.Value[METHOD_RESULT + '.ExceptionText'];
  1068. end;
  1069.  
  1070. function TrwProcessController.GetVMCallStack: Variant;
  1071. var
  1072. D: IevDatagram;
  1073. begin
  1074. D := FOwner.CreateDatagram(METHOD_RWENGINE_PC_GetVMCallStack);
  1075. D := FOwner.SendRequest(D);
  1076. Result := D.Params.Value[METHOD_RESULT];
  1077. end;
  1078.  
  1079. function TrwProcessController.GetVMRegisters: TrwVMRegisters;
  1080. var
  1081. D: IevDatagram;
  1082. begin
  1083. D := FOwner.CreateDatagram(METHOD_RWENGINE_PC_GetVMRegister);
  1084. D := FOwner.SendRequest(D);
  1085. Result.RegA := D.Params.Value[METHOD_RESULT + '.RegA'];
  1086. Result.RegB := D.Params.Value[METHOD_RESULT + '.RegB'];
  1087. Result.RegF := D.Params.Value[METHOD_RESULT + '.RegF'];
  1088. Result.CSIP := D.Params.Value[METHOD_RESULT + '.CSIP'];
  1089. end;
  1090.  
  1091. procedure TrwProcessController.OpenQueryBuilder(const AQueryData: IevDualStream;
  1092. const ADescriptionView: Boolean);
  1093. var
  1094. D: IevDatagram;
  1095. begin
  1096. D := FOwner.CreateDatagram(METHOD_RWENGINE_PC_OpenQueryBuilder);
  1097. D.Params.AddValue('AQueryData', AQueryData);
  1098. D.Params.AddValue('ADescriptionView', ADescriptionView);
  1099. D := FOwner.SendRequest(D);
  1100. end;
  1101.  
  1102. procedure TrwProcessController.Pause;
  1103. var
  1104. D: IevDatagram;
  1105. begin
  1106. D := FOwner.CreateDatagram(METHOD_RWENGINE_PC_Pause);
  1107. D := FOwner.SendRequest(D);
  1108. end;
  1109.  
  1110. procedure TrwProcessController.Run(const ARunAction: TrwRunAction);
  1111. var
  1112. D: IevDatagram;
  1113. begin
  1114. D := FOwner.CreateDatagram(METHOD_RWENGINE_PC_Run);
  1115. D.Params.AddValue('ARunAction', ARunAction);
  1116. D := FOwner.SendRequest(D);
  1117. end;
  1118.  
  1119. procedure TrwProcessController.SetBreakpoints(const ABreakpoints: Variant);
  1120. var
  1121. D: IevDatagram;
  1122. begin
  1123. D := FOwner.CreateDatagram(METHOD_RWENGINE_PC_SetBreakpoints);
  1124. D.Params.AddValue('ABreakpoints', ABreakpoints);
  1125. D := FOwner.SendRequest(D);
  1126. end;
  1127.  
  1128. procedure TrwProcessController.Stop;
  1129. var
  1130. D: IevDatagram;
  1131. begin
  1132. D := FOwner.CreateDatagram(METHOD_RWENGINE_PC_Stop);
  1133. D := FOwner.SendRequest(D);
  1134. end;
  1135.  
  1136. { TrwDesignerAppProxy }
  1137.  
  1138. function TrwDesignerAppProxy.CallAppAdapterFunction(
  1139. const AFunctionName: String; const AParams: Variant): Variant;
  1140. var
  1141. D: IevDatagram;
  1142. begin
  1143. D := CreateDatagram(METHOD_RWDESIGNER_CallAppAdapterFunction);
  1144. D.Params.AddValue('AFunctionName', AFunctionName);
  1145. D.Params.AddValue('AParams', AParams);
  1146. D := SendRequest(D);
  1147. Result := D.Params.Value[METHOD_RESULT];
  1148. end;
  1149.  
  1150. function TrwDesignerAppProxy.GetExeName: String;
  1151. begin
  1152. Result := 'isRWDesigner.exe';
  1153. end;
  1154.  
  1155. procedure TrwDesignerAppProxy.InitializeAppAdapter(const AModuleName: String;
  1156. const AAppCustomData: Variant);
  1157. var
  1158. D: IevDatagram;
  1159. begin
  1160. D := CreateDatagram(METHOD_RWDESIGNER_InitializeAppAdapter);
  1161. D.Params.AddValue('AModuleName', AModuleName);
  1162. D.Params.AddValue('AAppCustomData', AAppCustomData);
  1163. D := SendRequest(D);
  1164. end;
  1165.  
  1166. function TrwDesignerAppProxy.IsDesignerFormClosed(
  1167. out AReportData: IevDualStream): Boolean;
  1168. var
  1169. D: IevDatagram;
  1170. begin
  1171. D := CreateDatagram(METHOD_RWDESIGNER_IsDesignerFormClosed);
  1172. D := SendRequest(D);
  1173. Result := D.Params.Value[METHOD_RESULT];
  1174. AReportData := IInterface(D.Params.Value['AReportData']) as IevDualStream;
  1175. end;
  1176.  
  1177. function TrwDesignerAppProxy.IsQueryBuilderFormClosed(
  1178. out AQueryData: IevDualStream): Boolean;
  1179. var
  1180. D: IevDatagram;
  1181. begin
  1182. D := CreateDatagram(METHOD_RWDESIGNER_IsQueryBuilderFormClosed);
  1183. D := SendRequest(D);
  1184. Result := D.Params.Value[METHOD_RESULT];
  1185. AQueryData := IInterface(D.Params.Value['AQueryData']) as IevDualStream;
  1186. end;
  1187.  
  1188. function TrwDesignerAppProxy.OpenDesigner(const AReportData: IevDualStream;
  1189. const AReportName: String; const ADefaultReportType: Integer): Boolean;
  1190. var
  1191. D: IevDatagram;
  1192. begin
  1193. D := CreateDatagram(METHOD_RWDESIGNER_OpenDesigner);
  1194. D.Params.AddValue('AReportData', AReportData);
  1195. D.Params.AddValue('AReportName', AReportName);
  1196. D.Params.AddValue('ADefaultReportType', ADefaultReportType);
  1197. D := SendRequest(D);
  1198. Result := D.Params.Value[METHOD_RESULT];
  1199. end;
  1200.  
  1201. function TrwDesignerAppProxy.OpenDesigner2(
  1202. const AReportData: IevDualStream; const AReportName: String;
  1203. const ADefaultReportType: Integer): Boolean;
  1204. var
  1205. D: IevDatagram;
  1206. begin
  1207. D := CreateDatagram(METHOD_RWDESIGNER_OpenDesigner2);
  1208. D.Params.AddValue('AReportData', AReportData);
  1209. D.Params.AddValue('AReportName', AReportName);
  1210. D.Params.AddValue('ADefaultReportType', ADefaultReportType);
  1211. D := SendRequest(D);
  1212. Result := D.Params.Value[METHOD_RESULT];
  1213. end;
  1214.  
  1215. function TrwDesignerAppProxy.OpenQueryBuilder(
  1216. const AQueryData: IevDualStream;
  1217. const ADescriptionView: Boolean): Boolean;
  1218. var
  1219. D: IevDatagram;
  1220. begin
  1221. D := CreateDatagram(METHOD_RWDESIGNER_OpenQueryBuilder);
  1222. D.Params.AddValue('AQueryData', AQueryData);
  1223. D.Params.AddValue('ADescriptionView', ADescriptionView);
  1224. D := SendRequest(D);
  1225. Result := D.Params.Value[METHOD_RESULT];
  1226. end;
  1227.  
  1228. function TrwDesignerAppProxy.OpenQueryBuilder2(
  1229. const AQueryData: IevDualStream;
  1230. const ADescriptionView: Boolean): Boolean;
  1231. var
  1232. D: IevDatagram;
  1233. begin
  1234. D := CreateDatagram(METHOD_RWDESIGNER_OpenDesigner2);
  1235. D.Params.AddValue('AQueryData', AQueryData);
  1236. D.Params.AddValue('ADescriptionView', ADescriptionView);
  1237. D := SendRequest(D);
  1238. Result := D.Params.Value[METHOD_RESULT];
  1239. end;
  1240.  
  1241. function TrwDesignerAppProxy.QueryInfo(const AItemName: String): Variant;
  1242. var
  1243. D: IevDatagram;
  1244. begin
  1245. D := CreateDatagram(METHOD_RWDESIGNER_QueryInfo);
  1246. D.Params.AddValue('AItemName', AItemName);
  1247. D := SendRequest(D);
  1248. Result := D.Params.Value[METHOD_RESULT];
  1249. end;
  1250.  
  1251. function TrwDesignerAppProxy.RunQuery(const AQueryData: IevDualStream;
  1252. const AParams: Variant): Variant;
  1253. var
  1254. D: IevDatagram;
  1255. begin
  1256. D := CreateDatagram(METHOD_RWDESIGNER_RunQuery);
  1257. D.Params.AddValue('AQueryData', AQueryData);
  1258. D.Params.AddValue('AParams', AParams);
  1259. D := SendRequest(D);
  1260. Result := D.Params.Value[METHOD_RESULT];
  1261. end;
  1262.  
  1263. { TevRWDatagramDispatcher }
  1264.  
  1265. procedure TevRWDatagramDispatcher.DoOnIdle;
  1266. var
  1267. Msg: TMsg;
  1268. begin
  1269. inherited;
  1270. if CurrentThreadIsMain then
  1271. begin
  1272. try
  1273. while PeekMessage(Msg, 0, WM_PAINT, WM_PAINT, PM_REMOVE) do
  1274. DispatchMessage(Msg);
  1275. except
  1276. end;
  1277. end;
  1278. end;
  1279.  
  1280. initialization
  1281. InitLock := TisLock.Create;
  1282. AppMutexName := '9425DB6DF63C47D0BB4BEAE746B9FC4A'; //GetUniqueID;
  1283. AppMutex := CreateMutex(nil, True, PAnsiChar(AppMutexName));
  1284.  
  1285. finalization
  1286. CloseHandle(AppMutex);
  1287.  
  1288. end.
Add Comment
Please, Sign In to add comment