/// <summary> /// Unmarshals and deallocates an array of OPCHDA_ATTRIBUTE structures. /// </summary> internal static TsCHdaAttributeValueCollection[] GetAttributeValueCollections(ref IntPtr pInput, int count, bool deallocate) { TsCHdaAttributeValueCollection[] output = null; if (pInput != IntPtr.Zero && count > 0) { output = new TsCHdaAttributeValueCollection[count]; IntPtr pos = pInput; for (int ii = 0; ii < count; ii++) { output[ii] = GetAttributeValueCollection(pos, deallocate); pos = (IntPtr)(pos.ToInt64() + Marshal.SizeOf(typeof(OpcRcw.Hda.OPCHDA_ATTRIBUTE))); } if (deallocate) { Marshal.FreeCoTaskMem(pInput); pInput = IntPtr.Zero; } } return(output); }
/// <summary> /// Called when an asynchronous read attributes request completes. /// </summary> public void OnReadAttributeComplete( int dwTransactionID, int hrStatus, int hClient, int dwNumItems, OPCHDA_ATTRIBUTE[] pAttributeValues, int[] phrErrors) { try { lock (this) { // lookup request transaction. Request request = (Request)m_requests[dwTransactionID]; if (request == null) { return; } // create item object to collect results. TsCHdaItemAttributeCollection item = new TsCHdaItemAttributeCollection(); item.ServerHandle = hClient; // unmarshal results. TsCHdaAttributeValueCollection[] results = new TsCHdaAttributeValueCollection[pAttributeValues.Length]; for (int ii = 0; ii < pAttributeValues.Length; ii++) { results[ii] = Interop.GetAttributeValueCollection(pAttributeValues[ii], false); results[ii].Result = Utilities.Interop.GetResultId(phrErrors[ii]); item.Add(results[ii]); } // invoke callback - remove request if all results arrived. if (request.InvokeCallback(item)) { m_requests.Remove(request.RequestID); } } } catch (Exception exception) { HandleException(dwTransactionID, exception); } }
/// <summary> /// Unmarshals and deallocates an OPCHDA_ATTRIBUTE structure. /// </summary> internal static TsCHdaAttributeValueCollection GetAttributeValueCollection(IntPtr pInput, bool deallocate) { TsCHdaAttributeValueCollection output = null; if (pInput != IntPtr.Zero) { object item = Marshal.PtrToStructure(pInput, typeof(OpcRcw.Hda.OPCHDA_ATTRIBUTE)); output = GetAttributeValueCollection((OpcRcw.Hda.OPCHDA_ATTRIBUTE)item, deallocate); if (deallocate) { Marshal.DestroyStructure(pInput, typeof(OpcRcw.Hda.OPCHDA_ATTRIBUTE)); } } return(output); }
/// <summary> /// Unmarshals and deallocates an OPCHDA_ATTRIBUTE structure. /// </summary> internal static TsCHdaAttributeValueCollection GetAttributeValueCollection(OpcRcw.Hda.OPCHDA_ATTRIBUTE input, bool deallocate) { TsCHdaAttributeValueCollection output = new TsCHdaAttributeValueCollection(); output.AttributeID = input.dwAttributeID; object[] values = Com.Interop.GetVARIANTs(ref input.vAttributeValues, input.dwNumValues, deallocate); DateTime[] timestamps = Utilities.Interop.GetDateTimes(ref input.ftTimeStamps, input.dwNumValues, deallocate); for (int ii = 0; ii < input.dwNumValues; ii++) { TsCHdaAttributeValue value = new TsCHdaAttributeValue(); value.Value = values[ii]; value.Timestamp = timestamps[ii]; output.Add(value); } return(output); }