1. 4FIPS
  2. PHOTOS
  3. VIDEOS
  4. APPS
  5. CODE
  6. FORUMS
  7. ABOUT
/*
(c) 2004-14 Filip Stoklas, aka FipS, www.4FipS.com
THIS CODE IS FREE - LICENSED UNDER THE MIT LICENSE
*/

#include "fs_common_os.h"
#include "fs_common.h"

#include <cstdarg> // va_list, ...

#if defined(FS_PLATFORM_WIN)
#   define WIN32_LEAN_AND_MEAN
#   include <windows.h>
#endif

#if defined(FS_PLATFORM_OSX)
#   include <CoreFoundation/CFUserNotification.h>
#endif

namespace fs { namespace os {

void debug_print(const char *text) FS_NOEXCEPT
{
#if defined(FS_PLATFORM_WIN)
    OutputDebugStringA(text);
#else
    printf("%s", text);
#endif
}

bool show_yes_no_dialog(const char *title, const char *text, bool def_ans) FS_NOEXCEPT
{
#if defined(FS_PLATFORM_WIN)

    return MessageBoxA(nullptr, text, title, MB_ICONQUESTION | MB_YESNO) == IDYES;

#elif defined(FS_PLATFORM_OSX)

    CFStringRef title_ref = CFStringCreateWithCString(nullptr, title, kCFStringEncodingASCII);
    CFStringRef text_ref = CFStringCreateWithCString(nullptr, text, kCFStringEncodingASCII);

    CFOptionFlags res = 0;

    CFUserNotificationDisplayAlert(
     0.0, // timeout
     kCFUserNotificationNoteAlertLevel, // flags
     nullptr, // iconURL
     nullptr, // soundURL
     nullptr, // localizationURL
     title_ref, // alertHeader,
     text_ref, // alertMessage,
     CFSTR("Yes"), // defaultButtonTitle,
     CFSTR("No"), // alternateButtonTitle,
     nullptr, // otherButtonTitle,
     &res
    );

    CFRelease(title_ref);
    CFRelease(text_ref);

    return res == kCFUserNotificationDefaultResponse;

#else

    FS_TRACE(("[!] show_yes_no_dialog() -> %d", int(def_ans)));
    return def_ans;

#endif
}

}} // namespace fs::os

namespace fs { namespace str {

void vsnprintf_trunc(char *buf, size_t buf_size, const char *fmt, va_list args) FS_NOEXCEPT
{
#if defined(FS_PLATFORM_WIN)
    // if truncated, '\0' is automatically appended
    _vsnprintf_s(buf, buf_size, _TRUNCATE, fmt, args);
#else
    vsnprintf(buf, buf_size, fmt, args); // TODO
#endif
}

void snprintf_trunc(char *buf, size_t buf_size, const char *fmt, ...) FS_NOEXCEPT
{
    va_list args;
    va_start(args, fmt);
    vsnprintf_trunc(buf, buf_size, fmt, args);
    va_end(args);
}

}} // namespace fs::str