244{
247 DWORD StreamSize, StreamCount, ListSize[3], ListCount[3];
253
255
256
258 ERR(
": pStm bad read pointer\n");
260 }
261
263 TRACE(
": stream is already set, which means container is already loaded\n");
265 }
266
267
268 if (
FAILED(IStream_QueryInterface (pStm, &IID_IDirectMusicGetLoader, (
LPVOID*)&pGetLoader))) {
269 ERR(
": stream not supported\n");
271 }
274
275 This->pStream = pStm;
276 IStream_AddRef (pStm);
277
278
281 switch (Chunk.
fccID) {
286 StreamCount = 0;
287 switch (Chunk.
fccID) {
289 TRACE_(dmfile)(
": container form\n");
290 This->dmobj.desc.guidClass = CLSID_DirectMusicContainer;
292 do {
296 switch (Chunk.
fccID) {
300 break;
301 }
303 TRACE_(dmfile)(
": GUID chunk\n");
304 IStream_Read (pStm, &
This->dmobj.desc.guidObject, Chunk.
dwSize,
NULL);
306 break;
307 }
309 TRACE_(dmfile)(
": version chunk\n");
310 IStream_Read (pStm, &
This->dmobj.desc.vVersion, Chunk.
dwSize,
NULL);
312 break;
313 }
315 TRACE_(dmfile)(
": date chunk\n");
316 IStream_Read (pStm, &
This->dmobj.desc.ftDate, Chunk.
dwSize,
NULL);
318 break;
319 }
321 TRACE_(dmfile)(
": category chunk\n");
322
323
327 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
328 } else {
329 IStream_Read (pStm,
This->dmobj.desc.wszCategory, Chunk.
dwSize,
NULL);
330 }
332 break;
333 }
338 ListCount[0] = 0;
339 switch (Chunk.
fccID) {
341 TRACE_(dmfile)(
": UNFO list\n");
342 do {
346 switch (Chunk.
fccID) {
347
348
351 TRACE_(dmfile)(
": name chunk\n");
352
353
357 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
358 } else {
359 IStream_Read (pStm,
This->dmobj.desc.wszName, Chunk.
dwSize,
NULL);
360 }
362 break;
363 }
364 default: {
365 TRACE_(dmfile)(
": unknown chunk (irrelevant & skipping)\n");
367 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
368 break;
369 }
370 }
371 TRACE_(dmfile)(
": ListCount[0] = %#lx < ListSize[0] = %#lx\n", ListCount[0], ListSize[0]);
372 } while (ListCount[0] < ListSize[0]);
373 break;
374 }
376 TRACE_(dmfile)(
": contained objects list\n");
377 do {
381 switch (Chunk.
fccID) {
386 ListCount[1] = 0;
387 switch (Chunk.
fccID) {
390 TRACE_(dmfile)(
": contained object list\n");
391 pNewEntry =
calloc(1,
sizeof(*pNewEntry));
393 do {
397 switch (Chunk.
fccID) {
399 TRACE_(dmfile)(
": alias chunk\n");
403 break;
404 }
407 IStream_Read (pStm, &tmpObjectHeader, Chunk.
dwSize,
NULL);
409
412
414 break;
415 }
416
417
422 ListCount[2] = 0;
423 switch (Chunk.
fccID) {
425 TRACE_(dmfile)(
": reference list\n");
427 do {
431 switch (Chunk.
fccID) {
434 TRACE_(dmfile)(
": reference header chunk\n");
436 IStream_Read (pStm, &tmpReferenceHeader, Chunk.
dwSize,
NULL);
437
439
440
443 break;
444 }
446 TRACE_(dmfile)(
": guid chunk\n");
447
449 break;
450 }
452 TRACE_(dmfile)(
": file date chunk\n");
453
455 break;
456 }
458 TRACE_(dmfile)(
": name chunk\n");
459
461 break;
462 }
464 TRACE_(dmfile)(
": file name chunk\n");
465
467 break;
468 }
470 TRACE_(dmfile)(
": category chunk\n");
471
473 break;
474 }
476 TRACE_(dmfile)(
": version chunk\n");
477
479 break;
480 }
481 default: {
482 TRACE_(dmfile)(
": unknown chunk (skipping)\n");
484 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
485 break;
486 }
487 }
488 TRACE_(dmfile)(
": ListCount[2] = %#lx < ListSize[2] = %#lx\n", ListCount[2], ListSize[2]);
489 } while (ListCount[2] < ListSize[2]);
490 break;
491 }
492 default: {
493 TRACE_(dmfile)(
": unexpected chunk; loading failed)\n");
495 }
496 }
497 break;
498 }
499
504 TRACE_(dmfile)(
": valid DMUSIC form\n");
506
508 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, &uliPos);
510
513 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
514
517
518 } else {
519 TRACE_(dmfile)(
": invalid DMUSIC form (skipping)\n");
521 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
522
523 }
524 break;
525 }
526 default: {
527 TRACE_(dmfile)(
": unknown chunk (irrelevant & skipping)\n");
529 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
530 break;
531 }
532 }
533 TRACE_(dmfile)(
": ListCount[1] = %#lx < ListSize[1] = %#lx\n", ListCount[1], ListSize[1]);
534 } while (ListCount[1] < ListSize[1]);
535
537
538
539
542 IStream_Seek (pStm, liMove, STREAM_SEEK_SET,
NULL);
545 }
546
548 break;
549 }
550 default: {
551 TRACE_(dmfile)(
": unknown (skipping)\n");
553 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
554 break;
555 }
556 }
557 break;
558 }
559 default: {
560 TRACE_(dmfile)(
": unknown chunk (irrelevant & skipping)\n");
562 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
563 break;
564 }
565 }
566 TRACE_(dmfile)(
": ListCount[0] = %#lx < ListSize[0] = %#lx\n", ListCount[0], ListSize[0]);
567 } while (ListCount[0] < ListSize[0]);
568 break;
569 }
570 default: {
571 TRACE_(dmfile)(
": unknown (skipping)\n");
573 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
574 break;
575 }
576 }
577 break;
578 }
579 default: {
580 TRACE_(dmfile)(
": unknown chunk (irrelevant & skipping)\n");
582 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
583 break;
584 }
585 }
586 TRACE_(dmfile)(
": StreamCount[0] = %#lx < StreamSize[0] = %#lx\n", StreamCount, StreamSize);
587 } while (StreamCount < StreamSize);
588 break;
589 }
590 default: {
591 TRACE_(dmfile)(
": unexpected chunk; loading failed)\n");
593 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
595 }
596 }
597 TRACE_(dmfile)(
": reading finished\n");
600 break;
601 }
602 default: {
603 TRACE_(dmfile)(
": unexpected chunk; loading failed)\n");
605 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
607 }
608 }
609
610
611
615
616 TRACE(
": DMUS_CONTAINER_NOLOADS not set... load all objects\n");
617
621
625 } else {
626 WARN(
": failed to load contained object\n");
628 }
629 }
630 }
631
633
635}
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
#define DMUS_MAX_NAME_SIZE
static IDirectMusicContainerImpl * impl_from_IPersistStream(IPersistStream *iface)
#define DMUS_MAX_CATEGORY_SIZE
BOOL IS_VALID_DMFORM(FOURCC chunkID)
const char * debugstr_DMUS_IO_CONTAINER_HEADER(LPDMUS_IO_CONTAINER_HEADER pHeader)
const char * debugstr_DMUS_IO_CONTAINED_OBJECT_HEADER(LPDMUS_IO_CONTAINED_OBJECT_HEADER pHeader)
BOOL WINAPI IsBadReadPtr(IN LPCVOID lp, IN UINT_PTR ucb)
#define DMUS_E_UNSUPPORTED_STREAM
#define DMUS_E_ALREADY_LOADED
#define DMUS_S_PARTIALLOAD
#define DMUS_FOURCC_CONTAINED_ALIAS_CHUNK
#define DMUS_FOURCC_CONTAINED_OBJECT_LIST
#define DMUS_FOURCC_GUID_CHUNK
#define DMUS_FOURCC_CONTAINER_CHUNK
#define DMUS_FOURCC_REF_CHUNK
#define DMUS_FOURCC_UNAM_CHUNK
#define DMUS_FOURCC_VERSION_CHUNK
#define DMUS_CONTAINER_NOLOADS
#define DMUS_FOURCC_REF_LIST
#define DMUS_FOURCC_FILE_CHUNK
#define DMUS_FOURCC_NAME_CHUNK
#define DMUS_FOURCC_DATE_CHUNK
#define DMUS_FOURCC_CONTAINED_OBJECTS_LIST
#define DMUS_FOURCC_UNFO_LIST
#define DMUS_FOURCC_CONTAINED_OBJECT_CHUNK
#define DMUS_FOURCC_CATEGORY_CHUNK
#define IDirectMusicObject_Release(p)
#define IDirectMusicLoader_SetObject(p, a)
#define IDirectMusicLoader_GetObject(p, a, b, c)
#define FOURCC(a, b, c, d)
#define mmioFOURCC(c0, c1, c2, c3)
#define IsEqualCLSID(rclsid1, rclsid2)
static __inline const char * debugstr_fourcc(unsigned int cc)
WCHAR wszCategory[DMUS_MAX_CATEGORY]
WCHAR wszFileName[DMUS_MAX_FILENAME]
WCHAR wszName[DMUS_MAX_NAME]