public HermesMiddleware.DataAcquisitionServiceProxy.ExpressionType ConvertServer2Proxy(HermesMiddleware.DataAcquisitionServiceServer.ExpressionType sourceExpressionType) { HermesMiddleware.DataAcquisitionServiceProxy.ExpressionType targetExpressionType = new HermesMiddleware.DataAcquisitionServiceProxy.ExpressionType(); targetExpressionType.Items = new HermesMiddleware.DataAcquisitionServiceProxy.Expression[sourceExpressionType.Items.Length]; for (int i = 0; i < sourceExpressionType.Items.Length; i++) { targetExpressionType.Items[i] = ConvertServer2Proxy(sourceExpressionType.Items[i]); } return(targetExpressionType); }
public override HermesMiddleware.DataAcquisitionServiceServer.SensorData[] Query(string service, [System.Xml.Serialization.XmlElementAttribute("expressions")] HermesMiddleware.DataAcquisitionServiceServer.ExpressionType[] expressions, bool delegateCall) { ArrayList sensorDataArray = new ArrayList(); if (expressions == null || expressions.Length == 0 || expressions[0].Items == null) { return(null); } // get global stuff (cross-application-domain) Global global = (Global)Global.GetObject(Global.sClassName, Global.port); // get addresses of peers publishing the variable string[] sPeerAddresses = _GetPeers(global, service, expressions[0].Items[0].variable); if (expressions[0].Items[0].variable == "x" || expressions[0].Items[0].variable == "y" || expressions[0].Items[0].variable == "z") { sPeerAddresses = _GetPeers(global, service, "Position"); } if (sPeerAddresses != null) { foreach (string sPeerAddress in sPeerAddresses) { // get first part of name (e.g. PCC085C.us008.siemens.net) string[] sParts = sPeerAddress.Split('.'); if (String.Compare(sParts[0], Environment.MachineName, true) == 0) { // peer is this machine => perform query global.Query(service, expressions, ref sensorDataArray); } else { if (delegateCall) { try { // peer is different machine => delegate it to its DataAcquisitionService // initialize service proxy HermesMiddleware.DataAcquisitionServiceProxy.DataAcquisitionService serviceProxy = new HermesMiddleware.DataAcquisitionServiceProxy.DataAcquisitionService(); serviceProxy.Url = "http://" + sPeerAddress + ":" + global.portNumber + global.sVirtRoot + global.sASMX; HermesMiddleware.DataAcquisitionServiceProxy.ExpressionType[] tmpExpressions = new HermesMiddleware.DataAcquisitionServiceProxy.ExpressionType[expressions.Length]; for (int i = 0; i < expressions.Length; i++) { tmpExpressions[i] = ConvertServer2Proxy(expressions[i]); } // call query (false = do not delegate further) HermesMiddleware.DataAcquisitionServiceProxy.SensorData[] sensorDataProxy = serviceProxy.Query(service, tmpExpressions, false); HermesMiddleware.DataAcquisitionServiceServer.SensorData[] tmpSensorData = this.ConvertProxy2Server(sensorDataProxy); if (tmpSensorData != null && tmpSensorData.Length > 0) { // add data to array foreach (HermesMiddleware.DataAcquisitionServiceServer.SensorData data in tmpSensorData) { sensorDataArray.Add(data); } } } catch (Exception exp) { Console.WriteLine(exp); } } } } } // copy result to simple array HermesMiddleware.DataAcquisitionServiceServer.SensorData[] sensorData = new HermesMiddleware.DataAcquisitionServiceServer.SensorData[sensorDataArray.Count]; for (int i = 0; i < sensorDataArray.Count; i++) { sensorData[i] = (HermesMiddleware.DataAcquisitionServiceServer.SensorData)sensorDataArray[i]; } return(sensorData); }