+BOOL CALLBACK PropertySheetFunc4(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
+ if(message == WM_INITDIALOG) {
+ pdf2swf_path = concatPaths(install_path, "pdf2swf_gui.exe");
+ FILE*fi = fopen(pdf2swf_path, "rb");
+ if(fi) {
+ printf("a GUI program exists, creating desktop/startmenu links\n");
+ config_createLinks = 1;
+ fclose(fi);
+ }
+ if(!config_createLinks) {
+ SendDlgItemMessage(hwnd, IDC_STARTMENU, SW_HIDE, 0, 0);
+ SendDlgItemMessage(hwnd, IDC_DESKTOP, SW_HIDE, 0, 0);
+ }
+
+ SendDlgItemMessage(hwnd, IDC_STARTMENU, BM_SETCHECK, config_createStartmenu, 0);
+ SendDlgItemMessage(hwnd, IDC_DESKTOP, BM_SETCHECK, config_createDesktop, 0);
+ }
+ if(message == WM_COMMAND) {
+ if((wParam&0xffff) == IDC_STARTMENU) {
+ config_createStartmenu = SendDlgItemMessage(hwnd, IDC_STARTMENU, BM_GETCHECK, 0, 0);
+ config_createStartmenu^=1;
+ SendDlgItemMessage(hwnd, IDC_STARTMENU, BM_SETCHECK, config_createStartmenu, 0);
+ return 0;
+ }
+ if((wParam&0xffff) == IDC_DESKTOP) {
+ config_createDesktop = SendDlgItemMessage(hwnd, IDC_DESKTOP, BM_GETCHECK, 0, 0);
+ config_createDesktop^=1;
+ SendDlgItemMessage(hwnd, IDC_DESKTOP, BM_SETCHECK, config_createDesktop, 0);
+ return 0;
+ }
+ }
+
+ if(message == WM_NOTIFY && (((LPNMHDR)lParam)->code == PSN_WIZFINISH)) {
+ if(!addRegistryEntries(install_path)) {
+ MessageBox(0, "Couldn't create Registry Entries", INSTALLER_NAME, MB_OK|MB_ICONERROR);
+ return 1;
+ }
+
+ char mypath[MAX_PATH];
+ path_startmenu[0] = 0;
+ path_desktop[0] = 0;
+ if(config_forAllUsers) {
+ f_SHGetSpecialFolderPath(NULL, path_desktop, CSIDL_COMMON_DESKTOPDIRECTORY, 0);
+ f_SHGetSpecialFolderPath(NULL, path_startmenu, CSIDL_COMMON_PROGRAMS, 0);
+ }
+ /* get local program/desktop directory- this is both for forAllUsers=0 as well
+ as a fallback if the above didn't return any paths */
+ if(!path_startmenu[0]) {
+ f_SHGetSpecialFolderPath(NULL, path_startmenu, CSIDL_PROGRAMS, 0);
+ }
+ if(!path_desktop[0]) {
+ f_SHGetSpecialFolderPath(NULL, path_desktop, CSIDL_DESKTOPDIRECTORY, 0);
+ }
+
+ char*uninstall_path = concatPaths(install_path, "uninstall.exe");
+
+ if(config_createLinks) {
+ if(config_createDesktop && path_desktop[0]) {
+ char* linkName = concatPaths(path_desktop, "pdf2swf.lnk");
+ printf("Creating desktop link %s -> %s\n", linkName, pdf2swf_path);
+ if(!CreateShortcut(pdf2swf_path, "pdf2swf", linkName, 0, 0, 0, install_path)) {
+ MessageBox(0, "Couldn't create desktop shortcut", INSTALLER_NAME, MB_OK);
+ return 1;
+ }
+ }
+ if(config_createStartmenu && path_startmenu[0]) {
+ char* group = concatPaths(path_startmenu, "pdf2swf");
+ CreateDirectory(group, 0);
+ addDir(group);
+ char* linkName = concatPaths(group, "pdf2swf.lnk");
+ if(!CreateShortcut(pdf2swf_path, "pdf2swf", concatPaths(group, "pdf2swf.lnk"), 0, 0, 0, install_path) ||
+ !CreateShortcut(uninstall_path, "uninstall", concatPaths(group, "uninstall.lnk"), 0, 0, 0, install_path)) {
+ MessageBox(0, "Couldn't create start menu entry", INSTALLER_NAME, MB_OK);
+ return 1;
+ }
+ }
+ } 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
+
+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);
+ /* always try to remove directories- if they are empty, this
+ will work, and they won't prevent superdirectory deletion later */
+ RemoveDirectory(f);
+ } else {
+ int l = strlen(f);
+
+ /* don't list the uninstaller as file- it's going to be removed *after*
+ everything else is done */
+ char*uninstaller="uninstall.exe";
+ int ll = strlen(uninstaller);
+ if(l>=ll) {
+ if(!strcasecmp(&f[l-ll],uninstaller)) {
+ continue;
+ }
+ }
+
+ if(data) {
+ if(*pos+l <= len) {
+ memcpy(&data[*pos], f, l);(*pos)+=l;
+ data[(*pos)++] = '\r';
+ data[(*pos)++] = '\n';
+ data[(*pos)] = 0;
+ }
+ } else {
+ (*pos) += l+2;
+ }
+ if(del) {
+ DeleteFile(f);
+ }
+ }
+ } while(FindNextFile(hFind, &findFileData));
+ FindClose(hFind);
+}
+
+static char*extrafiles = 0;
+
+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 uninstall");
+ }
+ 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) {
+ //Don't abort. If there's still something there, it'll be catched by the "extra files"
+ //functionality later
+ //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;
+ }
+
+ int len = 0;
+ findfiles(install_path, &len, 0, 0, 0);
+ if(len) {
+ extrafiles = malloc(len);
+ int pos = 0;
+ findfiles(install_path, &pos, extrafiles, len, 0);
+ } else {
+ PropSheet_RemovePage(dialog, 1, 0);
+ }
+ return 0;
+ }
+ return PropertySheetFuncCommon(hwnd, message, wParam, lParam, PSWIZB_BACK|PSWIZB_NEXT);
+}
+
+BOOL CALLBACK PropertySheetFunc6(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
+ if(message == WM_INITDIALOG) {
+ SendDlgItemMessage(hwnd, IDC_DELETEEXTRA, BM_SETCHECK, config_deleteextra, 0);
+ if(extrafiles) {
+ SetDlgItemText(hwnd, IDC_FILELIST, extrafiles);
+ }
+ }
+ 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);
+ }
+ }
+ return PropertySheetFuncCommon(hwnd, message, wParam, lParam, PSWIZB_NEXT);
+}
+
+BOOL CALLBACK PropertySheetFunc7(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
+ if(message == WM_INITDIALOG) {
+ // ...
+ }
+ return PropertySheetFuncCommon(hwnd, message, wParam, lParam, PSWIZB_FINISH);
+}
+#endif
+
+#ifndef PSP_HIDEHEADER
+#define PSP_HIDEHEADER 2048
+#endif
+
+typedef struct _wizardpage {
+ DLGPROC function;
+ int resource;
+} wizardpage_t;
+
+void runPropertySheet(HWND parent)
+{
+ PROPSHEETHEADER sheet;
+
+ wizardpage_t wpage[5] = {
+#ifndef DEINSTALL
+ {PropertySheetFunc1, IDD_LICENSE},
+ {PropertySheetFunc2, IDD_INSTALLDIR},
+ {PropertySheetFunc3, IDD_PROGRESS},
+ {PropertySheetFunc4, IDD_FINISH},
+#else
+ {PropertySheetFunc5, IDD_SURE},
+ {PropertySheetFunc6, IDD_EXTRAFILES},
+ {PropertySheetFunc7, IDD_DEINSTALLED},
+#endif
+ };
+
+ int num = sizeof(wpage)/sizeof(wpage[0]);
+
+#ifndef DEINSTALL
+ if(elevated) {
+ /* remove license.
+ TODO: remove installdir querying, too (pass installdir
+ to second process) */
+ int t;
+ for(t=1;t<num;t++) {
+ wpage[t-1] = wpage[t];
+ }
+ num --;
+ }
+#endif
+
+ HPROPSHEETPAGE pages[num];
+ int t;
+ for(t=0;t<num;t++) {
+ PROPSHEETPAGE page;
+ memset(&page, 0, sizeof(PROPSHEETPAGE));
+ page.dwSize = sizeof(PROPSHEETPAGE);
+ page.dwFlags = PSP_DEFAULT|PSP_HIDEHEADER;
+ page.hInstance = me;
+ page.pfnDlgProc = wpage[t].function;
+ page.pszTemplate = MAKEINTRESOURCE(wpage[t].resource);
+ pages[t] = CreatePropertySheetPage(&page);
+ }
+
+ memset(&sheet, 0, sizeof(PROPSHEETHEADER));
+ sheet.dwSize = sizeof(PROPSHEETHEADER);
+ sheet.hInstance = me;
+ sheet.hwndParent = parent;
+ sheet.phpage = pages;
+ sheet.dwFlags = PSH_WIZARD;
+ sheet.nPages = num;
+ PropertySheet(&sheet);
+}
+
+#ifdef DEINSTALL
+
+static void remove_self()