|
|
// conndlg.cpp : implementation file
//
// Commenting #define out - causing compiler error - not sure if needed, compiles
// okay without it.
//#define WINVER 0x0400
#include "precomp.h"
#include "afxtempl.h"
#include <comdef.h> //for _bstr_t
#include "resource.h"
#include "wbemidl.h"
#include <comdef.h>
//smart pointer
_COM_SMARTPTR_TYPEDEF(IWbemServices, IID_IWbemServices); _COM_SMARTPTR_TYPEDEF(IEnumWbemClassObject, IID_IEnumWbemClassObject); //_COM_SMARTPTR_TYPEDEF(IWbemContext, IID_IWbemContext );
_COM_SMARTPTR_TYPEDEF(IWbemLocator, IID_IWbemLocator);
#include "drdbdr.h"
#include "Browse.h"
#include "dlgcback.h"
#include "cominit.h" //for Dcom blanket
#include "htmlhelp.h" //for HELP
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
/////////////////////////////////////////////////////////////////////////////
// CConnectionDialog dialog
HTREEITEM CConnectionDialog :: InsertItem (CTreeCtrl &treeCtrl, HTREEITEM hParentTreeItem, const char *namespaceName) { TV_INSERTSTRUCT newItem; newItem.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; newItem.hParent = hParentTreeItem; char *name = new char [strlen (namespaceName) + 1]; name[0] = 0; lstrcpy (name, namespaceName); newItem.item.pszText = name; // newItem.item.cchTextMax = strlen (namespaceName) + 1;
//get parent name and prepend to name to generate absolute name
char *absName = NULL; if (hParentTreeItem == TVI_ROOT) { absName = new char [strlen (namespaceName) + 1]; absName[0] = 0; lstrcpy (absName, namespaceName); } else { ISAMTreeItemData* parentData = (ISAMTreeItemData*)treeCtrl.GetItemData (hParentTreeItem); absName = new char [strlen (namespaceName) + strlen (parentData->absName) + 2 + 1]; absName[0] = 0; strcpy (absName, parentData->absName); strcat (absName, "\\"); strcat (absName, namespaceName); }
newItem.item.iImage = newItem.item.iSelectedImage = m_idxMode1Image;
ISAMTreeItemData *itemData = new ISAMTreeItemData; itemData->absName = absName; itemData->pszText = name; //this copy will be deleted
itemData->included = FALSE; itemData->childInclude = 0; itemData->childChildInclude = 0;
//Add to list for quick cleanup
if (pCurrentSelectionList) { pCurrentItem->pNext = itemData; pCurrentItem = itemData; } else { pCurrentSelectionList = itemData; pCurrentItem = itemData; }
newItem.item.lParam = (DWORD)itemData; return treeCtrl.InsertItem (&newItem); }
int CConnectionDialog :: FindAbsName (char *name, HTREEITEM hStartAt, HTREEITEM& hFoundItem) { if (!name) return FALSE; { ISAMTreeItemData *pItemData = (ISAMTreeItemData*)m_tree1.GetItemData (hStartAt); if (pItemData && pItemData->absName && !_stricmp (name, pItemData->absName)) { hFoundItem = hStartAt; return TRUE; } else { HTREEITEM firstChild = NULL; if (firstChild = m_tree1.GetChildItem (hStartAt)) { if (FindAbsName (name, firstChild, hFoundItem)) return TRUE; HTREEITEM nextSibling = firstChild; while (nextSibling = m_tree1.GetNextItem (nextSibling, TVGN_NEXT)) { if (FindAbsName (name, nextSibling, hFoundItem)) return TRUE; } } return FALSE; } } }
int CConnectionDialog :: CreateNamespace (char *name, HTREEITEM hStartAt, HTREEITEM& hFoundItem) { hFoundItem = NULL;
//If we are to create the namespace in the tree control
//we need to do it relative to its parent namespace
//The first step therefore is to get a handle to its parent
//We work out the name of the parent namespace
//Start at the end of the string and work your way
//back until you reach a backslash character or
//you run out of string
long len = lstrlen(name);
//Note: a namespace cannot end with a backslash
//so we check for this error condition
long index = len - 1; if (name[index] == '\\') return FALSE;
while (index && (name[index] != '\\')) index--;
//We have either run out of string or found a backslash
if (!index) { //We have run out of string
return FALSE; } else { name[index] = 0; char* parent = name; char* child = parent + index + 1;
//Get Parent
HTREEITEM hParent; if (! FindAbsName(parent, hStartAt, hParent)) { // Could not get parent, so create it
CreateNamespace (parent, hStartAt, hParent); }
if (hParent) { //Found parent, so now create child
hFoundItem = InsertItem(m_tree1,hParent, (const char*)child); } }
return TRUE; }
int CConnectionDialog :: UnincludedChild (HTREEITEM hStartAt, int checkSelf) { if (checkSelf && !(((ISAMTreeItemData*)m_tree1.GetItemData (hStartAt))->included)) { return TRUE; } else { HTREEITEM firstChild = NULL; if (firstChild = m_tree1.GetChildItem (hStartAt)) { if (UnincludedChild (firstChild, TRUE)) return TRUE; HTREEITEM nextSibling = firstChild; while (nextSibling = m_tree1.GetNextItem (nextSibling, TVGN_NEXT)) { if (UnincludedChild (nextSibling, TRUE)) return TRUE;; } } return FALSE; } } void CConnectionDialog :: GenerateOutMap (HTREEITEM hStartAt) { ISAMTreeItemData *itemData = (ISAMTreeItemData*)m_tree1.GetItemData (hStartAt); if (itemData->included) { // if there's an unincluded child add this individually and recurse
// else add deep and no need to recurse
if (UnincludedChild (hStartAt, FALSE)) { // get name and add it shallow and recurse
pMapStringToObOut->SetAt (itemData->absName, new CNamespace (itemData->absName)); HTREEITEM firstChild = NULL; if (firstChild = m_tree1.GetChildItem (hStartAt)) { GenerateOutMap (firstChild); HTREEITEM nextSibling = firstChild; while (nextSibling = m_tree1.GetNextItem (nextSibling, TVGN_NEXT)) { GenerateOutMap (nextSibling); } } } else { // get name and add with deep flag (no recurse)
// for now do same as above ie don't use deep flag
pMapStringToObOut->SetAt (itemData->absName, new CNamespace (itemData->absName)); HTREEITEM firstChild = NULL; if (firstChild = m_tree1.GetChildItem (hStartAt)) { GenerateOutMap (firstChild); HTREEITEM nextSibling = firstChild; while (nextSibling = m_tree1.GetNextItem (nextSibling, TVGN_NEXT)) { GenerateOutMap (nextSibling); } } } } else { // just recurse
HTREEITEM firstChild = NULL; if (firstChild = m_tree1.GetChildItem (hStartAt)) { GenerateOutMap (firstChild); HTREEITEM nextSibling = firstChild; while (nextSibling = m_tree1.GetNextItem (nextSibling, TVGN_NEXT)) { GenerateOutMap (nextSibling); } } } }
void CConnectionDialog :: GenerateOutString (HTREEITEM hStartAt) { ISAMTreeItemData *itemData = (ISAMTreeItemData*)m_tree1.GetItemData (hStartAt); if (itemData->included) { // if there's an unincluded child add this individually and recurse
// else add deep and no need to recurse
if (UnincludedChild (hStartAt, FALSE)) { // get name and add it shallow and recurse
char *temp = *lpszNamespacesOut; if (temp) { *lpszNamespacesOut = new char [strlen (temp) + 1 + 4 /* for punctuation */ + strlen (itemData->absName) + strlen ("shallow")]; (*lpszNamespacesOut)[0] = 0; strcpy (*lpszNamespacesOut, temp); strcat (*lpszNamespacesOut, ","); strcat (*lpszNamespacesOut, "{"); strcat (*lpszNamespacesOut, itemData->absName); strcat (*lpszNamespacesOut, ",shallow}"); delete temp; } else { *lpszNamespacesOut = new char [strlen (itemData->absName) + 1 + 4 + strlen ("shallow")]; (*lpszNamespacesOut)[0] = 0; strcpy (*lpszNamespacesOut, "{"); strcat (*lpszNamespacesOut, itemData->absName); strcat (*lpszNamespacesOut, ",shallow}");
}
HTREEITEM firstChild = NULL; if (firstChild = m_tree1.GetChildItem (hStartAt)) { GenerateOutString (firstChild); HTREEITEM nextSibling = firstChild; while (nextSibling = m_tree1.GetNextItem (nextSibling, TVGN_NEXT)) { GenerateOutString (nextSibling); } } } else { // get name and add with deep flag (no recurse)
// for now do same as above ie don't use deep flag
char *temp = *lpszNamespacesOut; if (temp) { *lpszNamespacesOut = new char [strlen (temp) + 1 + 4 /* for punctuation */ + strlen (itemData->absName) + strlen ("deep")]; (*lpszNamespacesOut)[0] = 0; strcpy (*lpszNamespacesOut, temp); strcat (*lpszNamespacesOut, ","); strcat (*lpszNamespacesOut, "{"); strcat (*lpszNamespacesOut, itemData->absName); strcat (*lpszNamespacesOut, ",deep}"); delete temp; } else { *lpszNamespacesOut = new char [strlen (itemData->absName) + 1 + 4 + strlen("deep")]; (*lpszNamespacesOut)[0] = 0; strcpy (*lpszNamespacesOut, "{"); strcat (*lpszNamespacesOut, itemData->absName); strcat (*lpszNamespacesOut, ",deep}"); } }
} else { // just recurse
HTREEITEM firstChild = NULL; if (firstChild = m_tree1.GetChildItem (hStartAt)) { GenerateOutString (firstChild); HTREEITEM nextSibling = firstChild; while (nextSibling = m_tree1.GetNextItem (nextSibling, TVGN_NEXT)) { GenerateOutString (nextSibling); } } } }
void CConnectionDialog :: UpdateChildChildInclude (HTREEITEM hNode, BOOL fIncrement) { //Get the parent node, so that you can flag that a non-immediate child
//has been selected
HTREEITEM hParentNode = m_tree1.GetParentItem(hNode); if (hParentNode) { TV_ITEM tvItem; tvItem.hItem = hParentNode; tvItem.mask = TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE; if (m_tree1.GetItem (&tvItem)) { ISAMTreeItemData* temp = (ISAMTreeItemData*)tvItem.lParam; if (fIncrement) { ++(temp->childChildInclude);
//update state of parent if no immediate children
if (0 == temp->childInclude) { //I can find out the state via the iImage field
if ( tvItem.iImage == m_idxMode1Image) { //In state 1, move to state 2
tvItem.iSelectedImage = tvItem.iImage = m_idxMode2Image; m_tree1.SetItem (&tvItem); } else if ( tvItem.iImage == m_idxMode3Image) { //In state 3, move to state 4
tvItem.iSelectedImage = tvItem.iImage = m_idxMode4Image; m_tree1.SetItem (&tvItem); } } } else { --(temp->childChildInclude);
//update state of parent if no immediate children
if ((0 == temp->childInclude) && (0 == temp->childChildInclude)) { //I can find out the state via the iImage field
if ( tvItem.iImage == m_idxMode2Image) { //In state 2, move to state 1
tvItem.iSelectedImage = tvItem.iImage = m_idxMode1Image; m_tree1.SetItem (&tvItem); } else if ( tvItem.iImage == m_idxMode4Image) { //In state 4, move to state 3
tvItem.iSelectedImage = tvItem.iImage = m_idxMode3Image; m_tree1.SetItem (&tvItem); } } } }
//Recursive call up the chain of parents
UpdateChildChildInclude(hParentNode, fIncrement); }
}
void CConnectionDialog :: AddNamespaces (HTREEITEM hParent, int deep) { TV_ITEM tvItem; tvItem.hItem = hParent; tvItem.mask = TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN; if (m_tree1.GetItem (&tvItem)) { //If cel not already selected, then select
if (! ((ISAMTreeItemData*)tvItem.lParam)->included ) { cSelectedCels++;
//Update count in parent node
HTREEITEM hParentNode = m_tree1.GetParentItem(hParent); if (hParentNode) { TV_ITEM tvItem2; tvItem2.hItem = hParentNode; tvItem2.mask = TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE; if (m_tree1.GetItem (&tvItem2)) { ++(((ISAMTreeItemData*)tvItem2.lParam)->childInclude);
//Parent node must be in either state 1, 2 or 3
//I can find out the state via the iImage field
if ( tvItem2.iImage == m_idxMode1Image) { //In state 1, move to state 2
//tvItem2.iSelectedImage = tvItem2.iImage = m_idxMode2Image;
m_tree1.SetItemImage (hParentNode, m_idxMode2Image, m_idxMode2Image); } else if ( tvItem2.iImage == m_idxMode3Image) { //In state 3, move to state 4
//tvItem2.iSelectedImage = tvItem2.iImage = m_idxMode4Image;
m_tree1.SetItemImage (hParentNode, m_idxMode4Image, m_idxMode4Image); }
//Now indicate to parents parent that a non-immediate child
//has been selected
UpdateChildChildInclude(hParentNode, TRUE); } } } if (deep) //recurse
{ HTREEITEM firstChild = NULL; if (firstChild = m_tree1.GetChildItem (hParent)) { AddNamespaces (firstChild, deep); HTREEITEM nextSibling = firstChild; while (nextSibling = m_tree1.GetNextItem (nextSibling, TVGN_NEXT)) AddNamespaces (nextSibling, deep); } }
m_tree1.GetItem (&tvItem); ((ISAMTreeItemData*)tvItem.lParam)->included = TRUE;
//Check if this node has 'included' children
int children = tvItem.cChildren; ISAMTreeItemData* temp = (ISAMTreeItemData*)tvItem.lParam; if (children && (temp->childInclude || temp->childChildInclude)) { // tvItem.iSelectedImage = tvItem.iImage = m_idxMode4Image;
m_tree1.SetItemImage (hParent, m_idxMode4Image, m_idxMode4Image); } else { // tvItem.iSelectedImage = tvItem.iImage = m_idxMode3Image;
m_tree1.SetItemImage (hParent, m_idxMode3Image, m_idxMode3Image); }
// m_tree1.SetItem (&tvItem);
}
//Update state of OK and Cancel pushbutton depending on
//number of cels selected
m_okButton.EnableWindow(cSelectedCels ? TRUE : FALSE); } void CConnectionDialog :: RemoveNamespaces (HTREEITEM hParent, int deep) {
TV_ITEM tvItem; tvItem.hItem = hParent; tvItem.mask = TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN; if (m_tree1.GetItem (&tvItem)) {
//If cel not unselected, then unselect
if ( ((ISAMTreeItemData*)tvItem.lParam)->included ) { cSelectedCels--;
//update state of parent
HTREEITEM hParentNode = m_tree1.GetParentItem(hParent); if (hParentNode) { TV_ITEM tvItem2; tvItem2.hItem = hParentNode; tvItem2.mask = TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE; if (m_tree1.GetItem (&tvItem2)) { --(((ISAMTreeItemData*)tvItem2.lParam)->childInclude);
//Parent node must be in either state 2 or 4
//I can find out the state via the iImage field
if ( tvItem2.iImage == m_idxMode4Image) { //In state 4
if (!((ISAMTreeItemData*)tvItem2.lParam)->childInclude) { //Check non-immediate children
if (!((ISAMTreeItemData*)tvItem2.lParam)->childChildInclude) { //If no more children move to state 3
// tvItem2.iSelectedImage = tvItem2.iImage = m_idxMode3Image;
//// m_tree1.SetItem (&tvItem2);
m_tree1.SetItemImage (hParentNode, m_idxMode3Image, m_idxMode3Image); } } } else { //In state 2
if (!((ISAMTreeItemData*)tvItem2.lParam)->childInclude) { //Check non-immediate children
if (!((ISAMTreeItemData*)tvItem2.lParam)->childChildInclude) { //If no more children move to state 1
// tvItem2.iSelectedImage = tvItem2.iImage = m_idxMode1Image;
//// m_tree1.SetItem (&tvItem2);
m_tree1.SetItemImage (hParentNode, m_idxMode1Image, m_idxMode1Image); } } }
//Now indicate to parents parent that a non-immediate child
//has been de-selected
UpdateChildChildInclude(hParentNode, FALSE); } } }
if (deep) //recurse
{ HTREEITEM firstChild = NULL; if (firstChild = m_tree1.GetChildItem (hParent)) { RemoveNamespaces (firstChild, deep); HTREEITEM nextSibling = firstChild; while (nextSibling = m_tree1.GetNextItem (nextSibling, TVGN_NEXT)) RemoveNamespaces (nextSibling, deep); } }
m_tree1.GetItem (&tvItem); ((ISAMTreeItemData*)tvItem.lParam)->included = FALSE;
//Check if this node has 'included' children
int children = tvItem.cChildren; ISAMTreeItemData* temp = (ISAMTreeItemData*)tvItem.lParam; if (children && (temp->childInclude || temp->childChildInclude)) { // tvItem.iSelectedImage = tvItem.iImage = m_idxMode2Image;
m_tree1.SetItemImage (hParent, m_idxMode2Image, m_idxMode2Image); } else { // tvItem.iSelectedImage = tvItem.iImage = m_idxMode1Image;
m_tree1.SetItemImage (hParent, m_idxMode1Image, m_idxMode1Image); }
//// m_tree1.SetItem (&tvItem);
}
//Update state of OK and Cancel pushbutton depending on
//number of cels selected
m_okButton.EnableWindow(cSelectedCels ? TRUE : FALSE); }
CConnectionDialog::CConnectionDialog(CWnd* pParent, char *pszServer, // WBEM_LOGIN_AUTHENTICATION loginMethod,
char *pszUsername, char *pszPassword, char **pszLocale, char** pszAuthority, BOOL FAR* fSysProp, BOOL fConnParmSpec, CMapStringToOb *pNamespaceMap, CMapStringToOb *pNamespaceMapOut, BOOL enableDefaultDatabase, char **connectionString, BOOL FAR* fImpersonate, BOOL FAR* fPassthrghOnly, BOOL FAR* fItprtEmptPwdAsBlk) : CDialog(CConnectionDialog::IDD, pParent) { ODBCTRACE(_T("\nWBEM ODBC Driver : CConnectionDialog::CConnectionDialog\n")); //{{AFX_DATA_INIT(CConnectionDialog)
//}}AFX_DATA_INIT
pMapStringToObOut = pNamespaceMapOut; pMapStringToObIn = pNamespaceMap; // pServerIn = NULL;
// pUsernameIn = NULL;
// pPasswordIn = NULL;
lpszNamespacesOut = connectionString; fDoubleClicked = FALSE; fConnParmSpecified = fConnParmSpec;
//Make copy of Server, UserName and Password memory addresses
lpszServer = pszServer; lpszUserName = pszUsername; lpszPassword = pszPassword;
lpszAuthority = NULL; lpszLocale = NULL; lpszAuthorityOut = pszAuthority; lpszLocaleOut = pszLocale;
if (pszLocale && *pszLocale) { int localeLen = lstrlen(*pszLocale); lpszLocale = new char [localeLen + 1]; lpszLocale[0] = 0; lstrcpy(lpszLocale, *pszLocale); }
if (pszAuthority && *pszAuthority) { int authLen = lstrlen(*pszAuthority); lpszAuthority = new char [authLen + 1]; lpszAuthority[0] = 0; lstrcpy(lpszAuthority, *pszAuthority); ODBCTRACE(_T("\nWBEM ODBC Driver : Authority :")); ODBCTRACE(_T(lpszAuthority)); ODBCTRACE(_T("\n")); }
// m_loginMethod = loginMethod;
//A counter to indicated number of selected namespace cels
cSelectedCels = 0;
*connectionString = NULL;
//Setup System Properties
fSystemProperties = fSysProp; // if (pszUsername)
// {
// pUsernameIn = new char [strlen (pszUsername) + 1];
// pUsernameIn[0] = 0;
// strcpy (pUsernameIn, pszUsername);
// }
// if (pszPassword)
// {
// pPasswordIn = new char [strlen (pszPassword) + 1];
// pPasswordIn[0] = 0;
// strcpy (pPasswordIn, pszPassword);
// }
fImpersonation = fImpersonate; fPassthroughOnly = fPassthrghOnly; fIntpretEmptPwdAsBlank = fItprtEmptPwdAsBlk;
impersonateMgr = NULL;
if (*fImpersonation) { //Now check if impersonation is necessary
//only if connecting locally
if (IsLocalServer(lpszServer)) { impersonateMgr = new ImpersonationManager(lpszUserName, lpszPassword, lpszAuthority); } else { ODBCTRACE("\nWBEM ODBC Driver : Server not detected as local, not impersonating\n"); } } }
CConnectionDialog :: ~CConnectionDialog() { ODBCTRACE ("\nWBEM ODBC Driver : CConnectionDialog :: ~CConnectionDialog\n"); //Tidy Up
// if (pUsernameIn)
// delete pUsernameIn;
// if (pPasswordIn)
// delete pPasswordIn;
delete impersonateMgr; ODBCTRACE ("\nWBEM ODBC Driver : CConnectionDialog :: ~CConnectionDialog exit point\n"); }
void CConnectionDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CConnectionDialog)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CConnectionDialog, CDialog) //{{AFX_MSG_MAP(CConnectionDialog)
ON_NOTIFY(NM_CLICK, IDC_TREE1, OnClickTree1) ON_NOTIFY(TVN_KEYDOWN, IDC_TREE1, OnKeyDown) ON_NOTIFY(TVN_ITEMEXPANDING, IDC_TREE1, OnTreeExpand) ON_NOTIFY(TVN_DELETEITEM, IDC_TREE1, OnDeleteitemTree1) ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse) ON_BN_CLICKED(IDC_CHECK1, OnButtonSysProp) ON_BN_CLICKED(IDC_CHECK_IMPERSONATE, OnButtonImpersonation) ON_BN_CLICKED(IDC_CHECK_PASSTHROUGHONLY, OnButtonPassthroughOnly) ON_NOTIFY(NM_DBLCLK, IDC_TREE1, OnDblclkTree1) ON_EN_KILLFOCUS(IDC_BROWSE_EDIT, OnKillfocusBrowseEdit) ON_EN_CHANGE(IDC_EDIT_USER_NAME, OnUserNameChange) ON_EN_CHANGE(IDC_EDIT_PSWD, OnPasswordChange) ON_EN_CHANGE(IDC_EDIT_AUTH, OnAuthorityChange) ON_EN_CHANGE(IDC_EDIT_LOCALE, OnLocaleChange) ON_EN_CHANGE(IDC_BROWSE_EDIT, OnServerChange) ON_BN_CLICKED(IDC_REFRESH_BUTTON, OnButtonRefresh) ON_BN_CLICKED(IDC_HELP_BUTTON, OnHelp) ON_BN_CLICKED(IDC_RADIO_BLANK, OnButtonInterpretEmpty) ON_BN_CLICKED(IDC_RADIO_NULL, OnButtonInterpretEmpty) ON_WM_NCDESTROY() //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CConnectionDialog message handlers
void CConnectionDialog::OnKeyDown(NMHDR* pNMHDR, LRESULT* pResult) { TV_KEYDOWN* lParam = (TV_KEYDOWN*)pNMHDR; // TODO: Add your control notification handler code here
*pResult = 0;
//Check if SPACE BAR is pressed
if (lParam->wVKey == VK_SPACE) { HTREEITEM item = m_tree1.GetSelectedItem();
//Grab the WM_CHAR message from the message queue
MSG myMessage; BOOL status = GetMessage(&myMessage, lParam->hdr.hwndFrom, WM_CHAR, WM_CHAR);
if (item) { //Get the item
TV_ITEM tvItem; tvItem.hItem = item; tvItem.mask = TVIF_STATE | TVIF_PARAM; if (m_tree1.GetItem (&tvItem)) { //Check if item is expanded, if not we add/remove in 'deep' mode
BOOL fDeepMode = (tvItem.state & TVIS_EXPANDED) ? FALSE : TRUE;
//If the item is 'included' we remove
//If the item is not 'included' we add
if ( ((ISAMTreeItemData*)tvItem.lParam)->included ) { RemoveNamespaces(item, fDeepMode); } else {
BeginWaitCursor();
BOOL itemSelected = ((ISAMTreeItemData*)tvItem.lParam)->included; BOOL fChildrenChecked = FALSE;
//Get immediate child items and expand them to 1 level only
//Note: Remember to check if it has already been expanded
HTREEITEM firstChild = NULL; if (firstChild = m_tree1.GetChildItem (item)) { //Get absolute name for this item
TV_ITEM tvItem2; tvItem2.hItem = firstChild; tvItem2.mask = TVIF_PARAM; if (m_tree1.GetItem (&tvItem2)) {
//Check if this node has already been checked for children
fChildrenChecked = ((ISAMTreeItemData*)tvItem2.lParam)->fExpanded; if (!fChildrenChecked) { char* txt = ((ISAMTreeItemData*)tvItem2.lParam)->absName;
ISAMBuildTreeChildren (firstChild, txt, m_tree1, *this, lpszServer, // m_loginMethod,
lpszUserName, lpszPassword, *fIntpretEmptPwdAsBlank, lpszLocale, lpszAuthority, ! itemSelected); } }
HTREEITEM nextSibling = firstChild; while (nextSibling = m_tree1.GetNextItem (nextSibling, TVGN_NEXT)) { TV_ITEM tvItem3; tvItem3.hItem = nextSibling; tvItem3.mask = TVIF_PARAM; if (m_tree1.GetItem (&tvItem3)) {
//Check if this node has already been checked for children
fChildrenChecked = ((ISAMTreeItemData*)tvItem3.lParam)->fExpanded;
if (!fChildrenChecked) { char* txt = ((ISAMTreeItemData*)tvItem3.lParam)->absName;
ISAMBuildTreeChildren (nextSibling, txt, m_tree1, *this, lpszServer, // m_loginMethod,
lpszUserName, lpszPassword, *fIntpretEmptPwdAsBlank, lpszLocale, lpszAuthority, ! itemSelected); } } } }
AddNamespaces (item, fDeepMode);
EndWaitCursor(); } } }
} }
void CConnectionDialog::OnTreeExpand(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* lParam = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control notification handler code here
*pResult = 0;
TV_ITEM tvItem = lParam->itemNew; UINT action = lParam->action; HTREEITEM item = tvItem.hItem;
//Check if item is expanded, if not we add/remove in 'deep' mode
BOOL fExpanding = (action == TVE_EXPAND) ? TRUE : FALSE;
if (!fExpanding) return;
BeginWaitCursor();
char* txt = ((ISAMTreeItemData*)tvItem.lParam)->pszText; BOOL fChildrenChecked = FALSE;
//Get immediate child items and expand them to 1 level only
//Note: Remember to check if it has already been expanded
HTREEITEM firstChild = NULL; if (firstChild = m_tree1.GetChildItem (item)) { //Get absolute name for this item
TV_ITEM tvItem2; tvItem2.hItem = firstChild; tvItem2.mask = TVIF_PARAM; if (m_tree1.GetItem (&tvItem2)) {
//Check if this node has already been checked for children
fChildrenChecked = ((ISAMTreeItemData*)tvItem2.lParam)->fExpanded;
if (!fChildrenChecked) { txt = ((ISAMTreeItemData*)tvItem2.lParam)->absName;
ISAMBuildTreeChildren (firstChild, txt, m_tree1, *this, lpszServer, // m_loginMethod,
lpszUserName, lpszPassword, *fIntpretEmptPwdAsBlank, lpszLocale, lpszAuthority, FALSE); } }
HTREEITEM nextSibling = firstChild; while (nextSibling = m_tree1.GetNextItem (nextSibling, TVGN_NEXT)) { TV_ITEM tvItem3; tvItem3.hItem = nextSibling; tvItem3.mask = TVIF_PARAM; if (m_tree1.GetItem (&tvItem3)) {
//Check if this node has already been checked for children
fChildrenChecked = ((ISAMTreeItemData*)tvItem3.lParam)->fExpanded;
if (!fChildrenChecked) { txt = ((ISAMTreeItemData*)tvItem3.lParam)->absName;
ISAMBuildTreeChildren (nextSibling, txt, m_tree1, *this, lpszServer, // m_loginMethod,
lpszUserName, lpszPassword, *fIntpretEmptPwdAsBlank, lpszLocale, lpszAuthority, FALSE); } } } }
EndWaitCursor();
}
void CConnectionDialog::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here
*pResult = 0;
//Check if you double-clicked
// if (fDoubleClicked)
// {
// fDoubleClicked = FALSE;
// return;
// }
fDoubleClicked = FALSE;
//Get current position of mouse cursor and perform
//a hit test on the tree control
POINT cursorPos; GetCursorPos(&cursorPos);
m_tree1.ScreenToClient(&cursorPos);
UINT fFlags = 0; HTREEITEM item = m_tree1.HitTest(cursorPos, &fFlags);
if (fFlags & TVHT_ONITEMICON) { //Support for mouse operation to 'check' the node checkbox
if (item) { //Get the item
TV_ITEM tvItem; tvItem.hItem = item; tvItem.mask = TVIF_STATE | TVIF_PARAM; if (m_tree1.GetItem (&tvItem)) { //Check if item is expanded, if not we add/remove in 'deep' mode
BOOL fDeepMode = (tvItem.state & TVIS_EXPANDED) ? FALSE : TRUE;
//If the item is 'included' we remove
//If the item is not 'included' we add
if ( ((ISAMTreeItemData*)tvItem.lParam)->included ) { RemoveNamespaces(item, fDeepMode); } else {
BeginWaitCursor();
BOOL itemSelected = ((ISAMTreeItemData*)tvItem.lParam)->included; BOOL fChildrenChecked = FALSE;
//Get immediate child items and expand them to 1 level only
//Note: Remember to check if it has already been expanded
HTREEITEM firstChild = NULL; if (firstChild = m_tree1.GetChildItem (item)) { //Get absolute name for this item
TV_ITEM tvItem2; tvItem2.hItem = firstChild; tvItem2.mask = TVIF_PARAM; if (m_tree1.GetItem (&tvItem2)) {
//Check if this node has already been checked for children
fChildrenChecked = ((ISAMTreeItemData*)tvItem2.lParam)->fExpanded; if (!fChildrenChecked) { char* txt = ((ISAMTreeItemData*)tvItem2.lParam)->absName;
ISAMBuildTreeChildren (firstChild, txt, m_tree1, *this, lpszServer, // m_loginMethod,
lpszUserName, lpszPassword, *fIntpretEmptPwdAsBlank, lpszLocale, lpszAuthority, ! itemSelected); } }
HTREEITEM nextSibling = firstChild; while (nextSibling = m_tree1.GetNextItem (nextSibling, TVGN_NEXT)) { TV_ITEM tvItem3; tvItem3.hItem = nextSibling; tvItem3.mask = TVIF_PARAM; if (m_tree1.GetItem (&tvItem3)) {
//Check if this node has already been checked for children
fChildrenChecked = ((ISAMTreeItemData*)tvItem3.lParam)->fExpanded;
if (!fChildrenChecked) { char* txt = ((ISAMTreeItemData*)tvItem3.lParam)->absName;
ISAMBuildTreeChildren (nextSibling, txt, m_tree1, *this, lpszServer, // m_loginMethod,
lpszUserName, lpszPassword, *fIntpretEmptPwdAsBlank, lpszLocale, lpszAuthority, ! itemSelected); } } } }
AddNamespaces (item, fDeepMode);
EndWaitCursor(); } } } } }
void CConnectionDialog::OnDeleteitemTree1(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control notification handler code here
*pResult = 0; }
// Window Procedure to circumvent bug(?) in mfc
CMap<SHORT, SHORT, CWindowInfo*, CWindowInfo*> windowMap;
LRESULT CALLBACK MySubClassProc (HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) { CWindowInfo *pwindowInfo = NULL; VERIFY (windowMap.Lookup ((SHORT) ((DWORD)hWnd & 0xffff), pwindowInfo) && pwindowInfo); return :: CallWindowProc (pwindowInfo->m_oldWindowProc, pwindowInfo->m_hWnd, nMsg, wParam, lParam); }
BOOL CConnectionDialog::OnInitDialog() { ODBCTRACE ("\nWBEM ODBC Driver : CConnectionDialog::OnInitDialog\n");
CDialog::OnInitDialog(); // subclass the window to circumvent a bug (?) in mfc
WNDPROC oldWindowProc = (WNDPROC):: SetWindowLong (m_hWnd, GWL_WNDPROC, (DWORD) MySubClassProc); CWindowInfo *pwindowInfo = new CWindowInfo (m_hWnd, oldWindowProc); windowMap.SetAt ((SHORT)((DWORD)m_hWnd & 0xffff), pwindowInfo);
// hook up the controls
m_browseEdit.Attach (::GetDlgItem (m_hWnd, IDC_BROWSE_EDIT)); m_browse.Attach (::GetDlgItem (m_hWnd, IDC_BUTTON_BROWSE)); m_cancelButton.Attach(::GetDlgItem (m_hWnd, IDCANCEL)); m_okButton.Attach (::GetDlgItem (m_hWnd, IDOK)); m_UserName.Attach(::GetDlgItem (m_hWnd, IDC_EDIT_USER_NAME)); m_Password.Attach(::GetDlgItem (m_hWnd, IDC_EDIT_PSWD)); m_Authority.Attach(::GetDlgItem (m_hWnd, IDC_EDIT_AUTH)); m_Locale.Attach(::GetDlgItem (m_hWnd, IDC_EDIT_LOCALE)); m_tree1.Attach(::GetDlgItem (m_hWnd, IDC_TREE1)); m_sysPropCheck.Attach(::GetDlgItem (m_hWnd, IDC_CHECK1)); m_impersonateCheck.Attach(::GetDlgItem (m_hWnd, IDC_CHECK_IMPERSONATE)); m_PassthroughOnlyCheck.Attach(::GetDlgItem (m_hWnd, IDC_CHECK_PASSTHROUGHONLY)); m_messageEdit.Attach (::GetDlgItem (m_hWnd, IDC_MESSAGE)); m_RefreshButton.Attach (::GetDlgItem (m_hWnd, IDC_REFRESH_BUTTON)); m_PwdAsNull.Attach (::GetDlgItem (m_hWnd, IDC_RADIO_NULL)); m_PwdAsBlank.Attach (::GetDlgItem (m_hWnd, IDC_RADIO_BLANK));
// TODO: Add extra initialization here
pCurrentSelectionList = NULL; pCurrentItem = NULL;
m_browseEdit.LimitText(MAX_SERVER_NAME_LENGTH); m_UserName.LimitText(MAX_USER_NAME_LENGTH); m_Password.LimitText(MAX_PASSWORD_LENGTH);
m_Password.SetPasswordChar('*');
m_browseEdit.SetWindowText((lpszServer ? lpszServer : "")); m_browseEdit.SetModify(FALSE);
m_UserName.SetWindowText((lpszUserName ? lpszUserName : "")); m_UserName.SetModify(FALSE);
m_Password.SetWindowText((lpszPassword ? lpszPassword : "")); m_Password.SetModify(FALSE);
//Set Authority
m_Authority.SetWindowText((lpszAuthority ? lpszAuthority : "")); m_Authority.SetModify(FALSE);
//Set Locale
m_Locale.SetWindowText((lpszLocale ? lpszLocale : "")); m_Locale.SetModify(FALSE);
//Set System Properties checkbox
m_sysPropCheck.SetCheck(*fSystemProperties ? 1 : 0);
//Set Impersonation checkbox
m_impersonateCheck.SetCheck(impersonateMgr ? 1 : 0);
//Set Passthrough only checkbox
m_PassthroughOnlyCheck.SetCheck(*fPassthroughOnly ? 1 : 0);
//Set the Interpret an empty password as
m_PwdAsNull.SetCheck(*fIntpretEmptPwdAsBlank ? 0 : 1); m_PwdAsBlank.SetCheck(*fIntpretEmptPwdAsBlank ? 1 : 0);
m_messageEdit.FmtLines(TRUE); m_messageEdit.ShowWindow(SW_HIDE); m_tree1.EnableWindow(TRUE); m_tree1.ShowWindow(SW_SHOWNA);
char buffer [129]; buffer[0] = 0; LoadString(s_hModule, STR_CONNECT, (char*)buffer, 128); m_RefreshButton.SetWindowText(buffer); m_RefreshButton.EnableWindow(FALSE);
// Fill in the first tree with all the namespace information
// The second tree is empty for now. In future this will depend on the
// connection string
//Each node in the CTreeCtrl will be in one of the following 4 states
// 1) node not selected, child nodes not selected
// 2) node not selected, some or all child nodes selected
// 3) node selected, no child nodes selected
// 4) node selected, some or all child nodes selected
m_imageList.Create (32, 16, TRUE, 25, 0); bmap1.LoadBitmap(IDB_BITMAP1); bmap2.LoadBitmap(IDB_BITMAP2); bmap3.LoadBitmap(IDB_BITMAP3); bmap4.LoadBitmap(IDB_BITMAP4); bmask.LoadBitmap(IDB_MASK); m_idxMode1Image = m_imageList.Add (&bmap1, &bmask); m_idxMode2Image = m_imageList.Add (&bmap2, &bmask); m_idxMode3Image = m_imageList.Add (&bmap3, &bmask); m_idxMode4Image = m_imageList.Add (&bmap4, &bmask);
m_tree1.SetImageList (&m_imageList, TVSIL_NORMAL);
//Tidy Up
bmap1.DeleteObject(); bmap2.DeleteObject(); bmap3.DeleteObject(); bmap4.DeleteObject(); bmask.DeleteObject();
LONG oldStyle = :: GetWindowLong(m_tree1.m_hWnd, GWL_STYLE);
:: SetWindowLong (m_tree1.m_hWnd, GWL_STYLE, oldStyle | TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT);
BOOL fStatusOK = TRUE;
//We may or may not be using impersonation
//but if we do, has it worked ?
if (*fImpersonation && impersonateMgr) { //Check if impersonation request has worked
if (! impersonateMgr->CanWeImpersonate() ) { fStatusOK = FALSE; } }
if (fStatusOK) { BeginWaitCursor();
HTREEITEM hDummy; SWORD treeStatus = ISAMBuildTree (TVI_ROOT, "root", /*"root\\default",*/ m_tree1, *this, lpszServer ? lpszServer : NULL, // server
// m_loginMethod,
lpszUserName ? lpszUserName : NULL, // username
lpszPassword ? lpszPassword : NULL, // password
*fIntpretEmptPwdAsBlank, lpszLocale, lpszAuthority, TRUE, FALSE, hDummy);
EndWaitCursor();
// enumerate elements in list and set the namespaces passed in in the
// connection string to be included
POSITION pos; CString key; CNamespace *pNamespace; for (pos = pMapStringToObIn->GetStartPosition ();pos != NULL;) { pMapStringToObIn->GetNextAssoc (pos, key, (CObject*&)pNamespace); HTREEITEM hFoundItem; int len = (pNamespace->GetName ()).GetLength (); LPTSTR str = (pNamespace->GetName ()).GetBuffer (len); if (FindAbsName (str, m_tree1.GetRootItem (), hFoundItem)) { //include it
AddNamespaces (hFoundItem, FALSE /* shallow */); } else { // attempt to create namespace
if (CreateNamespace (str, m_tree1.GetRootItem (), hFoundItem)) { //include it
AddNamespaces (hFoundItem, FALSE /* shallow */); } } }
//Update state of OK pushbutton depending on
//number of cels selected
m_okButton.EnableWindow(cSelectedCels ? TRUE : FALSE);
} else { //Impersonation failed
m_tree1.EnableWindow(FALSE); m_tree1.ShowWindow(SW_HIDE);
char buffer [128 + 1]; buffer[0] = 0; LoadString(s_hModule, STR_FAILED_WBEM_CONN, (char*)buffer, 128); m_messageEdit.SetWindowText(buffer); m_messageEdit.ShowWindow(SW_SHOWNA); }
//Final check to see if proper connection parameters were entered
if (!fConnParmSpecified) { ConnectionParameterChange();
//Give the user name edit box focus
m_UserName.SetFocus(); }
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CConnectionDialog::OnNcDestroy() { CWindowInfo *pwindowInfo = NULL; BOOL found = windowMap.Lookup ((SHORT) ((DWORD)m_hWnd & 0xffff), pwindowInfo); ASSERT (found); if (found) { // unsubclass the window
:: SetWindowLong (m_hWnd, GWL_WNDPROC, (DWORD) pwindowInfo->m_oldWindowProc); delete pwindowInfo; windowMap.RemoveKey ((SHORT) ((DWORD)m_hWnd & 0xffff)); }
m_browseEdit.Detach (); m_browse.Detach (); m_cancelButton.Detach(); m_okButton.Detach (); m_UserName.Detach(); m_Password.Detach(); m_Authority.Detach(); m_Locale.Detach(); m_tree1.Detach(); m_sysPropCheck.Detach(); m_impersonateCheck.Detach(); m_PassthroughOnlyCheck.Detach(); m_messageEdit.Detach(); m_RefreshButton.Detach(); m_PwdAsNull.Detach(); m_PwdAsBlank.Detach();
CDialog :: OnNcDestroy (); }
void CConnectionDialog::OnOK() { // TODO: Add extra validation here
GenerateOutMap (m_tree1.GetRootItem ()); GenerateOutString (m_tree1.GetRootItem ());
//Copy back new Username and Password
lpszUserName[0] = 0; lpszPassword[0] = 0; m_UserName.GetWindowText(lpszUserName, MAX_USER_NAME_LENGTH); m_Password.GetWindowText(lpszPassword, MAX_PASSWORD_LENGTH);
//Copy Authority & Locale
if (lpszAuthority) delete lpszAuthority;
*lpszAuthorityOut = NULL;
int AuthLen = m_Authority.GetWindowTextLength();
if (AuthLen) { *lpszAuthorityOut = new char [AuthLen + 1]; (*lpszAuthorityOut)[0] = 0; m_Authority.GetWindowText(*lpszAuthorityOut, AuthLen + 1); (*lpszAuthorityOut)[AuthLen] = 0; }
if (lpszLocale) delete lpszLocale;
*lpszLocaleOut = NULL;
int LocaleLen = m_Locale.GetWindowTextLength();
if (LocaleLen) { *lpszLocaleOut = new char [LocaleLen + 1]; (*lpszLocaleOut)[0] = 0; m_Locale.GetWindowText(*lpszLocaleOut, LocaleLen + 1); (*lpszLocaleOut)[LocaleLen] = 0; }
HTREEITEM hTreeItem = m_tree1.GetRootItem();
CleanUpTreeCtrl(hTreeItem);
CDialog::OnOK(); }
void CConnectionDialog :: CleanUpTreeCtrl(HTREEITEM& hTreeItem) { if (pCurrentSelectionList) { ISAMTreeItemData* theNext = NULL; do { theNext = pCurrentSelectionList->pNext; delete pCurrentSelectionList; pCurrentSelectionList = theNext; } while (pCurrentSelectionList); }
pCurrentSelectionList = NULL; pCurrentItem = NULL;
}
void CConnectionDialog::OnButtonSysProp() { //Clicked on the System Properties checkbox
*fSystemProperties = m_sysPropCheck.GetCheck() ? TRUE : FALSE; }
void CConnectionDialog::OnButtonInterpretEmpty() { //Clicked on one of the Interpret empty password as radio buttons
*fIntpretEmptPwdAsBlank = m_PwdAsBlank.GetCheck() ? TRUE : FALSE;
ConnectionParameterChange(); }
void CConnectionDialog::OnButtonImpersonation() { //Clicked on the Impersonation checkbox
*fImpersonation = m_impersonateCheck.GetCheck() ? TRUE : FALSE; ConnectionParameterChange(); }
void CConnectionDialog::OnButtonPassthroughOnly() { //Clicked on the Passthrough only checkbox
*fPassthroughOnly = m_PassthroughOnlyCheck.GetCheck() ? TRUE : FALSE; }
void CConnectionDialog::OnButtonBrowse() { // TODO: Add your control notification handler code here
m_browse.EnableWindow(FALSE); BeginWaitCursor();
//Show dialog box
CBrowseDialog d; int result = d.DoModal();
m_browse.EnableWindow(TRUE); EndWaitCursor();
//abort if OK pushbutton was not pressed
if (result != IDOK) return;
m_browseEdit.SetWindowText( d.GetServerName() ); m_browseEdit.SetModify(FALSE);
//update tree
RefreshTree(); }
void CConnectionDialog::OnCancel() { // TODO: Add extra cleanup here
HTREEITEM hTreeItem = m_tree1.GetRootItem();
CleanUpTreeCtrl(hTreeItem); CDialog::OnCancel(); }
BOOL GetWbemDirectory(_bstr_t& wbemDir) { HKEY keyHandle = (HKEY)1; TCHAR buff [1001]; DWORD sizebuff = 1000;
long fStatus = 0; _bstr_t location("Software\\ODBC\\ODBCINST.INI\\WBEM ODBC Driver");
buff[0] = 0; fStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)location, 0, KEY_READ, &keyHandle);
if (fStatus == ERROR_SUCCESS) { DWORD typeValue; _bstr_t subkey("Help");
fStatus = RegQueryValueEx(keyHandle, (LPCTSTR)subkey, NULL, &typeValue, (LPBYTE)buff, &sizebuff);
if (fStatus == ERROR_SUCCESS) { wbemDir = buff; return TRUE; }
} return FALSE; }
void CConnectionDialog::OnHelp() { _bstr_t sName = ">Main";
//Get the WBEM directory
_bstr_t wbemDir; if ( !GetWbemDirectory(wbemDir) ) return;
_bstr_t sPrefix = "mk:@MSITStore:" + wbemDir + "\\WBEMDR32.CHM"; _bstr_t sIndex = sPrefix + "::" + "/_hmm_connecting_to_an_odbc_data_source.htm";
HtmlHelp ( NULL, // HWND - this is where WM_TCARD messages will be sent
sName, // Use "Main" window name
HH_DISPLAY_TOPIC, // We want to display a topic please
(DWORD)(TCHAR*)sIndex // Full path of topic to display
);
}
void CConnectionDialog::OnDblclkTree1(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here
fDoubleClicked = TRUE; *pResult = 0; }
void CConnectionDialog::ConnectionParameterChange() { m_tree1.EnableWindow(FALSE); m_tree1.ShowWindow(SW_HIDE); char buffer [128 + 1]; buffer[0] = 0; LoadString(s_hModule, STR_PLEASE_REFRESH, (char*)buffer, 128);
m_messageEdit.SetWindowText(buffer); m_messageEdit.ShowWindow(SW_SHOWNA);
LoadString(s_hModule, STR_CONNECT, (char*)buffer, 128); m_RefreshButton.SetWindowText(buffer); m_RefreshButton.EnableWindow(TRUE); m_okButton.EnableWindow(FALSE); }
void CConnectionDialog::OnLocaleChange() { ConnectionParameterChange(); }
void CConnectionDialog::OnAuthorityChange() { ConnectionParameterChange(); }
void CConnectionDialog::OnUserNameChange() { ConnectionParameterChange(); }
void CConnectionDialog::OnPasswordChange() { ConnectionParameterChange(); }
void CConnectionDialog::OnServerChange() { ConnectionParameterChange(); }
void CConnectionDialog::OnButtonRefresh() { char buffer [129]; buffer[0] = 0;
m_tree1.EnableWindow(TRUE); m_tree1.ShowWindow(SW_SHOWNA); m_messageEdit.ShowWindow(SW_HIDE);
//Disable button and rename to CONNECT
LoadString(s_hModule, STR_CONNECT, (char*)buffer, 128); m_RefreshButton.SetWindowText(buffer); m_RefreshButton.EnableWindow(FALSE);
BOOL status = RefreshTree();
if (status) { //If refresh was successful
//enable button and rename to REFRESH
LoadString(s_hModule, STR_REFRESH, (char*)buffer, 128); m_RefreshButton.SetWindowText(buffer); m_RefreshButton.EnableWindow(TRUE); }
//Give the tree control or message text focus
if ( m_tree1.IsWindowEnabled() ) m_tree1.SetFocus(); else m_messageEdit.SetFocus(); }
void CConnectionDialog::OnKillfocusBrowseEdit() { /*
// TODO: Add your control notification handler code here
//Check if server, user name or password have been changed
//If so, refresh tree
if ( m_browseEdit.GetModify() || m_UserName.GetModify() || m_Password.GetModify() ) { //reset flags
m_browseEdit.SetModify(FALSE); m_UserName.SetModify(FALSE); m_Password.SetModify(FALSE);
//refresh tree view
RefreshTree(); } */ }
BOOL CConnectionDialog::RefreshTree() { ODBCTRACE ("\nWBEM ODBC Driver : CConnectionDialog::RefreshTree\n");
BOOL status = FALSE;
//Update tree view with namespaces associated with new server
HTREEITEM hTreeItem = m_tree1.GetRootItem(); CleanUpTreeCtrl(hTreeItem); m_tree1.DeleteAllItems(); cSelectedCels = 0;
//Refresh Window
UpdateWindow();
lpszServer[0] = 0; lpszUserName[0] = 0; lpszPassword[0] = 0; m_browseEdit.GetWindowText(lpszServer, MAX_SERVER_NAME_LENGTH); m_UserName.GetWindowText(lpszUserName, MAX_USER_NAME_LENGTH); m_Password.GetWindowText(lpszPassword, MAX_PASSWORD_LENGTH);
//Copy Authority & Locale
if (lpszAuthority) delete lpszAuthority;
lpszAuthority = NULL;
int AuthLen = m_Authority.GetWindowTextLength();
if (AuthLen) { lpszAuthority = new char [AuthLen + 1]; lpszAuthority[0] = 0; m_Authority.GetWindowText(lpszAuthority, AuthLen + 1); lpszAuthority[AuthLen] = 0; ODBCTRACE(_T("\nWBEM ODBC Driver : CConnectionDialog::RefreshTree\n")); ODBCTRACE(_T(" Authority :")); ODBCTRACE(_T(lpszAuthority)); ODBCTRACE(_T("\n")); }
if (lpszLocale) delete lpszLocale;
lpszLocale = NULL;
int LocaleLen = m_Locale.GetWindowTextLength();
if (LocaleLen) { lpszLocale = new char [LocaleLen + 1]; lpszLocale[0] = 0; m_Locale.GetWindowText(lpszLocale, LocaleLen + 1); lpszLocale[LocaleLen] = 0; }
//Update impersonation if applicable
BOOL fImpersonateStatusOK = TRUE;
if (*fImpersonation) { ODBCTRACE ("\nWBEM ODBC Driver : Impersonation checkbox ON\n"); delete impersonateMgr; impersonateMgr = NULL;
//Now check if impersonation is necessary
//only if connecting locally
if (IsLocalServer(lpszServer)) { impersonateMgr = new ImpersonationManager(lpszUserName, lpszPassword, lpszAuthority);
//Check if impersonation request has worked
if (! impersonateMgr->CanWeImpersonate() ) { ODBCTRACE ("\nWBEM ODBC Driver : We cannot impersonate\n"); fImpersonateStatusOK = FALSE; } else { ODBCTRACE ("\nWBEM ODBC Driver : We can impersonate\n");
//Do the actual impersonation so cloaking will work
if ( ! impersonateMgr->ImpersonatingNow() ) impersonateMgr->Impersonate("CConnectionDialog");
} } else { ODBCTRACE("\nWBEM ODBC Driver : Server not detected as local, not impersonating\n"); } } else { ODBCTRACE ("\nWBEM ODBC Driver : Impersonation checkbox OFF\n"); }
BeginWaitCursor();
//Disable OK pushbutton when updating
m_okButton.EnableWindow(FALSE);
//Check if you can connect using specified authentication information
char* lpRootNamespace = "root"; DWORD dwAuthLevel = 0; DWORD dwImpLevel = 0; COAUTHIDENTITY* pAuthIdent = NULL;
IWbemServicesPtr pGateway = NULL; ISAMGetGatewayServer (pGateway, lpszServer ? (LPUSTR)lpszServer : NULL, //server
// m_loginMethod,
(LPUSTR)lpRootNamespace, lpszUserName ? (LPUSTR)lpszUserName : NULL, // username
lpszPassword ? (LPUSTR)lpszPassword : NULL, // password
(LPUSTR)lpszLocale, //locale
(LPUSTR)lpszAuthority,//authority
dwAuthLevel, dwImpLevel, *fIntpretEmptPwdAsBlank, &pAuthIdent );
if ( pAuthIdent ) { WbemFreeAuthIdentity( pAuthIdent ); pAuthIdent = NULL; }
if (fImpersonateStatusOK && (pGateway != NULL)) { ODBCTRACE ("\nWBEM ODBC Driver : fImpersonateStatusOK && pGateway\n"); BOOL fIsLocalConnection = IsLocalServer((LPSTR) lpszServer);
//cloaking
if ( fIsLocalConnection && IsW2KOrMore() ) { WbemSetDynamicCloaking(pGateway, dwAuthLevel, dwImpLevel); }
status = TRUE;
HTREEITEM hDummy; ISAMBuildTree (TVI_ROOT, "root", /*"root\\default",*/ m_tree1, *this, lpszServer ? lpszServer : NULL, //server
// m_loginMethod,
lpszUserName ? lpszUserName : NULL, // username
lpszPassword ? lpszPassword : NULL, // password
*fIntpretEmptPwdAsBlank, lpszLocale, lpszAuthority, TRUE, FALSE, hDummy);
//finished impersonating
// if ( (*fImpersonation) && (impersonateMgr) )
// impersonateMgr->RevertToYourself("ConnectionDialog");
} else { ODBCTRACE ("\nWBEM ODBC Driver : Failed Connection\n");
status = FALSE;
m_tree1.EnableWindow(FALSE); m_tree1.ShowWindow(SW_HIDE);
char buffer [128 + 1]; buffer[0] = 0; LoadString(s_hModule, STR_FAILED_WBEM_CONN, (char*)buffer, 128); m_messageEdit.SetWindowText(buffer); m_messageEdit.ShowWindow(SW_SHOWNA); }
EndWaitCursor();
if (status) ODBCTRACE ("\nWBEM ODBC Driver : CConnectionDialog::RefreshTree returns TRUE\n"); else ODBCTRACE ("\nWBEM ODBC Driver : CConnectionDialog::RefreshTree returns FALSE\n");
return status; }
|