/*******************************************************************************
 *
 *  (C) COPYRIGHT MICROSOFT CORPORATION, 2000
 *
 *  TITLE:       DUMPPROP.H
 *
 *  VERSION:     1.0
 *
 *  AUTHOR:      ShaunIv
 *
 *  DATE:        9/25/2000
 *
 *  DESCRIPTION: Display the properties associated with a IWiaItem, either to the
 *               debugger, or to a log file.
 *
 *******************************************************************************/
#ifndef __DUMPPROP_H_INCLUDED
#define __DUMPPROP_H_INCLUDED

#include <simstr.h>
#include <wia.h>
#include <wiadebug.h>

class CWiaDebugDump
{
private:
    //
    // No implementation
    //
    CWiaDebugDump( const CWiaDebugDump & );
    CWiaDebugDump &operator=( const CWiaDebugDump & );

public:
    //
    // Static helper functions
    //
    static CSimpleString GetPropVariantTypeString( VARTYPE vt );
    static CSimpleString GetPrintableValue( PROPVARIANT &PropVariant );
    static CSimpleString GetPrintableValue( VARIANT &Variant );
    static CSimpleString GetPrintableName( const STATPROPSTG &StatPropStg );
    static CSimpleString GetPrintableAccessFlags( ULONG nAccessFlags );
    static CSimpleString GetPrintableLegalValues( ULONG nAccessFlags, const PROPVARIANT &PropVariantAttributes );
    static CSimpleString GetWiaItemTypeFlags( IUnknown *pUnknown );
    static CSimpleString GetStringFromGuid( const GUID &guid );
    static CSimpleString GetTymedString( LONG tymed );
    virtual void Print( LPCTSTR pszString );

protected:
    void PrintAndDestroyWiaDevCap( WIA_DEV_CAP &WiaDevCap, LPCTSTR pszType );

public:
    //
    // Constructor and destructor
    //
    CWiaDebugDump(void);
    virtual ~CWiaDebugDump(void);

    //
    // Helpers
    //
    void DumpFormatInfo( IUnknown *pUnknown );
    void DumpCaps( IUnknown *pUnknown );
    void DumpEvents( IUnknown *pUnknown );

    virtual bool OK(void) { return true; }

    //
    // These are the most generally useful functions
    //
    void DumpWiaPropertyStorage( IUnknown *pUnknown );
    void DumpWiaItem( IUnknown *pUnknown );
    void DumpRecursive( IUnknown *pUnknown );
};

class CWiaDebugDumpToFile : public CWiaDebugDump
{
private:
    HANDLE m_hFile;

private:
    CWiaDebugDumpToFile(void);
    CWiaDebugDumpToFile( const CWiaDebugDumpToFile & );
    CWiaDebugDumpToFile &operator=( const CWiaDebugDumpToFile & );

public:
    //
    // Constructor and destructor
    //
    CWiaDebugDumpToFile( LPCTSTR pszFilename, bool bOverwrite );
    virtual ~CWiaDebugDumpToFile(void);

    virtual bool OK(void) { return (m_hFile != INVALID_HANDLE_VALUE); }
    virtual void Print( LPCTSTR pszString );
};

class CWiaDebugDumpToFileHandle : public CWiaDebugDump
{
private:
    HANDLE m_hFile;

private:
    CWiaDebugDumpToFileHandle(void);
    CWiaDebugDumpToFileHandle( const CWiaDebugDumpToFileHandle & );
    CWiaDebugDumpToFileHandle &operator=( const CWiaDebugDumpToFileHandle & );

public:
    //
    // Constructor and destructor
    //
    CWiaDebugDumpToFileHandle( HANDLE hFile );
    virtual ~CWiaDebugDumpToFileHandle(void);

    virtual bool OK(void) { return (m_hFile != INVALID_HANDLE_VALUE); }
    virtual void Print( LPCTSTR pszString );
};

//
// This small helper function checks a registry entry, and saves the item or tree to the log file stored in that entry.  If
// one is not stored in that registry entry, nothing will be saved
//
inline void SaveItemTreeLog( HKEY hKey, LPCTSTR pszRegKey, LPCTSTR pszRegValue, bool bOverwrite, IWiaItem *pWiaItem, bool bRecurse )
{
    CSimpleString strFilename = CSimpleReg(hKey,pszRegKey,false,KEY_READ).Query(pszRegValue,TEXT(""));
    if (strFilename.Length())
    {
        if (bRecurse)
        {
            CWiaDebugDumpToFile(strFilename,bOverwrite).DumpRecursive(pWiaItem);
        }
        else
        {
            CWiaDebugDumpToFile(strFilename,bOverwrite).DumpWiaItem(pWiaItem);
        }
    }
}


//
// Debug-only macros
//
#if defined(DBG) || defined(DEBUG) || defined(_DEBUG)

//
// Save the whole tree to a log file, from this item down
//
#define WIA_SAVEITEMTREELOG(hKey,pszRegKey,pszRegValue,bOverwrite,pWiaItem) SaveItemTreeLog( hKey, pszRegKey, pszRegValue, bOverwrite, pWiaItem, true )

//
// Save this item to a log file
//
#define WIA_SAVEITEMLOG(hKey,pszRegKey,pszRegValue,bOverwrite,pWiaItem)     SaveItemTreeLog( hKey, pszRegKey, pszRegValue, bOverwrite, pWiaItem, false )

//
// Print this item in the debugger
//
#define WIA_DUMPWIAITEM(pWiaItem)                                           CWiaDebugDump().DumpWiaItem(pWiaItem);

#else

#define WIA_SAVEITEMTREELOG(hKey,pszRegKey,pszRegValue,bOverwrite,pWiaItem)
#define WIA_SAVEITEMLOG(hKey,pszRegKey,pszRegValue,bOverwrite,pWiaItem)
#define WIA_DUMPWIAITEM(pWiaItem)

#endif


#endif // __DUMPPROP_H_INCLUDED