+ } else {
+ printf("not creating desktop/startmenu links\n");
+ }
+
+ char*uninstall_ini = concatPaths(install_path, "uninstall.ini");
+ addFile(uninstall_ini);
+ writeFileList(installedFiles, uninstall_ini);
+ }
+ return PropertySheetFuncCommon(hwnd, message, wParam, lParam, PSWIZB_FINISH);
+}
+#endif
+
+#ifdef DEINSTALL
+
+BOOL CALLBACK PropertySheetFunc5(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
+ HWND dialog = GetParent(hwnd);
+ if(message == WM_INITDIALOG) {
+ SetDlgItemText(hwnd, IDC_INFO, "Ready to deinstall");
+ }
+ if(message == WM_NOTIFY && (((LPNMHDR)lParam)->code == PSN_WIZNEXT)) {
+
+ filelist_t* list = readFileList("uninstall.ini");
+ if(!list) {
+ list = readFileList(concatPaths(install_path, "uninstall.ini"));
+ if(!list) {
+ MessageBox(0, "Couldn't determine installed files list- did you run uninstall twice?", INSTALLER_NAME, MB_OK);
+ exit(-1);
+ }
+ }
+ filelist_t* l = list;
+ int num = 0;
+ while(l) {num++;l=l->next;}
+
+ PropSheet_SetWizButtons(dialog, 0);
+ SendMessage(dialog, PSM_CANCELTOCLOSE, 0, 0);
+ SetDlgItemText(hwnd, IDC_TITLE, "Uninstalling files...");
+ SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETRANGE, 0, (LPARAM)MAKELONG(0,num));
+ num = 0;
+ l = list;
+ while(l) {
+ SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETPOS, num, 0);
+ if(l->type=='F')
+ DeleteFile(l->filename);
+ else if(l->type=='D')
+ RemoveDirectory(l->filename);
+ else if(l->type=='I')
+ /* skip- we will remove ourselves later */;
+ num++;l = l->next;
+ }
+
+ return 0;
+ }
+ return PropertySheetFuncCommon(hwnd, message, wParam, lParam, PSWIZB_BACK|PSWIZB_NEXT);
+}
+
+void findfiles(char*path, int*pos, char*data, int len, char del)
+{
+ WIN32_FIND_DATA findFileData;
+ HANDLE hFind = FindFirstFile(concatPaths(path, "*"), &findFileData);
+ if(hFind == INVALID_HANDLE_VALUE)
+ return;
+ do {
+ if(findFileData.cFileName[0] == '.' &&
+ (findFileData.cFileName[0] == '.' || findFileData.cFileName == '\0'))
+ continue;
+ char*f = concatPaths(path, findFileData.cFileName);
+ if(findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+ findfiles(f, pos, data, len, del);
+ if(del) {
+ RemoveDirectory(f);
+ }
+ } else {
+ int l = strlen(f);
+ if(data) {
+ if(*pos+l <= len) {
+ memcpy(&data[*pos], f, l);(*pos)+=l;
+ data[(*pos)++] = '\r';
+ data[(*pos)++] = '\n';
+ }
+ } else {
+ (*pos) += l+2;
+ }
+ if(del) {
+ DeleteFile(f);
+ }
+ }
+ } while(FindNextFile(hFind, &findFileData));
+ FindClose(hFind);
+}
+
+BOOL CALLBACK PropertySheetFunc6(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
+ if(message == WM_INITDIALOG) {
+ SendDlgItemMessage(hwnd, IDC_DELETEEXTRA, BM_SETCHECK, config_deleteextra, 0);
+
+ int len = 0;
+
+ findfiles(install_path, &len, 0, 0, 0);
+ char*data = malloc(len);
+ int pos = 0;
+ findfiles(install_path, &pos, data, len, 0);
+
+ SetDlgItemText(hwnd, IDC_FILELIST, data);
+ }
+ if(message == WM_COMMAND) {
+ if((wParam&0xffff) == IDC_DELETEEXTRA) {
+ config_deleteextra = SendDlgItemMessage(hwnd, IDC_DELETEEXTRA, BM_GETCHECK, 0, 0);
+ config_deleteextra ^=1;
+ SendDlgItemMessage(hwnd, IDC_DELETEEXTRA, BM_SETCHECK, config_deleteextra, 0);
+ return 0;
+ }
+ }
+ if(message == WM_NOTIFY && (((LPNMHDR)lParam)->code == PSN_WIZNEXT)) {
+ if(config_deleteextra) {
+ int pos = 0;
+ findfiles(install_path, &pos, 0, 0, 1);