/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#ifndef _SMX_H_
#define _SMX_H_

#include <_mingw_unicode.h>

#define MENU_TEXT_LEN 50

#define SME_VERSION 0

#define SM_GETSELCOUNT (WM_USER + 1000)
#define SM_GETSERVERSELA (WM_USER + 1001)
#define SM_GETSERVERSELW (WM_USER + 1002)
#define SM_GETCURFOCUSA (WM_USER + 1003)
#define SM_GETCURFOCUSW (WM_USER + 1004)
#define SM_GETOPTIONS (WM_USER + 1005)

#define SM_GETSERVERSEL __MINGW_NAME_AW(SM_GETSERVERSEL)
#define SM_GETCURFOCUS __MINGW_NAME_AW(SM_GETCURFOCUS)

typedef struct _SMS_LOADMENUA {
  DWORD dwVersion;
  CHAR szMenuName[MENU_TEXT_LEN + 1];
  HMENU hMenu;
  CHAR szHelpFileName[MAX_PATH];
  DWORD dwServerType;
  DWORD dwMenuDelta;
} SMS_LOADMENUA,*PSMS_LOADMENUA;

typedef struct _SMS_LOADMENUW {
  DWORD dwVersion;
  WCHAR szMenuName[MENU_TEXT_LEN + 1];
  HMENU hMenu;
  WCHAR szHelpFileName[MAX_PATH];
  DWORD dwServerType;
  DWORD dwMenuDelta;
} SMS_LOADMENUW,*PSMS_LOADMENUW;

#define SMS_LOADMENU __MINGW_NAME_AW(SMS_LOADMENU)
#define PSMS_LOADMENU __MINGW_NAME_AW(PSMS_LOADMENU)

typedef struct _SMS_GETSERVERSELA {
  CHAR szServerName[MAX_PATH];
  DWORD dwServerType;
} SMS_GETSERVERSELA,*PSMS_GETSERVERSELA;

typedef struct _SMS_GETSERVERSELW {
  WCHAR szServerName[MAX_PATH];
  DWORD dwServerType;

} SMS_GETSERVERSELW,*PSMS_GETSERVERSELW;

#define SMS_GETSERVERSEL __MINGW_NAME_AW(SMS_GETSERVERSEL)
#define PSMS_GETSERVERSEL __MINGW_NAME_AW(PSMS_GETSERVERSEL)

typedef struct _SMS_GETSELCOUNT {
  DWORD dwItems;
} SMS_GETSELCOUNT,*PSMS_GETSELCOUNT;

#define SM_FOCUS_TYPE_NT_DOMAIN 1
#define SM_FOCUS_TYPE_LM_DOMAIN 2
#define SM_FOCUS_TYPE_UNKNOWN_DOMAIN 3
#define SM_FOCUS_TYPE_NT_SERVER 4
#define SM_FOCUS_TYPE_LM_SERVER 5
#define SM_FOCUS_TYPE_WFW_SERVER 6
#define SM_FOCUS_TYPE_UNKNOWN_SERVER 7

typedef struct _SMS_GETCURFOCUSA {
  CHAR szFocus[MAX_PATH];
  DWORD dwFocusType;
} SMS_GETCURFOCUSA,*PSMS_GETCURFOCUSA;

typedef struct _SMS_GETCURFOCUSW {
  WCHAR szFocus[MAX_PATH];
  DWORD dwFocusType;
} SMS_GETCURFOCUSW,*PSMS_GETCURFOCUSW;

#define SMS_GETCURFOCUS __MINGW_NAME_AW(SMS_GETCURFOCUS)
#define PSMS_GETCURFOCUS __MINGW_NAME_AW(PSMS_GETCURFOCUS)

typedef struct _SMS_GETOPTIONS {
  WINBOOL fSaveSettingsOnExit;
  WINBOOL fConfirmation;
} SMS_GETOPTIONS,*PSMS_GETOPTIONS;

typedef struct _SMS_VALIDATEA {
  const CHAR *pszServer;
  CHAR *pszType;
  CHAR *pszComment;
} SMS_VALIDATEA,*PSMS_VALIDATEA;

typedef struct _SMS_VALIDATEW {
  const WCHAR *pszServer;
  WCHAR *pszType;
  WCHAR *pszComment;

} SMS_VALIDATEW,*PSMS_VALIDATEW;

#define SMS_VALIDATE __MINGW_NAME_AW(SMS_VALIDATE)
#define PSMS_VALIDATE __MINGW_NAME_AW(PSMS_VALIDATE)

#define SZ_SME_UNLOADMENU "SMEUnloadMenu"
#define SZ_SME_INITIALIZEMENU "SMEInitializeMenu"
#define SZ_SME_REFRESH "SMERefresh"
#define SZ_SME_MENUACTION "SMEMenuAction"
#define SZ_SME_LOADMENUW "SMELoadMenuW"
#define SZ_SME_GETEXTENDEDERRORSTRINGW "SMEGetExtendedErrorStringW"
#define SZ_SME_VALIDATEW "SMEValidateW"
#define SZ_SME_LOADMENUA "SMELoadMenuA"
#define SZ_SME_GETEXTENDEDERRORSTRINGA "SMEGetExtendedErrorStringA"
#define SZ_SME_VALIDATEA "SMEValidateA"

#define SZ_SME_LOADMENU __MINGW_NAME_AW(SZ_SME_LOADMENU)
#define SZ_SME_GETEXTENDEDERRORSTRING __MINGW_NAME_AW(SZ_SME_GETEXTENDEDERRORSTRING)
#define SZ_SME_VALIDATE __MINGW_NAME_AW(SZ_SME_VALIDATE)

typedef DWORD (WINAPI *PSMX_LOADMENU)(HWND hWnd,PSMS_LOADMENU psmsload);
typedef LPTSTR (WINAPI *PSMX_GETEXTENDEDERRORSTRING)(VOID);
typedef VOID (WINAPI *PSMX_UNLOADMENU)(VOID);
typedef VOID (WINAPI *PSMX_INITIALIZEMENU)(VOID);
typedef VOID (WINAPI *PSMX_REFRESH)(HWND hwndParent);
typedef VOID (WINAPI *PSMX_MENUACTION)(HWND hwndParent,DWORD dwEventId);
typedef WINBOOL (WINAPI *PSMX_VALIDATE)(PSMS_VALIDATE psmsvalidate);

DWORD WINAPI SMELoadMenuA(HWND hWnd,PSMS_LOADMENUA psmsload);
DWORD WINAPI SMELoadMenuW(HWND hWnd,PSMS_LOADMENUW psmsload);
LPSTR WINAPI SMEGetExtendedErrorStringA(VOID);
LPWSTR WINAPI SMEGetExtendedErrorStringW(VOID);
VOID WINAPI SMEUnloadMenu(VOID);
VOID WINAPI SMEInitializeMenu(VOID);
VOID WINAPI SMERefresh(HWND hwndParent);
VOID WINAPI SMEMenuAction(HWND hwndParent,DWORD dwEventId);
WINBOOL WINAPI SMEValidateA(PSMS_VALIDATEA psmsValidate);
WINBOOL WINAPI SMEValidateW(PSMS_VALIDATEW psmsValidate);

#endif