741 lines
17 KiB
C
741 lines
17 KiB
C
/*++
|
|
|
|
Copyright (c) 1997-1999 Microsoft Corporation.
|
|
All rights reserved.
|
|
|
|
MODULE NAME:
|
|
|
|
ismapi.h
|
|
|
|
ABSTRACT:
|
|
|
|
Service-to-ISM (Intersite Messaging) service API and
|
|
ISM-to-plug-in-transport API.
|
|
|
|
DETAILS:
|
|
|
|
CREATED:
|
|
|
|
97/11/26 Jeff Parham (jeffparh)
|
|
|
|
REVISION HISTORY:
|
|
|
|
--*/
|
|
|
|
#ifndef __ISMAPI_H__
|
|
#define __ISMAPI_H__
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif
|
|
|
|
#ifndef ISM_STRUCTS_DEFINED
|
|
#define ISM_STRUCTS_DEFINED
|
|
|
|
//==============================================================================
|
|
//
|
|
// ISM_MSG structure contains the message data (as a byte blob).
|
|
|
|
// Note, this structure is part of the RPC interface for the IP transport
|
|
// plug-in. You should not change this structure without renaming it and
|
|
// preserving the old one; the old one must continue to be used as part of the
|
|
// old IP RPC interface.
|
|
//
|
|
|
|
typedef struct _ISM_MSG {
|
|
DWORD cbData;
|
|
#ifdef MIDL_PASS
|
|
[size_is(cbData)] BYTE * pbData;
|
|
#else
|
|
BYTE * pbData;
|
|
#endif
|
|
LPWSTR pszSubject;
|
|
} ISM_MSG, *PISM_MSG;
|
|
|
|
typedef ISM_MSG ISM_MSG_V1, *PISM_MSG_V1;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// ISM_SITE_CONNECTIVITY structure describes how sites are interconnected via
|
|
// a specific transport.
|
|
//
|
|
// The pulCosts element should be interpreted as a multidimensional array.
|
|
// pLinkValues[i*cNumSites + j].ulCost is the cost of communication from site
|
|
// pSiteDNs[i] to site pSiteDNs[j].
|
|
//
|
|
|
|
typedef struct _ISM_LINK {
|
|
ULONG ulCost;
|
|
ULONG ulReplicationInterval;
|
|
ULONG ulOptions;
|
|
} ISM_LINK, *PISM_LINK;
|
|
|
|
typedef struct _ISM_CONNECTIVITY {
|
|
ULONG cNumSites;
|
|
#ifdef MIDL_PASS
|
|
[ref, size_is(cNumSites)] LPWSTR * ppSiteDNs;
|
|
[ref, size_is(cNumSites * cNumSites)] ISM_LINK * pLinkValues;
|
|
#else
|
|
LPWSTR * ppSiteDNs;
|
|
ISM_LINK * pLinkValues;
|
|
#endif
|
|
} ISM_CONNECTIVITY, *PISM_CONNECTIVITY;
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// ISM_SERVER_LIST structure describes a set of servers, identified by DN.
|
|
//
|
|
|
|
typedef struct _ISM_SERVER_LIST {
|
|
DWORD cNumServers;
|
|
#ifdef MIDL_PASS
|
|
[ref, size_is(cNumServers)] LPWSTR * ppServerDNs;
|
|
#else
|
|
LPWSTR * ppServerDNs;
|
|
#endif
|
|
} ISM_SERVER_LIST, *PISM_SERVER_LIST;
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// ISM_SCHEDULE structure describes a schedule on which two sites are
|
|
// connected. The byte stream should be interpreted as a SCHEDULE structure,
|
|
// as defined in \nt\public\sdk\inc\schedule.h.
|
|
//
|
|
|
|
typedef struct _ISM_SCHEDULE {
|
|
DWORD cbSchedule;
|
|
#ifdef MIDL_PASS
|
|
[ref, size_is(cbSchedule)] BYTE * pbSchedule;
|
|
#else
|
|
BYTE * pbSchedule;
|
|
#endif
|
|
} ISM_SCHEDULE, *PISM_SCHEDULE;
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Refresh reason codes
|
|
|
|
typedef enum _ISM_REFRESH_REASON_CODE {
|
|
ISM_REFRESH_REASON_RESERVED = 0,
|
|
ISM_REFRESH_REASON_TRANSPORT,
|
|
ISM_REFRESH_REASON_SITE,
|
|
ISM_REFRESH_REASON_MAX // always last
|
|
} ISM_REFRESH_REASON_CODE;
|
|
|
|
|
|
#endif // #ifndef ISM_STRUCTS_DEFINED
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
#ifndef MIDL_PASS
|
|
|
|
//==============================================================================
|
|
//
|
|
// Service-to-ISM (Intersite Messaging) service API.
|
|
//
|
|
|
|
DWORD
|
|
I_ISMSend(
|
|
IN const ISM_MSG * pMsg,
|
|
IN LPCWSTR pszServiceName,
|
|
IN LPCWSTR pszTransportDN,
|
|
IN LPCWSTR pszTransportAddress
|
|
);
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Sends a message to a service on a remote machine. If the client specifies a
|
|
NULL transport, the lowest cost transport will be used.
|
|
|
|
Arguments:
|
|
|
|
pMsg (IN) - The data to send.
|
|
|
|
pszServiceName (IN) - Service to which to send the message.
|
|
|
|
pszTransportDN (IN) - The DN of the Inter-Site-Transport object
|
|
corresponding to the transport by which the message should be sent.
|
|
|
|
pszTransportAddress (IN) - The transport-specific address to which to send
|
|
the message.
|
|
|
|
Return Values:
|
|
|
|
NO_ERROR - Message successfully queued for send.
|
|
|
|
other - Failure.
|
|
|
|
--*/
|
|
|
|
|
|
DWORD
|
|
I_ISMReceive(
|
|
IN LPCWSTR pszServiceName,
|
|
IN DWORD dwMsecToWait,
|
|
OUT ISM_MSG ** ppMsg
|
|
);
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Receives a message addressed to the given service on the local machine.
|
|
|
|
If successful and no message is waiting, immediately returns a NULL message.
|
|
If a non-NULL message is returned, the caller is responsible for eventually
|
|
calling I_ISMFree()'ing the returned message.
|
|
|
|
Arguments:
|
|
|
|
pszServiceName (IN) - Service for which to receive the message.
|
|
|
|
dwMsecToWait (IN) - Milliseconds to wait for message if none is immediately
|
|
available; in the range [0, INFINITE].
|
|
|
|
ppMsg (OUT) - On successful return, holds a pointer to the received message
|
|
or NULL.
|
|
|
|
Return Values:
|
|
|
|
NO_ERROR - Message successfully returned (or NULL was returned,
|
|
indicating no message is waiting).
|
|
|
|
other - Failure.
|
|
|
|
--*/
|
|
|
|
|
|
void
|
|
I_ISMFree(
|
|
IN VOID * pv
|
|
);
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Frees memory allocated on the behalf of the client by I_ISM* APIs.
|
|
|
|
Arguments:
|
|
|
|
pv (IN) - Memory to free.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
|
|
DWORD
|
|
I_ISMGetConnectivity(
|
|
IN LPCWSTR pszTransportDN,
|
|
OUT ISM_CONNECTIVITY ** ppConnectivity
|
|
);
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Compute the costs associated with transferring data amongst sites via a
|
|
specific transport.
|
|
|
|
On successful return, it is the client's responsibility to eventually call
|
|
I_ISMFree(*ppConnectivity);
|
|
|
|
Arguments:
|
|
|
|
pszTransportDN (IN) - The transport for which to query costs.
|
|
|
|
ppConnectivity (OUT) - On successful return, holds a pointer to the
|
|
ISM_CONNECTIVITY structure describing the interconnection of sites
|
|
along the given transport.
|
|
|
|
Return Values:
|
|
|
|
NO_ERROR - Success.
|
|
ERROR_* - Failure.
|
|
|
|
--*/
|
|
|
|
|
|
DWORD
|
|
I_ISMGetTransportServers(
|
|
IN LPCWSTR pszTransportDN,
|
|
IN LPCWSTR pszSiteDN,
|
|
OUT ISM_SERVER_LIST ** ppServerList
|
|
);
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Retrieve the DNs of servers in a given site that are capable of sending and
|
|
receiving data via a specific transport.
|
|
|
|
On successful return, it is the client's responsibility to eventually call
|
|
I_ISMFree(*ppServerList);
|
|
|
|
Arguments:
|
|
|
|
pszTransportDN (IN) - Transport to query.
|
|
|
|
pszSiteDN (IN) - Site to query.
|
|
|
|
ppServerList - On successful return, holds a pointer to a structure
|
|
containing the DNs of the appropriate servers or NULL. If NULL, any
|
|
server with a value for the transport address type attribute can be
|
|
used.
|
|
|
|
Return Values:
|
|
|
|
NO_ERROR - Success.
|
|
ERROR_* - Failure.
|
|
|
|
--*/
|
|
|
|
|
|
DWORD
|
|
I_ISMGetConnectionSchedule(
|
|
LPCWSTR pszTransportDN,
|
|
LPCWSTR pszSite1DN,
|
|
LPCWSTR pszSite2DN,
|
|
ISM_SCHEDULE ** ppSchedule
|
|
);
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Retrieve the schedule by which two given sites are connected via a specific
|
|
transport.
|
|
|
|
On successful return, it is the client's responsibility to eventually call
|
|
I_ISMFree(*ppSchedule);
|
|
|
|
Arguments:
|
|
|
|
pszTransportDN (IN) - Transport to query.
|
|
|
|
pszSite1DN, pszSite2DN (IN) - Sites to query.
|
|
|
|
ppSchedule - On successful return, holds a pointer to a structure
|
|
describing the schedule by which the two given sites are connected via
|
|
the transport, or NULL if the sites are always connected.
|
|
|
|
Return Values:
|
|
|
|
NO_ERROR - Success.
|
|
ERROR_* - Failure.
|
|
|
|
--*/
|
|
|
|
|
|
//==============================================================================
|
|
//
|
|
// ISM-to-plug-in-transport API.
|
|
//
|
|
|
|
|
|
typedef void ISM_NOTIFY(
|
|
IN HANDLE hNotify,
|
|
IN LPCWSTR pszServiceName
|
|
);
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Called by the plug-in to notify the ISM service that a message has been
|
|
received for the given service.
|
|
|
|
Arguments:
|
|
|
|
hNotify (IN) - Notification handle, as passed to the plug-in in the
|
|
IsmStartup() call.
|
|
|
|
pszServiceName (IN) - Service for which a message was received.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
|
|
typedef DWORD ISM_STARTUP(
|
|
IN LPCWSTR pszTransportDN,
|
|
IN ISM_NOTIFY * pNotifyFunction,
|
|
IN HANDLE hNotify,
|
|
OUT HANDLE *phIsm
|
|
);
|
|
ISM_STARTUP IsmStartup;
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initialize the plug-in.
|
|
|
|
Arguments:
|
|
|
|
pszTransportDN (IN) - The DN of the Inter-Site-Transport that named this
|
|
DLL as its plug-in. The DS object may contain additional configuration
|
|
information for the transport (e.g., the name of an SMTP server for
|
|
an SMTP transport).
|
|
|
|
pNotifyFunction (IN) - Function to call to notify the ISM service of pending
|
|
messages.
|
|
|
|
hNotify (IN) - Parameter to supply to the notify function.
|
|
|
|
phIsm (OUT) - On successful return, holds a handle to be used in
|
|
future calls to the plug-in for the named Inter-Site-Transport. Note
|
|
that it is possible for more than one Inter-Site-Transport object to
|
|
name a given DLL as its plug-in, in which case IsmStartup() will be
|
|
called for each such object.
|
|
|
|
Return Values:
|
|
|
|
NO_ERROR - Successfully initialized.
|
|
|
|
other - Failure.
|
|
|
|
--*/
|
|
|
|
|
|
typedef DWORD ISM_REFRESH(
|
|
IN HANDLE hIsm,
|
|
IN ISM_REFRESH_REASON_CODE eReason,
|
|
IN LPCWSTR pszObjectDN OPTIONAL
|
|
);
|
|
ISM_REFRESH IsmRefresh;
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Called whenever changes occur according to the reason code.
|
|
|
|
One reason is to the Inter-Site-Transport object specified in the
|
|
IsmStartup() call.
|
|
|
|
Another is a change to a site in the sites container.
|
|
|
|
Arguments:
|
|
|
|
hIsm (IN) - Handle returned by a prior call to IsmStartup().
|
|
|
|
dwReason (IN) - Dword indicating the reason we were called
|
|
|
|
pszObjectDN (IN) - Object DN relating to the reason
|
|
|
|
(Current) DN of the Inter-Site-Transport object that
|
|
named this DLL as its plug-in. Note that this DN will differ from that
|
|
specified in IsmStartup() if the transport DN has been renamed.
|
|
|
|
Site DN of site that was added, renamed or deleted
|
|
|
|
Return Values:
|
|
|
|
NO_ERROR - Successfully updated.
|
|
|
|
other - Failure. A failure return implies the plug-in has shut down (i.e.,
|
|
no further calls will be made on hIsm, including an
|
|
IsmShutdown()).
|
|
|
|
--*/
|
|
|
|
|
|
typedef DWORD ISM_SEND(
|
|
IN HANDLE hIsm,
|
|
IN LPCWSTR pszRemoteTransportAddress,
|
|
IN LPCWSTR pszServiceName,
|
|
IN const ISM_MSG * pMsg
|
|
);
|
|
ISM_SEND IsmSend;
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Send a message over this transport.
|
|
|
|
Arguments:
|
|
|
|
hIsm (IN) - Handle returned by a prior call to IsmStartup().
|
|
|
|
pszRemoteTransportAddress (IN) - Transport address of the destination
|
|
server.
|
|
|
|
pszServiceName (IN) - Name of the service on the remote machine that is the
|
|
intended receiver of the message.
|
|
|
|
pMsg (IN) - Message to send.
|
|
|
|
Return Values:
|
|
|
|
NO_ERROR - Message successfully queued for send.
|
|
|
|
other - Failure.
|
|
|
|
--*/
|
|
|
|
|
|
typedef DWORD ISM_RECEIVE(
|
|
IN HANDLE hIsm,
|
|
IN LPCWSTR pszServiceName,
|
|
OUT ISM_MSG ** ppMsg
|
|
);
|
|
ISM_RECEIVE IsmReceive;
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Return the next waiting message (if any). If no message is waiting, a NULL
|
|
message is returned. If a non-NULL message is returned, the ISM service
|
|
is responsible for calling IsmFreeMsg(hIsm, *ppMsg) when the message is no
|
|
longer needed.
|
|
|
|
If a non-NULL message is returned, it is immediately dequeued. (I.e., once
|
|
a message is returned through IsmReceive(), the transport is free to destroy
|
|
it.)
|
|
|
|
Arguments:
|
|
|
|
hIsm (IN) - Handle returned by a prior call to IsmStartup().
|
|
|
|
ppMsg (OUT) - On successful return, holds a pointer to the received message
|
|
or NULL.
|
|
|
|
Return Values:
|
|
|
|
NO_ERROR - Message successfully returned (or NULL was returned,
|
|
indicating no message is waiting).
|
|
|
|
other - Failure.
|
|
|
|
--*/
|
|
|
|
|
|
typedef void ISM_FREE_MSG(
|
|
IN HANDLE hIsm,
|
|
IN ISM_MSG * pMsg
|
|
);
|
|
ISM_FREE_MSG IsmFreeMsg;
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Frees a message returned by IsmReceive().
|
|
|
|
Arguments:
|
|
|
|
hIsm (IN) - Handle returned by a prior call to IsmStartup().
|
|
|
|
pMsg (IN) - Message to free.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
|
|
typedef DWORD ISM_GET_CONNECTIVITY(
|
|
IN HANDLE hIsm,
|
|
OUT ISM_CONNECTIVITY ** ppConnectivity
|
|
);
|
|
ISM_GET_CONNECTIVITY IsmGetConnectivity;
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Compute the costs associated with transferring data amongst sites.
|
|
|
|
On successful return, the ISM service will eventually call
|
|
IsmFreeConnectivity(hIsm, *ppConnectivity);
|
|
|
|
Arguments:
|
|
|
|
hIsm (IN) - Handle returned by a prior call to IsmStartup().
|
|
|
|
ppConnectivity (OUT) - On successful return, holds a pointer to the
|
|
ISM_CONNECTIVITY structure describing the interconnection of sites
|
|
along this transport.
|
|
|
|
Return Values:
|
|
|
|
NO_ERROR - Success.
|
|
ERROR_* - Failure.
|
|
|
|
--*/
|
|
|
|
|
|
typedef void ISM_FREE_CONNECTIVITY(
|
|
IN HANDLE hIsm,
|
|
IN ISM_CONNECTIVITY * pConnectivity
|
|
);
|
|
ISM_FREE_CONNECTIVITY IsmFreeConnectivity;
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Frees the structure returned by IsmGetConnectivity().
|
|
|
|
Arguments:
|
|
|
|
hIsm (IN) - Handle returned by a prior call to IsmStartup().
|
|
|
|
pSiteConnectivity (IN) - Structure to free.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
|
|
typedef DWORD ISM_GET_TRANSPORT_SERVERS(
|
|
IN HANDLE hIsm,
|
|
IN LPCWSTR pszSiteDN,
|
|
OUT ISM_SERVER_LIST ** ppServerList
|
|
);
|
|
ISM_GET_TRANSPORT_SERVERS IsmGetTransportServers;
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Retrieve the DNs of servers in a given site that are capable of sending and
|
|
receiving data via this transport.
|
|
|
|
On successful return of a non-NULL list, the ISM service will eventually call
|
|
IsmFreeTransportServers(hIsm, *ppServerList);
|
|
|
|
Arguments:
|
|
|
|
hIsm (IN) - Handle returned by a prior call to IsmStartup().
|
|
|
|
pszSiteDN (IN) - Site to query.
|
|
|
|
ppServerList - On successful return, holds a pointer to a structure
|
|
containing the DNs of the appropriate servers or NULL. If NULL, any
|
|
server with a value for the transport address type attribute can be
|
|
used.
|
|
|
|
Return Values:
|
|
|
|
NO_ERROR - Success.
|
|
ERROR_* - Failure.
|
|
|
|
--*/
|
|
|
|
|
|
typedef void ISM_FREE_TRANSPORT_SERVERS(
|
|
IN HANDLE hIsm,
|
|
IN ISM_SERVER_LIST * pServerList
|
|
);
|
|
ISM_FREE_TRANSPORT_SERVERS IsmFreeTransportServers;
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Frees the structure returned by IsmGetTransportServers().
|
|
|
|
Arguments:
|
|
|
|
hIsm (IN) - Handle returned by a prior call to IsmStartup().
|
|
|
|
pServerList (IN) - Structure to free.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
|
|
typedef DWORD ISM_GET_CONNECTION_SCHEDULE(
|
|
IN HANDLE hIsm,
|
|
IN LPCWSTR pszSite1DN,
|
|
IN LPCWSTR pszSite2DN,
|
|
OUT ISM_SCHEDULE ** ppSchedule
|
|
);
|
|
ISM_GET_CONNECTION_SCHEDULE IsmGetConnectionSchedule;
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Retrieve the schedule by which two given sites are connected via this
|
|
transport.
|
|
|
|
On successful return, it is the ISM service's responsibility to eventually
|
|
call IsmFreeSchedule(*ppSchedule);
|
|
|
|
Arguments:
|
|
|
|
hIsm (IN) - Handle returned by a prior call to IsmStartup().
|
|
|
|
pszSite1DN, pszSite2DN (IN) - Sites to query.
|
|
|
|
ppSchedule - On successful return, holds a pointer to a structure
|
|
describing the schedule by which the two given sites are connected via
|
|
the transport, or NULL if the sites are always connected.
|
|
|
|
Return Values:
|
|
|
|
NO_ERROR - Success.
|
|
ERROR_* - Failure.
|
|
|
|
--*/
|
|
|
|
|
|
typedef void ISM_FREE_CONNECTION_SCHEDULE(
|
|
IN HANDLE hIsm,
|
|
IN ISM_SCHEDULE * pSchedule
|
|
);
|
|
ISM_FREE_CONNECTION_SCHEDULE IsmFreeConnectionSchedule;
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Frees the structure returned by IsmGetTransportServers().
|
|
|
|
Arguments:
|
|
|
|
hIsm (IN) - Handle returned by a prior call to IsmStartup().
|
|
|
|
pSchedule (IN) - Structure to free.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
|
|
typedef void ISM_SHUTDOWN(
|
|
IN HANDLE hIsm
|
|
);
|
|
ISM_SHUTDOWN IsmShutdown;
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Uninitialize transport plug-in.
|
|
|
|
Arguments:
|
|
|
|
hIsm (IN) - Handle returned by a prior call to IsmStartup().
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
#endif // #ifndef MIDL_PASS
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // __ISMAPI_H__
|