WINE_DEFAULT_DEBUG_CHANNEL(fusion);
typedef struct {
- const IAssemblyNameVtbl *lpIAssemblyNameVtbl;
+ IAssemblyName IAssemblyName_iface;
LPWSTR path;
#define CHARS_PER_PUBKEY 16
+static inline IAssemblyNameImpl *impl_from_IAssemblyName(IAssemblyName *iface)
+{
+ return CONTAINING_RECORD(iface, IAssemblyNameImpl, IAssemblyName_iface);
+}
+
static HRESULT WINAPI IAssemblyNameImpl_QueryInterface(IAssemblyName *iface,
REFIID riid, LPVOID *ppobj)
{
- IAssemblyNameImpl *This = (IAssemblyNameImpl *)iface;
+ IAssemblyNameImpl *This = impl_from_IAssemblyName(iface);
TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppobj);
static ULONG WINAPI IAssemblyNameImpl_AddRef(IAssemblyName *iface)
{
- IAssemblyNameImpl *This = (IAssemblyNameImpl *)iface;
+ IAssemblyNameImpl *This = impl_from_IAssemblyName(iface);
ULONG refCount = InterlockedIncrement(&This->ref);
TRACE("(%p)->(ref before = %u)\n", This, refCount - 1);
static ULONG WINAPI IAssemblyNameImpl_Release(IAssemblyName *iface)
{
- IAssemblyNameImpl *This = (IAssemblyNameImpl *)iface;
+ IAssemblyNameImpl *This = impl_from_IAssemblyName(iface);
ULONG refCount = InterlockedDecrement(&This->ref);
TRACE("(%p)->(ref before = %u)\n", This, refCount + 1);
HeapFree(GetProcessHeap(), 0, This->displayname);
HeapFree(GetProcessHeap(), 0, This->name);
HeapFree(GetProcessHeap(), 0, This->culture);
+ HeapFree(GetProcessHeap(), 0, This->procarch);
HeapFree(GetProcessHeap(), 0, This);
}
LPVOID pvProperty,
LPDWORD pcbProperty)
{
- IAssemblyNameImpl *name = (IAssemblyNameImpl *)iface;
+ IAssemblyNameImpl *name = impl_from_IAssemblyName(iface);
TRACE("(%p, %d, %p, %p)\n", iface, PropertyId, pvProperty, pcbProperty);
LPDWORD pccDisplayName,
DWORD dwDisplayFlags)
{
- IAssemblyNameImpl *name = (IAssemblyNameImpl *)iface;
+ IAssemblyNameImpl *name = impl_from_IAssemblyName(iface);
WCHAR verstr[30];
DWORD size;
LPWSTR cultureval = 0;
LPDWORD lpcwBuffer,
WCHAR *pwzName)
{
- IAssemblyNameImpl *name = (IAssemblyNameImpl *)iface;
+ IAssemblyNameImpl *name = impl_from_IAssemblyName(iface);
TRACE("(%p, %p, %p)\n", iface, lpcwBuffer, pwzName);
LPDWORD pdwVersionHi,
LPDWORD pdwVersionLow)
{
- IAssemblyNameImpl *name = (IAssemblyNameImpl *)iface;
+ IAssemblyNameImpl *name = impl_from_IAssemblyName(iface);
TRACE("(%p, %p, %p)\n", iface, pdwVersionHi, pdwVersionLow);
};
/* Internal methods */
-HRESULT IAssemblyName_SetPath(IAssemblyName *iface, LPCWSTR path)
+static inline IAssemblyNameImpl *unsafe_impl_from_IAssemblyName(IAssemblyName *iface)
{
- IAssemblyNameImpl *name = (IAssemblyNameImpl *)iface;
+ assert(iface->lpVtbl == &AssemblyNameVtbl);
- assert(name->lpIAssemblyNameVtbl == &AssemblyNameVtbl);
+ return impl_from_IAssemblyName(iface);
+}
+
+HRESULT IAssemblyName_SetPath(IAssemblyName *iface, LPCWSTR path)
+{
+ IAssemblyNameImpl *name = unsafe_impl_from_IAssemblyName(iface);
name->path = strdupW(path);
if (!name->path)
HRESULT IAssemblyName_GetPath(IAssemblyName *iface, LPWSTR buf, ULONG *len)
{
ULONG buffer_size = *len;
- IAssemblyNameImpl *name = (IAssemblyNameImpl *)iface;
-
- assert(name->lpIAssemblyNameVtbl == &AssemblyNameVtbl);
+ IAssemblyNameImpl *name = unsafe_impl_from_IAssemblyName(iface);
if (!name->path)
return S_OK;
str = strdupW(szAssemblyName);
save = str;
if (!str)
- return E_OUTOFMEMORY;
+ {
+ hr = E_OUTOFMEMORY;
+ goto done;
+ }
ptr = strchrW(str, ',');
if (ptr) *ptr = '\0';
name->name = strdupW(str);
if (!name->name)
- return E_OUTOFMEMORY;
+ {
+ hr = E_OUTOFMEMORY;
+ goto done;
+ }
if (!ptr)
goto done;
else if (!lstrcmpW(str, procarch))
{
name->procarch = strdupW(ptr);
- hr = S_OK;
+ if (!name->procarch)
+ hr = E_OUTOFMEMORY;
}
if (FAILED(hr))
if (!name)
return E_OUTOFMEMORY;
- name->lpIAssemblyNameVtbl = &AssemblyNameVtbl;
+ name->IAssemblyName_iface.lpVtbl = &AssemblyNameVtbl;
name->ref = 1;
hr = parse_display_name(name, szAssemblyName);
return hr;
}
- *ppAssemblyNameObj = (IAssemblyName *)name;
+ *ppAssemblyNameObj = &name->IAssemblyName_iface;
return S_OK;
}