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>
55 #define XM_DONE (WM_USER + 101)
57 static HWND unins_dialog = 0;
58 static HWND unins_action = 0;
59 static HWND unins_pkgname = 0;
60 static HWND unins_filename = 0;
61 static HWND unins_pprogress = 0;
62 static HWND unins_iprogress = 0;
63 static HWND unins_diskfull = 0;
64 static HANDLE init_event;
66 static int package_bytes = 0;
67 static int uninstall_started = 0;
69 extern char * map_filename (char *fn, int type);
70 static void start_uninstall ();
76 dialog_cmd (HWND h, int id, HWND hwndctl, UINT code)
83 if (uninstall_started == 0) {
84 uninstall_started = 1;
95 dialog_proc (HWND h, UINT message, WPARAM wParam, LPARAM lParam)
101 unins_action = GetDlgItem (h, IDC_UNINS_ACTION);
102 unins_pkgname = GetDlgItem (h, IDC_UNINS_PKG);
103 unins_filename = GetDlgItem (h, IDC_UNINS_FILE);
104 unins_pprogress = GetDlgItem (h, IDC_UNINS_PPROGRESS);
105 unins_iprogress = GetDlgItem (h, IDC_UNINS_IPROGRESS);
106 unins_diskfull = GetDlgItem (h, IDC_UNINS_DISKFULL);
107 SendMessage (unins_pprogress, PBM_SETRANGE, 0, MAKELPARAM (0, 100));
108 SendMessage (unins_iprogress, PBM_SETRANGE, 0, MAKELPARAM (0, 100));
109 SendMessage (unins_diskfull, PBM_SETRANGE, 0, MAKELPARAM (0, 100));
110 SetWindowText (unins_pkgname, "");
111 SetWindowText (unins_filename, "");
112 SendMessage (unins_pprogress, PBM_SETPOS, (WPARAM) 0, 0);
113 SendMessage (unins_iprogress, PBM_SETPOS, (WPARAM) 0, 0);
114 SendMessage (unins_diskfull, PBM_SETPOS, (WPARAM) 0, 0);
119 SetWindowText (GetDlgItem (h, IDOK), "Ok");
120 LONG style = GetWindowLong (GetDlgItem (h, IDCANCEL),
122 SetWindowLong (GetDlgItem (h, IDCANCEL),
123 GWL_STYLE, style & WS_DISABLED);
128 return HANDLE_WM_COMMAND (h, wParam, lParam, dialog_cmd);
130 return DefWindowProc (h, message, wParam, lParam);
133 static DWORD WINAPI uninstall_all (void *);
140 init_event = CreateEvent (0, 0, 0, 0);
141 thread = CreateThread (0, 0, uninstall_all, 0, 0, &tid);
142 WaitForSingleObject (init_event, 10000);
143 CloseHandle (init_event);
147 progress (int bytes, int num)
150 if (package_bytes > 100)
152 perc = (bytes * 100) / package_bytes;
153 SendMessage (unins_pprogress, PBM_SETPOS, (WPARAM) perc, 0);
158 perc = (num * 100) / npackages;
159 SendMessage (unins_iprogress, PBM_SETPOS, (WPARAM) perc, 0);
163 static int num_installs, num_uninstalls;
166 uninstall_one (char *name, int type, int num)
169 char line[_MAX_PATH];
170 char* fname = (type == TY_GENERIC ?
171 concat (root_dir, XEMACS_PACKAGE_DIR, "pkginfo/MANIFEST.",
173 concat (root_dir, XEMACS_SETUP_DIR, "MANIFEST.", name, 0));
175 FILE* lst = fopen (fname, "rb");
180 fseek (lst, 0, SEEK_END);
181 package_bytes = ftell (lst);
182 fseek (lst, 0, SEEK_SET);
184 SetWindowText (unins_pkgname, name);
185 SetWindowText (unins_action, "Uninstalling...");
186 log (0, "uninstalling %s", name);
188 while (fgets (line, sizeof (line), lst))
192 if (line[strlen(line)-1] == '\n')
193 line[strlen(line)-1] = 0;
195 dirs.add_subdirs (line);
197 char *d = map_filename (line, type);
198 DWORD dw = GetFileAttributes (d);
199 if (dw != 0xffffffff && !(dw & FILE_ATTRIBUTE_DIRECTORY))
201 log (LOG_BABBLE, "unlink %s", d);
208 dirs.reverse_sort ();
210 while ((subdir = dirs.enumerate (subdir)) != 0)
212 char *d = map_filename (subdir, type);
213 if (RemoveDirectory (d))
214 log (LOG_BABBLE, "rmdir %s", d);
221 do_uninstall (HINSTANCE h)
223 num_installs = 0, num_uninstalls = 0;
225 next_dialog = 0; // we're done after this
228 fatal ("no installation found");
230 int rv = DialogBox (h, MAKEINTRESOURCE (IDD_UNINSTALL), 0, dialog_proc);
232 fatal (IDS_DIALOG_FAILED);
241 char line[1000], pkg[1000], inst[1000], src[1000];
244 FILE *db = fopen (concat (root_dir, XEMACS_SETUP_DIR, "installed.db", 0), "rt");
248 while (fgets (line, 1000, db))
252 sscanf (line, "%s %s %d %s %d", pkg, inst, &instsz, src, &srcsz);
254 log (0, "read %s", pkg);
255 Package* np = new_package(strdup(pkg));
256 pinfo(*np).install = inst;
257 pinfo(*np).install_size = instsz;
260 for (v=base (inst); *v; v++)
261 if (*v == '-' && isdigit(v[1]))
269 if (strncmp (d, ".tar", 4) == 0
270 || strncmp (d, "-pkg", 4) == 0)
276 pinfo(*np).version = strdup (v);
278 pinfo(*np).version = "0";
279 // Crude but effective
281 if (strncmp ("xemacs-i686", pkg, 11) == 0
282 || (strncmp ("xemacs-i586", pkg, 11) == 0))
284 np->type = install_type;
292 uninstall_all (void *)
295 SetEvent (init_event);
297 int df = diskfull (root_dir);
298 SendMessage (unins_diskfull, PBM_SETPOS, (WPARAM) df, 0);
302 log (0, "There are %d packages\n", npackages);
303 for (i=0; i<npackages; i++)
305 log (0, "uninstalling %s\n", package[i].name);
306 uninstall_one (package[i].name, package[i].type, i);
309 PostMessage (unins_dialog, XM_DONE, 0, 0);
311 remove (concat (root_dir, XEMACS_SETUP_DIR, "installed.db.old", 0));
312 remove (concat (root_dir, XEMACS_SETUP_DIR, "installed.db", 0));
314 remove_desktop_setup();
315 remove_xemacs_root();
316 remove_uninstall_path();
318 if (num_installs == 0)
320 // exit_msg = IDS_UNINSTALL_COMPLETE;