/*

Miranda IM: the free IM client for Microsoft* Windows*

Copyright 2000-2008 Miranda ICQ/IM project,
all portions of this codebase are copyrighted to the people
listed in contributors.txt.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/

#ifndef M_PROTOINT_H__
#define M_PROTOINT_H__ 1

typedef enum 
{
	EV_PROTO_ONLOAD,
	EV_PROTO_ONREADYTOEXIT,
	EV_PROTO_ONEXIT,
	EV_PROTO_ONRENAME,
	EV_PROTO_ONOPTIONS,
	EV_PROTO_ONERASE,
	EV_PROTO_ONMENU,
	EV_PROTO_ONCONTACTDELETED,
	EV_PROTO_DBSETTINGSCHANGED,
}
	PROTOEVENTTYPE;

#if MIRANDA_VER >= 0x0900
	#define PROTOCHAR TCHAR
	#define PROTOFILEEVENT PROTORECVFILET
#else
	#define PROTOCHAR char
	#define PROTOFILEEVENT PROTORECVFILE
#endif

#ifndef __cplusplus
typedef struct tagPROTO_INTERFACE_VTBL
{
	HANDLE    ( *AddToList )( struct tagPROTO_INTERFACE*, int flags, PROTOSEARCHRESULT* psr );
	HANDLE    ( *AddToListByEvent )( struct tagPROTO_INTERFACE*, int flags, int iContact, HANDLE hDbEvent );

	int       ( *Authorize )( struct tagPROTO_INTERFACE*, HANDLE hContact );
	int       ( *AuthDeny )( struct tagPROTO_INTERFACE*, HANDLE hContact, const TCHAR* szReason );
	int       ( *AuthRecv )( struct tagPROTO_INTERFACE*, HANDLE hContact, PROTORECVEVENT* );
	int       ( *AuthRequest )( struct tagPROTO_INTERFACE*, HANDLE hContact, const TCHAR* szMessage );

	HANDLE    ( *ChangeInfo )( struct tagPROTO_INTERFACE*, int iInfoType, void* pInfoData );

	HANDLE    ( *FileAllow )( struct tagPROTO_INTERFACE*, HANDLE hContact, HANDLE hTransfer, const PROTOCHAR* szPath );
	int       ( *FileCancel )( struct tagPROTO_INTERFACE*, HANDLE hContact, HANDLE hTransfer );
	int       ( *FileDeny )( struct tagPROTO_INTERFACE*, HANDLE hContact, HANDLE hTransfer, const PROTOCHAR* szReason );
	int       ( *FileResume )( struct tagPROTO_INTERFACE*, HANDLE hTransfer, int* action, const PROTOCHAR** szFilename );

	DWORD_PTR ( *GetCaps )( struct tagPROTO_INTERFACE*, int type, HANDLE hContact );
	HICON     ( *GetIcon )( struct tagPROTO_INTERFACE*, int iconIndex );
	int       ( *GetInfo )( struct tagPROTO_INTERFACE*, HANDLE hContact, int infoType );

	HANDLE    ( *SearchBasic )( struct tagPROTO_INTERFACE*, const PROTOCHAR* id );
	HANDLE    ( *SearchByEmail )( struct tagPROTO_INTERFACE*, const PROTOCHAR* email );
	HANDLE    ( *SearchByName )( struct tagPROTO_INTERFACE*, const PROTOCHAR* nick, const PROTOCHAR* firstName, const PROTOCHAR* lastName );
	HWND      ( *SearchAdvanced )( struct tagPROTO_INTERFACE*, HWND owner );
	HWND      ( *CreateExtendedSearchUI )( struct tagPROTO_INTERFACE*, HWND owner );

	int       ( *RecvContacts )( struct tagPROTO_INTERFACE*, HANDLE hContact, PROTORECVEVENT* );
	int       ( *RecvFile )( struct tagPROTO_INTERFACE*, HANDLE hContact, PROTOFILEEVENT* );
	int       ( *RecvMsg )( struct tagPROTO_INTERFACE*, HANDLE hContact, PROTORECVEVENT* );
	int       ( *RecvUrl )( struct tagPROTO_INTERFACE*, HANDLE hContact, PROTORECVEVENT* );

	int       ( *SendContacts )( struct tagPROTO_INTERFACE*, HANDLE hContact, int flags, int nContacts, HANDLE* hContactsList );
	HANDLE    ( *SendFile )( struct tagPROTO_INTERFACE*, HANDLE hContact, const PROTOCHAR* szDescription, PROTOCHAR** ppszFiles );
	int       ( *SendMsg )( struct tagPROTO_INTERFACE*, HANDLE hContact, int flags, const char* msg );
	int       ( *SendUrl )( struct tagPROTO_INTERFACE*, HANDLE hContact, int flags, const char* url );

	int       ( *SetApparentMode )( struct tagPROTO_INTERFACE*, HANDLE hContact, int mode );
	int       ( *SetStatus )( struct tagPROTO_INTERFACE*, int iNewStatus );

	HANDLE    ( *GetAwayMsg )( struct tagPROTO_INTERFACE*, HANDLE hContact );
	int       ( *RecvAwayMsg )( struct tagPROTO_INTERFACE*, HANDLE hContact, int mode, PROTORECVEVENT* evt );
	int       ( *SendAwayMsg )( struct tagPROTO_INTERFACE*, HANDLE hContact, HANDLE hProcess, const char* msg );
	int       ( *SetAwayMsg )( struct tagPROTO_INTERFACE*, int iStatus, const PROTOCHAR* msg );

	int       ( *UserIsTyping )( struct tagPROTO_INTERFACE*, HANDLE hContact, int type );

	int       ( *OnEvent )( struct tagPROTO_INTERFACE*, PROTOEVENTTYPE iEventType, WPARAM wParam, LPARAM lParam );
}
	PROTO_INTERFACE_VTBL;
#endif

typedef struct tagPROTO_INTERFACE
{
	#ifndef __cplusplus
		PROTO_INTERFACE_VTBL* vtbl;
	#endif

	int    m_iStatus,
	       m_iDesiredStatus,
	       m_iXStatus,
	       m_iVersion;  // version 2 or higher designate support of Unicode services
	TCHAR* m_tszUserName;
	char*  m_szProtoName;
	char*  m_szModuleName;

	DWORD  reserved[ 40 ];

	#ifdef __cplusplus
	virtual	HANDLE   __cdecl AddToList( int flags, PROTOSEARCHRESULT* psr ) = 0;
	virtual	HANDLE   __cdecl AddToListByEvent( int flags, int iContact, HANDLE hDbEvent ) = 0;

	virtual	int      __cdecl Authorize( HANDLE hDbEvent ) = 0;
	virtual	int      __cdecl AuthDeny( HANDLE hDbEvent, const PROTOCHAR* szReason ) = 0;
	virtual	int      __cdecl AuthRecv( HANDLE hContact, PROTORECVEVENT* ) = 0;
	virtual	int      __cdecl AuthRequest( HANDLE hContact, const PROTOCHAR* szMessage ) = 0;

	virtual	HANDLE   __cdecl ChangeInfo( int iInfoType, void* pInfoData ) = 0;

	virtual	HANDLE   __cdecl FileAllow( HANDLE hContact, HANDLE hTransfer, const PROTOCHAR* szPath ) = 0;
	virtual	int      __cdecl FileCancel( HANDLE hContact, HANDLE hTransfer ) = 0;
	virtual	int      __cdecl FileDeny( HANDLE hContact, HANDLE hTransfer, const PROTOCHAR* szReason ) = 0;
	virtual	int      __cdecl FileResume( HANDLE hTransfer, int* action, const PROTOCHAR** szFilename ) = 0;

	virtual	DWORD_PTR __cdecl GetCaps( int type, HANDLE hContact = NULL ) = 0;
	virtual	HICON     __cdecl GetIcon( int iconIndex ) = 0;
	virtual	int       __cdecl GetInfo( HANDLE hContact, int infoType ) = 0;

	virtual	HANDLE    __cdecl SearchBasic( const PROTOCHAR* id ) = 0;
	virtual	HANDLE    __cdecl SearchByEmail( const PROTOCHAR* email ) = 0;
	virtual	HANDLE    __cdecl SearchByName( const PROTOCHAR* nick, const PROTOCHAR* firstName, const PROTOCHAR* lastName ) = 0;
	virtual	HWND      __cdecl SearchAdvanced( HWND owner ) = 0;
	virtual	HWND      __cdecl CreateExtendedSearchUI( HWND owner ) = 0;

	virtual	int       __cdecl RecvContacts( HANDLE hContact, PROTORECVEVENT* ) = 0;
	virtual	int       __cdecl RecvFile( HANDLE hContact, PROTOFILEEVENT* ) = 0;
	virtual	int       __cdecl RecvMsg( HANDLE hContact, PROTORECVEVENT* ) = 0;
	virtual	int       __cdecl RecvUrl( HANDLE hContact, PROTORECVEVENT* ) = 0;

	virtual	int       __cdecl SendContacts( HANDLE hContact, int flags, int nContacts, HANDLE* hContactsList ) = 0;
	virtual	HANDLE    __cdecl SendFile( HANDLE hContact, const PROTOCHAR* szDescription, PROTOCHAR** ppszFiles ) = 0;
	virtual	int       __cdecl SendMsg( HANDLE hContact, int flags, const char* msg ) = 0;
	virtual	int       __cdecl SendUrl( HANDLE hContact, int flags, const char* url ) = 0;

	virtual	int       __cdecl SetApparentMode( HANDLE hContact, int mode ) = 0;
	virtual	int       __cdecl SetStatus( int iNewStatus ) = 0;

	virtual	HANDLE    __cdecl GetAwayMsg( HANDLE hContact ) = 0;
	virtual	int       __cdecl RecvAwayMsg( HANDLE hContact, int mode, PROTORECVEVENT* evt ) = 0;
	virtual	int       __cdecl SendAwayMsg( HANDLE hContact, HANDLE hProcess, const char* msg ) = 0;
	virtual	int       __cdecl SetAwayMsg( int iStatus, const PROTOCHAR* msg ) = 0;

	virtual	int       __cdecl UserIsTyping( HANDLE hContact, int type ) = 0;

	virtual	int       __cdecl OnEvent( PROTOEVENTTYPE iEventType, WPARAM wParam, LPARAM lParam ) = 0;
	#endif
}
	PROTO_INTERFACE;

#endif // M_PROTOINT_H__
