// ----< demonstrates req #3c - checkout >--------------------
        private void DemoCheckOut()
        {
            RepoClientState state    = (RepoClientState)this.DataContext;
            RepoFile        repoFile = new RepoFile {
                PackageName = "Process",
                Namespace   = "Process",
                Filename    = "Process.h",
                Version     = 1
            };

            state.ServerCommService.Requests.PostCheckOut(
                repoFile.PackageName,
                repoFile.Namespace,
                repoFile.Filename,
                repoFile.Version,
                false,
                state.ServerConnProps.UserId,
                (CheckOutResponse response) =>
            {
                Console.WriteLine($"\n\n{new String('-', 60)}");
                Console.WriteLine("  Demonstrating Requirement #3c - Check-Out");
                Console.WriteLine($"{new String('-', 60)}\n");
                Console.WriteLine($"    > Check-Out requestId [{response.RequestId}] succeeded");
                Console.WriteLine($"    > Server responded to request with status success: {response.Success}");
                Console.WriteLine($"\n  Test Passed\n");
            },
                true);
        }
        // ----< actions to be performed when the view is loaded >--------------------
        private void BrowseView_Loaded(object sender, RoutedEventArgs e)
        {
            RepoClientState state = (RepoClientState)this.DataContext;

            if (!loaded_) // ensures that this block is executed only once
            {
                loaded_ = true;

                // subscribe to the show metadata and show file text commands and register
                // corresponding actions to be performed
                state.BrowseProps.ShowMetadataCommand.Subscribe(MetadataLink_ClickAction);
                state.BrowseProps.ShowFileTextCommand.Subscribe(FileTextLink_ClickAction);
                state.CheckOutProps.DownloadRequestCommand.Subscribe(DownloadBtn_ClickAction);

                state.BrowseProps.Category = "utility";
                DemoCheckOut();
                DemoGetPackageFiles();
                DemoGetFileText();
                DemoGetFileMetatada();
            }

            if (state.ServerConnProps.Connected)
            {
                RefreshPackageList();
            }
        }
        // ----< demonstrates req #3b - check-in >--------------------
        private void DemoCheckIn()
        {
            RepoClientState state = (RepoClientState)this.DataContext;

            state.CheckInProps.PackageFolder      = "../Demo/Logger";
            state.CheckInProps.PackageName        = "Logger";
            state.CheckInProps.Namespace          = "Logger";
            state.CheckInProps.PackageDescription = "Logger for C++ programs";
            state.CheckInProps.Category           = "logger";

            state.ServerCommService.Requests.PostCheckIn(
                state.CheckInProps.PackageFolder,
                state.CheckInProps.PackageName,
                state.CheckInProps.Namespace,
                state.CheckInProps.PackageDescription,
                state.CheckInProps.Category,
                state.ServerConnProps.UserId,
                (CheckInResponse response) => {
                Console.WriteLine($"\n\n{new String('-', 60)}");
                Console.WriteLine("  Demonstrating Requirement 3b - Check-In");
                Console.WriteLine($"{new String('-', 60)}\n");
                Console.WriteLine($"    > Check-In requestId [{response.RequestId}] succeeded");
                Console.WriteLine($"    > Server responded to request with status success: {response.Success}");
                Console.WriteLine($"\n  Test Passed\n");
            }, true);
        }
        // ----< posts checkout request to the server on button click >--------------------
        private void DownloadDependents(RepoFileMetadata repoFileMeta)
        {
            RepoClientState state = (RepoClientState)this.DataContext;

            foreach (RepoFile dep in repoFileMeta.Dependencies)
            {
                Download(dep);
            }
        }
 // ----< pops-up a folder select dialog box to select the checkout folder >--------------------
 private void BrowseCheckOutFolderBtn_Click(object sender, RoutedEventArgs e)
 {
     // Show the FolderBrowserDialog.
     System.Windows.Forms.DialogResult result = browseCheckoutFolderDialog.ShowDialog();
     if (result == System.Windows.Forms.DialogResult.OK)
     {
         RepoClientState state = (RepoClientState)this.DataContext;
         state.CheckOutProps.CheckoutFolder = browseCheckoutFolderDialog.SelectedPath;
     }
 }
        // ----< requests the server for list of packages >--------------------
        private void RefreshPackageList()
        {
            RepoClientState state = (RepoClientState)this.DataContext;

            state.ServerCommService.Requests.GetRepoPackages(
                state.BrowseProps.Category,
                state.ServerConnProps.UserId,
                (GetRepoPackagesResponse response) => state.BrowseProps.RepoPackages = response.RepoPackages,
                true);
        }
        // ----< fetches file's text from server and displays it >--------------------
        private void FileTextLink_ClickAction(RepoFile repoFile)
        {
            RepoClientState state = (RepoClientState)this.DataContext;

            state.BrowseProps.SelectedRepoFile = repoFile;

            FileTextPopupWindow fileTextPopup = new FileTextPopupWindow();

            fileTextPopup.DataContext = state;
            fileTextPopup.Title       = $"{repoFile.Filename} v{repoFile.Version}";
            fileTextPopup.Show();
        }
        // ----< stops the comm system and pings server on connect button click >--------------------

        private void DisconnectRepoBtn_Click(object sender, RoutedEventArgs e)
        {
            RepoClientState state = (RepoClientState)this.DataContext;

            state.ServerCommService.Stop(() => {
                this.Dispatcher.Invoke(() => {
                    state.ServerConnProps.Connected = false;
                    state.ServerConnProps.StatusMsg = "Disconnected";
                    Application.Current.Shutdown();
                });
            });
        }
        // ----< searches packages for entered category >--------------------
        private void SearchCategoryBtn_Click(object sender, RoutedEventArgs e)
        {
            RepoClientState state = (RepoClientState)this.DataContext;

            if (String.IsNullOrEmpty(state.BrowseProps.Category))
            {
                MessageBox.Show("Category is mandatory", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            RefreshPackageList();
        }
        // ----< displays a message box with the metadata information of selected file >--------------------
        private void DisplayMetadata(RepoFile repoFile, RepoFileMetadata metadata)
        {
            RepoClientState state = (RepoClientState)this.DataContext;

            state.BrowseProps.SelectedRepoFile = repoFile;
            IEnumerable <String> depList = metadata.Dependencies.Select((RepoFile depFile) => $"> {depFile.Filename} v{depFile.Version}");

            FileMetadataPopupWindow fileMetadataPopup = new FileMetadataPopupWindow();

            fileMetadataPopup.Title             = $"Metadata for {repoFile.Filename} v{repoFile.Version}";
            fileMetadataPopup.Author.Text       = metadata.Author;
            fileMetadataPopup.Description.Text  = metadata.Description;
            fileMetadataPopup.Dependencies.Text = String.Join("\n", depList);
            fileMetadataPopup.Show();
        }
        // ----< posts check-in request to the server on button click >--------------------
        private void CheckInBtn_Click(object sender, RoutedEventArgs e)
        {
            RepoClientState state = (RepoClientState)this.DataContext;

            state.ServerCommService.Requests.PostCheckIn(
                state.CheckInProps.PackageFolder,
                state.CheckInProps.PackageName,
                state.CheckInProps.Namespace,
                state.CheckInProps.PackageDescription,
                state.CheckInProps.Category,
                state.ServerConnProps.UserId,
                (CheckInResponse response) => {
                string message = $"Succesfully uploaded file '{response.File}'";
                MessageBox.Show(message, "Check-In");
            }, true);
        }
        // ----< downloads required files on button click >--------------------
        private void DownloadBtn_ClickAction(CheckOutProps props)
        {
            checkOutFilesPopup_.Close();

            RepoClientState state = (RepoClientState)this.DataContext;

            foreach (RepoFile repoFile in state.BrowseProps.SelectionPreview)
            {
                Download(repoFile);

                if (state.CheckOutProps.DependentsAreRequired)
                {
                    ProcessDependentDownloads(repoFile);
                }
            }
        }
        // ----< demonstrates req #3d - browse: fetching files >--------------------
        private void DemoGetPackageFiles()
        {
            RepoClientState state = (RepoClientState)this.DataContext;

            state.ServerCommService.Requests.GetPackageFiles("FileSystemDemo",
                                                             state.ServerConnProps.UserId, (GetPackageFilesResponse res) =>
            {
                Console.WriteLine($"\n\n{new String('-', 60)}");
                Console.WriteLine($"  Demonstrating Requirement #3d - Browse: Fetch Files");
                Console.WriteLine($"{new String('-', 60)}\n");
                Console.WriteLine($"    > Fetch for requestId [{res.RequestId}] succeeded");
                Console.WriteLine($"    > Found {res.RepoFiles.Count()} files for package 'FileSystemDemo'");
                res.RepoFiles.ForEach((RepoFile repoFile) => Console.WriteLine($"      > {repoFile.Filename} v{repoFile.Version}"));
                Console.WriteLine($"\n  Test Passed\n");
            }, true);
        }
示例#14
0
        // ----< actions to be performed when the wpf app starts up >--------------------
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            Dictionary <string, string> parsedArgs = CommandLineParser.parse(e.Args);
            int port = 7890;

            if (parsedArgs.ContainsKey("port"))
            {
                port = Int32.Parse(parsedArgs["port"]);
            }

            RepoServerCommService service = RepoServerCommService.GetInstance("localhost", port);
            RepoClientState       state   = new RepoClientState(service);

            MainWindow window = new MainWindow(state);

            window.Show();
        }
        // ----< demonstrates req #3a - connection to server >--------------------
        private void DemoConnection()
        {
            RepoClientState state = (RepoClientState)this.DataContext;

            state.ServerConnProps.UserId = "rgnair";
            state.ServerCommService.Start(state.ServerConnProps.ServerAddress, state.ServerConnProps.ServerPort);

            state.ServerCommService.Requests.Ping((PingResponse response) => {
                Console.WriteLine($"\n\n{new String('-', 60)}");
                Console.WriteLine("  Demonstrating Requirement #3a - Connecting to Servers");
                Console.WriteLine($"{new String('-', 60)}\n");
                Console.WriteLine($"    > Connection to server @ {state.ServerConnProps.ServerAddress}:{state.ServerConnProps.ServerPort} succeeded");
                Console.WriteLine($"    > Server responded to ping requestId [{response.RequestId}] with status alive: {response.ServerActive}");
                Console.WriteLine($"\n  Test Passed\n");

                OnSuccessfulConnection();
            }, true);
        }
        // ----< demonstrates req #3e - view file text >--------------------
        private void DemoGetFileText()
        {
            RepoClientState state = (RepoClientState)this.DataContext;

            state.ServerCommService.Requests.GetFileText("RepoCore", "SoftwareRepository",
                                                         "RepoCore.h", 1, state.ServerConnProps.UserId,
                                                         (GetFileTextResponse fileTextRes) => {
                Console.WriteLine($"\n\n{new String('-', 60)}");
                Console.WriteLine($"  Demonstrating Requirement #3e - Viewing full file text");
                Console.WriteLine($"{new String('-', 60)}\n");
                Console.WriteLine($"    > Fetch for requestId [{fileTextRes.RequestId}] succeeded");
                Console.WriteLine($"    > Below are few lines of text from file RepoCore.h v1\n");
                Console.WriteLine($"    {new String('-', 15)}x{new String('-', 15)}");
                Console.WriteLine($"\n{RepoFile.readFileText("RepoCore.h").Substring(0, 1025)}\n");
                Console.WriteLine($"    {new String('-', 15)}x{new String('-', 15)}");
                Console.WriteLine($"\n  Test Passed\n");
            }, true);
        }
        // ----< starts the comm system and pings server on connect button click >--------------------
        private void ConnectToRepoBtn_Click(object sender, RoutedEventArgs e)
        {
            RepoClientState state = (RepoClientState)this.DataContext;

            if (String.IsNullOrEmpty(state.ServerConnProps.UserId))
            {
                MessageBox.Show("User Id is mandatory for connection", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            // start the comm system
            if (!state.ServerConnProps.Connected)
            {
                state.ServerCommService.Start(state.ServerConnProps.ServerAddress, state.ServerConnProps.ServerPort);
            }

            state.ServerCommService.Requests.Ping((PingResponse response) => OnSuccessfulConnection(), true);
        }
        // ----< fetches file list from the server on double click of package >--------------------
        private void PackageListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            RepoClientState state       = (RepoClientState)this.DataContext;
            RepoPackage     repoPackage = (RepoPackage)PackageListBox.SelectedItem;

            if (repoPackage.RepoFiles == null || repoPackage.RepoFiles.Count() == 0)
            {
                state.ServerCommService.Requests.GetPackageFiles(repoPackage.PackageName,
                                                                 state.ServerConnProps.UserId, (GetPackageFilesResponse res) =>
                {
                    repoPackage.RepoFiles       = res.RepoFiles;
                    state.BrowseProps.RepoFiles = repoPackage.RepoFiles;
                }, true);
            }
            else
            {
                state.BrowseProps.RepoFiles = repoPackage.RepoFiles;
            }
        }
        // ----< demonstrates req #3f - view file metadata >--------------------
        private void DemoGetFileMetatada()
        {
            RepoClientState state = (RepoClientState)this.DataContext;

            state.ServerCommService.Requests.GetFileMetadata("RepoCore", "SoftwareRepository",
                                                             "RepoCore.h", 1, state.ServerConnProps.UserId,
                                                             (GetFileMetadataResponse metadataRes) => {
                Console.WriteLine($"\n\n{new String('-', 60)}");
                Console.WriteLine("  Demonstrating Requirement #3f - Viewing file metadata");
                Console.WriteLine($"{new String('-', 60)}\n");
                Console.WriteLine($"    > Fetch for requestId [{metadataRes.RequestId}] succeeded");
                Console.WriteLine($"    > Found below metadata for file RepoCore.h v1");
                Console.WriteLine($"      > Author: {metadataRes.Metadata.Author}");
                Console.WriteLine($"      > Description: {metadataRes.Metadata.Description}");
                Console.WriteLine($"      > Dependencies:");
                metadataRes.Metadata.Dependencies.ForEach((RepoFile repoFile) => Console.WriteLine($"        > {repoFile.Filename} v{repoFile.Version}"));
                Console.WriteLine($"\n  Test Passed\n");
            }, true);
        }
        // ----< posts checkout request to the server >--------------------
        private void Download(RepoFile repoFile)
        {
            RepoClientState state = (RepoClientState)this.DataContext;

            state.ServerCommService.Requests.PostCheckOut(
                repoFile.PackageName,
                repoFile.Namespace,
                repoFile.Filename,
                repoFile.Version,
                state.CheckOutProps.DependentsAreRequired,
                state.ServerConnProps.UserId,
                (CheckOutResponse response) =>
            {
                RepoFile.copyToDest(repoFile, state.CheckOutProps.CheckoutFolder);
                string message = $"Succesfully downloaded file '{repoFile.Filename}' " +
                                 $"to {state.CheckOutProps.CheckoutFolder}";
                MessageBox.Show(message, "Check-Out");
            },
                true);
        }
        // ----< fetches file's metadata from server and displays it >--------------------
        private void MetadataLink_ClickAction(RepoFile repoFile)
        {
            RepoClientState state       = (RepoClientState)this.DataContext;
            string          metadataKey = RepoFile.stringify(repoFile);

            if (state.BrowseProps.MetadataDict.ContainsKey(metadataKey))
            {
                DisplayMetadata(repoFile, state.BrowseProps.MetadataDict[metadataKey]);
            }
            else
            {
                state.ServerCommService.Requests.GetFileMetadata(repoFile.PackageName,
                                                                 repoFile.Namespace, repoFile.Filename, repoFile.Version,
                                                                 state.ServerConnProps.UserId,
                                                                 (GetFileMetadataResponse metadataRes) => {
                    state.BrowseProps.MetadataDict[metadataKey] = metadataRes.Metadata;
                    this.Dispatcher.Invoke(() => DisplayMetadata(repoFile, state.BrowseProps.MetadataDict[metadataKey]));
                }, true);
            }
        }
        // ----< actions to be performed when the window is loaded >--------------------
        private void FileTextPopup_Loaded(object sender, RoutedEventArgs e)
        {
            // clears any existing paragraphs from the embedded
            // file text viewer user control
            this.fileTextViewer.fileText.Blocks.Clear();

            RepoClientState state    = (RepoClientState)this.DataContext;
            RepoFile        repoFile = state.BrowseProps.SelectedRepoFile;

            // query the repository for the file's text
            state.ServerCommService.Requests.GetFileText(repoFile.PackageName,
                                                         repoFile.Namespace, repoFile.Filename, repoFile.Version,
                                                         state.ServerConnProps.UserId,
                                                         (GetFileTextResponse fileTextRes) => {
                // invoking through dispatcher because UI elements cannot
                // be set from external thread
                this.Dispatcher.Invoke(() => {
                    // feeds the received file's contents to the file text viewer
                    Paragraph para = new Paragraph();
                    para.Inlines.Add(new Run(RepoFile.readFileText(repoFile.Filename)));
                    this.fileTextViewer.fileText.Blocks.Add(para);
                });
            }, true);
        }
        // ----< performs tasks after a successful connection >--------------------

        private void OnSuccessfulConnection()
        {
            this.Dispatcher.Invoke(() => {
                RepoClientState state = (RepoClientState)this.DataContext;

                // mark connected
                state.ServerConnProps.Connected = true;

                // set the correct connection message in status bar
                string message = "Connected to server " +
                                 $"{state.ServerConnProps.ServerAddress}:{state.ServerConnProps.ServerPort} " +
                                 $"as user {state.ServerConnProps.UserId}";
                state.ServerConnProps.StatusMsg = message;

                // switch tabs
                state.ActionTabsProps.ConnectTab.Selected = false;
                state.ActionTabsProps.BrowseTab.Selected  = true;

                // disable connection text boxes
                ServerAddressTextBox.IsEnabled = false;
                ServerPortTextBox.IsEnabled    = false;
                UserIdTextBox.IsEnabled        = false;
            });
        }
示例#24
0
        public MainWindow(RepoClientState state)
        {
            InitializeComponent();

            state_ = state;
        }
        // ----< updates the selection preview when checkbox is checked >--------------------
        private void RepoFile_Checked(object sender, RoutedEventArgs e)
        {
            RepoClientState state = (RepoClientState)this.DataContext;

            state.BrowseProps.UpdateSelectionPreview();
        }