// Copyright Antony Polukhin, 2016-2019.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)

#ifndef BOOST_STACKTRACE_DETAIL_SAFE_DUMP_WIN_IPP
#define BOOST_STACKTRACE_DETAIL_SAFE_DUMP_WIN_IPP

#include <boost/config.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
#   pragma once
#endif

#include <boost/stacktrace/safe_dump_to.hpp>

#include <boost/core/noncopyable.hpp>

#include <boost/winapi/get_current_process.hpp>
#include <boost/winapi/file_management.hpp>
#include <boost/winapi/handles.hpp>
#include <boost/winapi/access_rights.hpp>

namespace boost { namespace stacktrace { namespace detail {

std::size_t dump(void* /*fd*/, const native_frame_ptr_t* /*frames*/, std::size_t /*frames_count*/) BOOST_NOEXCEPT {
#if 0 // This code potentially could cause deadlocks (according to the MSDN). Disabled
    boost::winapi::DWORD_ written;
    const boost::winapi::DWORD_ bytes_to_write = static_cast<boost::winapi::DWORD_>(
        sizeof(native_frame_ptr_t) * frames_count
    );
    if (!boost::winapi::WriteFile(fd, frames, bytes_to_write, &written, 0)) {
        return 0;
    }

    return frames_count;
#endif
    return 0;
}

std::size_t dump(const char* /*file*/, const native_frame_ptr_t* /*frames*/, std::size_t /*frames_count*/) BOOST_NOEXCEPT {
#if 0 // This code causing deadlocks on some platforms. Disabled
    void* const fd = boost::winapi::CreateFileA(
        file,
        boost::winapi::GENERIC_WRITE_,
        0,
        0,
        boost::winapi::CREATE_ALWAYS_,
        boost::winapi::FILE_ATTRIBUTE_NORMAL_,
        0
    );

    if (fd == boost::winapi::invalid_handle_value) {
        return 0;
    }

    const std::size_t size = boost::stacktrace::detail::dump(fd, frames, frames_count);
    boost::winapi::CloseHandle(fd);
    return size;
#endif
    return 0;
}

}}} // namespace boost::stacktrace::detail

#endif // BOOST_STACKTRACE_DETAIL_SAFE_DUMP_WIN_IPP
