private static void SubscribeOnCloudContainer <TCloudItem>(this IDataRecorderPlugin recorder, ISourceTree source,
                                                                   string topicName)
            where TCloudItem : struct, ICloudItem
        {
            var addedName = nameof(IContainer <ICloudItem> .OnAdded);
            var add       = Observable.FromEvent <EventHandler <AddedEventArgs <TCloudItem> > >(
                h => (sender, args) => recorder.OnAdded(topicName, args.AddedItems.ToList()),
                h => source.GetType().GetEvent(addedName).AddEventHandler(source, h),
                h => source.GetType().GetEvent(addedName).RemoveEventHandler(source, h))
                            .Subscribe();

            var updatedName = nameof(IContainer <ICloudItem> .OnUpdated);
            var updated     = Observable.FromEvent <EventHandler <UpdatedEventArgs <TCloudItem> > >(
                h => (sender, args) => recorder.OnUpdated(topicName, args.UpdatedItems.ToList()),
                h => source.GetType().GetEvent(updatedName).AddEventHandler(source, h),
                h => source.GetType().GetEvent(updatedName).RemoveEventHandler(source, h))
                              .Subscribe();

            var removedName = nameof(IContainer <ICloudItem> .OnRemoved);
            var removed     = Observable.FromEvent <EventHandler <RemovedEventArgs> >(
                h => (sender, args) => recorder.OnRemoved <TCloudItem>(topicName, args.RemovedIds.ToList()),
                h => source.GetType().GetEvent(removedName).AddEventHandler(source, h),
                h => source.GetType().GetEvent(removedName).RemoveEventHandler(source, h))
                              .Subscribe();

            Subscriptions[recorder][source].Add(add);
            Subscriptions[recorder][source].Add(updated);
            Subscriptions[recorder][source].Add(removed);

            recorder.OnAdded(source.DisplayName, (source as IContainer <TCloudItem>)?.ToList());
        }
 public void WriteSnapshot(IDataRecorderPlugin recorder)
 {
     foreach (var snapshotable in Children.OfType <ISnapshotable>())
     {
         snapshotable.WriteSnapshot(recorder);
     }
 }
        private static void SubscribeOnConnectableContainer <TCloudItem>(this IDataRecorderPlugin recorder,
                                                                         ISourceTree source,
                                                                         string topicName)
            where TCloudItem : struct, ICloudItem
        {
            var connectionsUpdatedName = nameof(IConnectableObjectsContainer <ICloudItem> .OnConnectionsUpdated);
            var connectionsUpdated     = Observable.FromEvent <EventHandler <ConnectionsEventArgs> >(
                h => (sender, args) => recorder.OnConnectionsUpdated <TCloudItem>(topicName, args.Items.ToList()),
                h => source.GetType().GetEvent(connectionsUpdatedName).AddEventHandler(source, h),
                h => source.GetType().GetEvent(connectionsUpdatedName).RemoveEventHandler(source, h))
                                         .Subscribe();

            var connectionsRemovedName = nameof(IConnectableObjectsContainer <ICloudItem> .OnConnectionsRemoved);
            var connectionsRemoved     = Observable.FromEvent <EventHandler <ConnectionsEventArgs> >(
                h => (sender, args) => recorder.OnConnectionsRemoved <TCloudItem>(topicName, args.Items.ToList()),
                h => source.GetType().GetEvent(connectionsRemovedName).AddEventHandler(source, h),
                h => source.GetType().GetEvent(connectionsRemovedName).RemoveEventHandler(source, h))
                                         .Subscribe();

            Subscriptions[recorder][source].Add(connectionsUpdated);
            Subscriptions[recorder][source].Add(connectionsRemoved);
            recorder.OnConnectionsUpdated <TCloudItem>(source.DisplayName, (source as IConnectableObjectsContainer <TCloudItem>)?
                                                       .Connections
                                                       .Select(l => (l.Point1.Id, l.Point2.Id))
                                                       .ToList());
            recorder.SubscribeOnCloudContainer <TCloudItem>(source, topicName);
        }
Пример #4
0
        private void Record(string filename)
        {
            _currentRecorder = PluginsPlayer.Plugins
                               .OfType <IDataRecorderPlugin>()
                               .FirstOrDefault(r => filename.EndsWith(r.Extension));

            if (_currentRecorder is null)
            {
                return;
            }

            _currentRecorder.FileName  = filename;
            _currentRecorder.Converter = DataSourcesManager.Converter;
            _currentRecorder.StartRecording();
            DataSourcesManager.MapSourceTree((elem, topic) => !_currentRecorder.SubscribeOn(elem, topic));
        }
        public static void UnsubscribeFromEverything(this IDataRecorderPlugin recorder)
        {
            if (!Subscriptions.ContainsKey(recorder))
            {
                return;
            }
            foreach (var s in Subscriptions[recorder])
            {
                foreach (var disposable in s.Value)
                {
                    disposable.Dispose();
                }
            }

            Subscriptions.Remove(recorder);
        }
        public static bool SubscribeOn(this IDataRecorderPlugin recorder, ISourceTree source, string topicName)
        {
            if (!Subscriptions.ContainsKey(recorder))
            {
                Subscriptions.Add(recorder, new Dictionary <ISourceTree, List <IDisposable> >());
            }
            if (Subscriptions[recorder].ContainsKey(source))
            {
                return(true);
            }
            Subscriptions[recorder].Add(source, new List <IDisposable>());

            if (source is IRemovable r)
            {
                r.OnRemoved += () => recorder.UnsubscribeFrom(source);
            }

            var type = source.GetType()
                       .GetInterfaces()
                       .FirstOrDefault(x => x.IsGenericType &&
                                       x.GetGenericTypeDefinition() == typeof(IConnectableObjectsContainer <>));

            if (type != null)
            {
                typeof(DataRecorderSubscriber)
                .GetMethod(nameof(SubscribeOnConnectableContainer),
                           BindingFlags.Static | BindingFlags.NonPublic)?
                .MakeGenericMethod(type.GetGenericArguments()[0])
                .Invoke(null, new object[] { recorder, source, topicName });
                return(true);
            }

            type = source.GetType()
                   .GetInterfaces()
                   .FirstOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IContainer <>));
            if (type != null)
            {
                typeof(DataRecorderSubscriber)
                .GetMethod(nameof(SubscribeOnCloudContainer), BindingFlags.Static | BindingFlags.NonPublic)?
                .MakeGenericMethod(type.GetGenericArguments()[0])
                .Invoke(null, new object[] { recorder, source, topicName });
                return(true);
            }

            return(false);
        }
 public static void UnsubscribeFrom(this IDataRecorderPlugin recorder, ISourceTree source)
 {
 }