diff --git a/LEGO1/mxstreamer.cpp b/LEGO1/mxstreamer.cpp index e8928003..e2b9b162 100644 --- a/LEGO1/mxstreamer.cpp +++ b/LEGO1/mxstreamer.cpp @@ -3,6 +3,8 @@ #include #include "legoomni.h" +#include "mxdiskstreamcontroller.h" +#include "mxramstreamcontroller.h" DECOMP_SIZE_ASSERT(MxStreamer, 0x2c); @@ -41,18 +43,36 @@ MxStreamer::~MxStreamer() } // OFFSET: LEGO1 0x100b92c0 -MxStreamController *MxStreamer::Open(const char *name, MxU16 p_lookupType) +MxStreamController *MxStreamer::Open(const char *p_name, MxU16 p_lookupType) { // TODO + MxStreamController *stream = NULL; - MxStreamController *c = GetOpenStream(name); + if (!GetOpenStream(p_name)) { + switch (p_lookupType) { + case e_DiskStream: + stream = new MxDiskStreamController(); + break; + case e_RAMStream: + stream = new MxRAMStreamController(); + break; + } - return NULL; + if (!stream + || stream->Open(p_name) != SUCCESS + || AddStreamControllerToOpenList(stream) != SUCCESS) { + delete stream; + stream = NULL; + } + } + + return stream; } -// OFFSET: LEGO1 0x100b9570 +// OFFSET: LEGO1 0x100b9570 STUB MxLong MxStreamer::Close(const char *p) { + // TODO: Incomplete MxDSAction ds; ds.SetUnknown24(-2); @@ -63,7 +83,7 @@ MxLong MxStreamer::Close(const char *p) if (!p || !strcmp(p, c->atom.GetInternal())) { m_openStreams.erase(it); - if (c->IsStillInUse()) { + if (!c->CanBeDeleted()) { // TODO: Send notification to `c` } else { delete c; diff --git a/LEGO1/mxstreamer.h b/LEGO1/mxstreamer.h index b87b8405..7bdc22bd 100644 --- a/LEGO1/mxstreamer.h +++ b/LEGO1/mxstreamer.h @@ -42,11 +42,17 @@ class MxStreamerSubClass3 : public MxStreamerSubClass1 class MxStreamer : public MxCore { public: - MxStreamer(); - virtual ~MxStreamer() override; + enum OpenMode + { + e_DiskStream, + e_RAMStream + }; - __declspec(dllexport) MxStreamController *Open(const char *name, MxU16 p); - __declspec(dllexport) MxLong Close(const char *p); + MxStreamer(); + virtual ~MxStreamer() override; // vtable+0x0 + + __declspec(dllexport) MxStreamController *Open(const char *p_name, MxU16 p_openMode); + __declspec(dllexport) MxLong Close(const char *p_name); virtual MxLong Notify(MxParam &p) override; // vtable+0x4 @@ -58,7 +64,7 @@ class MxStreamer : public MxCore } // OFFSET: LEGO1 0x100b9010 - inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + inline virtual MxBool IsA(const char *p_name) const override // vtable+0x10 { return !strcmp(name, MxStreamer::ClassName()) || MxCore::IsA(name); }