cmFileLockResult.cxx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #include "cmFileLockResult.h"
  4. #include <errno.h>
  5. #include <string.h>
  6. cmFileLockResult cmFileLockResult::MakeOk()
  7. {
  8. return cmFileLockResult(OK, 0);
  9. }
  10. cmFileLockResult cmFileLockResult::MakeSystem()
  11. {
  12. #if defined(_WIN32)
  13. const Error lastError = GetLastError();
  14. #else
  15. const Error lastError = errno;
  16. #endif
  17. return cmFileLockResult(SYSTEM, lastError);
  18. }
  19. cmFileLockResult cmFileLockResult::MakeTimeout()
  20. {
  21. return cmFileLockResult(TIMEOUT, 0);
  22. }
  23. cmFileLockResult cmFileLockResult::MakeAlreadyLocked()
  24. {
  25. return cmFileLockResult(ALREADY_LOCKED, 0);
  26. }
  27. cmFileLockResult cmFileLockResult::MakeInternal()
  28. {
  29. return cmFileLockResult(INTERNAL, 0);
  30. }
  31. cmFileLockResult cmFileLockResult::MakeNoFunction()
  32. {
  33. return cmFileLockResult(NO_FUNCTION, 0);
  34. }
  35. bool cmFileLockResult::IsOk() const
  36. {
  37. return this->Type == OK;
  38. }
  39. std::string cmFileLockResult::GetOutputMessage() const
  40. {
  41. switch (this->Type) {
  42. case OK:
  43. return "0";
  44. case SYSTEM:
  45. #if defined(_WIN32)
  46. {
  47. char* errorText = NULL;
  48. // http://stackoverflow.com/a/455533/2288008
  49. DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM |
  50. FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS;
  51. ::FormatMessageA(flags, NULL, this->ErrorValue,
  52. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  53. (LPSTR)&errorText, 0, NULL);
  54. if (errorText != NULL) {
  55. const std::string message = errorText;
  56. ::LocalFree(errorText);
  57. return message;
  58. } else {
  59. return "Internal error (FormatMessageA failed)";
  60. }
  61. }
  62. #else
  63. return strerror(this->ErrorValue);
  64. #endif
  65. case TIMEOUT:
  66. return "Timeout reached";
  67. case ALREADY_LOCKED:
  68. return "File already locked";
  69. case NO_FUNCTION:
  70. return "'GUARD FUNCTION' not used in function definition";
  71. case INTERNAL:
  72. default:
  73. return "Internal error";
  74. }
  75. }
  76. cmFileLockResult::cmFileLockResult(ErrorType typeValue, Error errorValue)
  77. : Type(typeValue)
  78. , ErrorValue(errorValue)
  79. {
  80. }