#ifndef  _TESTCORE_H_
#define  _TESTCORE_H_

#define  FIRST       0x00000000L
#define  NAMESPACE   0x00000000L
#define  NAMESPACES  0x00000001L
#define  USER        0x00000002L
#define  GROUP       0x00000003L
#define  DOMAIN      0x00000004L
#define  COMPUTER    0x00000005L
#define  SERVICE     0x00000006L
#define  FILESERVICE 0x00000007L
#define  SCHEMA      0x00000008L
#define  PRINTJOB    0x00000009L
#define  PRINTER     0x0000000AL
#define  PRINTQUEUE  0x0000000BL
#define  PRINTDEVICE 0x0000000CL
#define  SESSION     0x0000000DL
#define  RESOURCE    0x0000000EL
#define  FILESHARE   0x0000000FL
#define  OTHER       0x00000010L
#define  NDSROOT     0x00000011L
#define  NDSORG      0x00000012L
#define  NDSOU       0x00000013L

#define  NDSALIAS             0x00000014L
#define  NDSDIRECTORYMAP      0x00000015L
#define  NDSDISTRIBUTIONLIST  0x00000016L
#define  NDSAFPSERVER         0x00000017L
#define  NDSCOMMUNICATIONSSERVER    0x00000018L
#define  NDSMESSAGEROUTINGGROUP     0x00000019L
#define  NDSNETWARESERVER           0x0000001AL
#define  NDSORGANIZATIONALROLE      0x0000001BL
#define  NDSPRINTQUEUE              0x0000001CL
#define  NDSPRINTSERVER             0x0000001DL
#define  NDSPROFILE                 0x0000001EL
#define  NDSVOLUME                  0x0000001FL
#define  CLASS                      0x00000020L
#define  PROPERTY                   0x00000021L
#define  SYNTAX                     0x00000022L

#define  LIMIT                      0x00000023L

#define  ADSVW_INI_FILE             _T("adsvw.ini")
#define  LBOUND                     0

#define  SEPARATOR_S   _T("# ")
#define  SEPARATOR_C   _T('#')


#define  RELEASE( p )            \
   if( NULL != p )               \
   {                             \
      p->Release( );             \
   }

#define  FREE_MEMORY( mem )       \
   if( NULL != mem )              \
   {                              \
      FreeADsMem( mem );          \
   }

#define  FREE_ARRAY( mem, count )  \
   if( NULL != mem )               \
   {                               \
      FreeADsMem( mem );           \
   }

//*******************************************************************


ADSTYPE        ADsTypeFromSyntaxString( WCHAR* pszSyntax );
ADSTYPE        ADsTypeFromString( CString& strText );
CString        StringFromADsType( ADSTYPE );
DWORD          TypeFromString( WCHAR* );
DWORD          TypeFromString( CHAR*  );

void           StringFromType( DWORD, WCHAR* );
void           StringFromType( DWORD, CHAR* );
void           StringFromType( DWORD, CString& );

BOOL           MakeQualifiedName ( CHAR*,    CHAR*, DWORD );
BOOL           MakeQualifiedName ( WCHAR*,   WCHAR*, DWORD );
BOOL           MakeQualifiedName ( CString&, CString&, DWORD );

CString        OleDsGetErrorText ( HRESULT );

HRESULT        BuildFilter( BOOL*, DWORD, VARIANT* );
BOOL           GetFilter( DWORD, VARIANT*, VARIANT*   );
BOOL           SetFilter( MEMBERS*, BOOL*, DWORD );
BOOL           SetFilter( IADsContainer*, BOOL*, DWORD );

CString        FromVariantToString( VARIANT& );
CString        FromVariantArrayToString( VARIANT& v, TCHAR* pszSeparator = NULL );
HRESULT        BuildVariantArray( VARTYPE, CString&, VARIANT&, TCHAR cSeparator = SEPARATOR_C );


COleDsObject*  CreateOleDsObject ( DWORD  dwType, IUnknown* );

void           ErrorOnPutProperty( CString& strFuncSet, 
                                   CString& strProperty, 
                                   CString& strPropValue, 
                                   HRESULT  hResult,
                                   BOOL     bUseGeneric,
                                   BOOL     bUserEx ); 

BOOL           CheckIfValidClassName( CHAR*  );
BOOL           CheckIfValidClassName( WCHAR*  );

int            GetImageListIndex ( DWORD );
UINT           GetBitmapImageId  ( DWORD );

BSTR           AllocBSTR      ( WCHAR* );
BSTR           AllocBSTR      ( CHAR*  );

TCHAR*         AllocTCHAR     ( CHAR* );
TCHAR*         AllocTCHAR     ( WCHAR* );

WCHAR*         AllocWCHAR     ( CHAR* );
WCHAR*         AllocWCHAR     ( WCHAR* );

HRESULT        Get( IADs*, CHAR*, VARIANT* );
HRESULT        Get( IADs*, WCHAR*, VARIANT* );

HRESULT        Put( IADs*, CHAR*, VARIANT );
HRESULT        Put( IADs*, WCHAR*, VARIANT );

void           StringCat( CHAR*, BSTR );
void           StringCat( WCHAR*, BSTR );

void           GetLastProfileString( TCHAR*, CString& );
void           SetLastProfileString( TCHAR*, CString& );

HRESULT        CreateBlobArrayFromFile ( CString&, VARIANT& );
HRESULT        CreateBlobArray         ( CString&, VARIANT& );
HRESULT        CreateBlobArrayEx       ( CString&, VARIANT&, TCHAR cSeparator = SEPARATOR_C );

CString        Blob2String             ( void*,  DWORD );
HRESULT        String2Blob             ( TCHAR*, void**, DWORD* );

void           Convert             ( CHAR*  , CHAR*  );
void           Convert             ( WCHAR* , CHAR*  );
void           Convert             ( CHAR*  , WCHAR* );
void           Convert             ( WCHAR* , WCHAR* );

IDispatch*     CopyACE  ( IDispatch* );
IDispatch*     CopyACL  ( IDispatch* );
IDispatch*     CopySD   ( IDispatch* );


HRESULT        LARGE_INTEGERToString( TCHAR* szString, LARGE_INTEGER* pValue );
HRESULT        StringToLARGE_INTEGER( TCHAR* szString, LARGE_INTEGER* pValue );

BOOL           ConvertFromPropertyValue( VARIANT& rVar, TCHAR* szText );

long           GetVARIANTSize ( VARIANT &rVar );
HRESULT        GetVARIANTAt   ( long lIdx, VARIANT& vArray, VARIANT &vItem );

CString        FromLargeInteger( IDispatch* pDisp );
IDispatch*     CreateLargeInteger( CString& strText );
CString        GetValueAt( CString& szText, TCHAR cSep, long lValue );
long           GetValuesCount( CString& szText, TCHAR cSep  );

#ifdef _DEBUG
   #define  ERROR_HERE( szText )                            \
   {                                                        \
      TCHAR* pszText;                                       \
                                                            \
      pszText  = szText;                                    \
      Convert( pszText, __FILE__ );                         \
      _tcscat( pszText, _T( "  Line: " ) );                 \
      _itot( __LINE__, pszText + _tcslen( pszText ), 10 );  \
   }
#else
   #define  ERROR_HERE( szText ) NULL   
#endif

HRESULT  PurgeObject( IADsContainer* pParent, IUnknown* pIUnknown, LPWSTR pszPrefix = NULL );

#endif