1876 lines
48 KiB
C++
1876 lines
48 KiB
C++
// 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;
|
|
}
|