From 439ff0b772c6cdaa25906efa4aadf63ffb8218af Mon Sep 17 00:00:00 2001 From: "reed@reedloden.com" Date: Thu, 18 Oct 2007 21:30:03 -0700 Subject: [PATCH] Bug 396592 - "Drag and drop images from the content area fail" [p=jimm r=emaijala sr=roc a=blocking1.9+ for M9] --- widget/src/windows/nsDataObj.cpp | 68 +++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/widget/src/windows/nsDataObj.cpp b/widget/src/windows/nsDataObj.cpp index 5923c2a59d4e..2a65c262ea20 100644 --- a/widget/src/windows/nsDataObj.cpp +++ b/widget/src/windows/nsDataObj.cpp @@ -209,6 +209,16 @@ STDMETHODIMP nsDataObj::CStream::Seek(LARGE_INTEGER nMove, DWORD dwOrigin, ULARGE_INTEGER* nNewPos) { + if (nNewPos == NULL) + return STG_E_INVALIDPOINTER; + + if (nMove.LowPart == 0 && nMove.HighPart == 0 && + (dwOrigin == STREAM_SEEK_SET || dwOrigin == STREAM_SEEK_CUR)) { + nNewPos->LowPart = 0; + nNewPos->HighPart = 0; + return S_OK; + } + return E_NOTIMPL; } @@ -221,7 +231,63 @@ STDMETHODIMP nsDataObj::CStream::SetSize(ULARGE_INTEGER nNewSize) //----------------------------------------------------------------------------- STDMETHODIMP nsDataObj::CStream::Stat(STATSTG* statstg, DWORD dwFlags) { - return E_NOTIMPL; + if (statstg == NULL) + return STG_E_INVALIDPOINTER; + + if (!mChannel) + return E_FAIL; + + memset((void*)statstg, 0, sizeof(STATSTG)); + + if (dwFlags != STATFLAG_NONAME) + { + nsCOMPtr sourceURI; + if (NS_FAILED(mChannel->GetURI(getter_AddRefs(sourceURI)))) { + return E_FAIL; + } + + nsCAutoString strFileName; + nsCOMPtr sourceURL = do_QueryInterface(sourceURI); + sourceURL->GetFileName(strFileName); + + if (strFileName.IsEmpty()) + return E_FAIL; + + NS_UnescapeURL(strFileName); + NS_ConvertUTF8toUTF16 wideFileName(strFileName); + + PRUint32 nMaxNameLength = (wideFileName.Length()*2) + 2; + void * retBuf = CoTaskMemAlloc(nMaxNameLength); // freed by caller + if (!retBuf) + return STG_E_INSUFFICIENTMEMORY; + + ZeroMemory(retBuf, nMaxNameLength); + memcpy(retBuf, wideFileName.get(), wideFileName.Length()*2); + statstg->pwcsName = (LPOLESTR)retBuf; + } + + SYSTEMTIME st; + FILETIME ft; + + statstg->type = STGTY_STREAM; + + GetSystemTime(&st); + SystemTimeToFileTime((const SYSTEMTIME*)&st, (LPFILETIME)&statstg->mtime); + statstg->ctime = statstg->atime = statstg->mtime; + + PRInt32 nLength = 0; + if (mChannel) + mChannel->GetContentLength(&nLength); + + if (nLength < 0) + nLength = 0; + + statstg->cbSize.LowPart = (DWORD)nLength; + statstg->grfMode = STGM_READ; + statstg->grfLocksSupported = LOCK_ONLYONCE; + statstg->clsid = CLSID_NULL; + + return S_OK; } //-----------------------------------------------------------------------------