2 * Copyright (c) 2000, Red Hat, Inc.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * A copy of the GNU General Public License can be found at
12 * Written by DJ Delorie <dj@cygnus.com>
16 /* The purpose of this file is to intall all the packages selected in
17 the install list (in ini.h). Note that we use a separate thread to
18 maintain the progress dialog, so we avoid the complexity of
19 handling two tasks in one thread. We also create or update all the
20 files in /etc/setup and create the mount points. */
29 #include <sys/types.h>
54 #define XM_DONE (WM_USER + 101)
56 static HWND unins_dialog = 0;
57 static HWND unins_action = 0;
58 static HWND unins_pkgname = 0;
59 static HWND unins_filename = 0;
60 static HWND unins_pprogress = 0;
61 static HWND unins_iprogress = 0;
62 static HWND unins_diskfull = 0;
63 static HANDLE init_event;
65 static int package_bytes = 0;
66 static int uninstall_started = 0;
68 extern char * map_filename (char *fn, int type);
69 void remove_desktop_setup ();
70 static void start_uninstall ();
71 extern char* find_xemacs_exe_name();
77 dialog_cmd (HWND h, int id, HWND hwndctl, UINT code)
84 if (uninstall_started == 0) {
85 uninstall_started = 1;
96 dialog_proc (HWND h, UINT message, WPARAM wParam, LPARAM lParam)
102 unins_action = GetDlgItem (h, IDC_UNINS_ACTION);
103 unins_pkgname = GetDlgItem (h, IDC_UNINS_PKG);
104 unins_filename = GetDlgItem (h, IDC_UNINS_FILE);
105 unins_pprogress = GetDlgItem (h, IDC_UNINS_PPROGRESS);
106 unins_iprogress = GetDlgItem (h, IDC_UNINS_IPROGRESS);
107 unins_diskfull = GetDlgItem (h, IDC_UNINS_DISKFULL);
108 SendMessage (unins_pprogress, PBM_SETRANGE, 0, MAKELPARAM (0, 100));
109 SendMessage (unins_iprogress, PBM_SETRANGE, 0, MAKELPARAM (0, 100));
110 SendMessage (unins_diskfull, PBM_SETRANGE, 0, MAKELPARAM (0, 100));
111 SetWindowText (unins_pkgname, "");
112 SetWindowText (unins_filename, "");
113 SendMessage (unins_pprogress, PBM_SETPOS, (WPARAM) 0, 0);
114 SendMessage (unins_iprogress, PBM_SETPOS, (WPARAM) 0, 0);
115 SendMessage (unins_diskfull, PBM_SETPOS, (WPARAM) 0, 0);
120 SetWindowText (GetDlgItem (h, IDOK), "Ok");
121 LONG style = GetWindowLong (GetDlgItem (h, IDCANCEL),
123 SetWindowLong (GetDlgItem (h, IDCANCEL),
124 GWL_STYLE, style & WS_DISABLED);
129 return HANDLE_WM_COMMAND (h, wParam, lParam, dialog_cmd);
131 return DefWindowProc (h, message, wParam, lParam);
134 static DWORD WINAPI uninstall_all (void *);
141 init_event = CreateEvent (0, 0, 0, 0);
142 thread = CreateThread (0, 0, uninstall_all, 0, 0, &tid);
143 WaitForSingleObject (init_event, 10000);
144 CloseHandle (init_event);
148 progress (int bytes, int num)
151 if (package_bytes > 100)
153 perc = (bytes * 100) / package_bytes;
154 SendMessage (unins_pprogress, PBM_SETPOS, (WPARAM) perc, 0);
159 perc = (num * 100) / npackages;
160 SendMessage (unins_iprogress, PBM_SETPOS, (WPARAM) perc, 0);
164 static int num_installs, num_uninstalls;
167 uninstall_one (char *name, int type, int num)
170 char line[_MAX_PATH];
171 char* fname = (type == TY_GENERIC ?
172 concat (root_dir, XEMACS_PACKAGE_DIR, "pkginfo/MANIFEST.",
174 concat (root_dir, XEMACS_SETUP_DIR, "MANIFEST.", name, 0));
176 FILE* lst = fopen (fname, "rb");
181 fseek (lst, 0, SEEK_END);
182 package_bytes = ftell (lst);
183 fseek (lst, 0, SEEK_SET);
185 SetWindowText (unins_pkgname, name);
186 SetWindowText (unins_action, "Uninstalling...");
187 log (0, "uninstalling %s", name);
189 while (fgets (line, sizeof (line), lst))
193 if (line[strlen(line)-1] == '\n')
194 line[strlen(line)-1] = 0;
196 dirs.add_subdirs (line);
198 char *d = map_filename (line, type);
199 DWORD dw = GetFileAttributes (d);
200 if (dw != 0xffffffff && !(dw & FILE_ATTRIBUTE_DIRECTORY))
202 log (LOG_BABBLE, "unlink %s", d);
209 dirs.reverse_sort ();
211 while ((subdir = dirs.enumerate (subdir)) != 0)
213 char *d = map_filename (subdir, type);
214 if (RemoveDirectory (d))
215 log (LOG_BABBLE, "rmdir %s", d);
222 do_uninstall (HINSTANCE h)
224 num_installs = 0, num_uninstalls = 0;
226 next_dialog = 0; // we're done after this
229 fatal ("no installation found");
231 int rv = DialogBox (h, MAKEINTRESOURCE (IDD_UNINSTALL), 0, dialog_proc);
233 fatal (IDS_DIALOG_FAILED);
242 char line[1000], pkg[1000], inst[1000], src[1000];
245 FILE *db = fopen (concat (root_dir, XEMACS_SETUP_DIR, "installed.db", 0), "rt");
249 while (fgets (line, 1000, db))
253 sscanf (line, "%s %s %d %s %d", pkg, inst, &instsz, src, &srcsz);
255 log (0, "read %s", pkg);
256 Package* np = new_package(strdup(pkg));
257 pinfo(*np).install = inst;
258 pinfo(*np).install_size = instsz;
261 for (v=base (inst); *v; v++)
262 if (*v == '-' && isdigit(v[1]))
270 if (strncmp (d, ".tar", 4) == 0
271 || strncmp (d, "-pkg", 4) == 0)
277 pinfo(*np).version = strdup (v);
279 pinfo(*np).version = "0";
280 // Crude but effective
282 if (strncmp ("xemacs-i686", pkg, 11) == 0
283 || (strncmp ("xemacs-i586", pkg, 11) == 0))
285 np->type = install_type;
293 uninstall_all (void *)
296 SetEvent (init_event);
298 int df = diskfull (root_dir);
299 SendMessage (unins_diskfull, PBM_SETPOS, (WPARAM) df, 0);
303 log (0, "There are %d packages\n", npackages);
304 for (i=0; i<npackages; i++)
306 log (0, "uninstalling %s\n", package[i].name);
307 uninstall_one (package[i].name, package[i].type, i);
310 PostMessage (unins_dialog, XM_DONE, 0, 0);
312 remove (concat (root_dir, XEMACS_SETUP_DIR, "installed.db.old", 0));
313 remove (concat (root_dir, XEMACS_SETUP_DIR, "installed.db", 0));
315 remove_desktop_setup();
316 remove_xemacs_root();
317 remove_uninstall_path();
319 if (num_installs == 0)
321 // exit_msg = IDS_UNINSTALL_COMPLETE;