//=============================================================================
//
//  This source code is only intended as a supplement to existing Microsoft 
//  documentation. 
//
//  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
//  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
//  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
//  PURPOSE.
//
//  Copyright (C) 2000 Microsoft Corporation.  All Rights Reserved.
//=============================================================================

#include "stdafx.h"
#include "globals.h"

//
// Global functions for extracting information from a primary's  data object
//

HRESULT ExtractData( 
                                       IDataObject* piDataObject,
                                      CLIPFORMAT   cfClipFormat,
                                      BYTE*        pbData,
                                      DWORD        cbData 
                                     )
{
    if ( piDataObject == NULL )
    {
        return E_INVALIDARG;
    }

    HRESULT hr = S_OK;
    
    FORMATETC formatetc =
    {
        cfClipFormat, 
        NULL,
        DVASPECT_CONTENT,
        -1,
        TYMED_HGLOBAL
    };

    STGMEDIUM stgmedium = 
    {
        TYMED_HGLOBAL,
        NULL
    };
    

    do // false loop
    {
        stgmedium.hGlobal = ::GlobalAlloc(GPTR, cbData);
        if ( NULL == stgmedium.hGlobal )
        {
            hr = E_OUTOFMEMORY;
            break;
        }

        hr = piDataObject->GetDataHere( &formatetc, &stgmedium );
        if ( FAILED(hr) )
        {
            break;
        }
        
        BYTE* pbNewData = (BYTE*)::GlobalLock(stgmedium.hGlobal);
        if (NULL == pbNewData)
        {
            hr = E_UNEXPECTED;
            break;
        }

        ::memcpy( pbData, pbNewData, cbData );
		::GlobalUnlock( stgmedium.hGlobal);

    } while (FALSE); // false loop
    
    if (NULL != stgmedium.hGlobal)
    {
        ::GlobalFree( stgmedium.hGlobal );
    }

    return hr;
} // ExtractData()


HRESULT ExtractString(
    IDataObject* piDataObject,
    CLIPFORMAT   cfClipFormat,
    WCHAR*       pstr,
    DWORD        cchMaxLength)
{
    return ExtractData( piDataObject, cfClipFormat, 
                        (PBYTE)pstr, cchMaxLength );
}