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. 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)