- Fix MMIO_{Open,Rename} to check the filename (of the form
file.ext+ABC) for the correct mmio procedure to use. - mmioStringToFOURCC now converts to uppercase if asked to, and handles strings of length < 4.
This commit is contained in:
parent
0958a20725
commit
8ee45ac7d7
|
@ -7,6 +7,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
@ -247,6 +248,53 @@ static LRESULT mmioMemIOProc(LPMMIOINFO16 lpmmioinfo, UINT16 uMessage, LPARAM lP
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* MMIO_ParseExt [internal]
|
||||||
|
*
|
||||||
|
* Parses a filename for the extension.
|
||||||
|
*
|
||||||
|
* RETURNS
|
||||||
|
* The FOURCC code for the extension if found, else 0.
|
||||||
|
*/
|
||||||
|
static FOURCC MMIO_ParseExt(LPCSTR szFileName)
|
||||||
|
{
|
||||||
|
/* Filenames are of the form file.ext+ABC
|
||||||
|
FIXME: What if a '+' is part of the file name?
|
||||||
|
For now, we take the last '+' present */
|
||||||
|
|
||||||
|
FOURCC ret = 0;
|
||||||
|
|
||||||
|
/* Note that ext{Start,End} point to the . and + respectively */
|
||||||
|
LPSTR extEnd;
|
||||||
|
|
||||||
|
TRACE("(%s)\n",debugstr_a(szFileName));
|
||||||
|
|
||||||
|
extEnd = strrchr(szFileName,'+');
|
||||||
|
if (extEnd) {
|
||||||
|
/* Need to parse to find the extension */
|
||||||
|
LPSTR extStart;
|
||||||
|
|
||||||
|
extStart = extEnd;
|
||||||
|
while (extStart > szFileName && extStart[0] != '.') {
|
||||||
|
extStart--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extStart == szFileName) {
|
||||||
|
ERR("+ but no . in szFileName: %s\n", debugstr_a(szFileName));
|
||||||
|
} else {
|
||||||
|
CHAR ext[5];
|
||||||
|
|
||||||
|
if (extEnd - extStart - 1 > 4)
|
||||||
|
WARN("Extension length > 4\n");
|
||||||
|
lstrcpynA(ext,extStart + 1,MIN(extEnd-extStart,5));
|
||||||
|
TRACE("Got extension: %s\n", debugstr_a(ext));
|
||||||
|
/* FOURCC codes identifying file-extentions must be uppercase */
|
||||||
|
ret = mmioStringToFOURCCA(ext,MMIO_TOUPPER);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* MMIO_Open [internal]
|
* MMIO_Open [internal]
|
||||||
*/
|
*/
|
||||||
|
@ -272,11 +320,18 @@ static HMMIO16 MMIO_Open(LPSTR szFileName, MMIOINFO* refmminfo, DWORD dwOpenFlag
|
||||||
return 0;
|
return 0;
|
||||||
memset(lpmminfo, 0, sizeof(MMIOINFO16));
|
memset(lpmminfo, 0, sizeof(MMIOINFO16));
|
||||||
|
|
||||||
/* assume DOS file if not otherwise specified */
|
/* If both params are NULL, then parse the file name */
|
||||||
if (refmminfo->fccIOProc == 0 && refmminfo->pIOProc == NULL) {
|
if (refmminfo->fccIOProc == 0 && refmminfo->pIOProc == NULL) {
|
||||||
|
lpmminfo->fccIOProc = MMIO_ParseExt(szFileName);
|
||||||
|
/* Handle any unhandled/error case. Assume DOS file */
|
||||||
|
if (lpmminfo->fccIOProc == 0) {
|
||||||
lpmminfo->fccIOProc = FOURCC_DOS;
|
lpmminfo->fccIOProc = FOURCC_DOS;
|
||||||
lpmminfo->pIOProc = (LPMMIOPROC16) mmioDosIOProc;
|
lpmminfo->pIOProc = (LPMMIOPROC16) mmioDosIOProc;
|
||||||
|
} else {
|
||||||
|
lpmminfo->pIOProc = mmioInstallIOProc16(lpmminfo->fccIOProc, NULL, MMIO_FINDPROC);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* if just the four character code is present, look up IO proc */
|
/* if just the four character code is present, look up IO proc */
|
||||||
else if (refmminfo->pIOProc == NULL) {
|
else if (refmminfo->pIOProc == NULL) {
|
||||||
|
|
||||||
|
@ -863,7 +918,26 @@ FOURCC WINAPI mmioStringToFOURCCW(LPCWSTR sz, UINT uFlags)
|
||||||
*/
|
*/
|
||||||
FOURCC WINAPI mmioStringToFOURCC16(LPCSTR sz, UINT16 uFlags)
|
FOURCC WINAPI mmioStringToFOURCC16(LPCSTR sz, UINT16 uFlags)
|
||||||
{
|
{
|
||||||
return mmioFOURCC(sz[0],sz[1],sz[2],sz[3]);
|
CHAR cc[4];
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
while (i < 4 && sz[i]) {
|
||||||
|
if (uFlags & MMIO_TOUPPER) {
|
||||||
|
cc[i] = toupper(sz[i]);
|
||||||
|
} else {
|
||||||
|
cc[i] = sz[i];
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Pad with spaces */
|
||||||
|
while (i < 4) {
|
||||||
|
cc[i] = ' ';
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE("Got %c%c%c%c\n",cc[0],cc[1],cc[2],cc[3]);
|
||||||
|
return mmioFOURCC(cc[0],cc[1],cc[2],cc[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
@ -1064,11 +1138,11 @@ UINT16 WINAPI mmioDescend(HMMIO16 hmmio, LPMMCKINFO lpck,
|
||||||
srchType = lpck->fccType;
|
srchType = lpck->fccType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (uFlags & (MMIO_FINDCHUNK|MMIO_FINDLIST|MMIO_FINDRIFF)) {
|
||||||
TRACE("searching for %.4s.%.4s\n",
|
TRACE("searching for %.4s.%.4s\n",
|
||||||
(LPSTR)&srchCkId,
|
(LPSTR)&srchCkId,
|
||||||
srchType?(LPSTR)&srchType:"<any>");
|
srchType?(LPSTR)&srchType:"any ");
|
||||||
|
|
||||||
if (uFlags & (MMIO_FINDCHUNK|MMIO_FINDLIST|MMIO_FINDRIFF)) {
|
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
LONG ix;
|
LONG ix;
|
||||||
|
|
||||||
|
@ -1084,9 +1158,9 @@ UINT16 WINAPI mmioDescend(HMMIO16 hmmio, LPMMCKINFO lpck,
|
||||||
WARN("return ChunkNotFound\n");
|
WARN("return ChunkNotFound\n");
|
||||||
return MMIOERR_CHUNKNOTFOUND;
|
return MMIOERR_CHUNKNOTFOUND;
|
||||||
}
|
}
|
||||||
TRACE("ckid=%.4ss fcc=%.4ss cksize=%08lX !\n",
|
TRACE("ckid=%.4s fcc=%.4s cksize=%08lX !\n",
|
||||||
(LPSTR)&lpck->ckid,
|
(LPSTR)&lpck->ckid,
|
||||||
srchType?(LPSTR)&lpck->fccType:"<unused>",
|
srchType?(LPSTR)&lpck->fccType:"<na>",
|
||||||
lpck->cksize);
|
lpck->cksize);
|
||||||
if ((srchCkId == lpck->ckid) &&
|
if ((srchCkId == lpck->ckid) &&
|
||||||
(!srchType || (srchType == lpck->fccType))
|
(!srchType || (srchType == lpck->fccType))
|
||||||
|
@ -1098,6 +1172,7 @@ UINT16 WINAPI mmioDescend(HMMIO16 hmmio, LPMMCKINFO lpck,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* FIXME: unverified, does it do this? */
|
/* FIXME: unverified, does it do this? */
|
||||||
|
/* NB: This part is used by WAVE_mciOpen, among others */
|
||||||
if (mmioRead(hmmio, (LPSTR)lpck, 3 * sizeof(DWORD)) < 3 * sizeof(DWORD)) {
|
if (mmioRead(hmmio, (LPSTR)lpck, 3 * sizeof(DWORD)) < 3 * sizeof(DWORD)) {
|
||||||
mmioSeek(hmmio, dwOldPos, SEEK_SET);
|
mmioSeek(hmmio, dwOldPos, SEEK_SET);
|
||||||
WARN("return ChunkNotFound 2nd\n");
|
WARN("return ChunkNotFound 2nd\n");
|
||||||
|
@ -1225,7 +1300,11 @@ UINT16 WINAPI mmioRename16(LPCSTR szFileName, LPCSTR szNewFileName,
|
||||||
if (lpmmioinfo)
|
if (lpmmioinfo)
|
||||||
memcpy(lpmminfo, lpmmioinfo, sizeof(MMIOINFO16));
|
memcpy(lpmminfo, lpmmioinfo, sizeof(MMIOINFO16));
|
||||||
|
|
||||||
/* assume DOS file if not otherwise specified */
|
/* If both params are NULL, then parse the file name */
|
||||||
|
if (lpmminfo->fccIOProc == 0 && lpmminfo->pIOProc == NULL) {
|
||||||
|
lpmminfo->fccIOProc = MMIO_ParseExt(szFileName);
|
||||||
|
}
|
||||||
|
/* Handle any unhandled/error case from above. Assume DOS file */
|
||||||
if (lpmminfo->fccIOProc == 0 && lpmminfo->pIOProc == NULL) {
|
if (lpmminfo->fccIOProc == 0 && lpmminfo->pIOProc == NULL) {
|
||||||
|
|
||||||
lpmminfo->fccIOProc = mmioFOURCC('D', 'O', 'S', ' ');
|
lpmminfo->fccIOProc = mmioFOURCC('D', 'O', 'S', ' ');
|
||||||
|
|
Loading…
Reference in New Issue