00001
00002
00003
00004
00005
00006
00007
#include "unipstoregen.h"
00008
#include "wvmoniker.h"
00009
#include <string>
00010
00011 static const int MAX = 1024;
00012
00013
using namespace PSTORECLib;
00014
00015 typedef HRESULT (WINAPI *
PStoreCreateInstancePtr)(IPStore **, DWORD, DWORD, DWORD);
00016
00017 HRESULT UniPStoreGen::create_types(
WvString type_name,
WvString subtype_name)
00018 {
00019 HRESULT hRes;
00020
00021 _PST_TYPEINFO myTypeInfo;
00022 myTypeInfo.cbSize = strlen(type_name.
cstr()) + 1;
00023 myTypeInfo.szDisplayName =
new wchar_t[myTypeInfo.cbSize];
00024 mbstowcs(myTypeInfo.szDisplayName, type_name.
cstr(), myTypeInfo.cbSize);
00025
00026 _PST_TYPEINFO mySubTypeInfo;
00027 mySubTypeInfo.cbSize = strlen(subtype_name.
cstr()) + 1;
00028 mySubTypeInfo.szDisplayName =
new wchar_t[mySubTypeInfo.cbSize];
00029 mbstowcs(mySubTypeInfo.szDisplayName, subtype_name.
cstr(), mySubTypeInfo.cbSize);
00030
00031 _PST_ACCESSRULESET myRuleSet;
00032 myRuleSet.cbSize =
sizeof(myRuleSet);
00033 myRuleSet.cRules = 0;
00034 myRuleSet.rgRules = 0;
00035
00036 hRes = m_spPStore->CreateType( m_key, &m_type, &myTypeInfo, 0);
00037
00038
if ((hRes !=
PST_E_OK) && (hRes !=
PST_E_TYPE_EXISTS))
00039 {
00040 m_log(
"CreateSubtype() returned: %s\n", hRes);
00041
goto done;
00042 }
00043
00044 hRes = m_spPStore->CreateSubtype( m_key, &m_type, &m_subtype, &mySubTypeInfo, &myRuleSet, 0);
00045
if ((hRes !=
PST_E_OK) && (hRes !=
PST_E_TYPE_EXISTS))
00046 {
00047 m_log(
"CreateSubtype() returned: %s\n", hRes);
00048
goto done;
00049 }
00050
00051 done:
00052
delete[] myTypeInfo.szDisplayName;
00053
delete[] mySubTypeInfo.szDisplayName;
00054
return hRes;
00055 }
00056
00057
00058
00059 UniPStoreGen::UniPStoreGen(
WvString _moniker) :
00060 m_log(_moniker), m_key(-1)
00061 {
00062
00063 m_hPstoreDLL = LoadLibrary(
"pstorec.dll");
00064 assert(m_hPstoreDLL);
00065
00066
PStoreCreateInstancePtr pPStoreCreateInstance =
00067 (
PStoreCreateInstancePtr) GetProcAddress(m_hPstoreDLL,
"PStoreCreateInstance");
00068 assert(pPStoreCreateInstance);
00069
00070 HRESULT hr = pPStoreCreateInstance(&m_spPStore, 0, 0, 0);
00071 assert(SUCCEEDED(hr));
00072
00073
00074
char *moniker = _moniker.
edit();
00075
const char *seps =
":";
00076
WvString _key = strtok(moniker, seps);
00077
WvString type_name = strtok(NULL, seps);
00078
WvString _type_guid = strtok(NULL, seps);
00079
WvString subtype_name = strtok(NULL, seps);
00080
WvString _subtype_guid = strtok(NULL, seps);
00081
00082
if (!!_key && strcmp(_key,
"PST_KEY_CURRENT_USER") == 0)
00083 {
00084 m_key =
PST_KEY_CURRENT_USER;
00085 }
00086
else if (!!_key && strcmp(_key,
"PST_KEY_LOCAL_MACHINE") == 0)
00087 {
00088 m_key =
PST_KEY_LOCAL_MACHINE;
00089 }
00090
00091
if ((m_key >= 0) && !!type_name && !!_type_guid && !!subtype_name && !!_subtype_guid)
00092 {
00093 HRESULT hr;
00094 hr = UuidFromString((
unsigned char*)_type_guid.
edit(), &m_type);
00095 hr = UuidFromString((
unsigned char*)_subtype_guid.
edit(), &m_subtype);
00096
int result = create_types(type_name, subtype_name);
00097 assert(SUCCEEDED( result ) || (result ==
PST_E_TYPE_EXISTS));
00098 }
00099 }
00100
00101 UniPStoreGen::~UniPStoreGen()
00102 {
00103
if (m_hPstoreDLL)
00104 {
00105 FreeLibrary(m_hPstoreDLL);
00106 m_hPstoreDLL = 0;
00107 }
00108 }
00109
00110 bool UniPStoreGen::isok()
00111 {
00112
return m_key >= 0;
00113 }
00114
00115
00116 WvString UniPStoreGen::get(
const UniConfKey &key)
00117 {
00118 HRESULT hRes;
00119
WvString value = WvString::null;
00120
00121
unsigned char *data;
00122
unsigned long cbdata;
00123
00124
WvString _name = key.
last().
printable();
00125 WCHAR name[
MAX];
00126 mbstowcs(name, _name.
cstr(),
MAX);
00127
00128 hRes = m_spPStore->ReadItem(
00129 m_key,
00130 &m_type,
00131 &m_subtype,
00132 name,
00133 &cbdata,
00134 &data,
00135 NULL,
00136 0
00137 );
00138
00139
if (hRes ==
PST_E_OK)
00140 {
00141 value = (
char*) data;
00142 CoTaskMemFree(data);
00143 }
00144
00145
return value;
00146 }
00147
00148 void UniPStoreGen::set(
const UniConfKey &key,
WvStringParm value)
00149 {
00150 HRESULT hRes;
00151
unsigned char *data = (
unsigned char *) value.
cstr();
00152
00153
WvString _name = key.
last().
printable();
00154 WCHAR name[
MAX];
00155 mbstowcs(name, _name.
cstr(),
MAX);
00156
00157 DWORD cbdata = DWORD((strlen(value.
cstr()) + 1) *
sizeof(
char));
00158
00159 hRes = m_spPStore->WriteItem(
00160 m_key,
00161 &m_type,
00162 &m_subtype,
00163 name,
00164 cbdata,
00165 data,
00166 NULL,
00167
PST_CF_NONE,
00168 0
00169 );
00170
00171
if (hRes ==
PST_E_OK)
00172 {
00173 delta(key, value);
00174 }
00175 }
00176
00177 bool UniPStoreGen::exists(
const UniConfKey &key)
00178 {
00179
return false;
00180 }
00181
00182 bool UniPStoreGen::haschildren(
const UniConfKey &key)
00183 {
00184
return false;
00185 }
00186
00187 UniConfGen::Iter *
UniPStoreGen::iterator(
const UniConfKey &key)
00188 {
00189
return new NullIter();
00190 }
00191
00192 static UniConfGen *
creator(
WvStringParm s,
IObject *,
void *)
00193 {
00194
return new UniPStoreGen(s);
00195 }
00196
00197
#pragma warning(disable : 4073)
00198
#pragma init_seg(lib)
00199
WvMoniker<UniConfGen> UniPStoreGenMoniker(
"pstore", creator);