Sync to Wine-0_9_4:
Michael Jung <mjung(a)iss.tu-darmstadt.de>
- ole32: Periodically call IDropTarger::DragOver during Drag&Drop.
Robert Shearman <rob(a)codeweavers.com>
- CreateErrorInfo trace fix.
CreateErrorInfo isn't a stub so don't print this in the trace
message.
Alexandre Julliard <julliard(a)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(a)codeweavers.com>
- ole32: Return error instead of asserting if storage file is corrupt.
Eric Pouech <eric.pouech(a)wanadoo.fr>
- Functions with no paramters must be (void).
- Const correctness fixes.
Modified: trunk/reactos/lib/ole32/errorinfo.c
Modified: trunk/reactos/lib/ole32/ole16.c
Modified: trunk/reactos/lib/ole32/ole2.c
Modified: trunk/reactos/lib/ole32/rpc.c
Modified: trunk/reactos/lib/ole32/stg_stream.c
Modified: trunk/reactos/lib/ole32/storage32.c
Modified: trunk/reactos/lib/ole32/storage32.h
Modified: trunk/reactos/w32api/include/winerror.h
_____
Modified: trunk/reactos/lib/ole32/errorinfo.c
--- trunk/reactos/lib/ole32/errorinfo.c 2005-12-26 23:10:21 UTC (rev
20349)
+++ trunk/reactos/lib/ole32/errorinfo.c 2005-12-26 23:16:41 UTC (rev
20350)
@@ -476,7 +476,7 @@
{
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;
_____
Modified: trunk/reactos/lib/ole32/ole16.c
--- trunk/reactos/lib/ole32/ole16.c 2005-12-26 23:10:21 UTC (rev
20349)
+++ trunk/reactos/lib/ole32/ole16.c 2005-12-26 23:16:41 UTC (rev
20350)
@@ -144,7 +144,7 @@
/***********************************************************************
*******
* 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 @@
/***********************************************************************
*******
* 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 @@
* IMalloc16_Constructor [VTABLE]
*/
LPMALLOC16
-IMalloc16_Constructor()
+IMalloc16_Constructor(void)
{
static IMalloc16Vtbl vt16;
static SEGPTR msegvt16;
_____
Modified: trunk/reactos/lib/ole32/ole2.c
--- trunk/reactos/lib/ole32/ole2.c 2005-12-26 23:10:21 UTC (rev
20349)
+++ trunk/reactos/lib/ole32/ole2.c 2005-12-26 23:16:41 UTC (rev
20350)
@@ -79,6 +79,8 @@
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 @@
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 @@
*/
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 @@
/*
* Notify the drop source.
*/
- OLEDD_TrackStateChange(&trackerInfo,
- msg.pt,
- OLEDD_GetButtonState());
+ OLEDD_TrackStateChange(&trackerInfo);
}
else
{
@@ -2033,6 +2033,9 @@
* 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 @@
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,24 +2066,14 @@
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 @@
* 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 @@
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 @@
*/
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 @@
* 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 @@
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 @@
*/
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;
}
_____
Modified: trunk/reactos/lib/ole32/rpc.c
--- trunk/reactos/lib/ole32/rpc.c 2005-12-26 23:10:21 UTC (rev
20349)
+++ trunk/reactos/lib/ole32/rpc.c 2005-12-26 23:16:41 UTC (rev
20350)
@@ -112,8 +112,7 @@
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;
}
_____
Modified: trunk/reactos/lib/ole32/stg_stream.c
--- trunk/reactos/lib/ole32/stg_stream.c 2005-12-26 23:10:21 UTC
(rev 20349)
+++ trunk/reactos/lib/ole32/stg_stream.c 2005-12-26 23:16:41 UTC
(rev 20350)
@@ -273,7 +273,7 @@
*/
if (This->smallBlockChain!=0)
{
- SmallBlockChainStream_ReadAt(This->smallBlockChain,
+ res = SmallBlockChainStream_ReadAt(This->smallBlockChain,
This->currentPosition,
bytesToReadFromBuffer,
pv,
@@ -282,7 +282,7 @@
}
else if (This->bigBlockChain!=0)
{
- BlockChainStream_ReadAt(This->bigBlockChain,
+ res = BlockChainStream_ReadAt(This->bigBlockChain,
This->currentPosition,
bytesToReadFromBuffer,
pv,
@@ -300,30 +300,19 @@
goto end;
}
- /*
- * We should always be able to read the proper amount of data from
the
- * chain.
- */
- assert(bytesToReadFromBuffer == *pcbRead);
-
- /*
- * Advance the pointer for the number of positions read.
- */
- This->currentPosition.u.LowPart += *pcbRead;
-
- if(*pcbRead != cb)
+ if (SUCCEEDED(res))
{
- 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;
+ /*
+ * We should always be able to read the proper amount of data
from the
+ * chain.
+ */
+ assert(bytesToReadFromBuffer == *pcbRead);
+
+ /*
+ * Advance the pointer for the number of positions read.
+ */
+ This->currentPosition.u.LowPart += *pcbRead;
}
- else
- res = S_OK;
end:
TRACE("<-- %08lx\n", res);
_____
Modified: trunk/reactos/lib/ole32/storage32.c
--- trunk/reactos/lib/ole32/storage32.c 2005-12-26 23:10:21 UTC (rev
20349)
+++ trunk/reactos/lib/ole32/storage32.c 2005-12-26 23:16:41 UTC (rev
20350)
@@ -3414,7 +3414,8 @@
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 @@
offset.u.LowPart += This->smallBlockSize;
- } while (successRead && successWrite);
+ } while (SUCCEEDED(successRead) && successWrite);
HeapFree(GetProcessHeap(),0,buffer);
assert(cbTotalRead == cbTotalWritten);
@@ -4397,6 +4398,9 @@
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 @@
* 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 @@
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 @@
/*
* 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;
}
/***********************************************************************
*******
_____
Modified: trunk/reactos/lib/ole32/storage32.h
--- trunk/reactos/lib/ole32/storage32.h 2005-12-26 23:10:21 UTC (rev
20349)
+++ trunk/reactos/lib/ole32/storage32.h 2005-12-26 23:16:41 UTC (rev
20350)
@@ -667,7 +667,7 @@
ULONG SmallBlockChainStream_GetNextFreeBlock(
SmallBlockChainStream* This);
-BOOL SmallBlockChainStream_ReadAt(
+HRESULT SmallBlockChainStream_ReadAt(
SmallBlockChainStream* This,
ULARGE_INTEGER offset,
ULONG size,
_____
Modified: trunk/reactos/w32api/include/winerror.h
--- trunk/reactos/w32api/include/winerror.h 2005-12-26 23:10:21 UTC
(rev 20349)
+++ trunk/reactos/w32api/include/winerror.h 2005-12-26 23:16:41 UTC
(rev 20350)
@@ -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)