| [453] | 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.
 | 
|---|