Example #1
0
        public void AddByAasPackage(PackageCentral packageCentral, AdminShellPackageEnv env, string fn)
        {
            // access
            if (env == null)
            {
                return;
            }

            // ok, add
            var fi = PackageContainerFactory.GuessAndCreateFor(
                packageCentral,
                location: fn,
                fullItemLocation: fn,
                overrideLoadResident: false,
                containerOptions: PackageContainerOptionsBase.CreateDefault(Options.Curr));

            if (fi is PackageContainerRepoItem ri)
            {
                fi.Env = env;
                ri.CalculateIdsTagAndDesc();
                ri.VisualState = PackageContainerRepoItem.VisualStateEnum.ReadFrom;
                ri.VisualTime  = 2.0;
                this.Add(ri);
            }
        }
Example #2
0
        public bool Load(
            PackageCentral packageCentral,
            string location,
            string fullItemLocation,
            bool overrideLoadResident,
            PackageContainerOptionsBase containerOptions = null,
            PackCntRuntimeOptions runtimeOptions         = null)
        {
            try
            {
                // close old one
                if (Container != null)
                {
                    if (Container.IsOpen)
                    {
                        Container.Close();
                    }
                    Container = null;
                }

                // figure out, what to load
                var task = Task.Run(async() => await PackageContainerFactory.GuessAndCreateForAsync(
                                        packageCentral,
                                        location,
                                        fullItemLocation,
                                        overrideLoadResident,
                                        null, null,
                                        containerOptions,
                                        runtimeOptions));
                var guess = task.Result;

                if (guess == null)
                {
                    return(false);
                }

                // success!
                Container = guess;
                return(true);
            }
            catch (Exception ex)
            {
                throw new PackageCentralException(
                          $"PackageCentral: while performing load from {location} " +
                          $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}", ex);
            }
        }
        //
        // UI higher-level stuff (taken over and maintained in from MainWindow.CommandBindings.cs)
        //

        public void CommandBinding_FileRepoAll(Control senderList, PackageContainerListBase fr, string cmd)
        {
            // access
            if (cmd == null || _flyout == null)
            {
                return;
            }
            cmd = cmd.ToLower().Trim();

            // modify list
            if (fr != null && RepoList != null && RepoList.Contains(fr))
            {
                if (cmd == "filerepoclose")
                {
                    if (AnyUiMessageBoxResult.OK != _flyout.MessageBoxFlyoutShow(
                            "Close file repository? Pending changes might be unsaved!",
                            "AASX File Repository",
                            AnyUiMessageBoxButton.OKCancel, AnyUiMessageBoxImage.Hand))
                    {
                        return;
                    }

                    RepoList.Remove(fr);
                }

                if (cmd == "item-up")
                {
                    // TODO (MIHO, 2021-01-09): check to use moveup/down of the PackageContainerListBase
                    int i = RepoList.IndexOf(fr);
                    if (i > 0)
                    {
                        RepoList.RemoveAt(i);
                        RepoList.Insert(i - 1, fr);
                    }
                }

                if (cmd == "item-down")
                {
                    // TODO (MIHO, 2021-01-09): check to use moveup/down of the PackageContainerListBase
                    int i = RepoList.IndexOf(fr);
                    if (i < RepoList.Count - 1)
                    {
                        RepoList.RemoveAt(i);
                        RepoList.Insert(i + 1, fr);
                    }
                }

                if (cmd == "filereposaveas")
                {
                    // prepare dialogue
                    var outputDlg = new Microsoft.Win32.SaveFileDialog();
                    outputDlg.Title    = "Select AASX file repository to be saved";
                    outputDlg.FileName = "new-aasx-repo.json";

                    if (fr is PackageContainerListLocal frl && frl.Filename.HasContent())
                    {
                        outputDlg.InitialDirectory = Path.GetDirectoryName(frl.Filename);
                        outputDlg.FileName         = Path.GetFileName(frl.Filename);
                    }

                    outputDlg.DefaultExt = "*.json";
                    outputDlg.Filter     = "AASX repository files (*.json)|*.json|All files (*.*)|*.*";

                    if (Options.Curr.UseFlyovers && _flyout != null)
                    {
                        _flyout.StartFlyover(new EmptyFlyout());
                    }
                    var res = outputDlg.ShowDialog();
                    if (Options.Curr.UseFlyovers && _flyout != null)
                    {
                        _flyout.CloseFlyover();
                    }

                    if (res != true)
                    {
                        return;
                    }

                    // OK!
                    var fn = outputDlg.FileName;
                    try
                    {
                        Log.Singleton.Info($"Saving AASX file repository to {fn} ..");
                        fr.SaveAsLocalFile(fn);
                        if (fr is PackageContainerListLocal frl2)
                        {
                            frl2.Filename = fn;
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.Singleton.Error(ex, $"When saving AASX file repository to {fn}");
                    }
                }

                if (cmd == "filerepoquery")
                {
                    // dialogue
                    var uc = new SelectFromRepositoryFlyout();
                    uc.Margin = new Thickness(10);
                    if (uc.LoadAasxRepoFile(items: fr.EnumerateItems()))
                    {
                        uc.ControlClosed += () =>
                        {
                            var fi = uc.ResultItem;
                            var fn = fi?.Location;
                            if (fn != null)
                            {
                                // start animation
                                fr.StartAnimation(fi,
                                                  PackageContainerRepoItem.VisualStateEnum.ReadFrom);

                                try
                                {
                                    // load
                                    Log.Singleton.Info("Switching to AASX repository file {0} ..", fn);
                                    FileDoubleClick?.Invoke(senderList, fr, fi);
                                }
                                catch (Exception ex)
                                {
                                    Log.Singleton.Error(
                                        ex, $"When switching to AASX repository file {fn}.");
                                }
                            }
                        };
                        _flyout.StartFlyover(uc);
                    }
                }

                if (cmd == "filerepomakerelative")
                {
                    if (fr is PackageContainerListLocal frl)
                    {
                        // make sure
                        if (AnyUiMessageBoxResult.OK != _flyout.MessageBoxFlyoutShow(
                                "Make filename relative to the locaton of the file repository? " +
                                "This enables re-locating the repository.",
                                "AASX File Repository",
                                AnyUiMessageBoxButton.OKCancel, AnyUiMessageBoxImage.Hand))
                        {
                            return;
                        }

                        if (!frl.Filename.HasContent())
                        {
                            Log.Singleton.Error("AASX file repository has no valid filename!");
                            return;
                        }

                        // execute (is data binded)
                        try
                        {
                            Log.Singleton.Info("Make AASX file names relative to {0}",
                                               Path.GetFullPath(Path.GetDirectoryName("" + frl.Filename)));
                            frl.MakeFilenamesRelative();
                        }
                        catch (Exception ex)
                        {
                            Log.Singleton.Error(
                                ex, $"When making AASX file names in repository relative.");
                        }
                    }
                }

                if (cmd == "filerepoprint")
                {
                    // try print
                    try
                    {
                        AasxPrintFunctions.PrintRepositoryCodeSheet(
                            repoDirect: fr, title: "AASX file repository");
                    }
                    catch (Exception ex)
                    {
                        Log.Singleton.Error(ex, "When printing, an error occurred");
                    }
                }

                if (cmd == "filerepoaddcurrent")
                {
                    // check
                    var veAas = _manageVisuElems?.GetSelectedItem() as VisualElementAdminShell;

                    var veEnv = veAas?.FindFirstParent((ve) =>
                                                       (ve is VisualElementEnvironmentItem vev &&
                                                        vev.theItemType == VisualElementEnvironmentItem.ItemType.Package), includeThis: false)
                                as VisualElementEnvironmentItem;

                    if (veAas == null || veAas.theAas == null || veAas.theEnv == null || veAas.thePackage == null ||
                        veEnv == null || !veEnv.thePackageSourceFn.HasContent())
                    {
                        _flyout.MessageBoxFlyoutShow(
                            "No valid AAS selected. The application needs to be in edit mode. " +
                            "Aborting.", "AASX File repository",
                            AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error);
                        return;
                    }

                    // generate appropriate container
                    var cnt = PackageContainerFactory.GuessAndCreateFor(
                        null, veEnv.thePackageSourceFn, veEnv.thePackageSourceFn,
                        overrideLoadResident: false,
                        containerOptions: PackageContainerOptionsBase.CreateDefault(Options.Curr));
                    if (cnt is PackageContainerRepoItem ri)
                    {
                        ri.Env = veAas.thePackage;
                        ri.CalculateIdsTagAndDesc();
                        fr.Add(ri);
                    }
                }

                if (cmd == "filerepomultiadd")
                {
                    // get the input files
                    var inputDlg = new Microsoft.Win32.OpenFileDialog();
                    inputDlg.Title  = "Multi-select AASX package files to be in repository";
                    inputDlg.Filter = "AASX package files (*.aasx)|*.aasx" +
                                      "|AAS XML file (*.xml)|*.xml|All files (*.*)|*.*";
                    inputDlg.Multiselect = true;

                    _flyout.StartFlyover(new EmptyFlyout());
                    var res = inputDlg.ShowDialog();
                    _flyout.CloseFlyover();

                    if (res != true || inputDlg.FileNames.Length < 1)
                    {
                        return;
                    }

                    // loop
                    foreach (var fn in inputDlg.FileNames)
                    {
                        fr.AddByAasxFn(_packageCentral, fn);
                    }
                }

                if (cmd == "filerepoaddfromserver")
                {
                    // read server address
                    var uc = new TextBoxFlyout("REST endpoint (without \"/server/listaas\"):",
                                               AnyUiMessageBoxImage.Question);
                    uc.Text = Options.Curr.DefaultConnectRepositoryLocation;
                    _flyout.StartFlyoverModal(uc);
                    if (!uc.Result)
                    {
                        return;
                    }

                    // execute
                    try
                    {
                        var conn = new PackageConnectorHttpRest(null, new Uri(uc.Text));

                        var task  = Task.Run(() => conn.GenerateRepositoryFromEndpointAsync());
                        var items = task.Result;
                        if (items == null || items.Count < 1)
                        {
                            Log.Singleton.Error($"When adding file repo items from REST server {uc.Text}," +
                                                $"the function returned NO items!");
                            return;
                        }

                        // loop
                        foreach (var fi in items)
                        {
                            fr.Add(fi);
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.Singleton.Error(ex, $"When adding file repo items from REST server {uc.Text}, " +
                                            $"an error occurred");
                    }
                }
            }
        }
        //
        // Start page
        //

        private async void ProceedOnPageStart()
        {
            // make runtime options to link to this dialogue
            var ro = new PackCntRuntimeOptions()
            {
                Log             = _logger,
                ProgressChanged = (state, tfs, tbd) =>
                {
                    if (state == PackCntRuntimeOptions.Progress.Ongoing)
                    {
                        // determine
                        if (tfs == null)
                        {
                            tfs = 5 * 1024 * 1024;
                        }
                        var frac = Math.Min(100.0, 100.0 * tbd / tfs.Value);
                        var bshr = AdminShellUtil.ByteSizeHumanReadable(tbd);

                        SetProgressBar(frac, $"{bshr} transferred");
                    }

                    if (state == PackCntRuntimeOptions.Progress.Final)
                    {
                        SetProgressBar(0.0, "");
                    }
                },
                AskForSelectFromList = (caption, items, propRes) =>
                {
                    TabItemSelectFromList.Dispatcher.BeginInvoke(
                        System.Windows.Threading.DispatcherPriority.Background,
                        new Action(() =>
                    {
                        StartPageSelectFromList(caption, items, (li) =>
                        {
                            // never again
                            _selectFromListAction = null;
                            // call
                            propRes?.TrySetResult(li);
                        });
                    }));
                },
                AskForCredentials = (caption, propRes) =>
                {
                    TabItemCredentials.Dispatcher.BeginInvoke(
                        System.Windows.Threading.DispatcherPriority.Background,
                        new Action(() =>
                    {
                        StartPageAskCredentials(caption, (pcc) =>
                        {
                            // never again
                            _askedUserCredentials = null;
                            // call
                            propRes?.TrySetResult(pcc);
                        });
                    }));
                }
            };

            // Log
            var location = TextBoxStartLocation.Text;

            _logger?.Info($"Connect (integrated): Trying to connect to {location} ..");

            // try do the magic
            try
            {
                // quickly parse out container options
                var copts = PackageContainerOptionsBase.CreateDefault(Options.Curr, loadResident: true);
                copts.StayConnected = true == CheckBoxStayConnected.IsChecked;
                if (Int32.TryParse("" + TextBoxUpdatePeriod.Text, out int i))
                {
                    copts.UpdatePeriod = Math.Max(OptionsInformation.MinimumUpdatePeriod, i);
                }

                // create container
                var x = await PackageContainerFactory.GuessAndCreateForAsync(
                    _packageCentral,
                    location,
                    location,
                    overrideLoadResident : true,
                    containerOptions : copts,
                    runtimeOptions : ro);

                // returning "x" is the only way to end the dialogue successfuly
                if (x != null)
                {
                    // prepare result
                    _logger?.Info($"Connect (integrated): guessing and creating container package " +
                                  $"succeeded with {x.ToString()} !");
                    this.Result          = true;
                    this.ResultContainer = x;

                    // close now?
                    if (true == CheckBoxStayAutoClose.IsChecked)
                    {
                        // trigger close
                        ControlClosed?.Invoke();
                    }
                    else
                    {
                        // proceed to summary page
                        StartPageSummary();
                    }
                }
            }
            catch (Exception ex)
            {
                _logger?.Error(ex, "when guessing for packager container!");
            }
        }