/*============================================================================
  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.
============================================================================*/

#ifndef cmFileLockResult_h
#define cmFileLockResult_h

#include "cmStandardIncludes.h"

#if defined(_WIN32)
#include <windows.h> // DWORD
#endif

/**
  * @brief Result of the locking/unlocking file.
  * @note See @c cmFileLock
  */
class cmFileLockResult
{
public:
#if defined(_WIN32)
  typedef DWORD Error;
#else
  typedef int Error;
#endif

  /**
    * @brief Successful lock/unlock.
    */
  static cmFileLockResult MakeOk();

  /**
    * @brief Lock/Unlock failed. Read error/GetLastError.
    */
  static cmFileLockResult MakeSystem();

  /**
    * @brief Lock/Unlock failed. Timeout reached.
    */
  static cmFileLockResult MakeTimeout();

  /**
    * @brief File already locked.
    */
  static cmFileLockResult MakeAlreadyLocked();

  /**
    * @brief Internal error.
    */
  static cmFileLockResult MakeInternal();

  /**
    * @brief Try to lock with function guard outside of the function
    */
  static cmFileLockResult MakeNoFunction();

  bool IsOk() const;
  std::string GetOutputMessage() const;

private:
  enum ErrorType
  {
    OK,
    SYSTEM,
    TIMEOUT,
    ALREADY_LOCKED,
    INTERNAL,
    NO_FUNCTION
  };

  cmFileLockResult(ErrorType type, Error errorValue);

  ErrorType Type;
  Error ErrorValue;
};

#endif // cmFileLockResult_h
