//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//
//  Copyright (C) Microsoft Corporation, 1999 - 1999
//
//  File:       guidhelp.h
//
//--------------------------------------------------------------------------

#pragma once

// GUID support functions

class CStr;
class CString;

struct IContextMenuCallback;
struct IComponent;

HRESULT ExtractData(   IDataObject* piDataObject,
                       CLIPFORMAT   cfClipFormat,
                       BYTE*        pbData,
                       DWORD        cbData );


/*+-------------------------------------------------------------------------*
 * ExtractString
 *
 * Gets string data representing the given clipboard format from the data
 * object.  StringType must be a type that can accept assignment from
 * LPCTSTR (WTL::CString, CStr, tstring, etc.)
 *--------------------------------------------------------------------------*/

template<class StringType>
HRESULT ExtractString( IDataObject* piDataObject,
                       CLIPFORMAT   cfClipFormat,
                       StringType&  str);

HRESULT GuidToCStr( CStr* pstr, const GUID& guid );
HRESULT GuidToCString(CString* pstr, const GUID& guid );

HRESULT ExtractSnapInCLSID( IDataObject* piDataObject, CLSID* pclsidSnapin );
HRESULT ExtractObjectTypeGUID( IDataObject* piDataObject, GUID* pguidObjectType );

HRESULT ExtractObjectTypeCStr( IDataObject* piDataObject, CStr* pstr );
HRESULT ExtractObjectTypeCString( IDataObject* piDataObject, CString* pstr );

HRESULT LoadRootDisplayName(IComponentData* pIComponentData, CStr& strDisplayName);
HRESULT LoadRootDisplayName(IComponentData* pIComponentData, CString& strDisplayName);

HRESULT LoadAndAddMenuItem(
    IContextMenuCallback* pIContextMenuCallback,
    UINT nResourceID, // contains text and status text seperated by '\n'
    long lCommandID,
    long lInsertionPointID,
    long fFlags,
    HINSTANCE hInst);

HRESULT AddMenuItem(
    IContextMenuCallback* pIContextMenuCallback,
    LPOLESTR pszText,
    LPOLESTR pszStatusBarText,
    long lCommandID,
    long lInsertionPointID,
    long fFlags,
    HINSTANCE hInst);

HRESULT AddSpecialSeparator(
    IContextMenuCallback* pIContextMenuCallback,
    long lInsertionPointID = CCM_INSERTIONPOINTID_ROOT_MENU );
HRESULT AddSpecialInsertionPoint(
    IContextMenuCallback* pIContextMenuCallback,
    long lCommandID,
    long lInsertionPointID = CCM_INSERTIONPOINTID_ROOT_MENU );


/*------------------------------------------------*/
/* declare various relational operators for GUIDs */
/*------------------------------------------------*/

#include <functional>

// template helper CLSID comparison function
// NOTE: extra parameter is added to have different decorated function name for each operator
// or else in debug version (expanded) functions will be linked as one function
template <typename comparator>
inline bool CompareCLSID (const CLSID& x, const CLSID& y, const comparator * unused = NULL )
{
    return  x.Data1 != y.Data1 ? comparator<unsigned long> ()(x.Data1 , y.Data1) :
            x.Data2 != y.Data2 ? comparator<unsigned short>()(x.Data2 , y.Data2) :
            x.Data3 != y.Data3 ? comparator<unsigned short>()(x.Data3 , y.Data3) :
            comparator<int>()(memcmp(x.Data4 , y.Data4, sizeof(x.Data4)) , 0);
}

inline bool operator < (const CLSID& x, const CLSID& y)
{
    return CompareCLSID<std::less>( x , y );
}

inline bool operator > (const CLSID& x, const CLSID& y)
{
    return CompareCLSID<std::greater>( x , y );
}

inline bool operator <= (const CLSID& x, const CLSID& y)
{
    return CompareCLSID<std::less_equal>( x , y );
}

inline bool operator >= (const CLSID& x, const CLSID& y)
{
    return CompareCLSID<std::greater_equal>( x , y );
}

/*--------------------------------------------------------------*/
/* operator== and operator!= for GUIDs are defined in objbase.h */
/*--------------------------------------------------------------*/


#include "guidhelp.inl"