//
// tipupd.cpp
//

#include "private.h"
#include "tipupd.h"
#include "tipdlg.h"



CTipUpdWnd *g_pTipUpdWnd;

HINSTANCE g_hInst;

HANDLE g_hInstanceMutext;

const TCHAR c_szTipUpdWndClass[] = TEXT("TipUpdWndClass");

BOOL CTipUpdWnd::_bWndClassRegistered = FALSE;


BOOL InitApp(HINSTANCE hInstance)
{
    g_hInstanceMutext = CreateMutex(NULL, FALSE, TEXT("TipUpdInstMutext"));

    if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
        // another tipupd process is already running
        return FALSE;
    }

    g_hInst = hInstance;

    g_pTipUpdWnd = new CTipUpdWnd();

    if (!g_pTipUpdWnd)
        return FALSE;

    g_pTipUpdWnd->CreateWnd();

    return TRUE;
}

void UninitApp(void)
{
    delete g_pTipUpdWnd;

    CloseHandle(g_hInstanceMutext);
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    MSG msg;

    if (!InitApp(hInstance))
    {
        return 0;
    }

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    UninitApp();

    return msg.wParam;
}


//+---------------------------------------------------------------------------
//
// ctor
//
//----------------------------------------------------------------------------

CTipUpdWnd::CTipUpdWnd()
{
    _hWnd = NULL;

    if (!_bWndClassRegistered)
    {
        WNDCLASSEX wc;
        memset(&wc, 0, sizeof(wc));
        wc.cbSize = sizeof(wc);
        wc.style = CS_HREDRAW | CS_VREDRAW ;
        wc.hInstance = g_hInst;
        wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        wc.lpfnWndProc = _TipUpdWndProc;
        wc.lpszClassName = c_szTipUpdWndClass;
        RegisterClassEx(&wc);
        _bWndClassRegistered = TRUE;
    }

}

//+---------------------------------------------------------------------------
//
// dtor
//
//----------------------------------------------------------------------------

CTipUpdWnd::~CTipUpdWnd()
{
}

//+---------------------------------------------------------------------------
//
// CreateWnd
//
//----------------------------------------------------------------------------

HWND CTipUpdWnd::CreateWnd()
{
    _hWnd = CreateWindowEx(0, c_szTipUpdWndClass, TEXT(""),
                           WS_DISABLED,
                           0, 0, 0, 0,
                           NULL, 0, g_hInst, 0);



    return _hWnd;
}

//+---------------------------------------------------------------------------
//
// _WndProc
//
//----------------------------------------------------------------------------

LRESULT CALLBACK CTipUpdWnd::_TipUpdWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_CREATE:
            {
               CTipUpdDlg *pTipUpdDlg = new CTipUpdDlg;

               pTipUpdDlg->LoadTipUpdDlg(g_hInst, hWnd);

               delete pTipUpdDlg;
            }
            break;

        case WM_DESTROY:
            PostQuitMessage(0);
            break;

        default:
            return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    return 0;
}