| 1 | { **************************************************************
 | 
|---|
| 2 |         Package: XWB - Kernel RPCBroker
 | 
|---|
| 3 |         Date Created: Sept 18, 1997 (Version 1.1)
 | 
|---|
| 4 |         Site Name: Oakland, OI Field Office, Dept of Veteran Affairs
 | 
|---|
| 5 |         Developers: Danila Manapsal, Don Craven, Joel Ivey
 | 
|---|
| 6 |         Description: Contains TRPCBroker and related components.
 | 
|---|
| 7 |         Current Release: Version 1.1 Patch 40 (January 7, 2005))
 | 
|---|
| 8 | *************************************************************** }
 | 
|---|
| 9 | 
 | 
|---|
| 10 | {**************************************************
 | 
|---|
| 11 | This is the hierarchy of things:
 | 
|---|
| 12 |    TRPCBroker contains
 | 
|---|
| 13 |       TParams, which contains
 | 
|---|
| 14 |          array of TParamRecord each of which contains
 | 
|---|
| 15 |                   TMult
 | 
|---|
| 16 | 
 | 
|---|
| 17 | v1.1*4 Silent Login changes (DCM) 10/22/98
 | 
|---|
| 18 | 
 | 
|---|
| 19 | 1.1*6 Polling to support terminating arphaned server jobs. (P6)
 | 
|---|
| 20 |       == DPC 4/99
 | 
|---|
| 21 | 
 | 
|---|
| 22 | 1.1*8 Check for Multi-Division users. (P8) - REM 7/13/99
 | 
|---|
| 23 | 
 | 
|---|
| 24 | 1.1*13 More silent login code; deleted obsolete lines (DCM) 9/10/99  // p13
 | 
|---|
| 25 | LAST UPDATED: 5/24/2001   // p13  JLI
 | 
|---|
| 26 | 
 | 
|---|
| 27 | 1.1*31 Added new read only property BrokerVersion to TRPCBroker which
 | 
|---|
| 28 |        should contain the version number for the RPCBroker
 | 
|---|
| 29 |        (or SharedRPCBroker) in use.
 | 
|---|
| 30 | **************************************************}
 | 
|---|
| 31 | unit Trpcb;
 | 
|---|
| 32 | 
 | 
|---|
| 33 | interface
 | 
|---|
| 34 | 
 | 
|---|
| 35 | {$I IISBase.inc}
 | 
|---|
| 36 | 
 | 
|---|
| 37 | uses
 | 
|---|
| 38 |   {Delphi standard}
 | 
|---|
| 39 |   Classes, Controls, Dialogs, {DsgnIntf,} Forms, Graphics, Messages, SysUtils,
 | 
|---|
| 40 |   WinProcs, WinTypes, Windows,
 | 
|---|
| 41 |   extctrls, {P6}
 | 
|---|
| 42 |   {VA}
 | 
|---|
| 43 |   XWBut1, {RpcbEdtr,} MFunStr, Hash;  //P14 -- pack split
 | 
|---|
| 44 | 
 | 
|---|
| 45 | const
 | 
|---|
| 46 |   NoMore: boolean = False;
 | 
|---|
| 47 |   MIN_RPCTIMELIMIT: integer = 30;
 | 
|---|
| 48 |   CURRENT_RPC_VERSION: String = 'XWB*1.1*40';
 | 
|---|
| 49 | 
 | 
|---|
| 50 | type
 | 
|---|
| 51 | 
 | 
|---|
| 52 | TParamType = (literal, reference, list, global, empty, stream, undefined);  // 030107 JLI Modified for new message protocol
 | 
|---|
| 53 | 
 | 
|---|
| 54 | //P14 -- pack split -- Types moved from RpcbEdtr.pas.
 | 
|---|
| 55 | TAccessVerifyCodes = string[255];  //to use TAccessVerifyCodesProperty editor use this type
 | 
|---|
| 56 | TRemoteProc = string[100];         //to use TRemoteProcProperty editor use this type
 | 
|---|
| 57 | TServer = string[255];             //to use TServerProperty editor use this type
 | 
|---|
| 58 | TRpcVersion = string[255];         //to use TRpcVersionProperty editor use this type
 | 
|---|
| 59 | 
 | 
|---|
| 60 | TRPCBroker = class;
 | 
|---|
| 61 | TVistaLogin = class;
 | 
|---|
| 62 | // p13 
 | 
|---|
| 63 | TLoginMode = (lmAVCodes, lmAppHandle, lmNTToken);
 | 
|---|
| 64 | TShowErrorMsgs = (semRaise, semQuiet);  // p13
 | 
|---|
| 65 | TOnLoginFailure = procedure (VistaLogin: TVistaLogin) of object; //p13
 | 
|---|
| 66 | TOnRPCBFailure = procedure (RPCBroker: TRPCBroker) of object; //p13
 | 
|---|
| 67 | TOnPulseError = procedure(RPCBroker: TRPCBroker; ErrorText: String) of object;
 | 
|---|
| 68 | // TOnRPCCall = procedure (RPCBroker: TRPCBroker; SetNum: Integer; RemoteProcedure: TRemoteProc; CurrentContext: String; RpcVersion: TRpcVersion; Param: TParams; RPCTimeLimit: Integer; Results, Sec, App: PChar; DateTime: TDateTime) of object;
 | 
|---|
| 69 | 
 | 
|---|
| 70 | {------ EBrokerError ------}
 | 
|---|
| 71 | EBrokerError = class(Exception)
 | 
|---|
| 72 | public
 | 
|---|
| 73 |   Action: string;
 | 
|---|
| 74 |   Code: integer;
 | 
|---|
| 75 |   Mnemonic: string;
 | 
|---|
| 76 | end;
 | 
|---|
| 77 | 
 | 
|---|
| 78 | {------ TString ------}
 | 
|---|
| 79 | 
 | 
|---|
| 80 | TString = class(TObject)
 | 
|---|
| 81 |   Str: string;
 | 
|---|
| 82 | end;
 | 
|---|
| 83 | 
 | 
|---|
| 84 | {------ TMult ------}
 | 
|---|
| 85 | {:This component defines the multiple field of a parameter.  The multiple
 | 
|---|
| 86 |  field is used to pass string-subscripted array of data in a parameter.}
 | 
|---|
| 87 | 
 | 
|---|
| 88 | TMult = class(TComponent)
 | 
|---|
| 89 | private
 | 
|---|
| 90 |   FMultiple: TStringList;
 | 
|---|
| 91 |   procedure ClearAll;
 | 
|---|
| 92 |   function  GetCount: Word;
 | 
|---|
| 93 |   function  GetFirst: string;
 | 
|---|
| 94 |   function  GetLast: string;
 | 
|---|
| 95 |   function  GetFMultiple(Index: string): string;
 | 
|---|
| 96 |   function  GetSorted: boolean;
 | 
|---|
| 97 |   procedure SetFMultiple(Index: string; value: string);
 | 
|---|
| 98 |   procedure SetSorted(Value: boolean);
 | 
|---|
| 99 | protected
 | 
|---|
| 100 | public
 | 
|---|
| 101 |   constructor Create(AOwner: TComponent); override;      {1.1T8}
 | 
|---|
| 102 |   destructor Destroy; override;
 | 
|---|
| 103 |   procedure Assign(Source: TPersistent); override;
 | 
|---|
| 104 |   function Order(const StartSubscript: string; Direction: integer): string;
 | 
|---|
| 105 |   function Position(const Subscript: string): longint;
 | 
|---|
| 106 |   function Subscript(const Position: longint): string;
 | 
|---|
| 107 |   property Count: Word read GetCount;
 | 
|---|
| 108 |   property First: string read GetFirst;
 | 
|---|
| 109 |   property Last: string read GetLast;
 | 
|---|
| 110 |   property MultArray[I: string]: string
 | 
|---|
| 111 |            read GetFMultiple write SetFMultiple; default;
 | 
|---|
| 112 |   property Sorted: boolean read GetSorted write SetSorted;
 | 
|---|
| 113 | end;
 | 
|---|
| 114 | 
 | 
|---|
| 115 | {------ TParamRecord ------}
 | 
|---|
| 116 | {:This component defines all the fields that comprise a parameter.}
 | 
|---|
| 117 | 
 | 
|---|
| 118 | TParamRecord = class(TComponent)
 | 
|---|
| 119 | private
 | 
|---|
| 120 |   FMult: TMult;
 | 
|---|
| 121 |   FValue: string;
 | 
|---|
| 122 |   FPType: TParamType;
 | 
|---|
| 123 | protected
 | 
|---|
| 124 | public
 | 
|---|
| 125 |   constructor Create(AOwner: TComponent); override;
 | 
|---|
| 126 |   destructor Destroy; override;
 | 
|---|
| 127 |   property Value: string read FValue write FValue;
 | 
|---|
| 128 |   property PType: TParamType read FPType write FPType;
 | 
|---|
| 129 |   property Mult: TMult read FMult write FMult;
 | 
|---|
| 130 | end;
 | 
|---|
| 131 | 
 | 
|---|
| 132 | {------ TParams ------}
 | 
|---|
| 133 | {:This component is really a collection of parameters.  Simple inclusion
 | 
|---|
| 134 |   of this component in the Broker component provides access to all of the
 | 
|---|
| 135 |   parameters that may be needed when calling a remote procedure.}
 | 
|---|
| 136 | 
 | 
|---|
| 137 | TParams = class(TComponent)
 | 
|---|
| 138 | private
 | 
|---|
| 139 |   FParameters: TList;
 | 
|---|
| 140 |   function GetCount: Word;
 | 
|---|
| 141 |   function GetParameter(Index: integer): TParamRecord;
 | 
|---|
| 142 |   procedure SetParameter(Index: integer; Parameter: TParamRecord);
 | 
|---|
| 143 | public
 | 
|---|
| 144 |   constructor Create(AOwner: TComponent); override;
 | 
|---|
| 145 |   destructor Destroy; override;
 | 
|---|
| 146 |   procedure Assign(Source: TPersistent); override;
 | 
|---|
| 147 |   procedure Clear;
 | 
|---|
| 148 |   property Count: Word read GetCount;
 | 
|---|
| 149 |   property ParamArray[I: integer]: TParamRecord
 | 
|---|
| 150 |                       read GetParameter write SetParameter; default;
 | 
|---|
| 151 | end;
 | 
|---|
| 152 | 
 | 
|---|
| 153 | 
 | 
|---|
| 154 | {------ TVistaLogin ------}     //p13
 | 
|---|
| 155 | TVistaLogin = class(TPersistent)
 | 
|---|
| 156 | private
 | 
|---|
| 157 |   FLogInHandle : string;
 | 
|---|
| 158 |   FNTToken : string;
 | 
|---|
| 159 |   FAccessCode : string;
 | 
|---|
| 160 |   FVerifyCode : string;
 | 
|---|
| 161 |   FDivision   : string;
 | 
|---|
| 162 |   FMode: TLoginMode;
 | 
|---|
| 163 |   FDivLst: TStrings;
 | 
|---|
| 164 |   FOnFailedLogin: TOnLoginFailure;
 | 
|---|
| 165 |   FMultiDivision : boolean;
 | 
|---|
| 166 |   FDUZ: string;
 | 
|---|
| 167 |   FErrorText : string;
 | 
|---|
| 168 |   FPromptDiv : boolean;
 | 
|---|
| 169 |   FIsProductionAccount: Boolean;
 | 
|---|
| 170 |   FDomainName: string;
 | 
|---|
| 171 |   procedure SetAccessCode(const Value: String);
 | 
|---|
| 172 |   procedure SetLogInHandle(const Value: String);
 | 
|---|
| 173 |   procedure SetNTToken(const Value: String);
 | 
|---|
| 174 |   procedure SetVerifyCode(const Value: String);
 | 
|---|
| 175 |   procedure SetDivision(const Value: String);
 | 
|---|
| 176 |   //procedure SetWorkstationIPAddress(const Value: String);
 | 
|---|
| 177 |   procedure SetMode(const Value: TLoginMode);
 | 
|---|
| 178 |   procedure SetMultiDivision(Value: Boolean);
 | 
|---|
| 179 |   procedure SetDuz(const Value: string);
 | 
|---|
| 180 |   procedure SetErrorText(const Value: string);
 | 
|---|
| 181 |   procedure SetPromptDiv(const Value: boolean);
 | 
|---|
| 182 | protected
 | 
|---|
| 183 |   procedure FailedLogin(Sender: TObject); dynamic;
 | 
|---|
| 184 | public
 | 
|---|
| 185 |   constructor Create(AOwner: TComponent); virtual;
 | 
|---|
| 186 |   destructor Destroy; override;
 | 
|---|
| 187 |   property LogInHandle: String read FLogInHandle write SetLogInHandle;  //for use by a 2ndary DHCP login OR ESSO login
 | 
|---|
| 188 |   property NTToken: String read FNTToken write SetNTToken;
 | 
|---|
| 189 |   property DivList: TStrings read FDivLst;
 | 
|---|
| 190 |   property OnFailedLogin: TOnLoginFailure read FOnFailedLogin write FOnFailedLogin;
 | 
|---|
| 191 |   property MultiDivision: Boolean read FMultiDivision write SetMultiDivision;
 | 
|---|
| 192 |   property DUZ: string read FDUZ write SetDuz;
 | 
|---|
| 193 |   property ErrorText: string read FErrorText write SetErrorText;
 | 
|---|
| 194 |   property IsProductionAccount: Boolean read FIsProductionAccount write
 | 
|---|
| 195 |       FIsProductionAccount;
 | 
|---|
| 196 |   property DomainName: string read FDomainName write FDomainName;
 | 
|---|
| 197 | published
 | 
|---|
| 198 |   property AccessCode: String read FAccessCode write SetAccessCode;
 | 
|---|
| 199 |   property VerifyCode: String read FVerifyCode write SetVerifyCode;
 | 
|---|
| 200 |   property Mode: TLoginMode read FMode write SetMode;
 | 
|---|
| 201 |   property Division: String read FDivision write SetDivision;
 | 
|---|
| 202 |   property PromptDivision: boolean read FPromptDiv write SetPromptDiv;
 | 
|---|
| 203 | 
 | 
|---|
| 204 | end;
 | 
|---|
| 205 | 
 | 
|---|
| 206 | {------ TVistaUser ------}   //holds 'generic' user attributes {p13}
 | 
|---|
| 207 | TVistaUser = class(TObject)
 | 
|---|
| 208 | private
 | 
|---|
| 209 |   FDUZ: string;
 | 
|---|
| 210 |   FName: string;
 | 
|---|
| 211 |   FStandardName: string;
 | 
|---|
| 212 |   FDivision: String;
 | 
|---|
| 213 |   FVerifyCodeChngd: Boolean;
 | 
|---|
| 214 |   FTitle: string;
 | 
|---|
| 215 |   FServiceSection: string;
 | 
|---|
| 216 |   FLanguage: string;
 | 
|---|
| 217 |   FDtime: string;
 | 
|---|
| 218 |   FVpid: String;
 | 
|---|
| 219 |   procedure SetDivision(const Value: String);
 | 
|---|
| 220 |   procedure SetDUZ(const Value: String);
 | 
|---|
| 221 |   procedure SetName(const Value: String);
 | 
|---|
| 222 |   procedure SetVerifyCodeChngd(const Value: Boolean);
 | 
|---|
| 223 |   procedure SetStandardName(const Value: String);
 | 
|---|
| 224 |   procedure SetTitle(const Value: string);
 | 
|---|
| 225 |   procedure SetDTime(const Value: string);
 | 
|---|
| 226 |   procedure SetLanguage(const Value: string);
 | 
|---|
| 227 |   procedure SetServiceSection(const Value: string);
 | 
|---|
| 228 | public
 | 
|---|
| 229 |   property DUZ: String read FDUZ write SetDUZ;
 | 
|---|
| 230 |   property Name: String read FName write SetName;
 | 
|---|
| 231 |   property StandardName: String read FStandardName write SetStandardName;
 | 
|---|
| 232 |   property Division: String read FDivision write SetDivision;
 | 
|---|
| 233 |   property VerifyCodeChngd: Boolean read FVerifyCodeChngd write SetVerifyCodeChngd;
 | 
|---|
| 234 |   property Title: string read FTitle write SetTitle;
 | 
|---|
| 235 |   property ServiceSection: string read FServiceSection write SetServiceSection;
 | 
|---|
| 236 |   property Language: string read FLanguage write SetLanguage;
 | 
|---|
| 237 |   property DTime: string read FDTime write SetDTime;
 | 
|---|
| 238 |   property Vpid: string read FVpid write FVpid;
 | 
|---|
| 239 | end;
 | 
|---|
| 240 | 
 | 
|---|
| 241 | {------ TRPCBroker ------}
 | 
|---|
| 242 | {:This component, when placed on a form, allows design-time and run-time
 | 
|---|
| 243 |   connection to the server by simply toggling the Connected property.
 | 
|---|
| 244 |   Once connected you can access server data.}
 | 
|---|
| 245 | 
 | 
|---|
| 246 | TRPCBroker = class(TComponent)
 | 
|---|
| 247 | //private
 | 
|---|
| 248 | private
 | 
|---|
| 249 |   FBrokerVersion: String;
 | 
|---|
| 250 |   FIsBackwardCompatibleConnection: Boolean;
 | 
|---|
| 251 |   FIsNewStyleConnection: Boolean;
 | 
|---|
| 252 |   FOldConnectionOnly: Boolean;
 | 
|---|
| 253 | protected
 | 
|---|
| 254 |   FAccessVerifyCodes: TAccessVerifyCodes;
 | 
|---|
| 255 |   FClearParameters: Boolean;
 | 
|---|
| 256 |   FClearResults: Boolean;
 | 
|---|
| 257 |   FConnected: Boolean;
 | 
|---|
| 258 |   FConnecting: Boolean;
 | 
|---|
| 259 |   FCurrentContext: String;
 | 
|---|
| 260 |   FDebugMode: Boolean;
 | 
|---|
| 261 |   FListenerPort: integer;
 | 
|---|
| 262 |   FParams: TParams;
 | 
|---|
| 263 |   FResults: TStrings;
 | 
|---|
| 264 |   FRemoteProcedure: TRemoteProc;
 | 
|---|
| 265 |   FRpcVersion: TRpcVersion;
 | 
|---|
| 266 |   FServer: TServer;
 | 
|---|
| 267 |   FSocket: integer;
 | 
|---|
| 268 |   FRPCTimeLimit : integer;    //for adjusting client RPC duration timeouts
 | 
|---|
| 269 |   FPulse        : TTimer;     //P6
 | 
|---|
| 270 |   FKernelLogIn  : Boolean;    //p13
 | 
|---|
| 271 |   FLogIn: TVistaLogIn;    //p13
 | 
|---|
| 272 |   FUser: TVistaUser; //p13
 | 
|---|
| 273 |   FOnRPCBFailure: TOnRPCBFailure;
 | 
|---|
| 274 |   FShowErrorMsgs: TShowErrorMsgs;
 | 
|---|
| 275 |   FRPCBError:     String;
 | 
|---|
| 276 |   FOnPulseError: TOnPulseError;
 | 
|---|
| 277 | protected
 | 
|---|
| 278 |   procedure   SetClearParameters(Value: Boolean); virtual;
 | 
|---|
| 279 |   procedure   SetClearResults(Value: Boolean); virtual;
 | 
|---|
| 280 |   procedure   SetConnected(Value: Boolean); virtual;
 | 
|---|
| 281 |   procedure   SetResults(Value: TStrings); virtual;
 | 
|---|
| 282 |   procedure   SetServer(Value: TServer); virtual;
 | 
|---|
| 283 |   procedure   SetRPCTimeLimit(Value: integer); virtual;  //Screen changes to timeout.
 | 
|---|
| 284 |   procedure   DoPulseOnTimer(Sender: TObject); virtual;  //p6
 | 
|---|
| 285 |   procedure   SetKernelLogIn(const Value: Boolean); virtual;
 | 
|---|
| 286 | //  procedure   SetLogIn(const Value: TVistaLogIn); virtual;
 | 
|---|
| 287 |   procedure   SetUser(const Value: TVistaUser); virtual;
 | 
|---|
| 288 | public
 | 
|---|
| 289 |   XWBWinsock: TObject;
 | 
|---|
| 290 |   property    AccessVerifyCodes: TAccessVerifyCodes read FAccessVerifyCodes write FAccessVerifyCodes;
 | 
|---|
| 291 |   property    Param: TParams read FParams write FParams;
 | 
|---|
| 292 |   property    Socket: integer read FSocket;
 | 
|---|
| 293 |   property    RPCTimeLimit : integer read FRPCTimeLimit write SetRPCTimeLimit;
 | 
|---|
| 294 |   destructor  Destroy; override;
 | 
|---|
| 295 |   procedure   Call; virtual;
 | 
|---|
| 296 |   procedure   Loaded; override;
 | 
|---|
| 297 |   procedure   lstCall(OutputBuffer: TStrings); virtual;
 | 
|---|
| 298 |   function    pchCall: PChar; virtual;
 | 
|---|
| 299 |   function    strCall: string; virtual;
 | 
|---|
| 300 |   function    CreateContext(strContext: string): boolean; virtual;
 | 
|---|
| 301 |   property    CurrentContext: String read FCurrentContext;
 | 
|---|
| 302 |   property    User: TVistaUser read FUser write SetUser;
 | 
|---|
| 303 |   property    OnRPCBFailure: TOnRPCBFailure read FOnRPCBFailure write FOnRPCBFailure;
 | 
|---|
| 304 |   property    RPCBError: String read FRPCBError write FRPCBError;
 | 
|---|
| 305 |   property    OnPulseError: TOnPulseError read FOnPulseError write FOnPulseError;
 | 
|---|
| 306 |   property    BrokerVersion: String read FBrokerVersion;
 | 
|---|
| 307 |   property IsNewStyleConnection: Boolean read FIsNewStyleConnection;
 | 
|---|
| 308 | published
 | 
|---|
| 309 |   constructor Create(AOwner: TComponent); override;
 | 
|---|
| 310 |   property    ClearParameters: boolean read FClearParameters
 | 
|---|
| 311 |               write SetClearParameters;
 | 
|---|
| 312 |   property    ClearResults: boolean read FClearResults write SetClearResults;
 | 
|---|
| 313 |   property    Connected: boolean read FConnected write SetConnected;
 | 
|---|
| 314 |   property    DebugMode: boolean read FDebugMode write FDebugMode default False;
 | 
|---|
| 315 |   property    ListenerPort: integer read FListenerPort write FListenerPort;
 | 
|---|
| 316 |   property    Results: TStrings read FResults write SetResults;
 | 
|---|
| 317 |   property    RemoteProcedure: TRemoteProc read FRemoteProcedure
 | 
|---|
| 318 |               write FRemoteProcedure;
 | 
|---|
| 319 |   property    RpcVersion: TRpcVersion read FRpcVersion write FRpcVersion;
 | 
|---|
| 320 |   property    Server: TServer read FServer write SetServer;
 | 
|---|
| 321 |   property    KernelLogIn: Boolean read FKernelLogIn write SetKernelLogIn;
 | 
|---|
| 322 |   property    ShowErrorMsgs: TShowErrorMsgs read FShowErrorMsgs write FShowErrorMsgs default semRaise;
 | 
|---|
| 323 |   property    LogIn: TVistaLogIn read FLogIn write FLogin; // SetLogIn;
 | 
|---|
| 324 |   property    IsBackwardCompatibleConnection: Boolean read
 | 
|---|
| 325 |       FIsBackwardCompatibleConnection write FIsBackwardCompatibleConnection 
 | 
|---|
| 326 |       default True;
 | 
|---|
| 327 |   property    OldConnectionOnly: Boolean read FOldConnectionOnly write 
 | 
|---|
| 328 |       FOldConnectionOnly;
 | 
|---|
| 329 |  end;
 | 
|---|
| 330 | 
 | 
|---|
| 331 | {procedure Register;}  //P14 --pack split
 | 
|---|
| 332 | procedure StoreConnection(Broker: TRPCBroker);
 | 
|---|
| 333 | function  RemoveConnection(Broker: TRPCBroker): boolean;
 | 
|---|
| 334 | function  DisconnectAll(Server: string; ListenerPort: integer): boolean;
 | 
|---|
| 335 | function  ExistingSocket(Broker: TRPCBroker): integer;
 | 
|---|
| 336 | procedure AuthenticateUser(ConnectingBroker: TRPCBroker);
 | 
|---|
| 337 | procedure GetBrokerInfo(ConnectedBroker : TRPCBroker);  //P6
 | 
|---|
| 338 | function  NoSignOnNeeded : Boolean;
 | 
|---|
| 339 | function  ProcessExecute(Command: string; cShow: Word): Integer;
 | 
|---|
| 340 | function  GetAppHandle(ConnectedBroker : TRPCBroker): String;
 | 
|---|
| 341 | function ShowApplicationAndFocusOK(anApplication: TApplication): boolean;
 | 
|---|
| 342 | 
 | 
|---|
| 343 | 
 | 
|---|
| 344 | var
 | 
|---|
| 345 |   DebugData: string;
 | 
|---|
| 346 |   BrokerConnections: TStringList;   {this list stores all connections by socket number}
 | 
|---|
| 347 |   BrokerAllConnections: TStringList; {this list stores all connections to all of
 | 
|---|
| 348 |                 the servers, by an application.  It's used in DisconnectAll}
 | 
|---|
| 349 | 
 | 
|---|
| 350 | implementation
 | 
|---|
| 351 | 
 | 
|---|
| 352 | uses
 | 
|---|
| 353 |   Loginfrm, RpcbErr, SelDiv{p8}, RpcSLogin{p13}, fRPCBErrMsg, Wsockc;
 | 
|---|
| 354 | 
 | 
|---|
| 355 | const
 | 
|---|
| 356 |   DEFAULT_PULSE    : integer = 81000; //P6 default = 45% of 3 minutes.
 | 
|---|
| 357 |   MINIMUM_TIMEOUT  : integer = 14;    //P6 shortest allowable timeout in secs.
 | 
|---|
| 358 |   PULSE_PERCENTAGE : integer = 45;    //P6 % of timeout for pulse frequency.
 | 
|---|
| 359 | 
 | 
|---|
| 360 | {-------------------------- TMult.Create --------------------------
 | 
|---|
| 361 | ------------------------------------------------------------------}
 | 
|---|
| 362 | constructor TMult.Create(AOwner: TComponent);
 | 
|---|
| 363 | begin
 | 
|---|
| 364 |   inherited Create(AOwner);
 | 
|---|
| 365 |   FMultiple := TStringList.Create;
 | 
|---|
| 366 | end;
 | 
|---|
| 367 | 
 | 
|---|
| 368 | {------------------------- TMult.Destroy --------------------------
 | 
|---|
| 369 | ------------------------------------------------------------------}
 | 
|---|
| 370 | destructor TMult.Destroy;
 | 
|---|
| 371 | begin
 | 
|---|
| 372 |   ClearAll;
 | 
|---|
| 373 |   FMultiple.Free;
 | 
|---|
| 374 |   FMultiple := nil;
 | 
|---|
| 375 |   inherited Destroy;
 | 
|---|
| 376 | end;
 | 
|---|
| 377 | 
 | 
|---|
| 378 | {-------------------------- TMult.Assign --------------------------
 | 
|---|
| 379 | All of the items from source object are copied one by one into the
 | 
|---|
| 380 | target.  So if the source is later destroyed, target object will continue
 | 
|---|
| 381 | to hold the copy of all elements, completely unaffected.
 | 
|---|
| 382 | ------------------------------------------------------------------}
 | 
|---|
| 383 | procedure TMult.Assign(Source: TPersistent);
 | 
|---|
| 384 | var
 | 
|---|
| 385 |   I: integer;
 | 
|---|
| 386 |   SourceStrings: TStrings;
 | 
|---|
| 387 |   S: TString;
 | 
|---|
| 388 |   SourceMult: TMult;
 | 
|---|
| 389 | begin
 | 
|---|
| 390 |   ClearAll;
 | 
|---|
| 391 |   if Source is TMult then begin
 | 
|---|
| 392 |     SourceMult := Source as TMult;
 | 
|---|
| 393 |      try
 | 
|---|
| 394 |       for I := 0 to SourceMult.FMultiple.Count - 1 do begin
 | 
|---|
| 395 |         S := TString.Create;
 | 
|---|
| 396 |         S.Str := (SourceMult.FMultiple.Objects[I] as TString).Str;
 | 
|---|
| 397 |         Self.FMultiple.AddObject(SourceMult.FMultiple[I], S);
 | 
|---|
| 398 |       end;
 | 
|---|
| 399 |     except
 | 
|---|
| 400 |     end;
 | 
|---|
| 401 |   end
 | 
|---|
| 402 | 
 | 
|---|
| 403 |   else begin
 | 
|---|
| 404 |     SourceStrings := Source as TStrings;
 | 
|---|
| 405 |     for I := 0 to SourceStrings.Count - 1 do
 | 
|---|
| 406 |       Self[IntToStr(I)] := SourceStrings[I];
 | 
|---|
| 407 |   end;
 | 
|---|
| 408 | end;
 | 
|---|
| 409 | 
 | 
|---|
| 410 | {------------------------- TMult.ClearAll -------------------------
 | 
|---|
| 411 | One by one, all Mult items are freed.
 | 
|---|
| 412 | ------------------------------------------------------------------}
 | 
|---|
| 413 | procedure TMult.ClearAll;
 | 
|---|
| 414 | var
 | 
|---|
| 415 |   I: integer;
 | 
|---|
| 416 | begin
 | 
|---|
| 417 |      for I := 0 to FMultiple.Count - 1 do begin
 | 
|---|
| 418 |         FMultiple.Objects[I].Free;
 | 
|---|
| 419 |         FMultiple.Objects[I] := nil;
 | 
|---|
| 420 |      end;
 | 
|---|
| 421 |      FMultiple.Clear;
 | 
|---|
| 422 | end;
 | 
|---|
| 423 | 
 | 
|---|
| 424 | {------------------------- TMult.GetCount -------------------------
 | 
|---|
| 425 | Returns the number of elements in the multiple
 | 
|---|
| 426 | ------------------------------------------------------------------}
 | 
|---|
| 427 | function TMult.GetCount: Word;
 | 
|---|
| 428 | begin
 | 
|---|
| 429 |   Result := FMultiple.Count;
 | 
|---|
| 430 | end;
 | 
|---|
| 431 | 
 | 
|---|
| 432 | {------------------------- TMult.GetFirst -------------------------
 | 
|---|
| 433 | Returns the subscript of the first element in the multiple
 | 
|---|
| 434 | ------------------------------------------------------------------}
 | 
|---|
| 435 | function TMult.GetFirst: string;
 | 
|---|
| 436 | begin
 | 
|---|
| 437 |   if FMultiple.Count > 0 then Result := FMultiple[0]
 | 
|---|
| 438 |   else Result := '';
 | 
|---|
| 439 | end;
 | 
|---|
| 440 | 
 | 
|---|
| 441 | {------------------------- TMult.GetLast --------------------------
 | 
|---|
| 442 | Returns the subscript of the last element in the multiple
 | 
|---|
| 443 | ------------------------------------------------------------------}
 | 
|---|
| 444 | function TMult.GetLast: string;
 | 
|---|
| 445 | begin
 | 
|---|
| 446 |   if FMultiple.Count > 0 then Result := FMultiple[FMultiple.Count - 1]
 | 
|---|
| 447 |   else Result := '';
 | 
|---|
| 448 | end;
 | 
|---|
| 449 | 
 | 
|---|
| 450 | {---------------------- TMult.GetFMultiple ------------------------
 | 
|---|
| 451 | Returns the VALUE of the element whose subscript is passed.
 | 
|---|
| 452 | ------------------------------------------------------------------}
 | 
|---|
| 453 | function TMult.GetFMultiple(Index: string): string;
 | 
|---|
| 454 | var
 | 
|---|
| 455 |   S: TString;
 | 
|---|
| 456 |   BrokerComponent,ParamRecord: TComponent;
 | 
|---|
| 457 |   I: integer;
 | 
|---|
| 458 |   strError: string;
 | 
|---|
| 459 | begin
 | 
|---|
| 460 |   try
 | 
|---|
| 461 |     S := TString(FMultiple.Objects[FMultiple.IndexOf(Index)]);
 | 
|---|
| 462 |   except
 | 
|---|
| 463 |     on EListError do begin
 | 
|---|
| 464 |        {build appropriate error message}
 | 
|---|
| 465 |        strError := iff(Self.Name <> '', Self.Name, 'TMult_instance');
 | 
|---|
| 466 |        strError := strError + '[' + Index + ']' + #13#10 + 'is undefined';
 | 
|---|
| 467 |        try
 | 
|---|
| 468 |          ParamRecord := Self.Owner;
 | 
|---|
| 469 |          BrokerComponent := Self.Owner.Owner.Owner;
 | 
|---|
| 470 |          if (ParamRecord is TParamRecord) and (BrokerComponent is TRPCBroker) then begin
 | 
|---|
| 471 |            I := 0;
 | 
|---|
| 472 |            {if there is an easier way to figure out which array element points
 | 
|---|
| 473 |            to this instance of a multiple, use it}   // p13
 | 
|---|
| 474 |            while TRPCBroker(BrokerComponent).Param[I] <> ParamRecord do inc(I);
 | 
|---|
| 475 |            strError := '.Param[' + IntToStr(I) + '].' + strError;
 | 
|---|
| 476 |            strError := iff(BrokerComponent.Name <> '', BrokerComponent.Name,
 | 
|---|
| 477 |                            'TRPCBroker_instance') + strError;
 | 
|---|
| 478 |          end;
 | 
|---|
| 479 |        except
 | 
|---|
| 480 |        end;
 | 
|---|
| 481 |        raise Exception.Create(strError);
 | 
|---|
| 482 |     end;
 | 
|---|
| 483 |   end;
 | 
|---|
| 484 |   Result := S.Str;
 | 
|---|
| 485 | end;
 | 
|---|
| 486 | 
 | 
|---|
| 487 | {---------------------- TMult.SetGetSorted ------------------------
 | 
|---|
| 488 | ------------------------------------------------------------------}
 | 
|---|
| 489 | function  TMult.GetSorted: boolean;
 | 
|---|
| 490 | begin
 | 
|---|
| 491 |   Result := FMultiple.Sorted;
 | 
|---|
| 492 | end;
 | 
|---|
| 493 | 
 | 
|---|
| 494 | {---------------------- TMult.SetFMultiple ------------------------
 | 
|---|
| 495 | Stores a new element in the multiple.  FMultiple (TStringList) is the
 | 
|---|
| 496 | structure, which is used to hold the subscript and value pair.  Subscript
 | 
|---|
| 497 | is stored as the String, value is stored as an object of the string.
 | 
|---|
| 498 | ------------------------------------------------------------------}
 | 
|---|
| 499 | procedure TMult.SetFMultiple(Index: string; Value: string);
 | 
|---|
| 500 | var
 | 
|---|
| 501 |   S: TString;
 | 
|---|
| 502 |   Pos: integer;
 | 
|---|
| 503 | begin
 | 
|---|
| 504 |   Pos := FMultiple.IndexOf(Index);       {see if this subscript already exists}
 | 
|---|
| 505 |   if Pos = -1 then begin                 {if subscript is new}
 | 
|---|
| 506 |      S := TString.Create;                {create string object}
 | 
|---|
| 507 |      S.Str := Value;                     {put value in it}
 | 
|---|
| 508 |      FMultiple.AddObject(Index, S);      {add it}
 | 
|---|
| 509 |    end
 | 
|---|
| 510 |   else
 | 
|---|
| 511 |      TString(FMultiple.Objects[Pos]).Str := Value; { otherwise replace the value}
 | 
|---|
| 512 | end;
 | 
|---|
| 513 | 
 | 
|---|
| 514 | {---------------------- TMult.SetSorted ------------------------
 | 
|---|
| 515 | ------------------------------------------------------------------}
 | 
|---|
| 516 | procedure TMult.SetSorted(Value: boolean);
 | 
|---|
| 517 | begin
 | 
|---|
| 518 |   FMultiple.Sorted := Value;
 | 
|---|
| 519 | end;
 | 
|---|
| 520 | 
 | 
|---|
| 521 | {-------------------------- TMult.Order --------------------------
 | 
|---|
| 522 | Returns the subscript string of the next or previous element from the
 | 
|---|
| 523 | StartSubscript.  This is very similar to the $O function available in M.
 | 
|---|
| 524 | Null string ('') is returned when reaching beyong the first or last
 | 
|---|
| 525 | element, or when list is empty.
 | 
|---|
| 526 | Note: A major difference between the M $O and this function is that
 | 
|---|
| 527 |       in this function StartSubscript must identify a valid subscript
 | 
|---|
| 528 |       in the list.
 | 
|---|
| 529 | ------------------------------------------------------------------}
 | 
|---|
| 530 | function TMult.Order(const StartSubscript: string; Direction: integer): string;
 | 
|---|
| 531 | var
 | 
|---|
| 532 |   Index: longint;
 | 
|---|
| 533 | begin
 | 
|---|
| 534 |   Result := '';
 | 
|---|
| 535 |   if StartSubscript = '' then
 | 
|---|
| 536 |      if Direction > 0 then Result := First
 | 
|---|
| 537 |      else Result := Last
 | 
|---|
| 538 |   else begin
 | 
|---|
| 539 |      Index := Position(StartSubscript);
 | 
|---|
| 540 |      if Index > -1 then
 | 
|---|
| 541 |         if (Index < (Count - 1)) and (Direction > 0) then
 | 
|---|
| 542 |            Result := FMultiple[Index + 1]
 | 
|---|
| 543 |         else if (Index > 0) and (Direction < 0) then
 | 
|---|
| 544 |            Result := FMultiple[Index - 1];
 | 
|---|
| 545 |   end
 | 
|---|
| 546 | end;
 | 
|---|
| 547 | 
 | 
|---|
| 548 | {------------------------- TMult.Position -------------------------
 | 
|---|
| 549 | Returns the long integer value which is the index position of the
 | 
|---|
| 550 | element in the list.  Opposite of TMult.Subscript().  Remember that
 | 
|---|
| 551 | the list is 0 based!
 | 
|---|
| 552 | ------------------------------------------------------------------}
 | 
|---|
| 553 | function TMult.Position(const Subscript: string): longint;
 | 
|---|
| 554 | begin
 | 
|---|
| 555 |   Result := FMultiple.IndexOf(Subscript);
 | 
|---|
| 556 | end;
 | 
|---|
| 557 | 
 | 
|---|
| 558 | {------------------------ TMult.Subscript -------------------------
 | 
|---|
| 559 | Returns the string subscript of the element whose position in the list
 | 
|---|
| 560 | is passed in.  Opposite of TMult.Position().  Remember that the list is 0 based!
 | 
|---|
| 561 | ------------------------------------------------------------------}
 | 
|---|
| 562 | function TMult.Subscript(const Position: longint): string;
 | 
|---|
| 563 | begin
 | 
|---|
| 564 |   Result := '';
 | 
|---|
| 565 |   if (Position > -1) and (Position < Count) then
 | 
|---|
| 566 |      Result := FMultiple[Position];
 | 
|---|
| 567 | end;
 | 
|---|
| 568 | 
 | 
|---|
| 569 | {---------------------- TParamRecord.Create -----------------------
 | 
|---|
| 570 | Creates TParamRecord instance and automatically creates TMult.  The
 | 
|---|
| 571 | name of Mult is also set in case it may be need if exception will be raised.
 | 
|---|
| 572 | ------------------------------------------------------------------}
 | 
|---|
| 573 | constructor TParamRecord.Create(AOwner: TComponent);
 | 
|---|
| 574 | begin
 | 
|---|
| 575 |   inherited Create(AOwner);
 | 
|---|
| 576 |   FMult := TMult.Create(Self);
 | 
|---|
| 577 |   FMult.Name := 'Mult';
 | 
|---|
| 578 |   {note: FMult is destroyed in the SetClearParameters method}
 | 
|---|
| 579 | end;
 | 
|---|
| 580 | 
 | 
|---|
| 581 | destructor TParamRecord.Destroy;
 | 
|---|
| 582 | begin
 | 
|---|
| 583 |   FMult.Free;
 | 
|---|
| 584 |   FMult := nil;
 | 
|---|
| 585 |   inherited;
 | 
|---|
| 586 | end;
 | 
|---|
| 587 | 
 | 
|---|
| 588 | {------------------------- TParams.Create -------------------------
 | 
|---|
| 589 | ------------------------------------------------------------------}
 | 
|---|
| 590 | constructor TParams.Create(AOwner: TComponent);
 | 
|---|
| 591 | begin
 | 
|---|
| 592 |   inherited Create(AOwner);
 | 
|---|
| 593 |   FParameters := TList.Create;   {for now, empty list}
 | 
|---|
| 594 | end;
 | 
|---|
| 595 | 
 | 
|---|
| 596 | {------------------------ TParams.Destroy -------------------------
 | 
|---|
| 597 | ------------------------------------------------------------------}
 | 
|---|
| 598 | destructor TParams.Destroy;
 | 
|---|
| 599 | begin
 | 
|---|
| 600 |   Clear;                         {clear the Multiple first!}
 | 
|---|
| 601 |   FParameters.Free;
 | 
|---|
| 602 |   FParameters := nil;
 | 
|---|
| 603 |   inherited Destroy;
 | 
|---|
| 604 | end;
 | 
|---|
| 605 | 
 | 
|---|
| 606 | {------------------------- TParams.Assign -------------------------
 | 
|---|
| 607 | ------------------------------------------------------------------}
 | 
|---|
| 608 | procedure TParams.Assign(Source: TPersistent);
 | 
|---|
| 609 | var
 | 
|---|
| 610 |   I: integer;
 | 
|---|
| 611 |   SourceParams: TParams;
 | 
|---|
| 612 | begin
 | 
|---|
| 613 |   Self.Clear;
 | 
|---|
| 614 |   SourceParams := Source as TParams;
 | 
|---|
| 615 |   for I := 0 to SourceParams.Count - 1 do begin
 | 
|---|
| 616 |     Self[I].Value := SourceParams[I].Value;
 | 
|---|
| 617 |     Self[I].PType := SourceParams[I].PType;
 | 
|---|
| 618 |     Self[I].Mult.Assign(SourceParams[I].Mult);
 | 
|---|
| 619 |   end
 | 
|---|
| 620 | end;
 | 
|---|
| 621 | 
 | 
|---|
| 622 | {------------------------- TParams.Clear --------------------------
 | 
|---|
| 623 | ------------------------------------------------------------------}
 | 
|---|
| 624 | procedure TParams.Clear;
 | 
|---|
| 625 | var
 | 
|---|
| 626 |   ParamRecord: TParamRecord;
 | 
|---|
| 627 |   I: integer;
 | 
|---|
| 628 | begin
 | 
|---|
| 629 |   if FParameters <> nil then begin
 | 
|---|
| 630 |     for I := 0 to FParameters.Count - 1 do begin
 | 
|---|
| 631 |       ParamRecord := TParamRecord(FParameters.Items[I]);
 | 
|---|
| 632 |       if ParamRecord <> nil then begin  //could be nil if params were skipped by developer
 | 
|---|
| 633 |         ParamRecord.FMult.Free;
 | 
|---|
| 634 |         ParamRecord.FMult := nil;
 | 
|---|
| 635 |         ParamRecord.Free;
 | 
|---|
| 636 |       end;
 | 
|---|
| 637 |     end;
 | 
|---|
| 638 |     FParameters.Clear;             {release FParameters TList}
 | 
|---|
| 639 |   end;
 | 
|---|
| 640 | end;
 | 
|---|
| 641 | 
 | 
|---|
| 642 | {------------------------ TParams.GetCount ------------------------
 | 
|---|
| 643 | ------------------------------------------------------------------}
 | 
|---|
| 644 | function TParams.GetCount: Word;
 | 
|---|
| 645 | begin
 | 
|---|
| 646 |   if FParameters = nil then Result := 0
 | 
|---|
| 647 |   else Result := FParameters.Count;
 | 
|---|
| 648 | end;
 | 
|---|
| 649 | 
 | 
|---|
| 650 | {---------------------- TParams.GetParameter ----------------------
 | 
|---|
| 651 | ------------------------------------------------------------------}
 | 
|---|
| 652 | function TParams.GetParameter(Index: integer): TParamRecord;
 | 
|---|
| 653 | begin
 | 
|---|
| 654 |   if Index >= FParameters.Count then             {if element out of bounds,}
 | 
|---|
| 655 |      while FParameters.Count <= Index do
 | 
|---|
| 656 |        FParameters.Add(nil);                     {setup place holders}
 | 
|---|
| 657 |   if FParameters.Items[Index] = nil then begin   {if just a place holder,}
 | 
|---|
| 658 |      {point it to new memory block}
 | 
|---|
| 659 |      FParameters.Items[Index] := TParamRecord.Create(Self);
 | 
|---|
| 660 |      TParamRecord(FParameters.Items[Index]).PType := undefined; {initialize}
 | 
|---|
| 661 |   end;
 | 
|---|
| 662 |   Result := FParameters.Items[Index];            {return requested parameter}
 | 
|---|
| 663 | end;
 | 
|---|
| 664 | 
 | 
|---|
| 665 | {---------------------- TParams.SetParameter ----------------------
 | 
|---|
| 666 | ------------------------------------------------------------------}
 | 
|---|
| 667 | procedure TParams.SetParameter(Index: integer; Parameter: TParamRecord);
 | 
|---|
| 668 | begin
 | 
|---|
| 669 |   if Index >= FParameters.Count then             {if element out of bounds,}
 | 
|---|
| 670 |      while FParameters.Count <= Index do
 | 
|---|
| 671 |        FParameters.Add(nil);                     {setup place holders}
 | 
|---|
| 672 |   if FParameters.Items[Index] = nil then         {if just a place holder,}
 | 
|---|
| 673 |      FParameters.Items[Index] := Parameter;      {point it to passed parameter}
 | 
|---|
| 674 | end;
 | 
|---|
| 675 | 
 | 
|---|
| 676 | {------------------------ TRPCBroker.Create -----------------------
 | 
|---|
| 677 | ------------------------------------------------------------------}
 | 
|---|
| 678 | constructor TRPCBroker.Create(AOwner: TComponent);
 | 
|---|
| 679 | begin
 | 
|---|
| 680 |   inherited Create(AOwner);
 | 
|---|
| 681 |   {set defaults}
 | 
|---|
| 682 | 
 | 
|---|
| 683 | // This constant defined in the interface section needs to be updated for each release
 | 
|---|
| 684 |   FBrokerVersion := CURRENT_RPC_VERSION;
 | 
|---|
| 685 | 
 | 
|---|
| 686 |   FClearParameters := boolean(StrToInt
 | 
|---|
| 687 |                    (ReadRegDataDefault(HKLM,REG_BROKER,'ClearParameters','1')));
 | 
|---|
| 688 |   FClearResults := boolean(StrToInt
 | 
|---|
| 689 |                    (ReadRegDataDefault(HKLM,REG_BROKER,'ClearResults','1')));
 | 
|---|
| 690 |   FDebugMode := False;
 | 
|---|
| 691 |   FParams := TParams.Create(Self);
 | 
|---|
| 692 |   FResults := TStringList.Create;
 | 
|---|
| 693 |   FServer := ReadRegDataDefault(HKLM,REG_BROKER,'Server','BROKERSERVER');
 | 
|---|
| 694 |   FPulse  := TTimer.Create(Self);  //P6
 | 
|---|
| 695 |   FListenerPort := StrToInt
 | 
|---|
| 696 |                   (ReadRegDataDefault(HKLM,REG_BROKER,'ListenerPort','9200'));
 | 
|---|
| 697 |   FRpcVersion := '0';
 | 
|---|
| 698 |   FRPCTimeLimit := MIN_RPCTIMELIMIT;
 | 
|---|
| 699 |   with FPulse do ///P6
 | 
|---|
| 700 |   begin
 | 
|---|
| 701 |     Enabled := False;  //P6
 | 
|---|
| 702 |     Interval := DEFAULT_PULSE; //P6
 | 
|---|
| 703 |     OnTimer  := DoPulseOnTimer;  //P6
 | 
|---|
| 704 |   end;
 | 
|---|
| 705 |   FLogin := TVistaLogin.Create(Self);  //p13
 | 
|---|
| 706 |   FKernelLogin := True;  //p13
 | 
|---|
| 707 |   FUser := TVistaUser.Create; //p13
 | 
|---|
| 708 |   FShowErrorMsgs := semRaise; //p13
 | 
|---|
| 709 |   XWBWinsock := TXWBWinsock.Create;
 | 
|---|
| 710 | 
 | 
|---|
| 711 |   FIsBackwardCompatibleConnection := True;  // default
 | 
|---|
| 712 |   Application.ProcessMessages;
 | 
|---|
| 713 | end;
 | 
|---|
| 714 | 
 | 
|---|
| 715 | {----------------------- TRPCBroker.Destroy -----------------------
 | 
|---|
| 716 | ------------------------------------------------------------------}
 | 
|---|
| 717 | destructor TRPCBroker.Destroy;
 | 
|---|
| 718 | begin
 | 
|---|
| 719 |   Connected := False;
 | 
|---|
| 720 |   TXWBWinsock(XWBWinsock).Free;
 | 
|---|
| 721 |   FParams.Free;
 | 
|---|
| 722 |   FParams := nil;
 | 
|---|
| 723 |   FResults.Free;
 | 
|---|
| 724 |   FResults := nil;
 | 
|---|
| 725 |   FPulse.Free; //P6
 | 
|---|
| 726 |   FPulse := nil;
 | 
|---|
| 727 |   FUser.Free;
 | 
|---|
| 728 |   FUser := nil;
 | 
|---|
| 729 |   FLogin.Free;
 | 
|---|
| 730 |   FLogin := nil;
 | 
|---|
| 731 |   inherited Destroy;
 | 
|---|
| 732 | end;
 | 
|---|
| 733 | 
 | 
|---|
| 734 | {--------------------- TRPCBroker.CreateContext -------------------
 | 
|---|
| 735 | This function is part of the overall Broker security.
 | 
|---|
| 736 | The passed context string is essentially a Client/Server type option
 | 
|---|
| 737 | on the server.  The server sets up MenuMan environment variables for this
 | 
|---|
| 738 | context which will later be used to screen RPCs.  Only those RPCs which are
 | 
|---|
| 739 | in the multiple field of this context option will be permitted to run.
 | 
|---|
| 740 | ------------------------------------------------------------------}
 | 
|---|
| 741 | function TRPCBroker.CreateContext(strContext: string): boolean;
 | 
|---|
| 742 | var
 | 
|---|
| 743 |   InternalBroker: TRPCBroker;                       {use separate component}
 | 
|---|
| 744 |   Str: String;
 | 
|---|
| 745 | begin
 | 
|---|
| 746 |   Result := False;
 | 
|---|
| 747 |   Connected := True;
 | 
|---|
| 748 |   InternalBroker := nil;
 | 
|---|
| 749 |   try
 | 
|---|
| 750 |     InternalBroker := TRPCBroker.Create(Self);
 | 
|---|
| 751 |     InternalBroker.FSocket := Self.Socket;   // p13 -- permits multiple broker connections to same server/port
 | 
|---|
| 752 |     with InternalBroker do
 | 
|---|
| 753 |     begin
 | 
|---|
| 754 | {
 | 
|---|
| 755 |       TXWBWinsock(InternalBroker.XWBWinsock).IsBackwardsCompatible := TXWBWinsock(Self.XWBWinsock).IsBackwardsCompatible;
 | 
|---|
| 756 |       TXWBWinsock(InternalBroker.XWBWinsock).OriginalConnectionOnly := TXWBWinsock(Self.XWBWinsock).OriginalConnectionOnly;
 | 
|---|
| 757 | }
 | 
|---|
| 758 |       Tag := 1234;
 | 
|---|
| 759 |       ShowErrorMsgs := Self.ShowerrorMsgs;
 | 
|---|
| 760 |       Server := Self.Server;                   {inherit application server}
 | 
|---|
| 761 |       ListenerPort := Self.ListenerPort;       {inherit listener port}
 | 
|---|
| 762 |       DebugMode := Self.DebugMode;             {inherit debug mode property}
 | 
|---|
| 763 |       RemoteProcedure := 'XWB CREATE CONTEXT'; {set up RPC}
 | 
|---|
| 764 |       Param[0].PType := literal;
 | 
|---|
| 765 |       Param[0].Value := Encrypt(strContext);
 | 
|---|
| 766 |       try
 | 
|---|
| 767 |         Str := strCall;
 | 
|---|
| 768 |         if Str = '1' then
 | 
|---|
| 769 |         begin                   // make the call  // p13
 | 
|---|
| 770 |           Result := True;                       // p13
 | 
|---|
| 771 |           self.FCurrentContext := strContext;        // p13
 | 
|---|
| 772 |         end                                     // p13
 | 
|---|
| 773 |         else
 | 
|---|
| 774 |         begin
 | 
|---|
| 775 |           Result := False;
 | 
|---|
| 776 |           self.FCurrentContext := '';
 | 
|---|
| 777 |         end;
 | 
|---|
| 778 |       except            // Code added to return False if User doesn't have access
 | 
|---|
| 779 |         on e: EBrokerError do
 | 
|---|
| 780 |         begin
 | 
|---|
| 781 |           self.FCurrentContext := '';
 | 
|---|
| 782 |           if Pos('does not have access to option',e.Message) > 0 then
 | 
|---|
| 783 |           begin
 | 
|---|
| 784 |             Result := False
 | 
|---|
| 785 |           end
 | 
|---|
| 786 |           else
 | 
|---|
| 787 |             Raise;
 | 
|---|
| 788 |         end;
 | 
|---|
| 789 |       end;
 | 
|---|
| 790 |       if RPCBError <> '' then
 | 
|---|
| 791 |         self.RPCBError := RPCBError;
 | 
|---|
| 792 |     end;
 | 
|---|
| 793 |   finally
 | 
|---|
| 794 |     InternalBroker.XWBWinsock := nil;
 | 
|---|
| 795 |     InternalBroker.Free;                            {release memory}
 | 
|---|
| 796 |   end;
 | 
|---|
| 797 | end;
 | 
|---|
| 798 | 
 | 
|---|
| 799 | {------------------------ TRPCBroker.Loaded -----------------------
 | 
|---|
| 800 | ------------------------------------------------------------------}
 | 
|---|
| 801 | procedure TRPCBroker.Loaded;
 | 
|---|
| 802 | begin
 | 
|---|
| 803 |   inherited Loaded;
 | 
|---|
| 804 | end;
 | 
|---|
| 805 | 
 | 
|---|
| 806 | {------------------------- TRPCBroker.Call ------------------------
 | 
|---|
| 807 | ------------------------------------------------------------------}
 | 
|---|
| 808 | procedure TRPCBroker.Call;
 | 
|---|
| 809 | var
 | 
|---|
| 810 |   ResultBuffer: TStrings;
 | 
|---|
| 811 | begin
 | 
|---|
| 812 |   ResultBuffer := TStringList.Create;
 | 
|---|
| 813 |   try
 | 
|---|
| 814 |     if ClearResults then ClearResults := True;
 | 
|---|
| 815 |     lstCall(ResultBuffer);
 | 
|---|
| 816 |     Self.Results.AddStrings(ResultBuffer);
 | 
|---|
| 817 |   finally
 | 
|---|
| 818 |     ResultBuffer.Clear;
 | 
|---|
| 819 |     ResultBuffer.Free;
 | 
|---|
| 820 |   end;
 | 
|---|
| 821 | end;
 | 
|---|
| 822 | 
 | 
|---|
| 823 | {----------------------- TRPCBroker.lstCall -----------------------
 | 
|---|
| 824 | ------------------------------------------------------------------}
 | 
|---|
| 825 | procedure TRPCBroker.lstCall(OutputBuffer: TStrings);
 | 
|---|
| 826 | var
 | 
|---|
| 827 |   ManyStrings: PChar;
 | 
|---|
| 828 | begin
 | 
|---|
| 829 |   ManyStrings := pchCall;            {make the call}
 | 
|---|
| 830 |   OutputBuffer.SetText(ManyStrings); {parse result of call, format as list}
 | 
|---|
| 831 |   StrDispose(ManyStrings);           {raw result no longer needed, get back mem}
 | 
|---|
| 832 | end;
 | 
|---|
| 833 | 
 | 
|---|
| 834 | {----------------------- TRPCBroker.strCall -----------------------
 | 
|---|
| 835 | ------------------------------------------------------------------}
 | 
|---|
| 836 | function TRPCBroker.strCall: string;
 | 
|---|
| 837 | var
 | 
|---|
| 838 |   ResultString: PChar;
 | 
|---|
| 839 | begin
 | 
|---|
| 840 |   ResultString := pchCall;           {make the call}
 | 
|---|
| 841 |   Result := StrPas(ResultString);    {convert and present as Pascal string}
 | 
|---|
| 842 |   StrDispose(ResultString);          {raw result no longer needed, get back mem}
 | 
|---|
| 843 | end;
 | 
|---|
| 844 | 
 | 
|---|
| 845 | {--------------------- TRPCBroker.SetConnected --------------------
 | 
|---|
| 846 | ------------------------------------------------------------------}
 | 
|---|
| 847 | procedure TRPCBroker.SetConnected(Value: Boolean);
 | 
|---|
| 848 | var
 | 
|---|
| 849 |   BrokerDir, Str1, Str2, Str3 :string;
 | 
|---|
| 850 | begin
 | 
|---|
| 851 |   RPCBError := '';
 | 
|---|
| 852 |   Login.ErrorText := '';
 | 
|---|
| 853 |   if (Connected <> Value) and not(csReading in ComponentState) then begin
 | 
|---|
| 854 |     if Value and (FConnecting <> Value) then begin                 {connect}
 | 
|---|
| 855 |       FSocket := ExistingSocket(Self);
 | 
|---|
| 856 |       FConnecting := True; // FConnected := True;
 | 
|---|
| 857 |       try
 | 
|---|
| 858 |         if FSocket = 0  then
 | 
|---|
| 859 |         begin
 | 
|---|
| 860 |           {Execute Client Agent from directory in Registry.}
 | 
|---|
| 861 |           BrokerDir := ReadRegData(HKLM, REG_BROKER, 'BrokerDr');
 | 
|---|
| 862 |           if BrokerDir <> '' then
 | 
|---|
| 863 |             ProcessExecute(BrokerDir + '\ClAgent.Exe', sw_ShowNoActivate)
 | 
|---|
| 864 |           else
 | 
|---|
| 865 |             ProcessExecute('ClAgent.Exe', sw_ShowNoActivate);
 | 
|---|
| 866 |           if DebugMode and (not OldConnectionOnly) then
 | 
|---|
| 867 |           begin
 | 
|---|
| 868 |             Str1 := 'Control of debugging has been moved from the client to the server. To start a Debug session, do the following:'+#13#10#13#10;
 | 
|---|
| 869 |             Str2 := '1. On the server, set initial breakpoints where desired.'+#13#10+'2. DO DEBUG^XWBTCPM.'+#13#10+'3. Enter a unique Listener port number (i.e., a port number not in general use).'+#13#10;
 | 
|---|
| 870 |             Str3 := '4. Connect the client application using the port number entered in Step #3.';
 | 
|---|
| 871 |             ShowMessage(Str1 + Str2 + Str3);
 | 
|---|
| 872 |           end;
 | 
|---|
| 873 |           TXWBWinsock(XWBWinsock).IsBackwardsCompatible := FIsBackwardCompatibleConnection;
 | 
|---|
| 874 |           TXWBWinsock(XWBWinsock).OldConnectionOnly := FOldConnectionOnly;
 | 
|---|
| 875 |           FSocket := TXWBWinsock(XWBWinsock).NetworkConnect(DebugMode, FServer,
 | 
|---|
| 876 |                                     ListenerPort, FRPCTimeLimit);
 | 
|---|
| 877 |           AuthenticateUser(Self);
 | 
|---|
| 878 |           FPulse.Enabled := True; //P6 Start heartbeat.
 | 
|---|
| 879 |           StoreConnection(Self);  //MUST store connection before CreateContext()
 | 
|---|
| 880 |           CreateContext('');      //Closes XUS SIGNON context.
 | 
|---|
| 881 |         end
 | 
|---|
| 882 |         else
 | 
|---|
| 883 |         begin                     //p13
 | 
|---|
| 884 |           StoreConnection(Self);
 | 
|---|
| 885 |           FPulse.Enabled := True; //p13
 | 
|---|
| 886 |         end;                      //p13
 | 
|---|
| 887 |         FConnected := True;         // jli mod 12/17/01
 | 
|---|
| 888 |         FConnecting := False;
 | 
|---|
| 889 |       except
 | 
|---|
| 890 |         on E: EBrokerError do begin
 | 
|---|
| 891 |           if E.Code = XWB_BadSignOn then
 | 
|---|
| 892 |             TXWBWinsock(XWBWinsock).NetworkDisconnect(FSocket);
 | 
|---|
| 893 |           FSocket := 0;
 | 
|---|
| 894 |           FConnected := False;
 | 
|---|
| 895 |           FConnecting := False;
 | 
|---|
| 896 |           FRPCBError := E.Message;               // p13  handle errors as specified
 | 
|---|
| 897 |           if Login.ErrorText <> '' then
 | 
|---|
| 898 |             FRPCBError := E.Message + chr(10) + Login.ErrorText;
 | 
|---|
| 899 |           if Assigned(FOnRPCBFailure) then       // p13
 | 
|---|
| 900 |             FOnRPCBFailure(Self)                 // p13
 | 
|---|
| 901 |           else if ShowErrorMsgs = semRaise then
 | 
|---|
| 902 |             Raise;                               // p13
 | 
|---|
| 903 | //          raise;   {this is where I would do OnNetError}
 | 
|---|
| 904 |         end{on};
 | 
|---|
| 905 |       end{try};
 | 
|---|
| 906 |     end{if}
 | 
|---|
| 907 |     else if not Value then
 | 
|---|
| 908 |     begin                           //p13
 | 
|---|
| 909 |       FConnected := False;          //p13
 | 
|---|
| 910 |       FPulse.Enabled := False;      //p13
 | 
|---|
| 911 |       if RemoveConnection(Self) = NoMore then begin
 | 
|---|
| 912 |         {FPulse.Enabled := False;  ///P6;p13 }
 | 
|---|
| 913 |         TXWBWinsock(XWBWinsock).NetworkDisconnect(Socket);   {actually disconnect from server}
 | 
|---|
| 914 |         FSocket := 0;                {store internal}
 | 
|---|
| 915 |         //FConnected := False;      //p13
 | 
|---|
| 916 |       end{if};
 | 
|---|
| 917 |     end; {else}
 | 
|---|
| 918 |   end{if};
 | 
|---|
| 919 | end;
 | 
|---|
| 920 | 
 | 
|---|
| 921 | {----------------- TRPCBroker.SetClearParameters ------------------
 | 
|---|
| 922 | ------------------------------------------------------------------}
 | 
|---|
| 923 | procedure TRPCBroker.SetClearParameters(Value: Boolean);
 | 
|---|
| 924 | begin
 | 
|---|
| 925 |   if Value then FParams.Clear;
 | 
|---|
| 926 |   FClearParameters := Value;
 | 
|---|
| 927 | end;
 | 
|---|
| 928 | 
 | 
|---|
| 929 | {------------------- TRPCBroker.SetClearResults -------------------
 | 
|---|
| 930 | ------------------------------------------------------------------}
 | 
|---|
| 931 | procedure TRPCBroker.SetClearResults(Value: Boolean);
 | 
|---|
| 932 | begin
 | 
|---|
| 933 |   if Value then begin   {if True}
 | 
|---|
| 934 |      FResults.Clear;
 | 
|---|
| 935 |   end;
 | 
|---|
| 936 |   FClearResults := Value;
 | 
|---|
| 937 | end;
 | 
|---|
| 938 | 
 | 
|---|
| 939 | {---------------------- TRPCBroker.SetResults ---------------------
 | 
|---|
| 940 | ------------------------------------------------------------------}
 | 
|---|
| 941 | procedure TRPCBroker.SetResults(Value: TStrings);
 | 
|---|
| 942 | begin
 | 
|---|
| 943 |   FResults.Assign(Value);
 | 
|---|
| 944 | end;
 | 
|---|
| 945 | 
 | 
|---|
| 946 | {----------------------- TRPCBroker.SetRPCTimeLimit -----------------
 | 
|---|
| 947 | ------------------------------------------------------------------}
 | 
|---|
| 948 | procedure   TRPCBroker.SetRPCTimeLimit(Value: integer);
 | 
|---|
| 949 | begin
 | 
|---|
| 950 |   if Value <> FRPCTimeLimit then
 | 
|---|
| 951 |     if Value > MIN_RPCTIMELIMIT then
 | 
|---|
| 952 |       FRPCTimeLimit := Value
 | 
|---|
| 953 |     else
 | 
|---|
| 954 |       FRPCTimeLimit := MIN_RPCTIMELIMIT;
 | 
|---|
| 955 | end;
 | 
|---|
| 956 | 
 | 
|---|
| 957 | {----------------------- TRPCBroker.SetServer ---------------------
 | 
|---|
| 958 | ------------------------------------------------------------------}
 | 
|---|
| 959 | procedure TRPCBroker.SetServer(Value: TServer);
 | 
|---|
| 960 | begin
 | 
|---|
| 961 |   {if changing the name of the server, make sure to disconnect first}
 | 
|---|
| 962 |   if (Value <> FServer) and Connected then begin
 | 
|---|
| 963 |      Connected := False;
 | 
|---|
| 964 |   end;
 | 
|---|
| 965 |   FServer := Value;
 | 
|---|
| 966 | end;
 | 
|---|
| 967 | 
 | 
|---|
| 968 | {--------------------- TRPCBroker.pchCall ----------------------
 | 
|---|
| 969 | Lowest level remote procedure call that a TRPCBroker component can make.
 | 
|---|
| 970 | 1. Returns PChar.
 | 
|---|
| 971 | 2. Converts Remote Procedure to PChar internally.
 | 
|---|
| 972 | ------------------------------------------------------------------}
 | 
|---|
| 973 | function TRPCBroker.pchCall: PChar;
 | 
|---|
| 974 | var
 | 
|---|
| 975 |   Value, Sec, App: PChar;
 | 
|---|
| 976 |   BrokerError: EBrokerError;
 | 
|---|
| 977 |   blnRestartPulse : boolean;   //P6
 | 
|---|
| 978 | begin
 | 
|---|
| 979 |   RPCBError := '';
 | 
|---|
| 980 |   Connected := True;
 | 
|---|
| 981 |   BrokerError := nil;
 | 
|---|
| 982 |   Value := nil;
 | 
|---|
| 983 |   blnRestartPulse := False;   //P6
 | 
|---|
| 984 | 
 | 
|---|
| 985 |   Sec := StrAlloc(255);
 | 
|---|
| 986 |   App := StrAlloc(255);
 | 
|---|
| 987 | 
 | 
|---|
| 988 |   try
 | 
|---|
| 989 |     if FPulse.Enabled then          ///P6 If Broker was sending pulse,
 | 
|---|
| 990 |     begin
 | 
|---|
| 991 |      FPulse.Enabled := False;      ///   Stop pulse &
 | 
|---|
| 992 |       blnRestartPulse := True;     //   Set flag to restart pulse after RPC.
 | 
|---|
| 993 |     end;
 | 
|---|
| 994 | {
 | 
|---|
| 995 |     if Assigned(FOnRPCCall) then
 | 
|---|
| 996 |     begin
 | 
|---|
| 997 |       FOnRPCCall(Self, 1, RemoteProcedure, CurrentContext, RpcVersion, Param, FRPCTimeLimit, '', '', '', Now);
 | 
|---|
| 998 |     end;
 | 
|---|
| 999 | }
 | 
|---|
| 1000 |     try
 | 
|---|
| 1001 |       Value := TXWBWinsock(XWBWinsock).tCall(Socket, RemoteProcedure, RpcVersion, Param,
 | 
|---|
| 1002 |                       Sec, App,FRPCTimeLimit);
 | 
|---|
| 1003 | {
 | 
|---|
| 1004 |       if Assigned(FOnRPCCall) then
 | 
|---|
| 1005 |       begin
 | 
|---|
| 1006 |         FOnRPCCall(Self, 2, RemoteProcedure, CurrentContext, RpcVersion, Param, FRPCTimeLimit, Result, Sec, App, Now);
 | 
|---|
| 1007 |       end;
 | 
|---|
| 1008 | }
 | 
|---|
| 1009 |       if (StrLen(Sec) > 0) then
 | 
|---|
| 1010 |       begin
 | 
|---|
| 1011 |         BrokerError := EBrokerError.Create(StrPas(Sec));
 | 
|---|
| 1012 |         BrokerError.Code := 0;
 | 
|---|
| 1013 |         BrokerError.Action := 'Error Returned';
 | 
|---|
| 1014 |       end;
 | 
|---|
| 1015 |     except
 | 
|---|
| 1016 |       on Etemp: EBrokerError do
 | 
|---|
| 1017 |         with Etemp do
 | 
|---|
| 1018 |         begin                             //save copy of error
 | 
|---|
| 1019 |           BrokerError := EBrokerError.Create(message);  //field by field
 | 
|---|
| 1020 |           BrokerError.Action := Action;
 | 
|---|
| 1021 |           BrokerError.Code := Code;
 | 
|---|
| 1022 |           BrokerError.Mnemonic := Mnemonic;
 | 
|---|
| 1023 |           if Value <> nil then
 | 
|---|
| 1024 |             StrDispose(Value);
 | 
|---|
| 1025 |           Value := StrNew('');
 | 
|---|
| 1026 |           {if severe error, mark connection as closed.  Per Enrique, we should
 | 
|---|
| 1027 |           replace this check with some function, yet to be developed, which
 | 
|---|
| 1028 |           will test the link.}
 | 
|---|
| 1029 |           if ((Code >= 10050)and(Code <=10058))or(Action = 'connection lost') then
 | 
|---|
| 1030 |           begin
 | 
|---|
| 1031 |             Connected := False;
 | 
|---|
| 1032 |             blnRestartPulse := False;  //P6
 | 
|---|
| 1033 |           end;
 | 
|---|
| 1034 |         end;
 | 
|---|
| 1035 |     end;
 | 
|---|
| 1036 |   finally
 | 
|---|
| 1037 |     StrDispose(Sec); {do something with these}
 | 
|---|
| 1038 |     Sec := nil;
 | 
|---|
| 1039 |     StrDispose(App);
 | 
|---|
| 1040 |     App := nil;
 | 
|---|
| 1041 |     if ClearParameters then ClearParameters := True;    //prepare for next call
 | 
|---|
| 1042 |   end;
 | 
|---|
| 1043 |   Result := Value;
 | 
|---|
| 1044 |   if Result = nil then Result := StrNew('');            //return empty string
 | 
|---|
| 1045 |   if blnRestartPulse then FPulse.Enabled := True;       //Restart pulse. (P6)
 | 
|---|
| 1046 |   if BrokerError <> nil then
 | 
|---|
| 1047 |   begin
 | 
|---|
| 1048 |     FRPCBError := BrokerError.Message;               // p13  handle errors as specified
 | 
|---|
| 1049 |     if Login.ErrorText <> '' then
 | 
|---|
| 1050 |       FRPCBError := BrokerError.Message + chr(10) + Login.ErrorText;
 | 
|---|
| 1051 |     if Assigned(FOnRPCBFailure) then       // p13
 | 
|---|
| 1052 |     begin
 | 
|---|
| 1053 |       FOnRPCBFailure(Self);
 | 
|---|
| 1054 |       StrDispose(Result);
 | 
|---|
| 1055 |     end
 | 
|---|
| 1056 |     else if FShowErrorMsgs = semRaise then
 | 
|---|
| 1057 |     begin
 | 
|---|
| 1058 |       StrDispose(Result);                 // return memory we won't use - caused a memory leak
 | 
|---|
| 1059 |               Raise BrokerError;                               // p13
 | 
|---|
| 1060 |     end
 | 
|---|
| 1061 |     else   // silent, just return error message in FRPCBError
 | 
|---|
| 1062 |       BrokerError.Free;   // return memory in BrokerError - otherwise is a memory leak
 | 
|---|
| 1063 | //          raise;   {this is where I would do OnNetError}
 | 
|---|
| 1064 |   end;  // if BrokerError <> nil
 | 
|---|
| 1065 | end;
 | 
|---|
| 1066 | 
 | 
|---|
| 1067 | 
 | 
|---|
| 1068 | {-------------------------- DisconnectAll -------------------------
 | 
|---|
| 1069 | Find all connections in BrokerAllConnections list for the passed in
 | 
|---|
| 1070 | server:listenerport combination and disconnect them. If at least one
 | 
|---|
| 1071 | connection to the server:listenerport is found, then it and all other
 | 
|---|
| 1072 | Brokers to the same server:listenerport will be disconnected; True
 | 
|---|
| 1073 | will be returned.  Otherwise False will return.
 | 
|---|
| 1074 | ------------------------------------------------------------------}
 | 
|---|
| 1075 | function DisconnectAll(Server: string; ListenerPort: integer): boolean;
 | 
|---|
| 1076 | var
 | 
|---|
| 1077 |   Index: integer;
 | 
|---|
| 1078 | begin
 | 
|---|
| 1079 |   Result := False;
 | 
|---|
| 1080 |   while (Assigned(BrokerAllConnections) and
 | 
|---|
| 1081 |         (BrokerAllConnections.Find(Server + ':' + IntToStr(ListenerPort), Index))) do begin
 | 
|---|
| 1082 |     Result := True;
 | 
|---|
| 1083 |     TRPCBroker(BrokerAllConnections.Objects[Index]).Connected := False;
 | 
|---|
| 1084 |     {if the call above disconnected the last connection in the list, then
 | 
|---|
| 1085 |     the whole list will be destroyed, making it necessary to check if it's
 | 
|---|
| 1086 |     still assigned.}
 | 
|---|
| 1087 |   end;
 | 
|---|
| 1088 | end;
 | 
|---|
| 1089 | 
 | 
|---|
| 1090 | {------------------------- StoreConnection ------------------------
 | 
|---|
| 1091 | Each broker connection is stored in BrokerConnections list.
 | 
|---|
| 1092 | ------------------------------------------------------------------}
 | 
|---|
| 1093 | procedure StoreConnection(Broker: TRPCBroker);
 | 
|---|
| 1094 | begin
 | 
|---|
| 1095 |   if BrokerConnections = nil then {list is created when 1st entry is added}
 | 
|---|
| 1096 |     try
 | 
|---|
| 1097 |       BrokerConnections := TStringList.Create;
 | 
|---|
| 1098 |       BrokerConnections.Sorted := True;
 | 
|---|
| 1099 |       BrokerConnections.Duplicates := dupAccept;  {store every connection}
 | 
|---|
| 1100 |       BrokerAllConnections := TStringList.Create;
 | 
|---|
| 1101 |       BrokerAllConnections.Sorted := True;
 | 
|---|
| 1102 |       BrokerAllConnections.Duplicates := dupAccept;
 | 
|---|
| 1103 |     except
 | 
|---|
| 1104 |       TXWBWinsock(Broker.XWBWinsock).NetError('store connection',XWB_BldConnectList)
 | 
|---|
| 1105 |     end;
 | 
|---|
| 1106 |   BrokerAllConnections.AddObject(Broker.Server + ':' +
 | 
|---|
| 1107 |                               IntToStr(Broker.ListenerPort), Broker);
 | 
|---|
| 1108 |   BrokerConnections.AddObject(IntToStr(Broker.Socket), Broker);
 | 
|---|
| 1109 | end;
 | 
|---|
| 1110 | 
 | 
|---|
| 1111 | {------------------------ RemoveConnection ------------------------
 | 
|---|
| 1112 | Result of this function will be False, if there are no more connections
 | 
|---|
| 1113 | to the same server:listenerport as the passed in Broker.  If at least
 | 
|---|
| 1114 | one other connection is found to the same server:listenerport, then Result
 | 
|---|
| 1115 | will be True.
 | 
|---|
| 1116 | ------------------------------------------------------------------}
 | 
|---|
| 1117 | function RemoveConnection(Broker: TRPCBroker): boolean;
 | 
|---|
| 1118 | var
 | 
|---|
| 1119 |   Index: integer;
 | 
|---|
| 1120 | begin
 | 
|---|
| 1121 |   Result := False;
 | 
|---|
| 1122 |   if Assigned(BrokerConnections) then begin
 | 
|---|
| 1123 |     {remove connection record of passed in Broker component}
 | 
|---|
| 1124 |     BrokerConnections.Delete(BrokerConnections.IndexOfObject(Broker));
 | 
|---|
| 1125 |     {look for one other connection to the same server:port}
 | 
|---|
| 1126 | //    Result := BrokerConnections.Find(Broker.Server + ':' + IntToStr(Broker.ListenerPort), Index);
 | 
|---|
| 1127 |     Result := BrokerConnections.Find(IntToStr(Broker.Socket), Index);
 | 
|---|
| 1128 |     if BrokerConnections.Count = 0 then begin {if last entry removed,}
 | 
|---|
| 1129 |       BrokerConnections.Free;                 {destroy whole list structure}
 | 
|---|
| 1130 |       BrokerConnections := nil;
 | 
|---|
| 1131 |     end;
 | 
|---|
| 1132 |   end;  // if Assigned(BrokerConnections)
 | 
|---|
| 1133 |   if Assigned(BrokerAllConnections) then begin
 | 
|---|
| 1134 |     BrokerAllConnections.Delete(BrokerAllConnections.IndexOfObject(Broker));
 | 
|---|
| 1135 |     if BrokerAllConnections.Count = 0 then begin
 | 
|---|
| 1136 |       BrokerAllConnections.Free;
 | 
|---|
| 1137 |       BrokerAllConnections := nil;
 | 
|---|
| 1138 |     end;
 | 
|---|
| 1139 |   end;   // if Assigned(BrokerAllConnections)
 | 
|---|
| 1140 | end;
 | 
|---|
| 1141 | 
 | 
|---|
| 1142 | {------------------------- ExistingSocket -------------------------
 | 
|---|
| 1143 | ------------------------------------------------------------------}
 | 
|---|
| 1144 | function ExistingSocket(Broker: TRPCBroker): integer;
 | 
|---|
| 1145 | // var
 | 
|---|
| 1146 | //   Index: integer;
 | 
|---|
| 1147 | begin
 | 
|---|
| 1148 |   Result := Broker.Socket;
 | 
|---|
| 1149 | {  Result := 0;                        // p13 to permit multiple Broker connections
 | 
|---|
| 1150 | 
 | 
|---|
| 1151 |   if Assigned(BrokerConnections) and
 | 
|---|
| 1152 |      BrokerConnections.Find(Broker.Server + ':' + IntToStr(Broker.ListenerPort), Index) then
 | 
|---|
| 1153 |     Result := TRPCBroker(BrokerConnections.Objects[Index]).Socket;
 | 
|---|
| 1154 | }
 | 
|---|
| 1155 | end;
 | 
|---|
| 1156 | 
 | 
|---|
| 1157 | {------------------------ AuthenticateUser ------------------------
 | 
|---|
| 1158 | ------------------------------------------------------------------}
 | 
|---|
| 1159 | procedure AuthenticateUser(ConnectingBroker: TRPCBroker);
 | 
|---|
| 1160 | var
 | 
|---|
| 1161 |   SaveClearParmeters, SaveClearResults: boolean;
 | 
|---|
| 1162 |   SaveParam: TParams;
 | 
|---|
| 1163 |   SaveRemoteProcedure, SaveRpcVersion: string;
 | 
|---|
| 1164 |   SaveResults: TStrings;
 | 
|---|
| 1165 |   blnSignedOn: boolean;
 | 
|---|
| 1166 |   SaveKernelLogin: boolean;
 | 
|---|
| 1167 |   SaveVistaLogin: TVistaLogin;
 | 
|---|
| 1168 |   OldExceptionHandler: TExceptionEvent;
 | 
|---|
| 1169 |   OldHandle: THandle;
 | 
|---|
| 1170 | begin
 | 
|---|
| 1171 |   With ConnectingBroker do
 | 
|---|
| 1172 |   begin
 | 
|---|
| 1173 |     SaveParam := TParams.Create(nil);
 | 
|---|
| 1174 |     SaveParam.Assign(Param);                  //save off settings
 | 
|---|
| 1175 |     SaveRemoteProcedure := RemoteProcedure;
 | 
|---|
| 1176 |     SaveRpcVersion := RpcVersion;
 | 
|---|
| 1177 |     SaveResults := Results;
 | 
|---|
| 1178 |     SaveClearParmeters := ClearParameters;
 | 
|---|
| 1179 |     SaveClearResults := ClearResults;
 | 
|---|
| 1180 |     ClearParameters := True;                  //set'em as I need'em
 | 
|---|
| 1181 |     ClearResults := True;
 | 
|---|
| 1182 |     SaveKernelLogin := FKernelLogin;     //  p13
 | 
|---|
| 1183 |     SaveVistaLogin := FLogin;            //  p13
 | 
|---|
| 1184 |   end;
 | 
|---|
| 1185 | 
 | 
|---|
| 1186 |   blnSignedOn := False;                       //initialize to bad sign-on
 | 
|---|
| 1187 |   
 | 
|---|
| 1188 |   if ConnectingBroker.AccessVerifyCodes <> '' then   // p13 handle as AVCode single signon
 | 
|---|
| 1189 |   begin
 | 
|---|
| 1190 |     ConnectingBroker.Login.AccessCode := Piece(ConnectingBroker.AccessVerifyCodes, ';', 1);
 | 
|---|
| 1191 |     ConnectingBroker.Login.VerifyCode := Piece(ConnectingBroker.AccessVerifyCodes, ';', 2);
 | 
|---|
| 1192 |     ConnectingBroker.Login.Mode := lmAVCodes;
 | 
|---|
| 1193 |     ConnectingBroker.FKernelLogIn := False;
 | 
|---|
| 1194 |   end;
 | 
|---|
| 1195 | 
 | 
|---|
| 1196 |   if ConnectingBroker.FKernelLogIn then
 | 
|---|
| 1197 |   begin   //p13
 | 
|---|
| 1198 |     if Assigned(Application.OnException) then
 | 
|---|
| 1199 |       OldExceptionHandler := Application.OnException
 | 
|---|
| 1200 |     else
 | 
|---|
| 1201 |       OldExceptionHandler := nil;
 | 
|---|
| 1202 |     Application.OnException := TfrmErrMsg.RPCBShowException;
 | 
|---|
| 1203 |     frmSignon := TfrmSignon.Create(Application);
 | 
|---|
| 1204 |     try
 | 
|---|
| 1205 | 
 | 
|---|
| 1206 |   //    ShowApplicationAndFocusOK(Application);
 | 
|---|
| 1207 |       OldHandle := GetForegroundWindow;
 | 
|---|
| 1208 |       SetForegroundWindow(frmSignon.Handle);
 | 
|---|
| 1209 |       PrepareSignonForm(ConnectingBroker);
 | 
|---|
| 1210 |       if SetUpSignOn then                       //SetUpSignOn in loginfrm unit.
 | 
|---|
| 1211 |       begin                                     //True if signon needed
 | 
|---|
| 1212 |   {                                               // p13 handle as AVCode single signon
 | 
|---|
| 1213 |         if ConnectingBroker.AccessVerifyCodes <> '' then
 | 
|---|
| 1214 |         begin {do non interactive logon
 | 
|---|
| 1215 |           frmSignon.accessCode.Text := Piece(ConnectingBroker.AccessVerifyCodes, ';', 1);
 | 
|---|
| 1216 |           frmSignon.verifyCode.Text := Piece(ConnectingBroker.AccessVerifyCodes, ';', 2);
 | 
|---|
| 1217 |           //Application.ProcessMessages;
 | 
|---|
| 1218 |           frmSignon.btnOk.Click;
 | 
|---|
| 1219 |         end
 | 
|---|
| 1220 |         else frmSignOn.ShowModal;               //do interactive logon
 | 
|---|
| 1221 |   }
 | 
|---|
| 1222 |   //      ShowApplicationAndFocusOK(Application);
 | 
|---|
| 1223 |   //      SetForegroundWindow(frmSignOn.Handle);
 | 
|---|
| 1224 |         if frmSignOn.lblServer.Caption <> '' then
 | 
|---|
| 1225 |         begin
 | 
|---|
| 1226 |           frmSignOn.ShowModal;                    //do interactive logon   // p13
 | 
|---|
| 1227 |           if frmSignOn.Tag = 1 then               //Tag=1 for good logon
 | 
|---|
| 1228 |             blnSignedOn := True;                   //Successfull logon
 | 
|---|
| 1229 |         end
 | 
|---|
| 1230 |       end
 | 
|---|
| 1231 |       else                                      //False when no logon needed
 | 
|---|
| 1232 |         blnSignedOn := NoSignOnNeeded;          //Returns True always (for now!)
 | 
|---|
| 1233 |       if blnSignedOn then                       //P6 If logged on, retrieve user info.
 | 
|---|
| 1234 |       begin
 | 
|---|
| 1235 |         GetBrokerInfo(ConnectingBroker);
 | 
|---|
| 1236 |         if not SelDiv.ChooseDiv('',ConnectingBroker) then
 | 
|---|
| 1237 |         begin
 | 
|---|
| 1238 |           blnSignedOn := False;//P8
 | 
|---|
| 1239 |           {Select division if multi-division user.  First parameter is 'userid'
 | 
|---|
| 1240 |           (DUZ or username) for future use. (P8)}
 | 
|---|
| 1241 |           ConnectingBroker.Login.ErrorText := 'Failed to select Division';  // p13 set some text indicating problem
 | 
|---|
| 1242 |         end;
 | 
|---|
| 1243 |       end;
 | 
|---|
| 1244 |       SetForegroundWindow(OldHandle);
 | 
|---|
| 1245 |     finally
 | 
|---|
| 1246 |       frmSignon.Free;
 | 
|---|
| 1247 | //      frmSignon.Release;                        //get rid of signon form
 | 
|---|
| 1248 | 
 | 
|---|
| 1249 | //      if ConnectingBroker.Owner is TForm then
 | 
|---|
| 1250 | //        SetForegroundWindow(TForm(ConnectingBroker.Owner).Handle)
 | 
|---|
| 1251 | //      else
 | 
|---|
| 1252 | //        SetForegroundWindow(ActiveWindow);
 | 
|---|
| 1253 |         ShowApplicationAndFocusOK(Application);
 | 
|---|
| 1254 |     end ; //try
 | 
|---|
| 1255 |     if Assigned(OldExceptionHandler) then
 | 
|---|
| 1256 |       Application.OnException := OldExceptionHandler;
 | 
|---|
| 1257 |    end;   //if kernellogin
 | 
|---|
| 1258 |                                                  // p13  following section for silent signon
 | 
|---|
| 1259 |   if not ConnectingBroker.FKernelLogIn then
 | 
|---|
| 1260 |     if ConnectingBroker.FLogin <> nil then     //the user.  vistalogin contains login info
 | 
|---|
| 1261 |       blnsignedon := SilentLogin(ConnectingBroker);    // RpcSLogin unit
 | 
|---|
| 1262 |   if not blnsignedon then
 | 
|---|
| 1263 |   begin
 | 
|---|
| 1264 |     ConnectingBroker.FLogin.FailedLogin(ConnectingBroker.FLogin);
 | 
|---|
| 1265 |     TXWBWinsock(ConnectingBroker.XWBWinsock).NetworkDisconnect(ConnectingBroker.FSocket);
 | 
|---|
| 1266 |   end
 | 
|---|
| 1267 |   else
 | 
|---|
| 1268 |     GetBrokerInfo(ConnectingBroker);
 | 
|---|
| 1269 | 
 | 
|---|
| 1270 |   //reset the Broker
 | 
|---|
| 1271 |   with ConnectingBroker do
 | 
|---|
| 1272 |   begin
 | 
|---|
| 1273 |     ClearParameters := SaveClearParmeters;
 | 
|---|
| 1274 |     ClearResults := SaveClearResults;
 | 
|---|
| 1275 |     Param.Assign(SaveParam);                  //restore settings
 | 
|---|
| 1276 |     SaveParam.Free;
 | 
|---|
| 1277 |     RemoteProcedure := SaveRemoteProcedure;
 | 
|---|
| 1278 |     RpcVersion := SaveRpcVersion;
 | 
|---|
| 1279 |     Results := SaveResults;
 | 
|---|
| 1280 |     FKernelLogin := SaveKernelLogin;         // p13
 | 
|---|
| 1281 |     FLogin := SaveVistaLogin;                // p13
 | 
|---|
| 1282 |   end;
 | 
|---|
| 1283 | 
 | 
|---|
| 1284 |   if not blnSignedOn then                     //Flag for unsuccessful signon.
 | 
|---|
| 1285 |     TXWBWinsock(ConnectingBroker.XWBWinsock).NetError('',XWB_BadSignOn);               //Will raise error.
 | 
|---|
| 1286 | 
 | 
|---|
| 1287 | end;
 | 
|---|
| 1288 | 
 | 
|---|
| 1289 | {------------------------ GetBrokerInfo ------------------------
 | 
|---|
| 1290 | P6  Retrieve information about user with XWB GET BROKER INFO
 | 
|---|
| 1291 |     RPC. For now, only Timeout value is retrieved in Results[0].
 | 
|---|
| 1292 | ------------------------------------------------------------------}
 | 
|---|
| 1293 | procedure GetBrokerInfo(ConnectedBroker: TRPCBroker);
 | 
|---|
| 1294 | begin
 | 
|---|
| 1295 |   GetUserInfo(ConnectedBroker);  //  p13  Get User info into User property (TVistaUser object)
 | 
|---|
| 1296 |   With ConnectedBroker do        //(dcm) Use one of objects below
 | 
|---|
| 1297 |   begin                          // and skip this RPC? or make this and
 | 
|---|
| 1298 |     RemoteProcedure := 'XWB GET BROKER INFO';   // others below as components
 | 
|---|
| 1299 |     try
 | 
|---|
| 1300 |       Call;
 | 
|---|
| 1301 |       if Results.Count > 0 then
 | 
|---|
| 1302 |         if StrToInt(Results[0]) > MINIMUM_TIMEOUT then
 | 
|---|
| 1303 |           FPulse.Interval := (StrToInt(Results[0]) * 10 * PULSE_PERCENTAGE);
 | 
|---|
| 1304 |     except
 | 
|---|
| 1305 |       On e: EBrokerError do
 | 
|---|
| 1306 |         ShowMessage('A problem was encountered getting Broker information.  '+e.Message);  //TODO
 | 
|---|
| 1307 |     end;
 | 
|---|
| 1308 |   end;
 | 
|---|
| 1309 | end;
 | 
|---|
| 1310 | 
 | 
|---|
| 1311 | {------------------------ NoSignOnNeeded ------------------------
 | 
|---|
| 1312 | ------------------------------------------------------------------}
 | 
|---|
| 1313 | {Currently a placeholder for actions that may be needed in connection
 | 
|---|
| 1314 | with authenticating a user who needn't sign on (Single Sign on feature).
 | 
|---|
| 1315 | Returns True if no signon is needed
 | 
|---|
| 1316 |         False if signon is needed.}
 | 
|---|
| 1317 | function  NoSignOnNeeded : Boolean;
 | 
|---|
| 1318 | begin
 | 
|---|
| 1319 |   Result := True;
 | 
|---|
| 1320 | end;
 | 
|---|
| 1321 | 
 | 
|---|
| 1322 | {------------------------- ProcessExecute -------------------------
 | 
|---|
| 1323 | This function is borrowed from "Delphi 2 Developer's Guide" by Pacheco & Teixera.
 | 
|---|
| 1324 | See chapter 11, page 406.  It encapsulates and simplifies use of
 | 
|---|
| 1325 | Windows CreateProcess function.
 | 
|---|
| 1326 | ------------------------------------------------------------------}
 | 
|---|
| 1327 | function ProcessExecute(Command: string; cShow: Word): Integer;
 | 
|---|
| 1328 | { This method encapsulates the call to CreateProcess() which creates
 | 
|---|
| 1329 |   a new process and its primary thread. This is the method used in
 | 
|---|
| 1330 |   Win32 to execute another application, This method requires the use
 | 
|---|
| 1331 |   of the TStartInfo and TProcessInformation structures. These structures
 | 
|---|
| 1332 |   are not documented as part of the Delphi 2.0 online help but rather
 | 
|---|
| 1333 |   the Win32 help as STARTUPINFO and PROCESS_INFORMATION.
 | 
|---|
| 1334 | 
 | 
|---|
| 1335 |   The CommandLine paremeter specifies the pathname of the file to
 | 
|---|
| 1336 |   execute.
 | 
|---|
| 1337 | 
 | 
|---|
| 1338 |   The cShow paremeter specifies one of the SW_XXXX constants which
 | 
|---|
| 1339 |   specifies how to display the window. This value is assigned to the
 | 
|---|
| 1340 |   sShowWindow field of the TStartupInfo structure. }
 | 
|---|
| 1341 | var
 | 
|---|
| 1342 |   Rslt: LongBool;
 | 
|---|
| 1343 |   StartUpInfo: TStartUpInfo;  // documented as STARTUPINFO
 | 
|---|
| 1344 |   ProcessInfo: TProcessInformation; // documented as PROCESS_INFORMATION
 | 
|---|
| 1345 | begin
 | 
|---|
| 1346 |   { Clear the StartupInfo structure }
 | 
|---|
| 1347 |   FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
 | 
|---|
| 1348 |   { Initialize the StartupInfo structure with required data.
 | 
|---|
| 1349 |     Here, we assign the SW_XXXX constant to the wShowWindow field
 | 
|---|
| 1350 |     of StartupInfo. When specifing a value to this field the
 | 
|---|
| 1351 |     STARTF_USESSHOWWINDOW flag must be set in the dwFlags field.
 | 
|---|
| 1352 |     Additional information on the TStartupInfo is provided in the Win32
 | 
|---|
| 1353 |     online help under STARTUPINFO. }
 | 
|---|
| 1354 |   with StartupInfo do begin
 | 
|---|
| 1355 |     cb := SizeOf(TStartupInfo); // Specify size of structure
 | 
|---|
| 1356 |     dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
 | 
|---|
| 1357 |     wShowWindow := cShow
 | 
|---|
| 1358 |   end;
 | 
|---|
| 1359 | 
 | 
|---|
| 1360 |   { Create the process by calling CreateProcess(). This function
 | 
|---|
| 1361 |     fills the ProcessInfo structure with information about the new
 | 
|---|
| 1362 |     process and its primary thread. Detailed information is provided
 | 
|---|
| 1363 |     in the Win32 online help for the TProcessInfo structure under
 | 
|---|
| 1364 |     PROCESS_INFORMATION. }
 | 
|---|
| 1365 |   Rslt := CreateProcess(PChar(Command), nil, nil, nil, False,
 | 
|---|
| 1366 |     NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo);
 | 
|---|
| 1367 |   { If Rslt is true, then the CreateProcess call was successful.
 | 
|---|
| 1368 |     Otherwise, GetLastError will return an error code representing the
 | 
|---|
| 1369 |     error which occurred. }
 | 
|---|
| 1370 |   if Rslt then
 | 
|---|
| 1371 |     with ProcessInfo do begin
 | 
|---|
| 1372 |       { Wait until the process is in idle. }
 | 
|---|
| 1373 |       WaitForInputIdle(hProcess, INFINITE);
 | 
|---|
| 1374 |       CloseHandle(hThread); // Free the hThread  handle
 | 
|---|
| 1375 |       CloseHandle(hProcess);// Free the hProcess handle
 | 
|---|
| 1376 |       Result := 0;          // Set Result to 0, meaning successful
 | 
|---|
| 1377 |     end
 | 
|---|
| 1378 |   else Result := GetLastError; // Set result to the error code.
 | 
|---|
| 1379 | end;
 | 
|---|
| 1380 | 
 | 
|---|
| 1381 | 
 | 
|---|
| 1382 | {----------------------- GetAppHandle --------------------------
 | 
|---|
| 1383 | Library function to return an Application Handle from the server
 | 
|---|
| 1384 | which can be passed as a command line argument to an application
 | 
|---|
| 1385 | the current application is starting.  The new application can use
 | 
|---|
| 1386 | this AppHandle to perform a silent login via the lmAppHandle mode
 | 
|---|
| 1387 | ----------------------------------------------------------------}
 | 
|---|
| 1388 | function  GetAppHandle(ConnectedBroker : TRPCBroker): String;   // p13
 | 
|---|
| 1389 | begin
 | 
|---|
| 1390 |   Result := '';
 | 
|---|
| 1391 |   with ConnectedBroker do
 | 
|---|
| 1392 |     begin
 | 
|---|
| 1393 |       RemoteProcedure := 'XUS GET TOKEN';
 | 
|---|
| 1394 |       Call;
 | 
|---|
| 1395 |       Result := Results[0];
 | 
|---|
| 1396 |     end;
 | 
|---|
| 1397 | end;
 | 
|---|
| 1398 | 
 | 
|---|
| 1399 | {----------------------- TRPCBroker.DoPulseOnTimer-----------------
 | 
|---|
| 1400 | Called from the OnTimer event of the Pulse property.
 | 
|---|
| 1401 | Broker environment should be the same after the procedure as before.
 | 
|---|
| 1402 | Note: Results is not changed by strCall; so, Results needn't be saved.
 | 
|---|
| 1403 | ------------------------------------------------------------------}
 | 
|---|
| 1404 | procedure TRPCBroker.DoPulseOnTimer(Sender: TObject);  //P6
 | 
|---|
| 1405 | var
 | 
|---|
| 1406 |   SaveClearParameters : Boolean;
 | 
|---|
| 1407 |   SaveParam : TParams;
 | 
|---|
| 1408 |   SaveRemoteProcedure, SaveRPCVersion : string;
 | 
|---|
| 1409 | begin
 | 
|---|
| 1410 |   SaveClearParameters := ClearParameters;  //Save existing properties
 | 
|---|
| 1411 |   SaveParam := TParams.Create(nil);
 | 
|---|
| 1412 |   SaveParam.Assign(Param);
 | 
|---|
| 1413 |   SaveRemoteProcedure := RemoteProcedure;
 | 
|---|
| 1414 |   SaveRPCVersion      := RPCVersion;
 | 
|---|
| 1415 |   RemoteProcedure := 'XWB IM HERE';       //Set Properties for IM HERE
 | 
|---|
| 1416 |   ClearParameters  := True;               //Erase existing PARAMs
 | 
|---|
| 1417 |   RPCVersion      := '1.106';
 | 
|---|
| 1418 |   try
 | 
|---|
| 1419 |     try
 | 
|---|
| 1420 |       strCall;                                //Make the call
 | 
|---|
| 1421 |     except on e: EBrokerError do
 | 
|---|
| 1422 |       begin
 | 
|---|
| 1423 | //        Connected := False;                // set the connection as disconnected
 | 
|---|
| 1424 |         if Assigned(FOnPulseError) then
 | 
|---|
| 1425 |           FOnPulseError(Self, e.Message)
 | 
|---|
| 1426 |         else
 | 
|---|
| 1427 |           raise e;
 | 
|---|
| 1428 |       end;
 | 
|---|
| 1429 |     end;
 | 
|---|
| 1430 |   finally
 | 
|---|
| 1431 |     ClearParameters := SaveClearParameters;  //Restore pre-existing properties.
 | 
|---|
| 1432 |     Param.Assign(SaveParam);
 | 
|---|
| 1433 |     SaveParam.Free;
 | 
|---|
| 1434 |     RemoteProcedure := SaveRemoteProcedure;
 | 
|---|
| 1435 |     RPCVersion      := SaveRPCVersion;
 | 
|---|
| 1436 |   end;
 | 
|---|
| 1437 | 
 | 
|---|
| 1438 | end;
 | 
|---|
| 1439 | 
 | 
|---|
| 1440 | procedure TRPCBroker.SetKernelLogIn(const Value: Boolean);   // p13
 | 
|---|
| 1441 | begin
 | 
|---|
| 1442 |   FKernelLogIn := Value;
 | 
|---|
| 1443 | end;
 | 
|---|
| 1444 | {
 | 
|---|
| 1445 | procedure TRPCBroker.SetLogIn(const Value: TVistaLogIn);     // p13
 | 
|---|
| 1446 | begin
 | 
|---|
| 1447 |   FLogIn := Value;
 | 
|---|
| 1448 | end;
 | 
|---|
| 1449 | }
 | 
|---|
| 1450 | procedure TRPCBroker.SetUser(const Value: TVistaUser);       // p13
 | 
|---|
| 1451 | begin
 | 
|---|
| 1452 |   FUser := Value;
 | 
|---|
| 1453 | end;
 | 
|---|
| 1454 | 
 | 
|---|
| 1455 | 
 | 
|---|
| 1456 | {*****TVistaLogin***** p13}
 | 
|---|
| 1457 | 
 | 
|---|
| 1458 | constructor TVistaLogin.Create(AOwner: TComponent);           // p13
 | 
|---|
| 1459 | begin
 | 
|---|
| 1460 |   inherited create;
 | 
|---|
| 1461 |   FDivLst := TStringList.Create;
 | 
|---|
| 1462 | end;
 | 
|---|
| 1463 | 
 | 
|---|
| 1464 | destructor TVistaLogin.Destroy;                              // p13
 | 
|---|
| 1465 | begin
 | 
|---|
| 1466 |   FDivLst.Free;
 | 
|---|
| 1467 |   FDivLst := nil;
 | 
|---|
| 1468 |   inherited;
 | 
|---|
| 1469 | end;
 | 
|---|
| 1470 | 
 | 
|---|
| 1471 | procedure TVistaLogin.FailedLogin(Sender: TObject);         // p13
 | 
|---|
| 1472 | begin
 | 
|---|
| 1473 |   if Assigned(FOnFailedLogin) then FOnFailedLogin(Self)
 | 
|---|
| 1474 |   else  TXWBWinsock(TRPCBroker(Sender).XWBWinsock).NetError('',XWB_BadSignOn);
 | 
|---|
| 1475 | end;
 | 
|---|
| 1476 | 
 | 
|---|
| 1477 | procedure TVistaLogin.SetAccessCode(const Value: String);   // p13
 | 
|---|
| 1478 | begin
 | 
|---|
| 1479 |   FAccessCode := Value;
 | 
|---|
| 1480 | end;
 | 
|---|
| 1481 | 
 | 
|---|
| 1482 | procedure TVistaLogin.SetDivision(const Value: String);     // p13
 | 
|---|
| 1483 | begin
 | 
|---|
| 1484 |   FDivision := Value;
 | 
|---|
| 1485 | end;
 | 
|---|
| 1486 | 
 | 
|---|
| 1487 | procedure TVistaLogin.SetDuz(const Value: string);          // p13
 | 
|---|
| 1488 | begin
 | 
|---|
| 1489 |   FDUZ := Value;
 | 
|---|
| 1490 | end;
 | 
|---|
| 1491 | 
 | 
|---|
| 1492 | procedure TVistaLogin.SetErrorText(const Value: string);    // p13
 | 
|---|
| 1493 | begin
 | 
|---|
| 1494 |   FErrorText := Value;
 | 
|---|
| 1495 | end;
 | 
|---|
| 1496 | 
 | 
|---|
| 1497 | procedure TVistaLogin.SetLogInHandle(const Value: String);   // p13
 | 
|---|
| 1498 | begin
 | 
|---|
| 1499 |   FLogInHandle := Value;
 | 
|---|
| 1500 | end;
 | 
|---|
| 1501 | 
 | 
|---|
| 1502 | procedure TVistaLogin.SetMode(const Value: TLoginMode);      // p13
 | 
|---|
| 1503 | begin
 | 
|---|
| 1504 |   FMode := Value;
 | 
|---|
| 1505 | end;
 | 
|---|
| 1506 | 
 | 
|---|
| 1507 | procedure TVistaLogin.SetMultiDivision(Value: Boolean);      // p13
 | 
|---|
| 1508 | begin
 | 
|---|
| 1509 |   FMultiDivision := Value;
 | 
|---|
| 1510 | end;
 | 
|---|
| 1511 | 
 | 
|---|
| 1512 | procedure TVistaLogin.SetNTToken(const Value: String);       // p13
 | 
|---|
| 1513 | begin
 | 
|---|
| 1514 | end;
 | 
|---|
| 1515 | 
 | 
|---|
| 1516 | procedure TVistaLogin.SetPromptDiv(const Value: boolean);    // p13
 | 
|---|
| 1517 | begin
 | 
|---|
| 1518 |   FPromptDiv := Value;
 | 
|---|
| 1519 | end;
 | 
|---|
| 1520 | 
 | 
|---|
| 1521 | procedure TVistaLogin.SetVerifyCode(const Value: String);    // p13
 | 
|---|
| 1522 | begin
 | 
|---|
| 1523 |   FVerifyCode := Value;
 | 
|---|
| 1524 | end;
 | 
|---|
| 1525 | 
 | 
|---|
| 1526 | {***** TVistaUser ***** p13 }
 | 
|---|
| 1527 | 
 | 
|---|
| 1528 | procedure TVistaUser.SetDivision(const Value: String);       // p13
 | 
|---|
| 1529 | begin
 | 
|---|
| 1530 |   FDivision := Value;
 | 
|---|
| 1531 | end;
 | 
|---|
| 1532 | 
 | 
|---|
| 1533 | procedure TVistaUser.SetDTime(const Value: string);          // p13
 | 
|---|
| 1534 | begin
 | 
|---|
| 1535 |   FDTime := Value;
 | 
|---|
| 1536 | end;
 | 
|---|
| 1537 | 
 | 
|---|
| 1538 | procedure TVistaUser.SetDUZ(const Value: String);             // p13
 | 
|---|
| 1539 | begin
 | 
|---|
| 1540 |   FDUZ := Value;
 | 
|---|
| 1541 | end;
 | 
|---|
| 1542 | 
 | 
|---|
| 1543 | procedure TVistaUser.SetLanguage(const Value: string);       // p13
 | 
|---|
| 1544 | begin
 | 
|---|
| 1545 |   FLanguage := Value;
 | 
|---|
| 1546 | end;
 | 
|---|
| 1547 | 
 | 
|---|
| 1548 | procedure TVistaUser.SetName(const Value: String);           // p13
 | 
|---|
| 1549 | begin
 | 
|---|
| 1550 |   FName := Value;
 | 
|---|
| 1551 | end;
 | 
|---|
| 1552 | 
 | 
|---|
| 1553 | procedure TVistaUser.SetServiceSection(const Value: string);  // p13
 | 
|---|
| 1554 | begin
 | 
|---|
| 1555 |   FServiceSection := Value;
 | 
|---|
| 1556 | end;
 | 
|---|
| 1557 | 
 | 
|---|
| 1558 | procedure TVistaUser.SetStandardName(const Value: String);    // p13
 | 
|---|
| 1559 | begin
 | 
|---|
| 1560 |   FStandardName := Value;
 | 
|---|
| 1561 | end;
 | 
|---|
| 1562 | 
 | 
|---|
| 1563 | procedure TVistaUser.SetTitle(const Value: string);           // p13
 | 
|---|
| 1564 | begin
 | 
|---|
| 1565 |   FTitle := Value;
 | 
|---|
| 1566 | end;
 | 
|---|
| 1567 | 
 | 
|---|
| 1568 | procedure TVistaUser.SetVerifyCodeChngd(const Value: Boolean);   // p13
 | 
|---|
| 1569 | begin
 | 
|---|
| 1570 |   FVerifyCodeChngd := Value;
 | 
|---|
| 1571 | end;
 | 
|---|
| 1572 | 
 | 
|---|
| 1573 | Function ShowApplicationAndFocusOK(anApplication: TApplication): boolean;
 | 
|---|
| 1574 | var
 | 
|---|
| 1575 |   j: integer;
 | 
|---|
| 1576 |   Stat2: set of (sWinVisForm,sWinVisApp,sIconized);
 | 
|---|
| 1577 |   hFGWnd: THandle;
 | 
|---|
| 1578 | begin
 | 
|---|
| 1579 |   Stat2 := []; {sWinVisForm,sWinVisApp,sIconized}
 | 
|---|
| 1580 | 
 | 
|---|
| 1581 |   If anApplication.MainForm <> nil then
 | 
|---|
| 1582 |     If IsWindowVisible(anApplication.MainForm.Handle)
 | 
|---|
| 1583 |       then Stat2 := Stat2 + [sWinVisForm];
 | 
|---|
| 1584 | 
 | 
|---|
| 1585 |   If IsWindowVisible(anApplication.Handle)
 | 
|---|
| 1586 |       then Stat2 := Stat2 + [sWinVisApp];
 | 
|---|
| 1587 | 
 | 
|---|
| 1588 |   If IsIconic(anApplication.Handle)
 | 
|---|
| 1589 |       then Stat2 := Stat2 + [sIconized];
 | 
|---|
| 1590 | 
 | 
|---|
| 1591 |   Result := true;
 | 
|---|
| 1592 |   If sIconized in Stat2 then begin {A}
 | 
|---|
| 1593 |     j := SendMessage(anApplication.Handle,WM_SYSCOMMAND,SC_RESTORE,0);
 | 
|---|
| 1594 |     Result := j<>0;
 | 
|---|
| 1595 |   end;
 | 
|---|
| 1596 |   If Stat2 * [sWinVisForm,sIconized] = [] then begin {S}
 | 
|---|
| 1597 |     if anApplication.MainForm <> nil then
 | 
|---|
| 1598 |       anApplication.MainForm.Show;
 | 
|---|
| 1599 |   end;
 | 
|---|
| 1600 |   If (Stat2 * [sWinVisForm,sIconized] <> []) or
 | 
|---|
| 1601 |      (sWinVisApp in Stat2) then begin {G}
 | 
|---|
| 1602 | {$IFNDEF D6_OR_HIGHER}
 | 
|---|
| 1603 |     hFGWnd := GetForegroundWindow;
 | 
|---|
| 1604 |     try
 | 
|---|
| 1605 |       AttachThreadInput(
 | 
|---|
| 1606 |           GetWindowThreadProcessId(hFGWnd, nil),
 | 
|---|
| 1607 |           GetCurrentThreadId,True);
 | 
|---|
| 1608 |       Result := SetForegroundWindow(anApplication.Handle);
 | 
|---|
| 1609 |     finally
 | 
|---|
| 1610 |       AttachThreadInput(
 | 
|---|
| 1611 |           GetWindowThreadProcessId(hFGWnd, nil),
 | 
|---|
| 1612 |           GetCurrentThreadId, False);
 | 
|---|
| 1613 |     end;
 | 
|---|
| 1614 | {$ENDIF}
 | 
|---|
| 1615 |   end;
 | 
|---|
| 1616 | end;
 | 
|---|
| 1617 | 
 | 
|---|
| 1618 | end.
 | 
|---|
| 1619 | 
 | 
|---|