X-Git-Url: http://git.iain.cx/?a=blobdiff_plain;f=gui.cpp;h=7773a1814f5e3e8b3737c814eaf49bd705697014;hb=fce252d07bdf443e3b283c26a940d3b0f26fd440;hp=97c69a8da5c6ca0a96929d2e5455380eb5f8ce4d;hpb=f2ec1c0c55a6b3e8ca02b3d66b78c87fe0ac1f47;p=nssm.git diff --git a/gui.cpp b/gui.cpp index 97c69a8..7773a18 100644 --- a/gui.cpp +++ b/gui.cpp @@ -1,5 +1,14 @@ #include "nssm.h" +static void strip_basename(char *buffer) { + size_t len = strlen(buffer); + size_t i; + for (i = len; i && buffer[i] != '\\' && buffer[i] != '/'; i--); + /* X:\ is OK. */ + if (i && buffer[i-1] == ':') i++; + buffer[i] = '\0'; +} + int nssm_gui(int resource, char *name) { /* Create window */ HWND dlg = CreateDialog(0, MAKEINTRESOURCE(resource), 0, install_dlg); @@ -28,6 +37,7 @@ int nssm_gui(int resource, char *name) { /* Go! */ MSG message; while (GetMessage(&message, 0, 0, 0)) { + if (IsDialogMessage(dlg, &message)) continue; TranslateMessage(&message); DispatchMessage(&message); } @@ -62,56 +72,68 @@ void centre_window(HWND window) { int install(HWND window) { if (! window) return 1; - /* Check parameters in the window */ - char name[STRING_SIZE]; - char exe[EXE_LENGTH]; - char flags[STRING_SIZE]; + nssm_service_t *service = alloc_nssm_service(); + if (service) { + /* Get service name. */ + if (! GetDlgItemText(window, IDC_NAME, service->name, sizeof(service->name))) { + popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_SERVICE_NAME); + cleanup_nssm_service(service); + return 2; + } - /* Get service name */ - if (! GetDlgItemText(window, IDC_NAME, name, sizeof(name))) { - popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_SERVICE_NAME); - return 2; - } + /* Get executable name */ + if (! GetDlgItemText(window, IDC_PATH, service->exe, sizeof(service->exe))) { + popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_PATH); + return 3; + } + + /* Get flags */ + if (SendMessage(GetDlgItem(window, IDC_FLAGS), WM_GETTEXTLENGTH, 0, 0)) { + if (! GetDlgItemText(window, IDC_FLAGS, service->flags, sizeof(service->flags))) { + popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_INVALID_OPTIONS); + return 4; + } + } - /* Get executable name */ - if (! GetDlgItemText(window, IDC_PATH, exe, sizeof(exe))) { - popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_PATH); - return 3; + memmove(service->dir, service->exe, strlen(service->exe)); + strip_basename(service->dir); } - /* Get flags */ - if (SendMessage(GetDlgItem(window, IDC_FLAGS), WM_GETTEXTLENGTH, 0, 0)) { - if (! GetDlgItemText(window, IDC_FLAGS, flags, sizeof(flags))) { - popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_INVALID_OPTIONS); - return 4; - } - } - else ZeroMemory(&flags, sizeof(flags)); + /* See if it works. */ + switch (install_service(service)) { + case 1: + popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_EVENT_OUT_OF_MEMORY, "service", "install()"); + cleanup_nssm_service(service); + return 1; - /* See if it works */ - switch (install_service(name, exe, flags)) { case 2: popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_MESSAGE_OPEN_SERVICE_MANAGER_FAILED); + cleanup_nssm_service(service); return 2; case 3: popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_MESSAGE_PATH_TOO_LONG, NSSM); + cleanup_nssm_service(service); return 3; case 4: popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_OUT_OF_MEMORY_FOR_IMAGEPATH); + cleanup_nssm_service(service); return 4; case 5: popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_INSTALL_SERVICE_FAILED); + cleanup_nssm_service(service); return 5; case 6: popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_CREATE_PARAMETERS_FAILED); + cleanup_nssm_service(service); return 6; } - popup_message(MB_OK, NSSM_MESSAGE_SERVICE_INSTALLED, name); + popup_message(MB_OK, NSSM_MESSAGE_SERVICE_INSTALLED, service->name); + cleanup_nssm_service(service); return 0; } @@ -119,34 +141,47 @@ int install(HWND window) { int remove(HWND window) { if (! window) return 1; - /* Check parameters in the window */ - char name[STRING_SIZE]; + /* See if it works */ + nssm_service_t *service = alloc_nssm_service(); + if (service) { + /* Get service name */ + if (! GetDlgItemText(window, IDC_NAME, service->name, sizeof(service->name))) { + popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_SERVICE_NAME); + cleanup_nssm_service(service); + return 2; + } - /* Get service name */ - if (! GetDlgItemText(window, IDC_NAME, name, sizeof(name))) { - popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_SERVICE_NAME); - return 2; + /* Confirm */ + if (popup_message(MB_YESNO, NSSM_GUI_ASK_REMOVE_SERVICE, service->name) != IDYES) { + cleanup_nssm_service(service); + return 0; + } } - /* Confirm */ - if (popup_message(MB_YESNO, NSSM_GUI_ASK_REMOVE_SERVICE, name) != IDYES) return 0; + switch (remove_service(service)) { + case 1: + popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_EVENT_OUT_OF_MEMORY, "service", "remove()"); + cleanup_nssm_service(service); + return 1; - /* See if it works */ - switch (remove_service(name)) { case 2: popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_MESSAGE_OPEN_SERVICE_MANAGER_FAILED); + cleanup_nssm_service(service); return 2; case 3: popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_SERVICE_NOT_INSTALLED); return 3; + cleanup_nssm_service(service); case 4: popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_REMOVE_SERVICE_FAILED); + cleanup_nssm_service(service); return 4; } - popup_message(MB_OK, NSSM_MESSAGE_SERVICE_REMOVED, name); + popup_message(MB_OK, NSSM_MESSAGE_SERVICE_REMOVED, service->name); + cleanup_nssm_service(service); return 0; } @@ -154,8 +189,8 @@ int remove(HWND window) { void browse(HWND window) { if (! window) return; - unsigned long bufsize = 256; - unsigned long len = bufsize; + size_t bufsize = 256; + size_t len = bufsize; OPENFILENAME ofn; ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); @@ -164,18 +199,18 @@ void browse(HWND window) { if (ofn.lpstrFilter) { ZeroMemory((void *) ofn.lpstrFilter, bufsize); char *localised = message_string(NSSM_GUI_BROWSE_FILTER_APPLICATIONS); - _snprintf((char *) ofn.lpstrFilter, bufsize, localised); + _snprintf_s((char *) ofn.lpstrFilter, bufsize, _TRUNCATE, localised); /* "Applications" + NULL + "*.exe" + NULL */ len = strlen(localised) + 1; LocalFree(localised); - _snprintf((char *) ofn.lpstrFilter + len, bufsize - len, "*.exe"); + _snprintf_s((char *) ofn.lpstrFilter + len, bufsize - len, _TRUNCATE, "*.exe"); /* "All files" + NULL + "*.*" + NULL */ len += 6; localised = message_string(NSSM_GUI_BROWSE_FILTER_ALL_FILES); - _snprintf((char *) ofn.lpstrFilter + len, bufsize - len, localised); + _snprintf_s((char *) ofn.lpstrFilter + len, bufsize - len, _TRUNCATE, localised); len += strlen(localised) + 1; LocalFree(localised); - _snprintf((char *) ofn.lpstrFilter + len, bufsize - len, "*.*"); + _snprintf_s((char *) ofn.lpstrFilter + len, bufsize - len, _TRUNCATE, "*.*"); /* Remainder of the buffer is already zeroed */ } ofn.lpstrFile = new char[MAX_PATH]; @@ -204,11 +239,11 @@ INT_PTR CALLBACK install_dlg(HWND window, UINT message, WPARAM w, LPARAM l) { switch (LOWORD(w)) { /* OK button */ case IDC_OK: - PostQuitMessage(install(window)); + if (! install(window)) PostQuitMessage(0); break; /* Cancel button */ - case IDC_CANCEL: + case IDCANCEL: DestroyWindow(window); break; @@ -219,7 +254,7 @@ INT_PTR CALLBACK install_dlg(HWND window, UINT message, WPARAM w, LPARAM l) { /* Remove button */ case IDC_REMOVE: - PostQuitMessage(remove(window)); + if (! remove(window)) PostQuitMessage(0); break; } return 1;