using Serein.Library; using Serein.Library.Api; using Serein.Library.FlowNode; using Serein.Library.Utils; using Serein.NodeFlow.Tool; using System.Reflection; namespace Serein.NodeFlow.Env { /// /// 流程运行环境 /// public class FlowEnvironment : IFlowEnvironment, IFlowEnvironmentEvent { public FlowEnvironment() { flowEnvironment = new LocalFlowEnvironment(); // 默认使用本地环境 currentFlowEnvironment = flowEnvironment; currentFlowEnvironmentEvent = flowEnvironment; SereinEnv.SetEnv(currentFlowEnvironment); } /// /// 本地环境 /// private readonly LocalFlowEnvironment flowEnvironment; /// /// 远程环境 /// private RemoteFlowEnvironment remoteFlowEnvironment; /// /// 本地环境事件 /// private readonly IFlowEnvironmentEvent flowEnvironmentEvent; /// /// 远程环境事件 /// private IFlowEnvironmentEvent remoteFlowEnvironmentEvent; /// /// 管理当前环境 /// private IFlowEnvironment currentFlowEnvironment; /// /// 管理当前环境事件 /// private IFlowEnvironmentEvent currentFlowEnvironmentEvent; private int _loadingProjectFlag = 0; // 使用原子自增代替锁 /// /// 传入false时,将停止数据通知。传入true时, /// /// public void SetProjectLoadingFlag(bool value) { Interlocked.Exchange(ref _loadingProjectFlag, value ? 1 : 0); } /// /// 判断是否正在加载项目 /// /// public bool IsLoadingProject() { return Interlocked.CompareExchange(ref _loadingProjectFlag, 1, 1) == 1; } /// public IFlowEnvironment CurrentEnv { get => currentFlowEnvironment; } /// public UIContextOperation UIContextOperation => currentFlowEnvironment.UIContextOperation; /// public NodeMVVMManagement NodeMVVMManagement => currentFlowEnvironment.NodeMVVMManagement; /// public ISereinIOC IOC => currentFlowEnvironment.IOC; /// public IFlowEnvironmentEvent Event => currentFlowEnvironment.Event; /// public string EnvName => currentFlowEnvironment.EnvName; /// public string ProjectFileLocation => currentFlowEnvironment.EnvName; /// public bool IsGlobalInterrupt => currentFlowEnvironment.IsGlobalInterrupt; /// public bool IsControlRemoteEnv => currentFlowEnvironment.IsControlRemoteEnv; /// public InfoClass InfoClass { get => currentFlowEnvironment.InfoClass; set => currentFlowEnvironment.InfoClass = value; } /// public RunState FlowState { get => currentFlowEnvironment.FlowState; set => currentFlowEnvironment.FlowState = value; } /// public event LoadDllHandler OnDllLoad { add { currentFlowEnvironmentEvent.OnDllLoad += value; } remove { currentFlowEnvironmentEvent.OnDllLoad -= value; } } /// public event ProjectLoadedHandler OnProjectLoaded { add { currentFlowEnvironmentEvent.OnProjectLoaded += value; } remove { currentFlowEnvironmentEvent.OnProjectLoaded -= value; } } /// public event ProjectSavingHandler? OnProjectSaving { add { currentFlowEnvironmentEvent.OnProjectSaving += value; } remove { currentFlowEnvironmentEvent.OnProjectSaving -= value; } } /// public event NodeConnectChangeHandler OnNodeConnectChange { add { currentFlowEnvironmentEvent.OnNodeConnectChange += value; } remove { currentFlowEnvironmentEvent.OnNodeConnectChange -= value; } } /// public event CanvasCreateHandler OnCanvasCreate { add { currentFlowEnvironmentEvent.OnCanvasCreate += value; } remove { currentFlowEnvironmentEvent.OnCanvasCreate -= value; } } /// public event CanvasRemoveHandler OnCanvasRemove { add { currentFlowEnvironmentEvent.OnCanvasRemove += value; } remove { currentFlowEnvironmentEvent.OnCanvasRemove -= value; } } /// public event NodeCreateHandler OnNodeCreate { add { currentFlowEnvironmentEvent.OnNodeCreate += value; } remove { currentFlowEnvironmentEvent.OnNodeCreate -= value; } } /// public event NodeRemoveHandler OnNodeRemove { add { currentFlowEnvironmentEvent.OnNodeRemove += value; } remove { currentFlowEnvironmentEvent.OnNodeRemove -= value; } } /// public event NodePlaceHandler OnNodePlace { add { currentFlowEnvironmentEvent.OnNodePlace += value; } remove { currentFlowEnvironmentEvent.OnNodePlace -= value; } } /// public event NodeTakeOutHandler OnNodeTakeOut { add { currentFlowEnvironmentEvent.OnNodeTakeOut += value; } remove { currentFlowEnvironmentEvent.OnNodeTakeOut -= value; } } /// public event StartNodeChangeHandler OnStartNodeChange { add { currentFlowEnvironmentEvent.OnStartNodeChange += value; } remove { currentFlowEnvironmentEvent.OnStartNodeChange -= value; } } /// public event FlowRunCompleteHandler OnFlowRunComplete { add { currentFlowEnvironmentEvent.OnFlowRunComplete += value; } remove { currentFlowEnvironmentEvent.OnFlowRunComplete -= value; } } /// public event MonitorObjectChangeHandler OnMonitorObjectChange { add { currentFlowEnvironmentEvent.OnMonitorObjectChange += value; } remove { currentFlowEnvironmentEvent.OnMonitorObjectChange -= value; } } /// public event NodeInterruptStateChangeHandler OnNodeInterruptStateChange { add { currentFlowEnvironmentEvent.OnNodeInterruptStateChange += value; } remove { currentFlowEnvironmentEvent.OnNodeInterruptStateChange -= value; } } /// public event ExpInterruptTriggerHandler OnInterruptTrigger { add { currentFlowEnvironmentEvent.OnInterruptTrigger += value; } remove { currentFlowEnvironmentEvent.OnInterruptTrigger -= value; } } /// public event IOCMembersChangedHandler OnIOCMembersChanged { add { currentFlowEnvironmentEvent.OnIOCMembersChanged += value; } remove { currentFlowEnvironmentEvent.OnIOCMembersChanged -= value; } } /// public event NodeLocatedHandler OnNodeLocated { add { currentFlowEnvironmentEvent.OnNodeLocated += value; } remove { currentFlowEnvironmentEvent.OnNodeLocated -= value; } } /// public event NodeMovedHandler OnNodeMoved { add { currentFlowEnvironmentEvent.OnNodeMoved += value; } remove { currentFlowEnvironmentEvent.OnNodeMoved -= value; } } /// public event EnvOutHandler OnEnvOut { add { currentFlowEnvironmentEvent.OnEnvOut += value; } remove { currentFlowEnvironmentEvent.OnEnvOut -= value; } } /// public void ActivateFlipflopNode(string nodeGuid) { currentFlowEnvironment.ActivateFlipflopNode(nodeGuid); } /// public async Task CreateCanvasAsync(string canvasName, int width, int height) { return await currentFlowEnvironment.CreateCanvasAsync(canvasName, width, height); } /// public async Task RemoveCanvasAsync(string canvasGuid) { return await currentFlowEnvironment.RemoveCanvasAsync(canvasGuid); } /// public async Task ConnectInvokeNodeAsync(string canvasGuid, string fromNodeGuid, string toNodeGuid, JunctionType fromNodeJunctionType, JunctionType toNodeJunctionType, ConnectionInvokeType invokeType) { return await currentFlowEnvironment.ConnectInvokeNodeAsync(canvasGuid, fromNodeGuid, toNodeGuid, fromNodeJunctionType, toNodeJunctionType, invokeType); } /// public async Task ConnectArgSourceNodeAsync(string canvasGuid, string fromNodeGuid, string toNodeGuid, JunctionType fromNodeJunctionType, JunctionType toNodeJunctionType, ConnectionArgSourceType argSourceType, int argIndex) { return await currentFlowEnvironment.ConnectArgSourceNodeAsync(canvasGuid, fromNodeGuid, toNodeGuid, fromNodeJunctionType, toNodeJunctionType, argSourceType, argIndex); } /// public async Task<(bool, RemoteMsgUtil)> ConnectRemoteEnv(string addres, int port, string token) { // 连接成功,切换远程环境 (var isConnect, var remoteMsgUtil) = await currentFlowEnvironment.ConnectRemoteEnv(addres, port, token); if (isConnect) { remoteFlowEnvironment ??= new RemoteFlowEnvironment(remoteMsgUtil, this.UIContextOperation); currentFlowEnvironment = remoteFlowEnvironment; } return (isConnect, remoteMsgUtil); } /// public async Task LoadNodeInfosAsync(List nodeInfos) { SetProjectLoadingFlag(false); await currentFlowEnvironment.LoadNodeInfosAsync(nodeInfos); // 装饰器调用 SetProjectLoadingFlag(true); } /// public async Task CreateNodeAsync(string canvasGuid, NodeControlType nodeBase, PositionOfUI position, MethodDetailsInfo methodDetailsInfo = null) { SetProjectLoadingFlag(false); var result = await currentFlowEnvironment.CreateNodeAsync(canvasGuid, nodeBase, position, methodDetailsInfo); // 装饰器调用 SetProjectLoadingFlag(true); return result; } /// public async Task PlaceNodeToContainerAsync(string canvasGuid, string nodeGuid, string containerNodeGuid) { SetProjectLoadingFlag(false); var result = await currentFlowEnvironment.PlaceNodeToContainerAsync(canvasGuid, nodeGuid, containerNodeGuid); // 装饰器调用 SetProjectLoadingFlag(true); return result; } /// public async Task TakeOutNodeToContainerAsync(string canvasGuid, string nodeGuid) { SetProjectLoadingFlag(false); var result = await currentFlowEnvironment.TakeOutNodeToContainerAsync(canvasGuid,nodeGuid); // 装饰器调用 SetProjectLoadingFlag(true); return result; } /// public async Task ExitFlowAsync() { return await currentFlowEnvironment.ExitFlowAsync(); } /// public void ExitRemoteEnv() { currentFlowEnvironment.ExitRemoteEnv(); } /// public async Task GetEnvInfoAsync() { return await currentFlowEnvironment.GetEnvInfoAsync(); } /// public async Task GetProjectInfoAsync() { return await currentFlowEnvironment.GetProjectInfoAsync(); } /// public void LoadLibrary(string dllPath) { currentFlowEnvironment.LoadLibrary(dllPath); } /// public void SaveProject() { currentFlowEnvironment.SaveProject(); } /// public void LoadProject(FlowEnvInfo flowEnvInfo, string filePath) { if (flowEnvInfo is null) return; SetProjectLoadingFlag(false); currentFlowEnvironment.LoadProject(flowEnvInfo, filePath); SetProjectLoadingFlag(true); } /// public void MonitorObjectNotification(string nodeGuid, object monitorData, MonitorObjectEventArgs.ObjSourceType sourceType) { currentFlowEnvironment.MonitorObjectNotification(nodeGuid, monitorData, sourceType); } /// public void MoveNode(string canvasGuid, string nodeGuid, double x, double y) { currentFlowEnvironment.MoveNode(canvasGuid, nodeGuid, x, y); } /// public void NodeLocated(string nodeGuid) { currentFlowEnvironment.NodeLocated(nodeGuid); } /// public bool TryUnloadLibrary(string assemblyName) { return currentFlowEnvironment.TryUnloadLibrary(assemblyName); } /// public async Task SetConnectPriorityInvoke(string fromNodeGuid, string toNodeGuid, ConnectionInvokeType connectionType) { return await currentFlowEnvironment.SetConnectPriorityInvoke(fromNodeGuid, toNodeGuid, connectionType); } /// public async Task RemoveConnectInvokeAsync(string canvasGuid, string fromNodeGuid, string toNodeGuid, ConnectionInvokeType connectionType) { return await currentFlowEnvironment.RemoveConnectInvokeAsync(canvasGuid, fromNodeGuid, toNodeGuid, connectionType); } /// public async Task RemoveConnectArgSourceAsync(string canvasGuid, string fromNodeGuid, string toNodeGuid, int argIndex) { return await currentFlowEnvironment.RemoveConnectArgSourceAsync(canvasGuid, fromNodeGuid, toNodeGuid, argIndex); } /// public async Task RemoveNodeAsync(string canvasGuid, string nodeGuid) { return await currentFlowEnvironment.RemoveNodeAsync(canvasGuid, nodeGuid); } /// /// 输出信息 /// /// 日志内容 /// 日志类别 /// 日志级别 public void WriteLine(InfoType type, string message, InfoClass @class = InfoClass.Trivial) { currentFlowEnvironment.WriteLine(type, message, @class); } #region MyRegion #if false public async Task AddInterruptExpressionAsync(string key, string expression) { return await currentFlowEnvironment.AddInterruptExpressionAsync(key, expression); } public async Task<(bool, string[])> CheckObjMonitorStateAsync(string key) { return await currentFlowEnvironment.CheckObjMonitorStateAsync(key); } public async Task GetOrCreateGlobalInterruptAsync() { return await currentFlowEnvironment.InterruptNode(); } public void SetMonitorObjState(string key, bool isMonitor) { currentFlowEnvironment.SetMonitorObjState(key, isMonitor); } public async Task SetNodeInterruptAsync(string nodeGuid, bool isInterrupt) { return await currentFlowEnvironment.SetNodeInterruptAsync(nodeGuid, isInterrupt); } #endif #endregion /// public async Task SetStartNodeAsync(string canvasGuid, string nodeGuid) { return await currentFlowEnvironment.SetStartNodeAsync(canvasGuid, nodeGuid); } /// public async Task StartFlowAsync(string[] canvasGuids) { return await currentFlowEnvironment.StartFlowAsync(canvasGuids); } /// public async Task StartFlowFromSelectNodeAsync(string startNodeGuid) { return await currentFlowEnvironment.StartFlowFromSelectNodeAsync(startNodeGuid); } /// public async Task StartRemoteServerAsync(int port = 7525) { await currentFlowEnvironment.StartRemoteServerAsync(port); } /// public void StopRemoteServer() { currentFlowEnvironment.StopRemoteServer(); } /// public void TerminateFlipflopNode(string nodeGuid) { currentFlowEnvironment.TerminateFlipflopNode(nodeGuid); } /// public void TriggerInterrupt(string nodeGuid, string expression, InterruptTriggerEventArgs.InterruptTriggerType type) { currentFlowEnvironment.TriggerInterrupt(nodeGuid, expression, type); } /// public void SetUIContextOperation(UIContextOperation uiContextOperation) { currentFlowEnvironment.SetUIContextOperation(uiContextOperation); } /// public void UseExternalIOC(ISereinIOC ioc) { currentFlowEnvironment.UseExternalIOC(ioc); } /// public bool TryGetNodeModel(string nodeGuid, out IFlowNode nodeModel) { return currentFlowEnvironment.TryGetNodeModel(nodeGuid, out nodeModel); } /// public bool TryGetDelegateDetails(string libraryName, string methodName, out DelegateDetails del) { return currentFlowEnvironment.TryGetDelegateDetails(libraryName, methodName, out del); } /// public bool TryGetMethodDetailsInfo(string libraryName, string methodName, out MethodDetailsInfo mdInfo) { return currentFlowEnvironment.TryGetMethodDetailsInfo(libraryName, methodName, out mdInfo); } /// public async Task NotificationNodeValueChangeAsync(string nodeGuid, string path, object value) { if (!IsLoadingProject()) { return; } if (currentFlowEnvironment.IsControlRemoteEnv) { await currentFlowEnvironment.NotificationNodeValueChangeAsync(nodeGuid, path, value); } } /// public async Task ChangeParameter(string nodeGuid, bool isAdd, int paramIndex) { return await currentFlowEnvironment.ChangeParameter(nodeGuid, isAdd, paramIndex); } #region 流程依赖类库的接口 /// public bool LoadNativeLibraryOfRuning(string file) { return currentFlowEnvironment.LoadNativeLibraryOfRuning(file); } /// public void LoadAllNativeLibraryOfRuning(string path, bool isRecurrence = true) { currentFlowEnvironment.LoadAllNativeLibraryOfRuning(path,isRecurrence); } #endregion } }