/*
 *	MSXML3 self-registerable dll functions
 *
 * Copyright (C) 2003 John K. Hohm
 * Copyright (C) 2006 Robert Shearman
 * Copyright (C) 2008 Alistair Leslie-Hughes
 *
 * 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 "config.h"

#include <stdarg.h>
#include <string.h>

#define COBJMACROS

#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "winreg.h"
#include "winerror.h"
#include "ole2.h"
#include "msxml.h"
#include "xmldom.h"
#include "xmldso.h"
#include "msxml2.h"

/* undef the #define in msxml2 so that we can access the v.2 version
   independent CLSID as well as the v.3 one. */
#undef CLSID_DOMDocument

#include "msxml_private.h"

#include "wine/debug.h"
#include "wine/unicode.h"

WINE_DEFAULT_DEBUG_CHANNEL(msxml);

/*
 * 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 progid;		/* can be NULL to omit */
    LPCSTR version;		/* can be NULL to omit */
};

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

struct progid
{
    LPCSTR name;		/* NULL for end of list */
    LPCSTR description;		/* can be NULL to omit */
    CLSID const *clsid;
    LPCSTR curver;		/* can be NULL to omit */
};

static HRESULT register_progids(struct progid const *list);
static HRESULT unregister_progids(struct progid 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 WCHAR const versionindependentprogid_keyname[] = {
    'V', 'e', 'r', 's', 'i', 'o', 'n',
    'I', 'n', 'd', 'e', 'p', 'e', 'n', 'd', 'e', 'n', 't',
    'P', 'r', 'o', 'g', 'I', 'D', 0 };
static WCHAR const version_keyname[] = {
    'V', 'e', 'r', 's', 'i', 'o', 'n', 0 };
static WCHAR const curver_keyname[] = {
    'C', 'u', 'r', 'V', 'e', 'r', 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;

	    sprintfW(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->progid) {
            char *buffer = NULL;
            LPCSTR progid;

	    if (list->version) {
		buffer = HeapAlloc(GetProcessHeap(), 0, strlen(list->progid) + strlen(list->version) + 2);
		if (!buffer) {
		    res = ERROR_OUTOFMEMORY;
		    goto error_close_clsid_key;
		}
		strcpy(buffer, list->progid);
		strcat(buffer, ".");
		strcat(buffer, list->version);
		progid = buffer;
	    } else
		progid = list->progid;
	    res = register_key_defvalueA(clsid_key, progid_keyname,
					 progid);
	    HeapFree(GetProcessHeap(), 0, buffer);
	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;

	    if (list->version) {
	        res = register_key_defvalueA(clsid_key, versionindependentprogid_keyname,
					     list->progid);
		if (res != ERROR_SUCCESS) goto error_close_clsid_key;
	    }
	}

	if (list->version) {
	    res = register_key_defvalueA(clsid_key, version_keyname,
					 list->version);
	    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;
    }

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

/***********************************************************************
 *		register_progids
 */
static HRESULT register_progids(struct progid const *list)
{
    LONG res = ERROR_SUCCESS;

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

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

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

	StringFromGUID2(list->clsid, buf, 39);

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

	if (list->curver) {
	    res = register_key_defvalueA(progid_key, curver_keyname, list->curver);
	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;
	}

    error_close_clsid_key:
	RegCloseKey(progid_key);
    }

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

/***********************************************************************
 *		unregister_progids
 */
static HRESULT unregister_progids(struct progid const *list)
{
    LONG res = ERROR_SUCCESS;

    for (; res == ERROR_SUCCESS && list->name; ++list) {
	res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->name);
	if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
    }

    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 struct regsvr_coclass const coclass_list[] = {
    {   &CLSID_DOMDocument,
	"XML DOM Document",
	NULL,
	"msxml3.dll",
	"Both",
	"Microsoft.XMLDOM",
	"1.0"
    },
    {   &CLSID_DOMDocument2,
        "XML DOM Document",
        NULL,
        "msxml3.dll",
        "Both",
        "Msxml2.DOMDocument",
        "3.0"
    },
    {   &CLSID_DOMDocument30,
        "XML DOM Document 3.0",
        NULL,
        "msxml3.dll",
        "Both",
        "Msxml2.DOMDocument",
        "3.0"
    },
    {   &CLSID_DOMFreeThreadedDocument,
	"Free threaded XML DOM Document",
	NULL,
	"msxml3.dll",
	"Both",
	"Microsoft.FreeThreadedXMLDOM",
	"1.0"
    },
    {   &CLSID_DOMFreeThreadedDocument,
        "Free threaded XML DOM Document",
        NULL,
        "msxml3.dll",
        "Both",
        "Microsoft.FreeThreadedXMLDOM",
        NULL
    },
    {   &CLSID_FreeThreadedDOMDocument,
        "Free Threaded XML DOM Document",
        NULL,
        "msxml3.dll",
        "Both",
        "Microsoft.FreeThreadedXMLDOM.1.0",
        "1.0"
    },
    {   &CLSID_FreeThreadedDOMDocument26,
        "Free Threaded XML DOM Document 2.6",
        NULL,
        "msxml3.dll",
        "Both",
        "Microsoft.FreeThreadedXMLDOM.1.0",
        "1.0"
     },
    {   &CLSID_FreeThreadedDOMDocument30,
        "Free Threaded XML DOM Document 3.0",
        NULL,
        "msxml3.dll",
        "Both",
        "Microsoft.FreeThreadedDOMDocument.1.0",
        "1.0"
     },
    {   &CLSID_XMLHTTPRequest,
	"XML HTTP Request",
	NULL,
	"msxml3.dll",
	"Apartment",
	"Microsoft.XMLHTTP",
	"1.0"
    },
    {   &CLSID_XMLDSOControl,
	"XML Data Source Object",
	NULL,
	"msxml3.dll",
	"Apartment",
	"Microsoft.XMLDSO",
	"1.0"
    },
    {   &CLSID_XMLDocument,
	"Msxml",
	NULL,
	"msxml3.dll",
	"Both",
	"Msxml"
    },
    {   &CLSID_XMLSchemaCache,
	"XML Schema Cache",
	NULL,
	"msxml3.dll",
	"Both",
	"Msxml2.XMLSchemaCache",
        "3.0"
    },
    {   &CLSID_XMLSchemaCache26,
    "XML Schema Cache 2.6",
    NULL,
    "msxml3.dll",
    "Both",
    "Msxml2.XMLSchemaCache",
    "2.6"
    },
    {   &CLSID_XMLSchemaCache30,
	"XML Schema Cache 3.0",
	NULL,
	"msxml3.dll",
	"Both",
	"Msxml2.XMLSchemaCache",
        "3.0"
    },
    {   &CLSID_SAXXMLReader,
        "SAX XML Reader",
        NULL,
        "msxml3.dll",
        "Both",
        "Msxml2.SAXXMLReader",
        "3.0"
    },
    {   &CLSID_SAXXMLReader30,
        "SAX XML Reader 3.0",
        NULL,
        "msxml3.dll",
        "Both",
        "Msxml2.SAXXMLReader",
        "3.0"
    },
    {   &CLSID_MXXMLWriter,
        "IMXWriter interface",
        NULL,
        "msxml3.dll",
        "Both",
        "Msxml2.MXXMLWriter",
        "3.0"
    },
    {   &CLSID_MXXMLWriter30,
        "IMXWriter interface 3.0",
        NULL,
        "msxml3.dll",
        "Both",
        "Msxml2.MXXMLWriter",
        "3.0"
    },
    {   &CLSID_SAXAttributes,
        "SAX Attribute",
        NULL,
        "msxml3.dll",
        "Both",
        "Msxml2.SAXAttributes",
        NULL
    },
    {   &CLSID_SAXAttributes30,
        "SAX Attribute 3.0",
        NULL,
        "msxml3.dll",
        "Both",
        "Msxml2.SAXAttributes",
        "3.0"
    },
    { NULL }			/* list terminator */
};

/***********************************************************************
 *		interface list
 */
static struct regsvr_interface const interface_list[] = {
    { NULL }			/* list terminator */
};

/***********************************************************************
 *		progid list
 */
static struct progid const progid_list[] = {
    {   "Microsoft.XMLDOM",
	"XML DOM Document",
	&CLSID_DOMDocument,
	"Microsoft.XMLDOM.1.0"
    },
    {   "Microsoft.XMLDOM.1.0",
	"XML DOM Document",
	&CLSID_DOMDocument,
	NULL
    },
    {   "MSXML.DOMDocument",
	"XML DOM Document",
	&CLSID_DOMDocument,
	"Microsoft.XMLDOM.1.0"
    },
    {   "Msxml2.DOMDocument",
        "XML DOM Document",
        &CLSID_DOMDocument2,
        "Msxml2.DOMDocument.3.0"
    },
    {   "Msxml2.DOMDocument.3.0",
        "XML DOM Document 3.0",
        &CLSID_DOMDocument30,
        NULL
    },
    {   "Microsoft.FreeThreadedXMLDOM",
	"Free threaded XML DOM Document",
	&CLSID_DOMFreeThreadedDocument,
	"Microsoft.FreeThreadedXMLDOM.1.0"
    },
    {   "Microsoft.FreeThreadedXMLDOM.1.0",
	"Free threaded XML DOM Document",
	&CLSID_DOMFreeThreadedDocument,
	NULL
    },
    {   "MSXML.FreeThreadedDOMDocument",
	"Free threaded XML DOM Document",
	&CLSID_DOMFreeThreadedDocument,
	"Microsoft.FreeThreadedXMLDOM.1.0"
    },
    {   "MSXML.FreeThreadedDOMDocument26",
    "Free threaded XML DOM Document 2.6",
    &CLSID_FreeThreadedDOMDocument26,
    NULL
    },
    {   "MSXML.FreeThreadedDOMDocument30",
    "Free threaded XML DOM Document 3.0",
    &CLSID_FreeThreadedDOMDocument30,
    NULL
    },
    {   "Microsoft.XMLHTTP",
	"XML HTTP Request",
	&CLSID_XMLHTTPRequest,
	"Microsoft.XMLHTTP.1.0"
    },
    {   "Microsoft.XMLHTTP.1.0",
	"XML HTTP Request",
	&CLSID_XMLHTTPRequest,
	NULL
    },
    {   "Microsoft.XMLDSO",
	"XML Data Source Object",
	&CLSID_XMLDSOControl,
	"Microsoft.XMLDSO.1.0"
    },
    {   "Microsoft.XMLDSO.1.0",
	"XML Data Source Object",
	&CLSID_XMLDSOControl,
	NULL
    },
    {   "Msxml",
	"Msxml",
	&CLSID_XMLDocument,
	NULL
    },
    {   "Msxml2.XMLSchemaCache",
        "XML Schema Cache",
        &CLSID_XMLSchemaCache,
        "Msxml2.XMLSchemaCache.3.0"
    },
    {   "Msxml2.XMLSchemaCache.2.6",
        "XML Schema Cache 2.6",
        &CLSID_XMLSchemaCache26,
        "Msxml2.XMLSchemaCache.2.6"
    },
    {   "Msxml2.XMLSchemaCache.3.0",
        "XML Schema Cache 3.0",
        &CLSID_XMLSchemaCache30,
        NULL
    },
    {   "Msxml2.SAXXMLReader",
        "SAX XML Reader",
        &CLSID_SAXXMLReader,
        "Msxml2.SAXXMLReader.3.0"
    },
    {   "Msxml2.SAXXMLReader.3.0",
        "SAX XML Reader 3.0",
        &CLSID_SAXXMLReader30,
        NULL
    },
    {   "Msxml2.MXXMLWriter",
        "MXXMLWriter",
        &CLSID_MXXMLWriter,
        "Msxml2.MXXMLWriter.3.0"
    },
    {   "Msxml2.MXXMLWriter.3.0",
        "MXXMLWriter 3.0",
        &CLSID_MXXMLWriter30,
        NULL
    },
    {   "Msxml2.SAXAttributes",
        "SAX Attribute",
        &CLSID_SAXAttributes,
        NULL
    },
    {   "Msxml2.SAXAttributes.3.0",
        "SAX Attribute 3.0",
        &CLSID_SAXAttributes30,
        NULL
    },
    { NULL }			/* list terminator */
};

/***********************************************************************
 *		DllRegisterServer (MSXML3.@)
 */
HRESULT WINAPI DllRegisterServer(void)
{
    HRESULT hr;
    ITypeLib *tl;
    static const WCHAR wszMsXml3[] = {'m','s','x','m','l','3','.','d','l','l',0};

    TRACE("\n");

    hr = register_coclasses(coclass_list);
    if (SUCCEEDED(hr))
	hr = register_interfaces(interface_list);
    if (SUCCEEDED(hr))
	hr = register_progids(progid_list);

    if(SUCCEEDED(hr)) {

        hr = LoadTypeLibEx(wszMsXml3, REGKIND_REGISTER, &tl);
        if(SUCCEEDED(hr))
            ITypeLib_Release(tl);
    }

    return hr;
}

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

    TRACE("\n");

    hr = unregister_coclasses(coclass_list);
    if (SUCCEEDED(hr))
	hr = unregister_interfaces(interface_list);
    if (SUCCEEDED(hr))
	hr = unregister_progids(progid_list);
    if (SUCCEEDED(hr))
        hr = UnRegisterTypeLib(&LIBID_MSXML2, 3, 0, LOCALE_SYSTEM_DEFAULT, SYS_WIN32);

    return hr;
}
