Christian Costa : d3dxof: Implement IDirectXFileDataReference.
Alexandre Julliard
julliard at winehq.org
Thu Sep 25 07:13:24 CDT 2008
Module: wine
Branch: master
Commit: 8597d42cf5f3fe194bd88ccb7ff922e547c44e6d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8597d42cf5f3fe194bd88ccb7ff922e547c44e6d
Author: Christian Costa <titan.costa at wanadoo.fr>
Date: Wed Sep 24 22:38:29 2008 +0200
d3dxof: Implement IDirectXFileDataReference.
---
dlls/d3dxof/d3dxof.c | 84 ++++++++++++++++++++++++++++++++++++------
dlls/d3dxof/d3dxof_private.h | 4 ++
include/dxfile.h | 2 +-
3 files changed, 77 insertions(+), 13 deletions(-)
diff --git a/dlls/d3dxof/d3dxof.c b/dlls/d3dxof/d3dxof.c
index 706662d..a4801f5 100644
--- a/dlls/d3dxof/d3dxof.c
+++ b/dlls/d3dxof/d3dxof.c
@@ -1403,21 +1403,37 @@ static HRESULT WINAPI IDirectXFileDataImpl_GetNextObject(IDirectXFileData* iface
{
HRESULT hr;
IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
- IDirectXFileDataImpl *object;
TRACE("(%p/%p)->(%p)\n", This, iface, ppChildObj);
if (This->cur_enum_object >= This->pobj->nb_childs)
return DXFILEERR_NOMOREOBJECTS;
- hr = IDirectXFileDataImpl_Create(&object);
- if (hr != S_OK)
- return DXFILEERR_BADVALUE;
+ if (This->pobj->childs[This->cur_enum_object]->ptarget)
+ {
+ IDirectXFileDataReferenceImpl *object;
- object->pobj = This->pobj->childs[This->cur_enum_object++];
- object->cur_enum_object = 0;
+ hr = IDirectXFileDataReferenceImpl_Create(&object);
+ if (hr != S_OK)
+ return DXFILEERR_BADVALUE;
+
+ object->ptarget = This->pobj->childs[This->cur_enum_object++]->ptarget;
+
+ *ppChildObj = (LPDIRECTXFILEOBJECT)object;
+ }
+ else
+ {
+ IDirectXFileDataImpl *object;
+
+ hr = IDirectXFileDataImpl_Create(&object);
+ if (hr != S_OK)
+ return DXFILEERR_BADVALUE;
- *ppChildObj = (LPDIRECTXFILEOBJECT)object;
+ object->pobj = This->pobj->childs[This->cur_enum_object++];
+ object->cur_enum_object = 0;
+
+ *ppChildObj = (LPDIRECTXFILEOBJECT)object;
+ }
return DXFILE_OK;
}
@@ -1532,7 +1548,12 @@ static HRESULT WINAPI IDirectXFileDataReferenceImpl_GetName(IDirectXFileDataRefe
{
IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
- FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen);
+ TRACE("(%p/%p)->(%p,%p)\n", This, iface, pstrNameBuf, pdwBufLen);
+
+ if (!pstrNameBuf)
+ return DXFILEERR_BADVALUE;
+
+ strcpy(pstrNameBuf, This->ptarget->name);
return DXFILEERR_BADVALUE;
}
@@ -1541,19 +1562,38 @@ static HRESULT WINAPI IDirectXFileDataReferenceImpl_GetId(IDirectXFileDataRefere
{
IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
- FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid);
+ TRACE("(%p/%p)->(%p)\n", This, iface, pGuid);
- return DXFILEERR_BADVALUE;
+ if (!pGuid)
+ return DXFILEERR_BADVALUE;
+
+ memcpy(pGuid, &This->ptarget->class_id, 16);
+
+ return DXFILE_OK;
}
/*** IDirectXFileDataReference ***/
static HRESULT WINAPI IDirectXFileDataReferenceImpl_Resolve(IDirectXFileDataReference* iface, LPDIRECTXFILEDATA* ppDataObj)
{
IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
+ IDirectXFileDataImpl *object;
+ HRESULT hr;
- FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppDataObj);
+ TRACE("(%p/%p)->(%p)\n", This, iface, ppDataObj);
- return DXFILEERR_BADVALUE;
+ if (!ppDataObj)
+ return DXFILEERR_BADVALUE;
+
+ hr = IDirectXFileDataImpl_Create(&object);
+ if (hr != S_OK)
+ return DXFILEERR_BADVALUE;
+
+ object->pobj = This->ptarget;
+ object->cur_enum_object = 0;
+
+ *ppDataObj = (LPDIRECTXFILEDATA)object;
+
+ return DXFILE_OK;
}
static const IDirectXFileDataReferenceVtbl IDirectXFileDataReference_Vtbl =
@@ -1784,11 +1824,26 @@ static BOOL parse_object_parts(parse_buffer * buf, BOOL allow_optional)
{
if (check_TOKEN(buf) == TOKEN_OBRACE)
{
+ int i;
get_TOKEN(buf);
if (get_TOKEN(buf) != TOKEN_NAME)
return FALSE;
if (get_TOKEN(buf) != TOKEN_CBRACE)
return FALSE;
+ TRACE("Found optional reference %s\n", (char*)buf->value);
+ for (i = 0; i < buf->nb_pxo_globals; i++)
+ {
+ if (!strcmp(buf->pxo_globals[i*MAX_SUBOBJECTS].name, (char*)buf->value))
+ break;
+ }
+ if (i == buf->nb_pxo_globals)
+ {
+ ERR("Reference to unknown object %s\n", (char*)buf->value);
+ return FALSE;
+ }
+ buf->pxo->childs[buf->pxo->nb_childs] = &buf->pxo_tab[buf->cur_subobject++];
+ buf->pxo->childs[buf->pxo->nb_childs]->ptarget = &buf->pxo_globals[i*MAX_SUBOBJECTS];
+ buf->pxo->nb_childs++;
}
else if (check_TOKEN(buf) == TOKEN_NAME)
{
@@ -1819,6 +1874,7 @@ static BOOL parse_object(parse_buffer * buf)
int i;
buf->pxo->pdata = buf->cur_pdata;
+ buf->pxo->ptarget = NULL;
if (get_TOKEN(buf) != TOKEN_NAME)
return FALSE;
@@ -1892,6 +1948,8 @@ static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetNextDataObject(IDirectXFileE
if (!SUCCEEDED(hr))
return hr;
+ This->buf.pxo_globals = &This->xobjects[0][0];
+ This->buf.nb_pxo_globals = This->nb_xobjects;
This->buf.pxo_tab = &This->xobjects[This->nb_xobjects][0];
This->buf.cur_subobject = 0;
This->buf.pxo = &This->buf.pxo_tab[This->buf.cur_subobject++];
@@ -1917,6 +1975,8 @@ static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetNextDataObject(IDirectXFileE
*ppDataObj = (LPDIRECTXFILEDATA)object;
+ This->nb_xobjects++;
+
return DXFILE_OK;
}
diff --git a/dlls/d3dxof/d3dxof_private.h b/dlls/d3dxof/d3dxof_private.h
index 14542f2..99bec1c 100644
--- a/dlls/d3dxof/d3dxof_private.h
+++ b/dlls/d3dxof/d3dxof_private.h
@@ -67,6 +67,7 @@ typedef struct {
} xobject_member;
struct _xobject {
+ struct _xobject* ptarget;
char name[MAX_NAME_LEN];
GUID class_id;
GUID type;
@@ -102,6 +103,7 @@ typedef struct {
typedef struct {
IDirectXFileDataReference lpVtbl;
LONG ref;
+ xobject* ptarget;
} IDirectXFileDataReferenceImpl;
typedef struct {
@@ -120,6 +122,8 @@ typedef struct {
ULONG cur_subobject;
LPBYTE cur_pdata;
BYTE value[100];
+ xobject* pxo_globals;
+ ULONG nb_pxo_globals;
xobject* pxo_tab;
IDirectXFileImpl* pdxf;
xobject* pxo;
diff --git a/include/dxfile.h b/include/dxfile.h
index b0adceb..9eab71a 100644
--- a/include/dxfile.h
+++ b/include/dxfile.h
@@ -214,7 +214,7 @@ DECLARE_INTERFACE_(IDirectXFileDataReference,IDirectXFileObject)
#define IDirectXFileDataReference_GetName(p,a,b) (p)->lpVtbl->GetName(p,a,b)
#define IDirectXFileDataReference_GetId(p,a) (p)->lpVtbl->GetId(p,a)
/*** IDirectXFileDataReference methods ***/
-#define IDirectXFileDataReference_Resolve(p,a) (p)->lpVtbl->GetData(p,a)
+#define IDirectXFileDataReference_Resolve(p,a) (p)->lpVtbl->Resolve(p,a)
#endif
#define INTERFACE IDirectXFileBinary
More information about the wine-cvs
mailing list