// File: iMbft.h
//
// Interface to Multipoint Binary File Transfer


#ifndef _IMBFT_H_
#define _IMBFT_H_

#include <t120type.h>

const unsigned int _iMBFT_MAX_APP_KEY        = 64;     //Max characters in lpszAppKey parameter passed to MBFTInitialize
const unsigned int _iMBFT_MAX_FILE_NAME      = MAX_PATH;     //Max characters in filename


typedef UINT MBFTFILEHANDLE;
typedef UINT MBFTEVENTHANDLE;

typedef enum
{
    iMBFT_OK = 0,
    iMBFT_FIRST_ERROR = 0x100,
    iMBFT_NOT_INITIALIZED,
    iMBFT_ALREADY_INITIALIZED,
    iMBFT_INVALID_SESSION_ID,
    iMBFT_INVALID_ATTACHMENT_HANDLE,
    iMBFT_NO_MORE_RECIPIENTS,
    iMBFT_NO_MORE_FILES,
    iMBFT_INVALID_EVENT_HANDLE,
    iMBFT_INVALID_FILE_HANDLE,
    iMBFT_INSUFFICIENT_DISK_SPACE,
    iMBFT_FILE_NOT_FOUND,
    iMBFT_FILE_IO_ERROR,
    iMBFT_MEMORY_ALLOCATION_ERROR,
    iMBFT_ASN1_ENCODING_ERROR,
    iMBFT_RECIPIENT_NOT_FOUND,
    iMBFT_SENDER_ABORTED,
    iMBFT_RECEIVER_ABORTED,
    iMBFT_MULT_RECEIVER_ABORTED,
    iMBFT_RECEIVER_REJECTED,
    iMBFT_INVALID_PARAMETERS,
    iMBFT_COMPRESSION_ERROR,
    iMBFT_DECOMPRESSION_ERROR,
    iMBFT_INVALID_PATH,
    iMBFT_FILE_ACCESS_DENIED,
    iMBFT_FILE_HARD_IO_ERROR,
    iMBFT_FILE_SHARING_VIOLATION,
    iMBFT_DIRECTORY_FULL_ERROR,
    iMBFT_TOO_MANY_OPEN_FILES,
    iMBFT_OPERATION_IN_PROGRESS,
    iMBFT_INSUFFICIENT_PRIVILEGE,
    iMBFT_CONDUCTOR_ABORTED,
    iMBFT_PACKET_SIZE_ERROR,
    iMBFT_UNKNOWN_ERROR,
    iMBFT_TIMEOUT_ERROR
} MBFT_ERROR_CODE;

// Return codes  (Should be in imsconf2.idl)

#define FT_ERR_FAC 0xF000
#define FT_E(e)    (0x81000000UL | FT_ERR_FAC | (ULONG) (e))

enum
{
	NM_E_FT_NO_RECIPIENTS =                FT_E(0x01FF),
	NM_E_FT_CANCELED =                     FT_E(0x01FE),
	NM_E_FT_MULT_CANCELED =                FT_E(0x01FD),
	NM_E_FT_RECDIR =                       FT_E(0x01FC),
	NM_E_FT_REJECTED =                     FT_E(0x01FB)
};

#define HRESULT_FROM_IMBFT(iMbftError)     FT_E(iMbftError)



// This matches "ErrorType" in T.MBFT spec
typedef enum
{
    MBFT_INFORMATIVE_ERROR = 0,         // Information only
    MBFT_TRANSIENT_ERROR,               // Current transfer failed, retry might work
    MBFT_PERMANENT_ERROR                // Error occurs consistently
} MBFT_ERROR_TYPES;


typedef struct _T_MBFT_PEER_INFO
{
    T120NodeID      NodeID;                 // MCS userID of GCC on peer's node
    T120UserID      MBFTPeerID;             // MCS userID of peer app
    T120SessionID   MBFTSessionID;          // Session ID
    BOOL            bIsProShareApp;         // ProShare MBFT peer
    char            szAppKey[_iMBFT_MAX_APP_KEY];   // see MBFTInitialize
} MBFT_PEER_INFO;

typedef struct _T_MBFT_SEND_FILE_INFO
{
    char            * lpszFilePath;          //Canonical path to file to be sent, upto [_iMBFT_MAX_PATH] bytes
    MBFTFILEHANDLE  hFile;                  // unique identifier for file (filled in on return)
    ULONG           lFileSize;              // File size in bytes
    time_t          FileDateTime;
} MBFT_SEND_FILE_INFO;

typedef struct _T_MBFT_RECEIVE_FILE_INFO
{
    char            szFileName[_iMBFT_MAX_FILE_NAME];  // Just the File name
    MBFTFILEHANDLE  hFile;                  // unique identifier for file
    ULONG           lFileSize;              // File size in bytes
    time_t          FileDateTime;
} MBFT_RECEIVE_FILE_INFO;

typedef struct  _T_MBFT_FILE_OFFER
{
    MBFTEVENTHANDLE hEvent;
    T120UserID      SenderID;           // MCS ID of sender-to-be
	T120NodeID      NodeID;
    ULONG           uNumFiles;          // Number of files offered
    BOOL            bIsBroadcastEvent;
    MBFT_RECEIVE_FILE_INFO  FAR * lpFileInfoList;   // Array of structs with file info
} MBFT_FILE_OFFER;

typedef struct  _T_MBFT_FILE_PROGRESS
{
    MBFTEVENTHANDLE hEvent;
    MBFTFILEHANDLE  hFile;
    ULONG           lFileSize;
    ULONG           lBytesTransmitted;
    BOOL            bIsBroadcastEvent;
} MBFT_FILE_PROGRESS;

typedef struct  _T_MBFT_EVENT_ERROR
{
    MBFTEVENTHANDLE hEvent;
    BOOL            bIsLocalError;      // If error in local MBFT provider
    T120UserID      UserID;             // MCS ID of peer who reported error
    MBFTFILEHANDLE  hFile;              // File associated with error
    BOOL            bIsBroadcastEvent;
    MBFT_ERROR_TYPES eErrorType;        // Severity of error
    MBFT_ERROR_CODE eErrorCode;
} MBFT_EVENT_ERROR;


#undef  INTERFACE
#define INTERFACE IMbftEvents
DECLARE_INTERFACE(IMbftEvents)
{
	STDMETHOD(OnInitializeComplete)(    THIS) PURE;

	STDMETHOD(OnPeerAdded)(             THIS_
										MBFT_PEER_INFO *pInfo) PURE;
	STDMETHOD(OnPeerRemoved)(           THIS_
										MBFT_PEER_INFO *pInfo) PURE;
	STDMETHOD(OnFileOffer)(             THIS_
										MBFT_FILE_OFFER *pOffer) PURE;
	STDMETHOD(OnFileProgress)(          THIS_
										MBFT_FILE_PROGRESS *pProgress) PURE;
	STDMETHOD(OnFileEnd)(               THIS_
										MBFTFILEHANDLE hFile) PURE;
	STDMETHOD(OnFileError)(             THIS_
										MBFT_EVENT_ERROR *pEvent) PURE;
	STDMETHOD(OnFileEventEnd)(          THIS_
										MBFTEVENTHANDLE hEvent) PURE;
	STDMETHOD(OnSessionEnd)(            THIS) PURE;
};

#undef  INTERFACE
#define INTERFACE IMbftControl
DECLARE_INTERFACE(IMbftControl)
{
	STDMETHOD_(void, ReleaseInterface)( THIS) PURE;
	STDMETHOD_(void, Update)(           THIS) PURE;
	STDMETHOD_(void, CancelFt)(         THIS_
										MBFTEVENTHANDLE hEvent,
										MBFTFILEHANDLE  hFile) PURE;
	STDMETHOD(AcceptFileOffer)(         THIS_
										MBFT_FILE_OFFER *pOffer,
										LPCSTR pszRecDir,
										LPCSTR pszFileName) PURE;
	STDMETHOD_(void, RejectFileOffer)(  THIS_
	                                    MBFT_FILE_OFFER *pOffer) PURE;
	STDMETHOD(SendFile)(                THIS_
	                                    LPCSTR pszFileName,
	                                    T120NodeID nidReceiver,
	                                    MBFTEVENTHANDLE *phEvent,
	                                    MBFTFILEHANDLE *phFile) PURE;
};

typedef HRESULT (WINAPI * PFNCREATEMBFTOBJECT) (IMbftControl**, IMbftEvents *);

HRESULT WINAPI FT_CreateInterface(IMbftControl **ppMbft, IMbftEvents *pEvents);


#endif /* _IMBFT_H */