/// <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;
            }
        }
Exemple #2
0
 /// <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);
 }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
        /// <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());
            }
        }