xref: /reactos/dll/directx/wine/d3drm/d3drm_main.c (revision 37b2c145)
1 /*
2  * Copyright 2004 Ivan Leo Puoti
3  * Copyright 2010 Christian Costa
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18  */
19 
20 #include "initguid.h"
21 #include "d3drm_private.h"
22 
23 /***********************************************************************
24  *		DllMain  (D3DRM.@)
25  */
26 BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, void *reserved)
27 {
28     switch(reason)
29     {
30     case DLL_WINE_PREATTACH:
31         return FALSE;  /* prefer native version */
32     case DLL_PROCESS_ATTACH:
33         DisableThreadLibraryCalls( inst );
34         break;
35     }
36     return TRUE;
37 }
38 
39 void d3drm_object_init(struct d3drm_object *object, const char *classname)
40 {
41     object->ref = 1;
42     object->appdata = 0;
43     list_init(&object->destroy_callbacks);
44     object->classname = classname;
45     object->name = NULL;
46 }
47 
48 struct destroy_callback
49 {
50     struct list entry;
51     D3DRMOBJECTCALLBACK cb;
52     void *ctx;
53 };
54 
55 HRESULT d3drm_object_add_destroy_callback(struct d3drm_object *object, D3DRMOBJECTCALLBACK cb, void *ctx)
56 {
57     struct destroy_callback *callback;
58 
59     if (!cb)
60         return D3DRMERR_BADVALUE;
61 
62     if (!(callback = heap_alloc(sizeof(*callback))))
63         return E_OUTOFMEMORY;
64 
65     callback->cb = cb;
66     callback->ctx = ctx;
67 
68     list_add_head(&object->destroy_callbacks, &callback->entry);
69     return D3DRM_OK;
70 }
71 
72 HRESULT d3drm_object_delete_destroy_callback(struct d3drm_object *object, D3DRMOBJECTCALLBACK cb, void *ctx)
73 {
74     struct destroy_callback *callback;
75 
76     if (!cb)
77         return D3DRMERR_BADVALUE;
78 
79     LIST_FOR_EACH_ENTRY(callback, &object->destroy_callbacks, struct destroy_callback, entry)
80     {
81         if (callback->cb == cb && callback->ctx == ctx)
82         {
83             list_remove(&callback->entry);
84             heap_free(callback);
85             break;
86         }
87     }
88 
89     return D3DRM_OK;
90 }
91 
92 HRESULT d3drm_object_get_class_name(struct d3drm_object *object, DWORD *size, char *name)
93 {
94     DWORD req_size;
95 
96     if (!size)
97         return E_INVALIDARG;
98 
99     req_size = strlen(object->classname) + 1;
100     if (name && *size < req_size)
101         return E_INVALIDARG;
102 
103     *size = req_size;
104 
105     if (name)
106         memcpy(name, object->classname, req_size);
107 
108     return D3DRM_OK;
109 }
110 
111 HRESULT d3drm_object_get_name(struct d3drm_object *object, DWORD *size, char *name)
112 {
113     DWORD req_size;
114 
115     if (!size)
116         return E_INVALIDARG;
117 
118     req_size = object->name ? strlen(object->name) + 1 : 0;
119     if (name && *size < req_size)
120         return E_INVALIDARG;
121 
122     if (name)
123     {
124         if (object->name)
125             memcpy(name, object->name, req_size);
126         else if (*size)
127             *name = 0;
128     }
129 
130     *size = req_size;
131 
132     return D3DRM_OK;
133 }
134 
135 HRESULT d3drm_object_set_name(struct d3drm_object *object, const char *name)
136 {
137     DWORD req_size;
138 
139     heap_free(object->name);
140     object->name = NULL;
141 
142     if (name)
143     {
144         req_size = strlen(name) + 1;
145         if (!(object->name = heap_alloc(req_size)))
146             return E_OUTOFMEMORY;
147         memcpy(object->name, name, req_size);
148     }
149 
150     return D3DRM_OK;
151 }
152 
153 void d3drm_object_cleanup(IDirect3DRMObject *iface, struct d3drm_object *object)
154 {
155     struct destroy_callback *callback, *callback2;
156 
157     LIST_FOR_EACH_ENTRY_SAFE(callback, callback2, &object->destroy_callbacks, struct destroy_callback, entry)
158     {
159         callback->cb(iface, callback->ctx);
160         list_remove(&callback->entry);
161         heap_free(callback);
162     }
163 
164     heap_free(object->name);
165     object->name = NULL;
166 }
167