private StreamConnectionThreadData[] OpenStreamChannel(UpDevice device, Call serviceCall, CallContext messageContext) { StreamConnectionThreadData[] data = null; //Channel type decision string netType = null; if (serviceCall.channelType != null) { netType = serviceCall.channelType; } else { UpNetworkInterface network = GetAppropriateInterface(device); netType = network.netType; } int channels = serviceCall.channels; data = new StreamConnectionThreadData[channels]; string[] channelIDs = new string[channels]; for (int i = 0; i < channels; i++) { NetworkDevice networkDevice = GetAvailableNetworkDevice(netType); channelIDs[i] = Util.GetPort(networkDevice.networkDeviceName); StreamConnectionThreadData thread = new StreamConnectionThreadData(this, messageContext, networkDevice); thread.thread.Start(); data[i] = thread; } serviceCall.channelIDs = channelIDs; serviceCall.channelType = netType; return(data); }
private Response RemoteServiceCall( UpDevice target, Call serviceCall, StreamConnectionThreadData[] streamData, CallContext messageContext) { try { logger.Log("Call service on " + target.name + ": " + Json.Serialize(serviceCall.ToJSON())); // Encodes and sends call message. string msg = Json.Serialize(serviceCall.ToJSON()) + "\n"; Response r; string responseMsg = SendMessage(msg, target); if (responseMsg != null) { r = Response.FromJSON(Json.Deserialize(responseMsg)); r.messageContext = messageContext; return r; } else throw new System.Exception("No response received from call."); } catch (System.Exception e) { logger.LogError("Error on remote service call: " + e.ToString()); CloseStreams(streamData); throw new ServiceCallException(e); } }
private StreamConnectionThreadData[] OpenStreamChannel(UpDevice device, Call serviceCall, CallContext messageContext) { StreamConnectionThreadData[] data = null; //Channel type decision string netType = null; if (serviceCall.channelType != null) netType = serviceCall.channelType; else { UpNetworkInterface network = GetAppropriateInterface(device); netType = network.netType; } int channels = serviceCall.channels; data = new StreamConnectionThreadData[channels]; string[] channelIDs = new string[channels]; for (int i = 0; i < channels; i++) { NetworkDevice networkDevice = GetAvailableNetworkDevice(netType); channelIDs[i] = Util.GetPort(networkDevice.networkDeviceName); StreamConnectionThreadData thread = new StreamConnectionThreadData(this, messageContext, networkDevice); thread.thread.Start(); data[i] = thread; } serviceCall.channelIDs = channelIDs; serviceCall.channelType = netType; return data; }
private Response LocalServiceCall( Call serviceCall, StreamConnectionThreadData[] streamData, CallContext messageContext) { logger.Log("Handling Local ServiceCall"); try { Response response = HandleServiceCall(serviceCall, messageContext); response.messageContext = messageContext; return response; } catch (System.Exception e) { // if there was an opened stream channel, it must be closed CloseStreams(streamData); throw new ServiceCallException(e); } }
private void CloseStreams(StreamConnectionThreadData[] streamData) { if (streamData != null) { foreach (var s in streamData) s.thread.Abort(); } }