[PATCH 2/5] qedit: Stub out AMTimelineObj.

Alex Henrie alexhenrie24 at gmail.com
Mon Apr 25 22:09:57 CDT 2016


Cc: Andrew Eikum <aeikum at codeweavers.com>

Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
---
 dlls/qedit/Makefile.in      |   3 +-
 dlls/qedit/qedit_private.h  |   2 +
 dlls/qedit/tests/timeline.c |   3 -
 dlls/qedit/timeline.c       |  10 +-
 dlls/qedit/timelineobj.c    | 470 ++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 482 insertions(+), 6 deletions(-)
 create mode 100644 dlls/qedit/timelineobj.c

diff --git a/dlls/qedit/Makefile.in b/dlls/qedit/Makefile.in
index 35ec0e3..bac724f 100644
--- a/dlls/qedit/Makefile.in
+++ b/dlls/qedit/Makefile.in
@@ -5,6 +5,7 @@ C_SRCS = \
 	main.c \
 	mediadet.c \
 	samplegrabber.c \
-	timeline.c
+	timeline.c \
+	timelineobj.c
 
 IDL_SRCS = qedit_classes.idl
diff --git a/dlls/qedit/qedit_private.h b/dlls/qedit/qedit_private.h
index 708c53d..b893257 100644
--- a/dlls/qedit/qedit_private.h
+++ b/dlls/qedit/qedit_private.h
@@ -36,4 +36,6 @@ HRESULT AMTimeline_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN;
 HRESULT MediaDet_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN;
 HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN;
 
+HRESULT AMTimelineObj_create(TIMELINE_MAJOR_TYPE type, IAMTimelineObj **ppObj) DECLSPEC_HIDDEN;
+
 #endif /* __QEDIT_PRIVATE_INCLUDED__ */
diff --git a/dlls/qedit/tests/timeline.c b/dlls/qedit/tests/timeline.c
index 850850f..ec82028 100644
--- a/dlls/qedit/tests/timeline.c
+++ b/dlls/qedit/tests/timeline.c
@@ -47,18 +47,15 @@ static void test_timeline(void)
             case TIMELINE_MAJOR_TYPE_TRANSITION:
             case TIMELINE_MAJOR_TYPE_EFFECT:
             case TIMELINE_MAJOR_TYPE_GROUP:
-todo_wine
                 ok(hr == S_OK, "CreateEmptyNode failed: %08x\n", hr);
                 if (obj) IAMTimelineObj_Release(obj);
                 break;
             default:
-todo_wine
                 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG got %08x\n", hr);
         }
     }
 
     hr = IAMTimeline_CreateEmptyNode(timeline, &obj, TIMELINE_MAJOR_TYPE_COMPOSITE);
-todo_wine
     ok(hr == S_OK, "CreateEmptyNode failed: %08x\n", hr);
     if (!obj) return;
 
diff --git a/dlls/qedit/timeline.c b/dlls/qedit/timeline.c
index 52123a7..0398f28 100644
--- a/dlls/qedit/timeline.c
+++ b/dlls/qedit/timeline.c
@@ -129,8 +129,14 @@ static HRESULT WINAPI Timeline_IAMTimeline_CreateEmptyNode(IAMTimeline *iface, I
                                                            TIMELINE_MAJOR_TYPE type)
 {
     TimelineImpl *This = impl_from_IAMTimeline(iface);
-    FIXME("(%p)->(%p,%04x): not implemented!\n", This, obj, type);
-    return E_NOTIMPL;
+    HRESULT hr;
+
+    TRACE("(%p)->(%p,%04x)\n", This, obj, type);
+
+    hr = AMTimelineObj_create(type, obj);
+    if (FAILED(hr)) return hr;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI Timeline_IAMTimeline_AddGroup(IAMTimeline *iface, IAMTimelineObj *group)
diff --git a/dlls/qedit/timelineobj.c b/dlls/qedit/timelineobj.c
new file mode 100644
index 0000000..116fba1
--- /dev/null
+++ b/dlls/qedit/timelineobj.c
@@ -0,0 +1,470 @@
+/*              DirectShow TimelineObj object (QEDIT.DLL)
+ *
+ * Copyright 2016 Alex Henrie
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <assert.h>
+#include <stdarg.h>
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "ole2.h"
+
+#include "qedit_private.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(qedit);
+
+typedef struct {
+    IUnknown IUnknown_inner;
+    IAMTimelineObj IAMTimelineObj_iface;
+    LONG ref;
+} TimelineObjImpl;
+
+static inline TimelineObjImpl *impl_from_IUnknown(IUnknown *iface)
+{
+    return CONTAINING_RECORD(iface, TimelineObjImpl, IUnknown_inner);
+}
+
+static inline TimelineObjImpl *impl_from_IAMTimelineObj(IAMTimelineObj *iface)
+{
+    return CONTAINING_RECORD(iface, TimelineObjImpl, IAMTimelineObj_iface);
+}
+
+/* TimelineObj inner IUnknown */
+
+static HRESULT WINAPI TimelineObj_inner_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
+{
+    TimelineObjImpl *This = impl_from_IUnknown(iface);
+
+    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
+
+    *ppv = NULL;
+    if (IsEqualIID(riid, &IID_IUnknown))
+        *ppv = &This->IUnknown_inner;
+    else if (IsEqualIID(riid, &IID_IAMTimelineObj))
+        *ppv = &This->IAMTimelineObj_iface;
+    else
+        WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppv);
+
+    if (!*ppv)
+        return E_NOINTERFACE;
+
+    IUnknown_AddRef((IUnknown*)*ppv);
+    return S_OK;
+}
+
+static ULONG WINAPI TimelineObj_inner_AddRef(IUnknown *iface)
+{
+    TimelineObjImpl *This = impl_from_IUnknown(iface);
+    ULONG ref = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p) new ref = %u\n", This, ref);
+
+    return ref;
+}
+
+static ULONG WINAPI TimelineObj_inner_Release(IUnknown *iface)
+{
+    TimelineObjImpl *This = impl_from_IUnknown(iface);
+    ULONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p) new ref = %u\n", This, ref);
+
+    if (ref == 0)
+    {
+        CoTaskMemFree(This);
+        return 0;
+    }
+
+    return ref;
+}
+
+static const IUnknownVtbl timelineobj_vtbl =
+{
+    TimelineObj_inner_QueryInterface,
+    TimelineObj_inner_AddRef,
+    TimelineObj_inner_Release,
+};
+
+/* IAMTimelineObj implementation */
+
+static HRESULT WINAPI TimelineObj_QueryInterface(IAMTimelineObj *iface, REFIID riid, void **ppv)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    return IUnknown_QueryInterface(&This->IUnknown_inner, riid, ppv);
+}
+
+static ULONG WINAPI TimelineObj_AddRef(IAMTimelineObj *iface)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    return IUnknown_AddRef(&This->IUnknown_inner);
+}
+
+static ULONG WINAPI TimelineObj_Release(IAMTimelineObj *iface)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    return IUnknown_Release(&This->IUnknown_inner);
+}
+
+static HRESULT WINAPI TimelineObj_GetStartStop(IAMTimelineObj *iface, REFERENCE_TIME *start, REFERENCE_TIME *stop)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_GetStartStop2(IAMTimelineObj *iface, REFTIME *start, REFTIME *stop)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_FixTimes(IAMTimelineObj *iface, REFERENCE_TIME *start, REFERENCE_TIME *stop)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_FixTimes2(IAMTimelineObj *iface, REFTIME *start, REFTIME *stop)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_SetStartStop(IAMTimelineObj *iface, REFERENCE_TIME start, REFERENCE_TIME stop)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%s,%s): not implemented!\n", This, wine_dbgstr_longlong(start), wine_dbgstr_longlong(stop));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_SetStartStop2(IAMTimelineObj *iface, REFTIME start, REFTIME stop)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%f,%f): not implemented!\n", This, start, stop);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_GetPropertySetter(IAMTimelineObj *iface, IPropertySetter **setter)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p): not implemented!\n", This, setter);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_SetPropertySetter(IAMTimelineObj *iface, IPropertySetter *setter)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p): not implemented!\n", This, setter);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_GetSubObject(IAMTimelineObj *iface, IUnknown **obj)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p): not implemented!\n", This, obj);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_SetSubObject(IAMTimelineObj *iface, IUnknown *obj)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p): not implemented!\n", This, obj);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_SetSubObjectGUID(IAMTimelineObj *iface, GUID guid)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_guid(&guid));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_SetSubObjectGUIDB(IAMTimelineObj *iface, BSTR guidb)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_w(guidb));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_GetSubObjectGUID(IAMTimelineObj *iface, GUID *guid)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p): not implemented!\n", This, guid);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_GetSubObjectGUIDB(IAMTimelineObj *iface, BSTR *guidb)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p): not implemented!\n", This, guidb);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_GetSubObjectLoaded(IAMTimelineObj *iface, BOOL *loaded)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p): not implemented!\n", This, loaded);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_GetTimelineType(IAMTimelineObj *iface, TIMELINE_MAJOR_TYPE *type)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p): not implemented!\n", This, type);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_SetTimelineType(IAMTimelineObj *iface, TIMELINE_MAJOR_TYPE type)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%d): not implemented!\n", This, type);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_GetUserID(IAMTimelineObj *iface, LONG *id)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p): not implemented!\n", This, id);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_SetUserID(IAMTimelineObj *iface, LONG id)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%d): not implemented!\n", This, id);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_GetGenID(IAMTimelineObj *iface, LONG *id)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p): not implemented!\n", This, id);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_GetUserName(IAMTimelineObj *iface, BSTR *name)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p): not implemented!\n", This, name);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_SetUserName(IAMTimelineObj *iface, BSTR name)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_w(name));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_GetUserData(IAMTimelineObj *iface, BYTE *data, LONG *size)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p,%p): not implemented!\n", This, data, size);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_SetUserData(IAMTimelineObj *iface, BYTE *data, LONG size)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p,%d): not implemented!\n", This, data, size);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_GetMuted(IAMTimelineObj *iface, BOOL *muted)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p): not implemented!\n", This, muted);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_SetMuted(IAMTimelineObj *iface, BOOL muted)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%d): not implemented!\n", This, muted);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_GetLocked(IAMTimelineObj *iface, BOOL *locked)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p): not implemented!\n", This, locked);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_SetLocked(IAMTimelineObj *iface, BOOL locked)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%d): not implemented!\n", This, locked);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_GetDirtyRange(IAMTimelineObj *iface, REFERENCE_TIME *start, REFERENCE_TIME *stop)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_GetDirtyRange2(IAMTimelineObj *iface, REFTIME *start, REFTIME *stop)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_SetDirtyRange(IAMTimelineObj *iface, REFERENCE_TIME start, REFERENCE_TIME stop)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%s,%s): not implemented!\n", This, wine_dbgstr_longlong(start), wine_dbgstr_longlong(stop));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_SetDirtyRange2(IAMTimelineObj *iface, REFTIME start, REFTIME stop)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%f,%f): not implemented!\n", This, start, stop);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_ClearDirty(IAMTimelineObj *iface)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p): not implemented!\n", This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_Remove(IAMTimelineObj *iface)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p): not implemented!\n", This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_RemoveAll(IAMTimelineObj *iface)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p): not implemented!\n", This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_GetTimelineNoRef(IAMTimelineObj *iface, IAMTimeline **timeline)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p): not implemented!\n", This, timeline);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_GetGroupIBelongTo(IAMTimelineObj *iface, IAMTimelineGroup **group)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p): not implemented!\n", This, group);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TimelineObj_GetEmbedDepth(IAMTimelineObj *iface, LONG *depth)
+{
+    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
+    FIXME("(%p)->(%p): not implemented!\n", This, depth);
+    return E_NOTIMPL;
+}
+
+static const IAMTimelineObjVtbl IAMTimelineObj_VTable =
+{
+    TimelineObj_QueryInterface,
+    TimelineObj_AddRef,
+    TimelineObj_Release,
+    TimelineObj_GetStartStop,
+    TimelineObj_GetStartStop2,
+    TimelineObj_FixTimes,
+    TimelineObj_FixTimes2,
+    TimelineObj_SetStartStop,
+    TimelineObj_SetStartStop2,
+    TimelineObj_GetPropertySetter,
+    TimelineObj_SetPropertySetter,
+    TimelineObj_GetSubObject,
+    TimelineObj_SetSubObject,
+    TimelineObj_SetSubObjectGUID,
+    TimelineObj_SetSubObjectGUIDB,
+    TimelineObj_GetSubObjectGUID,
+    TimelineObj_GetSubObjectGUIDB,
+    TimelineObj_GetSubObjectLoaded,
+    TimelineObj_GetTimelineType,
+    TimelineObj_SetTimelineType,
+    TimelineObj_GetUserID,
+    TimelineObj_SetUserID,
+    TimelineObj_GetGenID,
+    TimelineObj_GetUserName,
+    TimelineObj_SetUserName,
+    TimelineObj_GetUserData,
+    TimelineObj_SetUserData,
+    TimelineObj_GetMuted,
+    TimelineObj_SetMuted,
+    TimelineObj_GetLocked,
+    TimelineObj_SetLocked,
+    TimelineObj_GetDirtyRange,
+    TimelineObj_GetDirtyRange2,
+    TimelineObj_SetDirtyRange,
+    TimelineObj_SetDirtyRange2,
+    TimelineObj_ClearDirty,
+    TimelineObj_Remove,
+    TimelineObj_RemoveAll,
+    TimelineObj_GetTimelineNoRef,
+    TimelineObj_GetGroupIBelongTo,
+    TimelineObj_GetEmbedDepth,
+};
+
+HRESULT AMTimelineObj_create(TIMELINE_MAJOR_TYPE type, IAMTimelineObj **ppv)
+{
+    TimelineObjImpl* obj = NULL;
+
+    TRACE("(%d,%p)\n", type, ppv);
+
+    switch (type)
+    {
+        case TIMELINE_MAJOR_TYPE_COMPOSITE:
+        case TIMELINE_MAJOR_TYPE_TRACK:
+        case TIMELINE_MAJOR_TYPE_SOURCE:
+        case TIMELINE_MAJOR_TYPE_TRANSITION:
+        case TIMELINE_MAJOR_TYPE_EFFECT:
+        case TIMELINE_MAJOR_TYPE_GROUP:
+            break;
+        default:
+            return E_INVALIDARG;
+    }
+
+    obj = CoTaskMemAlloc(sizeof(TimelineObjImpl));
+    if (NULL == obj) {
+        *ppv = NULL;
+        return E_OUTOFMEMORY;
+    }
+    ZeroMemory(obj, sizeof(TimelineObjImpl));
+
+    obj->ref = 1;
+    obj->IUnknown_inner.lpVtbl = &timelineobj_vtbl;
+    obj->IAMTimelineObj_iface.lpVtbl = &IAMTimelineObj_VTable;
+
+    *ppv = &obj->IAMTimelineObj_iface;
+    return S_OK;
+}
-- 
2.8.0




More information about the wine-patches mailing list