mirror of
https://github.com/reactos/reactos.git
synced 2025-05-22 18:45:00 +00:00
Sync to Wine-0_9_4:
Michael Jung <mjung@iss.tu-darmstadt.de> - ole32: Periodically call IDropTarger::DragOver during Drag&Drop. Robert Shearman <rob@codeweavers.com> - CreateErrorInfo trace fix. CreateErrorInfo isn't a stub so don't print this in the trace message. Alexandre Julliard <julliard@winehq.org> - Take advantage of the __EXCEPT_PAGE_FAULT macro. - We no longer need to handle EXCEPTION_PRIV_INSTRUCTION on page faults. - ole32: Revert exception handler change. The handler does the opposite of normal page fault handlers. Ulrich Czekalla <ulrich@codeweavers.com> - ole32: Return error instead of asserting if storage file is corrupt. Eric Pouech <eric.pouech@wanadoo.fr> - Functions with no paramters must be (void). - Const correctness fixes. svn path=/trunk/; revision=20350
This commit is contained in:
parent
907803cd6d
commit
754cd8a82e
8 changed files with 75 additions and 137 deletions
|
@ -476,7 +476,7 @@ HRESULT WINAPI CreateErrorInfo(ICreateErrorInfo **pperrinfo)
|
|||
{
|
||||
IErrorInfo * pei;
|
||||
HRESULT res;
|
||||
TRACE("(%p): stub:\n", pperrinfo);
|
||||
TRACE("(%p)\n", pperrinfo);
|
||||
if(! pperrinfo ) return E_INVALIDARG;
|
||||
if(!(pei=IErrorInfoImpl_Constructor()))return E_OUTOFMEMORY;
|
||||
|
||||
|
|
|
@ -144,7 +144,7 @@ SEGPTR IMalloc16_fnRealloc(IMalloc16* iface,SEGPTR pv,DWORD cb)
|
|||
/******************************************************************************
|
||||
* IMalloc16_GetSize [COMPOBJ.506]
|
||||
*/
|
||||
DWORD IMalloc16_fnGetSize(const IMalloc16* iface,SEGPTR pv)
|
||||
DWORD IMalloc16_fnGetSize(IMalloc16* iface,SEGPTR pv)
|
||||
{
|
||||
IMalloc16Impl *This = (IMalloc16Impl *)iface;
|
||||
TRACE("(%p)->GetSize(%08lx)\n",This,pv);
|
||||
|
@ -154,7 +154,7 @@ DWORD IMalloc16_fnGetSize(const IMalloc16* iface,SEGPTR pv)
|
|||
/******************************************************************************
|
||||
* IMalloc16_DidAlloc [COMPOBJ.507]
|
||||
*/
|
||||
INT16 IMalloc16_fnDidAlloc(const IMalloc16* iface,LPVOID pv) {
|
||||
INT16 IMalloc16_fnDidAlloc(IMalloc16* iface,LPVOID pv) {
|
||||
IMalloc16 *This = (IMalloc16 *)iface;
|
||||
TRACE("(%p)->DidAlloc(%p)\n",This,pv);
|
||||
return (INT16)-1;
|
||||
|
@ -173,7 +173,7 @@ LPVOID IMalloc16_fnHeapMinimize(IMalloc16* iface) {
|
|||
* IMalloc16_Constructor [VTABLE]
|
||||
*/
|
||||
LPMALLOC16
|
||||
IMalloc16_Constructor()
|
||||
IMalloc16_Constructor(void)
|
||||
{
|
||||
static IMalloc16Vtbl vt16;
|
||||
static SEGPTR msegvt16;
|
||||
|
|
|
@ -79,6 +79,8 @@ typedef struct tagTrackerWindowInfo
|
|||
HWND curTargetHWND; /* window the mouse is hovering over */
|
||||
HWND curDragTargetHWND; /* might be a ancestor of curTargetHWND */
|
||||
IDropTarget* curDragTarget;
|
||||
POINTL curMousePos; /* current position of the mouse in screen coordinates */
|
||||
DWORD dwKeyState; /* current state of the shift and ctrl keys and the mouse buttons */
|
||||
} TrackerWindowInfo;
|
||||
|
||||
typedef struct tagOleMenuDescriptor /* OleMenuDescriptor */
|
||||
|
@ -158,13 +160,9 @@ static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
|
|||
WPARAM wParam,
|
||||
LPARAM lParam);
|
||||
static void OLEDD_TrackMouseMove(
|
||||
TrackerWindowInfo* trackerInfo,
|
||||
POINT mousePos,
|
||||
DWORD keyState);
|
||||
TrackerWindowInfo* trackerInfo);
|
||||
static void OLEDD_TrackStateChange(
|
||||
TrackerWindowInfo* trackerInfo,
|
||||
POINT mousePos,
|
||||
DWORD keyState);
|
||||
TrackerWindowInfo* trackerInfo);
|
||||
static DWORD OLEDD_GetButtonState(void);
|
||||
|
||||
|
||||
|
@ -533,6 +531,10 @@ HRESULT WINAPI DoDragDrop (
|
|||
*/
|
||||
while (!trackerInfo.trackingDone && GetMessageA(&msg, 0, 0, 0) )
|
||||
{
|
||||
trackerInfo.curMousePos.x = msg.pt.x;
|
||||
trackerInfo.curMousePos.y = msg.pt.y;
|
||||
trackerInfo.dwKeyState = OLEDD_GetButtonState();
|
||||
|
||||
if ( (msg.message >= WM_KEYFIRST) &&
|
||||
(msg.message <= WM_KEYLAST) )
|
||||
{
|
||||
|
@ -551,9 +553,7 @@ HRESULT WINAPI DoDragDrop (
|
|||
/*
|
||||
* Notify the drop source.
|
||||
*/
|
||||
OLEDD_TrackStateChange(&trackerInfo,
|
||||
msg.pt,
|
||||
OLEDD_GetButtonState());
|
||||
OLEDD_TrackStateChange(&trackerInfo);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2033,6 +2033,9 @@ static DropTargetNode* OLEDD_FindDropTarget(HWND hwndOfTarget)
|
|||
* to receive the user input and act upon it. This procedure is in charge
|
||||
* of this behavior.
|
||||
*/
|
||||
|
||||
#define DRAG_TIMER_ID 1
|
||||
|
||||
static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
|
||||
HWND hwnd,
|
||||
UINT uMsg,
|
||||
|
@ -2046,27 +2049,14 @@ static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
|
|||
LPCREATESTRUCTA createStruct = (LPCREATESTRUCTA)lParam;
|
||||
|
||||
SetWindowLongA(hwnd, 0, (LONG)createStruct->lpCreateParams);
|
||||
|
||||
SetTimer(hwnd, DRAG_TIMER_ID, 50, NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
case WM_TIMER:
|
||||
case WM_MOUSEMOVE:
|
||||
{
|
||||
TrackerWindowInfo* trackerInfo = (TrackerWindowInfo*)GetWindowLongA(hwnd, 0);
|
||||
POINT mousePos;
|
||||
|
||||
/*
|
||||
* Get the current mouse position in screen coordinates.
|
||||
*/
|
||||
mousePos.x = LOWORD(lParam);
|
||||
mousePos.y = HIWORD(lParam);
|
||||
ClientToScreen(hwnd, &mousePos);
|
||||
|
||||
/*
|
||||
* Track the movement of the mouse.
|
||||
*/
|
||||
OLEDD_TrackMouseMove(trackerInfo, mousePos, wParam);
|
||||
|
||||
OLEDD_TrackMouseMove((TrackerWindowInfo*)GetWindowLongA(hwnd, 0));
|
||||
break;
|
||||
}
|
||||
case WM_LBUTTONUP:
|
||||
|
@ -2076,22 +2066,12 @@ static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
|
|||
case WM_MBUTTONDOWN:
|
||||
case WM_RBUTTONDOWN:
|
||||
{
|
||||
TrackerWindowInfo* trackerInfo = (TrackerWindowInfo*)GetWindowLongA(hwnd, 0);
|
||||
POINT mousePos;
|
||||
|
||||
/*
|
||||
* Get the current mouse position in screen coordinates.
|
||||
*/
|
||||
mousePos.x = LOWORD(lParam);
|
||||
mousePos.y = HIWORD(lParam);
|
||||
ClientToScreen(hwnd, &mousePos);
|
||||
|
||||
/*
|
||||
* Notify everyone that the button state changed
|
||||
* TODO: Check if the "escape" key was pressed.
|
||||
*/
|
||||
OLEDD_TrackStateChange(trackerInfo, mousePos, wParam);
|
||||
|
||||
OLEDD_TrackStateChange((TrackerWindowInfo*)GetWindowLongA(hwnd, 0));
|
||||
break;
|
||||
}
|
||||
case WM_DESTROY:
|
||||
{
|
||||
KillTimer(hwnd, DRAG_TIMER_ID);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -2114,23 +2094,19 @@ static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
|
|||
* trackerInfo - Pointer to the structure identifying the
|
||||
* drag & drop operation that is currently
|
||||
* active.
|
||||
* mousePos - Current position of the mouse in screen
|
||||
* coordinates.
|
||||
* keyState - Contains the state of the shift keys and the
|
||||
* mouse buttons (MK_LBUTTON and the like)
|
||||
*/
|
||||
static void OLEDD_TrackMouseMove(
|
||||
TrackerWindowInfo* trackerInfo,
|
||||
POINT mousePos,
|
||||
DWORD keyState)
|
||||
static void OLEDD_TrackMouseMove(TrackerWindowInfo* trackerInfo)
|
||||
{
|
||||
HWND hwndNewTarget = 0;
|
||||
HRESULT hr = S_OK;
|
||||
POINT pt;
|
||||
|
||||
/*
|
||||
* Get the handle of the window under the mouse
|
||||
*/
|
||||
hwndNewTarget = WindowFromPoint(mousePos);
|
||||
pt.x = trackerInfo->curMousePos.x;
|
||||
pt.y = trackerInfo->curMousePos.y;
|
||||
hwndNewTarget = WindowFromPoint(pt);
|
||||
|
||||
/*
|
||||
* Every time, we re-initialize the effects passed to the
|
||||
|
@ -2145,19 +2121,9 @@ static void OLEDD_TrackMouseMove(
|
|||
if ( (trackerInfo->curDragTarget != 0) &&
|
||||
(trackerInfo->curTargetHWND == hwndNewTarget) )
|
||||
{
|
||||
POINTL mousePosParam;
|
||||
|
||||
/*
|
||||
* The documentation tells me that the coordinate should be in the target
|
||||
* window's coordinate space. However, the tests I made tell me the
|
||||
* coordinates should be in screen coordinates.
|
||||
*/
|
||||
mousePosParam.x = mousePos.x;
|
||||
mousePosParam.y = mousePos.y;
|
||||
|
||||
IDropTarget_DragOver(trackerInfo->curDragTarget,
|
||||
keyState,
|
||||
mousePosParam,
|
||||
trackerInfo->dwKeyState,
|
||||
trackerInfo->curMousePos,
|
||||
trackerInfo->pdwEffect);
|
||||
}
|
||||
else
|
||||
|
@ -2197,20 +2163,10 @@ static void OLEDD_TrackMouseMove(
|
|||
*/
|
||||
if (trackerInfo->curDragTarget!=0)
|
||||
{
|
||||
POINTL mousePosParam;
|
||||
|
||||
/*
|
||||
* The documentation tells me that the coordinate should be in the target
|
||||
* window's coordinate space. However, the tests I made tell me the
|
||||
* coordinates should be in screen coordinates.
|
||||
*/
|
||||
mousePosParam.x = mousePos.x;
|
||||
mousePosParam.y = mousePos.y;
|
||||
|
||||
IDropTarget_DragEnter(trackerInfo->curDragTarget,
|
||||
trackerInfo->dataObject,
|
||||
keyState,
|
||||
mousePosParam,
|
||||
trackerInfo->dwKeyState,
|
||||
trackerInfo->curMousePos,
|
||||
trackerInfo->pdwEffect);
|
||||
}
|
||||
}
|
||||
|
@ -2276,15 +2232,8 @@ static void OLEDD_TrackMouseMove(
|
|||
* trackerInfo - Pointer to the structure identifying the
|
||||
* drag & drop operation that is currently
|
||||
* active.
|
||||
* mousePos - Current position of the mouse in screen
|
||||
* coordinates.
|
||||
* keyState - Contains the state of the shift keys and the
|
||||
* mouse buttons (MK_LBUTTON and the like)
|
||||
*/
|
||||
static void OLEDD_TrackStateChange(
|
||||
TrackerWindowInfo* trackerInfo,
|
||||
POINT mousePos,
|
||||
DWORD keyState)
|
||||
static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
|
||||
{
|
||||
/*
|
||||
* Ask the drop source what to do with the operation.
|
||||
|
@ -2292,7 +2241,7 @@ static void OLEDD_TrackStateChange(
|
|||
trackerInfo->returnValue = IDropSource_QueryContinueDrag(
|
||||
trackerInfo->dropSource,
|
||||
trackerInfo->escPressed,
|
||||
keyState);
|
||||
trackerInfo->dwKeyState);
|
||||
|
||||
/*
|
||||
* All the return valued will stop the operation except the S_OK
|
||||
|
@ -2325,20 +2274,10 @@ static void OLEDD_TrackStateChange(
|
|||
*/
|
||||
case DRAGDROP_S_DROP:
|
||||
{
|
||||
POINTL mousePosParam;
|
||||
|
||||
/*
|
||||
* The documentation tells me that the coordinate should be
|
||||
* in the target window's coordinate space. However, the tests
|
||||
* I made tell me the coordinates should be in screen coordinates.
|
||||
*/
|
||||
mousePosParam.x = mousePos.x;
|
||||
mousePosParam.y = mousePos.y;
|
||||
|
||||
IDropTarget_Drop(trackerInfo->curDragTarget,
|
||||
trackerInfo->dataObject,
|
||||
keyState,
|
||||
mousePosParam,
|
||||
trackerInfo->dwKeyState,
|
||||
trackerInfo->curMousePos,
|
||||
trackerInfo->pdwEffect);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -112,8 +112,7 @@ struct dispatch_params
|
|||
|
||||
static WINE_EXCEPTION_FILTER(ole_filter)
|
||||
{
|
||||
if (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ||
|
||||
GetExceptionCode() == EXCEPTION_PRIV_INSTRUCTION)
|
||||
if (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
return EXCEPTION_EXECUTE_HANDLER;
|
||||
}
|
||||
|
|
|
@ -273,7 +273,7 @@ static HRESULT WINAPI StgStreamImpl_Read(
|
|||
*/
|
||||
if (This->smallBlockChain!=0)
|
||||
{
|
||||
SmallBlockChainStream_ReadAt(This->smallBlockChain,
|
||||
res = SmallBlockChainStream_ReadAt(This->smallBlockChain,
|
||||
This->currentPosition,
|
||||
bytesToReadFromBuffer,
|
||||
pv,
|
||||
|
@ -282,7 +282,7 @@ static HRESULT WINAPI StgStreamImpl_Read(
|
|||
}
|
||||
else if (This->bigBlockChain!=0)
|
||||
{
|
||||
BlockChainStream_ReadAt(This->bigBlockChain,
|
||||
res = BlockChainStream_ReadAt(This->bigBlockChain,
|
||||
This->currentPosition,
|
||||
bytesToReadFromBuffer,
|
||||
pv,
|
||||
|
@ -300,6 +300,8 @@ static HRESULT WINAPI StgStreamImpl_Read(
|
|||
goto end;
|
||||
}
|
||||
|
||||
if (SUCCEEDED(res))
|
||||
{
|
||||
/*
|
||||
* We should always be able to read the proper amount of data from the
|
||||
* chain.
|
||||
|
@ -310,20 +312,7 @@ static HRESULT WINAPI StgStreamImpl_Read(
|
|||
* Advance the pointer for the number of positions read.
|
||||
*/
|
||||
This->currentPosition.u.LowPart += *pcbRead;
|
||||
|
||||
if(*pcbRead != cb)
|
||||
{
|
||||
WARN("read %ld instead of the required %ld bytes !\n", *pcbRead, cb);
|
||||
/*
|
||||
* this used to return S_FALSE, however MSDN docu says that an app should
|
||||
* be prepared to handle error in case of stream end reached, as *some*
|
||||
* implementations *might* return an error (IOW: most do *not*).
|
||||
* As some program fails on returning S_FALSE, I better use S_OK here.
|
||||
*/
|
||||
res = S_OK;
|
||||
}
|
||||
else
|
||||
res = S_OK;
|
||||
|
||||
end:
|
||||
TRACE("<-- %08lx\n", res);
|
||||
|
|
|
@ -3414,7 +3414,8 @@ BlockChainStream* Storage32Impl_SmallBlocksToBigBlocks(
|
|||
ULARGE_INTEGER size, offset;
|
||||
ULONG cbRead, cbWritten, cbTotalRead, cbTotalWritten;
|
||||
ULONG propertyIndex;
|
||||
BOOL successRead, successWrite;
|
||||
BOOL successWrite;
|
||||
HRESULT successRead;
|
||||
StgProperty chainProperty;
|
||||
BYTE *buffer;
|
||||
BlockChainStream *bbTempChain = NULL;
|
||||
|
@ -3463,7 +3464,7 @@ BlockChainStream* Storage32Impl_SmallBlocksToBigBlocks(
|
|||
|
||||
offset.u.LowPart += This->smallBlockSize;
|
||||
|
||||
} while (successRead && successWrite);
|
||||
} while (SUCCEEDED(successRead) && successWrite);
|
||||
HeapFree(GetProcessHeap(),0,buffer);
|
||||
|
||||
assert(cbTotalRead == cbTotalWritten);
|
||||
|
@ -4397,6 +4398,9 @@ BOOL BlockChainStream_ReadAt(BlockChainStream* This,
|
|||
blockNoInSequence--;
|
||||
}
|
||||
|
||||
if ((blockNoInSequence > 0) && (blockIndex == BLOCK_END_OF_CHAIN))
|
||||
return FALSE; /* We failed to find the starting block */
|
||||
|
||||
This->lastBlockNoInSequenceIndex = blockIndex;
|
||||
|
||||
/*
|
||||
|
@ -5098,13 +5102,14 @@ ULONG SmallBlockChainStream_GetNextFreeBlock(
|
|||
* bytesRead may be NULL.
|
||||
* Failure will be returned if the specified number of bytes has not been read.
|
||||
*/
|
||||
BOOL SmallBlockChainStream_ReadAt(
|
||||
HRESULT SmallBlockChainStream_ReadAt(
|
||||
SmallBlockChainStream* This,
|
||||
ULARGE_INTEGER offset,
|
||||
ULONG size,
|
||||
void* buffer,
|
||||
ULONG* bytesRead)
|
||||
{
|
||||
HRESULT rc = S_OK;
|
||||
ULARGE_INTEGER offsetInBigBlockFile;
|
||||
ULONG blockNoInSequence =
|
||||
offset.u.LowPart / This->parentStorage->smallBlockSize;
|
||||
|
@ -5127,9 +5132,9 @@ BOOL SmallBlockChainStream_ReadAt(
|
|||
|
||||
while ( (blockNoInSequence > 0) && (blockIndex != BLOCK_END_OF_CHAIN))
|
||||
{
|
||||
if(FAILED(SmallBlockChainStream_GetNextBlockInChain(This, blockIndex,
|
||||
&blockIndex)))
|
||||
return FALSE;
|
||||
rc = SmallBlockChainStream_GetNextBlockInChain(This, blockIndex, &blockIndex);
|
||||
if(FAILED(rc))
|
||||
return rc;
|
||||
blockNoInSequence--;
|
||||
}
|
||||
|
||||
|
@ -5158,27 +5163,32 @@ BOOL SmallBlockChainStream_ReadAt(
|
|||
|
||||
/*
|
||||
* Read those bytes in the buffer from the small block file.
|
||||
* The small block has already been identified so it shouldn't fail
|
||||
* unless the file is corrupt.
|
||||
*/
|
||||
BlockChainStream_ReadAt(This->parentStorage->smallBlockRootChain,
|
||||
if (!BlockChainStream_ReadAt(This->parentStorage->smallBlockRootChain,
|
||||
offsetInBigBlockFile,
|
||||
bytesToReadInBuffer,
|
||||
bufferWalker,
|
||||
&bytesReadFromBigBlockFile);
|
||||
&bytesReadFromBigBlockFile))
|
||||
return STG_E_DOCFILECORRUPT;
|
||||
|
||||
assert(bytesReadFromBigBlockFile == bytesToReadInBuffer);
|
||||
|
||||
/*
|
||||
* Step to the next big block.
|
||||
*/
|
||||
if(FAILED(SmallBlockChainStream_GetNextBlockInChain(This, blockIndex, &blockIndex)))
|
||||
return FALSE;
|
||||
rc = SmallBlockChainStream_GetNextBlockInChain(This, blockIndex, &blockIndex);
|
||||
if(FAILED(rc))
|
||||
return rc;
|
||||
|
||||
bufferWalker += bytesToReadInBuffer;
|
||||
size -= bytesToReadInBuffer;
|
||||
*bytesRead += bytesToReadInBuffer;
|
||||
offsetInBlock = 0; /* There is no offset on the next block */
|
||||
}
|
||||
|
||||
return (size == 0);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
|
|
@ -667,7 +667,7 @@ void SmallBlockChainStream_FreeBlock(
|
|||
ULONG SmallBlockChainStream_GetNextFreeBlock(
|
||||
SmallBlockChainStream* This);
|
||||
|
||||
BOOL SmallBlockChainStream_ReadAt(
|
||||
HRESULT SmallBlockChainStream_ReadAt(
|
||||
SmallBlockChainStream* This,
|
||||
ULARGE_INTEGER offset,
|
||||
ULONG size,
|
||||
|
|
|
@ -2183,6 +2183,7 @@
|
|||
#define STG_E_SHAREREQUIRED _HRESULT_TYPEDEF_(0x80030106L)
|
||||
#define STG_E_NOTFILEBASEDSTORAGE _HRESULT_TYPEDEF_(0x80030107L)
|
||||
#define STG_E_EXTANTMARSHALLINGS _HRESULT_TYPEDEF_(0x80030108L)
|
||||
#define STG_E_DOCFILECORRUPT _HRESULT_TYPEDEF_(0x80030109L)
|
||||
|
||||
#define STG_E_STATUS_COPY_PROTECTION_FAILURE _HRESULT_TYPEDEF_(0x80030305L)
|
||||
#define STG_E_CSS_AUTHENTICATION_FAILURE _HRESULT_TYPEDEF_(0x80030306L)
|
||||
|
|
Loading…
Reference in a new issue