| [476] | 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 |  | 
|---|