// IDL source for WINSSNAP DLLs
//

#ifndef _WINSDB_IDL_
#define _WINSDB_IDL_

import "wtypes.idl";

typedef BYTE *  PBYTE;
typedef PBYTE	HROW;
typedef HROW *	LPHROW;

// valid states for the database
typedef enum _WINSDB_STATE
{
    WINSDB_NORMAL		= 0x0001,
    WINSDB_LOADING		= 0x0002,
    WINSDB_SORTING		= 0x0003,
    WINSDB_FILTERING	= 0x0004

} WINSDB_STATE;

// possible sort types for the database
typedef enum _WINSDB_SORT_TYPE
{
	WINSDB_SORT_BY_NAME,
	WINSDB_SORT_BY_IP,
	WINSDB_SORT_BY_VERSION,
	WINSDB_SORT_BY_TYPE,
	WINSDB_SORT_BY_EXPIRATION,
	WINSDB_SORT_BY_STATE,
	WINSDB_SORT_BY_STATIC,
	WINSDB_SORT_BY_OWNER

} WINSDB_SORT_TYPE;

// possilble views for the database
typedef enum _WINSDB_VIEW_TYPE
{
	WINSDB_VIEW_ENTIRE_DATABASE,
	WINSDB_VIEW_FILTERED_DATABASE

} WINSDB_VIEW_TYPE;


typedef enum _WINSDB_SORT_OPTIONS
{
	WINSDB_SORT_DESCENDING	= 0x00,
	WINSDB_SORT_ASCENDING	= 0x01

} WINSDB_SORT_OPTIONS;


// possible Filter types for the database
typedef enum _WINSDB_FILTER_TYPE
{
	WINSDB_FILTER_BY_TYPE,
	WINSDB_FILTER_BY_OWNER,
	WINSDB_FILTER_BY_IPADDR,
	WINSDB_FILTER_BY_NAME

} WINSDB_FILTER_TYPE;

const ULONG WINS_RECNAME_MAX = 256;

#define MAX_IP_ADDRS 100
const ULONG WINSDB_MAX_NO_IPADDRS = MAX_IP_ADDRS;

// predefined
interface IWinsDatabase;

typedef IWinsDatabase *     LPWINSDATABASE;

// flags for the dwState field
typedef enum _WINSDB_REC_TYPE
{
	WINSDB_REC_ACTIVE       = 0x00000001,
	WINSDB_REC_STATIC       = 0x00000002,
	WINSDB_REC_TOMBSTONE    = 0x00000004,
	WINSDB_REC_RELEASED     = 0x00000008,
	WINSDB_REC_DELETED      = 0x00000010,
	WINSDB_REC_MULT_ADDRS	= 0x00000020,
	WINSDB_REC_UNIQUE		= 0x00000040,
	WINSDB_REC_NORM_GROUP	= 0x00000080,
	WINSDB_REC_SPEC_GROUP	= 0x00000100,
	WINSDB_REC_MULTIHOMED	= 0x00000200,
	WINSDB_REC_INTERNET_GROUP=0x00000400
} WINSDB_REC_TYPE;

// NOTE: the dwType field is broken up as follows:
// HIWORD(dwType) = record type defined in WINSINTF_RECTYPE_E
// LOBYTE(LOWORD(dwType)) = machine type (ie. 1B, 1C, etc)
typedef struct _WinsRecord
{
	char					szRecordName [WINS_RECNAME_MAX];	
	DWORD_PTR				dwExpiration;						
	DWORD					dwIpAdd[MAX_IP_ADDRS];  // extra space, just in case
	DWORD					dwNoOfAddrs;
	LARGE_INTEGER			liVersion;	
    DWORD                   dwNameLen;
	DWORD					dwOwner;	
	DWORD                   dwState;
    DWORD                   dwType;
} WinsRecord, * LPWINSRECORD;

/*---------------------------------------------------------------------------
	IWinsDatabase
 ---------------------------------------------------------------------------*/
[
   object,
   uuid(7B0C8BBF-3117-11d1-B981-00C04FBF914A),
   local,
   pointer_default(unique),
]
   
   
//----------------------------------------------------------------------------
// Struct:      WinsRecord
//
// Contains information applying to a particular Wins Record
//----------------------------------------------------------------------------


interface IWinsDatabase :IUnknown
{
	import "unknwn.idl";
	// all these need no parameters
	HRESULT	Init();
	HRESULT Start();
	HRESULT Stop();
	HRESULT	Clear();
	
	// SortBy can be by record name, IP Address, Type, Expiration date, 
	// Version 
	HRESULT	Sort([in] WINSDB_SORT_TYPE dwSortBy, [in] DWORD dwSortOptions);

	// returns the pointer to the first record in the rows 
	// requested for
	HRESULT	GetRows([in]	ULONG    uNumberOfRows,
					[in]	ULONG	 uStartPos,
					[out]	LPHROW	 ppHRow,
					[out]   int *	 nNumberOfRowsReturned);

	// fills in the WinsRecord structure
	HRESULT GetData([in]    HROW			hRow,
					[out]   LPWINSRECORD	pRecordData);

	// fills in the row index in the chunk of memory
	// finds the specified computer name
	HRESULT FindRow([in, string]	LPCOLESTR	pszName,
					[in]			HROW		hrowStart,
					[out]			LPHROW		hRow);
	
	//  just places the handle at that point in the DB records
	HRESULT GetHRow([in]			UINT				uIndex,
					[in]			LPHROW				hRow);

	HRESULT	GetTotalCount([out] int * pTotalCount);
	
	HRESULT GetCurrentCount([out] int * pCurrentCount);

	HRESULT GetCurrentScanned([out] int * pCurrentScanned);
	
	HRESULT AddRecord([in] const LPWINSRECORD RecordData);
	
	HRESULT DeleteRecord([in] HROW hrowRecord);

	HRESULT GetCurrentState( [out] WINSDB_STATE * pState);

	HRESULT FilterRecords([in] WINSDB_FILTER_TYPE  FilterType,
						  [in] DWORD			   dwParam1,
						  [in] DWORD			   dwParam2); 

	HRESULT	AddFilter(	[in] WINSDB_FILTER_TYPE	FilterType,
						[in] DWORD				dwData1,
						[in] DWORD				dwData2,
						[in] LPCOLESTR			strData3);

	HRESULT	ClearFilter([in] WINSDB_FILTER_TYPE FilterType);

	HRESULT Initialize([in, string]	 LPCOLESTR  pszName,
					   [in, string]  LPCOLESTR  pszIP);

	HRESULT GetName([out, string] LPOLESTR  pszName,
					[in]		  UINT      cchMax);

	HRESULT GetIP([out, string] LPOLESTR  pszIP,
				  [in]		    UINT      cchMax);

	HRESULT GetLastError([out] HRESULT * pLastError);

	HRESULT SetActiveView([in] WINSDB_VIEW_TYPE ViewType);

	HRESULT SetApiInfo([in] DWORD dwOwner, [in] LPCOLESTR strPrefix, [in] BOOL bCache);

	HRESULT GetCachingFlag([out] BOOL *pbCache);

	HRESULT ReloadSuggested([in] DWORD dwOwner, [in] LPCOLESTR strPrefix, [out] BOOL *pbReload);

};

// a macro to help declare all of the methods
cpp_quote("#define DeclareIWinsDatabaseMembers(IPURE) \\")
cpp_quote("	STDMETHOD(Init)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Start)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Stop)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(Clear)(THIS) IPURE; \\")
cpp_quote("	STDMETHOD(GetLastError)(THIS_ HRESULT * pLastError) IPURE; \\")
cpp_quote("	STDMETHOD(Sort)(THIS_ WINSDB_SORT_TYPE SortBy, DWORD dwSortOptions) IPURE; \\")
cpp_quote("	STDMETHOD(GetRows)(THIS_ ULONG uNumberOfRows,ULONG uStartPos, HROW* ppHRow, int* nNumberOfRowsReturned) IPURE; \\")
cpp_quote("	STDMETHOD(GetData)(THIS_ HROW  hRow, WinsRecord* ppRecordData) IPURE; \\")
cpp_quote("	STDMETHOD(FindRow)(THIS_ LPCOLESTR	pszName, HROW hrowStart,HROW*	hRow) IPURE; \\")
cpp_quote("	STDMETHOD(GetHRow)(THIS_ UINT uIndex,HROW* hRow) IPURE; \\")
cpp_quote("	STDMETHOD(GetTotalCount)(THIS_ int* pTotalCount) IPURE; \\")
cpp_quote("	STDMETHOD(GetCurrentCount)(THIS_ int* pCurrentCount) IPURE; \\")
cpp_quote("	STDMETHOD(GetCurrentScanned)(THIS_ int* pCurrentScanned) IPURE; \\")
cpp_quote("	STDMETHOD(AddRecord)(THIS_ const LPWINSRECORD RecordData) IPURE; \\")
cpp_quote("	STDMETHOD(DeleteRecord)(THIS_ HROW	hrowRecord) IPURE; \\")
cpp_quote("	STDMETHOD(GetCurrentState)(THIS_ WINSDB_STATE *	pState) IPURE; \\")
cpp_quote(" STDMETHOD(FilterRecords)(THIS_ WINSDB_FILTER_TYPE FilterType, DWORD dwParam1, DWORD dwParam2) IPURE; \\") 
cpp_quote(" STDMETHOD(AddFilter)(THIS_ WINSDB_FILTER_TYPE FilterType, DWORD dwParam1, DWORD dwParam2, LPCOLESTR strParam3) IPURE; \\") 
cpp_quote("	STDMETHOD(ClearFilter)(THIS_ WINSDB_FILTER_TYPE FilterType) IPURE; \\")
cpp_quote(" STDMETHOD(Initialize)(THIS_ LPCOLESTR pszName, LPCOLESTR pszIP) IPURE; \\")
cpp_quote(" STDMETHOD(GetName)(THIS_ LPOLESTR pszName, UINT cchMax) IPURE; \\")
cpp_quote(" STDMETHOD(GetIP)(THIS_ LPOLESTR pszIP, UINT cchMax) IPURE; \\")
cpp_quote("	STDMETHOD(SetActiveView)(THIS_ WINSDB_VIEW_TYPE ViewType) IPURE; \\")
cpp_quote(" STDMETHOD(SetApiInfo)(THIS_ DWORD dwOwner, LPCOLESTR strPrefix, BOOL bCache) IPURE; \\")
cpp_quote(" STDMETHOD(GetCachingFlag)(THIS_ BOOL *pbCache) IPURE; \\")
cpp_quote(" STDMETHOD(ReloadSuggested)(THIS_ DWORD dwOwner, LPCOLESTR strPrefix, BOOL *pbReload) IPURE; \\")
cpp_quote("")

#endif // _WINSDB__


