// ----< 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); }
// ----< 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; }); }
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(); }