source: trunk/tools/shared/windows/registry.cpp

Last change on this file was 846, checked in by Dmitry A. Kuminov, 14 years ago

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

File size: 5.1 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation (qt-info@nokia.com)
6**
7** This file is part of the qmake application of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at qt-info@nokia.com.
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include <QtCore/qstringlist.h>
43#include "registry_p.h"
44
45QT_BEGIN_NAMESPACE
46
47#ifdef Q_OS_WIN32
48/*!
49 Returns the path part of a registry key.
50 e.g.
51 For a key
52 "Software\\Microsoft\\VisualStudio\\8.0\\Setup\\VC\\ProductDir"
53 it returns
54 "Software\\Microsoft\\VisualStudio\\8.0\\Setup\\VC\\"
55*/
56static QString keyPath(const QString &rKey)
57{
58 int idx = rKey.lastIndexOf(QLatin1Char('\\'));
59 if (idx == -1)
60 return QString();
61 return rKey.left(idx + 1);
62}
63
64/*!
65 Returns the name part of a registry key.
66 e.g.
67 For a key
68 "Software\\Microsoft\\VisualStudio\\8.0\\Setup\\VC\\ProductDir"
69 it returns
70 "ProductDir"
71*/
72static QString keyName(const QString &rKey)
73{
74 int idx = rKey.lastIndexOf(QLatin1Char('\\'));
75 if (idx == -1)
76 return rKey;
77
78 QString res(rKey.mid(idx + 1));
79 if (res == QLatin1String("Default") || res == QLatin1String("."))
80 res = QString();
81 return res;
82}
83#endif
84
85QString qt_readRegistryKey(HKEY parentHandle, const QString &rSubkey)
86{
87 QString result;
88
89#ifdef Q_OS_WIN32
90 QString rSubkeyName = keyName(rSubkey);
91 QString rSubkeyPath = keyPath(rSubkey);
92
93 HKEY handle = 0;
94 LONG res = RegOpenKeyEx(parentHandle, (wchar_t*)rSubkeyPath.utf16(), 0, KEY_READ, &handle);
95
96 if (res != ERROR_SUCCESS)
97 return QString();
98
99 // get the size and type of the value
100 DWORD dataType;
101 DWORD dataSize;
102 res = RegQueryValueEx(handle, (wchar_t*)rSubkeyName.utf16(), 0, &dataType, 0, &dataSize);
103 if (res != ERROR_SUCCESS) {
104 RegCloseKey(handle);
105 return QString();
106 }
107
108 // get the value
109 QByteArray data(dataSize, 0);
110 res = RegQueryValueEx(handle, (wchar_t*)rSubkeyName.utf16(), 0, 0,
111 reinterpret_cast<unsigned char*>(data.data()), &dataSize);
112 if (res != ERROR_SUCCESS) {
113 RegCloseKey(handle);
114 return QString();
115 }
116
117 switch (dataType) {
118 case REG_EXPAND_SZ:
119 case REG_SZ: {
120 result = QString::fromWCharArray(((const wchar_t *)data.constData()));
121 break;
122 }
123
124 case REG_MULTI_SZ: {
125 QStringList l;
126 int i = 0;
127 for (;;) {
128 QString s = QString::fromWCharArray((const wchar_t *)data.constData() + i);
129 i += s.length() + 1;
130
131 if (s.isEmpty())
132 break;
133 l.append(s);
134 }
135 result = l.join(QLatin1String(", "));
136 break;
137 }
138
139 case REG_NONE:
140 case REG_BINARY: {
141 result = QString::fromWCharArray((const wchar_t *)data.constData(), data.size() / 2);
142 break;
143 }
144
145 case REG_DWORD_BIG_ENDIAN:
146 case REG_DWORD: {
147 Q_ASSERT(data.size() == sizeof(int));
148 int i;
149 memcpy((char*)&i, data.constData(), sizeof(int));
150 result = QString::number(i);
151 break;
152 }
153
154 default:
155 qWarning("QSettings: unknown data %u type in windows registry", quint32(dataType));
156 break;
157 }
158
159 RegCloseKey(handle);
160#else
161 Q_UNUSED(parentHandle);
162 Q_UNUSED(rSubkey)
163#endif
164
165 return result;
166}
167
168QT_END_NAMESPACE
169
Note: See TracBrowser for help on using the repository browser.