Fixed bug when file doesn't exist in MCI_OPEN handling.

Reduced time spent with crit sect locked.
This commit is contained in:
Eric Pouech 2000-04-29 14:19:02 +00:00 committed by Alexandre Julliard
parent ec4f57bec1
commit d34abdd158
1 changed files with 23 additions and 8 deletions

View File

@ -428,6 +428,10 @@ static DWORD MCI_LoadMciDriver(LPWINE_MM_IDATA iData, LPCSTR _strDevTyp,
goto errCleanUp; goto errCleanUp;
} }
wmd->lpfnYieldProc = MCI_DefYieldProc;
wmd->dwYieldData = VK_CANCEL;
wmd->hCreatorTask = GetCurrentTask();
EnterCriticalSection(&iData->cs); EnterCriticalSection(&iData->cs);
/* wmd must be inserted in list before sending opening the driver, coz' it /* wmd must be inserted in list before sending opening the driver, coz' it
* may want to lookup at wDevID * may want to lookup at wDevID
@ -440,9 +444,6 @@ static DWORD MCI_LoadMciDriver(LPWINE_MM_IDATA iData, LPCSTR _strDevTyp,
modp.wDeviceID++); modp.wDeviceID++);
wmd->wDeviceID = modp.wDeviceID; wmd->wDeviceID = modp.wDeviceID;
wmd->lpfnYieldProc = MCI_DefYieldProc;
wmd->dwYieldData = VK_CANCEL;
wmd->hCreatorTask = GetCurrentTask();
LeaveCriticalSection(&iData->cs); LeaveCriticalSection(&iData->cs);
@ -800,6 +801,7 @@ DWORD WINAPI mciSendStringA(LPCSTR lpstrCommand, LPSTR lpstrRet,
DWORD data[MCI_DATA_SIZE]; DWORD data[MCI_DATA_SIZE];
LPCSTR lpCmd = 0; LPCSTR lpCmd = 0;
LPWINE_MM_IDATA iData = MULTIMEDIA_GetIData(); LPWINE_MM_IDATA iData = MULTIMEDIA_GetIData();
BOOL bAutoOpen = FALSE;
TRACE("('%s', %p, %d, %X)\n", lpstrCommand, lpstrRet, uRetLen, hwndCallback); TRACE("('%s', %p, %d, %X)\n", lpstrCommand, lpstrRet, uRetLen, hwndCallback);
@ -860,11 +862,17 @@ DWORD WINAPI mciSendStringA(LPCSTR lpstrCommand, LPSTR lpstrRet,
MCI_UnLoadMciDriver(iData, wmd); MCI_UnLoadMciDriver(iData, wmd);
goto errCleanUp; goto errCleanUp;
} }
} else { } else if (!(wmd = MCI_GetDriver(mciGetDeviceIDA(dev)))) {
/* auto open */
char buf[128];
sprintf(buf, "open %s wait", dev);
if ((dwRet = mciSendStringA(buf, NULL, 0, 0)) != 0)
goto errCleanUp;
wmd = MCI_GetDriver(mciGetDeviceIDA(dev)); wmd = MCI_GetDriver(mciGetDeviceIDA(dev));
if (!wmd) { if (!wmd) {
FIXME("Oooch: couldn't find driver for '%s' in '%s'; automatic open is NIY\n", /* FIXME: memory leak, MCI driver is not closed */
dev, lpstrCommand);
dwRet = MCIERR_INVALID_DEVICE_ID; dwRet = MCIERR_INVALID_DEVICE_ID;
goto errCleanUp; goto errCleanUp;
} }
@ -909,6 +917,13 @@ DWORD WINAPI mciSendStringA(LPCSTR lpstrCommand, LPSTR lpstrRet,
if ((dwRet = MCI_ParseOptArgs(data, offset, lpCmd, args, &dwFlags))) if ((dwRet = MCI_ParseOptArgs(data, offset, lpCmd, args, &dwFlags)))
goto errCleanUp; goto errCleanUp;
if (bAutoOpen && (dwFlags & MCI_NOTIFY)) {
dwRet = MCIERR_NOTIFY_ON_AUTO_OPEN;
goto errCleanUp;
}
/* FIXME: the command should get it's own notification window set up and
* ask for device closing while processing the notification mechanism
*/
if (lpstrRet && uRetLen) *lpstrRet = '\0'; if (lpstrRet && uRetLen) *lpstrRet = '\0';
#define STR_OF(_x) (IsBadReadPtr((char*)_x,1)?"?":(char*)(_x)) #define STR_OF(_x) (IsBadReadPtr((char*)_x,1)?"?":(char*)(_x))
@ -2012,7 +2027,7 @@ static DWORD MCI_Open(DWORD dwParam, LPMCI_OPEN_PARMSA lpParms)
{ {
char strDevTyp[128]; char strDevTyp[128];
DWORD dwRet; DWORD dwRet;
LPWINE_MCIDRIVER wmd; LPWINE_MCIDRIVER wmd = NULL;
LPWINE_MM_IDATA iData = MULTIMEDIA_GetIData(); LPWINE_MM_IDATA iData = MULTIMEDIA_GetIData();
TRACE("(%08lX, %p)\n", dwParam, lpParms); TRACE("(%08lX, %p)\n", dwParam, lpParms);
@ -2127,7 +2142,7 @@ static DWORD MCI_Open(DWORD dwParam, LPMCI_OPEN_PARMSA lpParms)
return 0; return 0;
errCleanUp: errCleanUp:
MCI_UnLoadMciDriver(iData, wmd); if (wmd) MCI_UnLoadMciDriver(iData, wmd);
if (dwParam & MCI_NOTIFY) if (dwParam & MCI_NOTIFY)
mciDriverNotify16(lpParms->dwCallback, 0, MCI_NOTIFY_FAILURE); mciDriverNotify16(lpParms->dwCallback, 0, MCI_NOTIFY_FAILURE);