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);