From 5305ddd8332ebd905ebef3b8365fc0d736858a7a Mon Sep 17 00:00:00 2001 From: Michael Krelin Date: Mon, 05 Jul 2004 01:53:09 +0000 Subject: initial commit into svn repository git-svn-id: http://svn.klever.net/kin/dipstick/trunk@1 fe716a7a-6dde-0310-88d9-d003556173a8 --- (limited to 'DropURL.cpp') diff --git a/DropURL.cpp b/DropURL.cpp new file mode 100644 index 0000000..9394889 --- a/dev/null +++ b/DropURL.cpp @@ -0,0 +1,149 @@ +// DropURL.cpp : implementation file +// + +#include "stdafx.h" +#include "Dipstick.h" +#include "DropURL.h" +#include "DragPad.h" +#include "Dipstick.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CDropURL + +IMPLEMENT_DYNCREATE(CDropURL, CCmdTarget) + +CDropURL::CDropURL() + : m_Pad(NULL) +{ +} + +CDropURL::~CDropURL() +{ +} + + +BEGIN_MESSAGE_MAP(CDropURL, CCmdTarget) + //{{AFX_MSG_MAP(CDropURL) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +BEGIN_INTERFACE_MAP(CDropURL, CCmdTarget) + INTERFACE_PART(CDropURL, IID_IDropTarget, DDropTarget) +END_INTERFACE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CDropURL message handlers + +STDMETHODIMP_(ULONG) CDropURL::XDDropTarget::AddRef() +{ + METHOD_PROLOGUE(CDropURL, DDropTarget) + return pThis->ExternalAddRef(); +} +STDMETHODIMP_(ULONG) CDropURL::XDDropTarget::Release() +{ + METHOD_PROLOGUE(CDropURL, DDropTarget) + return pThis->ExternalRelease(); +} +STDMETHODIMP_(HRESULT) CDropURL::XDDropTarget::QueryInterface(REFIID iid,void FAR* FAR * ppvObj) +{ + METHOD_PROLOGUE(CDropURL, DDropTarget) + return pThis->ExternalQueryInterface(&iid,ppvObj); +} + +STDMETHODIMP_(HRESULT) CDropURL::XDDropTarget::DragEnter(IDataObject *pDataObject,DWORD grfKeyState,POINTL pt,DWORD *pdwEffect) +{ + METHOD_PROLOGUE(CDropURL, DDropTarget) + TRACE0("DragEnter\n"); + return pThis->DragEnter(pDataObject,grfKeyState,pt,pdwEffect); +} +STDMETHODIMP_(HRESULT) CDropURL::XDDropTarget::DragOver(DWORD grfKeyState,POINTL pt,DWORD *pdwEffect) +{ + METHOD_PROLOGUE(CDropURL, DDropTarget) + return S_OK; +} +STDMETHODIMP_(HRESULT) CDropURL::XDDropTarget::DragLeave(void) +{ + METHOD_PROLOGUE(CDropURL, DDropTarget) + TRACE0("DragLeave\n"); + return S_OK; +} +STDMETHODIMP_(HRESULT) CDropURL::XDDropTarget::Drop(IDataObject *pDataObject,DWORD grfKeyState,POINTL pt,DWORD *pdwEffect) +{ + METHOD_PROLOGUE(CDropURL, DDropTarget) + TRACE0("Drop\n"); + return pThis->Drop(pDataObject,grfKeyState,pt,pdwEffect); +} + + +HRESULT CDropURL::DragEnter(IDataObject *pDataObject,DWORD grfKeyState,POINTL pt,DWORD *pdwEffect) +{ +CString host = GetHostName(pDataObject); + if(host.IsEmpty()){ + (*pdwEffect)=DROPEFFECT_NONE; + return S_FALSE; + }else{ + (*pdwEffect)=DROPEFFECT_LINK; + return S_OK; + } +} + +CString CDropURL::GetHostName(IDataObject *pDataObject,CString *_url) +{ +FORMATETC fetc; + fetc.cfFormat=CF_TEXT; + fetc.ptd=NULL; + fetc.dwAspect=DVASPECT_CONTENT; + fetc.lindex=-1; + fetc.tymed=TYMED_HGLOBAL; +STGMEDIUM stgm; +LPVOID globe = NULL; +CString url; +CString rv; + stgm.pUnkForRelease=NULL; + do{ + if(pDataObject->GetData(&fetc,&stgm)!=S_OK) + break; + ASSERT(stgm.tymed==TYMED_HGLOBAL); + if(GlobalSize(stgm.hGlobal)>=1024) + break; + VERIFY(globe=GlobalLock(stgm.hGlobal)); + url=(LPTSTR)globe; + TRACE0("["+url+"]\n"); + if(_url) + (*_url) = url; + rv = m_Pad->m_Daddy->GetHostName(url); + }while(FALSE); + if(globe) + GlobalUnlock(stgm.hGlobal); + if(stgm.pUnkForRelease) + stgm.pUnkForRelease->Release(); + return rv; +} + +HRESULT CDropURL::Drop(IDataObject *pDataObject,DWORD grfKeyState,POINTL pt,DWORD *pwdEffect) +{ +CString url; +CString host = GetHostName(pDataObject,&url); + if(host.IsEmpty()) + return S_FALSE; +#ifdef TRUE + // URL Mode +CString *u = new CString(url); + m_Pad->m_Daddy->PostMessage(WM_DNP_URLPING,0,(LPARAM)u); +#else +CString *hn = new CString(host); + m_Pad->m_Daddy->PostMessage(WM_DNP_HOSTPING,0,(LPARAM)hn); +#endif + return S_OK; +} +void CDropURL::OnFinalRelease() +{ + TRACE0("Final Release\n"); + CCmdTarget::OnFinalRelease(); +} -- cgit v0.9.0.2