WINDSGBL.H

/////////////////////////////////////////////////////////////////////////////// 
//
// File Name
// WINDSGBL.H
//
// Description
// Global declarations for providers communicating with the WINDS Sample
// Server Messaging Host.
//
// Author
// Irving De la Cruz
//
// Revision: 1.7
//
// Written for Microsoft Windows Developer Support
// Copyright (c) 1995-1996 Microsoft Corporation. All rights reserved.
//
#ifndef _WINDSGBL_H
#define _WINDSGBL_H

///////////////////////////////////////////////////////////////////////////////
// General constants
#ifdef UNICODE
#define WINDS_RPC_STRING unsigned short *
#else
#define WINDS_RPC_STRING unsigned char *
#endif

// WinDS string for the RPC manual binding functions
// The WinDS service uses RPC over the NAMED PIPES protocols and the
// especific end-points for the protocol are listed below: One for the remote
// administrator and one for the MAPI providers
#define WINDS_RPC_PROTOCOL TEXT("ncacn_np")
#define WINDS_ADMIN_RPC_ENDPOINT TEXT("\\pipe\\WINDS-ADMIN")
#define WINDS_PROVIDERS_RPC_ENDPOINT TEXT("\\pipe\\WINDS")

// WinDS registry key for store permanent information
#define WINDS_ADMIN_REGISTRY_KEY TEXT("Software\\Microsoft\\PSS MAPI Samples\\WinDS Remote Administrator")
#define WINDS_SERVICE_REGISTRY_KEY TEXT("System\\CurrentControlSet\\Services\\WindsMessagingHost")

// WinDS administrator subkeys
#define SERVER_SUB_KEY TEXT("Default Server")

// WinDS service subkeys
#define DATA_FILE_SUB_KEY TEXT("Data File")


// Name of the address type of the user in the system and for the transports to register for.
#define WINDS_ADDRESS_TYPE TEXT("WINDS")

// Name of the Mailslot we use to send notifications to in the client machine
#define AB_WINDS_NOTIFICATION_MAILSLOT TEXT("WINDS_AB_NOTIFICATIONS")
#define XP_WINDS_NOTIFICATION_MAILSLOT TEXT("WINDS_XP_NOTIFICATIONS")
#define MS_WINDS_NOTIFICATION_MAILSLOT TEXT("WINDS_MS_NOTIFICATIONS")
#define ADMIN_WINDS_NOTIFICATION_MAILSLOT TEXT("WINDS_ADMIN_NOTIFICATIONS")
#define CLIENT_MAILSLOT_SINK_NAME_FORMAT TEXT("\\\\.\\mailslot\\%s\\%x")
#define SERVER_MAILSLOT_SINK_NAME_FORMAT TEXT("\\\\%s\\mailslot\\%s\\%x")

// Bulk download/upload pipe name
#define PIPE_NAME_FORMAT TEXT("%s\\pipe\\%d")

// Handy buffer size
#define IO_BUFFERSIZE 1024

#define WINDS_UNICODE 0x80000000
#define WINDS_ADMINISTRATOR 0x40000000

#define HIDE_IN_DIR 0x0001
#define OBJECT_DISABLED 0x0002

#define ADMIN_RIGHTS 0x0010
#define DL_OWNED 0x0010


// Field sizes in the object properties structures
#define MAX_ALIAS_SIZE 16
#define MAX_STRING_SIZE 32
#define MAX_PHONE_SIZE 12
#define MAX_COMMENT_SIZE 79
#define MAX_PASSWORD_SIZE MAX_ALIAS_SIZE

// Constants for the transports
#define TRANSPORT_MESSAGE_EID_SIZE MAX_ALIAS_SIZE
#define ENTRYID_DATA_FIELD_SIZE MAX_ALIAS_SIZE

enum
{
ROOT_CONTAINER_ID = 0xFFFFFFFF,
GATEWAY_CONTAINERS_ID = 0xFFFFFFFE,
FAX_CONTAINER_ID = 0xFFFFFFFD, // Don't change the order of this (see STORAGE.CPP (ReadABContainerInfo) in the WINDS project)
SMTP_CONTAINER_ID = 0xFFFFFFFC,
EXCHANGE_CONTAINER_ID = 0xFFFFFFFB,
GAL_CONTAINER_ID = 0xFFFFFFFA
};

typedef enum _WINDS_AB_OBJTYPE
{
UNDEFINED_OBJECT_TYPE = 0,
SERVER_USER_MAILBOX = 1, // Don't change the order or the values
SERVER_DISTRIBUTION_LIST = 2,
GATEWAY_RECIPIENT = 3,
PUBLIC_FOLDER = 4
} WINDS_AB_OBJTYPE;

typedef struct _PUBLIC_FOLDER_INFO_A
{
char szFolderName[MAX_STRING_SIZE+4];
char szComments[MAX_COMMENT_SIZE+4];
DWORD dwObjID;
FILETIME ftCreationTime;
FILETIME ftLastModTime;
DWORD dwMessageStorageSize;
DWORD dwMessageCount;
DWORD pdwMessagesIDs;
} PUBLIC_FOLDER_INFO_A, *PPUBLIC_FOLDER_INFO_A;

typedef struct _PUBLIC_FOLDER_INFO_W
{
WCHAR szFolderName[MAX_STRING_SIZE+4];
WCHAR szComments[MAX_COMMENT_SIZE+4];
DWORD dwObjID;
FILETIME ftCreationTime;
FILETIME ftLastModTime;
DWORD dwMessageStorageSize;
DWORD dwMessageCount;
DWORD pdwMessagesIDs;
} PUBLIC_FOLDER_INFO_W, *PPUBLIC_FOLDER_INFO_W;

typedef struct _PF_MESSAGE_PROPERTIES_A
{
char szAuthor[MAX_ALIAS_SIZE+4];
DWORD dwObjID;
} PF_MESSAGE_PROPERTIES_A, *PPF_MESSAGE_PROPERTIES_A;

typedef struct _PF_MESSAGE_PROPERTIES_W
{
WCHAR szAuthor[MAX_ALIAS_SIZE+4];
DWORD dwObjID;
} PF_MESSAGE_PROPERTIES_W, *PPF_MESSAGE_PROPERTIES_W;


typedef struct _MAILBOX_INFO_A
{
char szMailboxName[MAX_ALIAS_SIZE+1];
char szFullName[MAX_STRING_SIZE+1];
char szJobTitle[MAX_STRING_SIZE+1];
char szOffice[MAX_STRING_SIZE+1];
char szPhone[MAX_PHONE_SIZE+1];
char szAltPhone[MAX_PHONE_SIZE+1];
char szFax[MAX_PHONE_SIZE+1];
char szPassword[MAX_ALIAS_SIZE+1];
char szCompany[MAX_STRING_SIZE+1];
char szDepartment[MAX_STRING_SIZE+1];
char szComments[MAX_COMMENT_SIZE+1];
char szManagerName[MAX_STRING_SIZE+1];
char szManagerAlias[MAX_STRING_SIZE+1];
DWORD dwManagerID;
DWORD dwObjID;
DWORD dwFlags;
} MAILBOX_INFO_A, *PMAILBOX_INFO_A;

typedef struct _MAILBOX_INFO_W
{
WCHAR szMailboxName[MAX_ALIAS_SIZE+1];
WCHAR szFullName[MAX_STRING_SIZE+1];
WCHAR szJobTitle[MAX_STRING_SIZE+1];
WCHAR szOffice[MAX_STRING_SIZE+1];
WCHAR szPhone[MAX_PHONE_SIZE+1];
WCHAR szAltPhone[MAX_PHONE_SIZE+1];
WCHAR szFax[MAX_PHONE_SIZE+1];
WCHAR szPassword[MAX_ALIAS_SIZE+1];
WCHAR szCompany[MAX_STRING_SIZE+1];
WCHAR szDepartment[MAX_STRING_SIZE+1];
WCHAR szComments[MAX_COMMENT_SIZE+1];
WCHAR szManagerName[MAX_STRING_SIZE+1];
WCHAR szManagerAlias[MAX_STRING_SIZE+1];
DWORD dwManagerID;
DWORD dwObjID;
DWORD dwFlags;
} MAILBOX_INFO_W, *PMAILBOX_INFO_W;

typedef struct _DIST_LIST_INFO_A
{
char szDLAlias[MAX_ALIAS_SIZE+1];
char szDLFullName[MAX_STRING_SIZE+1];
DWORD dwObjID;
DWORD dwFlags;
char szOwnerAlias[MAX_ALIAS_SIZE+1];
char szOwnerName[MAX_STRING_SIZE+1];
DWORD dwOwnerID;
char szComments[MAX_COMMENT_SIZE+1];
DWORD dwMemberCount;
LPVOID pMembers;
} DIST_LIST_INFO_A, *PDIST_LIST_INFO_A;

typedef struct _DIST_LIST_INFO_W
{
WCHAR szDLAlias[MAX_ALIAS_SIZE+1];
WCHAR szDLFullName[MAX_STRING_SIZE+1];
DWORD dwObjID;
DWORD dwFlags;
WCHAR szOwnerAlias[MAX_ALIAS_SIZE+1];
WCHAR szOwnerName[MAX_STRING_SIZE+1];
DWORD dwOwnerID;
WCHAR szComments[MAX_COMMENT_SIZE+1];
DWORD dwMemberCount;
LPVOID pMembers;
} DIST_LIST_INFO_W, *PDIST_LIST_INFO_W;

// UNICODE/ANSI macro for the structures
#ifdef UNICODE
#error WINDS: UNICODE has not been implemented yet. IrvingD 9/11/95
#define MAILBOX_INFO MAILBOX_INFO_W
#define PMAILBOX_INFO PMAILBOX_INFO_W
#define DIST_LIST_INFO DIST_LIST_INFO_W
#define PDIST_LIST_INFO PDIST_LIST_INFO_W
#define PUBLIC_FOLDER_INFO PUBLIC_FOLDER_INFO_W
#define PPUBLIC_FOLDER_INFO PPUBLIC_FOLDER_INFO_W
#define PF_MESSAGE_PROPERTIES PF_MESSAGE_PROPERTIES_W
#define PPF_MESSAGE_PROPERTIES PPF_MESSAGE_PROPERTIES_W
#else
#define MAILBOX_INFO MAILBOX_INFO_A
#define PMAILBOX_INFO PMAILBOX_INFO_A
#define DIST_LIST_INFO DIST_LIST_INFO_A
#define PDIST_LIST_INFO PDIST_LIST_INFO_A
#define PUBLIC_FOLDER_INFO PUBLIC_FOLDER_INFO_A
#define PPUBLIC_FOLDER_INFO PPUBLIC_FOLDER_INFO_A
#define PF_MESSAGE_PROPERTIES PF_MESSAGE_PROPERTIES_A
#define PPF_MESSAGE_PROPERTIES PPF_MESSAGE_PROPERTIES_A
#endif

typedef union _WINDS_OBJS_INFO
{
DWORD dwFlags;
MAILBOX_INFO MB;
DIST_LIST_INFO DL;
PUBLIC_FOLDER_INFO PF;
} WINDS_OBJS_INFO;

typedef struct _AB_ENTRY_INFO
{
WINDS_OBJS_INFO Info;
WINDS_AB_OBJTYPE Type;
} AB_ENTRY_INFO, *PAB_ENTRY_INFO;


///////////////////////////////////////////////////////////////////////////////
// Message Transport Support

// Command numbers for telling the remote server what to do (from a transport)
typedef enum tagMID
{
MSG_DOWNLOAD,
MSG_DELETE,
MSG_MOVE,
OP_STARTED,
OP_COMPLETE,
OP_FAILED,
GOODBYE,
UNMARKED
} MID;

// Command message header

typedef union _MSG_HDR_INFO
{
BYTE EID[TRANSPORT_MESSAGE_EID_SIZE];
ULONG ulMsgLen;
} MSG_HDR_INFO;

typedef struct _MSG_HDR
{
MID ulMID;
MSG_HDR_INFO Info;
} MSG_HDR;

///////////////////////////////////////////////////////////////////////////////
// Client/Server notification support

enum
{
WINDS_NOTIF_ON_USER = 0x0001,
WINDS_NOTIF_ON_XP = 0x0002,
WINDS_NOTIF_ON_AB = 0x0004,
WINDS_NOTIF_ON_MS = 0x0008
};

typedef enum _WINDS_NOTIF_EVENT
{
GENERAL_NOTIF_MIN = 0x0000,
LOGGED_USER_PROPS_CHANGED = 0x0000,
SERVER_IS_SHUTTING_DOWN = 0x0001,
SERVER_HAS_RESTARTED = 0x0002,
RESET_LINKS_WITH_SERVER = 0x0003,
GENERAL_NOTIF_MAX = 0x000F,

XP_NOTIF_MIN = 0x0010,
XP_NEW_MAIL_ARRIVED = 0x0010,
XP_NOTIF_MAX = 0x00F0,

AB_NOTIF_MIN = 0x0100,
AB_USER_ADDED = 0x0100,
AB_USER_MODIFIED = 0x0200,
AB_USER_DELETED = 0x0300,
AB_DL_ADDED = 0x0400,
AB_DL_MODIFIED = 0x0500,
AB_DL_DELETED = 0x0600,
AB_GET_LOCAL_ABDATA_NOW = 0x0700,
AB_NOTIF_MAX = 0x0F00,

MS_NOTIF_MIN = 0x1000,
MS_MESSAGE_ADDED = 0x1000,
MS_MESSAGE_MODIFIED = 0x2000,
MS_MESSAGE_DELETED = 0x3000,
MS_FOLDER_ADDED = 0x4000,
MS_FOLDER_MODIFIED = 0x5000,
MS_FOLDER_DELETED = 0x6000,
MS_NOTIF_MAX = 0xF000

} WINDS_NOTIF_EVENT;

typedef struct _WINDS_NOTIFICATION
{
WINDS_NOTIF_EVENT Event;
FILETIME ftEventTime;
WINDS_OBJS_INFO Info;
} WINDS_NOTIFICATION, *PWINDS_NOTIFICATION;

///////////////////////////////////////////////////////////////////////////////
// Generic exception class for C++'s throw and catch

class CException
{
public:
CException()
{
m_hResult = E_FAIL;
}
CException (HRESULT hResult)
{
if (0 == hResult)
{
hResult = E_FAIL;
}
m_hResult = hResult;
}
inline HRESULT WINAPI GetError()
{
return m_hResult;
}
private:
HRESULT m_hResult;
};

#endif // _WINDSGBL_H

// End of file for WINDSGBL.H