/// <summary> /// Unmarshals and deallocates an OPCHDA_MODIFIEDITEM structure. /// </summary> internal static TsCHdaModifiedValueCollection GetModifiedValueCollection(OpcRcw.Hda.OPCHDA_MODIFIEDITEM input, bool deallocate) { TsCHdaModifiedValueCollection output = new TsCHdaModifiedValueCollection(); output.ClientHandle = input.hClient; object[] values = Com.Interop.GetVARIANTs(ref input.pvDataValues, input.dwCount, deallocate); DateTime[] timestamps = Utilities.Interop.GetDateTimes(ref input.pftTimeStamps, input.dwCount, deallocate); int[] qualities = Utilities.Interop.GetInt32s(ref input.pdwQualities, input.dwCount, deallocate); DateTime[] modificationTimes = Utilities.Interop.GetDateTimes(ref input.pftModificationTime, input.dwCount, deallocate); int[] editTypes = Utilities.Interop.GetInt32s(ref input.pEditType, input.dwCount, deallocate); string[] users = Utilities.Interop.GetUnicodeStrings(ref input.szUser, input.dwCount, deallocate); for (int ii = 0; ii < input.dwCount; ii++) { TsCHdaModifiedValue value = new TsCHdaModifiedValue(); value.Value = values[ii]; value.Timestamp = timestamps[ii]; value.Quality = new TsCDaQuality((short)(qualities[ii] & 0x0000FFFF)); value.HistorianQuality = (TsCHdaQuality)((int)(qualities[ii] & 0xFFFF0000)); value.ModificationTime = modificationTimes[ii]; value.EditType = (TsCHdaEditType)editTypes[ii]; value.User = users[ii]; output.Add(value); } return(output); }
/// <summary> /// Unmarshals and deallocates an array of OPCHDA_MODIFIEDITEM structures. /// </summary> internal static TsCHdaModifiedValueCollection[] GetModifiedValueCollections(ref IntPtr pInput, int count, bool deallocate) { TsCHdaModifiedValueCollection[] output = null; if (pInput != IntPtr.Zero && count > 0) { output = new TsCHdaModifiedValueCollection[count]; IntPtr pos = pInput; for (int ii = 0; ii < count; ii++) { output[ii] = GetModifiedValueCollection(pos, deallocate); pos = (IntPtr)(pos.ToInt64() + Marshal.SizeOf(typeof(OpcRcw.Hda.OPCHDA_MODIFIEDITEM))); } if (deallocate) { Marshal.FreeCoTaskMem(pInput); pInput = IntPtr.Zero; } } return(output); }
/// <summary> /// Unmarshals and deallocates an OPCHDA_MODIFIEDITEM structure. /// </summary> internal static TsCHdaModifiedValueCollection GetModifiedValueCollection(IntPtr pInput, bool deallocate) { TsCHdaModifiedValueCollection output = null; if (pInput != IntPtr.Zero) { object item = Marshal.PtrToStructure(pInput, typeof(OpcRcw.Hda.OPCHDA_MODIFIEDITEM)); output = GetModifiedValueCollection((OpcRcw.Hda.OPCHDA_MODIFIEDITEM)item, deallocate); if (deallocate) { Marshal.DestroyStructure(pInput, typeof(OpcRcw.Hda.OPCHDA_MODIFIEDITEM)); } } return(output); }
/// <summary> /// Called when an asynchronous read modified request completes. /// </summary> public void OnReadModifiedComplete( int dwTransactionID, int hrStatus, int dwNumItems, OPCHDA_MODIFIEDITEM[] pItemValues, int[] phrErrors) { try { lock (this) { // lookup request transaction. Request request = (Request)m_requests[dwTransactionID]; if (request == null) { return; } // unmarshal results. TsCHdaModifiedValueCollection[] results = new TsCHdaModifiedValueCollection[pItemValues.Length]; for (int ii = 0; ii < pItemValues.Length; ii++) { results[ii] = Interop.GetModifiedValueCollection(pItemValues[ii], false); results[ii].ServerHandle = pItemValues[ii].hClient; results[ii].Result = Technosoftware.DaAeHdaClient.Utilities.Interop.GetResultID(phrErrors[ii]); } // invoke callback - remove request if all results arrived. if (request.InvokeCallback(results)) { m_requests.Remove(request.RequestID); } } } catch (Exception exception) { HandleException(dwTransactionID, exception); } }