using System; using System.Data; using System.Text; using System.Windows.Forms; using IndianHealthService.BMXNet.Model; using IndianHealthService.BMXNet.Ado; using System.Collections.Generic; using System.Threading; namespace IndianHealthService.BMXNet.Services { /// /// Extends BMX functionality for easier development and debugging. /// Copied from Component Framework project IndianHealthService.Xo.Framework.Rpms /// internal class BMXNetRemoteSession : RemoteSession, RemoteEventService { public int ReceiveTimeout { get { return this.SessionConnection.ReceiveTimeout; } set { this.SessionConnection.ReceiveTimeout = value; } } public int SendTimeout { get { return this.SessionConnection.SendTimeout; } set { this.SessionConnection.SendTimeout = value; } } private Log _log = new NullLog(); public Log Log { get { return _log; } set { _log = value; } } private object _rpcLock = new object(); public object RpcLock { get { return _rpcLock; } set { _rpcLock = value; } } private Guid _id = Guid.NewGuid(); public Guid Id { get { return _id; } set { _id = value; } } private System.Timers.Timer _pollingTimer = null; protected System.Timers.Timer PollingTimer { get { return _pollingTimer; } set { _pollingTimer = value; } } private int _eventPollingInterval = 5000; public int EventPollingInterval { get { return _eventPollingInterval; } set { _eventPollingInterval = value; if (this.IsEventPollingEnabled) { this.PollingTimer.Interval = value; } } } public Encoding ConnectionEncoding { get { return SessionConnection.ConnectionEncoding; } set { SessionConnection.ConnectionEncoding = value; } } public bool IsEventPollingEnabled { get { return this.PollingTimer != null; } set { if (value) { this.StartPollingTimer(); } else { this.StopPollingTimer(); } } } private void AssertPrimarySession() { if (!this.IsPrimary) { throw new NotSupportedException("This behavior is not supported on non-primary sessions. See documentation."); } } private void StartPollingTimer() { if (this.PollingTimer == null) { this.PollingTimer = new System.Timers.Timer(this.EventPollingInterval); this.PollingTimer.Enabled = true; this.PollingTimer.Elapsed += new System.Timers.ElapsedEventHandler(PollingTimer_Elapsed); this.PollingTimer.Start(); } } private bool _inPollForEvent = false; protected bool InPollForEvent { get { return _inPollForEvent; } set { _inPollForEvent = value; } } void PollingTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { if (!this.InPollForEvent) { try { this.InPollForEvent = true; this.PollForEvent(); } finally { this.InPollForEvent = false; } } } private void StopPollingTimer() { if (this.PollingTimer != null) { this.PollingTimer.Enabled = false; this.PollingTimer.Stop(); this.PollingTimer.Elapsed -= new System.Timers.ElapsedEventHandler(PollingTimer_Elapsed); this.PollingTimer = null; } } public String Job { get { return this.SessionConnection == null ? "" : this.SessionConnection.Job; } } public override string ToString() { return "RemoteSession [Process " + this.Job + (this.IsPrimary ? ", Primary Session]" : "]"); } private bool _isPrimary = false; public bool IsPrimary { get { return _isPrimary; } set { _isPrimary = value; } } private bool _isConnected = false; public bool IsConnected { get { return (_isConnected || this.IsPrimary) && this.SessionConnection.IsConnected; } set { _isConnected = value; } } public User User { get { return this.Broker.User; } } public BMXNetBroker Broker { get { return this.SessionConnection.Broker; } } private BMXNetSessionConnection _sessionConnection; internal BMXNetSessionConnection SessionConnection { get { return _sessionConnection; } set { _sessionConnection = value; } } private BMXNetDataAdapter m_cachedDataAdapter; private String _debugLastRpcSignature; public String DebugLastRpcSignature { get { return _debugLastRpcSignature; } set { _debugLastRpcSignature = value; } } private String _debugLastRpcResult; public String DebugLastRpcResult { get { return _debugLastRpcResult; } set { _debugLastRpcResult = value; } } private DataTable _debugLastTableResult; public DataTable DebugLastTableResult { get { return _debugLastTableResult; } set { _debugLastTableResult = value; } } private String _rpcResult; public BMXNetRemoteSession() { this.m_cachedDataAdapter = new BMXNetDataAdapter(); } internal void Begin(BMXNetSessionConnection aConnection, BMXRemoteSessionPool aPool) { this.SessionConnection = aConnection; this.SessionPool = aPool; this.IsConnected = true; } private void PollForTimerEvent() { if (this.TimerEvent != null) { try { this.TimerEvent(this, new EventArgs()); } catch (Exception problemToIgnore) { this.Log.Log("BMXNetRemoteSession", "Exception", problemToIgnore.Message); } } } public RemoteEventService EventServices { get { return this; } } private Control _invokedControl = null; public Control InvokedControl { get { return _invokedControl; } set { _invokedControl = value; } } private DataTable _debugLastTableChanges = null; public DataTable DebugLastTableChanges { get { return _debugLastTableChanges; } set { _debugLastTableChanges = value; } } public event EventHandler RpmsEvent; public event EventHandler TimerEvent; internal void AuthenticatedConnectionInfo(BMXNetSessionConnection aSessionConnection) { this.SessionConnection = aSessionConnection; } public virtual String TransmitRPC(String rpcCommand, String rpcParameter, String aContext) { this.DebugLastRpcSignature = rpcCommand + "^" + rpcParameter + "^" + aContext; this.DebugLastRpcResult = null; lock (this.RpcLock) { this.AppContext = aContext; this.RpcResult = this.SessionConnection.TransmitRPC(rpcCommand, rpcParameter); this.DebugLastRpcResult = this.RpcResult; } return this.RpcResult; } private void AssertConnected() { if (!this.IsConnected) { throw new BMXNetException("Session is not connected or has been closed."); } } public String SafelyTransmitRPC(String rpcCommand, String rpcParameter, String context) { this.AssertConnected(); try { return this.TransmitRPC(rpcCommand, rpcParameter, context); } catch (Exception exception) { return "Exception: " + exception.Message; } } public bool SaveChanges(DataTable aDataTable) { this.AssertConnected(); DataTable changes = aDataTable.GetChanges(); this.DebugLastTableChanges = changes; if (changes == null) return false; BMXNetConnection bmxConnection = null; lock (this.RpcLock) { try { bmxConnection = new BMXNetConnection(this.SessionConnection); bmxConnection.Open(); if (bmxConnection.State == ConnectionState.Open) { BMXNetDataAdapter bmxDataAdaptor = this.m_cachedDataAdapter; BMXNetCommand bmxSelectCommand = bmxConnection.CreateCommand() as BMXNetCommand; bmxSelectCommand.CommandText = aDataTable.ExtendedProperties["BMXNetSelectStatementForUpdate"] as String; bmxDataAdaptor.SelectCommand = bmxSelectCommand; DataTable schema = bmxDataAdaptor.FillSchema(aDataTable, SchemaType.Source); BMXNetCommand bmxUpdateCommand = bmxConnection.CreateCommand() as BMXNetCommand; bmxUpdateCommand.BMXBuildUpdateCommand(schema); bmxDataAdaptor.UpdateCommand = bmxUpdateCommand; bmxDataAdaptor.Update(changes); aDataTable.AcceptChanges(); return true; } else { throw new BMXNetException("Unable to connect to RPMS."); } } catch (Exception exception) { throw new BMXNetException("Unable to save data to RPMS.", exception); } finally { if (bmxConnection != null) { bmxConnection.Close(); } } } } public virtual DataTable TableFromCommand(String aCommand) { return this.TableFromCommand(aCommand, this.AppContext); } public DataTable TableFromCommand(string aCommand, string aContext) { return this.TableFromCommand(aCommand, null, null,aContext); } public DataTable TableFromCommand(String aCommand, DataSet aDataSet, string aTableName) { return this.TableFromCommand(aCommand, aDataSet, aTableName, this.AppContext); } public virtual DataTable TableFromCommand(String aCommand, DataSet aDataSet, string aTableName, string aContext) { this.Log.Log("BMX NET", "Debug", "TableFromCommand >> " + aCommand, aTableName == null ? "Null Table" : aTableName, aContext == null ? "Null Context" : aContext); this.DebugLastTableResult = null; this.AssertConnected(); DataSet dataSet = aDataSet == null ? new DataSet() : aDataSet; BMXNetConnection bmxConnection = new BMXNetConnection(this.SessionConnection); bmxConnection.Open(); if (bmxConnection.State != ConnectionState.Open) throw new BMXNetException("Unable to connect to RPMS."); lock (this.RpcLock) { try { this.AppContext = aContext; BMXNetCommand bmxCommand = bmxConnection.CreateCommand() as BMXNetCommand; bmxCommand.CommandText = aCommand; BMXNetDataAdapter bmxDataAdaptor = new BMXNetDataAdapter(); bmxDataAdaptor.SelectCommand = bmxCommand; DataTable answer = null; String validTableName = aTableName == null ? this.DefaultTableName : aTableName; DateTime stopWatch = DateTime.Now; if (aDataSet == null) { answer = new DataTable(validTableName); bmxDataAdaptor.Fill(answer); } else { DataTable dataTable = aDataSet.Tables.Contains(validTableName) ? aDataSet.Tables[validTableName] : aDataSet.Tables.Add(validTableName); bmxDataAdaptor.Fill(aDataSet, validTableName); answer = aDataSet.Tables[validTableName]; } answer.ExtendedProperties["BMXNetSelectStatementForUpdate"] = bmxCommand.CommandText; answer.ExtendedProperties["BMXQueryStart"] = stopWatch; answer.ExtendedProperties["BMXQueryTime"] = (DateTime.Now - stopWatch).TotalMilliseconds; answer.ExtendedProperties["RpmsQuery"] = aCommand; answer.ExtendedProperties["RpmsSchema"] = this.RpmsSchema(aCommand); this.DebugLastTableResult = answer; return answer; } catch (Exception exception) { throw new BMXNetException("Unable to retrive data from RPMS.", exception); } finally { if (bmxConnection != null) { bmxConnection.Close(); } } } } private String RpmsSchema(String aString) { char[] carrotDelimiter = "^".ToCharArray(); String[] parts = aString.Split(carrotDelimiter); return (parts.Length > 2) ? parts[1] : ""; } public DataTable TableFromRPC(String rpcCommand, String rpcParameter) { return this.TableFromRPC(rpcCommand, rpcParameter, this.AppContext); } public DataTable TableFromRPC(string rpcCommand, string rpcParameter, string aContext) { return this.TableFromRPC(rpcCommand, rpcParameter, new DataSet(), this.DefaultTableName, aContext); } public DataTable TableFromRPC(string rpcCommand, string rpcParameter, DataSet aDataSet, string aTableName) { return this.TableFromRPC(rpcCommand, rpcParameter, aDataSet, aTableName, this.AppContext); } public DataTable TableFromRPC(String rpcCommand, String rpcParameter, DataSet aDataSet, String aTableName, String aContext) { String generatedCommand = this.TransmitRPC(rpcCommand, rpcParameter, aContext); return this.IsBmxAdoCommand(generatedCommand) ? this.TableFromCommand(generatedCommand, aDataSet, aTableName, aContext) : null; } public String RpcResult { get { return this._rpcResult; } set { this._rpcResult = value; } } public virtual DataTable TableFromSQL(String sql) { return this.TableFromSQL(sql, this.AppContext); } public DataTable TableFromSQL(string sql, string aContext) { return this.TableFromSQL(sql, new DataSet(), this.DefaultTableName,aContext); } //smh: THIS IS WRONG. If you pass the data set, why make a new dataset... public DataTable TableFromSQL(string sql, DataSet aDataSet, string aTableName) { return this.TableFromSQL(sql, aDataSet, aTableName, this.AppContext); } public DataTable TableFromSQL(string sql, DataSet aDataSet, string aTableName, String aContext) { this.Log.Log("BMX NET", "Debug", "TableFromSQL>> " + sql, aTableName == null ? "Null Table" : aTableName, aContext == null ? "Null Context" : aContext); this.DebugLastTableResult = null; this.AssertConnected(); BMXNetConnection bmxConnection; BMXNetCommand bmxCommand; BMXNetDataAdapter bmxDataAdaptor; bmxConnection = new BMXNetConnection(this.SessionConnection); bmxConnection.Open(); if (bmxConnection.State != ConnectionState.Open) { throw new BMXNetException("Unable to connect to RPMS."); } lock (this.RpcLock) { try { this.AppContext = aContext; bmxCommand = bmxConnection.CreateCommand() as BMXNetCommand; bmxCommand.CommandText = sql; bmxDataAdaptor = new BMXNetDataAdapter(); bmxDataAdaptor = this.m_cachedDataAdapter; bmxDataAdaptor.SelectCommand = bmxCommand; DataTable answer = null; String validTableName = aTableName == null ? this.DefaultTableName : aTableName; DateTime stopWatch = DateTime.Now; if (aDataSet == null) { answer = new DataTable(validTableName); bmxDataAdaptor.Fill(answer); } else { DataTable dataTable = aDataSet.Tables.Contains(validTableName) ? aDataSet.Tables[validTableName] : aDataSet.Tables.Add(validTableName); bmxDataAdaptor.Fill(aDataSet, validTableName); answer = aDataSet.Tables[validTableName]; } answer.ExtendedProperties["BMXNetSelectStatementForUpdate"] = bmxCommand.CommandText; answer.ExtendedProperties["SqlQuery"] = sql; answer.ExtendedProperties["BMXQueryStart"] = stopWatch; answer.ExtendedProperties["BMXQueryTime"] = (DateTime.Now - stopWatch).TotalMilliseconds; this.DebugLastTableResult = answer; return answer; } catch (Exception exception) { throw new Exception("Unable to retrive sql data from RPMS.", exception); } finally { if (bmxConnection != null) bmxConnection.ToString(); } } } public bool IsBmxAdoCommand(String aString) { String validFetchTransactionPrefix = "BMX ADO SS"; return aString.StartsWith(validFetchTransactionPrefix); } private BMXRemoteSessionPool _sessionPool = null; internal BMXRemoteSessionPool SessionPool { get { return _sessionPool; } set { _sessionPool = value; } } private bool _hasSubscribedForAsyncEvents = false; internal bool HasSubscribedForAsyncEvents { get { return _hasSubscribedForAsyncEvents; } set { _hasSubscribedForAsyncEvents = value; } } public virtual void Close() { if (this.HasSubscribedForAsyncEvents) { this.EventServices.Unsubscribe(this.AsyncFinishedEventName); } this.StopPollingTimer(); this.SessionPool.CloseSession(this); } public string HostAddress { get { throw new NotImplementedException(); } } public string AuthenicatedDuz { get { return this.SessionConnection.DUZ; } } public string AuthenicatedUserName { get { return this.SessionConnection.UserName; } } public string AppContext { get { return this.SessionConnection.AppContext; } set { this.SessionConnection.AppContext = value; } } public string TransmitRPC(string rpcCommand, string rpcParameter) { return this.TransmitRPC(rpcCommand, rpcParameter, this.AppContext); } public string SafelyTransmitRPC(string rpcCommand, string rpcParameter) { return this.SafelyTransmitRPC(rpcCommand, rpcParameter, this.AppContext); } public System.Data.DataTable TableFromRPC(string rpcCommand, string rpcParameter, System.Data.DataSet aDataSet) { return this.TableFromRPC(rpcCommand, rpcParameter, aDataSet); } public int Subscribe(string anEventName) { int result=this.EventManagmentCall("BMX EVENT REGISTER^" + anEventName); if (result == 0) { this.Log.Log("BMX NET", "Events", "Subscribed to " + anEventName); } else { this.Log.Log("BMX NET", "Events", "Unable to subscribe to " + anEventName); } return result; } public int Unsubscribe(string anEventName) { int result=this.EventManagmentCall("BMX EVENT UNREGISTER^" + anEventName); if (result == 0) { this.Log.Log("BMX NET", "Events", "Unsubscribed from " + anEventName); } else { this.Log.Log("BMX NET", "Events", "Unable to unsubscribe from " + anEventName); } return result; } public int TriggerEvent(string anEventName, string aParameter, bool doRaiseBack) { this.Log.Log("BMX NET", "Remote Events", "Triggered " + anEventName); return this.EventManagmentCall("BMX EVENT RAISE^" + anEventName + "^" + aParameter + "^" + doRaiseBack.ToString().ToUpper() + "^"); } protected int EventManagmentCall(String aCommand) { try { DataTable table = this.TableFromCommand(aCommand); return (int)table.Rows[0]["ERRORID"]; } catch { return 99; } } delegate void UiCallPollForEvent(); protected void PollForEvent() { if (this.InvokedControl != null && this.InvokedControl.InvokeRequired) { this.InvokedControl.Invoke(new UiCallPollForEvent(SafePollForEvent)); } else { this.SafePollForEvent(); } } protected void SafePollForEvent() { this.Log.Log("BMX NET", "Events", "Polling for event (" + this.PollingTimer.Interval.ToString() + ")"); this.PollForTimerEvent(); if (this.RpmsEvent != null || this.AsyncFutureLookup.Count > 0) { if (Monitor.TryEnter(this.RpcLock)) { Monitor.Exit(this.RpcLock); } else { return; } DataTable events = this.TableFromCommand("BMX EVENT POLL"); foreach (DataRow row in events.Rows) { try { RemoteEventArgs args = new RemoteEventArgs(); args.EventType = row["EVENT"].ToString(); args.Details = row["PARAM"].ToString(); this.Log.Log("BMX NET", "Remote Events", "Raised: " + args.EventType + "(" + args.Details + ")"); if (args.EventType.Equals(this.AsyncFinishedEventName)) { this.AsyncTableRequestReturned(args); } else { this.TriggerRpmsEvent(args); } } catch { } } } } delegate void UiCallTriggerRpmsEvent(RemoteEventArgs args); protected void TriggerRpmsEvent(RemoteEventArgs args) { if (this.RpmsEvent != null) { if (this.InvokedControl != null && this.InvokedControl.InvokeRequired) { this.InvokedControl.Invoke(new UiCallTriggerRpmsEvent(SafeTriggerRpmsEvent), args); } else { this.SafeTriggerRpmsEvent(args); } } } private void SafeTriggerRpmsEvent(RemoteEventArgs args) { this.RpmsEvent.Invoke(this, args); } private void AsyncTableRequestReturned(RemoteEventArgs args) { int key = 0; if (int.TryParse(M.Piece(args.Details,"~",1), out key) && this.AsyncFutureLookup.ContainsKey(key)) { DataTableFuture future = this.AsyncFutureLookup[key]; this.RemoveFromFutures(future); future.FutureHasReturned(this, M.Piece(args.Details, "~", 2)); } } private double _timerEventPollingMultiple = 1; public double TimerEventPollingMultiple { get { return _timerEventPollingMultiple; } set { _timerEventPollingMultiple = value; } } public DataTable VersionInfo { get { return this.TableFromCommand("BMX VERSION INFO^EBCI"); }//"+this.Broker.NameSpace); } } internal void Resume(BMXRemoteSessionPool bMXRemoteSessionPool) { this._isConnected = true; } internal void Suspend(BMXRemoteSessionPool bMXRemoteSessionPool) { this._isConnected = false; if (this.EventSourcePrimarySession != null) { this.EventSourcePrimarySession.Unsubscribe(this.AsyncFinishedEventName); this.EventSourcePrimarySession.RpmsEvent -= new EventHandler(aSession_RpmsEvent); } this.IsEventPollingEnabled = false; } #region RemoteSession Members private String _defaultTableName = "BmxResultTable"; public String DefaultTableName { get { return _defaultTableName; } set { _defaultTableName = value; } } public DataTableFuture AsyncTableFromCommand(string aCommand) { return this.AsyncTableFromCommand(aCommand, this.AppContext); } public DataTableFuture AsyncTableFromCommand(string aCommand, string aContext) { return this.AsyncTableFromCommand(aCommand, new DataSet(), this.DefaultTableName, aContext); } public DataTableFuture AsyncTableFromCommand(string aCommand, DataSet aDataSet, string aTableName) { return this.AsyncTableFromCommand(aCommand, aDataSet, aTableName, this.AppContext); } private String _asyncFinishedEventName=null; public String AsyncFinishedEventName { get { if (_asyncFinishedEventName == null) { _asyncFinishedEventName = "BMX ASYNC FINISHED " + this.Id.ToString(); } return _asyncFinishedEventName; } set { _asyncFinishedEventName = value; } } private Dictionary _asyncFutureLookup = new Dictionary(); protected Dictionary AsyncFutureLookup { get { return _asyncFutureLookup; } set { _asyncFutureLookup = value; } } public DataTableFuture AsyncTableFromCommand(string aCommand, DataSet aDataSet, string aTableName, string aContext) { int errorCode = -1; try { if (!this.HasSubscribedForAsyncEvents) { this.HasSubscribedForAsyncEvents = 0 == this.EventServices.Subscribe(this.AsyncFinishedEventName); } //replace ^'s in CommandString with $c(30)'s DataTable infoTable = this.TableFromCommand("BMX ASYNC QUEUE^"+aCommand.Replace('^', (char)30) + "^" + this.AsyncFinishedEventName,aContext); if (infoTable.Rows.Count == 1) { DataRow queueingInfo = infoTable.Rows[0]; errorCode = int.Parse(queueingInfo["ERRORID"].ToString()); if (errorCode == 1) { int resultId = int.Parse(queueingInfo["PARAM"].ToString()); DataTableFuture answer = new DataTableFuture(); answer.InvokedControl = this.InvokedControl; answer.ResultDataSet = aDataSet; answer.ResultTableName = aTableName; answer.ResultAppContext = aContext; answer.ResultId = resultId; this.AddToFutures(answer); return answer; } else { throw new BMXNetException("Async call failed: " + queueingInfo["PARAM"].ToString()); } } else { throw new BMXNetException("Error code not available."); } } catch (Exception problem) { String codeString = (errorCode == -1) ? "" : "Error code " + errorCode.ToString(); throw new BMXNetException("BMX Unable to places async request on queue. " + codeString,problem); } } private void AddToFutures(DataTableFuture aFuture) { if (this.AsyncFutureLookup.ContainsKey(aFuture.ResultId)) { DataTableFuture toCancel = this.AsyncFutureLookup[aFuture.ResultId]; toCancel.Cancel(); } lock (this.AsyncFutureLookup) { aFuture.Session = this; this.AsyncFutureLookup[aFuture.ResultId] = aFuture; } } internal void RemoveFromFutures(DataTableFuture aFuture) { if (this.AsyncFutureLookup.ContainsKey(aFuture.ResultId)) { lock (this.AsyncFutureLookup) { this.AsyncFutureLookup.Remove(aFuture.ResultId); } } } public DataTableFuture AsyncTableFromSQL(string sql) { return this.AsyncTableFromSQL(sql, this.AppContext); } public DataTableFuture AsyncTableFromSQL(string sql, string aContext) { return this.AsyncTableFromSQL(sql, new DataSet(),this.DefaultTableName, this.AppContext); } public DataTableFuture AsyncTableFromSQL(string sql, DataSet aDataSet, string aTableName) { return this.AsyncTableFromSQL(sql, aDataSet, aTableName, this.AppContext); } public DataTableFuture AsyncTableFromSQL(string sql, DataSet aDataSet, string aTableName, string aContext) { int errorCode = -1; try { if (!this.HasSubscribedForAsyncEvents) { this.HasSubscribedForAsyncEvents = 0== this.EventServices.Subscribe(this.AsyncFinishedEventName); } //replace ^'s in CommandString with $c(30)'s DataTable infoTable = this.TableFromCommand("BMX ASYNC QUEUE^" + sql.Replace('^', (char)30) + "^" + this.AsyncFinishedEventName, aContext); DataRow queueingInfo = infoTable.Rows[0]; errorCode = int.Parse(queueingInfo["ERRORID"].ToString()); if (errorCode == 1) { int resultId = int.Parse(queueingInfo["PARAM"].ToString()); DataTableFuture answer = new DataTableFuture(); answer.ResultDataSet = aDataSet; answer.ResultTableName = aTableName; answer.ResultAppContext = aContext; answer.ResultId = resultId; this.AddToFutures(answer); return answer; } else { throw new BMXNetException("Unexcepted error code"); } } catch (Exception problem) { String codeString = (errorCode == -1) ? "" : "Error code " + errorCode.ToString(); throw new BMXNetException("BMX Unable to places async request on queue. " + codeString, problem); } } public DataTableFuture AsyncTableFromRPC(string rpcCommand, string rpcParameter) { return this.AsyncTableFromRPC(rpcCommand, rpcParameter, this.AppContext); } public DataTableFuture AsyncTableFromRPC(string rpcCommand, string rpcParameter, string aContext) { return this.AsyncTableFromRPC(rpcParameter, rpcParameter, new DataSet(), this.DefaultTableName, aContext); } public DataTableFuture AsyncTableFromRPC(string rpcCommand, string rpcParameter, DataSet aDataSet, string aTableName) { return this.AsyncTableFromRPC(rpcCommand, rpcParameter, aDataSet, aTableName, this.AppContext); } public DataTableFuture AsyncTableFromRPC(string rpcCommand, string rpcParameter, DataSet aDataSet, string aTableName, string aContext) { String generatedCommand = this.TransmitRPC(rpcCommand, rpcParameter, aContext); return this.IsBmxAdoCommand(generatedCommand) ? this.AsyncTableFromCommand(generatedCommand, aDataSet, aTableName, aContext) : null; } #endregion private BMXNetRemoteSession _eventSourcePrimarySession = null; public BMXNetRemoteSession EventSourcePrimarySession { get { return _eventSourcePrimarySession; } set { _eventSourcePrimarySession = value; } } internal void PrimarySession(BMXNetRemoteSession aSession) { this.EventSourcePrimarySession = aSession; // this.EventSourcePrimarySession.RpmsEvent += new EventHandler(aSession_RpmsEvent); // this.EventSourcePrimarySession.Subscribe(this.AsyncFinishedEventName); } void aSession_RpmsEvent(object sender, RemoteEventArgs e) { this.Log.Log("BMX NET", "Remote Events", "Raised: " + e.EventType + "(" + e.Details + ")"); if (e.EventType.Equals(this.AsyncFinishedEventName)) { this.AsyncTableRequestReturned(e); } else if (this.RpmsEvent != null) { this.RpmsEvent(this, e); } } public bool Lock(string lvnToLock, string addOrSubstract) { return SessionConnection.Lock(lvnToLock, addOrSubstract); } } }