/************************************************************************** * mmioClose [WINMM.@] */ MMRESULT WINAPI mmioClose(HMMIO hmmio, UINT uFlags) { LPWINE_MMIO wm; MMRESULT result; TRACE("(%p, %04X);\n", hmmio, uFlags); if ((wm = MMIO_Get(hmmio)) == NULL) return MMSYSERR_INVALHANDLE; if ((result = MMIO_Flush(wm, 0)) != MMSYSERR_NOERROR) return result; result = send_message(wm->ioProc, &wm->info, MMIOM_CLOSE, uFlags, 0, FALSE); MMIO_SetBuffer(wm, NULL, 0, 0); wm->ioProc->count--; if (wm->bTmpIOProc) MMIO_InstallIOProc(wm->info.fccIOProc, wm->ioProc->pIOProc, MMIO_REMOVEPROC, wm->ioProc->is_unicode); MMIO_Destroy(wm); return result; }
/************************************************************************** * mmioInstallIOProcW [WINMM.@] */ LPMMIOPROC WINAPI mmioInstallIOProcW(FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags) { return MMIO_InstallIOProc(fccIOProc, pIOProc, dwFlags, TRUE); }
/************************************************************************** * MMIO_Open [internal] */ static HMMIO MMIO_Open(LPSTR szFileName, MMIOINFO* refmminfo, DWORD dwOpenFlags, BOOL is_unicode) { LPWINE_MMIO wm; MMIOINFO mmioinfo; TRACE("('%s', %p, %08X, %s);\n", szFileName, refmminfo, dwOpenFlags, is_unicode ? "unicode" : "ansi"); if (!refmminfo) { refmminfo = &mmioinfo; mmioinfo.fccIOProc = 0; mmioinfo.pIOProc = NULL; mmioinfo.pchBuffer = NULL; mmioinfo.cchBuffer = 0; is_unicode = FALSE; } if (dwOpenFlags & (MMIO_PARSE|MMIO_EXIST)) { char buffer[MAX_PATH]; if (!szFileName) return (HMMIO)FALSE; if (GetFullPathNameA(szFileName, sizeof(buffer), buffer, NULL) >= sizeof(buffer)) return (HMMIO)FALSE; if ((dwOpenFlags & MMIO_EXIST) && (GetFileAttributesA(buffer) == INVALID_FILE_ATTRIBUTES)) return (HMMIO)FALSE; strcpy(szFileName, buffer); return (HMMIO)TRUE; } if ((wm = MMIO_Create()) == NULL) return 0; /* If both params are NULL, then parse the file name if available */ if (refmminfo->fccIOProc == 0 && refmminfo->pIOProc == NULL) { wm->info.fccIOProc = MMIO_ParseExtA(szFileName); /* Handle any unhandled/error case. Assume DOS file */ if (wm->info.fccIOProc == 0) wm->info.fccIOProc = FOURCC_DOS; if (!(wm->ioProc = MMIO_FindProcNode(wm->info.fccIOProc))) { /* If not found, retry with FOURCC_DOS */ wm->info.fccIOProc = FOURCC_DOS; if (!(wm->ioProc = MMIO_FindProcNode(wm->info.fccIOProc))) goto error2; } wm->bTmpIOProc = FALSE; } /* if just the four character code is present, look up IO proc */ else if (refmminfo->pIOProc == NULL) { wm->info.fccIOProc = refmminfo->fccIOProc; if (!(wm->ioProc = MMIO_FindProcNode(wm->info.fccIOProc))) goto error2; wm->bTmpIOProc = FALSE; } /* if IO proc specified, use it and specified four character code */ else { wm->info.fccIOProc = refmminfo->fccIOProc; MMIO_InstallIOProc(wm->info.fccIOProc, refmminfo->pIOProc, MMIO_INSTALLPROC, is_unicode); if (!(wm->ioProc = MMIO_FindProcNode(wm->info.fccIOProc))) goto error2; assert(wm->ioProc->pIOProc == refmminfo->pIOProc); wm->bTmpIOProc = TRUE; } wm->ioProc->count++; wm->info.dwFlags = dwOpenFlags; if (dwOpenFlags & MMIO_ALLOCBUF) { refmminfo->wErrorRet = MMIO_SetBuffer(wm, refmminfo->pchBuffer, refmminfo->cchBuffer ? refmminfo->cchBuffer : MMIO_DEFAULTBUFFER, 0); if (refmminfo->wErrorRet != MMSYSERR_NOERROR) goto error1; } else { refmminfo->wErrorRet = MMIO_SetBuffer(wm, refmminfo->pchBuffer, refmminfo->cchBuffer, 0); if (refmminfo->wErrorRet != MMSYSERR_NOERROR) goto error1; } if (wm->info.fccIOProc == FOURCC_MEM && !(wm->info.dwFlags & MMIO_ALLOCBUF)) wm->bBufferLoaded = TRUE; /* see mmioDosIOProc for that one */ wm->info.adwInfo[0] = refmminfo->adwInfo[0]; /* call IO proc to actually open file */ refmminfo->wErrorRet = send_message(wm->ioProc, &wm->info, MMIOM_OPEN, (LPARAM)szFileName, 0, FALSE); /* grab file size, when possible (FIXME: not 64 bit safe) */ wm->dwFileSize = GetFileSize((HANDLE)(ULONG_PTR)wm->info.adwInfo[0], NULL); if (refmminfo->wErrorRet == 0) return wm->info.hmmio; error1: if (wm->ioProc) wm->ioProc->count--; error2: MMIO_Destroy(wm); return 0; }
/************************************************************************** * mmioInstallIOProcA [WINMM.@] */ LPMMIOPROC WINAPI mmioInstallIOProcA(FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags) { return MMIO_InstallIOProc(fccIOProc, pIOProc, dwFlags, MMIO_PROC_32A); }