Jörg Höhle : winmm: Auto-open MCI core commands only.

Alexandre Julliard julliard at winehq.org
Thu Sep 16 14:09:05 CDT 2010


Module: wine
Branch: master
Commit: b4cc03f3e3110934ac2810d65589e353c584be35
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b4cc03f3e3110934ac2810d65589e353c584be35

Author: Jörg Höhle <hoehle at users.sourceforge.net>
Date:   Tue Sep 14 20:45:16 2010 +0200

winmm: Auto-open MCI core commands only.

---

 dlls/winmm/mci.c       |   52 +++++++++++++++++++++++++++--------------------
 dlls/winmm/tests/mci.c |    6 ++--
 2 files changed, 33 insertions(+), 25 deletions(-)

diff --git a/dlls/winmm/mci.c b/dlls/winmm/mci.c
index 485f436..400d343 100644
--- a/dlls/winmm/mci.c
+++ b/dlls/winmm/mci.c
@@ -1242,9 +1242,6 @@ DWORD WINAPI mciSendStringW(LPCWSTR lpstrCommand, LPWSTR lpstrRet,
     static const WCHAR  wszNew[] = {'n','e','w',0};
     static const WCHAR  wszSAliasS[] = {' ','a','l','i','a','s',' ',0};
     static const WCHAR  wszTypeS[]   = {'t','y','p','e',' ',0};
-    static const WCHAR  wszSysinfo[] = {'s','y','s','i','n','f','o',0};
-    static const WCHAR  wszSound[]   = {'s','o','u','n','d',0};
-    static const WCHAR  wszBreak[]   = {'b','r','e','a','k',0};
 
     TRACE("(%s, %p, %d, %p)\n", 
           debugstr_w(lpstrCommand), lpstrRet, uRetLen, hwndCallback);
@@ -1337,26 +1334,37 @@ DWORD WINAPI mciSendStringW(LPCWSTR lpstrCommand, LPWSTR lpstrRet,
 	HeapFree(GetProcessHeap(), 0, devType);
 	if (dwRet)
 	    goto errCleanUp;
-    } else if (!strcmpW(verb, wszSysinfo) || !strcmpW(verb, wszSound) || !strcmpW(verb, wszBreak)) {
-	/* Prevent auto-open for system commands. */
-    } else if ((MCI_ALL_DEVICE_ID != uDevID) && !(wmd = MCI_GetDriver(mciGetDeviceIDW(dev)))) {
-	/* auto open */
-        static const WCHAR wszOpenWait[] = {'o','p','e','n',' ','%','s',' ','w','a','i','t',0};
-	WCHAR   buf[138], retbuf[6];
-	snprintfW(buf, sizeof(buf)/sizeof(WCHAR), wszOpenWait, dev);
-	/* open via mciSendString handles quoting, dev!file syntax and alias creation */
-	if ((dwRet = mciSendStringW(buf, retbuf, sizeof(retbuf)/sizeof(WCHAR), 0)) != 0)
-	    goto errCleanUp;
-	auto_open = strtoulW(retbuf, NULL, 10);
-	TRACE("auto-opened %u\n", auto_open);
-
-	/* FIXME: test for notify flag (how to preparse?) before opening */
-	/* FIXME: Accept only core commands yet parse them with the specific table */
-	wmd = MCI_GetDriver(auto_open);
-	if (!wmd) {
-	    ERR("No auto-open device %d for %s\n", auto_open, debugstr_w(dev));
-	    dwRet = MCIERR_INVALID_DEVICE_ID;
+    } else if ((MCI_ALL_DEVICE_ID != uDevID) && !(wmd = MCI_GetDriver(mciGetDeviceIDW(dev)))
+	       && (lpCmd = MCI_FindCommand(MCI_GetCommandTable(0), verb))) {
+	/* auto-open uses the core command table */
+	switch (MCI_GetMessage(lpCmd)) {
+	case MCI_SOUND:   /* command does not use a device name */
+	case MCI_SYSINFO:
+	    break;
+	case MCI_CLOSE:   /* don't auto-open for close */
+	case MCI_BREAK:   /* no auto-open for system commands */
+	    dwRet = MCIERR_INVALID_DEVICE_NAME;
 	    goto errCleanUp;
+	    break;
+	default:
+	    {
+		static const WCHAR wszOpenWait[] = {'o','p','e','n',' ','%','s',' ','w','a','i','t',0};
+		WCHAR   buf[138], retbuf[6];
+		snprintfW(buf, sizeof(buf)/sizeof(WCHAR), wszOpenWait, dev);
+		/* open via mciSendString handles quoting, dev!file syntax and alias creation */
+		if ((dwRet = mciSendStringW(buf, retbuf, sizeof(retbuf)/sizeof(WCHAR), 0)) != 0)
+		    goto errCleanUp;
+		auto_open = strtoulW(retbuf, NULL, 10);
+		TRACE("auto-opened %u for %s\n", auto_open, debugstr_w(dev));
+
+		/* FIXME: test for notify flag (how to preparse?) before opening */
+		wmd = MCI_GetDriver(auto_open);
+		if (!wmd) {
+		    ERR("No auto-open device %u\n", auto_open);
+		    dwRet = MCIERR_INVALID_DEVICE_ID;
+		    goto errCleanUp;
+		}
+	    }
 	}
     }
 
diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c
index 1803c0c..ce91458 100644
--- a/dlls/winmm/tests/mci.c
+++ b/dlls/winmm/tests/mci.c
@@ -458,7 +458,7 @@ static void test_openCloseWAVE(HWND hwnd)
     Sleep(5);
     test_notification(hwnd, command_close_my, 0);
 
-    err = mciSendString("open no-such-file-exists.wav alias y", buf, sizeof(buf), NULL);
+    err = mciSendString("open no-such-file-exists.wav alias y buffer 6", buf, sizeof(buf), NULL);
     ok(err==MCIERR_FILE_NOT_FOUND,"open no-such-file.wav returned %s\n", dbg_mcierr(err));
     if(!err) {
         err = mciSendString("close y", NULL, 0, NULL);
@@ -485,7 +485,7 @@ static void test_openCloseWAVE(HWND hwnd)
     /* FIXME? use broken(INVALID_DEVICE_NAME) and have Wine not mimic Win9X? */
 
     err = mciSendString("close waveaudio", buf, sizeof(buf), NULL);
-    todo_wine ok(err==MCIERR_INVALID_DEVICE_NAME,"open nosuchdevice!name: %s\n", dbg_mcierr(err));
+    ok(err==MCIERR_INVALID_DEVICE_NAME,"close waveaudio: %s\n", dbg_mcierr(err));
 
     err = mciSendString(command_close_all, NULL, 0, NULL);
     ok(!err,"mci %s (without buffer) returned %s\n", command_close_all, dbg_mcierr(err));
@@ -743,7 +743,7 @@ static void test_playWAVE(HWND hwnd)
     todo_wine ok(!strcmp(buf,"2000"), "mci status length gave %s, expected 2000, some tests will fail.\n", buf);
 
     err = mciSendString("cue output", NULL, 0, NULL);
-    todo_wine ok(err==MCIERR_UNRECOGNIZED_COMMAND,"mci incorrect cue output returned %s\n", dbg_mcierr(err));
+    ok(err==MCIERR_UNRECOGNIZED_COMMAND,"mci incorrect cue output returned %s\n", dbg_mcierr(err));
 
     /* Test MCI to the bones -- Some todo_wine from Cue and
      * from Play from 0 to 0 are not worth fixing. */




More information about the wine-cvs mailing list