/*============================================================================
  CMake - Cross Platform Makefile Generator
  Copyright 2014 Ruslan Baratov

  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.

  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/

#include "cmFileLockResult.h"

#include <errno.h>

cmFileLockResult cmFileLockResult::MakeOk()
{
  return cmFileLockResult(OK, 0);
}

cmFileLockResult cmFileLockResult::MakeSystem()
{
#if defined(_WIN32)
  const Error lastError = GetLastError();
#else
  const Error lastError = errno;
#endif
  return cmFileLockResult(SYSTEM, lastError);
}

cmFileLockResult cmFileLockResult::MakeTimeout()
{
  return cmFileLockResult(TIMEOUT, 0);
}

cmFileLockResult cmFileLockResult::MakeAlreadyLocked()
{
  return cmFileLockResult(ALREADY_LOCKED, 0);
}

cmFileLockResult cmFileLockResult::MakeInternal()
{
  return cmFileLockResult(INTERNAL, 0);
}

cmFileLockResult cmFileLockResult::MakeNoFunction()
{
  return cmFileLockResult(NO_FUNCTION, 0);
}

bool cmFileLockResult::IsOk() const
{
  return this->Type == OK;
}

std::string cmFileLockResult::GetOutputMessage() const
{
  switch (this->Type)
    {
    case OK:
      return "0";
    case SYSTEM:
#if defined(_WIN32)
      {
      char* errorText = NULL;

      // http://stackoverflow.com/a/455533/2288008
      DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM |
          FORMAT_MESSAGE_ALLOCATE_BUFFER |
          FORMAT_MESSAGE_IGNORE_INSERTS;
      ::FormatMessageA(
          flags,
          NULL,
          this->ErrorValue,
          MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
          (LPSTR)&errorText,
          0,
          NULL
      );

      if (errorText != NULL)
        {
        const std::string message = errorText;
        ::LocalFree(errorText);
        return message;
        }
      else
        {
        return "Internal error (FormatMessageA failed)";
        }
      }
#else
      return strerror(this->ErrorValue);
#endif
    case TIMEOUT:
      return "Timeout reached";
    case ALREADY_LOCKED:
      return "File already locked";
    case NO_FUNCTION:
      return "'GUARD FUNCTION' not used in function definition";
    case INTERNAL:
    default:
      return "Internal error";
    }
}

cmFileLockResult::cmFileLockResult(ErrorType typeValue, Error errorValue):
    Type(typeValue), ErrorValue(errorValue)
{
}
