using System; using System.Collections.Generic; using System.IO; using System.Windows; using System.Windows.Controls; using InstaSoftOfficeTool.Models; using InstaSoftOfficeTool.Services; namespace InstaSoftOfficeTool.Pages { public partial class RemovePage : Page { private readonly MainWindow _main; private List _detected; public RemovePage(MainWindow main) { InitializeComponent(); _main = main; Loaded += (s, e) => DetectOffice(); } private void DetectOffice() { _detected = OfficeDetector.Detect(); OfficeListPanel.Children.Clear(); if (_detected.Count == 0) { NoOfficeText.Visibility = Visibility.Visible; LicenseCleanupPanel.Visibility = Visibility.Collapsed; BtnRemove.IsEnabled = false; return; } foreach (var office in _detected) { var cb = new CheckBox { Content = office.DisplayName + (string.IsNullOrEmpty(office.Version) ? "" : " (" + office.Version + ")"), IsChecked = true, Style = (Style)FindResource("FluentCheckBox"), Tag = office, Margin = new Thickness(0, 4, 0, 4), FontSize = 14 }; OfficeListPanel.Children.Add(cb); } } private async void BtnRemove_Click(object sender, RoutedEventArgs e) { bool confirmed = await _main.ConfirmAsync( "Office elt\u00e1vol\u00edt\u00e1s", "Biztosan el szeretn\u00e9 t\u00e1vol\u00edtani a kiv\u00e1lasztott Office telep\u00edt\u00e9seket?", "Elt\u00e1vol\u00edt\u00e1s", "M\u00e9gse"); if (!confirmed) return; BtnRemove.IsEnabled = false; LogPanel.Visibility = Visibility.Visible; try { var c2rProducts = new System.Collections.Generic.List(); foreach (UIElement child in OfficeListPanel.Children) { if (child is CheckBox cb && cb.IsChecked == true) { var office = (InstalledOffice)cb.Tag; if (office.IsClickToRun) { c2rProducts.Add(office.ProductCode); } else if (!string.IsNullOrEmpty(office.ProductCode)) { AppendLog("MSI elt\u00e1vol\u00edt\u00e1s: " + office.DisplayName); var runner = new ProcessRunner(); runner.OutputReceived += msg => Dispatcher.Invoke(() => AppendLog(msg)); int code = await runner.RunAsync("msiexec", "/x " + office.ProductCode + " /qb"); AppendLog("MSI exit code: " + code); } } } if (c2rProducts.Count > 0) { AppendLog("Click-to-Run term\u00e9kek elt\u00e1vol\u00edt\u00e1sa: " + string.Join(", ", c2rProducts)); var downloader = new OdtDownloader(); downloader.StatusChanged += msg => Dispatcher.Invoke(() => AppendLog(msg)); bool ok = await downloader.DownloadAndExtractAsync(); if (!ok) { AppendLog("HIBA: Az ODT let\u00f6lt\u00e9se sikertelen."); BtnRemove.IsEnabled = true; return; } string removeXml = OdtXmlGenerator.GenerateRemoveProducts(c2rProducts.ToArray()); string xmlPath = Path.Combine(downloader.OdtFolder, "remove.xml"); File.WriteAllText(xmlPath, removeXml); AppendLog("Remove XML:"); AppendLog(removeXml); AppendLog(""); AppendLog("Futtat\u00e1s: setup.exe /configure remove.xml"); AppendLog("Ez eltarthat n\u00e9h\u00e1ny percig..."); int exitCode = await downloader.RunRemoveAsync(xmlPath, msg => Dispatcher.Invoke(() => AppendLog(msg))); AppendLog("setup.exe exit code: " + exitCode); if (exitCode == 0) { AppendLog("Office sikeresen elt\u00e1vol\u00edtva."); } else { AppendLog("FIGYELEM: Az elt\u00e1vol\u00edt\u00e1s nem siker\u00fclt (k\u00f3d: " + exitCode + ")"); AppendLog("Pr\u00f3b\u00e1lja meg manu\u00e1lisan: Vez\u00e9rl\u0151pult > Programok elt\u00e1vol\u00edt\u00e1sa"); } } if (CbCleanLicense.IsChecked == true) { AppendLog(""); AppendLog("Licenc-adatb\u00e1zis tiszt\u00edt\u00e1sa..."); var lm = new LicenseManager(); if (lm.FindOspp()) { var cleanResult = await lm.RemoveAllKeysAsync(); AppendLog(cleanResult); } else { AppendLog("Az ospp.vbs nem tal\u00e1lhat\u00f3 \u2014 licenc-tiszt\u00edt\u00e1s kihagyva."); } } AppendLog(""); AppendLog("K\u00e9sz. Lista friss\u00edt\u00e9se..."); DetectOffice(); if (_detected.Count == 0) { AppendLog("Nincs t\u00f6bb telep\u00edtett Office."); } } catch (Exception ex) { AppendLog("V\u00e1ratlan hiba: " + ex.Message); AppendLog(ex.StackTrace); } BtnRemove.IsEnabled = _detected.Count > 0; _main.ShowCloseButton(); } private void AppendLog(string text) { LogText.Text += DateTime.Now.ToString("HH:mm:ss") + " " + text + "\n"; LogText.ScrollToEnd(); } } }