sigar/bindings/java/src/jni/win32/metabase.cpp
2004-11-20 21:01:16 +00:00

283 lines
8.9 KiB
C++

#ifdef WIN32
#define UNICODE
#define _UNICODE
#define _WIN32_DCOM
#define INITGUID
#include <objbase.h> // COM Interface header file.
#include <iadmw.h> // COM Interface header file.
#include <iiscnfg.h> // MD_ & IIS_MD_ #defines header file.
#include <ks.h>
#include <atlBase.h> // ATL support header file.
#include "win32bindings.h"
#include "javasigar.h"
#ifdef __cplusplus
extern "C" {
#endif
static jfieldID ptr_field = 0;
static jfieldID IMeta_field = 0;
JNIEXPORT void SIGAR_JNI(win32_MetaBase_MetaBaseClose)
(JNIEnv *env, jobject cur)
{
CComPtr <IMSAdminBase> *pIMeta;
pIMeta = (CComPtr <IMSAdminBase> *)env->GetLongField(cur, IMeta_field);
METADATA_HANDLE MyHandle;
MyHandle = (METADATA_HANDLE)env->GetIntField(cur, ptr_field);
(*pIMeta)->CloseKey(MyHandle);
}
JNIEXPORT void SIGAR_JNI(win32_MetaBase_MetaBaseRelease)
(JNIEnv *env, jobject cur)
{
CComPtr <IMSAdminBase> *pIMeta;
pIMeta = (CComPtr <IMSAdminBase> *)env->GetLongField(cur, IMeta_field);
pIMeta->Release();
delete pIMeta;
env->SetIntField(cur, ptr_field, 0);
CoUninitialize();
}
JNIEXPORT jstring SIGAR_JNI(win32_MetaBase_MetaBaseEnumKey)
(JNIEnv *env, jobject cur, jint index)
{
HRESULT hRes = 0;
METADATA_HANDLE MyHandle;
DWORD dwBufLen = 8096;
DWORD dwReqBufLen = 0;
TCHAR pbBuffer[METADATA_MAX_NAME_LEN];
CComPtr <IMSAdminBase> *pIMeta;
pIMeta = (CComPtr <IMSAdminBase> *)env->GetLongField(cur, IMeta_field);
MyHandle = (METADATA_HANDLE)env->GetIntField(cur, ptr_field);
hRes = (*pIMeta)->EnumKeys(MyHandle, TEXT(""), pbBuffer, index);
if (SUCCEEDED(hRes)) {
jstring strResult;
// Store the data identifiers in an array for future use.
// Note: declare a suitable DWORD array for names and add
// array bounds checking.
strResult = env->NewString((const jchar *)pbBuffer, lstrlen(pbBuffer));
return strResult;
} else if (hRes == HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS)) {
return NULL;
}
jclass cls = env->FindClass(WIN32_PACKAGE "Win32Exception");
env->ThrowNew(cls, "MetaBaseEnumKey");
return NULL;
}
JNIEXPORT jlong SIGAR_JNI(win32_MetaBase_MetaBaseInit)
(JNIEnv *env, jobject cur)
{
CComPtr <IMSAdminBase> *pIMeta;
HRESULT hRes = 0;
hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (FAILED(hRes)) {
jclass cls = env->FindClass(WIN32_PACKAGE "Win32Exception");
env->ThrowNew(cls, "MetaBaseInit");
return 0;
}
pIMeta = new (CComPtr <IMSAdminBase>);
hRes = CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL,
IID_IMSAdminBase, (void **)pIMeta);
if (FAILED(hRes)) {
jclass cls = env->FindClass(WIN32_PACKAGE "Win32Exception");
env->ThrowNew(cls, "MetaBaseInit: Can't CoCreateInstance");
return 0;
}
jclass cls = env->GetObjectClass(cur);
ptr_field = env->GetFieldID(cls, "m_handle", "I");
IMeta_field = env->GetFieldID(cls, "pIMeta", "J");
return (jlong)pIMeta;
}
static void MetaBaseOpenSubKey(JNIEnv *env, jobject cur,
jstring path, METADATA_HANDLE MyHandle)
{
HRESULT hRes = 0;
CComPtr <IMSAdminBase> *pIMeta;
pIMeta = (CComPtr <IMSAdminBase> *)env->GetLongField(cur, IMeta_field);
// Get a handle to the Web service.
LPCTSTR lpSubkey = (LPCTSTR)env->GetStringChars(path, NULL);
hRes = (*pIMeta)->OpenKey(MyHandle, lpSubkey,
METADATA_PERMISSION_READ, 20, &MyHandle);
env->ReleaseStringChars(path, (const jchar *)lpSubkey);
if (FAILED(hRes)) {
jclass cls = env->FindClass(WIN32_PACKAGE "Win32Exception");
env->ThrowNew(cls, "Can't open Sub Key");
return;
}
env->SetIntField(cur, ptr_field, MyHandle);
}
JNIEXPORT void SIGAR_JNI(win32_MetaBase_MetaBaseOpenSubKey)
(JNIEnv *env, jobject cur, jstring path)
{
METADATA_HANDLE MyHandle;
MyHandle = (METADATA_HANDLE)env->GetIntField(cur, ptr_field);
MetaBaseOpenSubKey(env, cur, path, MyHandle);
}
JNIEXPORT void SIGAR_JNI(win32_MetaBase_MetaBaseOpenSubKeyAbs)
(JNIEnv *env, jobject cur, jstring path)
{
MetaBaseOpenSubKey(env, cur, path, METADATA_MASTER_ROOT_HANDLE);
}
JNIEXPORT jint SIGAR_JNI(win32_MetaBase_MetaBaseGetIntValue)
(JNIEnv *env, jobject cur, jint key)
{
HRESULT hRes = 0;
METADATA_HANDLE MyHandle;
METADATA_RECORD MyRecord;
DWORD dwBufLen = 8096;
DWORD dwReqBufLen = 0;
TCHAR pbBuffer[8096];
CComPtr <IMSAdminBase> *pIMeta;
pIMeta = (CComPtr <IMSAdminBase> *)env->GetLongField(cur, IMeta_field);
MyHandle = (METADATA_HANDLE)env->GetIntField(cur, ptr_field);
// Initialize the input structure -
// the values specify what kind of data to enumerate.
MyRecord.dwMDIdentifier = key;
MyRecord.dwMDAttributes = 0;
MyRecord.dwMDUserType = IIS_MD_UT_SERVER;
MyRecord.dwMDDataType = DWORD_METADATA;
MyRecord.dwMDDataLen = dwBufLen;
MyRecord.pbMDData = (unsigned char *)pbBuffer;
// Enumerate the data of the first virtual Web server,
// checking to ensure that the data returned does not
// overflow the buffer.
hRes = (*pIMeta)->GetData(MyHandle, TEXT(""), &MyRecord, &dwReqBufLen);
if (SUCCEEDED(hRes)) {
int ret = (int)MyRecord.pbMDData;
return ret;
}
jclass cls = env->FindClass(WIN32_PACKAGE "Win32Exception");
env->ThrowNew(cls, "No such Int value");
return 0;
}
JNIEXPORT jstring SIGAR_JNI(win32_MetaBase_MetaBaseGetStringValue)
(JNIEnv *env, jobject cur, jint key)
{
HRESULT hRes = 0;
METADATA_HANDLE MyHandle;
METADATA_RECORD MyRecord;
DWORD dwBufLen = 8096;
DWORD dwReqBufLen = 0;
TCHAR pbBuffer[8096];
CComPtr <IMSAdminBase> *pIMeta;
pIMeta = (CComPtr <IMSAdminBase> *)env->GetLongField(cur, IMeta_field);
MyHandle = (METADATA_HANDLE)env->GetIntField(cur, ptr_field);
// Initialize the input structure -
// the values specify what kind of data to enumerate.
MyRecord.dwMDIdentifier = key;
MyRecord.dwMDAttributes = 0;
MyRecord.dwMDUserType = IIS_MD_UT_SERVER;
MyRecord.dwMDDataType = STRING_METADATA;
MyRecord.dwMDDataLen = dwBufLen;
MyRecord.pbMDData = (unsigned char *)pbBuffer;
hRes = (*pIMeta)->GetData(MyHandle, TEXT(""), &MyRecord, &dwReqBufLen);
if (SUCCEEDED(hRes)) {
jstring strResult;
// Store the data identifiers in an array for future use.
// Note: declare a suitable DWORD array for names and add
// array bounds checking.
strResult = env->NewString((const jchar *)MyRecord.pbMDData,
lstrlen(pbBuffer));
return strResult;
}
jclass cls = env->FindClass(WIN32_PACKAGE "Win32Exception");
env->ThrowNew(cls, "No Such string value");
return NULL;
}
JNIEXPORT jobjectArray SIGAR_JNI(win32_MetaBase_MetaBaseGetMultiStringValue)
(JNIEnv *env, jobject cur, jint key)
{
HRESULT hRes = 0;
METADATA_HANDLE MyHandle;
METADATA_RECORD MyRecord;
DWORD dwBufLen = 8096;
DWORD dwReqBufLen = 0;
TCHAR pbBuffer[8096];
CComPtr <IMSAdminBase> *pIMeta;
pIMeta = (CComPtr <IMSAdminBase> *)env->GetLongField(cur, IMeta_field);
MyHandle = (METADATA_HANDLE)env->GetIntField(cur, ptr_field);
// Initialize the input structure -
// the values specify what kind of data to enumerate.
MyRecord.dwMDIdentifier = key;
MyRecord.dwMDAttributes = 0;
MyRecord.dwMDUserType = IIS_MD_UT_SERVER;
MyRecord.dwMDDataType = MULTISZ_METADATA;
MyRecord.dwMDDataLen = dwBufLen;
MyRecord.pbMDData = (unsigned char *)pbBuffer;
hRes = (*pIMeta)->GetData(MyHandle, TEXT(""), &MyRecord, &dwReqBufLen);
if (SUCCEEDED(hRes)) {
TCHAR *szThisInstance = NULL;
jobjectArray ret = NULL;
int i;
// Start at -1 to account for the \0 at the end of the
// list.
int count = -1;
// Count # of objects in dwInstanceList
for (i = 0; i < MyRecord.dwMDDataLen; i+=2) {
if ((TCHAR)MyRecord.pbMDData[i] == '\0') {
count++;
}
}
ret = (jobjectArray)env->
NewObjectArray(count,
env->FindClass("java/lang/String"),
env->NewString((const jchar *)"", 1));
// Walk the return instance list, creating an array
for (szThisInstance = (TCHAR *)MyRecord.pbMDData, i = 0;
*szThisInstance != 0;
szThisInstance += lstrlen(szThisInstance) + 1, i++)
{
env->SetObjectArrayElement(ret,i,env->NewString(
(const jchar *)(LPCTSTR)szThisInstance,
lstrlen(szThisInstance)));
}
return ret;
}
jclass cls = env->FindClass(WIN32_PACKAGE "Win32Exception");
env->ThrowNew(cls, "No Such string value");
return NULL;
}
#ifdef __cplusplus
}
#endif
#endif /* WIN32 */