blob: 16e33bfe8875fa0bb04a974550eb561949871b49 [file] [log] [blame]
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Defines a map for adding variables to rgs files. This allows COM object
// classes to declare the values of these variables so that we don't need to
// copy/paste them and manually keep them in sync.
// To use this, declare the registry ID of your RGS file using
// the DECLARE_REGISTRY_RESOURCEID_EX macro, instead of the
// DECLARE_REGISTRY_RESOURCEID, then add a registry map to your class
// using the registry map macros:
// BEGIN_REGISTRY_MAP(MyClassName)
// REGMAP_ENTRY("NAME", "MyClassName Class")
// REGMAP_ENTRY_UUID("CLSID", CLSID_MyClassName)
// END_REGISTRY_MAP()
//
// You can then refer to the names above in your RGS file as
// variables %NAME% and %CLSID%, respectively.
#ifndef BASE_WIN_RGS_HELPER_H_
#define BASE_WIN_RGS_HELPER_H_
#include "base/string_util.h"
struct ATLRegmapEntryHelper : public _ATL_REGMAP_ENTRY {
ATLRegmapEntryHelper() {
szKey = NULL;
szData = NULL;
}
ATLRegmapEntryHelper(LPCOLESTR key, LPCOLESTR data) {
szKey = key;
size_t size = lstrlen(data) + 1;
szData = new wchar_t[size];
base::wcslcpy(const_cast<wchar_t*>(szData), data, size);
}
ATLRegmapEntryHelper(LPCOLESTR key, UINT resid) {
wchar_t data[256] = {0};
szKey = key;
if (::LoadString(_pModule->m_hInstResource, resid, data,
arraysize(data) - 1) == 0) {
*data = L'\0';
}
size_t size = lstrlen(data) + 1;
szData = new wchar_t[size];
base::wcslcpy(const_cast<wchar_t*>(szData), data, size);
}
ATLRegmapEntryHelper(LPCOLESTR key, REFGUID guid) {
szKey = key;
static const size_t kGuidStringSize = 40;
szData = new wchar_t[kGuidStringSize];
if (szData) {
if (::StringFromGUID2(guid, const_cast<LPOLESTR>(szData),
kGuidStringSize) == 0) {
*const_cast<LPOLESTR>(szData) = L'\0';
}
}
}
~ATLRegmapEntryHelper() {
delete [] szData;
}
};
#define BEGIN_REGISTRY_MAP(x)\
static struct _ATL_REGMAP_ENTRY *_GetRegistryMap() {\
static const ATLRegmapEntryHelper map[] = {
#define REGMAP_ENTRY(x, y) ATLRegmapEntryHelper(OLESTR(##x), OLESTR(##y)),
#define REGMAP_UUID(x, clsid) ATLRegmapEntryHelper(OLESTR(##x), clsid),
// This allows usage of a Resource string.
#define REGMAP_RESOURCE(x, resid) ATLRegmapEntryHelper(OLESTR(##x), resid),
// This allows usage of a static function to be called to provide the string.
#define REGMAP_FUNCTION(x, f) ATLRegmapEntryHelper(OLESTR(##x), ##f()),
#define END_REGISTRY_MAP() ATLRegmapEntryHelper() };\
return (_ATL_REGMAP_ENTRY*)map;\
}
#define DECLARE_REGISTRY_RESOURCEID_EX(x)\
static HRESULT WINAPI UpdateRegistry(BOOL bRegister) {\
return ATL::_pAtlModule->UpdateRegistryFromResource((UINT)x, bRegister, \
_GetRegistryMap());\
}
#endif // BASE_WIN_RGS_HELPER_H_