/*
 *	self-registerable dll functions for oleaut32.dll
 *
 * Copyright (C) 2003 John K. Hohm
 *
 * 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 <stdarg.h>
#include <string.h>

#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "winreg.h"
#include "winerror.h"

#include "ole2.h"
#include "olectl.h"
#include "oleauto.h"
#include "initguid.h"
#include "typelib.h"

#include "wine/debug.h"

WINE_DEFAULT_DEBUG_CHANNEL(ole);

/*
 * Near the bottom of this file are the exported DllRegisterServer and
 * DllUnregisterServer, which make all this worthwhile.
 */

/***********************************************************************
 *		interface for self-registering
 */
struct regsvr_interface
{
    IID const *iid;		/* NULL for end of list */
    LPCSTR name;		/* can be NULL to omit */
    IID const *base_iid;	/* can be NULL to omit */
    int num_methods;		/* can be <0 to omit */
    CLSID const *ps_clsid;	/* can be NULL to omit */
    CLSID const *ps_clsid32;	/* can be NULL to omit */
};

static HRESULT register_interfaces(struct regsvr_interface const *list);
static HRESULT unregister_interfaces(struct regsvr_interface const *list);

struct regsvr_coclass
{
    CLSID const *clsid;		/* NULL for end of list */
    LPCSTR name;		/* can be NULL to omit */
    LPCSTR ips;			/* can be NULL to omit */
    LPCSTR ips32;		/* can be NULL to omit */
    LPCSTR ips32_tmodel;	/* can be NULL to omit */
    LPCSTR clsid_str;		/* can be NULL to omit */
    LPCSTR progid;		/* can be NULL to omit */
};

static HRESULT register_coclasses(struct regsvr_coclass const *list);
static HRESULT unregister_coclasses(struct regsvr_coclass const *list);

/***********************************************************************
 *		static string constants
 */
static WCHAR const interface_keyname[10] = {
    'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 0 };
static WCHAR const base_ifa_keyname[14] = {
    'B', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c',
    'e', 0 };
static WCHAR const num_methods_keyname[11] = {
    'N', 'u', 'm', 'M', 'e', 't', 'h', 'o', 'd', 's', 0 };
static WCHAR const ps_clsid_keyname[15] = {
    'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's',
    'i', 'd', 0 };
static WCHAR const ps_clsid32_keyname[17] = {
    'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's',
    'i', 'd', '3', '2', 0 };
static WCHAR const clsid_keyname[6] = {
    'C', 'L', 'S', 'I', 'D', 0 };
static WCHAR const ips_keyname[13] = {
    'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r',
    0 };
static WCHAR const ips32_keyname[15] = {
    'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r',
    '3', '2', 0 };
static WCHAR const progid_keyname[7] = {
    'P', 'r', 'o', 'g', 'I', 'D', 0 };
static char const tmodel_valuename[] = "ThreadingModel";

/***********************************************************************
 *		static helper functions
 */
static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid);
static LONG register_key_defvalueW(HKEY base, WCHAR const *name,
				   WCHAR const *value);
static LONG register_key_defvalueA(HKEY base, WCHAR const *name,
				   char const *value);

/***********************************************************************
 *		register_interfaces
 */
static HRESULT register_interfaces(struct regsvr_interface const *list)
{
    LONG res = ERROR_SUCCESS;
    HKEY interface_key;

    res = RegCreateKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, NULL, 0,
			  KEY_READ | KEY_WRITE, NULL, &interface_key, NULL);
    if (res != ERROR_SUCCESS) goto error_return;

    for (; res == ERROR_SUCCESS && list->iid; ++list) {
	WCHAR buf[39];
	HKEY iid_key;

	StringFromGUID2(list->iid, buf, 39);
	res = RegCreateKeyExW(interface_key, buf, 0, NULL, 0,
			      KEY_READ | KEY_WRITE, NULL, &iid_key, NULL);
	if (res != ERROR_SUCCESS) goto error_close_interface_key;

	if (list->name) {
	    res = RegSetValueExA(iid_key, NULL, 0, REG_SZ,
				 (CONST BYTE*)(list->name),
				 strlen(list->name) + 1);
	    if (res != ERROR_SUCCESS) goto error_close_iid_key;
	}

	if (list->base_iid) {
	    res = register_key_guid(iid_key, base_ifa_keyname, list->base_iid);
	    if (res != ERROR_SUCCESS) goto error_close_iid_key;
	}

	if (0 <= list->num_methods) {
	    static WCHAR const fmt[3] = { '%', 'd', 0 };
	    HKEY key;

	    res = RegCreateKeyExW(iid_key, num_methods_keyname, 0, NULL, 0,
				  KEY_READ | KEY_WRITE, NULL, &key, NULL);
	    if (res != ERROR_SUCCESS) goto error_close_iid_key;

	    wsprintfW(buf, fmt, list->num_methods);
	    res = RegSetValueExW(key, NULL, 0, REG_SZ,
				 (CONST BYTE*)buf,
				 (lstrlenW(buf) + 1) * sizeof(WCHAR));
	    RegCloseKey(key);

	    if (res != ERROR_SUCCESS) goto error_close_iid_key;
	}

	if (list->ps_clsid) {
	    res = register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid);
	    if (res != ERROR_SUCCESS) goto error_close_iid_key;
	}

	if (list->ps_clsid32) {
	    res = register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32);
	    if (res != ERROR_SUCCESS) goto error_close_iid_key;
	}

    error_close_iid_key:
	RegCloseKey(iid_key);
    }

error_close_interface_key:
    RegCloseKey(interface_key);
error_return:
    return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
}

/***********************************************************************
 *		unregister_interfaces
 */
static HRESULT unregister_interfaces(struct regsvr_interface const *list)
{
    LONG res = ERROR_SUCCESS;
    HKEY interface_key;

    res = RegOpenKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0,
			KEY_READ | KEY_WRITE, &interface_key);
    if (res == ERROR_FILE_NOT_FOUND) return S_OK;
    if (res != ERROR_SUCCESS) goto error_return;

    for (; res == ERROR_SUCCESS && list->iid; ++list) {
	WCHAR buf[39];

	StringFromGUID2(list->iid, buf, 39);
	res = RegDeleteTreeW(interface_key, buf);
	if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
    }

    RegCloseKey(interface_key);
error_return:
    return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
}

/***********************************************************************
 *		register_coclasses
 */
static HRESULT register_coclasses(struct regsvr_coclass const *list)
{
    LONG res = ERROR_SUCCESS;
    HKEY coclass_key;

    res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0,
			  KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL);
    if (res != ERROR_SUCCESS) goto error_return;

    for (; res == ERROR_SUCCESS && list->clsid; ++list) {
	WCHAR buf[39];
	HKEY clsid_key;

	StringFromGUID2(list->clsid, buf, 39);
	res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0,
			      KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL);
	if (res != ERROR_SUCCESS) goto error_close_coclass_key;

	if (list->name) {
	    res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ,
				 (CONST BYTE*)(list->name),
				 strlen(list->name) + 1);
	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;
	}

	if (list->ips) {
	    res = register_key_defvalueA(clsid_key, ips_keyname, list->ips);
	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;
	}

	if (list->ips32) {
	    HKEY ips32_key;

	    res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0,
				  KEY_READ | KEY_WRITE, NULL,
				  &ips32_key, NULL);
	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;

	    res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ,
				 (CONST BYTE*)list->ips32,
				 lstrlenA(list->ips32) + 1);
	    if (res == ERROR_SUCCESS && list->ips32_tmodel)
		res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ,
				     (CONST BYTE*)list->ips32_tmodel,
				     strlen(list->ips32_tmodel) + 1);
	    RegCloseKey(ips32_key);
	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;
	}

	if (list->clsid_str) {
	    res = register_key_defvalueA(clsid_key, clsid_keyname,
					 list->clsid_str);
	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;
	}

	if (list->progid) {
	    HKEY progid_key;

	    res = register_key_defvalueA(clsid_key, progid_keyname,
					 list->progid);
	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;

	    res = RegCreateKeyExA(HKEY_CLASSES_ROOT, list->progid, 0,
				  NULL, 0, KEY_READ | KEY_WRITE, NULL,
				  &progid_key, NULL);
	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;

	    res = register_key_defvalueW(progid_key, clsid_keyname, buf);
	    RegCloseKey(progid_key);
	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;
	}

    error_close_clsid_key:
	RegCloseKey(clsid_key);
    }

error_close_coclass_key:
    RegCloseKey(coclass_key);
error_return:
    return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
}

/***********************************************************************
 *		unregister_coclasses
 */
static HRESULT unregister_coclasses(struct regsvr_coclass const *list)
{
    LONG res = ERROR_SUCCESS;
    HKEY coclass_key;

    res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0,
			KEY_READ | KEY_WRITE, &coclass_key);
    if (res == ERROR_FILE_NOT_FOUND) return S_OK;
    if (res != ERROR_SUCCESS) goto error_return;

    for (; res == ERROR_SUCCESS && list->clsid; ++list) {
	WCHAR buf[39];

	StringFromGUID2(list->clsid, buf, 39);
	res = RegDeleteTreeW(coclass_key, buf);
	if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
	if (res != ERROR_SUCCESS) goto error_close_coclass_key;

	if (list->progid) {
	    res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid);
	    if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
	    if (res != ERROR_SUCCESS) goto error_close_coclass_key;
	}
    }

error_close_coclass_key:
    RegCloseKey(coclass_key);
error_return:
    return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
}

/***********************************************************************
 *		regsvr_key_guid
 */
static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid)
{
    WCHAR buf[39];

    StringFromGUID2(guid, buf, 39);
    return register_key_defvalueW(base, name, buf);
}

/***********************************************************************
 *		regsvr_key_defvalueW
 */
static LONG register_key_defvalueW(
    HKEY base,
    WCHAR const *name,
    WCHAR const *value)
{
    LONG res;
    HKEY key;

    res = RegCreateKeyExW(base, name, 0, NULL, 0,
			  KEY_READ | KEY_WRITE, NULL, &key, NULL);
    if (res != ERROR_SUCCESS) return res;
    res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
			 (lstrlenW(value) + 1) * sizeof(WCHAR));
    RegCloseKey(key);
    return res;
}

/***********************************************************************
 *		regsvr_key_defvalueA
 */
static LONG register_key_defvalueA(
    HKEY base,
    WCHAR const *name,
    char const *value)
{
    LONG res;
    HKEY key;

    res = RegCreateKeyExW(base, name, 0, NULL, 0,
			  KEY_READ | KEY_WRITE, NULL, &key, NULL);
    if (res != ERROR_SUCCESS) return res;
    res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
			 lstrlenA(value) + 1);
    RegCloseKey(key);
    return res;
}

/***********************************************************************
 *		coclass list
 */
static GUID const CLSID_RecordInfo = {
    0x0000002F, 0x0000, 0x0000, {0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46} };

static GUID const CLSID_OldFont = {
    0x46763EE0, 0xCAB2, 0x11CE, {0x8C,0x20,0x00,0xAA,0x00,0x51,0xE5,0xD4} };

static GUID const CLSID_PSFactoryBuffer = {
    0xB196B286, 0xBAB4, 0x101A, {0xB6,0x9C,0x00,0xAA,0x00,0x34,0x1D,0x07} };

static struct regsvr_coclass const coclass_list[] = {
    {   &CLSID_RecordInfo,
	"CLSID_RecordInfo",
	NULL,
	"oleaut32.dll",
	"Both"
    },
    {   &CLSID_PSDispatch,
	"PSDispatch",
	"ole2disp.dll",
	"oleaut32.dll",
	"Both"
    },
    {   &CLSID_StdFont,
	"CLSID_StdFont",
	NULL,
	"oleaut32.dll",
	"Both",
	"Standard Font",
	"StdFont"
    },
    {   &CLSID_StdPicture,
	"CLSID_StdPict",
	NULL,
	"oleaut32.dll",
	"Apartment",
	"Standard Picture",
	"StdPicture"
    },
    {   &CLSID_PSEnumVariant,
	"PSEnumVariant",
	"ole2disp.dll",
	"oleaut32.dll",
	"Both"
    },
    {   &CLSID_PSTypeInfo,
	"PSTypeInfo",
	"ole2disp.dll",
	"oleaut32.dll",
	"Both"
    },
    {   &CLSID_PSTypeLib,
	"PSTypeLib",
	"ole2disp.dll",
	"oleaut32.dll",
	"Both"
    },
    {   &CLSID_PSOAInterface,
	"PSOAInterface",
	"ole2disp.dll",
	"oleaut32.dll",
	"Both"
    },
    {   &CLSID_PSTypeComp,
	"PSTypeComp",
	"ole2disp.dll",
	"oleaut32.dll",
	"Both"
    },
    {   &CLSID_OldFont,
	"Obsolete Font",
	NULL,
	"oleaut32.dll",
	NULL,
	"Obsolete Font",
	"OldFont"
    },
    {   &CLSID_PSFactoryBuffer,
	"PSFactoryBuffer",
	NULL,
	"oleaut32.dll",
	"Both"
    },
    { NULL }			/* list terminator */
};

/***********************************************************************
 *		interface list
 */
static struct regsvr_interface const interface_list[] = {
    {   &IID_IDispatch,
	"IDispatch",
	NULL,
	7,
	&CLSID_PSDispatch,
	&CLSID_PSDispatch
    },
    {   &IID_ITypeInfo,
	"ITypeInfo",
	NULL,
	22,
	&CLSID_PSTypeInfo,
	&CLSID_PSTypeInfo
    },
    {   &IID_ITypeLib,
	"ITypeLib",
	NULL,
	13,
	&CLSID_PSTypeLib,
	&CLSID_PSTypeLib
    },
    {   &IID_ITypeComp,
	"ITypeComp",
	NULL,
	5,
	&CLSID_PSTypeComp,
	&CLSID_PSTypeComp
    },
    {   &IID_IEnumVARIANT,
	"IEnumVARIANT",
	NULL,
	15,
	&CLSID_PSEnumVariant,
	&CLSID_PSEnumVariant
    },
    {   &IID_ICreateTypeInfo,
	"ICreateTypeInfo",
	NULL,
	26,
	NULL,
	NULL
    },
    {   &IID_ICreateTypeLib,
	"ICreateTypeLib",
	NULL,
	13,
	NULL,
	NULL
    },
    {   &IID_ITypeInfo2,
	"ITypeInfo2",
	NULL,
	32,
	NULL,
	&CLSID_PSDispatch
    },
    {   &IID_ITypeLib2,
	"ITypeLib2",
	NULL,
	16,
	NULL,
	&CLSID_PSDispatch
    },
    {   &IID_IPropertyPage2,
	"IPropertyPage2",
	NULL,
	15,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IErrorInfo,
	"IErrorInfo",
	NULL,
	8,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_ICreateErrorInfo,
	"ICreateErrorInfo",
	NULL,
	8,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IPersistPropertyBag2,
	"IPersistPropertyBag2",
	NULL,
	8,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IPropertyBag2,
	"IPropertyBag2",
	NULL,
	8,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IErrorLog,
	"IErrorLog",
	NULL,
	4,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IPerPropertyBrowsing,
	"IPerPropertyBrowsing",
	NULL,
	7,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IPersistPropertyBag,
	"IPersistPropertyBag",
	NULL,
	7,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IAdviseSinkEx,
	"IAdviseSinkEx",
	NULL,
	9,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IFontEventsDisp,
	"IFontEventsDisp",
	NULL,
	7,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IPropertyBag,
	"IPropertyBag",
	NULL,
	5,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IPointerInactive,
	"IPointerInactive",
	NULL,
	6,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_ISimpleFrameSite,
	"ISimpleFrameSite",
	NULL,
	5,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IPicture,
	"IPicture",
	NULL,
	17,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IPictureDisp,
	"IPictureDisp",
	NULL,
	7,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IPersistStreamInit,
	"IPersistStreamInit",
	NULL,
	9,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IOleUndoUnit,
	"IOleUndoUnit",
	NULL,
	7,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IPropertyNotifySink,
	"IPropertyNotifySink",
	NULL,
	5,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IOleInPlaceSiteEx,
	"IOleInPlaceSiteEx",
	NULL,
	18,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IOleParentUndoUnit,
	"IOleParentUndoUnit",
	NULL,
	12,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IProvideClassInfo2,
	"IProvideClassInfo2",
	NULL,
	5,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IProvideMultipleClassInfo,
	"IProvideMultipleClassInfo",
	NULL,
	7,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IProvideClassInfo,
	"IProvideClassInfo",
	NULL,
	4,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IConnectionPointContainer,
	"IConnectionPointContainer",
	NULL,
	5,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IEnumConnectionPoints,
	"IEnumConnectionPoints",
	NULL,
	7,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IConnectionPoint,
	"IConnectionPoint",
	NULL,
	8,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IEnumConnections,
	"IEnumConnections",
	NULL,
	7,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IOleControl,
	"IOleControl",
	NULL,
	7,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IOleControlSite,
	"IOleControlSite",
	NULL,
	10,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_ISpecifyPropertyPages,
	"ISpecifyPropertyPages",
	NULL,
	4,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IPropertyPageSite,
	"IPropertyPageSite",
	NULL,
	7,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IPropertyPage,
	"IPropertyPage",
	NULL,
	14,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IClassFactory2,
	"IClassFactory2",
	NULL,
	8,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IEnumOleUndoUnits,
	"IEnumOleUndoUnits",
	NULL,
	7,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IPersistMemory,
	"IPersistMemory",
	NULL,
	9,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IFont,
	"IFont",
	NULL,
	27,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IFontDisp,
	"IFontDisp",
	NULL,
	7,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IQuickActivate,
	"IQuickActivate",
	NULL,
	6,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IOleUndoManager,
	"IOleUndoManager",
	NULL,
	15,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    {   &IID_IObjectWithSite,
	"IObjectWithSite",
	NULL,
	5,
	NULL,
	&CLSID_PSFactoryBuffer
    },
    { NULL }			/* list terminator */
};

/***********************************************************************
 *		DllRegisterServer (OLEAUT32.@)
 */
HRESULT WINAPI DllRegisterServer(void)
{
    HRESULT hr;

    TRACE("\n");

    hr = register_coclasses(coclass_list);
    if (SUCCEEDED(hr))
	hr = register_interfaces(interface_list);
    return hr;
}

/***********************************************************************
 *		DllUnregisterServer (OLEAUT32.@)
 */
HRESULT WINAPI DllUnregisterServer(void)
{
    HRESULT hr;

    TRACE("\n");

    hr = unregister_coclasses(coclass_list);
    if (SUCCEEDED(hr))
	hr = unregister_interfaces(interface_list);
    return hr;
}
