| [453] | 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: Kevin Meldrum, Travis Hilton, Joel Ivey
 | 
|---|
 | 6 |         Description: SharedBroker functionality for the 
 | 
|---|
 | 7 |                      RPCSharedBrokerSessionMgr1.
 | 
|---|
 | 8 |         Current Release: Version 1.1 Patch 40 (January 7, 2005))
 | 
|---|
 | 9 | *************************************************************** }
 | 
|---|
 | 10 | 
 | 
|---|
 | 11 | unit uSharedBroker1;
 | 
|---|
 | 12 | 
 | 
|---|
 | 13 | interface
 | 
|---|
 | 14 | 
 | 
|---|
 | 15 | uses
 | 
|---|
 | 16 |   Windows, ComObj, ActiveX, AxCtrls, Classes, RPCSharedBrokerSessionMgr1_TLB, StdVcl,
 | 
|---|
 | 17 |   Trpcb;
 | 
|---|
 | 18 | 
 | 
|---|
 | 19 | const
 | 
|---|
 | 20 |   kMilliSecondScale: double = 1000;
 | 
|---|
 | 21 |   kCloseAllClientsWaitTimeDefault: double = 10 * 1000; // In milliseconds
 | 
|---|
 | 22 |   kMillisecondTicksPerSecond: Extended = 1000;
 | 
|---|
 | 23 | 
 | 
|---|
 | 24 | type
 | 
|---|
 | 25 |   // RPCCallHistoryEntry contains the call name, params, results and other
 | 
|---|
 | 26 |   // info regarding a single rpc call. It is using in passing rpc info
 | 
|---|
 | 27 |   // around the history
 | 
|---|
 | 28 |   RPCCallHistoryEntry = class
 | 
|---|
 | 29 |   private
 | 
|---|
 | 30 |     FBrokerContext:   WideString;    // Context in which the RPC call was made
 | 
|---|
 | 31 |     FRpcName:         WideString;    // M name of the RPC call
 | 
|---|
 | 32 |     FParams:          WideString;    // M parameters to the RPC call
 | 
|---|
 | 33 |     FResults:         WideString;    // results of the call
 | 
|---|
 | 34 |     FStartDateTime:   Double;        // time/date just before the call was made
 | 
|---|
 | 35 |     FDurationInMS:    Longword;      // duration of the RPC in milliseconds
 | 
|---|
 | 36 |     FUniqueRPCCallId: Longword;      // Unique RPC call id
 | 
|---|
 | 37 |     FUniqueClientId:  Integer;       // The client that made the RPC
 | 
|---|
 | 38 | 
 | 
|---|
 | 39 |   public
 | 
|---|
 | 40 |     constructor Create; overload;
 | 
|---|
 | 41 |     constructor Create(context:WideString;
 | 
|---|
 | 42 |                        name:WideString;
 | 
|---|
 | 43 |                        params:WideString;
 | 
|---|
 | 44 |                        results:WideString;
 | 
|---|
 | 45 |                        startDateTime:Double;
 | 
|---|
 | 46 |                        durationInMS:Longword;
 | 
|---|
 | 47 |                        clientId:Integer); overload;
 | 
|---|
 | 48 | 
 | 
|---|
 | 49 |     property CallContext:WideString        read FBrokerContext   write FBrokerContext;
 | 
|---|
 | 50 |     property CallName:WideString           read FRpcName         write FRpcName;
 | 
|---|
 | 51 |     property CallParams:WideString         read FParams          write FParams;
 | 
|---|
 | 52 |     property CallResults:WideString        read FResults         write FResults;
 | 
|---|
 | 53 |     property CallStartDateTime:Double      read FStartDateTime   write FStartDateTime;
 | 
|---|
 | 54 |     property CallDurationInMS:Longword     read FDurationInMS    write FDurationInMS;
 | 
|---|
 | 55 |     property UniqueRPCCallId:longword      read FUniqueRPCCallId write FUniqueRPCCallId;
 | 
|---|
 | 56 |     property BrokerUniqueClientId:Integer  read FUniqueClientId  write FUniqueClientId;
 | 
|---|
 | 57 |   end;
 | 
|---|
 | 58 | 
 | 
|---|
 | 59 |   RPCCallHistoryEntryPointer = ^RPCCallHistoryEntry;
 | 
|---|
 | 60 | 
 | 
|---|
 | 61 |   // RPCCallHistory keeps track of RPCs and their Results. The end data/time and
 | 
|---|
 | 62 |   // duration of the call in milliseconds is recorded. The uniqueRPCId of the
 | 
|---|
 | 63 |   // call is recorded as well.
 | 
|---|
 | 64 |   RPCCallHistory = class(TList)
 | 
|---|
 | 65 |     constructor Create; overload;
 | 
|---|
 | 66 |   private
 | 
|---|
 | 67 |     FEnabled: boolean;
 | 
|---|
 | 68 | 
 | 
|---|
 | 69 |   public
 | 
|---|
 | 70 |     function    Add(entry: RPCCallHistoryEntry): Integer; reintroduce; overload;
 | 
|---|
 | 71 |     property    Enabled: boolean read FEnabled write FEnabled;
 | 
|---|
 | 72 |     function    GetRPCCallEntryPtr(uniqueRpcId:Longword;
 | 
|---|
 | 73 |                                    out rpcEntryPtr:RPCCallHistoryEntryPointer)
 | 
|---|
 | 74 |                                    : ISharedBrokerErrorCode;
 | 
|---|
 | 75 |     function    GetRPCCallEntryPtrFromIndex(rpcCallIndex:Integer;
 | 
|---|
 | 76 |                                    out rpcEntryPtr:RPCCallHistoryEntryPointer)
 | 
|---|
 | 77 |                                    : ISharedBrokerErrorCode;
 | 
|---|
 | 78 |     function    GetRPCCallClientId(uniqueRpcId:Integer;
 | 
|---|
 | 79 |                                    out uniqueClientId:Integer)
 | 
|---|
 | 80 |                                    : ISharedBrokerErrorCode;
 | 
|---|
 | 81 |   end;
 | 
|---|
 | 82 | 
 | 
|---|
 | 83 |   // Every TSharedBroker contains a reference to a TBrokerConnection.
 | 
|---|
 | 84 |   // The TBrokerConnection contains an actual instance to to a TRPCBroker
 | 
|---|
 | 85 |   // This is where the connection sharing takes place
 | 
|---|
 | 86 |   TBrokerConnection = class
 | 
|---|
 | 87 |   private
 | 
|---|
 | 88 |     FBroker:            TRPCBroker;
 | 
|---|
 | 89 |     FShared:            Boolean;
 | 
|---|
 | 90 |     FServerIP:          string;
 | 
|---|
 | 91 |     FServer:            string;
 | 
|---|
 | 92 |     FPort:              Integer;
 | 
|---|
 | 93 |     FRefCount:          Integer;
 | 
|---|
 | 94 |     FLastContext:       WideString;
 | 
|---|
 | 95 |     FConnectionIndex:   Integer;
 | 
|---|
 | 96 |   end;
 | 
|---|
 | 97 | 
 | 
|---|
 | 98 |   TSharedBroker = class(TAutoObject, IConnectionPointContainer, ISharedBroker)
 | 
|---|
 | 99 |   private
 | 
|---|
 | 100 |     { Private declarations }
 | 
|---|
 | 101 |     FConnectionPoints: TConnectionPoints;
 | 
|---|
 | 102 | //    FConnectionPoint: TConnectionPoint;
 | 
|---|
 | 103 | //    FSinkList: TList;
 | 
|---|
 | 104 |     FEvents: ISharedBrokerEvents;
 | 
|---|
 | 105 | 
 | 
|---|
 | 106 |     FBrokerConnection:    TBrokerConnection;
 | 
|---|
 | 107 |     FBrokerContext:       WideString;
 | 
|---|
 | 108 |     FClientName:          WideString;
 | 
|---|
 | 109 |     FUniqueClientId:      Longword;
 | 
|---|
 | 110 |     FRpcCallHistory:      RPCCallHistory;
 | 
|---|
 | 111 |     FConnectType:         ISharedBrokerClient;
 | 
|---|
 | 112 |     FInGeneralClientList: Boolean;
 | 
|---|
 | 113 | //    FShowErrorMsgs:       ISharedBrokerShowErrorMsgs;
 | 
|---|
 | 114 | 
 | 
|---|
 | 115 |     procedure DoDisconnect;
 | 
|---|
 | 116 | 
 | 
|---|
 | 117 |   public
 | 
|---|
 | 118 |     Destructor Destroy; override;
 | 
|---|
 | 119 |     procedure Initialize; override;
 | 
|---|
 | 120 |     function GetEnumerator: IEnumConnections;
 | 
|---|
 | 121 |     function GetConnectionIndex: Integer;
 | 
|---|
 | 122 |   public
 | 
|---|
 | 123 |     { Protected declarations }
 | 
|---|
 | 124 |     property ConnectionPoints: TConnectionPoints read FConnectionPoints
 | 
|---|
 | 125 |       implements IConnectionPointContainer;
 | 
|---|
 | 126 |     procedure EventSinkChanged(const EventSink: IUnknown); override;
 | 
|---|
 | 127 |     function BrokerConnect(const ClientName: WideString;
 | 
|---|
 | 128 |       ConnectionType: ISharedBrokerClient; const ServerPort: WideString;
 | 
|---|
 | 129 |       WantDebug, AllowShared, KernelLoginVal: WordBool;
 | 
|---|
 | 130 |       ShowErrMsgs: ISharedBrokerShowErrorMsgs; RpcTimeLim: SYSINT;
 | 
|---|
 | 131 |       var LoginStr: WideString; out UniqueClientIId: SYSINT;
 | 
|---|
 | 132 |       out ErrorMsg: WideString): ISharedBrokerErrorCode; safecall;
 | 
|---|
 | 133 |     function BrokerCall(const RpcName, RpcParams: WideString;
 | 
|---|
 | 134 |       RpcTimeLimit: Integer; out RpcResults: WideString;
 | 
|---|
 | 135 |       out UniqueRpcCallId: Integer): ISharedBrokerErrorCode; safecall;
 | 
|---|
 | 136 |     function BrokerDisconnect: ISharedBrokerErrorCode; safecall;
 | 
|---|
 | 137 |     function BrokerSetContext(
 | 
|---|
 | 138 |       const OptionName: WideString): ISharedBrokerErrorCode; safecall;
 | 
|---|
 | 139 |     function ReadRegDataDefault(Root: IRegistryRootEnum; const Key, Name,
 | 
|---|
 | 140 |       Default: WideString;
 | 
|---|
 | 141 |       out RegResult: WideString): ISharedBrokerErrorCode; safecall;
 | 
|---|
 | 142 |     function Get_PerClientRpcHistoryLimit: Integer; safecall;
 | 
|---|
 | 143 |     function Get_RpcHistoryEnabled: WordBool; safecall;
 | 
|---|
 | 144 |     function Get_RpcVersion: WideString; safecall;
 | 
|---|
 | 145 |     procedure Set_PerClientRpcHistoryLimit(limit: Integer); safecall;
 | 
|---|
 | 146 |     procedure Set_RpcHistoryEnabled(enabled: WordBool); safecall;
 | 
|---|
 | 147 |     procedure Set_RpcVersion(const version: WideString); safecall;
 | 
|---|
 | 148 |     function GetActiveBrokerConnectionIndexCount(
 | 
|---|
 | 149 |       out connectionIndexCount: Integer): ISharedBrokerErrorCode; safecall;
 | 
|---|
 | 150 |     function GetActiveBrokerConnectionIndexFromUniqueClientId(
 | 
|---|
 | 151 |       uniqueClientId: Integer;
 | 
|---|
 | 152 |       out connectionIndex: Integer): ISharedBrokerErrorCode; safecall;
 | 
|---|
 | 153 |     function GetActiveBrokerConnectionInfo(connectionIndex: Integer;
 | 
|---|
 | 154 |       out connectedServerIp: WideString; out connectedServerPort: Integer;
 | 
|---|
 | 155 |       out lastContext: WideString): ISharedBrokerErrorCode; safecall;
 | 
|---|
 | 156 |     function GetClientIdAndNameFromIndex(clientIndex: Integer;
 | 
|---|
 | 157 |       out uniqueClientId: Integer;
 | 
|---|
 | 158 |       out clientName: WideString): ISharedBrokerErrorCode; safecall;
 | 
|---|
 | 159 |     function GetClientNameFromUniqueClientId(uniqueClientId: Integer;
 | 
|---|
 | 160 |       out clientName: WideString): ISharedBrokerErrorCode; safecall;
 | 
|---|
 | 161 |     function GetRpcHistoryCountForClient(uniqueClientId: Integer;
 | 
|---|
 | 162 |       out rpcHistoryCount: Integer): ISharedBrokerErrorCode; safecall;
 | 
|---|
 | 163 |     function LogoutConnectedClients(
 | 
|---|
 | 164 |       logoutTimeLimit: Integer): ISharedBrokerErrorCode; safecall;
 | 
|---|
 | 165 |     function GetRpcCallFromHistoryIndex(uniqueClientId, rpcCallIndex: Integer;
 | 
|---|
 | 166 |       out uniqueRpcId: Integer; out brokerContext, rpcName, rpcParams,
 | 
|---|
 | 167 |       rpcResult: WideString; out rpcStartDateTime: Double;
 | 
|---|
 | 168 |       out rpcDuration: Integer): ISharedBrokerErrorCode; safecall;
 | 
|---|
 | 169 |     function GetRpcClientIdFromHistory(uniqueRpcId: Integer;
 | 
|---|
 | 170 |       out uniqueClientId: Integer;
 | 
|---|
 | 171 |       out clientName: WideString): ISharedBrokerErrorCode; safecall;
 | 
|---|
 | 172 |     function GetConnectedClientCount(
 | 
|---|
 | 173 |       out connectedClientCount: Integer): ISharedBrokerErrorCode; safecall;
 | 
|---|
 | 174 |     function GetRpcCallFromHistory(uniqueRpcId: Integer;
 | 
|---|
 | 175 |       out uniqueClientId: Integer; out brokerContext, rpcName, rpcParams,
 | 
|---|
 | 176 |       rpcResult: WideString; out rpcStartDateTime: Double;
 | 
|---|
 | 177 |       out rpcDuration: Integer): ISharedBrokerErrorCode; safecall;
 | 
|---|
 | 178 |     function Get_CurrentContext: WideString; safecall;
 | 
|---|
 | 179 |     function Get_KernelLogin: WordBool; safecall;
 | 
|---|
 | 180 |     function Get_Login: WideString; safecall;
 | 
|---|
 | 181 |     function Get_RpcbError: WideString; safecall;
 | 
|---|
 | 182 |     function Get_ShowErrorMsgs: ISharedBrokerShowErrorMsgs; safecall;
 | 
|---|
 | 183 |     function Get_Socket: Integer; safecall;
 | 
|---|
 | 184 |     function Get_User: WideString; safecall;
 | 
|---|
 | 185 |     procedure Set_KernelLogin(Value: WordBool); safecall;
 | 
|---|
 | 186 |     procedure Set_Login(const Value: WideString); safecall;
 | 
|---|
 | 187 |     procedure Set_ShowErrorMsgs(Value: ISharedBrokerShowErrorMsgs); safecall;
 | 
|---|
 | 188 | 
 | 
|---|
 | 189 |     property ClientName: WideString read FClientName write FClientName;
 | 
|---|
 | 190 |     property BrokerUniqueClientId: Longword read FUniqueClientId write FUniqueClientId;
 | 
|---|
 | 191 |     property RpcHistory: RPCCallHistory read FRpcCallHistory ;
 | 
|---|
 | 192 |     property ConnectType: ISharedBrokerClient read FConnectType write FConnectType;
 | 
|---|
 | 193 |     property BrokerConnectionIndex: Integer read GetConnectionIndex;
 | 
|---|
 | 194 |   end;
 | 
|---|
 | 195 | 
 | 
|---|
 | 196 |   // TSharedBrokerClientMgr is used as a global container to manage all of the clients of the shared broker
 | 
|---|
 | 197 |   // There is a single global instance of this class allocated below called ClientMgr;
 | 
|---|
 | 198 |   // Other classes within the RPCSharedBrokerSessionMgr can get at the client information through ClientMgr;
 | 
|---|
 | 199 |   // All new Send event methods should be implemented here.
 | 
|---|
 | 200 |   TSharedBrokerClientMgr = class
 | 
|---|
 | 201 |   private
 | 
|---|
 | 202 |     FAllConnections: TList;             // The list of unique ServerPort/Shared actual connections
 | 
|---|
 | 203 |     FAllConnectedClients: TList;        // All Clients connected through a broker connection
 | 
|---|
 | 204 |                                         // are added to this list
 | 
|---|
 | 205 |     FAllClients: TList;                 // Any TSharedBroker is added to this list
 | 
|---|
 | 206 |     FNextRpcUniqueId: Longword;
 | 
|---|
 | 207 |     FRpcCallHistoryEnabled: boolean;
 | 
|---|
 | 208 |     FPerClientRpcHistoryLimit: integer;
 | 
|---|
 | 209 |     FNoClientsHaveConnectedYet: boolean;
 | 
|---|
 | 210 |     FInProcessOfLoggingOutClients: boolean;
 | 
|---|
 | 211 |     FCloseAllClientsWaitTime : Double;
 | 
|---|
 | 212 |     FKillClientsStartedTime : Int64;
 | 
|---|
 | 213 |     FKillClientsCountdownStarted : boolean;
 | 
|---|
 | 214 | 
 | 
|---|
 | 215 |     procedure SetRpcCallHistoryEnabled(enabled: boolean);
 | 
|---|
 | 216 | 
 | 
|---|
 | 217 |   public
 | 
|---|
 | 218 |     constructor Create;
 | 
|---|
 | 219 |     destructor  Destroy; override;
 | 
|---|
 | 220 | 
 | 
|---|
 | 221 |     // event procedures
 | 
|---|
 | 222 |     // SendOnLogout sends the OnLogout event to all attached event controllers.
 | 
|---|
 | 223 |     // Messages are sent to both DebuggerClient and BrokerClient types
 | 
|---|
 | 224 |     procedure SendOnLogout;
 | 
|---|
 | 225 | 
 | 
|---|
 | 226 |     // SendOnRpcCallRecorded is only sent to DebuggerClient type connections
 | 
|---|
 | 227 |     // when any RPC call completes. The unique RPC id of the RPC is sent
 | 
|---|
 | 228 |     // as a parameter
 | 
|---|
 | 229 |     procedure SendOnRpcCallRecorded(uniqueRpcId: Longword);
 | 
|---|
 | 230 | 
 | 
|---|
 | 231 |     // SendOnClientConnect is only sent to DebuggerClient type connections
 | 
|---|
 | 232 |     // when any client successfully connects. The unique Id of that
 | 
|---|
 | 233 |     // client is passed as a parameter
 | 
|---|
 | 234 |     procedure SendOnClientConnect(uniqueClientId: Integer; connection: ISharedBrokerConnection);
 | 
|---|
 | 235 | 
 | 
|---|
 | 236 |     // SendOnClientDisconnect is only sent to DebuggerClient type connections
 | 
|---|
 | 237 |     // when any client disconnects. The unique Id of that
 | 
|---|
 | 238 |     // client is passed as a parameter
 | 
|---|
 | 239 |     procedure SendOnClientDisconnect(uniqueClientId: Integer);
 | 
|---|
 | 240 | 
 | 
|---|
 | 241 |     // SendOnContextChanged calls the OnContextChanged event handlers on DebbugerClient type
 | 
|---|
 | 242 |     // connections.
 | 
|---|
 | 243 |     procedure SendOnContextChanged(connectionIndex: Integer; newContext: WideString);
 | 
|---|
 | 244 | 
 | 
|---|
 | 245 |     // SendOnConnectionDropped (or other WSA___ error) calls the OnConnectionDropped event
 | 
|---|
 | 246 |     // handlers for DebuggerClient type and for BrokerClient types on the connection that encountered the error.
 | 
|---|
 | 247 |     procedure SendOnConnectionDropped(RPCBroker: TRPCBroker; ErrorText: String);
 | 
|---|
 | 248 | 
 | 
|---|
 | 249 |     // Connected Client management mmethods
 | 
|---|
 | 250 |     procedure CloseAllClients(maxWaitTime: Integer); // Wait time is in seconds
 | 
|---|
 | 251 |     procedure CheckDisconnectWaitTimeAndShutdownClients;
 | 
|---|
 | 252 |     procedure ListAllConnectedClients(AList: TStrings);
 | 
|---|
 | 253 |     procedure AddConnectedBrokerClient(broker: TSharedBroker);
 | 
|---|
 | 254 |     procedure RemoveConnectedBrokerClient(broker: TSharedBroker);
 | 
|---|
 | 255 |     function  ConnectedClientCount : integer;
 | 
|---|
 | 256 | 
 | 
|---|
 | 257 |     // General Client management methods
 | 
|---|
 | 258 |     procedure AddToGeneralClientList(broker: TSharedBroker);
 | 
|---|
 | 259 |     procedure RemoveFromGeneralClientList(broker: TSharedBroker);
 | 
|---|
 | 260 |     function  GeneralClientCount:Integer;
 | 
|---|
 | 261 | 
 | 
|---|
 | 262 |     property AllConnections: TList read FAllConnections write FAllConnections;
 | 
|---|
 | 263 |     property NoClientsHaveConnectedYet: Boolean read FNoClientsHaveConnectedYet write FNoClientsHaveConnectedYet;
 | 
|---|
 | 264 | 
 | 
|---|
 | 265 |     // General Methods
 | 
|---|
 | 266 |     function Piece(const S: string; Delim: char; PieceNum: Integer): string;
 | 
|---|
 | 267 | 
 | 
|---|
 | 268 |     // Methods for RPC history
 | 
|---|
 | 269 |     function GetNextRpcUniqueId: Longword;
 | 
|---|
 | 270 |     property RpcCallHistoryEnabled: boolean read FRpcCallHistoryEnabled write SetRpcCallHistoryEnabled;
 | 
|---|
 | 271 |     property PerClientRpcHistoryLimit: integer read FPerClientRpcHistoryLimit write FPerClientRpcHistoryLimit;
 | 
|---|
 | 272 | 
 | 
|---|
 | 273 |     function GetRpcCallEntryPtrFromHistory(uniqueRpcId: Longword;
 | 
|---|
 | 274 |                                  out rpcEntryPtr: RPCCallHistoryEntryPointer)
 | 
|---|
 | 275 |                                  : ISharedBrokerErrorCode;
 | 
|---|
 | 276 | 
 | 
|---|
 | 277 |     function GetRpcCallEntryPtrFromHistoryIndex(uniqueClientId: Longword;
 | 
|---|
 | 278 |                                  rpcCallIndex: Integer;
 | 
|---|
 | 279 |                                  out rpcEntryPtr: RPCCallHistoryEntryPointer)
 | 
|---|
 | 280 |                                  : ISharedBrokerErrorCode;
 | 
|---|
 | 281 | 
 | 
|---|
 | 282 |     function GetRpcClientIdFromHistory(uniqueRpcId: Integer;
 | 
|---|
 | 283 |                                  out uniqueClientId: Integer;
 | 
|---|
 | 284 |                                  out clientName: WideString)
 | 
|---|
 | 285 |                                  : ISharedBrokerErrorCode;
 | 
|---|
 | 286 | 
 | 
|---|
 | 287 |     function GetRpcHistoryCountForClient(uniqueClientId: Integer;
 | 
|---|
 | 288 |                                  out rpcCount: Integer)
 | 
|---|
 | 289 |                                  : ISharedBrokerErrorCode;
 | 
|---|
 | 290 | 
 | 
|---|
 | 291 |     function GetClientIdAndNameFromIndex(clientIndex: Integer;
 | 
|---|
 | 292 |                                  out uniqueClientId: Integer;
 | 
|---|
 | 293 |                                  out clientName: WideString)
 | 
|---|
 | 294 |                                  : ISharedBrokerErrorCode;
 | 
|---|
 | 295 | 
 | 
|---|
 | 296 |     function GetClientNameFromUniqueClientId(uniqueClientId: Integer;
 | 
|---|
 | 297 |                                  out clientName: WideString)
 | 
|---|
 | 298 |                                  : ISharedBrokerErrorCode;
 | 
|---|
 | 299 | 
 | 
|---|
 | 300 |     function GetActiveBrokerConnectionIndexFromUniqueClientId(uniqueClientId: Integer;
 | 
|---|
 | 301 |                                  out connectionIndex: Integer)
 | 
|---|
 | 302 |                                  : ISharedBrokerErrorCode;
 | 
|---|
 | 303 | 
 | 
|---|
 | 304 |     procedure OnIdleEventHandler(Sender: TObject; var Done: Boolean);
 | 
|---|
 | 305 | 
 | 
|---|
 | 306 |     property InProcessOfLoggingOutClients: boolean read FInProcessOfLoggingOutClients write FInProcessOfLoggingOutClients;
 | 
|---|
 | 307 |     property CloseAllClientsWaitTime: Double read FCloseAllClientsWaitTime write FCloseAllClientsWaitTime;
 | 
|---|
 | 308 |     
 | 
|---|
 | 309 |   end;
 | 
|---|
 | 310 | 
 | 
|---|
 | 311 |   function GetPerformanceCounterTimeInMS: Int64;
 | 
|---|
 | 312 | 
 | 
|---|
 | 313 | 
 | 
|---|
 | 314 | var
 | 
|---|
 | 315 |   ClientMgr: TSharedBrokerClientMgr;
 | 
|---|
 | 316 | 
 | 
|---|
 | 317 | implementation
 | 
|---|
 | 318 | 
 | 
|---|
 | 319 | //uses ComServ;
 | 
|---|
 | 320 | uses Messages, ComServ, SysUtils, Forms, {lmdnonvs,} Math, XWBut1,
 | 
|---|
 | 321 |      syncobjs, Rpcconf1, MfunStr;
 | 
|---|
 | 322 | 
 | 
|---|
 | 323 | const
 | 
|---|
 | 324 |   kUniqueClientIdDefault: Longword = 0;
 | 
|---|
 | 325 |   kClientNameDefault: string = 'UNNAMED';
 | 
|---|
 | 326 |   kNextRpcUniqueIdInitialValue: Longword = 1; // Start numbering at 1
 | 
|---|
 | 327 |   kRpcCallHistoryEnabledDefault: boolean = false;
 | 
|---|
 | 328 |   kPerClientRpcHistoryLimitDefault: integer = 10;
 | 
|---|
 | 329 |   kUnassignedString: string = 'UNASSIGNED';
 | 
|---|
 | 330 |   kNoneString: string = 'NONE';
 | 
|---|
 | 331 | 
 | 
|---|
 | 332 | procedure SetBrokerLogin(Str: String; Broker: TRPCBroker);
 | 
|---|
 | 333 | const
 | 
|---|
 | 334 |   SEP_FS = #28;
 | 
|---|
 | 335 |   SEP_GS = #29;
 | 
|---|
 | 336 | var
 | 
|---|
 | 337 |   StrFS, StrGS: String;
 | 
|---|
 | 338 |   DivLst: String;
 | 
|---|
 | 339 |   ModeVal: String;
 | 
|---|
 | 340 | 
 | 
|---|
 | 341 |   function TorF(Value: String): Boolean;
 | 
|---|
 | 342 |   begin
 | 
|---|
 | 343 |     Result := False;
 | 
|---|
 | 344 |     if Value = '1' then
 | 
|---|
 | 345 |       Result := True;
 | 
|---|
 | 346 |   end;
 | 
|---|
 | 347 | 
 | 
|---|
 | 348 | begin
 | 
|---|
 | 349 |     with Broker.Login do
 | 
|---|
 | 350 |     begin
 | 
|---|
 | 351 |       StrFS := SEP_FS;
 | 
|---|
 | 352 |       StrGS := SEP_GS;
 | 
|---|
 | 353 |       LoginHandle := Piece(Str,StrFS,1);
 | 
|---|
 | 354 |       NTToken := Piece(Str,StrFS,2);
 | 
|---|
 | 355 |       AccessCode := Piece(Str,StrFS,3);
 | 
|---|
 | 356 |       VerifyCode := Piece(Str,StrFS,4);
 | 
|---|
 | 357 |       Division := Piece(Str,StrFS,5);
 | 
|---|
 | 358 |       ModeVal := Piece(Str,StrFS,6);
 | 
|---|
 | 359 |       DivLst := Piece(Str,StrFS,7);
 | 
|---|
 | 360 |       MultiDivision := TorF(Piece(Str,StrFS,8));
 | 
|---|
 | 361 |       DUZ := Piece(Str,StrFS,9);
 | 
|---|
 | 362 |       PromptDivision := TorF(Piece(Str,StrFS,10));
 | 
|---|
 | 363 |       ErrorText := Piece(Str,StrFS,11);
 | 
|---|
 | 364 |       if ModeVal = '1' then
 | 
|---|
 | 365 |         Mode := lmAVCodes
 | 
|---|
 | 366 |       else if ModeVal = '2' then
 | 
|---|
 | 367 |         Mode := lmAppHandle
 | 
|---|
 | 368 |       else if ModeVal = '3' then
 | 
|---|
 | 369 |         Mode := lmNTToken;
 | 
|---|
 | 370 |     end;  // with
 | 
|---|
 | 371 | end;
 | 
|---|
 | 372 | 
 | 
|---|
 | 373 | function GetBrokerLogin(Broker: TRPCBroker): WideString;
 | 
|---|
 | 374 | 
 | 
|---|
 | 375 |    function TorF1(Value: Boolean): String;
 | 
|---|
 | 376 |    begin
 | 
|---|
 | 377 |      Result := '0';
 | 
|---|
 | 378 |      if Value then
 | 
|---|
 | 379 |        Result := '1';
 | 
|---|
 | 380 |    end;
 | 
|---|
 | 381 |    
 | 
|---|
 | 382 | const
 | 
|---|
 | 383 |   SEP_FS = #28;
 | 
|---|
 | 384 |   SEP_GS = #29;
 | 
|---|
 | 385 | var
 | 
|---|
 | 386 |   I: Integer;
 | 
|---|
 | 387 |   Str: String;
 | 
|---|
 | 388 |   ModeVal: String;
 | 
|---|
 | 389 |   DivLst: String;
 | 
|---|
 | 390 |   MultiDiv: String;
 | 
|---|
 | 391 |   PromptDiv: String;
 | 
|---|
 | 392 |   StrFS, StrGS: String;
 | 
|---|
 | 393 | begin
 | 
|---|
 | 394 |   Str := '';
 | 
|---|
 | 395 |     with Broker.Login do
 | 
|---|
 | 396 |     begin
 | 
|---|
 | 397 |       StrFS := SEP_FS;
 | 
|---|
 | 398 |       StrGS := SEP_GS;
 | 
|---|
 | 399 |       ModeVal := '';
 | 
|---|
 | 400 |       if Mode = lmAVCodes then
 | 
|---|
 | 401 |         ModeVal := '1'
 | 
|---|
 | 402 |       else if Mode = lmAppHandle then
 | 
|---|
 | 403 |         ModeVal := '2'
 | 
|---|
 | 404 |       else if Mode = lmNTToken then
 | 
|---|
 | 405 |         ModeVal := '3';
 | 
|---|
 | 406 |       DivLst := '';
 | 
|---|
 | 407 |       for i := 0 to Pred(DivList.Count) do
 | 
|---|
 | 408 |         DivLst := DivLst + DivList[i] + SEP_GS;
 | 
|---|
 | 409 |       MultiDiv := TorF1(MultiDivision);
 | 
|---|
 | 410 |       PromptDiv := TorF1(PromptDivision);
 | 
|---|
 | 411 |       Str := LoginHandle + StrFS + NTToken + StrFS + AccessCode + StrFS;
 | 
|---|
 | 412 |       Str := Str + VerifyCode + StrFS + Division + StrFS + ModeVal + StrFS;
 | 
|---|
 | 413 |       Str := Str + DivLst + StrFS + MultiDiv + StrFS + DUZ + StrFS;
 | 
|---|
 | 414 |       Str := Str + PromptDiv + StrFS + ErrorText + StrFS;
 | 
|---|
 | 415 |     end;  // with
 | 
|---|
 | 416 |   Result := Str;
 | 
|---|
 | 417 | end;
 | 
|---|
 | 418 | 
 | 
|---|
 | 419 | 
 | 
|---|
 | 420 | function GetPerformanceCounterTimeInMS: Int64;
 | 
|---|
 | 421 | var
 | 
|---|
 | 422 |   frequency: Int64;
 | 
|---|
 | 423 |   performanceCount: Int64;
 | 
|---|
 | 424 |   useNonPerformanceCounter: boolean;
 | 
|---|
 | 425 | begin
 | 
|---|
 | 426 |   useNonPerformanceCounter := false;
 | 
|---|
 | 427 |   Result := 0;
 | 
|---|
 | 428 | 
 | 
|---|
 | 429 |   if QueryPerformanceFrequency(frequency) then
 | 
|---|
 | 430 |   begin
 | 
|---|
 | 431 |     if frequency >= kMillisecondTicksPerSecond then
 | 
|---|
 | 432 |     begin
 | 
|---|
 | 433 |       if QueryPerformanceCounter(performanceCount) then
 | 
|---|
 | 434 |       begin
 | 
|---|
 | 435 |         Result := Trunc((performanceCount* kMillisecondTicksPerSecond)/frequency);
 | 
|---|
 | 436 |       end else
 | 
|---|
 | 437 |       begin
 | 
|---|
 | 438 |         useNonPerformanceCounter := true;
 | 
|---|
 | 439 |       end;
 | 
|---|
 | 440 |     end else
 | 
|---|
 | 441 |     begin
 | 
|---|
 | 442 |       useNonPerformanceCounter := true;
 | 
|---|
 | 443 |     end;
 | 
|---|
 | 444 |   end else
 | 
|---|
 | 445 |   begin
 | 
|---|
 | 446 |     useNonPerformanceCounter := true;
 | 
|---|
 | 447 |   end;
 | 
|---|
 | 448 | 
 | 
|---|
 | 449 |   if useNonPerformanceCounter = true then
 | 
|---|
 | 450 |     Result := GetTickCount;
 | 
|---|
 | 451 | end;
 | 
|---|
 | 452 | 
 | 
|---|
 | 453 | 
 | 
|---|
 | 454 | procedure TSharedBroker.EventSinkChanged(const EventSink: IUnknown);
 | 
|---|
 | 455 | begin
 | 
|---|
 | 456 |   FEvents := EventSink as ISharedBrokerEvents;
 | 
|---|
 | 457 | end;
 | 
|---|
 | 458 | 
 | 
|---|
 | 459 | function TSharedBroker.GetEnumerator: IEnumConnections;
 | 
|---|
 | 460 | var
 | 
|---|
 | 461 |   Container: IConnectionPointContainer;
 | 
|---|
 | 462 |   ConnectionPoint: IConnectionPoint;
 | 
|---|
 | 463 | begin
 | 
|---|
 | 464 |   OleCheck(QueryInterface(IConnectionPointContainer,Container));
 | 
|---|
 | 465 |   OleCheck(Container.FindConnectionPoint(AutoFactory.EventIID,ConnectionPoint));
 | 
|---|
 | 466 |   ConnectionPoint.EnumConnections(Result);
 | 
|---|
 | 467 | end;
 | 
|---|
 | 468 | 
 | 
|---|
 | 469 | procedure TSharedBroker.Initialize;
 | 
|---|
 | 470 | begin
 | 
|---|
 | 471 |   inherited Initialize;
 | 
|---|
 | 472 |   FConnectionPoints := TConnectionPoints.Create(Self);
 | 
|---|
 | 473 |   FUniqueClientId := kUniqueClientIdDefault;
 | 
|---|
 | 474 |   FClientName := kClientNameDefault;
 | 
|---|
 | 475 |   FRpcCallHistory := RPCCallHistory.Create();
 | 
|---|
 | 476 | 
 | 
|---|
 | 477 |   // Use this for multiple client connections to this server
 | 
|---|
 | 478 |   if AutoFactory.EventTypeInfo <> nil then
 | 
|---|
 | 479 |     FConnectionPoints.CreateConnectionPoint(
 | 
|---|
 | 480 |       AutoFactory.EventIID, ckMulti, EventConnect);
 | 
|---|
 | 481 | 
 | 
|---|
 | 482 |   // add both connected and non connected clients to the general client list
 | 
|---|
 | 483 |   ClientMgr.AddToGeneralClientList(self);
 | 
|---|
 | 484 |   FInGeneralClientList := true;
 | 
|---|
 | 485 | 
 | 
|---|
 | 486 | end;
 | 
|---|
 | 487 | 
 | 
|---|
 | 488 | 
 | 
|---|
 | 489 | destructor TSharedBroker.Destroy;
 | 
|---|
 | 490 | begin
 | 
|---|
 | 491 |   DoDisconnect;
 | 
|---|
 | 492 | 
 | 
|---|
 | 493 |   FRpcCallHistory.Free;
 | 
|---|
 | 494 |   FRpcCallHistory := nil;
 | 
|---|
 | 495 | 
 | 
|---|
 | 496 |   inherited Destroy;
 | 
|---|
 | 497 | 
 | 
|---|
 | 498 |   // Remove self from the general client list
 | 
|---|
 | 499 |   if FInGeneralClientList = true then
 | 
|---|
 | 500 |   begin
 | 
|---|
 | 501 |     ClientMgr.RemoveFromGeneralClientList(self);
 | 
|---|
 | 502 |     FInGeneralClientList := False;
 | 
|---|
 | 503 |   end;
 | 
|---|
 | 504 | end;
 | 
|---|
 | 505 | 
 | 
|---|
 | 506 | {
 | 
|---|
 | 507 | function TSharedBroker.BrokerConnect(const clientName: WideString;
 | 
|---|
 | 508 |   connectionType: ISharedBrokerClient; const serverPort: WideString;
 | 
|---|
 | 509 |   wantDebug, allowShared: WordBool; rpcTimeLimit: SYSINT;
 | 
|---|
 | 510 |   out uniqueClientIId: SYSINT): ISharedBrokerErrorCode;
 | 
|---|
 | 511 | }
 | 
|---|
 | 512 | function TSharedBroker.BrokerConnect(const ClientName: WideString;
 | 
|---|
 | 513 |   ConnectionType: ISharedBrokerClient; const ServerPort: WideString;
 | 
|---|
 | 514 |   WantDebug, AllowShared, KernelLoginVal: WordBool;
 | 
|---|
 | 515 |   ShowErrMsgs: ISharedBrokerShowErrorMsgs; RpcTimeLim: SYSINT;
 | 
|---|
 | 516 |   var LoginStr: WideString; out UniqueClientIId: SYSINT;
 | 
|---|
 | 517 |   out ErrorMsg: WideString): ISharedBrokerErrorCode;
 | 
|---|
 | 518 | safecall;
 | 
|---|
 | 519 | var
 | 
|---|
 | 520 |   aBrokerConnection: TBrokerConnection;
 | 
|---|
 | 521 |   i: Integer;
 | 
|---|
 | 522 |   connectMessage : ISharedBrokerConnection;
 | 
|---|
 | 523 |   serverIP,serverStr: string;
 | 
|---|
 | 524 |   port: Integer;
 | 
|---|
 | 525 | begin
 | 
|---|
 | 526 |   Result := CouldNotConnect;
 | 
|---|
 | 527 |   ErrorMsg := '';
 | 
|---|
 | 528 |   connectMessage := Failed;
 | 
|---|
 | 529 | 
 | 
|---|
 | 530 |   if connectionType = BrokerClient then
 | 
|---|
 | 531 |   begin
 | 
|---|
 | 532 |     // First separate out the server/port param into server and port strings
 | 
|---|
 | 533 |     // next look up the serverIP from the server name.
 | 
|---|
 | 534 |     // If valid proceed otherwise error.
 | 
|---|
 | 535 |     serverStr := ClientMgr.Piece(serverPort, ':', 1);
 | 
|---|
 | 536 |     // use a default for the port in case it is not sent in
 | 
|---|
 | 537 |     port := StrToIntDef(ClientMgr.Piece(ServerPort, ':', 2), 9200);
 | 
|---|
 | 538 | 
 | 
|---|
 | 539 |     serverIP := GetServerIP(serverStr);
 | 
|---|
 | 540 | 
 | 
|---|
 | 541 |     aBrokerConnection := nil;
 | 
|---|
 | 542 |     if AllowShared then
 | 
|---|
 | 543 |       for i := 0 to Pred(ClientMgr.AllConnections.Count) do
 | 
|---|
 | 544 |         // Compare against the server IP and the port since a server name
 | 
|---|
 | 545 |         // is not unique.
 | 
|---|
 | 546 |         if (TBrokerConnection(ClientMgr.AllConnections.Items[i]).FServerIP = serverIP) and
 | 
|---|
 | 547 | //        if (TBrokerConnection(ClientMgr.AllConnections.Items[i]).FServerIP = serverStr) and
 | 
|---|
 | 548 |            (TBrokerConnection(ClientMgr.AllConnections.Items[i]).FPort = port) and
 | 
|---|
 | 549 |             TBrokerConnection(ClientMgr.AllConnections.Items[i]).FShared then
 | 
|---|
 | 550 |               aBrokerConnection := TBrokerConnection(ClientMgr.AllConnections.Items[i]);
 | 
|---|
 | 551 | 
 | 
|---|
 | 552 |     if aBrokerConnection = nil then
 | 
|---|
 | 553 |     begin
 | 
|---|
 | 554 | 
 | 
|---|
 | 555 |       aBrokerConnection := TBrokerConnection.Create;
 | 
|---|
 | 556 |       aBrokerConnection.FBroker := TRPCBroker.Create(Application);
 | 
|---|
 | 557 |       ConnectType := BrokerClient;
 | 
|---|
 | 558 | 
 | 
|---|
 | 559 |       with aBrokerConnection.FBroker do
 | 
|---|
 | 560 |       begin
 | 
|---|
 | 561 |         ClearParameters := True;
 | 
|---|
 | 562 |         ClearResults    := True;
 | 
|---|
 | 563 |         DebugMode       := wantDebug;
 | 
|---|
 | 564 | //        Server          := serverIP;
 | 
|---|
 | 565 |         Server          := serverStr;
 | 
|---|
 | 566 |         ListenerPort    := port;
 | 
|---|
 | 567 |         RPCTimeLimit    := rpcTimeLim;
 | 
|---|
 | 568 |         KernelLogin     := KernelLoginVal;
 | 
|---|
 | 569 |         OnPulseError    := ClientMgr.SendOnConnectionDropped;
 | 
|---|
 | 570 |         SetBrokerLogin(LoginStr, aBrokerConnection.FBroker);
 | 
|---|
 | 571 |         if ShowErrMsgs = isemRaise then
 | 
|---|
 | 572 |           ShowErrorMsgs := semRaise
 | 
|---|
 | 573 |         else
 | 
|---|
 | 574 |           ShowErrorMsgs := semQuiet; 
 | 
|---|
 | 575 |         try
 | 
|---|
 | 576 |           Connected       := True;
 | 
|---|
 | 577 |           ErrorMsg := RPCBError;
 | 
|---|
 | 578 |         except
 | 
|---|
 | 579 |           ErrorMsg := RPCBError;
 | 
|---|
 | 580 |         end;
 | 
|---|
 | 581 |       end;
 | 
|---|
 | 582 | 
 | 
|---|
 | 583 |       LoginStr := GetBrokerLogin(aBrokerConnection.FBroker);
 | 
|---|
 | 584 |       aBrokerConnection.FShared          := allowShared;
 | 
|---|
 | 585 |       aBrokerConnection.FServer          := serverStr;
 | 
|---|
 | 586 |       aBrokerConnection.FPort            := port;
 | 
|---|
 | 587 |       aBrokerConnection.FServerIP        := serverIP;
 | 
|---|
 | 588 |       aBrokerConnection.FConnectionIndex := ClientMgr.AllConnections.Count;
 | 
|---|
 | 589 | 
 | 
|---|
 | 590 |       if aBrokerConnection.FBroker.Connected = true then
 | 
|---|
 | 591 |       begin
 | 
|---|
 | 592 |         ClientMgr.AllConnections.Add(aBrokerConnection);
 | 
|---|
 | 593 |         if aBrokerConnection.FShared then       // Set up for cleaning between RPC calls
 | 
|---|
 | 594 |         begin
 | 
|---|
 | 595 |           aBrokerConnection.FBroker.RemoteProcedure := 'XUS SET SHARED';
 | 
|---|
 | 596 |           aBrokerConnection.FBroker.Param.Clear;
 | 
|---|
 | 597 |           aBrokerConnection.FBroker.Call;
 | 
|---|
 | 598 |         end;
 | 
|---|
 | 599 |       end;
 | 
|---|
 | 600 | 
 | 
|---|
 | 601 |       connectMessage := New;
 | 
|---|
 | 602 |     end else
 | 
|---|
 | 603 |     begin
 | 
|---|
 | 604 |       connectMessage := Shared;
 | 
|---|
 | 605 |     end;
 | 
|---|
 | 606 | 
 | 
|---|
 | 607 |     if aBrokerConnection.FBroker.Connected then
 | 
|---|
 | 608 |     begin
 | 
|---|
 | 609 |       Result := Success;
 | 
|---|
 | 610 |       Inc(aBrokerConnection.FRefCount);
 | 
|---|
 | 611 |       FBrokerConnection     := aBrokerConnection;
 | 
|---|
 | 612 |     end else
 | 
|---|
 | 613 |     begin
 | 
|---|
 | 614 |       connectMessage := Failed;
 | 
|---|
 | 615 |       Result := CouldNotConnect;
 | 
|---|
 | 616 |     end;
 | 
|---|
 | 617 |     Set_RpcHistoryEnabled(ClientMgr.RpcCallHistoryEnabled);
 | 
|---|
 | 618 |   end
 | 
|---|
 | 619 |   else if connectionType = DebuggerClient then
 | 
|---|
 | 620 |   begin
 | 
|---|
 | 621 |     ConnectType := DebuggerClient;
 | 
|---|
 | 622 | 
 | 
|---|
 | 623 |     // Debugger clients enable RPC history for Al clients by default
 | 
|---|
 | 624 |     Set_RpcHistoryEnabled(true);
 | 
|---|
 | 625 | 
 | 
|---|
 | 626 |     connectMessage := Debug;
 | 
|---|
 | 627 |     Result := Success;
 | 
|---|
 | 628 |   end;
 | 
|---|
 | 629 | 
 | 
|---|
 | 630 |   FBrokerContext        := '';
 | 
|---|
 | 631 | 
 | 
|---|
 | 632 | 
 | 
|---|
 | 633 |   FClientName           := clientName;          // The name passed in should be the name
 | 
|---|
 | 634 |                                                 // of the executable
 | 
|---|
 | 635 |   BrokerUniqueClientId  := Longword(self);      // The self pointer is unique and could
 | 
|---|
 | 636 |                                                 // be dereference later on so use it.
 | 
|---|
 | 637 |                                                 // store it locally for quick access
 | 
|---|
 | 638 |   uniqueClientIId       := BrokerUniqueClientId;// Put the unique client id back in
 | 
|---|
 | 639 |                                                 // the out param as well.
 | 
|---|
 | 640 | 
 | 
|---|
 | 641 |   // Only add connected clients to the connected broker client list
 | 
|---|
 | 642 |   if (Result = Success) and (ConnectType <> DebuggerClient)then
 | 
|---|
 | 643 |   begin
 | 
|---|
 | 644 |     ClientMgr.AddConnectedBrokerClient(self);
 | 
|---|
 | 645 | 
 | 
|---|
 | 646 |     // Be sure to send the OnClientConnect message to any
 | 
|---|
 | 647 |     // debugger clients
 | 
|---|
 | 648 |     ClientMgr.SendOnClientConnect(BrokerUniqueClientId,connectMessage);
 | 
|---|
 | 649 |   end;
 | 
|---|
 | 650 | end;
 | 
|---|
 | 651 | 
 | 
|---|
 | 652 | function TSharedBroker.BrokerSetContext(
 | 
|---|
 | 653 |   const optionName: WideString): ISharedBrokerErrorCode;
 | 
|---|
 | 654 | begin
 | 
|---|
 | 655 |   // So don't set the context if it is already the same on
 | 
|---|
 | 656 |   // on the current connection. Also store the new context
 | 
|---|
 | 657 |   // in the connection.
 | 
|---|
 | 658 |   Result := Success;
 | 
|---|
 | 659 |   if FBrokerConnection.FLastContext <> optionName then
 | 
|---|
 | 660 |   begin
 | 
|---|
 | 661 |     if FBrokerConnection.FBroker.CreateContext(optionName) then
 | 
|---|
 | 662 |     begin
 | 
|---|
 | 663 |       FBrokerConnection.FLastContext := optionName;
 | 
|---|
 | 664 |       FBrokerContext := optionName;
 | 
|---|
 | 665 |       Result := Success;
 | 
|---|
 | 666 |       ClientMgr.SendOnContextChanged(FBrokerConnection.FConnectionIndex,optionName);
 | 
|---|
 | 667 |     end else
 | 
|---|
 | 668 |     begin
 | 
|---|
 | 669 |       Result := CouldNotSetContext;
 | 
|---|
 | 670 |       FBrokerConnection.FLastContext := '';
 | 
|---|
 | 671 |       FBrokerContext := '';
 | 
|---|
 | 672 |     end;
 | 
|---|
 | 673 |   end;
 | 
|---|
 | 674 | end;
 | 
|---|
 | 675 | 
 | 
|---|
 | 676 | function TSharedBroker.BrokerCall(const rpcName, rpcParams: WideString;
 | 
|---|
 | 677 |   rpcTimeLimit: Integer; out rpcResults: WideString;
 | 
|---|
 | 678 |   out uniqueRpcCallId: Integer): ISharedBrokerErrorCode;
 | 
|---|
 | 679 | const
 | 
|---|
 | 680 |   SEP_FS = #28;
 | 
|---|
 | 681 |   SEP_GS = #29;
 | 
|---|
 | 682 |   SEP_US = #30;
 | 
|---|
 | 683 |   SEP_RS = #31;
 | 
|---|
 | 684 | var
 | 
|---|
 | 685 |   i, curStart, lengthOfrpcParams, endOfSegment: Integer;
 | 
|---|
 | 686 |   aRef, aVal: string;
 | 
|---|
 | 687 |   startTimeMS, timeElapsedMS: Int64;
 | 
|---|
 | 688 |   currentDateTime: TDateTime;
 | 
|---|
 | 689 |   rpcEntry: RPCCallHistoryEntry;
 | 
|---|
 | 690 | 
 | 
|---|
 | 691 |   function PosNext(aChar: WideChar; startPos: Integer): Integer;
 | 
|---|
 | 692 |   begin
 | 
|---|
 | 693 |     Result := 0;
 | 
|---|
 | 694 |     while (Result = 0) and (StartPos <= lengthOfrpcParams) do
 | 
|---|
 | 695 |     begin
 | 
|---|
 | 696 |       if rpcParams[StartPos] = aChar then Result := startPos;
 | 
|---|
 | 697 |       Inc(startPos);
 | 
|---|
 | 698 |     end;
 | 
|---|
 | 699 |   end;
 | 
|---|
 | 700 | 
 | 
|---|
 | 701 | begin
 | 
|---|
 | 702 |   Result := Success;
 | 
|---|
 | 703 |   rpcResults := '';
 | 
|---|
 | 704 |   startTimeMS := 0;
 | 
|---|
 | 705 |   currentDateTime := 0;
 | 
|---|
 | 706 | 
 | 
|---|
 | 707 |   BrokerSetContext(FBrokerContext);
 | 
|---|
 | 708 | 
 | 
|---|
 | 709 |   if Result <> Success then Exit;
 | 
|---|
 | 710 | 
 | 
|---|
 | 711 |   // setup and make the RPC call
 | 
|---|
 | 712 |   FBrokerConnection.FBroker.ClearParameters := True;
 | 
|---|
 | 713 |   FBrokerConnection.FBroker.RemoteProcedure := rpcName;
 | 
|---|
 | 714 | 
 | 
|---|
 | 715 |   // Set RPC timeout
 | 
|---|
 | 716 |   FBrokerConnection.FBroker.RPCTimeLimit := rpcTimeLimit;
 | 
|---|
 | 717 | 
 | 
|---|
 | 718 |   curStart := 1;
 | 
|---|
 | 719 |   i := 0;
 | 
|---|
 | 720 |   lengthOfrpcParams := Length(rpcParams);
 | 
|---|
 | 721 |   while curStart < lengthOfrpcParams do
 | 
|---|
 | 722 |   begin
 | 
|---|
 | 723 |     case rpcParams[curStart] of
 | 
|---|
 | 724 |     'L': FBrokerConnection.FBroker.Param[i].PType := literal;
 | 
|---|
 | 725 |     'R': FBrokerConnection.FBroker.Param[i].PType := reference;
 | 
|---|
 | 726 |     'M': FBrokerConnection.FBroker.Param[i].PType := list;
 | 
|---|
 | 727 |     else FBrokerConnection.FBroker.Param[i].PType := undefined;
 | 
|---|
 | 728 |     end;
 | 
|---|
 | 729 |     Inc(curStart, 2);
 | 
|---|
 | 730 |     if FBrokerConnection.FBroker.Param[i].PType = list then
 | 
|---|
 | 731 |     begin
 | 
|---|
 | 732 | //      endOfSegment := 0;
 | 
|---|
 | 733 |       while rpcParams[curStart] <> SEP_GS do
 | 
|---|
 | 734 |       begin
 | 
|---|
 | 735 |         endOfSegment := PosNext(SEP_US, curStart);
 | 
|---|
 | 736 |         aRef := Copy(rpcParams, curStart, endOfSegment - curStart);
 | 
|---|
 | 737 |         curStart := endOfSegment + 1;
 | 
|---|
 | 738 |         endOfSegment := PosNext(SEP_RS, curStart);
 | 
|---|
 | 739 |         aVal := Copy(rpcParams, curStart, endOfSegment - curStart);
 | 
|---|
 | 740 |         curStart := endOfSegment + 1;
 | 
|---|
 | 741 |         FBrokerConnection.FBroker.Param[i].Mult[aRef] := aVal;
 | 
|---|
 | 742 |       end; {while rpcParams}
 | 
|---|
 | 743 |       {if endOfSegment = 0 then} endOfSegment := PosNext(SEP_GS, curStart);
 | 
|---|
 | 744 |       curStart := endOfSegment + 1;
 | 
|---|
 | 745 |     end else
 | 
|---|
 | 746 |     begin
 | 
|---|
 | 747 |       endOfSegment := PosNext(SEP_GS, curStart);
 | 
|---|
 | 748 |       FBrokerConnection.FBroker.Param[i].Value :=
 | 
|---|
 | 749 |         Copy(rpcParams, curStart, endOfSegment - curStart);
 | 
|---|
 | 750 |       curStart := endOfSegment + 1;
 | 
|---|
 | 751 |     end; {if Param[i].PType ... else}
 | 
|---|
 | 752 |     Inc(i);
 | 
|---|
 | 753 |   end; {while curStart}
 | 
|---|
 | 754 | 
 | 
|---|
 | 755 |   if Get_RpcHistoryEnabled = true then
 | 
|---|
 | 756 |   begin
 | 
|---|
 | 757 |   // Get the current time and date of this call
 | 
|---|
 | 758 |   // start the millisecond counter
 | 
|---|
 | 759 |     startTimeMS := GetPerformanceCounterTimeInMS;
 | 
|---|
 | 760 |     currentDateTime := Date;
 | 
|---|
 | 761 |   end;
 | 
|---|
 | 762 | 
 | 
|---|
 | 763 |   FBrokerConnection.FBroker.Call;
 | 
|---|
 | 764 | 
 | 
|---|
 | 765 |   RPCResults := FBrokerConnection.FBroker.Results.Text;
 | 
|---|
 | 766 | 
 | 
|---|
 | 767 |   if FBrokerConnection.FBroker.RPCBError <> '' then
 | 
|---|
 | 768 |     Result := GeneralFailure;
 | 
|---|
 | 769 | 
 | 
|---|
 | 770 |   if ClientMgr.RpcCallHistoryEnabled then
 | 
|---|
 | 771 |   begin
 | 
|---|
 | 772 |     timeElapsedMS := GetPerformanceCounterTimeInMS - startTimeMS;
 | 
|---|
 | 773 | 
 | 
|---|
 | 774 |     rpcEntry :=  RPCCallHistoryEntry.Create(
 | 
|---|
 | 775 |         FBrokerContext,
 | 
|---|
 | 776 |         rpcName,
 | 
|---|
 | 777 |         rpcParams,
 | 
|---|
 | 778 |         RPCResults,
 | 
|---|
 | 779 |         Double(currentDateTime),
 | 
|---|
 | 780 |         Longword(timeElapsedMS),
 | 
|---|
 | 781 |         BrokerUniqueClientId
 | 
|---|
 | 782 |       );
 | 
|---|
 | 783 | 
 | 
|---|
 | 784 |     RpcHistory.Add(rpcEntry);
 | 
|---|
 | 785 | 
 | 
|---|
 | 786 |     // Now fire the event so any debugger connected can
 | 
|---|
 | 787 |     // read it
 | 
|---|
 | 788 |     ClientMgr.SendOnRpcCallRecorded(rpcEntry.UniqueRPCCallId);
 | 
|---|
 | 789 |   end;
 | 
|---|
 | 790 | end;
 | 
|---|
 | 791 | 
 | 
|---|
 | 792 | procedure TSharedBroker.DoDisconnect;
 | 
|---|
 | 793 | begin
 | 
|---|
 | 794 |   if FBrokerConnection<>nil then
 | 
|---|
 | 795 |   begin
 | 
|---|
 | 796 |     Dec(FBrokerConnection.FRefCount);
 | 
|---|
 | 797 |     if FBrokerConnection.FRefCount = 0 then
 | 
|---|
 | 798 |     begin
 | 
|---|
 | 799 |       if ConnectType = BrokerClient then
 | 
|---|
 | 800 |         FBrokerConnection.FBroker.Destroy;
 | 
|---|
 | 801 | 
 | 
|---|
 | 802 |       if ClientMgr <> nil then
 | 
|---|
 | 803 |         ClientMgr.AllConnections.Remove(FBrokerConnection);
 | 
|---|
 | 804 | 
 | 
|---|
 | 805 |       FBrokerConnection.Free;
 | 
|---|
 | 806 |     end;
 | 
|---|
 | 807 | 
 | 
|---|
 | 808 |    FBrokerConnection := nil;
 | 
|---|
 | 809 |    FBrokerContext    := '';
 | 
|---|
 | 810 | 
 | 
|---|
 | 811 |    if ConnectType <> DebuggerClient then
 | 
|---|
 | 812 |    begin
 | 
|---|
 | 813 |      ClientMgr.RemoveConnectedBrokerClient(Self);
 | 
|---|
 | 814 |      // Send a message to all debugger clients that
 | 
|---|
 | 815 |      // a non-debugger client has disconnected
 | 
|---|
 | 816 |      ClientMgr.SendOnClientDisconnect(BrokerUniqueClientId);
 | 
|---|
 | 817 |    end;
 | 
|---|
 | 818 |  end;
 | 
|---|
 | 819 | end;
 | 
|---|
 | 820 | 
 | 
|---|
 | 821 | function TSharedBroker.BrokerDisconnect: ISharedBrokerErrorCode;
 | 
|---|
 | 822 | begin
 | 
|---|
 | 823 |   DoDisconnect;
 | 
|---|
 | 824 |   Result := Success;
 | 
|---|
 | 825 | end;
 | 
|---|
 | 826 | 
 | 
|---|
 | 827 | function TSharedBroker.ReadRegDataDefault(Root: IRegistryRootEnum;
 | 
|---|
 | 828 |   const Key, Name, Default: WideString;
 | 
|---|
 | 829 |   out RegResult: WideString): ISharedBrokerErrorCode;
 | 
|---|
 | 830 | var
 | 
|---|
 | 831 |   marshalledRoot: LongWord;
 | 
|---|
 | 832 | begin
 | 
|---|
 | 833 |   // do a little data marshaling here
 | 
|---|
 | 834 |   case Root of
 | 
|---|
 | 835 |     IRegistryRootEnum(HKCR) : marshalledRoot := HKCR;
 | 
|---|
 | 836 |     IRegistryRootEnum(HKCU) : marshalledRoot := HKCU;
 | 
|---|
 | 837 |     IRegistryRootEnum(HKLM) : marshalledRoot := HKLM;
 | 
|---|
 | 838 |     IRegistryRootEnum(HKU)  : marshalledRoot := HKU;
 | 
|---|
 | 839 |     IRegistryRootEnum(HKCC) : marshalledRoot := HKCC;
 | 
|---|
 | 840 |   else
 | 
|---|
 | 841 |     marshalledRoot := HKDD;
 | 
|---|
 | 842 |   end;
 | 
|---|
 | 843 | 
 | 
|---|
 | 844 |   regResult := XWBut1.ReadRegDataDefault(marshalledRoot,key,name,default);
 | 
|---|
 | 845 |   Result := Success;
 | 
|---|
 | 846 | end;
 | 
|---|
 | 847 | 
 | 
|---|
 | 848 | function TSharedBroker.Get_RpcVersion: WideString;
 | 
|---|
 | 849 | begin
 | 
|---|
 | 850 |   if FBrokerConnection <> nil then
 | 
|---|
 | 851 |   begin
 | 
|---|
 | 852 |     Result := FBrokerConnection.FBroker.RpcVersion;
 | 
|---|
 | 853 |   end else
 | 
|---|
 | 854 |   begin
 | 
|---|
 | 855 |     // Don't know what else to make this if we don't actually have a TRPCBroker to ask
 | 
|---|
 | 856 |     Result := '0';
 | 
|---|
 | 857 |   end;
 | 
|---|
 | 858 | end;
 | 
|---|
 | 859 | 
 | 
|---|
 | 860 | procedure TSharedBroker.Set_RpcVersion(const version: WideString);
 | 
|---|
 | 861 | begin
 | 
|---|
 | 862 |   if FBrokerConnection <> nil then
 | 
|---|
 | 863 |   begin
 | 
|---|
 | 864 |     FBrokerConnection.FBroker.RpcVersion := version;
 | 
|---|
 | 865 |   end
 | 
|---|
 | 866 | end;
 | 
|---|
 | 867 | 
 | 
|---|
 | 868 | function TSharedBroker.Get_PerClientRpcHistoryLimit: Integer;
 | 
|---|
 | 869 | begin
 | 
|---|
 | 870 |   Result := ClientMgr.PerClientRpcHistoryLimit;
 | 
|---|
 | 871 | end;
 | 
|---|
 | 872 | 
 | 
|---|
 | 873 | function TSharedBroker.Get_RpcHistoryEnabled: WordBool;
 | 
|---|
 | 874 | begin
 | 
|---|
 | 875 |   // If debugger client then operate on all of the clients
 | 
|---|
 | 876 |   // else just operate on this one
 | 
|---|
 | 877 |   if ConnectType = DebuggerClient then
 | 
|---|
 | 878 |     Result := ClientMgr.RpcCallHistoryEnabled
 | 
|---|
 | 879 |   else
 | 
|---|
 | 880 |     Result := RpcHistory.Enabled;
 | 
|---|
 | 881 | end;
 | 
|---|
 | 882 | 
 | 
|---|
 | 883 | function TSharedBroker.GetConnectedClientCount(
 | 
|---|
 | 884 |   out connectedClientCount: Integer): ISharedBrokerErrorCode;
 | 
|---|
 | 885 | begin
 | 
|---|
 | 886 |   connectedClientCount := ClientMgr.ConnectedClientCount;
 | 
|---|
 | 887 | 
 | 
|---|
 | 888 |   Result := Success;
 | 
|---|
 | 889 | end;
 | 
|---|
 | 890 | 
 | 
|---|
 | 891 | function TSharedBroker.GetRpcCallFromHistory(uniqueRpcId: Integer;
 | 
|---|
 | 892 |   out uniqueClientId: Integer; out brokerContext, rpcName, rpcParams,
 | 
|---|
 | 893 |   rpcResult: WideString; out rpcStartDateTime: Double;
 | 
|---|
 | 894 |   out rpcDuration: Integer): ISharedBrokerErrorCode;
 | 
|---|
 | 895 | var
 | 
|---|
 | 896 |   rpcEntryPtr: RPCCallHistoryEntryPointer;
 | 
|---|
 | 897 | begin
 | 
|---|
 | 898 |   Result := ClientMgr.GetRPCCallEntryPtrFromHistory(uniqueRpcId,rpcEntryPtr);
 | 
|---|
 | 899 | 
 | 
|---|
 | 900 |   if Result = Success then
 | 
|---|
 | 901 |   begin
 | 
|---|
 | 902 |     uniqueClientId   := rpcEntryPtr^.BrokerUniqueClientId;
 | 
|---|
 | 903 |     brokerContext    := rpcEntryPtr^.CallContext;
 | 
|---|
 | 904 |     rpcName          := rpcEntryPtr^.CallName;
 | 
|---|
 | 905 |     rpcParams        := rpcEntryPtr^.CallParams;
 | 
|---|
 | 906 |     rpcResult        := rpcEntryPtr^.CallResults;
 | 
|---|
 | 907 |     rpcStartDateTime := rpcEntryPtr^.CallStartDateTime;
 | 
|---|
 | 908 |     rpcDuration      := rpcEntryPtr^.CallDurationInMS;
 | 
|---|
 | 909 |   end else
 | 
|---|
 | 910 |   begin
 | 
|---|
 | 911 |     uniqueClientId   := 0;
 | 
|---|
 | 912 |     brokerContext    := '';
 | 
|---|
 | 913 |     rpcName          := '';
 | 
|---|
 | 914 |     rpcParams        := '';
 | 
|---|
 | 915 |     rpcResult        := '';
 | 
|---|
 | 916 |     rpcStartDateTime := 0;
 | 
|---|
 | 917 |     rpcDuration      := 0;
 | 
|---|
 | 918 |   end;
 | 
|---|
 | 919 | end;
 | 
|---|
 | 920 | 
 | 
|---|
 | 921 | function TSharedBroker.GetRpcCallFromHistoryIndex(uniqueClientId,
 | 
|---|
 | 922 |   rpcCallIndex: Integer; out uniqueRpcId: Integer; out brokerContext,
 | 
|---|
 | 923 |   rpcName, rpcParams, rpcResult: WideString; out rpcStartDateTime: Double;
 | 
|---|
 | 924 |   out rpcDuration: Integer): ISharedBrokerErrorCode;
 | 
|---|
 | 925 | var
 | 
|---|
 | 926 |   rpcEntryPtr: RPCCallHistoryEntryPointer;
 | 
|---|
 | 927 | begin
 | 
|---|
 | 928 |   Result := ClientMgr.GetRPCCallEntryPtrFromHistoryIndex(uniqueClientId,rpcCallIndex,rpcEntryPtr);
 | 
|---|
 | 929 | 
 | 
|---|
 | 930 |   if Result = Success then
 | 
|---|
 | 931 |   begin
 | 
|---|
 | 932 |     uniqueRpcId      := rpcEntryPtr^.UniqueRPCCallId;
 | 
|---|
 | 933 |     brokerContext    := rpcEntryPtr^.CallContext;
 | 
|---|
 | 934 |     rpcName          := rpcEntryPtr^.CallName;
 | 
|---|
 | 935 |     rpcParams        := rpcEntryPtr^.CallParams;
 | 
|---|
 | 936 |     rpcResult        := rpcEntryPtr^.CallResults;
 | 
|---|
 | 937 |     rpcStartDateTime := rpcEntryPtr^.CallStartDateTime;
 | 
|---|
 | 938 |     rpcDuration      := rpcEntryPtr^.CallDurationInMS;
 | 
|---|
 | 939 |   end else
 | 
|---|
 | 940 |   begin
 | 
|---|
 | 941 |     uniqueRpcId      := 0;
 | 
|---|
 | 942 |     brokerContext    := '';
 | 
|---|
 | 943 |     rpcName          := '';
 | 
|---|
 | 944 |     rpcParams        := '';
 | 
|---|
 | 945 |     rpcResult        := '';
 | 
|---|
 | 946 |     rpcStartDateTime := 0;
 | 
|---|
 | 947 |     rpcDuration      := 0;
 | 
|---|
 | 948 |   end;
 | 
|---|
 | 949 | end;
 | 
|---|
 | 950 | 
 | 
|---|
 | 951 | 
 | 
|---|
 | 952 | function TSharedBroker.GetClientIdAndNameFromIndex(clientIndex: Integer;
 | 
|---|
 | 953 |   out uniqueClientId: Integer;
 | 
|---|
 | 954 |   out clientName: WideString): ISharedBrokerErrorCode;
 | 
|---|
 | 955 | begin
 | 
|---|
 | 956 |   Result := ClientMgr.GetClientIdAndNameFromIndex(clientIndex,uniqueClientId,clientName);
 | 
|---|
 | 957 |   // Failure defaults are taken care of by ClientMgr.
 | 
|---|
 | 958 | end;
 | 
|---|
 | 959 | 
 | 
|---|
 | 960 | function TSharedBroker.GetRpcClientIdFromHistory(uniqueRpcId: Integer;
 | 
|---|
 | 961 |   out uniqueClientId: Integer;
 | 
|---|
 | 962 |   out clientName: WideString): ISharedBrokerErrorCode;
 | 
|---|
 | 963 | begin
 | 
|---|
 | 964 |   Result := ClientMgr.GetRPCClientIdFromHistory(uniqueRpcId,uniqueClientId,clientName);
 | 
|---|
 | 965 | 
 | 
|---|
 | 966 |   if Result <> Success then
 | 
|---|
 | 967 |   begin
 | 
|---|
 | 968 |      uniqueClientId := 0;
 | 
|---|
 | 969 |      clientName := '';
 | 
|---|
 | 970 |   end;
 | 
|---|
 | 971 | end;
 | 
|---|
 | 972 | 
 | 
|---|
 | 973 | function TSharedBroker.GetRpcHistoryCountForClient(uniqueClientId: Integer;
 | 
|---|
 | 974 |   out rpcHistoryCount: Integer): ISharedBrokerErrorCode;
 | 
|---|
 | 975 | begin
 | 
|---|
 | 976 |   Result := ClientMgr.GetRpcHistoryCountForClient(uniqueClientId,rpcHistoryCount);
 | 
|---|
 | 977 | 
 | 
|---|
 | 978 |   if Result <> Success then
 | 
|---|
 | 979 |     rpcHistoryCount := 0;
 | 
|---|
 | 980 | end;
 | 
|---|
 | 981 | 
 | 
|---|
 | 982 | procedure TSharedBroker.Set_PerClientRpcHistoryLimit(limit: Integer);
 | 
|---|
 | 983 | begin
 | 
|---|
 | 984 |   ClientMgr.PerClientRpcHistoryLimit := limit;
 | 
|---|
 | 985 | end;
 | 
|---|
 | 986 | 
 | 
|---|
 | 987 | procedure TSharedBroker.Set_RpcHistoryEnabled(enabled: WordBool);
 | 
|---|
 | 988 | begin
 | 
|---|
 | 989 |   // If debugger client then operate on all of the clients
 | 
|---|
 | 990 |   // else just operate on this one
 | 
|---|
 | 991 |   if ConnectType = DebuggerClient then
 | 
|---|
 | 992 |     ClientMgr.RpcCallHistoryEnabled := enabled
 | 
|---|
 | 993 |   else
 | 
|---|
 | 994 |     RpcHistory.Enabled := enabled;
 | 
|---|
 | 995 | end;
 | 
|---|
 | 996 | 
 | 
|---|
 | 997 | function TSharedBroker.LogoutConnectedClients(
 | 
|---|
 | 998 |   logoutTimeLimit: Integer): ISharedBrokerErrorCode;
 | 
|---|
 | 999 | begin
 | 
|---|
 | 1000 |   ClientMgr.CloseAllClients(logoutTimeLimit);
 | 
|---|
 | 1001 |   ClientMgr.InProcessOfLoggingOutClients := true;
 | 
|---|
 | 1002 |   Result := Success;
 | 
|---|
 | 1003 | end;
 | 
|---|
 | 1004 | 
 | 
|---|
 | 1005 | function TSharedBroker.GetClientNameFromUniqueClientId(
 | 
|---|
 | 1006 |   uniqueClientId: Integer;
 | 
|---|
 | 1007 |   out clientName: WideString): ISharedBrokerErrorCode;
 | 
|---|
 | 1008 | begin
 | 
|---|
 | 1009 |   Result := ClientMgr.GetClientNameFromUniqueClientId(uniqueClientId,clientName);
 | 
|---|
 | 1010 | end;
 | 
|---|
 | 1011 | 
 | 
|---|
 | 1012 | function TSharedBroker.GetActiveBrokerConnectionIndexCount(
 | 
|---|
 | 1013 |   out connectionIndexCount: Integer): ISharedBrokerErrorCode;
 | 
|---|
 | 1014 | begin
 | 
|---|
 | 1015 |   connectionIndexCount := ClientMgr.AllConnections.Count;
 | 
|---|
 | 1016 |   Result := Success;
 | 
|---|
 | 1017 | end;
 | 
|---|
 | 1018 | 
 | 
|---|
 | 1019 | function TSharedBroker.GetActiveBrokerConnectionIndexFromUniqueClientId(
 | 
|---|
 | 1020 |   uniqueClientId: Integer;
 | 
|---|
 | 1021 |   out connectionIndex: Integer): ISharedBrokerErrorCode;
 | 
|---|
 | 1022 | begin
 | 
|---|
 | 1023 |   Result := ClientMgr.GetActiveBrokerConnectionIndexFromUniqueClientId(uniqueClientId,connectionIndex);
 | 
|---|
 | 1024 | end;
 | 
|---|
 | 1025 | 
 | 
|---|
 | 1026 | function TSharedBroker.GetActiveBrokerConnectionInfo(connectionIndex: Integer;
 | 
|---|
 | 1027 |   out connectedServerIp: WideString; out connectedServerPort: Integer;
 | 
|---|
 | 1028 |   out lastContext: WideString): ISharedBrokerErrorCode;
 | 
|---|
 | 1029 | begin
 | 
|---|
 | 1030 |   Result := ConnectionIndexOutOfRange;
 | 
|---|
 | 1031 | 
 | 
|---|
 | 1032 |   if (connectionIndex >= 0) and (connectionIndex < ClientMgr.AllConnections.Count) then
 | 
|---|
 | 1033 |   begin
 | 
|---|
 | 1034 |     with TBrokerConnection(ClientMgr.AllConnections.Items[connectionIndex]) do
 | 
|---|
 | 1035 |       begin
 | 
|---|
 | 1036 |         connectedServerIp := FServerIP;
 | 
|---|
 | 1037 |         connectedServerPort := FPort;
 | 
|---|
 | 1038 |         lastContext := FLastContext;
 | 
|---|
 | 1039 |         Result := Success;
 | 
|---|
 | 1040 |       end;
 | 
|---|
 | 1041 |   end;
 | 
|---|
 | 1042 | end;
 | 
|---|
 | 1043 | 
 | 
|---|
 | 1044 | function TSharedBroker.GetConnectionIndex: Integer;
 | 
|---|
 | 1045 | begin
 | 
|---|
 | 1046 |   Result := FBrokerConnection.FConnectionIndex;
 | 
|---|
 | 1047 | end;
 | 
|---|
 | 1048 | 
 | 
|---|
 | 1049 | constructor TSharedBrokerClientMgr.Create;
 | 
|---|
 | 1050 | begin
 | 
|---|
 | 1051 |   inherited;
 | 
|---|
 | 1052 |   FAllConnections              := TList.Create;
 | 
|---|
 | 1053 |   FAllConnectedClients         := TList.Create;
 | 
|---|
 | 1054 |   FAllClients                  := TList.Create;
 | 
|---|
 | 1055 |   FNoClientsHaveConnectedYet   := True;
 | 
|---|
 | 1056 | 
 | 
|---|
 | 1057 |   FNextRpcUniqueId             := kNextRpcUniqueIdInitialValue;
 | 
|---|
 | 1058 |   RpcCallHistoryEnabled        := kRpcCallHistoryEnabledDefault;
 | 
|---|
 | 1059 |   PerClientRpcHistoryLimit     := kPerClientRpcHistoryLimitDefault;
 | 
|---|
 | 1060 |   InProcessOfLoggingOutClients := false;
 | 
|---|
 | 1061 |   CloseAllClientsWaitTime      := kCloseAllClientsWaitTimeDefault;
 | 
|---|
 | 1062 | 
 | 
|---|
 | 1063 |   FKillClientsStartedTime      := 0;
 | 
|---|
 | 1064 |   FKillClientsCountdownStarted := false;
 | 
|---|
 | 1065 | end;
 | 
|---|
 | 1066 | 
 | 
|---|
 | 1067 | destructor  TSharedBrokerClientMgr.Destroy;
 | 
|---|
 | 1068 | begin
 | 
|---|
 | 1069 |   FAllConnections.Free;
 | 
|---|
 | 1070 |   FAllConnectedClients.Free;
 | 
|---|
 | 1071 |   FAllClients.Free;
 | 
|---|
 | 1072 |   inherited;
 | 
|---|
 | 1073 | end;
 | 
|---|
 | 1074 | 
 | 
|---|
 | 1075 | procedure TSharedBrokerClientMgr.SendOnLogout;
 | 
|---|
 | 1076 | var
 | 
|---|
 | 1077 |   Enum: IEnumConnections;
 | 
|---|
 | 1078 |   ConnectData: TConnectData;
 | 
|---|
 | 1079 |   Fetched: Cardinal;
 | 
|---|
 | 1080 |   aBrokerClient: TSharedBroker;
 | 
|---|
 | 1081 |   i: Integer;
 | 
|---|
 | 1082 | begin
 | 
|---|
 | 1083 |   for i := Pred(FAllClients.Count) downto 0 do
 | 
|---|
 | 1084 |   begin
 | 
|---|
 | 1085 |     aBrokerClient := TSharedBroker(FAllClients.Items[i]);
 | 
|---|
 | 1086 |     if aBrokerClient <> nil then
 | 
|---|
 | 1087 |     begin
 | 
|---|
 | 1088 |       Enum := aBrokerClient.GetEnumerator;
 | 
|---|
 | 1089 |       if Enum <> nil then
 | 
|---|
 | 1090 |       begin
 | 
|---|
 | 1091 | 
 | 
|---|
 | 1092 |         while Enum.Next(1,ConnectData, @Fetched) = S_OK do
 | 
|---|
 | 1093 |         begin
 | 
|---|
 | 1094 |           if ConnectData.pUnk <> nil then
 | 
|---|
 | 1095 |             try
 | 
|---|
 | 1096 |               (ConnectData.pUnk as ISharedBrokerEvents).OnLogout;
 | 
|---|
 | 1097 |             except
 | 
|---|
 | 1098 |             end;
 | 
|---|
 | 1099 |         end;
 | 
|---|
 | 1100 |       end;
 | 
|---|
 | 1101 |     end;
 | 
|---|
 | 1102 |   end;
 | 
|---|
 | 1103 | end;
 | 
|---|
 | 1104 | 
 | 
|---|
 | 1105 | procedure TSharedBrokerClientMgr.SendOnRpcCallRecorded(uniqueRpcId: Longword);
 | 
|---|
 | 1106 | var
 | 
|---|
 | 1107 |   Enum: IEnumConnections;
 | 
|---|
 | 1108 |   ConnectData: TConnectData;
 | 
|---|
 | 1109 |   Fetched: Cardinal;
 | 
|---|
 | 1110 |   aBrokerClient: TSharedBroker;
 | 
|---|
 | 1111 |   i: Integer;
 | 
|---|
 | 1112 | 
 | 
|---|
 | 1113 | begin
 | 
|---|
 | 1114 |   for i := Pred(FAllClients.Count) downto 0 do
 | 
|---|
 | 1115 |   begin
 | 
|---|
 | 1116 |     aBrokerClient := TSharedBroker(FAllClients.Items[i]);
 | 
|---|
 | 1117 |     if aBrokerClient <> nil then
 | 
|---|
 | 1118 |     begin
 | 
|---|
 | 1119 |       // only send these events to Debugger type clients
 | 
|---|
 | 1120 |       if aBrokerClient.ConnectType = DebuggerClient then
 | 
|---|
 | 1121 |       begin
 | 
|---|
 | 1122 |         Enum := aBrokerClient.GetEnumerator;
 | 
|---|
 | 1123 |         if Enum <> nil then
 | 
|---|
 | 1124 |         begin
 | 
|---|
 | 1125 |           while Enum.Next(1,ConnectData, @Fetched) = S_OK do
 | 
|---|
 | 1126 |             if ConnectData.pUnk <> nil then
 | 
|---|
 | 1127 |               try
 | 
|---|
 | 1128 |                 (ConnectData.pUnk as ISharedBrokerEvents).OnRpcCallRecorded(uniqueRpcId);
 | 
|---|
 | 1129 |               except
 | 
|---|
 | 1130 |               end;
 | 
|---|
 | 1131 |         end;
 | 
|---|
 | 1132 |       end;
 | 
|---|
 | 1133 |     end;
 | 
|---|
 | 1134 |   end;
 | 
|---|
 | 1135 | end;
 | 
|---|
 | 1136 | 
 | 
|---|
 | 1137 | procedure TSharedBrokerClientMgr.SendOnClientConnect(uniqueClientId: Integer;connection: ISharedBrokerConnection);
 | 
|---|
 | 1138 | var
 | 
|---|
 | 1139 |   Enum: IEnumConnections;
 | 
|---|
 | 1140 |   ConnectData: TConnectData;
 | 
|---|
 | 1141 |   Fetched: Cardinal;
 | 
|---|
 | 1142 |   aBrokerClient: TSharedBroker;
 | 
|---|
 | 1143 |   i: Integer;
 | 
|---|
 | 1144 | 
 | 
|---|
 | 1145 | begin
 | 
|---|
 | 1146 |   for i := Pred(FAllClients.Count) downto 0 do
 | 
|---|
 | 1147 |   begin
 | 
|---|
 | 1148 |     aBrokerClient := TSharedBroker(FAllClients.Items[i]);
 | 
|---|
 | 1149 |     if aBrokerClient <> nil then
 | 
|---|
 | 1150 |     begin
 | 
|---|
 | 1151 |       // only send these events to Debugger type clients
 | 
|---|
 | 1152 |       if aBrokerClient.ConnectType = DebuggerClient then
 | 
|---|
 | 1153 |       begin
 | 
|---|
 | 1154 |         Enum := aBrokerClient.GetEnumerator;
 | 
|---|
 | 1155 |         if Enum <> nil then
 | 
|---|
 | 1156 |         begin
 | 
|---|
 | 1157 |           while Enum.Next(1,ConnectData, @Fetched) = S_OK do
 | 
|---|
 | 1158 |             if ConnectData.pUnk <> nil then
 | 
|---|
 | 1159 |               try
 | 
|---|
 | 1160 |                 (ConnectData.pUnk as ISharedBrokerEvents).OnClientConnect(uniqueClientId,connection);
 | 
|---|
 | 1161 |               except
 | 
|---|
 | 1162 |               end;
 | 
|---|
 | 1163 |         end;
 | 
|---|
 | 1164 |       end;
 | 
|---|
 | 1165 |     end;
 | 
|---|
 | 1166 |   end;
 | 
|---|
 | 1167 | end;
 | 
|---|
 | 1168 | 
 | 
|---|
 | 1169 | procedure TSharedBrokerClientMgr.SendOnClientDisconnect(uniqueClientId: Integer);
 | 
|---|
 | 1170 | var
 | 
|---|
 | 1171 |   Enum: IEnumConnections;
 | 
|---|
 | 1172 |   ConnectData: TConnectData;
 | 
|---|
 | 1173 |   Fetched: Cardinal;
 | 
|---|
 | 1174 |   aBrokerClient: TSharedBroker;
 | 
|---|
 | 1175 |   i: Integer;
 | 
|---|
 | 1176 | 
 | 
|---|
 | 1177 | begin
 | 
|---|
 | 1178 |   if FAllClients <> nil then
 | 
|---|
 | 1179 |   for i := Pred(FAllClients.Count) downto 0 do
 | 
|---|
 | 1180 |   begin
 | 
|---|
 | 1181 |     aBrokerClient := TSharedBroker(FAllClients.Items[i]);
 | 
|---|
 | 1182 |     if aBrokerClient <> nil then
 | 
|---|
 | 1183 |     begin
 | 
|---|
 | 1184 |       // only send these events to Debugger type clients
 | 
|---|
 | 1185 |       if aBrokerClient.ConnectType = DebuggerClient then
 | 
|---|
 | 1186 |       begin
 | 
|---|
 | 1187 |         Enum := aBrokerClient.GetEnumerator;
 | 
|---|
 | 1188 |         if Enum <> nil then
 | 
|---|
 | 1189 |         begin
 | 
|---|
 | 1190 |           while Enum.Next(1,ConnectData, @Fetched) = S_OK do
 | 
|---|
 | 1191 |             if ConnectData.pUnk <> nil then
 | 
|---|
 | 1192 |               try
 | 
|---|
 | 1193 |                 (ConnectData.pUnk as ISharedBrokerEvents).OnClientDisconnect(uniqueClientId);
 | 
|---|
 | 1194 |               except
 | 
|---|
 | 1195 |               end;
 | 
|---|
 | 1196 |         end;
 | 
|---|
 | 1197 |       end;
 | 
|---|
 | 1198 |     end;
 | 
|---|
 | 1199 |   end;
 | 
|---|
 | 1200 | end;
 | 
|---|
 | 1201 | 
 | 
|---|
 | 1202 | procedure TSharedBrokerClientMgr.SendOnContextChanged(connectionIndex: Integer; newContext: WideString);
 | 
|---|
 | 1203 | var
 | 
|---|
 | 1204 |   Enum: IEnumConnections;
 | 
|---|
 | 1205 |   ConnectData: TConnectData;
 | 
|---|
 | 1206 |   Fetched: Cardinal;
 | 
|---|
 | 1207 |   aBrokerClient: TSharedBroker;
 | 
|---|
 | 1208 |   i: Integer;
 | 
|---|
 | 1209 | 
 | 
|---|
 | 1210 | begin
 | 
|---|
 | 1211 |   if FAllClients <> nil then
 | 
|---|
 | 1212 |   for i := Pred(FAllClients.Count) downto 0 do
 | 
|---|
 | 1213 |   begin
 | 
|---|
 | 1214 |     aBrokerClient := TSharedBroker(FAllClients.Items[i]);
 | 
|---|
 | 1215 |     if aBrokerClient <> nil then
 | 
|---|
 | 1216 |     begin
 | 
|---|
 | 1217 |       // only send these events to Debugger type clients
 | 
|---|
 | 1218 |       if aBrokerClient.ConnectType = DebuggerClient then
 | 
|---|
 | 1219 |       begin
 | 
|---|
 | 1220 |         Enum := aBrokerClient.GetEnumerator;
 | 
|---|
 | 1221 |         if Enum <> nil then
 | 
|---|
 | 1222 |         begin
 | 
|---|
 | 1223 |           while Enum.Next(1,ConnectData, @Fetched) = S_OK do
 | 
|---|
 | 1224 |             if ConnectData.pUnk <> nil then
 | 
|---|
 | 1225 |               try
 | 
|---|
 | 1226 |                 (ConnectData.pUnk as ISharedBrokerEvents).OnContextChanged(connectionIndex,newContext);
 | 
|---|
 | 1227 |               except
 | 
|---|
 | 1228 |               end;
 | 
|---|
 | 1229 |         end;
 | 
|---|
 | 1230 |       end;
 | 
|---|
 | 1231 |     end;
 | 
|---|
 | 1232 |   end;
 | 
|---|
 | 1233 | end;
 | 
|---|
 | 1234 | 
 | 
|---|
 | 1235 | procedure TSharedBrokerClientMgr.SendOnConnectionDropped(RPCBroker: TRPCBroker; ErrorText: String);
 | 
|---|
 | 1236 | var
 | 
|---|
 | 1237 |   Enum: IEnumConnections;
 | 
|---|
 | 1238 |   ConnectData: TConnectData;
 | 
|---|
 | 1239 |   Fetched: Cardinal;
 | 
|---|
 | 1240 |   aBrokerClient: TSharedBroker;
 | 
|---|
 | 1241 |   i: Integer;
 | 
|---|
 | 1242 |   IsRightConnection: Boolean;
 | 
|---|
 | 1243 |   ConnectionIndex: Integer;
 | 
|---|
 | 1244 | begin
 | 
|---|
 | 1245 |     ConnectionIndex := 0;
 | 
|---|
 | 1246 |     // first pass -- get BrokerClients and identify ConnectionIndex's
 | 
|---|
 | 1247 |     if FAllClients <> nil then
 | 
|---|
 | 1248 |     for i := Pred(FAllClients.Count) downto 0 do
 | 
|---|
 | 1249 |     begin
 | 
|---|
 | 1250 |       aBrokerClient := TSharedBroker(FAllClients.Items[i]);
 | 
|---|
 | 1251 |       if aBrokerClient <> nil then
 | 
|---|
 | 1252 |       begin
 | 
|---|
 | 1253 |         IsRightConnection := False;
 | 
|---|
 | 1254 |         if ABrokerClient.ConnectType <> DebuggerClient then
 | 
|---|
 | 1255 |         begin
 | 
|---|
 | 1256 |           if ABrokerClient.FBrokerConnection.FBroker = RPCBroker then
 | 
|---|
 | 1257 |           begin
 | 
|---|
 | 1258 |             IsRightConnection := True;
 | 
|---|
 | 1259 |             ConnectionIndex := ABrokerClient.FBrokerConnection.FConnectionIndex;
 | 
|---|
 | 1260 |           end;
 | 
|---|
 | 1261 |           if IsRightConnection then
 | 
|---|
 | 1262 |           begin
 | 
|---|
 | 1263 |             Enum := aBrokerClient.GetEnumerator;
 | 
|---|
 | 1264 |             if Enum <> nil then
 | 
|---|
 | 1265 |             begin
 | 
|---|
 | 1266 |               while Enum.Next(1,ConnectData, @Fetched) = S_OK do
 | 
|---|
 | 1267 |                 if ConnectData.pUnk <> nil then
 | 
|---|
 | 1268 |                   try
 | 
|---|
 | 1269 |                     (ConnectData.pUnk as ISharedBrokerEvents).OnConnectionDropped(ConnectionIndex,ErrorText);
 | 
|---|
 | 1270 |                   except
 | 
|---|
 | 1271 |                   end;
 | 
|---|
 | 1272 |             end;
 | 
|---|
 | 1273 |           end;
 | 
|---|
 | 1274 |         end;
 | 
|---|
 | 1275 |       end;
 | 
|---|
 | 1276 |     end;
 | 
|---|
 | 1277 |     // Now get Debuggers
 | 
|---|
 | 1278 |     if FAllClients <> nil then
 | 
|---|
 | 1279 |     for i := Pred(FAllClients.Count) downto 0 do
 | 
|---|
 | 1280 |     begin
 | 
|---|
 | 1281 |       aBrokerClient := TSharedBroker(FAllClients.Items[i]);
 | 
|---|
 | 1282 |       if aBrokerClient <> nil then
 | 
|---|
 | 1283 |       begin
 | 
|---|
 | 1284 |         // only send these events to Debugger type clients
 | 
|---|
 | 1285 |         if aBrokerClient.ConnectType = DebuggerClient then
 | 
|---|
 | 1286 |         begin
 | 
|---|
 | 1287 |           Enum := aBrokerClient.GetEnumerator;
 | 
|---|
 | 1288 |           if Enum <> nil then
 | 
|---|
 | 1289 |           begin
 | 
|---|
 | 1290 |             while Enum.Next(1,ConnectData, @Fetched) = S_OK do
 | 
|---|
 | 1291 |               if ConnectData.pUnk <> nil then
 | 
|---|
 | 1292 |                 try
 | 
|---|
 | 1293 |                   (ConnectData.pUnk as ISharedBrokerEvents).OnConnectionDropped(ConnectionIndex,ErrorText);
 | 
|---|
 | 1294 |                 except
 | 
|---|
 | 1295 |                 end;
 | 
|---|
 | 1296 |           end;
 | 
|---|
 | 1297 |         end;
 | 
|---|
 | 1298 |       end;
 | 
|---|
 | 1299 |     end;
 | 
|---|
 | 1300 | end;
 | 
|---|
 | 1301 | 
 | 
|---|
 | 1302 | 
 | 
|---|
 | 1303 | procedure TSharedBrokerClientMgr.CloseAllClients(maxWaitTime: Integer);
 | 
|---|
 | 1304 | begin
 | 
|---|
 | 1305 |   if maxWaitTime > 0 then
 | 
|---|
 | 1306 |     // Since maxWaitTime is in seconds we need to scale by 1000ms/sec
 | 
|---|
 | 1307 |     CloseAllClientsWaitTime := maxWaitTime * kMilliSecondScale
 | 
|---|
 | 1308 |   else
 | 
|---|
 | 1309 |     CloseAllClientsWaitTime := kCloseAllClientsWaitTimeDefault;
 | 
|---|
 | 1310 | 
 | 
|---|
 | 1311 |   // Be sure to send the OnLogout message to all clients
 | 
|---|
 | 1312 |   ClientMgr.SendOnLogout;
 | 
|---|
 | 1313 |   FKillClientsCountdownStarted := true;
 | 
|---|
 | 1314 |   FKillClientsStartedTime := GetTickCount; // use MS calculations
 | 
|---|
 | 1315 | end;
 | 
|---|
 | 1316 | 
 | 
|---|
 | 1317 | procedure TSharedBrokerClientMgr.CheckDisconnectWaitTimeAndShutdownClients;
 | 
|---|
 | 1318 | var
 | 
|---|
 | 1319 |   ABrokerClient: TSharedBroker;
 | 
|---|
 | 1320 |   i: Integer;
 | 
|---|
 | 1321 |   timeElapsedMS: Double;
 | 
|---|
 | 1322 | begin
 | 
|---|
 | 1323 |   if FKillClientsCountdownStarted = true then
 | 
|---|
 | 1324 |   begin
 | 
|---|
 | 1325 |     if FAllClients.Count > 0 then
 | 
|---|
 | 1326 |     begin
 | 
|---|
 | 1327 |       timeElapsedMS := GetTickCount - FKillClientsStartedTime;
 | 
|---|
 | 1328 |       if timeElapsedMS > CloseAllClientsWaitTime then
 | 
|---|
 | 1329 |       begin
 | 
|---|
 | 1330 |         // Put up a warning dialog that all RPC connections will now be terminated
 | 
|---|
 | 1331 |         Application.MessageBox('All client connections will now be terminated!','RPCSharedBrokerSessionMgr Warning',MB_ICONWARNING);
 | 
|---|
 | 1332 |         for i := Pred(FAllClients.Count) downto 0 do
 | 
|---|
 | 1333 |         begin
 | 
|---|
 | 1334 |           ABrokerClient := TSharedBroker(FAllClients.Items[i]);
 | 
|---|
 | 1335 |           if ABrokerClient <> nil then ABrokerClient.DoDisconnect;
 | 
|---|
 | 1336 |         end;
 | 
|---|
 | 1337 |       end;
 | 
|---|
 | 1338 |     end;
 | 
|---|
 | 1339 |   end;
 | 
|---|
 | 1340 | end;
 | 
|---|
 | 1341 | 
 | 
|---|
 | 1342 | procedure TSharedBrokerClientMgr.ListAllConnectedClients(AList: TStrings);
 | 
|---|
 | 1343 | var
 | 
|---|
 | 1344 |   aBrokerClient: TSharedBroker;
 | 
|---|
 | 1345 |   i: Integer;
 | 
|---|
 | 1346 | begin
 | 
|---|
 | 1347 |   for i := 0 to Pred(ConnectedClientCount) do
 | 
|---|
 | 1348 |   begin
 | 
|---|
 | 1349 |     aBrokerClient := TSharedBroker(FAllConnectedClients.Items[i]);
 | 
|---|
 | 1350 |     AList.Add(ABrokerClient.FBrokerConnection.FServer+':'+
 | 
|---|
 | 1351 |               ABrokerClient.FBrokerConnection.FServerIP+':'+
 | 
|---|
 | 1352 |               IntToStr(ABrokerClient.FBrokerConnection.FPort)+'> <'+
 | 
|---|
 | 1353 |               ABrokerClient.ClientName+'> '+
 | 
|---|
 | 1354 |               ABrokerClient.FBrokerContext);
 | 
|---|
 | 1355 |   end;
 | 
|---|
 | 1356 | end;
 | 
|---|
 | 1357 | 
 | 
|---|
 | 1358 | procedure TSharedBrokerClientMgr.AddConnectedBrokerClient(broker: TSharedBroker);
 | 
|---|
 | 1359 | begin
 | 
|---|
 | 1360 |   if broker <> nil then
 | 
|---|
 | 1361 |     FAllConnectedClients.Add(broker);
 | 
|---|
 | 1362 | end;
 | 
|---|
 | 1363 | 
 | 
|---|
 | 1364 | procedure TSharedBrokerClientMgr.RemoveConnectedBrokerClient(broker: TSharedBroker);
 | 
|---|
 | 1365 | begin
 | 
|---|
 | 1366 |   if broker <> nil then
 | 
|---|
 | 1367 |     FAllConnectedClients.Remove(broker);
 | 
|---|
 | 1368 | end;
 | 
|---|
 | 1369 | 
 | 
|---|
 | 1370 | procedure TSharedBrokerClientMgr.AddToGeneralClientList(broker: TSharedBroker);
 | 
|---|
 | 1371 | begin
 | 
|---|
 | 1372 |   if broker <> nil then
 | 
|---|
 | 1373 |   begin
 | 
|---|
 | 1374 |     FAllClients.Add(broker);
 | 
|---|
 | 1375 |     NoClientsHaveConnectedYet := false;
 | 
|---|
 | 1376 |   end;
 | 
|---|
 | 1377 | end;
 | 
|---|
 | 1378 | 
 | 
|---|
 | 1379 | procedure TSharedBrokerClientMgr.RemoveFromGeneralClientList(broker: TSharedBroker);
 | 
|---|
 | 1380 | begin
 | 
|---|
 | 1381 |   if broker <> nil then
 | 
|---|
 | 1382 |     FAllClients.Remove(broker);
 | 
|---|
 | 1383 | end;
 | 
|---|
 | 1384 | 
 | 
|---|
 | 1385 | function TSharedBrokerClientMgr.ConnectedClientCount : integer;
 | 
|---|
 | 1386 | begin
 | 
|---|
 | 1387 |   Result := FAllConnectedClients.Count;
 | 
|---|
 | 1388 | end;
 | 
|---|
 | 1389 | 
 | 
|---|
 | 1390 | function TSharedBrokerClientMgr.GetNextRpcUniqueId: Longword;
 | 
|---|
 | 1391 | begin
 | 
|---|
 | 1392 |   FNextRpcUniqueId := FNextRpcUniqueId + 1;  // Let this wrap it should be ok.
 | 
|---|
 | 1393 |   Result := FNextRpcUniqueId;
 | 
|---|
 | 1394 | end;
 | 
|---|
 | 1395 | 
 | 
|---|
 | 1396 | function TSharedBrokerClientMgr.GetRPCCallEntryPtrFromHistory(uniqueRpcId: Longword;
 | 
|---|
 | 1397 |                                  out rpcEntryPtr: RPCCallHistoryEntryPointer)
 | 
|---|
 | 1398 |                                  : ISharedBrokerErrorCode;
 | 
|---|
 | 1399 | var
 | 
|---|
 | 1400 |   aBrokerClient: TSharedBroker;
 | 
|---|
 | 1401 |   i,count: Integer;
 | 
|---|
 | 1402 | 
 | 
|---|
 | 1403 | begin
 | 
|---|
 | 1404 |   count :=  Pred(ConnectedClientCount);
 | 
|---|
 | 1405 | 
 | 
|---|
 | 1406 |   Result := UniqueRPCIdDoesNotExist;
 | 
|---|
 | 1407 | 
 | 
|---|
 | 1408 |   for i := count downto 0 do
 | 
|---|
 | 1409 |   begin
 | 
|---|
 | 1410 |     aBrokerClient := TSharedBroker(FAllConnectedClients.Items[i]);
 | 
|---|
 | 1411 |     if aBrokerClient <> nil then
 | 
|---|
 | 1412 |     begin
 | 
|---|
 | 1413 |       Result := aBrokerClient.RpcHistory.GetRPCCallEntryPtr(uniqueRpcId,rpcEntryPtr);
 | 
|---|
 | 1414 |       if Result = Success then
 | 
|---|
 | 1415 |         Exit;
 | 
|---|
 | 1416 |     end;
 | 
|---|
 | 1417 |   end;
 | 
|---|
 | 1418 | end;
 | 
|---|
 | 1419 | 
 | 
|---|
 | 1420 | function TSharedBrokerClientMgr.GetRPCCallEntryPtrFromHistoryIndex(uniqueClientId:Longword;
 | 
|---|
 | 1421 |                                  rpcCallIndex: Integer;
 | 
|---|
 | 1422 |                                  out rpcEntryPtr: RPCCallHistoryEntryPointer)
 | 
|---|
 | 1423 |                                  : ISharedBrokerErrorCode;
 | 
|---|
 | 1424 | var
 | 
|---|
 | 1425 |   aBrokerClient: TSharedBroker;
 | 
|---|
 | 1426 |   i,count: Integer;
 | 
|---|
 | 1427 | 
 | 
|---|
 | 1428 | begin
 | 
|---|
 | 1429 |   count :=  Pred(ConnectedClientCount);
 | 
|---|
 | 1430 | 
 | 
|---|
 | 1431 |   Result := UniqueClientIdDoesNotExist;
 | 
|---|
 | 1432 | 
 | 
|---|
 | 1433 |   for i := count downto 0 do
 | 
|---|
 | 1434 |   begin
 | 
|---|
 | 1435 |     aBrokerClient := TSharedBroker(FAllConnectedClients.Items[i]);
 | 
|---|
 | 1436 | 
 | 
|---|
 | 1437 |     if aBrokerClient <> nil then
 | 
|---|
 | 1438 |     begin
 | 
|---|
 | 1439 |       if (aBrokerClient.BrokerUniqueClientId = uniqueClientId) then
 | 
|---|
 | 1440 |       begin
 | 
|---|
 | 1441 |         Result := aBrokerClient.RpcHistory.GetRPCCallEntryPtrFromIndex(rpcCallIndex,rpcEntryPtr);
 | 
|---|
 | 1442 |         Exit;
 | 
|---|
 | 1443 |       end;
 | 
|---|
 | 1444 |     end;
 | 
|---|
 | 1445 |   end;
 | 
|---|
 | 1446 | end;
 | 
|---|
 | 1447 | 
 | 
|---|
 | 1448 | function TSharedBrokerClientMgr.GetRPCClientIdFromHistory(uniqueRpcId: Integer;
 | 
|---|
 | 1449 |                                  out uniqueClientId: Integer;
 | 
|---|
 | 1450 |                                  out clientName: WideString)
 | 
|---|
 | 1451 |                                  : ISharedBrokerErrorCode;
 | 
|---|
 | 1452 | var
 | 
|---|
 | 1453 |   aBrokerClient: TSharedBroker;
 | 
|---|
 | 1454 |   i,count: Integer;
 | 
|---|
 | 1455 | 
 | 
|---|
 | 1456 | begin
 | 
|---|
 | 1457 |   count :=  Pred(ConnectedClientCount);
 | 
|---|
 | 1458 | 
 | 
|---|
 | 1459 |   Result := UniqueRPCIdDoesNotExist;
 | 
|---|
 | 1460 | 
 | 
|---|
 | 1461 |   for i := count downto 0 do
 | 
|---|
 | 1462 |   begin
 | 
|---|
 | 1463 |     aBrokerClient := TSharedBroker(FAllConnectedClients.Items[i]);
 | 
|---|
 | 1464 | 
 | 
|---|
 | 1465 |     if aBrokerClient <> nil then
 | 
|---|
 | 1466 |     begin
 | 
|---|
 | 1467 |       Result := aBrokerClient.RpcHistory.GetRPCCallClientId(uniqueRpcId,uniqueClientId);
 | 
|---|
 | 1468 |       if Result = Success then
 | 
|---|
 | 1469 |       begin
 | 
|---|
 | 1470 |         clientName := aBrokerClient.ClientName;
 | 
|---|
 | 1471 |         Exit;
 | 
|---|
 | 1472 |       end;
 | 
|---|
 | 1473 |     end;
 | 
|---|
 | 1474 |   end;
 | 
|---|
 | 1475 | end;
 | 
|---|
 | 1476 | 
 | 
|---|
 | 1477 | function TSharedBrokerClientMgr.GetRPCHistoryCountForClient(uniqueClientId: Integer;
 | 
|---|
 | 1478 |                                  out rpcCount: Integer)
 | 
|---|
 | 1479 |                                  : ISharedBrokerErrorCode;
 | 
|---|
 | 1480 | var
 | 
|---|
 | 1481 |   aBrokerClient: TSharedBroker;
 | 
|---|
 | 1482 |   i,count: Integer;
 | 
|---|
 | 1483 | 
 | 
|---|
 | 1484 | begin
 | 
|---|
 | 1485 |   count :=  Pred(ConnectedClientCount);
 | 
|---|
 | 1486 | 
 | 
|---|
 | 1487 |   Result := UniqueClientIdDoesNotExist;
 | 
|---|
 | 1488 | 
 | 
|---|
 | 1489 |   for i := count downto 0 do
 | 
|---|
 | 1490 |   begin
 | 
|---|
 | 1491 |     aBrokerClient := TSharedBroker(FAllConnectedClients.Items[i]);
 | 
|---|
 | 1492 | 
 | 
|---|
 | 1493 |     if aBrokerClient <> nil then
 | 
|---|
 | 1494 |     begin
 | 
|---|
 | 1495 |       if Integer(aBrokerClient.BrokerUniqueClientId) = Integer(uniqueClientId) then
 | 
|---|
 | 1496 |       begin
 | 
|---|
 | 1497 |         rpcCount := aBrokerClient.RpcHistory.Count;
 | 
|---|
 | 1498 |         Result := Success;
 | 
|---|
 | 1499 |         Exit;
 | 
|---|
 | 1500 |       end;
 | 
|---|
 | 1501 |     end;
 | 
|---|
 | 1502 |   end;
 | 
|---|
 | 1503 | end;
 | 
|---|
 | 1504 | 
 | 
|---|
 | 1505 | function TSharedBrokerClientMgr.GetClientIdAndNameFromIndex(clientIndex: Integer;
 | 
|---|
 | 1506 |                                  out uniqueClientId: Integer;
 | 
|---|
 | 1507 |                                  out clientName: WideString)
 | 
|---|
 | 1508 |                                  : ISharedBrokerErrorCode;
 | 
|---|
 | 1509 | var
 | 
|---|
 | 1510 |   aBrokerClient: TSharedBroker;
 | 
|---|
 | 1511 | begin
 | 
|---|
 | 1512 |   if (clientIndex >= 0) and (clientIndex < FAllConnectedClients.Count) then
 | 
|---|
 | 1513 |   begin
 | 
|---|
 | 1514 |     aBrokerClient := TSharedBroker(FAllConnectedClients.Items[clientIndex]);
 | 
|---|
 | 1515 |     if aBrokerClient <> nil then
 | 
|---|
 | 1516 |     begin
 | 
|---|
 | 1517 |       uniqueClientId := aBrokerClient.BrokerUniqueClientId;
 | 
|---|
 | 1518 |       clientName := aBrokerClient.ClientName;
 | 
|---|
 | 1519 |       Result := Success;
 | 
|---|
 | 1520 |     end else
 | 
|---|
 | 1521 |       Result := NilClientPointer;
 | 
|---|
 | 1522 |   end else
 | 
|---|
 | 1523 |     Result := ClientIndexOutOfRange;
 | 
|---|
 | 1524 | 
 | 
|---|
 | 1525 |   if Result <> Success then
 | 
|---|
 | 1526 |   begin
 | 
|---|
 | 1527 |     uniqueClientId := 0;
 | 
|---|
 | 1528 |     clientName := '';
 | 
|---|
 | 1529 |   end;
 | 
|---|
 | 1530 | end;
 | 
|---|
 | 1531 | 
 | 
|---|
 | 1532 | function TSharedBrokerClientMgr.GetClientNameFromUniqueClientId(uniqueClientId: Integer;
 | 
|---|
 | 1533 |                                  out clientName: WideString)
 | 
|---|
 | 1534 |                                  : ISharedBrokerErrorCode;
 | 
|---|
 | 1535 | var
 | 
|---|
 | 1536 |   aBrokerClient: TSharedBroker;
 | 
|---|
 | 1537 |   i,count: Integer;
 | 
|---|
 | 1538 | 
 | 
|---|
 | 1539 | begin
 | 
|---|
 | 1540 |   count :=  Pred(ConnectedClientCount);
 | 
|---|
 | 1541 | 
 | 
|---|
 | 1542 |   Result := UniqueClientIdDoesNotExist;
 | 
|---|
 | 1543 | 
 | 
|---|
 | 1544 |   for i := count downto 0 do
 | 
|---|
 | 1545 |   begin
 | 
|---|
 | 1546 |     aBrokerClient := TSharedBroker(FAllConnectedClients.Items[i]);
 | 
|---|
 | 1547 | 
 | 
|---|
 | 1548 |     if aBrokerClient <> nil then
 | 
|---|
 | 1549 |     begin
 | 
|---|
 | 1550 |       if Integer(aBrokerClient.BrokerUniqueClientId) = Integer(uniqueClientId) then
 | 
|---|
 | 1551 |       begin
 | 
|---|
 | 1552 |         clientName := aBrokerClient.ClientName;
 | 
|---|
 | 1553 |         Result := Success;
 | 
|---|
 | 1554 |         Exit;
 | 
|---|
 | 1555 |       end;
 | 
|---|
 | 1556 |     end;
 | 
|---|
 | 1557 |   end;
 | 
|---|
 | 1558 | end;
 | 
|---|
 | 1559 | 
 | 
|---|
 | 1560 | function TSharedBrokerClientMgr.GetActiveBrokerConnectionIndexFromUniqueClientId(uniqueClientId: Integer;
 | 
|---|
 | 1561 |                                  out connectionIndex: Integer)
 | 
|---|
 | 1562 |                                  : ISharedBrokerErrorCode;
 | 
|---|
 | 1563 | 
 | 
|---|
 | 1564 | var
 | 
|---|
 | 1565 |   aBrokerClient: TSharedBroker;
 | 
|---|
 | 1566 |   i,count: Integer;
 | 
|---|
 | 1567 | begin
 | 
|---|
 | 1568 |   count :=  Pred(ConnectedClientCount);
 | 
|---|
 | 1569 |   Result := UniqueClientIdDoesNotExist;
 | 
|---|
 | 1570 |   for i := count downto 0 do
 | 
|---|
 | 1571 |   begin
 | 
|---|
 | 1572 |     aBrokerClient := TSharedBroker(FAllConnectedClients.Items[i]);
 | 
|---|
 | 1573 | 
 | 
|---|
 | 1574 |     if aBrokerClient <> nil then
 | 
|---|
 | 1575 |     begin
 | 
|---|
 | 1576 |       if Integer(aBrokerClient.BrokerUniqueClientId) = Integer(uniqueClientId) then
 | 
|---|
 | 1577 |       begin
 | 
|---|
 | 1578 |         connectionIndex := aBrokerClient.BrokerConnectionIndex;
 | 
|---|
 | 1579 |         Result := Success;
 | 
|---|
 | 1580 |         Exit;
 | 
|---|
 | 1581 |       end;
 | 
|---|
 | 1582 |     end;
 | 
|---|
 | 1583 |   end;
 | 
|---|
 | 1584 | end;
 | 
|---|
 | 1585 | 
 | 
|---|
 | 1586 | procedure TSharedBrokerClientMgr.SetRpcCallHistoryEnabled(enabled: boolean);
 | 
|---|
 | 1587 | 
 | 
|---|
 | 1588 | var
 | 
|---|
 | 1589 |   aBrokerClient: TSharedBroker;
 | 
|---|
 | 1590 |   i,count: Integer;
 | 
|---|
 | 1591 | 
 | 
|---|
 | 1592 | begin
 | 
|---|
 | 1593 |   // be sure to set the local state
 | 
|---|
 | 1594 |   FRpcCallHistoryEnabled := enabled;
 | 
|---|
 | 1595 | 
 | 
|---|
 | 1596 |   count :=  Pred(ConnectedClientCount);
 | 
|---|
 | 1597 | 
 | 
|---|
 | 1598 |   for i := count downto 0 do
 | 
|---|
 | 1599 |   begin
 | 
|---|
 | 1600 |     aBrokerClient := TSharedBroker(FAllConnectedClients.Items[i]);
 | 
|---|
 | 1601 |     if aBrokerClient <> nil then
 | 
|---|
 | 1602 |     begin
 | 
|---|
 | 1603 |       // Set the RpcCallHistory for all of the broker connections
 | 
|---|
 | 1604 |       aBrokerClient.RpcHistory.Enabled := enabled;
 | 
|---|
 | 1605 |     end;
 | 
|---|
 | 1606 |   end;
 | 
|---|
 | 1607 | 
 | 
|---|
 | 1608 | end;
 | 
|---|
 | 1609 | 
 | 
|---|
 | 1610 | function TSharedBrokerClientMgr.GeneralClientCount:Integer;
 | 
|---|
 | 1611 | begin
 | 
|---|
 | 1612 |   if FAllClients <> nil then
 | 
|---|
 | 1613 |     Result:= FAllClients.Count
 | 
|---|
 | 1614 |   else
 | 
|---|
 | 1615 |     Result:= 0;
 | 
|---|
 | 1616 | end;
 | 
|---|
 | 1617 | 
 | 
|---|
 | 1618 | procedure TSharedBrokerClientMgr.OnIdleEventHandler(Sender: TObject; var Done: Boolean);
 | 
|---|
 | 1619 | begin
 | 
|---|
 | 1620 |   // Shut me down any time the client count goes to zero
 | 
|---|
 | 1621 |   // Since this server is non visual it has to be able to shut
 | 
|---|
 | 1622 |   // down automatically.
 | 
|---|
 | 1623 |   // It is started up automatically any time a client tries
 | 
|---|
 | 1624 |   // to connect
 | 
|---|
 | 1625 |   if (ClientMgr.InProcessOfLoggingOutClients = true) then
 | 
|---|
 | 1626 |     ClientMgr.CheckDisconnectWaitTimeAndShutdownClients;
 | 
|---|
 | 1627 | 
 | 
|---|
 | 1628 |   if (GeneralClientCount = 0) and (NoClientsHaveConnectedYet = false)then
 | 
|---|
 | 1629 |   begin
 | 
|---|
 | 1630 |    Application.Terminate;
 | 
|---|
 | 1631 | //   SendMessage(Application.MainForm.Handle,WM_CLOSE,0,0);
 | 
|---|
 | 1632 |   end;
 | 
|---|
 | 1633 | end;
 | 
|---|
 | 1634 | 
 | 
|---|
 | 1635 | // Global Function Implementation
 | 
|---|
 | 1636 | function TSharedBrokerClientMgr.Piece(const S: string; Delim: char; PieceNum: Integer): string;
 | 
|---|
 | 1637 | { returns the Nth piece (PieceNum) of a string delimited by Delim }
 | 
|---|
 | 1638 | var
 | 
|---|
 | 1639 |   i: Integer;
 | 
|---|
 | 1640 |   Strt, Next: PChar;
 | 
|---|
 | 1641 | begin
 | 
|---|
 | 1642 |   i := 1;
 | 
|---|
 | 1643 |   Strt := PChar(S);
 | 
|---|
 | 1644 |   Next := StrScan(Strt, Delim);
 | 
|---|
 | 1645 |   while (i < PieceNum) and (Next <> nil) do
 | 
|---|
 | 1646 |   begin
 | 
|---|
 | 1647 |     Inc(i);
 | 
|---|
 | 1648 |     Strt := Next + 1;
 | 
|---|
 | 1649 |     Next := StrScan(Strt, Delim);
 | 
|---|
 | 1650 |   end;
 | 
|---|
 | 1651 |   if Next = nil then Next := StrEnd(Strt);
 | 
|---|
 | 1652 |   if i < PieceNum then Result := '' else SetString(Result, Strt, Next - Strt);
 | 
|---|
 | 1653 | end;
 | 
|---|
 | 1654 | 
 | 
|---|
 | 1655 | constructor RPCCallHistoryEntry.Create;
 | 
|---|
 | 1656 | begin
 | 
|---|
 | 1657 |   CallName := kNoneString;
 | 
|---|
 | 1658 |   CallParams := kNoneString;
 | 
|---|
 | 1659 |   CallResults := kNoneString;
 | 
|---|
 | 1660 |   CallStartDateTime := 0;
 | 
|---|
 | 1661 |   CallDurationInMS := 0;
 | 
|---|
 | 1662 | end;
 | 
|---|
 | 1663 | 
 | 
|---|
 | 1664 | 
 | 
|---|
 | 1665 | constructor RPCCallHistoryEntry.Create(context:WideString;
 | 
|---|
 | 1666 |                                        name:WideString;
 | 
|---|
 | 1667 |                                        params:WideString;
 | 
|---|
 | 1668 |                                        results:WideString;
 | 
|---|
 | 1669 |                                        startDateTime:Double;
 | 
|---|
 | 1670 |                                        durationInMS:Longword;
 | 
|---|
 | 1671 |                                        clientId:Integer);
 | 
|---|
 | 1672 | begin;
 | 
|---|
 | 1673 |   CallContext := context;
 | 
|---|
 | 1674 |   CallName := name;
 | 
|---|
 | 1675 |   CallParams := params;
 | 
|---|
 | 1676 |   CallResults := results;
 | 
|---|
 | 1677 |   CallStartDateTime := startDateTime;
 | 
|---|
 | 1678 |   CallDurationInMS := durationInMS;
 | 
|---|
 | 1679 | 
 | 
|---|
 | 1680 |   UniqueRPCCallId := ClientMgr.GetNextRpcUniqueId;
 | 
|---|
 | 1681 | 
 | 
|---|
 | 1682 |   BrokerUniqueClientId := clientId;
 | 
|---|
 | 1683 | end;
 | 
|---|
 | 1684 | 
 | 
|---|
 | 1685 | constructor RPCCallHistory.Create;
 | 
|---|
 | 1686 | begin
 | 
|---|
 | 1687 |   inherited;
 | 
|---|
 | 1688 |   FEnabled := kRpcCallHistoryEnabledDefault;
 | 
|---|
 | 1689 | end;
 | 
|---|
 | 1690 | 
 | 
|---|
 | 1691 | function RPCCallHistory.Add(entry: RPCCallHistoryEntry): Integer;
 | 
|---|
 | 1692 | var
 | 
|---|
 | 1693 |   diff,i,limit: integer;
 | 
|---|
 | 1694 | begin
 | 
|---|
 | 1695 |   // Don't put critical sections around these ClientMgr accesses since
 | 
|---|
 | 1696 |   // this call is most often nested
 | 
|---|
 | 1697 |   Result := -1;
 | 
|---|
 | 1698 |   if (Enabled = True) then
 | 
|---|
 | 1699 |   begin
 | 
|---|
 | 1700 |     limit := ClientMgr.PerClientRpcHistoryLimit;
 | 
|---|
 | 1701 |     if (Count > limit ) then
 | 
|---|
 | 1702 |     begin
 | 
|---|
 | 1703 |       // This could happen since a client may reduce the max number
 | 
|---|
 | 1704 |       // of history entries on the fly and it may be less than what is
 | 
|---|
 | 1705 |       // already recorded.
 | 
|---|
 | 1706 |       diff := ClientMgr.PerClientRpcHistoryLimit - Count;
 | 
|---|
 | 1707 |       for i:=1 to diff do Delete(Count-1);  // Delete the extras
 | 
|---|
 | 1708 |     end else if (Count <= limit) then
 | 
|---|
 | 1709 |     begin
 | 
|---|
 | 1710 |       // If the history is full then delete the first one.
 | 
|---|
 | 1711 |       // The latest is added to the back
 | 
|---|
 | 1712 |       if (Count = limit) and (limit > 0) then Delete(0);
 | 
|---|
 | 1713 | 
 | 
|---|
 | 1714 |       Result := Add(Pointer(entry));
 | 
|---|
 | 1715 |       Assert(Result <> -1);
 | 
|---|
 | 1716 |     end;
 | 
|---|
 | 1717 |   end;
 | 
|---|
 | 1718 | end;
 | 
|---|
 | 1719 | 
 | 
|---|
 | 1720 | function RPCCallHistory.GetRPCCallEntryPtr(uniqueRpcId:Longword;
 | 
|---|
 | 1721 |                   out rpcEntryPtr:RPCCallHistoryEntryPointer)
 | 
|---|
 | 1722 |                   : ISharedBrokerErrorCode;
 | 
|---|
 | 1723 | var
 | 
|---|
 | 1724 |   i,entryCount:integer;
 | 
|---|
 | 1725 |   item: RPCCallHistoryEntry;
 | 
|---|
 | 1726 | begin
 | 
|---|
 | 1727 |   Result := UniqueRPCIdDoesNotExist;
 | 
|---|
 | 1728 |   rpcEntryPtr := nil;
 | 
|---|
 | 1729 | 
 | 
|---|
 | 1730 |   entryCount := Pred(Count);
 | 
|---|
 | 1731 | 
 | 
|---|
 | 1732 |   for i:=0 to entryCount do
 | 
|---|
 | 1733 |   begin
 | 
|---|
 | 1734 |     item := RPCCallHistoryEntry(self[i]);
 | 
|---|
 | 1735 |     if item <> nil then
 | 
|---|
 | 1736 |     begin
 | 
|---|
 | 1737 |       if item.UniqueRPCCallId = uniqueRpcId then
 | 
|---|
 | 1738 |       begin
 | 
|---|
 | 1739 |         rpcEntryPtr := @item;
 | 
|---|
 | 1740 |         Result := Success;
 | 
|---|
 | 1741 |         // We found one so exit the routine
 | 
|---|
 | 1742 |         Exit;
 | 
|---|
 | 1743 |       end;
 | 
|---|
 | 1744 |     end;
 | 
|---|
 | 1745 |   end;
 | 
|---|
 | 1746 | end;
 | 
|---|
 | 1747 | 
 | 
|---|
 | 1748 | function RPCCallHistory.GetRPCCallEntryPtrFromIndex(rpcCallIndex:Integer;
 | 
|---|
 | 1749 |                                    out rpcEntryPtr:RPCCallHistoryEntryPointer)
 | 
|---|
 | 1750 |                                    : ISharedBrokerErrorCode;
 | 
|---|
 | 1751 | begin
 | 
|---|
 | 1752 |   rpcEntryPtr := nil;
 | 
|---|
 | 1753 |   Result := RPCHistoryIndexOutOfRange;
 | 
|---|
 | 1754 | 
 | 
|---|
 | 1755 |   if (rpcCallIndex > 0) and (rpcCallIndex <= Count) then
 | 
|---|
 | 1756 |   begin
 | 
|---|
 | 1757 |     rpcEntryPtr := self[rpcCallIndex];
 | 
|---|
 | 1758 |     Result := Success;
 | 
|---|
 | 1759 |   end;
 | 
|---|
 | 1760 | end;
 | 
|---|
 | 1761 | 
 | 
|---|
 | 1762 | function RPCCallHistory.GetRPCCallClientId(uniqueRpcId:Integer;
 | 
|---|
 | 1763 |                                    out uniqueClientId:Integer)
 | 
|---|
 | 1764 |                                    : ISharedBrokerErrorCode;
 | 
|---|
 | 1765 | var
 | 
|---|
 | 1766 |   rpcEntryPtr : RPCCallHistoryEntryPointer;
 | 
|---|
 | 1767 | begin
 | 
|---|
 | 1768 |   Result := GetRPCCallEntryPtr(uniqueRpcId,rpcEntryPtr);
 | 
|---|
 | 1769 |   if (Result = Success) and (rpcEntryPtr <> nil)then
 | 
|---|
 | 1770 |     uniqueClientId := rpcEntryPtr^.BrokerUniqueClientId
 | 
|---|
 | 1771 |   else
 | 
|---|
 | 1772 |     uniqueClientId := 0;
 | 
|---|
 | 1773 | end;
 | 
|---|
 | 1774 | 
 | 
|---|
 | 1775 | 
 | 
|---|
 | 1776 | {
 | 
|---|
 | 1777 | procedure TSharedBroker.EventSinkChanged(const EventSink: IUnknown);
 | 
|---|
 | 1778 | begin
 | 
|---|
 | 1779 |   FEvents := EventSink as ISharedBrokerEvents;
 | 
|---|
 | 1780 |   if FConnectionPoint <> nil then
 | 
|---|
 | 1781 |      FSinkList := FConnectionPoint.SinkList;
 | 
|---|
 | 1782 | end;
 | 
|---|
 | 1783 | 
 | 
|---|
 | 1784 | procedure TSharedBroker.Initialize;
 | 
|---|
 | 1785 | begin
 | 
|---|
 | 1786 |   inherited Initialize;
 | 
|---|
 | 1787 |   FConnectionPoints := TConnectionPoints.Create(Self);
 | 
|---|
 | 1788 |   if AutoFactory.EventTypeInfo <> nil then
 | 
|---|
 | 1789 |     FConnectionPoint := FConnectionPoints.CreateConnectionPoint(
 | 
|---|
 | 1790 |       AutoFactory.EventIID, ckSingle, EventConnect)
 | 
|---|
 | 1791 |   else FConnectionPoint := nil;
 | 
|---|
 | 1792 | end;
 | 
|---|
 | 1793 | 
 | 
|---|
 | 1794 | 
 | 
|---|
 | 1795 | function TSharedBroker.BrokerConnect(const ClientName: WideString;
 | 
|---|
 | 1796 |   ConnectionType: ISharedBrokerClient; const ServerPort: WideString;
 | 
|---|
 | 1797 |   WantDebug, AllowShared: WordBool; RpcTimeLimit: SYSINT;
 | 
|---|
 | 1798 |   out UniqueClientId: SYSINT): ISharedBrokerErrorCode;
 | 
|---|
 | 1799 | begin
 | 
|---|
 | 1800 | 
 | 
|---|
 | 1801 | end;
 | 
|---|
 | 1802 | 
 | 
|---|
 | 1803 | function TSharedBroker.BrokerCall(const RpcName, RpcParams: WideString;
 | 
|---|
 | 1804 |   RpcTimeLimit: Integer; out RpcResults: WideString;
 | 
|---|
 | 1805 |   out UniqueRpcCallId: Integer): ISharedBrokerErrorCode;
 | 
|---|
 | 1806 | begin
 | 
|---|
 | 1807 | 
 | 
|---|
 | 1808 | end;
 | 
|---|
 | 1809 | 
 | 
|---|
 | 1810 | function TSharedBroker.BrokerDisconnect: ISharedBrokerErrorCode;
 | 
|---|
 | 1811 | begin
 | 
|---|
 | 1812 | 
 | 
|---|
 | 1813 | end;
 | 
|---|
 | 1814 | 
 | 
|---|
 | 1815 | function TSharedBroker.BrokerSetContext(
 | 
|---|
 | 1816 |   const OptionName: WideString): ISharedBrokerErrorCode;
 | 
|---|
 | 1817 | begin
 | 
|---|
 | 1818 | 
 | 
|---|
 | 1819 | end;
 | 
|---|
 | 1820 | 
 | 
|---|
 | 1821 | function TSharedBroker.ReadRegDataDefault(const Root, Key, Name,
 | 
|---|
 | 1822 |   Default: WideString; out RegResult: WideString): ISharedBrokerErrorCode;
 | 
|---|
 | 1823 | begin
 | 
|---|
 | 1824 | 
 | 
|---|
 | 1825 | end;
 | 
|---|
 | 1826 | 
 | 
|---|
 | 1827 | function TSharedBroker.Get_PerClientRpcHistoryLimit: Integer;
 | 
|---|
 | 1828 | begin
 | 
|---|
 | 1829 | 
 | 
|---|
 | 1830 | end;
 | 
|---|
 | 1831 | 
 | 
|---|
 | 1832 | function TSharedBroker.Get_RpcHistoryEnabled: WordBool;
 | 
|---|
 | 1833 | begin
 | 
|---|
 | 1834 | 
 | 
|---|
 | 1835 | end;
 | 
|---|
 | 1836 | 
 | 
|---|
 | 1837 | function TSharedBroker.Get_RpcVersion: WideString;
 | 
|---|
 | 1838 | begin
 | 
|---|
 | 1839 | 
 | 
|---|
 | 1840 | end;
 | 
|---|
 | 1841 | 
 | 
|---|
 | 1842 | procedure TSharedBroker.Set_PerClientRpcHistoryLimit(limit: Integer);
 | 
|---|
 | 1843 | begin
 | 
|---|
 | 1844 | 
 | 
|---|
 | 1845 | end;
 | 
|---|
 | 1846 | 
 | 
|---|
 | 1847 | procedure TSharedBroker.Set_RpcHistoryEnabled(enabled: WordBool);
 | 
|---|
 | 1848 | begin
 | 
|---|
 | 1849 | 
 | 
|---|
 | 1850 | end;
 | 
|---|
 | 1851 | 
 | 
|---|
 | 1852 | procedure TSharedBroker.Set_RpcVersion(const version: WideString);
 | 
|---|
 | 1853 | begin
 | 
|---|
 | 1854 | 
 | 
|---|
 | 1855 | end;
 | 
|---|
 | 1856 | 
 | 
|---|
 | 1857 | function TSharedBroker.GetActiveBrokerConnectionIndexCount(
 | 
|---|
 | 1858 |   out connectionIndexCount: Integer): ISharedBrokerErrorCode;
 | 
|---|
 | 1859 | begin
 | 
|---|
 | 1860 | 
 | 
|---|
 | 1861 | end;
 | 
|---|
 | 1862 | 
 | 
|---|
 | 1863 | function TSharedBroker.GetActiveBrokerConnectionIndexFromUniqueClientId(
 | 
|---|
 | 1864 |   uniqueClientId: Integer;
 | 
|---|
 | 1865 |   out connectionIndex: Integer): ISharedBrokerErrorCode;
 | 
|---|
 | 1866 | begin
 | 
|---|
 | 1867 | 
 | 
|---|
 | 1868 | end;
 | 
|---|
 | 1869 | 
 | 
|---|
 | 1870 | function TSharedBroker.GetActiveBrokerConnectionInfo(
 | 
|---|
 | 1871 |   connectionIndex: Integer; out connectedServerIp: WideString;
 | 
|---|
 | 1872 |   out connectedServerPort: Integer;
 | 
|---|
 | 1873 |   out lastContext: WideString): ISharedBrokerErrorCode;
 | 
|---|
 | 1874 | begin
 | 
|---|
 | 1875 | 
 | 
|---|
 | 1876 | end;
 | 
|---|
 | 1877 | 
 | 
|---|
 | 1878 | function TSharedBroker.GetClientIdAndNameFromIndex(clientIndex: Integer;
 | 
|---|
 | 1879 |   out uniqueClientId: Integer;
 | 
|---|
 | 1880 |   out clientName: WideString): ISharedBrokerErrorCode;
 | 
|---|
 | 1881 | begin
 | 
|---|
 | 1882 | 
 | 
|---|
 | 1883 | end;
 | 
|---|
 | 1884 | 
 | 
|---|
 | 1885 | function TSharedBroker.GetClientNameFromUniqueClientId(
 | 
|---|
 | 1886 |   uniqueClientId: Integer;
 | 
|---|
 | 1887 |   out clientName: WideString): ISharedBrokerErrorCode;
 | 
|---|
 | 1888 | begin
 | 
|---|
 | 1889 | 
 | 
|---|
 | 1890 | end;
 | 
|---|
 | 1891 | 
 | 
|---|
 | 1892 | function TSharedBroker.GetRpcHistoryCountForClient(uniqueClientId: Integer;
 | 
|---|
 | 1893 |   out rpcHistoryCount: Integer): ISharedBrokerErrorCode;
 | 
|---|
 | 1894 | begin
 | 
|---|
 | 1895 | 
 | 
|---|
 | 1896 | end;
 | 
|---|
 | 1897 | 
 | 
|---|
 | 1898 | function TSharedBroker.LogoutConnectedClients(
 | 
|---|
 | 1899 |   logoutTimeLimit: Integer): ISharedBrokerErrorCode;
 | 
|---|
 | 1900 | begin
 | 
|---|
 | 1901 | 
 | 
|---|
 | 1902 | end;
 | 
|---|
 | 1903 | 
 | 
|---|
 | 1904 | function TSharedBroker.GetRpcCallFromHistoryIndex(uniqueClientId,
 | 
|---|
 | 1905 |   rpcCallIndex: Integer; out uniqueRpcId: Integer; out brokerContext,
 | 
|---|
 | 1906 |   rpcName, rpcParams, rpcResult: WideString; out rpcStartDateTime: Double;
 | 
|---|
 | 1907 |   out rpcDuration: Integer): ISharedBrokerErrorCode;
 | 
|---|
 | 1908 | begin
 | 
|---|
 | 1909 | 
 | 
|---|
 | 1910 | end;
 | 
|---|
 | 1911 | 
 | 
|---|
 | 1912 | function TSharedBroker.GetRpcClientIdFromHistory(uniqueRpcId: Integer;
 | 
|---|
 | 1913 |   out uniqueClientId: Integer;
 | 
|---|
 | 1914 |   out clientName: WideString): ISharedBrokerErrorCode;
 | 
|---|
 | 1915 | begin
 | 
|---|
 | 1916 | 
 | 
|---|
 | 1917 | end;
 | 
|---|
 | 1918 | 
 | 
|---|
 | 1919 | function TSharedBroker.GetConnectedClientCount(
 | 
|---|
 | 1920 |   out connectedClientCount: Integer): ISharedBrokerErrorCode;
 | 
|---|
 | 1921 | begin
 | 
|---|
 | 1922 | 
 | 
|---|
 | 1923 | end;
 | 
|---|
 | 1924 | }
 | 
|---|
 | 1925 | 
 | 
|---|
 | 1926 | {
 | 
|---|
 | 1927 | function TSharedBroker.GetRpcCallFromHistory(uniqueRpcId: Integer;
 | 
|---|
 | 1928 |   out uniqueClientId: Integer; out brokerContext, rpcName, rpcParams,
 | 
|---|
 | 1929 |   rpcResult: WideString; out rpcStartDateTime: Double;
 | 
|---|
 | 1930 |   out rpcDuration: Integer): ISharedBrokerErrorCode;
 | 
|---|
 | 1931 | begin
 | 
|---|
 | 1932 |  //
 | 
|---|
 | 1933 | end;
 | 
|---|
 | 1934 | }
 | 
|---|
 | 1935 | function TSharedBroker.Get_CurrentContext: WideString;
 | 
|---|
 | 1936 | begin
 | 
|---|
 | 1937 |   if FBrokerConnection <> nil then
 | 
|---|
 | 1938 |   begin
 | 
|---|
 | 1939 |     Result := FBrokerConnection.FBroker.CurrentContext;
 | 
|---|
 | 1940 |   end else
 | 
|---|
 | 1941 |   begin
 | 
|---|
 | 1942 |     // Don't know what else to make this if we don't actually have a TRPCBroker to ask
 | 
|---|
 | 1943 |     Result := '';
 | 
|---|
 | 1944 |   end;
 | 
|---|
 | 1945 | end;
 | 
|---|
 | 1946 | 
 | 
|---|
 | 1947 | function TSharedBroker.Get_KernelLogin: WordBool;
 | 
|---|
 | 1948 | begin
 | 
|---|
 | 1949 |   if FBrokerConnection <> nil then
 | 
|---|
 | 1950 |   begin
 | 
|---|
 | 1951 |     Result := FBrokerConnection.FBroker.KernelLogin;
 | 
|---|
 | 1952 |   end else
 | 
|---|
 | 1953 |   begin
 | 
|---|
 | 1954 |     // Don't know what else to make this if we don't actually have a TRPCBroker to ask
 | 
|---|
 | 1955 |     Result := True;
 | 
|---|
 | 1956 |   end;
 | 
|---|
 | 1957 | end;
 | 
|---|
 | 1958 | 
 | 
|---|
 | 1959 | function TSharedBroker.Get_Login: WideString;
 | 
|---|
 | 1960 | 
 | 
|---|
 | 1961 |    function TorF1(Value: Boolean): String;
 | 
|---|
 | 1962 |    begin
 | 
|---|
 | 1963 |      Result := '0';
 | 
|---|
 | 1964 |      if Value then
 | 
|---|
 | 1965 |        Result := '1';
 | 
|---|
 | 1966 |    end;
 | 
|---|
 | 1967 |    
 | 
|---|
 | 1968 | const
 | 
|---|
 | 1969 |   SEP_FS = #28;
 | 
|---|
 | 1970 |   SEP_GS = #29;
 | 
|---|
 | 1971 | var
 | 
|---|
 | 1972 |   I: Integer;
 | 
|---|
 | 1973 |   Str: String;
 | 
|---|
 | 1974 |   ModeVal: String;
 | 
|---|
 | 1975 |   DivLst: String;
 | 
|---|
 | 1976 |   MultiDiv: String;
 | 
|---|
 | 1977 |   PromptDiv: String;
 | 
|---|
 | 1978 |   StrFS, StrGS: String;
 | 
|---|
 | 1979 | begin
 | 
|---|
 | 1980 |   //TODO
 | 
|---|
 | 1981 |   if FBrokerConnection <> nil then
 | 
|---|
 | 1982 |     with FBrokerConnection.FBroker.Login do
 | 
|---|
 | 1983 |     begin
 | 
|---|
 | 1984 |       StrFS := SEP_FS;
 | 
|---|
 | 1985 |       StrGS := SEP_GS;
 | 
|---|
 | 1986 |       ModeVal := '';
 | 
|---|
 | 1987 |       if Mode = lmAVCodes then
 | 
|---|
 | 1988 |         ModeVal := '1'
 | 
|---|
 | 1989 |       else if Mode = lmAppHandle then
 | 
|---|
 | 1990 |         ModeVal := '2'
 | 
|---|
 | 1991 |       else if Mode = lmNTToken then
 | 
|---|
 | 1992 |         ModeVal := '3';
 | 
|---|
 | 1993 |       DivLst := '';
 | 
|---|
 | 1994 |       for i := 0 to Pred(DivList.Count) do
 | 
|---|
 | 1995 |         DivLst := DivLst + DivList[i] + SEP_GS;
 | 
|---|
 | 1996 |       MultiDiv := TorF1(MultiDivision);
 | 
|---|
 | 1997 |       PromptDiv := TorF1(PromptDivision);
 | 
|---|
 | 1998 |       Str := LoginHandle + StrFS + NTToken + StrFS + AccessCode + StrFS;
 | 
|---|
 | 1999 |       Str := Str + VerifyCode + StrFS + Division + StrFS + ModeVal + StrFS;
 | 
|---|
 | 2000 |       Str := Str + DivLst + StrFS + MultiDiv + StrFS + DUZ + StrFS;
 | 
|---|
 | 2001 |       Str := Str + PromptDiv + StrFS;
 | 
|---|
 | 2002 |     end;  // with
 | 
|---|
 | 2003 | end;
 | 
|---|
 | 2004 | 
 | 
|---|
 | 2005 | function TSharedBroker.Get_RpcbError: WideString;
 | 
|---|
 | 2006 | begin
 | 
|---|
 | 2007 |   if FBrokerConnection <> nil then
 | 
|---|
 | 2008 |   begin
 | 
|---|
 | 2009 |     Result := FBrokerConnection.FBroker.RPCBError;
 | 
|---|
 | 2010 |   end else
 | 
|---|
 | 2011 |   begin
 | 
|---|
 | 2012 |     // Don't know what else to make this if we don't actually have a TRPCBroker to ask
 | 
|---|
 | 2013 |     Result := '';
 | 
|---|
 | 2014 |   end;
 | 
|---|
 | 2015 | end;
 | 
|---|
 | 2016 | 
 | 
|---|
 | 2017 | function TSharedBroker.Get_ShowErrorMsgs: ISharedBrokerShowErrorMsgs;
 | 
|---|
 | 2018 | begin
 | 
|---|
 | 2019 |   Result := isemRaise;
 | 
|---|
 | 2020 |   if FBrokerConnection <> nil then
 | 
|---|
 | 2021 |     if FBrokerConnection.FBroker.ShowErrorMsgs = semQuiet then
 | 
|---|
 | 2022 |       Result := isemQuiet;
 | 
|---|
 | 2023 | end;
 | 
|---|
 | 2024 | 
 | 
|---|
 | 2025 | function TSharedBroker.Get_Socket: Integer;
 | 
|---|
 | 2026 | begin
 | 
|---|
 | 2027 |   Result := 0;
 | 
|---|
 | 2028 |   if FBrokerConnection <> nil then
 | 
|---|
 | 2029 |     Result := FBrokerConnection.FBroker.Socket;
 | 
|---|
 | 2030 | end;
 | 
|---|
 | 2031 | 
 | 
|---|
 | 2032 | function TSharedBroker.Get_User: WideString;
 | 
|---|
 | 2033 | const
 | 
|---|
 | 2034 |   SEP_FS = #28;
 | 
|---|
 | 2035 | var
 | 
|---|
 | 2036 |   Str: String;
 | 
|---|
 | 2037 | begin
 | 
|---|
 | 2038 |   Str := '';
 | 
|---|
 | 2039 |   if FBrokerConnection <> nil then
 | 
|---|
 | 2040 |   begin
 | 
|---|
 | 2041 |     with FBrokerConnection.FBroker.User do
 | 
|---|
 | 2042 |     begin
 | 
|---|
 | 2043 |       Str := DUZ + SEP_FS + Name + SEP_FS + StandardName + SEP_FS;
 | 
|---|
 | 2044 |       Str := Str + Division + SEP_FS;
 | 
|---|
 | 2045 |       if VerifyCodeChngd then
 | 
|---|
 | 2046 |         Str := Str + '1' + SEP_FS
 | 
|---|
 | 2047 |       else
 | 
|---|
 | 2048 |         Str := Str + '0' + SEP_FS;
 | 
|---|
 | 2049 |       Str := Str + Title + SEP_FS + ServiceSection + SEP_FS;
 | 
|---|
 | 2050 |       Str := Str + Language + SEP_FS + DTime + SEP_FS;
 | 
|---|
 | 2051 |     end;    // with
 | 
|---|
 | 2052 |   end;
 | 
|---|
 | 2053 |   Result := WideString(Str);
 | 
|---|
 | 2054 | end;
 | 
|---|
 | 2055 | 
 | 
|---|
 | 2056 | procedure TSharedBroker.Set_KernelLogin(Value: WordBool);
 | 
|---|
 | 2057 | begin
 | 
|---|
 | 2058 |   if FBrokerConnection <> nil then
 | 
|---|
 | 2059 |     FBrokerConnection.FBroker.KernelLogin := Value;
 | 
|---|
 | 2060 | end;
 | 
|---|
 | 2061 | 
 | 
|---|
 | 2062 | procedure TSharedBroker.Set_Login(const Value: WideString);
 | 
|---|
 | 2063 | const
 | 
|---|
 | 2064 |   SEP_FS = #28;
 | 
|---|
 | 2065 |   SEP_GS = #29;
 | 
|---|
 | 2066 | var
 | 
|---|
 | 2067 |   Str: String;
 | 
|---|
 | 2068 |   StrFS, StrGS: String;
 | 
|---|
 | 2069 |   DivLst: String;
 | 
|---|
 | 2070 |   ModeVal: String;
 | 
|---|
 | 2071 | 
 | 
|---|
 | 2072 |   function TorF(Value: String): Boolean;
 | 
|---|
 | 2073 |   begin
 | 
|---|
 | 2074 |     Result := False;
 | 
|---|
 | 2075 |     if Value = '1' then
 | 
|---|
 | 2076 |       Result := True;
 | 
|---|
 | 2077 |   end;
 | 
|---|
 | 2078 | 
 | 
|---|
 | 2079 | begin
 | 
|---|
 | 2080 |   Str := Value;
 | 
|---|
 | 2081 |   if FBrokerConnection <> nil then
 | 
|---|
 | 2082 |     with FBrokerConnection.FBroker.Login do
 | 
|---|
 | 2083 |     begin
 | 
|---|
 | 2084 |       StrFS := SEP_FS;
 | 
|---|
 | 2085 |       StrGS := SEP_GS;
 | 
|---|
 | 2086 |       LoginHandle := Piece(Str,StrFS,1);
 | 
|---|
 | 2087 |       NTToken := Piece(Str,StrFS,2);
 | 
|---|
 | 2088 |       AccessCode := Piece(Str,StrFS,3);
 | 
|---|
 | 2089 |       VerifyCode := Piece(Str,StrFS,4);
 | 
|---|
 | 2090 |       Division := Piece(Str,StrFS,5);
 | 
|---|
 | 2091 |       ModeVal := Piece(Str,StrFS,6);
 | 
|---|
 | 2092 |       DivLst := Piece(Str,StrFS,7);
 | 
|---|
 | 2093 |       MultiDivision := TorF(Piece(Str,StrFS,8));
 | 
|---|
 | 2094 |       DUZ := Piece(Str,StrFS,9);
 | 
|---|
 | 2095 |       PromptDivision := TorF(Piece(Str,StrFS,10));
 | 
|---|
 | 2096 |       if ModeVal = '1' then
 | 
|---|
 | 2097 |         Mode := lmAVCodes
 | 
|---|
 | 2098 |       else if ModeVal = '2' then
 | 
|---|
 | 2099 |         Mode := lmAppHandle
 | 
|---|
 | 2100 |       else if ModeVal = '3' then
 | 
|---|
 | 2101 |         Mode := lmNTToken;
 | 
|---|
 | 2102 |     end;  // with
 | 
|---|
 | 2103 | end;
 | 
|---|
 | 2104 | 
 | 
|---|
 | 2105 | procedure TSharedBroker.Set_ShowErrorMsgs(
 | 
|---|
 | 2106 |   Value: ISharedBrokerShowErrorMsgs);
 | 
|---|
 | 2107 | begin
 | 
|---|
 | 2108 |   if FBrokerConnection <> nil then
 | 
|---|
 | 2109 |   begin
 | 
|---|
 | 2110 |     if Value = isemRaise then
 | 
|---|
 | 2111 |       FBrokerConnection.FBroker.ShowErrorMsgs := semRaise
 | 
|---|
 | 2112 |     else
 | 
|---|
 | 2113 |       FBrokerConnection.FBroker.ShowErrorMsgs := semQuiet;
 | 
|---|
 | 2114 |   end;
 | 
|---|
 | 2115 | end;
 | 
|---|
 | 2116 | 
 | 
|---|
 | 2117 | 
 | 
|---|
 | 2118 | initialization
 | 
|---|
 | 2119 |   TAutoObjectFactory.Create(ComServer, TSharedBroker, Class_SharedBroker,
 | 
|---|
 | 2120 |     ciMultiInstance, tmApartment);
 | 
|---|
 | 2121 |   ClientMgr := TSharedBrokerClientMgr.Create();
 | 
|---|
 | 2122 |   Application.OnIdle := ClientMgr.OnIdleEventHandler;
 | 
|---|
 | 2123 | 
 | 
|---|
 | 2124 | finalization
 | 
|---|
 | 2125 |   ClientMgr.Free;
 | 
|---|
 | 2126 |   ClientMgr := nil;
 | 
|---|
 | 2127 | end.
 | 
|---|