| 1 | unit fSharedBrokerDebugger;
 | 
|---|
| 2 | 
 | 
|---|
| 3 | interface
 | 
|---|
| 4 | 
 | 
|---|
| 5 | uses
 | 
|---|
| 6 |   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 | 
|---|
| 7 |   StdCtrls, OleServer, CheckLst, ComCtrls,
 | 
|---|
| 8 |   Menus, RPCSharedBrokerSessionMgr1_TLB;
 | 
|---|
| 9 | 
 | 
|---|
| 10 | type
 | 
|---|
| 11 | 
 | 
|---|
| 12 |   TfrmSharedBrokerDebugger = class(TForm)
 | 
|---|
| 13 |     Label1: TLabel;
 | 
|---|
| 14 |     Label2: TLabel;
 | 
|---|
| 15 |     Label3: TLabel;
 | 
|---|
| 16 |     btnExit: TButton;
 | 
|---|
| 17 |     EnableRpcCallLogForAllClientsCheckBox: TCheckBox;
 | 
|---|
| 18 |     mVistaSession: TSharedBroker;
 | 
|---|
| 19 |     CurrentClientsCheckedListBox: TCheckListBox;
 | 
|---|
| 20 |     actualBrokerConnectionsCheckedListBox: TCheckListBox;
 | 
|---|
| 21 |     RpcCallLogListBox: TListBox;
 | 
|---|
| 22 |     maxAllClientRpcLogEntriesNumericUpDown: TEdit;
 | 
|---|
| 23 |     UpDown1: TUpDown;
 | 
|---|
| 24 |     lblMaxRPCEntries: TLabel;
 | 
|---|
| 25 |     MainMenu1: TMainMenu;
 | 
|---|
| 26 |     File1: TMenuItem;
 | 
|---|
| 27 |     Exit1: TMenuItem;
 | 
|---|
| 28 |     Edit1: TMenuItem;
 | 
|---|
| 29 |     Help1: TMenuItem;
 | 
|---|
| 30 |     About1: TMenuItem;
 | 
|---|
| 31 |     CopyConnectionsLogToClipboard1: TMenuItem;
 | 
|---|
| 32 |     clientConnectionsLogRichTextBox: TRichEdit;
 | 
|---|
| 33 |     Label4: TLabel;
 | 
|---|
| 34 |     Label5: TLabel;
 | 
|---|
| 35 |     procedure FormCreate(Sender: TObject);
 | 
|---|
| 36 |     procedure FormDestroy(Sender: TObject);
 | 
|---|
| 37 |     procedure btnExitClick(Sender: TObject);
 | 
|---|
| 38 |     procedure actualBrokerConnectionsCheckedListBoxClickCheck(
 | 
|---|
| 39 |       Sender: TObject);
 | 
|---|
| 40 |     procedure Exit1Click(Sender: TObject);
 | 
|---|
| 41 |     procedure About1Click(Sender: TObject);
 | 
|---|
| 42 |     procedure CopyConnectionsLogToClipboard1Click(Sender: TObject);
 | 
|---|
| 43 |     procedure CurrentClientsCheckedListBoxClickCheck(Sender: TObject);
 | 
|---|
| 44 |   private
 | 
|---|
| 45 |     { Private declarations }
 | 
|---|
| 46 |     mClients: TList;    // List of broker type clients of the server that are connected.
 | 
|---|
| 47 |                         // debugger type clients are not included
 | 
|---|
| 48 |     mConnections: TList;
 | 
|---|
| 49 |     mDoingAForcedLogoutOfClients: Boolean;
 | 
|---|
| 50 |     mOnLogoutPending: Boolean;
 | 
|---|
| 51 | 
 | 
|---|
| 52 |   protected
 | 
|---|
| 53 |     procedure OnClientConnectEventHandler(Sender: TObject; uniqueClientId: Integer;
 | 
|---|
| 54 |                     connection: ISharedBrokerConnection);
 | 
|---|
| 55 |     procedure OnRpcCallRecordedEventHandler(Sender: TObject; uniqueRpcId: Integer);
 | 
|---|
| 56 |     procedure OnClientDisconnectEventHandler(Sender: TObject; uniqueClientId: Integer);
 | 
|---|
| 57 |     procedure OnContextChangedEventHandler(Sender: TObject; connectionIndex: Integer; var newContext: OleVariant);
 | 
|---|
| 58 |   public
 | 
|---|
| 59 |     { Public declarations }
 | 
|---|
| 60 |     procedure RebuildClientList(uniqueClientId: Integer);
 | 
|---|
| 61 |     procedure RebuildConnectionList;
 | 
|---|
| 62 |   end;
 | 
|---|
| 63 | 
 | 
|---|
| 64 | const
 | 
|---|
| 65 |   kNoUniqueClientId: integer = -1;
 | 
|---|
| 66 |   KInvalidConnectionIndex: Integer = -1;
 | 
|---|
| 67 | 
 | 
|---|
| 68 | var
 | 
|---|
| 69 |   frmSharedBrokerDebugger: TfrmSharedBrokerDebugger;
 | 
|---|
| 70 |   mClients: TList;
 | 
|---|
| 71 |   mConnections: TList;
 | 
|---|
| 72 | 
 | 
|---|
| 73 | implementation
 | 
|---|
| 74 | 
 | 
|---|
| 75 | uses
 | 
|---|
| 76 |   uClientInfo, uBrokerConnectionInfo, uRpcLogEntry, frmVistAAbout;
 | 
|---|
| 77 | 
 | 
|---|
| 78 | {$R *.DFM}
 | 
|---|
| 79 | 
 | 
|---|
| 80 | {
 | 
|---|
| 81 |     /// <summary>
 | 
|---|
| 82 |     /// The main entry point for the application.
 | 
|---|
| 83 |     /// </summary>
 | 
|---|
| 84 |     [STAThread]
 | 
|---|
| 85 | 
 | 
|---|
| 86 |     static void Main()
 | 
|---|
| 87 | 
 | 
|---|
| 88 |       Application.Run(new Form1());
 | 
|---|
| 89 | }
 | 
|---|
| 90 | {
 | 
|---|
| 91 | function TfrmSharedBrokerDebugger.OnLogoutEventHandler; integer;
 | 
|---|
| 92 | begin
 | 
|---|
| 93 |       mOnLogoutPending := true;
 | 
|---|
| 94 |       return 1;
 | 
|---|
| 95 | end;
 | 
|---|
| 96 | 
 | 
|---|
| 97 | procedure TfrmSharedBrokerDebugger.OnIdleEventHandler(object sender, EventArgs e)
 | 
|---|
| 98 | begin
 | 
|---|
| 99 |   if (mOnLogoutPending) then
 | 
|---|
| 100 |   begin
 | 
|---|
| 101 |     CloseDownVistaSession();
 | 
|---|
| 102 |     if (mDoingAForcedLogoutOfClients <> true) then
 | 
|---|
| 103 |     begin
 | 
|---|
| 104 |     // Don't do an Application Exit here.
 | 
|---|
| 105 |     // Should really send a close event on the main window
 | 
|---|
| 106 |     // Exiting here causes the server to loose its connection and blow up since
 | 
|---|
| 107 |     // control doesn't return till after this application is gone, and then
 | 
|---|
| 108 |     // the pointer references on the server are bogus
 | 
|---|
| 109 |       Application.Exit();
 | 
|---|
| 110 |     end;
 | 
|---|
| 111 |   mDoingAForcedLogoutOfClients := false;
 | 
|---|
| 112 |   mOnLogoutPending := false;
 | 
|---|
| 113 |   end;
 | 
|---|
| 114 | end;
 | 
|---|
| 115 | }
 | 
|---|
| 116 | procedure TfrmSharedBrokerDebugger.OnClientConnectEventHandler(Sender: TObject; uniqueClientId: Integer;
 | 
|---|
| 117 |                                                             connection: ISharedBrokerConnection);
 | 
|---|
| 118 | var
 | 
|---|
| 119 |   connectionTypeName: string;
 | 
|---|
| 120 |   outString: String;
 | 
|---|
| 121 |   ClientName: WideString;
 | 
|---|
| 122 |   ErrorCode: ISharedBrokerErrorCode;
 | 
|---|
| 123 | begin
 | 
|---|
| 124 |       case (connection) of
 | 
|---|
| 125 |         New:
 | 
|---|
| 126 |           connectionTypeName := 'New';
 | 
|---|
| 127 |         Shared:
 | 
|---|
| 128 |           connectionTypeName := 'Shared';
 | 
|---|
| 129 |         Debug:
 | 
|---|
| 130 |           connectionTypeName := 'Debug';
 | 
|---|
| 131 |         else
 | 
|---|
| 132 |           connectionTypeName := 'Failed';
 | 
|---|
| 133 |         end;
 | 
|---|
| 134 | 
 | 
|---|
| 135 |       Assert(mVistaSession <> nil);
 | 
|---|
| 136 | 
 | 
|---|
| 137 |       errorCode := mVistaSession.GetClientNameFromUniqueClientId(uniqueClientId, clientName);
 | 
|---|
| 138 |       if (errorCode = Success) then
 | 
|---|
| 139 |       begin
 | 
|---|
| 140 |         outString := 'connect ['+connectionTypeName+'] >  '+clientName+'  id:='+IntToStr(uniqueClientId)+FormatDateTime('   hh:nn:ss mm/dd/yy',Now);
 | 
|---|
| 141 |         clientConnectionsLogRichTextBox.Lines.Add(outString);
 | 
|---|
| 142 |       end
 | 
|---|
| 143 |       else
 | 
|---|
| 144 |       begin
 | 
|---|
| 145 |         // need to throw a debugger exception here
 | 
|---|
| 146 |         Assert(false);
 | 
|---|
| 147 |       end;
 | 
|---|
| 148 | 
 | 
|---|
| 149 |       RebuildClientList(uniqueClientId);
 | 
|---|
| 150 |       RebuildConnectionList();
 | 
|---|
| 151 | end;
 | 
|---|
| 152 | 
 | 
|---|
| 153 | procedure TfrmSharedBrokerDebugger.OnClientDisconnectEventHandler(Sender: TObject; uniqueClientId: Integer);
 | 
|---|
| 154 | var
 | 
|---|
| 155 |   outString: String;
 | 
|---|
| 156 |   clientName: WideString;
 | 
|---|
| 157 |   foundOne: Boolean;
 | 
|---|
| 158 |   CInfo: TClientInfo;
 | 
|---|
| 159 |   ErrorCode: ISharedBrokerErrorCode;
 | 
|---|
| 160 |   i: Integer;
 | 
|---|
| 161 | begin
 | 
|---|
| 162 |   clientName := 'ERROR';
 | 
|---|
| 163 |   foundOne := false;
 | 
|---|
| 164 | 
 | 
|---|
| 165 |   Assert(mVistaSession <> nil);
 | 
|---|
| 166 |       
 | 
|---|
| 167 |   errorCode := mVistaSession.GetClientNameFromUniqueClientId(uniqueClientId, clientName);
 | 
|---|
| 168 |   if (errorCode = UniqueClientIdDoesNotExist) then
 | 
|---|
| 169 |   begin
 | 
|---|
| 170 |     // General the client should be disconnected and not available any more
 | 
|---|
| 171 |     // so lets look in our local client list for the name to print dialog.
 | 
|---|
| 172 |     for i:=0 to Pred(mClients.Count) do
 | 
|---|
| 173 |     begin
 | 
|---|
| 174 |       cInfo := TClientInfo(mClients[i]);
 | 
|---|
| 175 |       if (cInfo.UniqueId = uniqueClientId) then
 | 
|---|
| 176 |       begin
 | 
|---|
| 177 |         clientName := cInfo.Name;
 | 
|---|
| 178 |         foundOne := true;
 | 
|---|
| 179 |         break;
 | 
|---|
| 180 |       end;
 | 
|---|
| 181 |     end;
 | 
|---|
| 182 |   end;
 | 
|---|
| 183 | 
 | 
|---|
| 184 |   if (foundOne) then
 | 
|---|
| 185 |   begin
 | 
|---|
| 186 |     outString := 'disconnect > '+clientName+'   id:='+ IntToStr(uniqueClientId) + FormatDateTime('   hh:nn:ss mm/dd/yy',Now);
 | 
|---|
| 187 |         clientConnectionsLogRichTextBox.Lines.Add(outString);
 | 
|---|
| 188 | 
 | 
|---|
| 189 |         RebuildClientList(uniqueClientId);
 | 
|---|
| 190 |         RebuildConnectionList();
 | 
|---|
| 191 |       end;
 | 
|---|
| 192 | end;
 | 
|---|
| 193 | 
 | 
|---|
| 194 |     /// <summary>
 | 
|---|
| 195 |     /// OnRpcCallRecordedEventHandler handles the OnRpcCallRecorded event
 | 
|---|
| 196 |     /// from the COM interface
 | 
|---|
| 197 |     /// </summary>
 | 
|---|
| 198 |     /// <param name:='uniqueRpcId'></param>
 | 
|---|
| 199 |     /// <returns></returns>
 | 
|---|
| 200 | procedure TfrmSharedBrokerDebugger.OnRpcCallRecordedEventHandler(Sender: TObject; uniqueRpcId: Integer);
 | 
|---|
| 201 | var
 | 
|---|
| 202 |   UniqueClientId: Integer;
 | 
|---|
| 203 |   Context: WideString;
 | 
|---|
| 204 |   RpcName: WideString;
 | 
|---|
| 205 |   RpcParams: WideString;
 | 
|---|
| 206 |   ClientName: WideString;
 | 
|---|
| 207 |   RpcEndDateTime: Double;
 | 
|---|
| 208 |   RpcDuration: Integer;
 | 
|---|
| 209 |   RpcResults: WideString;
 | 
|---|
| 210 |   CInfo, TempCInfo: TClientInfo;
 | 
|---|
| 211 |   LogEntry: TRpcLogEntry;
 | 
|---|
| 212 |   I: Integer;
 | 
|---|
| 213 |   ErrorCode: ISharedBrokerErrorCode;
 | 
|---|
| 214 | begin
 | 
|---|
| 215 |   cInfo:=nil;
 | 
|---|
| 216 | 
 | 
|---|
| 217 |       Assert(mVistaSession <> nil);
 | 
|---|
| 218 | 
 | 
|---|
| 219 |   errorCode := mVistaSession.GetRpcCallFromHistory(uniqueRpcId, uniqueClientId, context, rpcName, rpcParams, rpcResults, rpcEndDateTime, rpcDuration);
 | 
|---|
| 220 |   if (errorCode = Success) then
 | 
|---|
| 221 |   begin
 | 
|---|
| 222 |     errorCode := mVistaSession.GetClientNameFromUniqueClientId(uniqueClientId, clientName);
 | 
|---|
| 223 |     if (errorCode = Success) then
 | 
|---|
| 224 |     begin
 | 
|---|
| 225 |       for i:=0 to Pred(mClients.Count) do
 | 
|---|
| 226 |       begin
 | 
|---|
| 227 |         tempCInfo := (TClientInfo(mClients[i]));
 | 
|---|
| 228 |         if (tempCInfo.UniqueId = uniqueClientId) then
 | 
|---|
| 229 |         begin
 | 
|---|
| 230 |           cInfo := tempCInfo;
 | 
|---|
| 231 |           break;
 | 
|---|
| 232 |         end;
 | 
|---|
| 233 |       end;
 | 
|---|
| 234 |           Assert(cInfo <> nil);
 | 
|---|
| 235 | 
 | 
|---|
| 236 |       logEntry := TRpcLogEntry.Create(uniqueClientId,clientName,cInfo.BrokerConnectionIndex,uniqueRpcId,rpcEndDateTime,rpcDuration,context,rpcName,rpcParams,rpcResults);
 | 
|---|
| 237 |       if (enableRpcCallLogForAllClientsCheckBox.Checked) then
 | 
|---|
| 238 |       begin
 | 
|---|
| 239 |             // If the list is full we need to delete the 0th item till we have room for one.
 | 
|---|
| 240 |         while (rpcCallLogListBox.Items.Count >= StrToInt(maxAllClientRpcLogEntriesNumericUpDown.Text)) do
 | 
|---|
| 241 |               rpcCallLogListBox.Items.Delete(0);
 | 
|---|
| 242 | 
 | 
|---|
| 243 |         rpcCallLogListBox.Items.AddObject(IntToStr(logEntry.UniqueClientId),logEntry);
 | 
|---|
| 244 |       end;
 | 
|---|
| 245 | 
 | 
|---|
| 246 |       cInfo.AddRpcLogEntry(LogEntry, false);
 | 
|---|
| 247 |   //    (TBrokerConnectionInfo(mConnections[cInfo.BrokerConnectionIndex])).AddRpcLogEntry(logEntry,false);
 | 
|---|
| 248 |       (TClientInfo(mConnections[cInfo.BrokerConnectionIndex])).AddRpcLogEntry(logEntry,false);
 | 
|---|
| 249 |     end
 | 
|---|
| 250 |     else
 | 
|---|
| 251 |     begin
 | 
|---|
| 252 |           // Need to throw and exception here
 | 
|---|
| 253 | //          Assert(false);
 | 
|---|
| 254 |     end;
 | 
|---|
| 255 |   end
 | 
|---|
| 256 |   else
 | 
|---|
| 257 |   begin
 | 
|---|
| 258 |         // Need to throw a debugger exception here
 | 
|---|
| 259 | //        Assert(false);
 | 
|---|
| 260 |   end;
 | 
|---|
| 261 | end;
 | 
|---|
| 262 | 
 | 
|---|
| 263 | procedure TfrmSharedBrokerDebugger.OnContextChangedEventHandler(Sender: TObject; connectionIndex: Integer; var newContext: OleVariant);
 | 
|---|
| 264 | var
 | 
|---|
| 265 |   bInfo: TBrokerConnectionInfo;
 | 
|---|
| 266 | begin
 | 
|---|
| 267 |   if (connectionIndex >=0) and (connectionIndex < mConnections.Count) then
 | 
|---|
| 268 |   begin
 | 
|---|
| 269 |     bInfo := TBrokerConnectionInfo(mConnections[connectionIndex]);
 | 
|---|
| 270 |     if (bInfo.LastContext <> newContext) then
 | 
|---|
| 271 |     begin
 | 
|---|
| 272 |       bInfo.LastContext := newContext;
 | 
|---|
| 273 |       RebuildConnectionList();
 | 
|---|
| 274 |     end;
 | 
|---|
| 275 |   end
 | 
|---|
| 276 |   else
 | 
|---|
| 277 |     Assert(false);
 | 
|---|
| 278 | end;
 | 
|---|
| 279 | {
 | 
|---|
| 280 | procedure TfrmSharedBrokerDebugger.OnClientRpcLogClosedEventHandler(object sender, EventArgs e)
 | 
|---|
| 281 | var
 | 
|---|
| 282 |   CInfo: TClientInfo;
 | 
|---|
| 283 | begin
 | 
|---|
| 284 |   cInfo := (ClientInfo)sender;
 | 
|---|
| 285 |   for i:=0 to Pred(mClients.Count) do
 | 
|---|
| 286 |   begin
 | 
|---|
| 287 |     if (cInfo.UniqueId=((ClientInfo)mClients[i]).UniqueId) then
 | 
|---|
| 288 |     begin
 | 
|---|
| 289 |       currentClientsCheckedListBox.SetItemChecked(i,false);
 | 
|---|
| 290 |       break;
 | 
|---|
| 291 |     end;
 | 
|---|
| 292 |   end;
 | 
|---|
| 293 | end;
 | 
|---|
| 294 | 
 | 
|---|
| 295 | 
 | 
|---|
| 296 | procedure TfrmSharedBrokerDebugger.OnConnectionRpcLogClosedEventHandler(object sender, EventArgs e)
 | 
|---|
| 297 | var
 | 
|---|
| 298 |   BInfo: TBrokerConnectionInfo;
 | 
|---|
| 299 | begin
 | 
|---|
| 300 |   bInfo := (TBrokerConnectionInfo)sender;
 | 
|---|
| 301 |   for i:=0 to Pred(mConnections.Count) do
 | 
|---|
| 302 |   begin
 | 
|---|
| 303 |     if (bInfo.ConnectionIndex = ((BrokerConnectionInfo)mConnections[i]).ConnectionIndex) then
 | 
|---|
| 304 |     begin
 | 
|---|
| 305 |       actualBrokerConnectionsCheckedListBox.SetItemChecked(i,false);
 | 
|---|
| 306 |       break;
 | 
|---|
| 307 |     end;
 | 
|---|
| 308 |   end;
 | 
|---|
| 309 | end;
 | 
|---|
| 310 | 
 | 
|---|
| 311 | 
 | 
|---|
| 312 | procedure TfrmSharedBrokerDebugger.SetupVistaSession;
 | 
|---|
| 313 | begin
 | 
|---|
| 314 |   if (mVistaSession = nil) then
 | 
|---|
| 315 |   begin
 | 
|---|
| 316 |     mVistaSession := TSharedBroker.Create;
 | 
|---|
| 317 | 
 | 
|---|
| 318 |         ISharedBrokerEvents_OnLogoutEventHandler OnLogoutEH := new ISharedBrokerEvents_OnLogoutEventHandler(this.OnLogoutEventHandler);
 | 
|---|
| 319 |         ISharedBrokerEvents_OnClientConnectEventHandler OnClientConnectEH := new ISharedBrokerEvents_OnClientConnectEventHandler(this.OnClientConnectEventHandler);
 | 
|---|
| 320 |         ISharedBrokerEvents_OnClientDisconnectEventHandler OnClientDisconnectEH := new ISharedBrokerEvents_OnClientDisconnectEventHandler(this.OnClientDisconnectEventHandler);
 | 
|---|
| 321 |         ISharedBrokerEvents_OnRpcCallRecordedEventHandler OnRpcCallRecorededEH := new ISharedBrokerEvents_OnRpcCallRecordedEventHandler(this.OnRpcCallRecordedEventHandler);
 | 
|---|
| 322 |         ISharedBrokerEvents_OnContextChangedEventHandler OnContextChangedEH := new ISharedBrokerEvents_OnContextChangedEventHandler(this.OnContextChangedEventHandler);
 | 
|---|
| 323 |         // Set up the event handlers here.
 | 
|---|
| 324 |         mVistaSession.OnClientConnect +:= OnClientConnectEH;
 | 
|---|
| 325 |         mVistaSession.OnClientDisconnect +:= OnClientDisconnectEH;
 | 
|---|
| 326 |         mVistaSession.OnRpcCallRecorded +:= OnRpcCallRecorededEH;
 | 
|---|
| 327 |         mVistaSession.OnLogout +:= OnLogoutEH;
 | 
|---|
| 328 |         mVistaSession.OnContextChanged +:= OnContextChangedEH;
 | 
|---|
| 329 | 
 | 
|---|
| 330 |         int uniqueClientId;
 | 
|---|
| 331 | 
 | 
|---|
| 332 |         // string listenerPort := ListenerPort.ToString();
 | 
|---|
| 333 |         ISharedBrokerErrorCode brokerError := mVistaSession.BrokerConnect(
 | 
|---|
| 334 |           Application.ExecutablePath, 
 | 
|---|
| 335 |           ISharedBrokerClient.DebuggerClient,
 | 
|---|
| 336 |           '',      // server/port pair is of no meaning in the debugger
 | 
|---|
| 337 |           false,   // debug mode is of no meaning in debugger
 | 
|---|
| 338 |           false,   // AllowShared connection is of no meaning in debugger
 | 
|---|
| 339 |           30,      // Connection time out limit
 | 
|---|
| 340 |           out uniqueClientId);
 | 
|---|
| 341 | 
 | 
|---|
| 342 |         Debug.Assert(brokerError = ISharedBrokerErrorCode.Success);
 | 
|---|
| 343 |         RebuildClientList(kNoUniqueClientId);
 | 
|---|
| 344 |     RebuildConnectionList();
 | 
|---|
| 345 |   end;
 | 
|---|
| 346 | end;
 | 
|---|
| 347 | 
 | 
|---|
| 348 | procedure TfrmSharedBrokerDebugger.CloseDownVistaSession;
 | 
|---|
| 349 | begin
 | 
|---|
| 350 |   if (mVistaSession <> nil) then
 | 
|---|
| 351 |   begin
 | 
|---|
| 352 |     mVistaSession.BrokerDisconnect();
 | 
|---|
| 353 |     mVistaSession.Dispose();
 | 
|---|
| 354 |     mVistaSession.Finalize();
 | 
|---|
| 355 |     mVistaSession := nil;
 | 
|---|
| 356 |   end;
 | 
|---|
| 357 | end;
 | 
|---|
| 358 | }
 | 
|---|
| 359 | procedure TfrmSharedBrokerDebugger.RebuildClientList(uniqueClientId: Integer);
 | 
|---|
| 360 | var
 | 
|---|
| 361 |   ErrorCode: ISharedBrokerErrorCode;
 | 
|---|
| 362 |   Count: Integer;
 | 
|---|
| 363 |   id: Integer;
 | 
|---|
| 364 |   Name: WideString;
 | 
|---|
| 365 |   ConnectIndex: Integer;
 | 
|---|
| 366 |   CInfo: TClientInfo;
 | 
|---|
| 367 |   i: Integer;
 | 
|---|
| 368 |   FoundIndex: Integer;
 | 
|---|
| 369 | begin
 | 
|---|
| 370 |   count := 0;
 | 
|---|
| 371 |   Assert(mVistaSession <> nil);
 | 
|---|
| 372 | 
 | 
|---|
| 373 |   errorCode := mVistaSession.GetConnectedClientCount(count);
 | 
|---|
| 374 |   if (errorCode = Success) then
 | 
|---|
| 375 |   begin
 | 
|---|
| 376 |     id        := kNoUniqueClientId;
 | 
|---|
| 377 |     name      := '';
 | 
|---|
| 378 |     connectIndex  := kInvalidConnectionIndex;
 | 
|---|
| 379 | 
 | 
|---|
| 380 |     if (uniqueClientId = kNoUniqueClientId) or (count = mClients.Count) then
 | 
|---|
| 381 |     begin
 | 
|---|
| 382 |       // Hide any open RPC logger windows
 | 
|---|
| 383 |       for i:=0 to Pred(mClients.Count) do
 | 
|---|
| 384 |         (TClientInfo(mClients[i])).Visible := false;
 | 
|---|
| 385 | 
 | 
|---|
| 386 |       // Scrap the current list
 | 
|---|
| 387 |       mClients.Clear();
 | 
|---|
| 388 | 
 | 
|---|
| 389 |       // Scrap the listbox list
 | 
|---|
| 390 |       currentClientsCheckedListBox.Items.Clear();
 | 
|---|
| 391 | 
 | 
|---|
| 392 |       for i:=0 to Pred(count) do
 | 
|---|
| 393 |       begin
 | 
|---|
| 394 |         errorCode := mVistaSession.GetClientIdAndNameFromIndex(i, id, name);
 | 
|---|
| 395 |         if (errorCode = Success) then
 | 
|---|
| 396 |         begin
 | 
|---|
| 397 |           errorCode := mVistaSession.GetActiveBrokerConnectionIndexFromUniqueClientId(id, connectIndex);
 | 
|---|
| 398 |           if (errorCode = Success) then
 | 
|---|
| 399 |           begin
 | 
|---|
| 400 |             cInfo := TClientInfo.Create(id,name,connectIndex,kRpcHistoryEnabledDefault);
 | 
|---|
| 401 | //            cInfo.OnLogClosed +:= new EventHandler(OnClientRpcLogClosedEventHandler);
 | 
|---|
| 402 |             mClients.Add(cInfo);
 | 
|---|
| 403 |             currentClientsCheckedListBox.Items.Add(cInfo.Name+'   connection = '+IntToStr(cInfo.BrokerConnectionIndex)+'  Id = '+IntToStr(cInfo.UniqueId));
 | 
|---|
| 404 |           end;
 | 
|---|
| 405 |         end;
 | 
|---|
| 406 |       end;
 | 
|---|
| 407 |     end
 | 
|---|
| 408 |     else
 | 
|---|
| 409 |     begin
 | 
|---|
| 410 |       if (count > mClients.Count) then
 | 
|---|
| 411 |       begin
 | 
|---|
| 412 |         // We need to add a client to the list
 | 
|---|
| 413 |         errorCode := mVistaSession.GetClientNameFromUniqueClientId(uniqueClientId, name);
 | 
|---|
| 414 |         if (errorCode = Success) then
 | 
|---|
| 415 |         begin
 | 
|---|
| 416 |           errorCode := mVistaSession.GetActiveBrokerConnectionIndexFromUniqueClientId(uniqueClientId, connectIndex);
 | 
|---|
| 417 |           if (errorCode = Success) then
 | 
|---|
| 418 |           begin
 | 
|---|
| 419 |             cInfo := TClientInfo.Create(uniqueClientId,name,connectIndex,kRpcHistoryEnabledDefault);
 | 
|---|
| 420 | //            cInfo.OnLogClosed +:= new EventHandler(OnClientRpcLogClosedEventHandler);
 | 
|---|
| 421 |             mClients.Add(cInfo);
 | 
|---|
| 422 |             currentClientsCheckedListBox.Items.Add(cInfo.Name+'   connection = '+IntToStr(cInfo.BrokerConnectionIndex)+'  Id = '+IntToStr(cInfo.UniqueId));
 | 
|---|
| 423 |           end;
 | 
|---|
| 424 |         end;
 | 
|---|
| 425 |       end
 | 
|---|
| 426 |       else if (count < mClients.Count) then
 | 
|---|
| 427 |       begin
 | 
|---|
| 428 |         // We need to delete a client from the list
 | 
|---|
| 429 |         foundIndex := -1;
 | 
|---|
| 430 | 
 | 
|---|
| 431 |         for i:=0 to Pred(mClients.Count) do
 | 
|---|
| 432 |         begin
 | 
|---|
| 433 |           cInfo := TClientInfo(mClients[i]);
 | 
|---|
| 434 |          if (cInfo.UniqueId = uniqueClientId) then
 | 
|---|
| 435 |           begin
 | 
|---|
| 436 |             foundIndex := i;
 | 
|---|
| 437 |             break;
 | 
|---|
| 438 |           end;
 | 
|---|
| 439 |         end;
 | 
|---|
| 440 |         if (foundIndex <> -1) then
 | 
|---|
| 441 |         begin
 | 
|---|
| 442 |           (TClientInfo(mClients[foundIndex])).Visible := false;
 | 
|---|
| 443 |           mClients.Delete(foundIndex);
 | 
|---|
| 444 |           currentClientsCheckedListBox.Items.Delete(foundIndex);
 | 
|---|
| 445 |         end;
 | 
|---|
| 446 |       end;
 | 
|---|
| 447 |     end;
 | 
|---|
| 448 |   end;
 | 
|---|
| 449 | end;
 | 
|---|
| 450 | 
 | 
|---|
| 451 | 
 | 
|---|
| 452 | procedure TfrmSharedBrokerDebugger.RebuildConnectionList;
 | 
|---|
| 453 | var
 | 
|---|
| 454 |   ErrorCode: ISharedBrokerErrorCode;
 | 
|---|
| 455 |   I, IndexCount: integer;
 | 
|---|
| 456 |   BInfo: TBrokerConnectionInfo;
 | 
|---|
| 457 |   ServerIP: WideString;
 | 
|---|
| 458 |   ServerPort: Integer;
 | 
|---|
| 459 |   LastContext: WideString;
 | 
|---|
| 460 | begin
 | 
|---|
| 461 |   IndexCount := 0;
 | 
|---|
| 462 | 
 | 
|---|
| 463 |   for i:=0 to Pred(mConnections.Count) do
 | 
|---|
| 464 |     (TBrokerConnectionInfo(mConnections[i])).Visible := false;
 | 
|---|
| 465 | 
 | 
|---|
| 466 |   mConnections.Clear();
 | 
|---|
| 467 |   actualBrokerConnectionsCheckedListBox.Items.Clear();
 | 
|---|
| 468 | 
 | 
|---|
| 469 |      Assert(mVistaSession <> nil);
 | 
|---|
| 470 | 
 | 
|---|
| 471 |   errorCode := mVistaSession.GetActiveBrokerConnectionIndexCount(indexCount);
 | 
|---|
| 472 |   if (errorCode = Success) and (indexCount > 0) then
 | 
|---|
| 473 |   begin
 | 
|---|
| 474 |     serverIp := '';
 | 
|---|
| 475 |     serverPort := 0;
 | 
|---|
| 476 |     lastContext := '';
 | 
|---|
| 477 | 
 | 
|---|
| 478 |     for i:=0 to Pred(indexCount) do
 | 
|---|
| 479 |     begin
 | 
|---|
| 480 |       errorCode := mVistaSession.GetActiveBrokerConnectionInfo(i, serverIp, serverPort, lastContext);
 | 
|---|
| 481 |       if (errorCode = Success) then
 | 
|---|
| 482 |       begin
 | 
|---|
| 483 |         bInfo := TBrokerConnectionInfo.Create(i,serverIp,serverPort,lastContext);
 | 
|---|
| 484 | //            bInfo.OnLogClosed +:= new EventHandler(OnConnectionRpcLogClosedEventHandler);
 | 
|---|
| 485 |         mConnections.Add(bInfo);
 | 
|---|
| 486 |         actualBrokerConnectionsCheckedListBox.Items.AddObject(IntToStr(bInfo.ConnectionIndex) + '  server: '+bInfo.ConnectedServerIP+'  server port: '+IntToStr(bInfo.ConnectedServerPort) + '   Last Context = ' + bInfo.LastContext, bInfo);
 | 
|---|
| 487 |       end;
 | 
|---|
| 488 |     end;
 | 
|---|
| 489 |   end;
 | 
|---|
| 490 | end;
 | 
|---|
| 491 | {
 | 
|---|
| 492 |     private void MaxAllClientRpcLogEntriesNumericUpDown_ValueChanged(object sender, System.EventArgs e)
 | 
|---|
| 493 |     begin
 | 
|---|
| 494 |       // In case the max entry value is less than the rpc log entries delete the entries
 | 
|---|
| 495 |       while (maxAllClientRpcLogEntriesNumericUpDown.Value < rpcCallLogListBox.Items.Count)
 | 
|---|
| 496 |         rpcCallLogListBox.Items.RemoveAt(0);
 | 
|---|
| 497 |     end;
 | 
|---|
| 498 | 
 | 
|---|
| 499 |     private void CurrentClientsCheckedListBox_ItemCheck(object sender, System.Windows.Forms.ItemCheckEventArgs e)
 | 
|---|
| 500 |     begin
 | 
|---|
| 501 |       ClientInfo cInfo := (ClientInfo)mClients[e.Index];
 | 
|---|
| 502 | 
 | 
|---|
| 503 |       if (e.NewValue = CheckState.Checked) then
 | 
|---|
| 504 |       begin
 | 
|---|
| 505 |         cInfo.Visible := true;
 | 
|---|
| 506 |         // Transfer the current list of rpc call entries from the all rpc log
 | 
|---|
| 507 |         // that correspond to this client
 | 
|---|
| 508 |         RpcLogEntry entry;
 | 
|---|
| 509 |         for i:=0 to Pred(rpcCallLogListBox.Items.Count) do
 | 
|---|
| 510 |         begin
 | 
|---|
| 511 |           entry := (RpcLogEntry)rpcCallLogListBox.Items[i];
 | 
|---|
| 512 |           if (entry.UniqueClientId = cInfo.UniqueId) then
 | 
|---|
| 513 |             cInfo.AddRpcLogEntry(entry,true);
 | 
|---|
| 514 |         end;
 | 
|---|
| 515 |       end;
 | 
|---|
| 516 |       else 
 | 
|---|
| 517 |         cInfo.Visible := false;
 | 
|---|
| 518 |     end;
 | 
|---|
| 519 | 
 | 
|---|
| 520 |     private void ActualBrokerConnectionsCheckedListBox_ItemCheck(object sender, System.Windows.Forms.ItemCheckEventArgs e)
 | 
|---|
| 521 | 
 | 
|---|
| 522 |     private void RpcCallLogListBox_SelectedIndexChanged(object sender, System.EventArgs e)
 | 
|---|
| 523 |     begin
 | 
|---|
| 524 |       DisplayRpcEntry((RpcLogEntry)rpcCallLogListBox.Items[rpcCallLogListBox.SelectedIndex]);
 | 
|---|
| 525 |       copySelectedRpcToClipboardMenuItem.Enabled := true;
 | 
|---|
| 526 |     end;
 | 
|---|
| 527 | 
 | 
|---|
| 528 | procedure TfrmSharedBrokerDebugger.DisplayRpcEntry(entry: TRpcLogEntry)
 | 
|---|
| 529 |   List: TStringList;
 | 
|---|
| 530 | begin
 | 
|---|
| 531 |   list := entry.CreateParamsDisplayString().Split('\n');
 | 
|---|
| 532 |       paramsListBox.Items.Clear();
 | 
|---|
| 533 |       foreach(string s in list)
 | 
|---|
| 534 |         paramsListBox.Items.Add(s);
 | 
|---|
| 535 | 
 | 
|---|
| 536 |       resultsRichTextBox.Text      := entry.CreateResultsDisplayString();
 | 
|---|
| 537 |       rpcNameOutputLabel.Text      := entry.Name;
 | 
|---|
| 538 |       rpcDebugIdOutputLabel.Text    := entry.UniqueId.ToString();
 | 
|---|
| 539 |       contextOutputLabel.Text      := entry.Context;
 | 
|---|
| 540 |       string duration  ;
 | 
|---|
| 541 |       if (entry.Duration < 1) then
 | 
|---|
| 542 |         duration := '<1ms'
 | 
|---|
| 543 |       else
 | 
|---|
| 544 |         duration := entry.Duration.ToString() + 'ms';
 | 
|---|
| 545 |       durationOutputLabel.Text    := duration;
 | 
|---|
| 546 |       clientNameOutputLabel.Text    := entry.ClientName;
 | 
|---|
| 547 |       clientDebugIdOutputLabel.Text  := entry.UniqueClientId.ToString();
 | 
|---|
| 548 |     end;
 | 
|---|
| 549 | 
 | 
|---|
| 550 | procedure TfrmSharedBrokerDebugger.copySelectedRpcToClipboardMenuItem_Click(object sender, System.EventArgs e)
 | 
|---|
| 551 |     begin
 | 
|---|
| 552 |       // Build a string and put it on the clipboard here.
 | 
|---|
| 553 |       Clipboard.SetDataObject(((RpcLogEntry)rpcCallLogListBox.SelectedItem).CreateClipboardString());
 | 
|---|
| 554 |     end;
 | 
|---|
| 555 |   end;
 | 
|---|
| 556 | end;
 | 
|---|
| 557 | }
 | 
|---|
| 558 | procedure TfrmSharedBrokerDebugger.FormCreate(Sender: TObject);
 | 
|---|
| 559 | var
 | 
|---|
| 560 |  UniqueClientId: Integer;
 | 
|---|
| 561 |  ErrMsg: WideString;
 | 
|---|
| 562 |  LoginStr: WideString;
 | 
|---|
| 563 | begin
 | 
|---|
| 564 |   LoginStr := '';
 | 
|---|
| 565 |   mClients := TList.Create;
 | 
|---|
| 566 |   mConnections := TList.Create;
 | 
|---|
| 567 |   mVistaSession.BrokerConnect(ParamStr(0),DebuggerClient,'',False,True,True,isemRaise,0,LoginStr,UniqueClientId,ErrMsg);
 | 
|---|
| 568 |   mVistaSession.OnRpcCallRecorded := OnRpcCallRecordedEventHandler;
 | 
|---|
| 569 |   mVistaSession.OnClientConnect := OnClientConnectEventHandler;
 | 
|---|
| 570 |   mVistaSession.OnClientDisconnect := OnClientDisconnectEventHandler;
 | 
|---|
| 571 |   mVistaSession.OnContextChanged := OnContextChangedEventHandler;
 | 
|---|
| 572 |   mDoingAForcedLogoutOfClients := false;
 | 
|---|
| 573 |   mOnLogoutPending := false;
 | 
|---|
| 574 |   RebuildClientList(kNoUniqueClientId);
 | 
|---|
| 575 |   RebuildConnectionList;
 | 
|---|
| 576 | end;
 | 
|---|
| 577 | 
 | 
|---|
| 578 | procedure TfrmSharedBrokerDebugger.FormDestroy(Sender: TObject);
 | 
|---|
| 579 | begin
 | 
|---|
| 580 |   mClients.Free;
 | 
|---|
| 581 |   mConnections.Free;
 | 
|---|
| 582 |   mVistaSession.BrokerDisconnect;
 | 
|---|
| 583 | end;
 | 
|---|
| 584 | 
 | 
|---|
| 585 | procedure TfrmSharedBrokerDebugger.btnExitClick(Sender: TObject);
 | 
|---|
| 586 | begin
 | 
|---|
| 587 |   Halt;
 | 
|---|
| 588 | end;
 | 
|---|
| 589 | 
 | 
|---|
| 590 | procedure TfrmSharedBrokerDebugger.actualBrokerConnectionsCheckedListBoxClickCheck(
 | 
|---|
| 591 |   Sender: TObject);
 | 
|---|
| 592 | var
 | 
|---|
| 593 |   BInfo, BInfo2: TBrokerConnectionInfo;
 | 
|---|
| 594 |   Entry: TRpcLogEntry;
 | 
|---|
| 595 |   CurrVal: Integer;
 | 
|---|
| 596 |   i: Integer;
 | 
|---|
| 597 | begin
 | 
|---|
| 598 |   CurrVal := actualBrokerConnectionsCheckedListBox.ItemIndex;
 | 
|---|
| 599 |   bInfo := (TBrokerConnectionInfo(mConnections[CurrVal]));
 | 
|---|
| 600 |   bInfo2 := TBrokerConnectionInfo(actualBrokerConnectionsCheckedListBox.Items.Objects[CurrVal]);
 | 
|---|
| 601 | 
 | 
|---|
| 602 |       if (actualBrokerConnectionsCheckedListBox.Checked[CurrVal]) then
 | 
|---|
| 603 |       begin
 | 
|---|
| 604 |         bInfo.Visible := true;
 | 
|---|
| 605 |         // Transfer the current list of rpc call entries from the all rpc log
 | 
|---|
| 606 |         // That correspond to this connection
 | 
|---|
| 607 |         for i:=0 to Pred(rpcCallLogListBox.Items.Count) do
 | 
|---|
| 608 |         begin
 | 
|---|
| 609 |           entry := (TRpcLogEntry(rpcCallLogListBox.Items.Objects[i]));
 | 
|---|
| 610 |           if (entry.ConnectionIndex = bInfo2.ConnectionIndex) then
 | 
|---|
| 611 | //          if (entry.ConnectionIndex = ActualBrokerConnectionsCheckedListBox.Items[CurrVal]) then
 | 
|---|
| 612 |             TBrokerConnectionInfo(mConnections[CurrVal]).AddRpcLogEntry(entry,true);
 | 
|---|
| 613 |         end;
 | 
|---|
| 614 |       end
 | 
|---|
| 615 |       else
 | 
|---|
| 616 |         bInfo.Visible := false;
 | 
|---|
| 617 | end;
 | 
|---|
| 618 | 
 | 
|---|
| 619 | procedure TfrmSharedBrokerDebugger.Exit1Click(Sender: TObject);
 | 
|---|
| 620 | begin
 | 
|---|
| 621 |   Halt;
 | 
|---|
| 622 | end;
 | 
|---|
| 623 | 
 | 
|---|
| 624 | procedure TfrmSharedBrokerDebugger.About1Click(Sender: TObject);
 | 
|---|
| 625 | begin
 | 
|---|
| 626 |   ShowAboutBox;
 | 
|---|
| 627 | end;
 | 
|---|
| 628 | 
 | 
|---|
| 629 | procedure TfrmSharedBrokerDebugger.CopyConnectionsLogToClipboard1Click(
 | 
|---|
| 630 |   Sender: TObject);
 | 
|---|
| 631 | begin
 | 
|---|
| 632 |   clientConnectionsLogRichTextBox.SelectAll;
 | 
|---|
| 633 |   clientConnectionsLogRichTextBox.CopyToClipboard;
 | 
|---|
| 634 | end;
 | 
|---|
| 635 | 
 | 
|---|
| 636 | procedure TfrmSharedBrokerDebugger.CurrentClientsCheckedListBoxClickCheck(
 | 
|---|
| 637 |   Sender: TObject);
 | 
|---|
| 638 | var
 | 
|---|
| 639 |   CInfo: TClientInfo;
 | 
|---|
| 640 |   Entry: TRpcLogEntry;
 | 
|---|
| 641 |   CurrVal: Integer;
 | 
|---|
| 642 |   i: Integer;
 | 
|---|
| 643 |   listobjUniqueClientID: Integer;
 | 
|---|
| 644 | begin
 | 
|---|
| 645 |   CurrVal := CurrentClientsCheckedListBox.ItemIndex;
 | 
|---|
| 646 |   CInfo := (TClientInfo(mclients[CurrVal]));
 | 
|---|
| 647 |   listobjUniqueClientId := CInfo.UniqueId;
 | 
|---|
| 648 | 
 | 
|---|
| 649 |   if (CurrentClientsCheckedListBox.Checked[CurrVal]) then
 | 
|---|
| 650 |   begin
 | 
|---|
| 651 |     CInfo.Visible := true;
 | 
|---|
| 652 |     // Transfer the current list of rpc call entries from the all rpc log
 | 
|---|
| 653 |     // That correspond to this connection
 | 
|---|
| 654 |     for i:=0 to Pred(rpcCallLogListBox.Items.Count) do
 | 
|---|
| 655 |     begin
 | 
|---|
| 656 |       entry := (TRpcLogEntry(rpcCallLogListBox.Items.Objects[i]));
 | 
|---|
| 657 |       if (entry.UniqueClientId = listobjUniqueClientId) then
 | 
|---|
| 658 | //          if (entry.ConnectionIndex = ActualBrokerConnectionsCheckedListBox.Items[CurrVal]) then
 | 
|---|
| 659 |         TClientInfo(mClients[CurrVal]).AddRpcLogEntry(entry,true);
 | 
|---|
| 660 |     end;
 | 
|---|
| 661 |   end
 | 
|---|
| 662 |   else
 | 
|---|
| 663 |     CInfo.Visible := false;
 | 
|---|
| 664 | end;
 | 
|---|
| 665 | 
 | 
|---|
| 666 | end.
 | 
|---|