/// <summary> /// This method is used to write data of the specified list to the server. It is called /// by the ClientBase after the client application has prepared and committed the data /// values. /// </summary> /// <param name="listServerAlias"> The server identifier of the list containing the data objects to write. </param> /// <param name="elementValuesCollection"> The data values to write. </param> /// <returns> /// The list server aliases and result codes for the data objects whose write failed. Returns empty if all writes /// succeeded. /// </returns> public AliasResult[] WriteElementValues(uint listServerAlias, ElementValuesCollection elementValuesCollection) { if (_disposed) { throw new ObjectDisposedException("Cannot access a disposed ClientContext."); } if (!ServerContextIsOperational) { throw new InvalidOperationException(); } try { var request = new WriteElementValuesRequest { ContextId = _serverContextId, ListServerAlias = listServerAlias, ElementValuesCollection = elementValuesCollection }; WriteElementValuesReply reply = _resourceManagementClient.WriteElementValues(request); SetResourceManagementLastCallUtc(); return(reply.Results.ToArray()); } catch (Exception ex) { ProcessRemoteMethodCallException(ex); throw; } }
/// <summary> /// Returns null, if incomplete ElementValuesCollection. /// </summary> /// <param name="dataList"></param> /// <param name="elementValuesCollections"></param> /// <returns></returns> private ClientElementValueListItem[]? ElementValuesCallback(ClientElementValueList dataList, ElementValuesCollection elementValuesCollections) { ClientElementValueListItem[]? changedListItems = dataList.OnElementValuesCallback(elementValuesCollections); if (changedListItems is not null && changedListItems.Length > 0) { List <ValueStatusTimestamp> changedValuesList = new List <ValueStatusTimestamp>(changedListItems.Length); foreach (ClientElementValueListItem changedListItem in changedListItems) { changedValuesList.Add(changedListItem.ValueStatusTimestamp); } dataList.RaiseElementValuesCallbackEvent(changedListItems, changedValuesList.ToArray()); } return(changedListItems); }
/// <summary> /// /// </summary> /// <returns></returns> public IEnumerable <ClientElementValueListItem> CommitWriteElementValueListItems() { if (Disposed) { throw new ObjectDisposedException("Cannot access a disposed ClientElementValueList."); } var fullElementValuesCollection = new ElementValuesCollection(); using (var memoryStream = new MemoryStream(1024)) { using (var writer = new SerializationWriter(memoryStream)) { foreach (ClientElementValueListItem item in ListItemsManager) { if (item.PendingWriteValueStatusTimestamp is null) { continue; } uint alias = item.ServerAlias; ValueStatusTimestamp valueStatusTimestamp = item.PendingWriteValueStatusTimestamp.Value; switch (valueStatusTimestamp.Value.ValueStorageType) { case Ssz.Utils.Any.StorageType.Double: fullElementValuesCollection.DoubleAliases.Add(alias); fullElementValuesCollection.DoubleValueStatusCodes.Add(valueStatusTimestamp.ValueStatusCode); fullElementValuesCollection.DoubleTimestamps.Add(DateTimeHelper.ConvertToTimestamp(valueStatusTimestamp.TimestampUtc)); fullElementValuesCollection.DoubleValues.Add(valueStatusTimestamp.Value.StorageDouble); break; case Ssz.Utils.Any.StorageType.UInt32: fullElementValuesCollection.UintAliases.Add(alias); fullElementValuesCollection.UintValueStatusCodes.Add(valueStatusTimestamp.ValueStatusCode); fullElementValuesCollection.UintTimestamps.Add(DateTimeHelper.ConvertToTimestamp(valueStatusTimestamp.TimestampUtc)); fullElementValuesCollection.UintValues.Add(valueStatusTimestamp.Value.StorageUInt32); break; case Ssz.Utils.Any.StorageType.Object: fullElementValuesCollection.ObjectAliases.Add(alias); fullElementValuesCollection.ObjectValueStatusCodes.Add(valueStatusTimestamp.ValueStatusCode); fullElementValuesCollection.ObjectTimestamps.Add(DateTimeHelper.ConvertToTimestamp(valueStatusTimestamp.TimestampUtc)); writer.WriteObject(valueStatusTimestamp.Value.StorageObject); break; } item.HasWritten(StatusCode.OK); } } memoryStream.Position = 0; fullElementValuesCollection.ObjectValues = Google.Protobuf.ByteString.FromStream(memoryStream); } var result = new List <ClientElementValueListItem>(); foreach (ElementValuesCollection elementValuesCollection in fullElementValuesCollection.SplitForCorrectGrpcMessageSize()) { AliasResult[] listAliasesResult = Context.WriteElementValues(ListServerAlias, elementValuesCollection); foreach (AliasResult aliasResult in listAliasesResult) { ClientElementValueListItem?item = null; if (ListItemsManager.TryGetValue(aliasResult.ClientAlias, out item)) { item.HasWritten((StatusCode)aliasResult.StatusCode); result.Add(item); } } } return(result); }
/// <summary> /// Returns changed ClientElementValueListItems or null, if waiting next message. /// </summary> /// <param name="elementValuesCollection"></param> /// <returns></returns> public ClientElementValueListItem[]? OnElementValuesCallback(ElementValuesCollection elementValuesCollection) { if (Disposed) { throw new ObjectDisposedException("Cannot access a disposed ClientElementValueList."); } if (elementValuesCollection.Guid != @"" && _incompleteElementValuesCollection.Count > 0) { var beginElementValuesCollection = _incompleteElementValuesCollection.TryGetValue(elementValuesCollection.Guid); if (beginElementValuesCollection is not null) { _incompleteElementValuesCollection.Remove(elementValuesCollection.Guid); beginElementValuesCollection.CombineWith(elementValuesCollection); elementValuesCollection = beginElementValuesCollection; } } if (elementValuesCollection.NextCollectionGuid != @"") { _incompleteElementValuesCollection[elementValuesCollection.NextCollectionGuid] = elementValuesCollection; return(null); } else { var changedListItems = new List <ClientElementValueListItem>(); for (int index = 0; index < elementValuesCollection.DoubleAliases.Count; index++) { ClientElementValueListItem?item; ListItemsManager.TryGetValue(elementValuesCollection.DoubleAliases[index], out item); if (item is not null) { item.UpdateValue(elementValuesCollection.DoubleValues[index], elementValuesCollection.DoubleValueStatusCodes[index], elementValuesCollection.DoubleTimestamps[index].ToDateTime() ); changedListItems.Add(item); } } for (int index = 0; index < elementValuesCollection.UintAliases.Count; index++) { ClientElementValueListItem?item; ListItemsManager.TryGetValue(elementValuesCollection.UintAliases[index], out item); if (item is not null) { item.UpdateValue(elementValuesCollection.UintValues[index], elementValuesCollection.UintValueStatusCodes[index], elementValuesCollection.UintTimestamps[index].ToDateTime() ); changedListItems.Add(item); } } if (elementValuesCollection.ObjectAliases.Count > 0) { using (var memoryStream = new MemoryStream(elementValuesCollection.ObjectValues.ToByteArray())) using (var reader = new SerializationReader(memoryStream)) { for (int index = 0; index < elementValuesCollection.ObjectAliases.Count; index++) { object?objectValue = reader.ReadObject(); ClientElementValueListItem?item; ListItemsManager.TryGetValue(elementValuesCollection.ObjectAliases[index], out item); if (item is not null) { item.UpdateValue(objectValue, elementValuesCollection.ObjectValueStatusCodes[index], elementValuesCollection.ObjectTimestamps[index].ToDateTime() ); changedListItems.Add(item); } } } } return(changedListItems.ToArray()); } }