예제 #1
0
        //------------------------------------
        // Session List Management Functions
        //------------------------------------

        /// <summary>
        /// Delete session
        /// <summary>
        private async Task <bool> DeleteSession(SessionInfo session)
        {
            bool isSuccess = false;

            try
            {
                StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
                string        fullpath    = Path.Combine(localFolder.Path, SiteProfileManager.GetFullPath(App.SiteProfileId, session.profilePath));

                StorageFile targetFile = await StorageFile.GetFileFromPathAsync(fullpath);

                if (targetFile != null)
                {
                    await targetFile.DeleteAsync();
                }
                sessionConfig.sessions.Remove(session);
                await SiteProfileManager.DefaultSiteProfileManager?.SaveSessionConfig();

                isSuccess = true;
            }
            catch (Exception ex)
            {
                Debug.WriteLine("DeleteSession Exception! " + ex.Message);
            }
            return(isSuccess);
        }
예제 #2
0
        /// <summary>
        /// Rename session
        /// <summary>
        private async Task <bool> RenameSession(string targetName, SessionInfo session)
        {
            bool isSuccess = false;

            try
            {
                StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
                string        filepath    = Path.Combine(localFolder.Path, SiteProfileManager.GetFullPath(App.SiteProfileId, session.profilePath));

                StorageFile targetFile = await StorageFile.GetFileFromPathAsync(filepath);

                string targetFilename = String.Format("session_{0}.config.json", targetName);

                if (targetFile != null)
                {
                    await targetFile.RenameAsync(targetFilename, NameCollisionOption.FailIfExists);
                }
                session.sessionName = targetName;
                session.profilePath = targetFilename;

                await SiteProfileManager.DefaultSiteProfileManager?.SaveSessionConfig();

                isSuccess = true;
            }
            catch (Exception ex)
            {
                Debug.WriteLine("RenameSession Exception! " + ex.Message);
            }
            return(isSuccess);
        }
예제 #3
0
        /// <summary>
        /// On save button clicked
        /// -- save server connection settings and node subscription list
        ///    and exit this page, get back to main page
        /// <summary>
        private async void btnSave_Button_Click(object sender, RoutedEventArgs e)
        {
            EnableSessionOpButtons(false);
            OpcuaSessionConfig config         = null;
            var          sessionname          = m_design_session.SessionName;
            const string PROFILENAME_TEMPLATE = "session_{0}.json";

            if (sessionMgmtAction == SESSIONMGMT_ACTION.NEW)
            {
                sessionname = txtSessionName.Text;

                if (String.IsNullOrEmpty(sessionname))
                {
                    MessageDialog showDialog = new MessageDialog("Session Name must not be empty or duplicated.\nPlease enter a unique session name.");
                    showDialog.Commands.Add(new UICommand("OK")
                    {
                        Id = 1
                    });
                    showDialog.DefaultCommandIndex = 1;
                    showDialog.CancelCommandIndex  = 1;
                    var result = await showDialog.ShowAsync();

                    EnableSessionOpButtons(true);
                    return;
                }

                m_sessionConfig_full_path = Path.Combine(m_local, SiteProfileManager.GetFullPath(App.SiteProfileId, String.Format(PROFILENAME_TEMPLATE, sessionname)));
                while (File.Exists(m_sessionConfig_full_path))
                {
                    var timestamp = DateTime.Now.ToString("_yyMMddHHmmss");
                    sessionname = txtSessionName.Text + timestamp;
                    m_sessionConfig_full_path = Path.Combine(m_local, SiteProfileManager.GetFullPath(App.SiteProfileId, String.Format(PROFILENAME_TEMPLATE, sessionname)));
                }
            }
            config = SaveSessionConfig(m_sessionConfig_full_path, sessionname, m_design_session);

            if (config != null)
            {
                try
                {
                    if (sessionMgmtAction == SESSIONMGMT_ACTION.NEW)
                    {
                        sessionInfo.profilePath = String.Format(PROFILENAME_TEMPLATE, sessionname);
                        sessionInfo.sessionName = sessionname;
                        sessionInfo.sourceType  = m_design_session.Endpoint.Server.ApplicationName.ToString();
                        SiteProfileManager.DefaultSiteProfileManager.sessionConfig.sessions.Add(sessionInfo);
                        await SiteProfileManager.DefaultSiteProfileManager.SaveSessionConfig();
                    }
                    CloseSessionView_OpcuaClient();
                    Frame.Navigate(typeof(SessionMgmtPage), "RELOAD");
                }
                catch (Exception ex)
                {
                    Utils.Trace(ex, "SessionMgmt_OpcuaPage.btnSave_Button_Click() Exception: " + ex.Message);
                }
            }
            EnableSessionOpButtons(true);
        }
예제 #4
0
        /// <summary>
        /// On export-publishednodes button clicked
        //  -- generate "publishednodes.json" file to target file path
        /// <summary>
        private async void btnExportPublishedNodes_Click(object sender, RoutedEventArgs e)
        {
            if (sessionConfig?.sessions?.Count > 0)
            {
            }
            else
            {
                MessageDialog showDialog = new MessageDialog("No Node for Publishing!");
                showDialog.Commands.Add(new UICommand("Close")
                {
                    Id = 1
                });
                showDialog.DefaultCommandIndex = 1;
                showDialog.CancelCommandIndex  = 1;
                await showDialog.ShowAsync();

                return;
            }

            var picker = new Windows.Storage.Pickers.FileSavePicker();

            picker.SuggestedFileName      = SiteProfileManager.DEFAULT_PUBLISHEDNODESPATH;
            picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.Downloads;
            picker.FileTypeChoices.Add("JSON", new List <string>()
            {
                ".json"
            });

            StorageFile destfile = await picker.PickSaveFileAsync();

            if (destfile != null)
            {
                try
                {
                    StorageFolder localFolder = ApplicationData.Current.LocalFolder;
                    bool          isSuccess   = await SiteProfileManager.DefaultSiteProfileManager?.SavePublishedNodes();

                    if (isSuccess)
                    {
                        var         srcuri  = new Uri("ms-appdata:///local/" + SiteProfileManager.GetFullPath(App.SiteProfileId, SiteProfileManager.DEFAULT_PUBLISHEDNODESPATH));
                        StorageFile srcfile = await StorageFile.GetFileFromApplicationUriAsync(srcuri);

                        await srcfile.CopyAndReplaceAsync(destfile);

                        MessageDialog showDialog = new MessageDialog("Export PublisherNodes Done!\n" + destfile.Path);
                        showDialog.Commands.Add(new UICommand("Close")
                        {
                            Id = 1
                        });
                        showDialog.DefaultCommandIndex = 1;
                        showDialog.CancelCommandIndex  = 1;
                        await showDialog.ShowAsync();
                    }
                }
                catch (Exception ex)
                {
                    Debug.WriteLine("btnExportPublishedNodes_Click Exception! " + ex.Message);
                    MessageDialog showDialog = new MessageDialog("Export PublishedNodes Failed!\nError: " + ex.Message);
                    showDialog.Commands.Add(new UICommand("Close")
                    {
                        Id = 1
                    });
                    showDialog.DefaultCommandIndex = 1;
                    showDialog.CancelCommandIndex  = 1;
                    await showDialog.ShowAsync();
                }
            }
        }
예제 #5
0
        /// <summary>
        /// On page loaded
        /// </summary>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);

            App.unclosedSession = this;

            sessionInfo = e.Parameter as SessionInfo;

            if (sessionInfo == null)
            {
                sessionMgmtAction         = SESSIONMGMT_ACTION.NEW;
                sessionInfo               = new SessionInfo();
                sessionInfo.sessionName   = "";
                sessionInfo.profilePath   = "";
                sessionInfo.sourceType    = "";
                m_sessionConfig_full_path = "";
                m_sessionConfig           = null;
            }
            else
            {
                m_sessionConfig_full_path = Path.Combine(m_local, SiteProfileManager.GetFullPath(App.SiteProfileId, sessionInfo.profilePath));
                // json configuration
                m_sessionConfig = OpcuaSessionConfig.LoadFromJsonFile(m_sessionConfig_full_path);
            }


            ApplicationInstance      application   = OpcuaSessionConfig.OpcuaApplication;
            ApplicationConfiguration configuration = application.ApplicationConfiguration;
            ServiceMessageContext    context       = configuration.CreateMessageContext();

            if (!configuration.SecurityConfiguration.AutoAcceptUntrustedCertificates)
            {
                configuration.CertificateValidator.CertificateValidation += new CertificateValidationEventHandler(CertificateValidator_CertificateValidation);
            }

            m_context       = context;
            m_application   = application;
            m_configuration = configuration;

            SessionsCTRL.Configuration    = configuration;
            SessionsCTRL.MessageContext   = context;
            SessionsCTRL.AddressSpaceCtrl = BrowseCTRL;
            SessionsCTRL.NodeSelected    += SessionCtrl_NodeSelected;


            // disable cached endpoints from Opc.Ua.SampleClient.Config.xml
            //// get list of cached endpoints.
            //m_endpoints = m_configuration.LoadCachedEndpoints(true);
            m_endpoints = new ConfiguredEndpointCollection();
            m_endpoints.DiscoveryUrls = configuration.ClientConfiguration.WellKnownDiscoveryUrls;

            // work around to fill Configuration and DiscoveryUrls
            if (m_sessionConfig != null)
            {
                m_sessionConfig.endpoint.Configuration = EndpointConfiguration.Create(m_configuration);
                m_sessionConfig.endpoint.Description.Server.DiscoveryUrls.Add(m_sessionConfig.endpoint.EndpointUrl.AbsoluteUri.ToString());
                m_endpoints.Add(m_sessionConfig.endpoint);
            }

            // hook up endpoint selector
            EndpointSelectorCTRL.Initialize(m_endpoints, m_configuration);
            EndpointSelectorCTRL.ConnectEndpoint  += EndpointSelectorCTRL_ConnectEndpoint;
            EndpointSelectorCTRL.EndpointsChanged += EndpointSelectorCTRL_OnChange;

            BrowseCTRL.SessionTreeCtrl = SessionsCTRL;
            BrowseCTRL.NodeSelected   += BrowseCTRL_NodeSelected;

            btnDelSubscription.IsEnabled = false;
            btnAddSubscription.IsEnabled = false;

            btnDelSubscription.Click += ContextMenu_OnDelete;
            btnAddSubscription.Click += ContextMenu_OnReport;

            // exception dialog
            GuiUtils.ExceptionMessageDlg += ExceptionMessageDlg;

            EndpointSelectorCTRL.IsEnabled = false;
            BrowseCTRL.IsEnabled           = false;
            SessionsCTRL.IsEnabled         = false;

            txtSessionName.Text = sessionInfo.sessionName;

            if (sessionMgmtAction == SESSIONMGMT_ACTION.NEW)
            {
                txtSessionName.IsReadOnly      = false;
                btnReload.IsEnabled            = false;
                btnReload.Visibility           = Visibility.Collapsed;
                EndpointSelectorCTRL.IsEnabled = true;
            }
            else
            {
                if (m_sessionConfig == null)
                {
                    txtSessionName.IsReadOnly      = true;
                    EndpointSelectorCTRL.IsEnabled = true;
                    btnReload.IsEnabled            = false;
                }
                else
                {
                    txtSessionName.IsReadOnly = true;
                    btnReload.IsEnabled       = false;
                    var ignored = Task.Run(OpenSessionView_OpcuaClient);
                }
            }
        }