[PATCH] dmusic: Simplify IPersistStream_Load by checking DLS header first and exit if it is wrong.

Christian Costa titan.costa at gmail.com
Mon May 21 02:39:54 CDT 2012


---
 dlls/dmusic/collection.c |  608 +++++++++++++++++++++++-----------------------
 1 files changed, 302 insertions(+), 306 deletions(-)

diff --git a/dlls/dmusic/collection.c b/dlls/dmusic/collection.c
index 474557d..c06d988 100644
--- a/dlls/dmusic/collection.c
+++ b/dlls/dmusic/collection.c
@@ -485,314 +485,310 @@ static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_IsDirty(LPPERSIS
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_Load (LPPERSISTSTREAM iface, IStream* pStm)
+static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_Load(LPPERSISTSTREAM iface, IStream* stream)
 {
-	IDirectMusicCollectionImpl *This = impl_from_IPersistStream(iface);
-	DMUS_PRIVATE_CHUNK Chunk;
-	DWORD StreamSize, StreamCount, ListSize[3], ListCount[3];
-	LARGE_INTEGER liMove; /* used when skipping chunks */
-	ULARGE_INTEGER dlibCollectionPosition, dlibInstrumentPosition, dlibWavePoolPosition;
-	
-	IStream_AddRef (pStm); /* add count for later references */
-	liMove.QuadPart = 0;
-	IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, &dlibCollectionPosition); /* store offset, in case it'll be needed later */
-	This->liCollectionPosition.QuadPart = dlibCollectionPosition.QuadPart;
-	This->pStm = pStm;
-	
-	IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL);
-	TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize);
-	switch (Chunk.fccID) {	
-		case FOURCC_RIFF: {
-			IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL);				
-			TRACE_(dmfile)(": RIFF chunk of type %s", debugstr_fourcc(Chunk.fccID));
-			StreamSize = Chunk.dwSize - sizeof(FOURCC);
-			StreamCount = 0;
-			switch (Chunk.fccID) {
-				case FOURCC_DLS: {
-					TRACE_(dmfile)(": collection form\n");
-					do {
-						IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL);
-						StreamCount += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize;
-						TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize);
-						switch (Chunk.fccID) {
-							case FOURCC_COLH: {
-								TRACE_(dmfile)(": collection header chunk\n");
-								This->pHeader = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, Chunk.dwSize);
-								IStream_Read (pStm, This->pHeader, Chunk.dwSize, NULL);
-								break;								
-							}
-							case FOURCC_DLID: {
-								TRACE_(dmfile)(": DLID (GUID) chunk\n");
-								This->pDesc->dwValidData |= DMUS_OBJ_OBJECT;
-								IStream_Read (pStm, &This->pDesc->guidObject, Chunk.dwSize, NULL);
-								break;
-							}
-							case FOURCC_VERS: {
-								TRACE_(dmfile)(": version chunk\n");
-								This->pDesc->dwValidData |= DMUS_OBJ_VERSION;
-								IStream_Read (pStm, &This->pDesc->vVersion, Chunk.dwSize, NULL);
-								break;
-							}
-							case FOURCC_PTBL: {
-								TRACE_(dmfile)(": pool table chunk\n");
-								This->pPoolTable = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(POOLTABLE));
-								IStream_Read (pStm, This->pPoolTable, sizeof(POOLTABLE), NULL);
-								Chunk.dwSize -= sizeof(POOLTABLE);
-								This->pPoolCues = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, This->pPoolTable->cCues*sizeof(POOLCUE));
-								IStream_Read (pStm, This->pPoolCues, Chunk.dwSize, NULL);
-								break;
-							}
-							case FOURCC_LIST: {
-								IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL);				
-								TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(Chunk.fccID));
-								ListSize[0] = Chunk.dwSize - sizeof(FOURCC);
-								ListCount[0] = 0;
-								switch (Chunk.fccID) {
-									case mmioFOURCC('I','N','F','O'): {
-										TRACE_(dmfile)(": INFO list\n");
-										do {
-											IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL);
-											ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize;
-											TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize);
-											switch (Chunk.fccID) {
-												case mmioFOURCC('I','N','A','M'): {
-													CHAR szName[DMUS_MAX_NAME];
-													TRACE_(dmfile)(": name chunk\n");
-													This->pDesc->dwValidData |= DMUS_OBJ_NAME;
-													IStream_Read (pStm, szName, Chunk.dwSize, NULL);
-													MultiByteToWideChar (CP_ACP, 0, szName, -1, This->pDesc->wszName, DMUS_MAX_NAME);
-													if (even_or_odd(Chunk.dwSize)) {
-														ListCount[0] ++;
-														liMove.QuadPart = 1;
-														IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
-													}
-													break;
-												}
-												case mmioFOURCC('I','A','R','T'): {
-													TRACE_(dmfile)(": artist chunk (ignored)\n");
-													if (even_or_odd(Chunk.dwSize)) {
-														ListCount[0] ++;
-														Chunk.dwSize++;
-													}
-													liMove.QuadPart = Chunk.dwSize;
-													IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
-													break;
-												}
-												case mmioFOURCC('I','C','O','P'): {
-													TRACE_(dmfile)(": copyright chunk\n");
-													This->szCopyright = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, Chunk.dwSize);
-													IStream_Read (pStm, This->szCopyright, Chunk.dwSize, NULL);
-													if (even_or_odd(Chunk.dwSize)) {
-														ListCount[0] ++;
-														liMove.QuadPart = 1;
-														IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
-													}
-													break;
-												}
-												case mmioFOURCC('I','S','B','J'): {
-													TRACE_(dmfile)(": subject chunk (ignored)\n");
-													if (even_or_odd(Chunk.dwSize)) {
-														ListCount[0] ++;
-														Chunk.dwSize++;
-													}
-													liMove.QuadPart = Chunk.dwSize;
-													IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
-													break;
-												}
-												case mmioFOURCC('I','C','M','T'): {
-													TRACE_(dmfile)(": comment chunk (ignored)\n");
-													if (even_or_odd(Chunk.dwSize)) {
-														ListCount[0] ++;
-														Chunk.dwSize++;
-													}
-													liMove.QuadPart = Chunk.dwSize;
-													IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
-													break;
-												}
-												default: {
-													TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n");
-													if (even_or_odd(Chunk.dwSize)) {
-														ListCount[0] ++;
-														Chunk.dwSize++;
-													}
-													liMove.QuadPart = Chunk.dwSize;
-													IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
-													break;						
-												}
-											}
-											TRACE_(dmfile)(": ListCount[0] = %d < ListSize[0] = %d\n", ListCount[0], ListSize[0]);
-										} while (ListCount[0] < ListSize[0]);
-										break;
-									}
-									case FOURCC_WVPL: {
-										TRACE_(dmfile)(": wave pool list (mark & skip)\n");
-										liMove.QuadPart = 0;
-										IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, &dlibWavePoolPosition); /* store position */
-										This->liWavePoolTablePosition.QuadPart = dlibWavePoolPosition.QuadPart;
-										liMove.QuadPart = Chunk.dwSize - sizeof(FOURCC);
-										IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
-										break;	
-									}
-									case FOURCC_LINS: {
-										TRACE_(dmfile)(": instruments list\n");
-										do {
-											IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL);
-											ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize;
-											TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize);
-											switch (Chunk.fccID) {
-												case FOURCC_LIST: {
-													IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL);				
-													TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(Chunk.fccID));
-													ListSize[1] = Chunk.dwSize - sizeof(FOURCC);
-													ListCount[1] = 0;													
-													switch (Chunk.fccID) {
-														case FOURCC_INS: {
-															LPDMUS_PRIVATE_INSTRUMENTENTRY pNewInstrument = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(DMUS_PRIVATE_INSTRUMENTENTRY));
-															TRACE_(dmfile)(": instrument list\n");
-															DMUSIC_CreateDirectMusicInstrumentImpl (&IID_IDirectMusicInstrument, (LPVOID*)&pNewInstrument->pInstrument, NULL); /* only way to create this one... even M$ does it discretely */
-                                                                                                                        {
-                                                                                                                            IDirectMusicInstrumentImpl *pInstrument = impl_from_IDirectMusicInstrument(pNewInstrument->pInstrument);
-                                                                                                                            liMove.QuadPart = 0;
-                                                                                                                            IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, &dlibInstrumentPosition);
-                                                                                                                            pInstrument->liInstrumentPosition.QuadPart = dlibInstrumentPosition.QuadPart - (2*sizeof(FOURCC) + sizeof(DWORD)); /* store offset, it'll be needed later */
-
-                                                                                                                            do {
-																IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL);
-																ListCount[1] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize;
-																TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize);
-																switch (Chunk.fccID) {
-																	case FOURCC_INSH: {
-																		TRACE_(dmfile)(": instrument header chunk\n");
-																		pInstrument->pHeader = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, Chunk.dwSize);
-																		IStream_Read (pStm, pInstrument->pHeader, Chunk.dwSize, NULL);
-																		break;	
-																	}
-																	case FOURCC_DLID: {
-																		TRACE_(dmfile)(": DLID (GUID) chunk\n");
-																		pInstrument->pInstrumentID = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, Chunk.dwSize);
-																		IStream_Read (pStm, pInstrument->pInstrumentID, Chunk.dwSize, NULL);
-																		break;
-																	}
-																	case FOURCC_LIST: {
-																		IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL);				
-																		TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(Chunk.fccID));
-																		ListSize[2] = Chunk.dwSize - sizeof(FOURCC);
-																		ListCount[2] = 0;
-																		switch (Chunk.fccID) {
-																			default: {
-																				TRACE_(dmfile)(": unknown (skipping)\n");
-																				liMove.QuadPart = Chunk.dwSize - sizeof(FOURCC);
-																				IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
-																				break;						
-																			}
-																		}
-																		break;
-																	}				
-																	default: {
-																		TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n");
-																		liMove.QuadPart = Chunk.dwSize;
-																		IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
-																		break;						
-																	}
-																}
-																TRACE_(dmfile)(": ListCount[1] = %d < ListSize[1] = %d\n", ListCount[1], ListSize[1]);
-                                                                                                                            } while (ListCount[1] < ListSize[1]);
-                                                                                                                            /* DEBUG: dumps whole instrument object tree: */
-                                                                                                                            if (TRACE_ON(dmusic)) {
-																TRACE("*** IDirectMusicInstrument (%p) ***\n", pInstrument);
-																if (pInstrument->pInstrumentID)
-																	TRACE(" - GUID = %s\n", debugstr_dmguid(pInstrument->pInstrumentID));
-																
-																TRACE(" - Instrument header:\n");
-																TRACE("    - cRegions: %d\n", pInstrument->pHeader->cRegions);
-																TRACE("    - Locale:\n");
-																TRACE("       - ulBank: %d\n", pInstrument->pHeader->Locale.ulBank);
-																TRACE("       - ulInstrument: %d\n", pInstrument->pHeader->Locale.ulInstrument);
-																TRACE("       => dwPatch: %d\n", MIDILOCALE2Patch(&pInstrument->pHeader->Locale));
-                                                                                                                            }
-                                                                                                                            list_add_tail (&This->Instruments, &pNewInstrument->entry);
-                                                                                                                        }
-															break;
-														}
-													}
-													break;
-												}
-												default: {
-													TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n");
-													liMove.QuadPart = Chunk.dwSize;
-													IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
-													break;						
-												}
-											}
-											TRACE_(dmfile)(": ListCount[0] = %d < ListSize[0] = %d\n", ListCount[0], ListSize[0]);
-										} while (ListCount[0] < ListSize[0]);
-										break;
-									}
-									default: {
-										TRACE_(dmfile)(": unknown (skipping)\n");
-										liMove.QuadPart = Chunk.dwSize - sizeof(FOURCC);
-										IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
-										break;						
-									}
-								}
-								break;
-							}	
-							default: {
-								TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n");
-								liMove.QuadPart = Chunk.dwSize;
-								IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
-								break;						
-							}
-						}
-						TRACE_(dmfile)(": StreamCount = %d < StreamSize = %d\n", StreamCount, StreamSize);
-					} while (StreamCount < StreamSize);
-					break;
-				}
-				default: {
-					TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
-					liMove.QuadPart = StreamSize;
-					IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
-					return E_FAIL;
-				}
-			}
-			TRACE_(dmfile)(": reading finished\n");
-			break;
-		}
-		default: {
-			TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
-			liMove.QuadPart = Chunk.dwSize;
-			IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
-			return E_FAIL;
-		}
-	}
+    IDirectMusicCollectionImpl *This = impl_from_IPersistStream(iface);
+    DMUS_PRIVATE_CHUNK chunk;
+    DWORD StreamSize, StreamCount, ListSize[3], ListCount[3];
+    LARGE_INTEGER liMove; /* used when skipping chunks */
+    ULARGE_INTEGER dlibCollectionPosition, dlibInstrumentPosition, dlibWavePoolPosition;
 
-	/* DEBUG: dumps whole collection object tree: */
-	if (TRACE_ON(dmusic)) {
-		int r = 0;
-		DMUS_PRIVATE_INSTRUMENTENTRY *tmpEntry;
-		struct list *listEntry;
-
-		TRACE("*** IDirectMusicCollection (%p) ***\n", &This->IDirectMusicCollection_iface);
-		if (This->pDesc->dwValidData & DMUS_OBJ_OBJECT)
-			TRACE(" - GUID = %s\n", debugstr_dmguid(&This->pDesc->guidObject));
-		if (This->pDesc->dwValidData & DMUS_OBJ_VERSION)
-			TRACE(" - Version = %i,%i,%i,%i\n", (This->pDesc->vVersion.dwVersionMS >> 8) & 0x0000FFFF, This->pDesc->vVersion.dwVersionMS & 0x0000FFFF,
-				(This->pDesc->vVersion.dwVersionLS >> 8) & 0x0000FFFF, This->pDesc->vVersion.dwVersionLS & 0x0000FFFF);
-		if (This->pDesc->dwValidData & DMUS_OBJ_NAME)
-			TRACE(" - Name = %s\n", debugstr_w(This->pDesc->wszName));
-		
-		TRACE(" - Collection header:\n");
-		TRACE("    - cInstruments: %d\n", This->pHeader->cInstruments);
-		TRACE(" - Instruments:\n");
-		
-		LIST_FOR_EACH (listEntry, &This->Instruments) {
-			tmpEntry = LIST_ENTRY( listEntry, DMUS_PRIVATE_INSTRUMENTENTRY, entry );
-			TRACE("    - Instrument[%i]: %p\n", r, tmpEntry->pInstrument);
-			r++;
-		}
-	}
-	
-	return S_OK;
+    IStream_AddRef(stream); /* add count for later references */
+    liMove.QuadPart = 0;
+    IStream_Seek(stream, liMove, STREAM_SEEK_CUR, &dlibCollectionPosition); /* store offset, in case it'll be needed later */
+    This->liCollectionPosition.QuadPart = dlibCollectionPosition.QuadPart;
+    This->pStm = stream;
+
+    IStream_Read(stream, &chunk, sizeof(FOURCC) + sizeof(DWORD), NULL);
+    TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc(chunk.fccID), chunk.dwSize);
+
+    if (chunk.fccID != FOURCC_RIFF) {
+        TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
+        liMove.QuadPart = chunk.dwSize;
+        IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
+        return E_FAIL;
+    }
+
+    IStream_Read(stream, &chunk.fccID, sizeof(FOURCC), NULL);
+    TRACE_(dmfile)(": RIFF chunk of type %s", debugstr_fourcc(chunk.fccID));
+    StreamSize = chunk.dwSize - sizeof(FOURCC);
+    StreamCount = 0;
+
+    if (chunk.fccID != FOURCC_DLS) {
+        TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
+        liMove.QuadPart = StreamSize;
+        IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
+        return E_FAIL;
+    }
+
+    TRACE_(dmfile)(": collection form\n");
+    do {
+        IStream_Read(stream, &chunk, sizeof(FOURCC) + sizeof(DWORD), NULL);
+        StreamCount += sizeof(FOURCC) + sizeof(DWORD) + chunk.dwSize;
+        TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc(chunk.fccID), chunk.dwSize);
+        switch (chunk.fccID) {
+            case FOURCC_COLH: {
+                TRACE_(dmfile)(": collection header chunk\n");
+                This->pHeader = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, chunk.dwSize);
+                IStream_Read(stream, This->pHeader, chunk.dwSize, NULL);
+                break;
+            }
+            case FOURCC_DLID: {
+                TRACE_(dmfile)(": DLID (GUID) chunk\n");
+                This->pDesc->dwValidData |= DMUS_OBJ_OBJECT;
+                IStream_Read(stream, &This->pDesc->guidObject, chunk.dwSize, NULL);
+                break;
+            }
+            case FOURCC_VERS: {
+                TRACE_(dmfile)(": version chunk\n");
+                This->pDesc->dwValidData |= DMUS_OBJ_VERSION;
+                IStream_Read(stream, &This->pDesc->vVersion, chunk.dwSize, NULL);
+                break;
+            }
+            case FOURCC_PTBL: {
+                TRACE_(dmfile)(": pool table chunk\n");
+                This->pPoolTable = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(POOLTABLE));
+                IStream_Read(stream, This->pPoolTable, sizeof(POOLTABLE), NULL);
+                chunk.dwSize -= sizeof(POOLTABLE);
+                This->pPoolCues = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->pPoolTable->cCues * sizeof(POOLCUE));
+                IStream_Read(stream, This->pPoolCues, chunk.dwSize, NULL);
+                break;
+            }
+            case FOURCC_LIST: {
+                IStream_Read(stream, &chunk.fccID, sizeof(FOURCC), NULL);
+                TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunk.fccID));
+                ListSize[0] = chunk.dwSize - sizeof(FOURCC);
+                ListCount[0] = 0;
+                switch (chunk.fccID) {
+                    case mmioFOURCC('I','N','F','O'): {
+                        TRACE_(dmfile)(": INFO list\n");
+                        do {
+                            IStream_Read(stream, &chunk, sizeof(FOURCC) + sizeof(DWORD), NULL);
+                            ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + chunk.dwSize;
+                            TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc(chunk.fccID), chunk.dwSize);
+                            switch (chunk.fccID) {
+                                case mmioFOURCC('I','N','A','M'): {
+                                    CHAR szName[DMUS_MAX_NAME];
+                                    TRACE_(dmfile)(": name chunk\n");
+                                    This->pDesc->dwValidData |= DMUS_OBJ_NAME;
+                                    IStream_Read(stream, szName, chunk.dwSize, NULL);
+                                    MultiByteToWideChar(CP_ACP, 0, szName, -1, This->pDesc->wszName, DMUS_MAX_NAME);
+                                    if (even_or_odd(chunk.dwSize)) {
+                                        ListCount[0]++;
+                                        liMove.QuadPart = 1;
+                                        IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL);
+                                    }
+                                    break;
+                                }
+                                case mmioFOURCC('I','A','R','T'): {
+                                    TRACE_(dmfile)(": artist chunk (ignored)\n");
+                                    if (even_or_odd(chunk.dwSize)) {
+                                        ListCount[0]++;
+                                        chunk.dwSize++;
+                                    }
+                                    liMove.QuadPart = chunk.dwSize;
+                                    IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL);
+                                    break;
+                                }
+                                case mmioFOURCC('I','C','O','P'): {
+                                    TRACE_(dmfile)(": copyright chunk\n");
+                                    This->szCopyright = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, chunk.dwSize);
+                                    IStream_Read(stream, This->szCopyright, chunk.dwSize, NULL);
+                                    if (even_or_odd(chunk.dwSize)) {
+                                        ListCount[0]++;
+                                        liMove.QuadPart = 1;
+                                        IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL);
+                                    }
+                                    break;
+                                }
+                                case mmioFOURCC('I','S','B','J'): {
+                                    TRACE_(dmfile)(": subject chunk (ignored)\n");
+                                    if (even_or_odd(chunk.dwSize)) {
+                                        ListCount[0]++;
+                                        chunk.dwSize++;
+                                    }
+                                    liMove.QuadPart = chunk.dwSize;
+                                    IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL);
+                                    break;
+                                }
+                                case mmioFOURCC('I','C','M','T'): {
+                                    TRACE_(dmfile)(": comment chunk (ignored)\n");
+                                    if (even_or_odd(chunk.dwSize)) {
+                                        ListCount[0]++;
+                                        chunk.dwSize++;
+                                    }
+                                    liMove.QuadPart = chunk.dwSize;
+                                    IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL);
+                                    break;
+                                }
+                                default: {
+                                    TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n");
+                                    if (even_or_odd(chunk.dwSize)) {
+                                        ListCount[0]++;
+                                        chunk.dwSize++;
+                                    }
+                                    liMove.QuadPart = chunk.dwSize;
+                                    IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL);
+                                    break;
+                                }
+                            }
+                            TRACE_(dmfile)(": ListCount[0] = %d < ListSize[0] = %d\n", ListCount[0], ListSize[0]);
+                        } while (ListCount[0] < ListSize[0]);
+                        break;
+                    }
+                    case FOURCC_WVPL: {
+                        TRACE_(dmfile)(": wave pool list (mark & skip)\n");
+                        liMove.QuadPart = 0;
+                        IStream_Seek(stream, liMove, STREAM_SEEK_CUR, &dlibWavePoolPosition); /* store position */
+                        This->liWavePoolTablePosition.QuadPart = dlibWavePoolPosition.QuadPart;
+                        liMove.QuadPart = chunk.dwSize - sizeof(FOURCC);
+                        IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL);
+                        break;
+                    }
+                    case FOURCC_LINS: {
+                        TRACE_(dmfile)(": instruments list\n");
+                        do {
+                            IStream_Read(stream, &chunk, sizeof(FOURCC) + sizeof(DWORD), NULL);
+                            ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + chunk.dwSize;
+                            TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc(chunk.fccID), chunk.dwSize);
+                            switch (chunk.fccID) {
+                                case FOURCC_LIST: {
+                                    IStream_Read(stream, &chunk.fccID, sizeof(FOURCC), NULL);
+                                    TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunk.fccID));
+                                    ListSize[1] = chunk.dwSize - sizeof(FOURCC);
+                                    ListCount[1] = 0;
+                                    switch (chunk.fccID) {
+                                        case FOURCC_INS: {
+                                            LPDMUS_PRIVATE_INSTRUMENTENTRY new_instrument = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DMUS_PRIVATE_INSTRUMENTENTRY));
+                                            TRACE_(dmfile)(": instrument list\n");
+                                            /* Only way to create this one... even M$ does it discretely */
+                                            DMUSIC_CreateDirectMusicInstrumentImpl(&IID_IDirectMusicInstrument, (LPVOID*)&new_instrument->pInstrument, NULL);
+                                            {
+                                                IDirectMusicInstrumentImpl *instrument = impl_from_IDirectMusicInstrument(new_instrument->pInstrument);
+                                                liMove.QuadPart = 0;
+                                                IStream_Seek(stream, liMove, STREAM_SEEK_CUR, &dlibInstrumentPosition);
+                                                /* Store offset, it'll be needed later */
+                                                instrument->liInstrumentPosition.QuadPart = dlibInstrumentPosition.QuadPart - (2 * sizeof(FOURCC) + sizeof(DWORD));
+                                                do {
+                                                    IStream_Read(stream, &chunk, sizeof(FOURCC) + sizeof(DWORD), NULL);
+                                                    ListCount[1] += sizeof(FOURCC) + sizeof(DWORD) + chunk.dwSize;
+                                                    TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc(chunk.fccID), chunk.dwSize);
+                                                    switch (chunk.fccID) {
+                                                        case FOURCC_INSH: {
+                                                            TRACE_(dmfile)(": instrument header chunk\n");
+                                                            instrument->pHeader = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, chunk.dwSize);
+                                                            IStream_Read(stream, instrument->pHeader, chunk.dwSize, NULL);
+                                                            break;
+                                                        }
+                                                        case FOURCC_DLID: {
+                                                            TRACE_(dmfile)(": DLID (GUID) chunk\n");
+                                                            instrument->pInstrumentID = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, chunk.dwSize);
+                                                            IStream_Read(stream, instrument->pInstrumentID, chunk.dwSize, NULL);
+                                                            break;
+                                                        }
+                                                        case FOURCC_LIST: {
+                                                            IStream_Read(stream, &chunk.fccID, sizeof(FOURCC), NULL);
+                                                            TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunk.fccID));
+                                                            ListSize[2] = chunk.dwSize - sizeof(FOURCC);
+                                                            ListCount[2] = 0;
+                                                            switch (chunk.fccID) {
+                                                                default: {
+                                                                    TRACE_(dmfile)(": unknown (skipping)\n");
+                                                                    liMove.QuadPart = chunk.dwSize - sizeof(FOURCC);
+                                                                    IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL);
+                                                                    break;
+                                                                }
+                                                            }
+                                                            break;
+                                                        }
+                                                        default: {
+                                                            TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n");
+                                                            liMove.QuadPart = chunk.dwSize;
+                                                            IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL);
+                                                            break;
+                                                        }
+                                                    }
+                                                    TRACE_(dmfile)(": ListCount[1] = %d < ListSize[1] = %d\n", ListCount[1], ListSize[1]);
+                                                } while (ListCount[1] < ListSize[1]);
+                                                /* DEBUG: dumps whole instrument object tree: */
+                                                if (TRACE_ON(dmusic)) {
+                                                    TRACE("*** IDirectMusicInstrument (%p) ***\n", instrument);
+                                                    if (instrument->pInstrumentID)
+                                                        TRACE(" - GUID = %s\n", debugstr_dmguid(instrument->pInstrumentID));
+                                                    TRACE(" - Instrument header:\n");
+                                                    TRACE("    - cRegions: %d\n", instrument->pHeader->cRegions);
+                                                    TRACE("    - Locale:\n");
+                                                    TRACE("       - ulBank: %d\n", instrument->pHeader->Locale.ulBank);
+                                                    TRACE("       - ulInstrument: %d\n", instrument->pHeader->Locale.ulInstrument);
+                                                    TRACE("       => dwPatch: %d\n", MIDILOCALE2Patch(&instrument->pHeader->Locale));
+                                                }
+                                                list_add_tail(&This->Instruments, &new_instrument->entry);
+                                            }
+                                            break;
+                                        }
+                                    }
+                                    break;
+                                }
+                                default: {
+                                    TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n");
+                                    liMove.QuadPart = chunk.dwSize;
+                                    IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL);
+                                    break;
+                                }
+                            }
+                            TRACE_(dmfile)(": ListCount[0] = %d < ListSize[0] = %d\n", ListCount[0], ListSize[0]);
+                        } while (ListCount[0] < ListSize[0]);
+                        break;
+                    }
+                    default: {
+                        TRACE_(dmfile)(": unknown (skipping)\n");
+                        liMove.QuadPart = chunk.dwSize - sizeof(FOURCC);
+                        IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL);
+                        break;
+                    }
+                }
+                break;
+            }
+            default: {
+                TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n");
+                liMove.QuadPart = chunk.dwSize;
+                IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL);
+                break;
+            }
+        }
+        TRACE_(dmfile)(": StreamCount = %d < StreamSize = %d\n", StreamCount, StreamSize);
+    } while (StreamCount < StreamSize);
+
+    TRACE_(dmfile)(": reading finished\n");
+
+
+    /* DEBUG: dumps whole collection object tree: */
+    if (TRACE_ON(dmusic)) {
+        int r = 0;
+        DMUS_PRIVATE_INSTRUMENTENTRY *tmpEntry;
+        struct list *listEntry;
+
+        TRACE("*** IDirectMusicCollection (%p) ***\n", &This->IDirectMusicCollection_iface);
+        if (This->pDesc->dwValidData & DMUS_OBJ_OBJECT)
+            TRACE(" - GUID = %s\n", debugstr_dmguid(&This->pDesc->guidObject));
+        if (This->pDesc->dwValidData & DMUS_OBJ_VERSION)
+            TRACE(" - Version = %i,%i,%i,%i\n", (This->pDesc->vVersion.dwVersionMS >> 8) & 0x0000FFFF, This->pDesc->vVersion.dwVersionMS & 0x0000FFFF,
+                  (This->pDesc->vVersion.dwVersionLS >> 8) & 0x0000FFFF, This->pDesc->vVersion.dwVersionLS & 0x0000FFFF);
+        if (This->pDesc->dwValidData & DMUS_OBJ_NAME)
+            TRACE(" - Name = %s\n", debugstr_w(This->pDesc->wszName));
+
+        TRACE(" - Collection header:\n");
+        TRACE("    - cInstruments: %d\n", This->pHeader->cInstruments);
+        TRACE(" - Instruments:\n");
+
+        LIST_FOR_EACH(listEntry, &This->Instruments) {
+            tmpEntry = LIST_ENTRY( listEntry, DMUS_PRIVATE_INSTRUMENTENTRY, entry );
+            TRACE("    - Instrument[%i]: %p\n", r, tmpEntry->pInstrument);
+            r++;
+        }
+    }
+
+    return S_OK;
 }
 
 static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_Save(LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty)




More information about the wine-patches mailing list