951 lines
22 KiB
C++
951 lines
22 KiB
C++
// Commenting #define out - causing compiler error - not sure if needed, compiles
|
|
// okay without it.
|
|
//#define WINVER 0x0400
|
|
#include "precomp.h"
|
|
#include "afxtempl.h"
|
|
|
|
#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 "winnetwk.h"
|
|
#define NET_API_STATUS DWORD
|
|
#define NET_API_FUNCTION __stdcall
|
|
#include "lmwksta.h"
|
|
|
|
#include "Browse.h"
|
|
|
|
#include "dlgcback.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
|
|
CNetResourceList :: CNetResourceList(NETRESOURCE & nr, BOOL fNULL)
|
|
{
|
|
//Initialize
|
|
fUseGlobe = FALSE;
|
|
fIsNULL = fNULL;
|
|
pNext = NULL;
|
|
|
|
|
|
lpLocalName = NULL;
|
|
lpRemoteName = NULL;
|
|
lpComment = NULL;
|
|
lpProvider = NULL;
|
|
|
|
//If it is not NULL
|
|
|
|
if (!fIsNULL)
|
|
{
|
|
dwScope = nr.dwScope;
|
|
dwType = nr.dwType;
|
|
dwDisplayType = nr.dwDisplayType;
|
|
dwUsage = nr.dwUsage;
|
|
|
|
if (nr.lpLocalName)
|
|
{
|
|
lpLocalName = new char [strlen(nr.lpLocalName) + 1];
|
|
lpLocalName[0] = 0;
|
|
strcpy(lpLocalName, nr.lpLocalName);
|
|
}
|
|
|
|
if (nr.lpRemoteName)
|
|
{
|
|
lpRemoteName = new char [strlen(nr.lpRemoteName) + 1];
|
|
lpRemoteName[0] = 0;
|
|
strcpy(lpRemoteName, nr.lpRemoteName);
|
|
}
|
|
|
|
if (nr.lpComment)
|
|
{
|
|
lpComment = new char [strlen(nr.lpComment) + 1];
|
|
lpComment[0] = 0;
|
|
strcpy(lpComment, nr.lpComment);
|
|
}
|
|
|
|
if (nr.lpProvider)
|
|
{
|
|
lpProvider = new char [strlen(nr.lpProvider) + 1];
|
|
lpProvider[0] = 0;
|
|
strcpy(lpProvider, nr.lpProvider);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
CNetResourceList :: ~CNetResourceList()
|
|
{
|
|
//Tidy Up
|
|
// if (pNext)
|
|
// delete pNext;
|
|
|
|
if (!fIsNULL)
|
|
{
|
|
delete lpLocalName;
|
|
delete lpRemoteName;
|
|
delete lpComment;
|
|
delete lpProvider;
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CBrowseDialog dialog
|
|
|
|
|
|
CBrowseDialog::CBrowseDialog(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CBrowseDialog::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CBrowseDialog)
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
CBrowseDialog :: ~CBrowseDialog()
|
|
{
|
|
//Tidy Up
|
|
// delete pPrevList;
|
|
// delete pCurrentSelectionList;
|
|
|
|
if (pPrevList)
|
|
{
|
|
CNetResourceList* theNext = NULL;
|
|
do
|
|
{
|
|
theNext = pPrevList->pNext;
|
|
delete pPrevList;
|
|
pPrevList = theNext;
|
|
} while (pPrevList);
|
|
}
|
|
|
|
if (pCurrentSelectionList)
|
|
{
|
|
CNetResourceList* theNext = NULL;
|
|
do
|
|
{
|
|
theNext = pCurrentSelectionList->pNext;
|
|
delete pCurrentSelectionList;
|
|
pCurrentSelectionList = theNext;
|
|
} while (pCurrentSelectionList);
|
|
}
|
|
}
|
|
|
|
void CBrowseDialog::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CBrowseDialog)
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CBrowseDialog, CDialog)
|
|
//{{AFX_MSG_MAP(CBrowseDialog)
|
|
ON_NOTIFY(NM_DBLCLK, IDC_LIST1, OnDblclkList1)
|
|
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, OnItemchangedList3)
|
|
ON_NOTIFY(LVN_KEYDOWN, IDC_LIST1, OnKeyDown)
|
|
ON_BN_CLICKED(IDC_BACKBUTTON, OnBackbutton)
|
|
ON_BN_CLICKED(IDC_LISTBUTTON, OnListbutton)
|
|
ON_BN_CLICKED(IDC_DETAILBUTTON, OnDetailbutton)
|
|
ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnNeedText)
|
|
ON_WM_NCDESTROY()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CBrowseDialog message handlers
|
|
|
|
//This is used to mimick the stucture in NETAPI32.LIB
|
|
typedef struct _WkstaInfo100
|
|
{
|
|
DWORD wki100_platform_id;
|
|
LPSTR wki100_computername;
|
|
LPSTR wki100_langroup;
|
|
DWORD wki100_ver_major;
|
|
DWORD wki100_ver_minor;
|
|
} WkstaInfo100, *PWkstaInfo100, *LPWkstaInfo100;
|
|
|
|
typedef NET_API_STATUS (CALLBACK *ULPRET)(LPSTR servername,
|
|
DWORD level,
|
|
LPBYTE* bufptr);
|
|
|
|
BOOL CBrowseDialog::OnInitDialog()
|
|
{
|
|
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 controls
|
|
m_cancelButton.Attach (::GetDlgItem (m_hWnd, IDCANCEL));
|
|
m_okButton.Attach (::GetDlgItem (m_hWnd, IDOK));
|
|
m_list.Attach(::GetDlgItem (m_hWnd, IDC_LIST1));
|
|
|
|
// TODO: Add extra initialization here
|
|
pPrevList = NULL;
|
|
pCurrentSelectionList = NULL;
|
|
pCurrentItem = NULL;
|
|
lpServerName[0] = 0;
|
|
iSelectedItem = 0;
|
|
|
|
|
|
//Setup image list with icons
|
|
m_imageList.Create (16, 16, TRUE, 25, 0);
|
|
|
|
//The first icon (HMM_ICON_SERVER) is used to represent SERVERS
|
|
hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1));
|
|
m_imageList.Add (hIcon);
|
|
|
|
//The second icon (HMM_ICON_GLOBE) is used to represent the entire network
|
|
hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON2));
|
|
m_imageList.Add (hIcon);
|
|
|
|
//The third icon (HMM_ICON_OTHER) is used to represent any other network resource
|
|
hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON3));
|
|
m_imageList.Add (hIcon);
|
|
|
|
//The forth icon (HMM_ICON_NETWORK) is used to represent a link to the entire network
|
|
hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON4));
|
|
m_imageList.Add (hIcon);
|
|
|
|
//Setup Bitmap pushbuttons
|
|
m_backBitmapButton.AutoLoad(IDC_BACKBUTTON, this);
|
|
m_listBitmapButton.AutoLoad(IDC_LISTBUTTON, this);
|
|
m_listBitmapButton.EnableWindow(FALSE);
|
|
m_detailBitmapButton.AutoLoad(IDC_DETAILBUTTON, this);
|
|
|
|
//Enable tool tips for this dialog
|
|
EnableToolTips(TRUE);
|
|
|
|
//Setup column for report view
|
|
LV_COLUMN lvCol;
|
|
lvCol.mask = LVCF_FMT | LVCF_WIDTH;
|
|
lvCol.fmt = LVCFMT_LEFT;
|
|
lvCol.cx = MAX_SERVER_NAME_LENGTH;
|
|
m_list.InsertColumn(1, &lvCol);
|
|
|
|
m_list.SetImageList (&m_imageList, LVSIL_SMALL);
|
|
|
|
oldStyle = :: GetWindowLong(m_list.m_hWnd, GWL_STYLE);
|
|
|
|
:: SetWindowLong (m_list.m_hWnd,
|
|
GWL_STYLE, oldStyle | LVS_LIST | LVS_SINGLESEL);
|
|
|
|
char buff [500 + 1];
|
|
buff[0] = 0;
|
|
|
|
//check if this is a Windows 95 machine
|
|
//This is a Windows 95 machine
|
|
//by getting the info from the registry
|
|
fIsWin95 = TRUE;
|
|
|
|
HKEY keyHandle = (HKEY)1;
|
|
long fStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
|
"System\\CurrentControlSet\\Services\\VxD\\VNETSUP", 0, KEY_READ, &keyHandle);
|
|
|
|
if (fStatus == ERROR_SUCCESS)
|
|
{
|
|
DWORD sizebuff = 500;
|
|
DWORD typeValue;
|
|
|
|
|
|
fStatus = RegQueryValueEx(keyHandle, "Workgroup", NULL,
|
|
&typeValue, (LPBYTE)buff, &sizebuff);
|
|
|
|
}
|
|
|
|
if ( (fStatus != ERROR_SUCCESS) )
|
|
{
|
|
fIsWin95 = FALSE;
|
|
|
|
buff[0] = 0;
|
|
//Check if you can call NetWkstaGetInfo in the NETAPI32.DLL
|
|
ULPRET pProcAddr = NULL;
|
|
HINSTANCE hNetApi = LoadLibrary("NETAPI32.DLL");
|
|
|
|
if (hNetApi)
|
|
{
|
|
pProcAddr = (ULPRET) GetProcAddress(hNetApi, "NetWkstaGetInfo");
|
|
}
|
|
|
|
if (hNetApi && pProcAddr)
|
|
{
|
|
//Use NetAPI32
|
|
|
|
LPBYTE buffer;
|
|
((*pProcAddr)(NULL, 100, &buffer));
|
|
LPWkstaInfo100 lpFred = (LPWkstaInfo100) buffer;
|
|
wsprintf (buff, "%ws", lpFred->wki100_langroup);
|
|
}
|
|
|
|
//Tidy up
|
|
if (hNetApi)
|
|
FreeLibrary(hNetApi);
|
|
}
|
|
|
|
buff[500] = 0;
|
|
|
|
NETRESOURCE nr;
|
|
nr.dwScope = RESOURCE_GLOBALNET;
|
|
nr.dwType = RESOURCETYPE_ANY;
|
|
nr.dwDisplayType = RESOURCEDISPLAYTYPE_DOMAIN;
|
|
nr.dwUsage = RESOURCEUSAGE_CONTAINER;
|
|
nr.lpLocalName = NULL;
|
|
nr.lpRemoteName = buff;
|
|
nr.lpComment = "";
|
|
|
|
//New stuff to get provider name
|
|
DWORD buffSize = 500;
|
|
char provName [500];
|
|
|
|
DWORD dwResult = WNetGetProviderName(WNNC_NET_MSNET, provName, &buffSize);
|
|
|
|
if (dwResult != WN_SUCCESS)
|
|
{
|
|
dwResult = WNetGetProviderName(WNNC_NET_LANMAN, provName, &buffSize);
|
|
}
|
|
|
|
if (dwResult != WN_SUCCESS)
|
|
{
|
|
ODBCTRACE ("\nWBEM ODBC Driver : Failed to get provider name\n");
|
|
}
|
|
else
|
|
{
|
|
ODBCTRACE ("\nWBEM ODBC Driver : Provider name = ");
|
|
ODBCTRACE (provName);
|
|
ODBCTRACE ("\n");
|
|
}
|
|
|
|
nr.lpProvider = provName;
|
|
|
|
//Add first entry in callback list (i.e. previous list)
|
|
pPrevList = new CNetResourceList(nr, FALSE);
|
|
pPrevList->fUseGlobe = TRUE;
|
|
|
|
count = 0;
|
|
EnumerateServers(&nr, pPrevList->fUseGlobe);
|
|
|
|
//Give Cancel pushbutton focus
|
|
m_cancelButton.SetFocus();
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
|
|
void CBrowseDialog :: EnumerateServers(LPNETRESOURCE lpnr, BOOL fUseGlobe)
|
|
{
|
|
//Disable controls before enumeration
|
|
BeginWaitCursor();
|
|
m_okButton.EnableWindow(FALSE);
|
|
m_backBitmapButton.EnableWindow(FALSE);
|
|
|
|
HANDLE hEnum = NULL;
|
|
DWORD dwResult = 0;
|
|
|
|
|
|
//check if this is Windows 95 asking for the Entire Network
|
|
NETRESOURCE nr95;
|
|
if (fIsWin95 && !lpnr)
|
|
{
|
|
nr95.dwScope = RESOURCE_GLOBALNET;
|
|
nr95.dwType = RESOURCETYPE_ANY;
|
|
nr95.dwDisplayType = RESOURCEDISPLAYTYPE_NETWORK;
|
|
nr95.dwUsage = RESOURCEUSAGE_CONTAINER;
|
|
nr95.lpLocalName = NULL;
|
|
nr95.lpRemoteName = NULL;
|
|
nr95.lpComment = HMM_STR_MN;
|
|
nr95.lpProvider = HMM_STR_MN;
|
|
|
|
dwResult = WNetOpenEnum(RESOURCE_GLOBALNET,
|
|
RESOURCETYPE_ANY, 0, &nr95, &hEnum);
|
|
}
|
|
else
|
|
{
|
|
dwResult = WNetOpenEnum(RESOURCE_GLOBALNET,
|
|
RESOURCETYPE_ANY, 0, lpnr, &hEnum);
|
|
}
|
|
|
|
//Only disable cancel button after enumeration returned
|
|
m_cancelButton.EnableWindow(FALSE);
|
|
|
|
BOOL fUseBackArrow = FALSE; //can we go back to previous screen ?
|
|
|
|
if ( dwResult != NO_ERROR )
|
|
{
|
|
EndWaitCursor();
|
|
m_cancelButton.EnableWindow(TRUE);
|
|
m_backBitmapButton.EnableWindow(!fUseGlobe);
|
|
return;
|
|
}
|
|
|
|
DWORD dwResultEnum = 0;
|
|
|
|
DWORD cbBuffer = 16384; //16k is a reasonable size
|
|
DWORD cEntries = 0xFFFFFFFF; //get all entries
|
|
LPNETRESOURCE lpnrLocal = NULL;
|
|
|
|
|
|
//Check if you need to add a back arrow or globe
|
|
if ( fUseGlobe )
|
|
{
|
|
//Add Globe
|
|
LV_ITEM tempItem1;
|
|
tempItem1.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
|
|
tempItem1.iItem = count++;
|
|
tempItem1.iSubItem = 0;
|
|
tempItem1.pszText = HMM_STR_ENTIRE_NWORK;
|
|
tempItem1.state = 0;
|
|
tempItem1.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
|
|
tempItem1.iImage = HMM_ICON_GLOBE;
|
|
tempItem1.lParam = (DWORD) NULL;
|
|
m_list.InsertItem(&tempItem1);
|
|
|
|
//Disable the back arrow
|
|
fUseBackArrow = FALSE;
|
|
}
|
|
else
|
|
{
|
|
//Add Back Arrow
|
|
|
|
//Enable the back arrow
|
|
fUseBackArrow = TRUE;
|
|
|
|
if (lpnr)
|
|
{
|
|
//Add to head of current selection list for speedy clean up
|
|
pCurrentSelectionList = new CNetResourceList(*lpnr, FALSE);
|
|
pCurrentItem = pCurrentSelectionList;
|
|
}
|
|
}
|
|
|
|
|
|
do
|
|
{
|
|
//Allocate memory for NETRESOURCE structures
|
|
//to retrieve from enumeration
|
|
lpnrLocal = (LPNETRESOURCE) GlobalAlloc (GPTR, cbBuffer);
|
|
|
|
if (lpnrLocal)
|
|
{
|
|
dwResultEnum = WNetEnumResource (hEnum, &cEntries,
|
|
lpnrLocal, &cbBuffer);
|
|
|
|
|
|
if ( (dwResultEnum == NO_ERROR))
|
|
{
|
|
for (DWORD i = 0; i < cEntries; i++)
|
|
{
|
|
//Display NETRESOURCE structure
|
|
NETRESOURCE fred = lpnrLocal[i];
|
|
|
|
if (fred.lpRemoteName)
|
|
{
|
|
//Insert into List View Control
|
|
LV_ITEM tempItem;
|
|
tempItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
|
|
tempItem.iItem = count++;
|
|
tempItem.iSubItem = 0;
|
|
tempItem.pszText = fred.lpRemoteName;
|
|
tempItem.state = 0;
|
|
tempItem.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
|
|
|
|
//Work out which icon to use
|
|
if (lpnrLocal[i].dwDisplayType == RESOURCEDISPLAYTYPE_SERVER)
|
|
tempItem.iImage = HMM_ICON_SERVER;
|
|
else if (lpnrLocal[i].dwDisplayType == RESOURCEDISPLAYTYPE_NETWORK)
|
|
tempItem.iImage = HMM_ICON_NETWORK;
|
|
else if (lpnrLocal[i].dwDisplayType == RESOURCEDISPLAYTYPE_GENERIC)
|
|
tempItem.iImage = HMM_ICON_NETWORK;
|
|
else
|
|
tempItem.iImage = HMM_ICON_OTHER;
|
|
|
|
|
|
//Add to end of current selection list for speedy clean up
|
|
CNetResourceList* pt = new CNetResourceList(fred, FALSE);
|
|
|
|
if (pCurrentSelectionList)
|
|
{
|
|
pCurrentItem->pNext = pt;
|
|
pCurrentItem = pt;
|
|
}
|
|
else
|
|
{
|
|
pCurrentSelectionList = pt;
|
|
pCurrentItem = pt;
|
|
}
|
|
|
|
tempItem.lParam = (DWORD) pt;
|
|
m_list.InsertItem(&tempItem);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//Tidy up
|
|
GlobalFree( (HGLOBAL) lpnrLocal);
|
|
}
|
|
else
|
|
break;
|
|
|
|
} while (dwResultEnum != ERROR_NO_MORE_ITEMS);
|
|
|
|
WNetCloseEnum(hEnum);
|
|
|
|
//Re-enable pushbuttons
|
|
m_backBitmapButton.EnableWindow(fUseBackArrow);
|
|
m_cancelButton.EnableWindow(TRUE);
|
|
EndWaitCursor();
|
|
|
|
// if (m_list.GetSelectedCount())
|
|
// m_okButton.EnableWindow(TRUE);
|
|
}
|
|
|
|
void CBrowseDialog::OnDblclkList2(int index)
|
|
{
|
|
if ((index != -1))
|
|
{
|
|
LV_ITEM tempItem;
|
|
tempItem.mask = LVIF_IMAGE | LVIF_PARAM;
|
|
tempItem.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
|
|
tempItem.iSubItem = 0;
|
|
tempItem.iItem = index;
|
|
|
|
if ( m_list.GetItem(&tempItem) )
|
|
{
|
|
|
|
//Check if you clicked on globe or arrow
|
|
if (tempItem.iImage == HMM_ICON_GLOBE)
|
|
{
|
|
//Remove current items in list view control
|
|
CleanUpListCtrl();
|
|
m_list.DeleteAllItems();
|
|
|
|
//Get Microsoft Network Info
|
|
count = 0;
|
|
|
|
//Add to start of previous list
|
|
CNetResourceList* pt = pPrevList;
|
|
pPrevList = new CNetResourceList(dummy, TRUE);
|
|
if (pt)
|
|
pPrevList->pNext = pt;
|
|
|
|
EnumerateServers(NULL, pPrevList->fUseGlobe);
|
|
|
|
//Give Cancel pushbutton focus
|
|
m_cancelButton.SetFocus();
|
|
}
|
|
else
|
|
{
|
|
CNetResourceList* pNR = (CNetResourceList*)tempItem.lParam;
|
|
|
|
|
|
if (pNR && pNR->dwDisplayType != RESOURCEDISPLAYTYPE_SERVER)
|
|
{
|
|
//Setup information for new enumeration
|
|
NETRESOURCE nr2;
|
|
nr2.lpLocalName = NULL;
|
|
nr2.lpRemoteName = NULL;
|
|
nr2.lpComment = NULL;
|
|
nr2.lpProvider = NULL;
|
|
|
|
BOOL fNULL = pNR->fIsNULL;
|
|
|
|
if (!fNULL)
|
|
{
|
|
Clone(nr2, pNR->dwScope, pNR->dwType, pNR->dwDisplayType, pNR->dwUsage,
|
|
pNR->lpLocalName, pNR->lpRemoteName, pNR->lpComment, pNR->lpProvider);
|
|
}
|
|
|
|
//Add item to front of list
|
|
CNetResourceList* pt = pPrevList;
|
|
pPrevList = new CNetResourceList(nr2, fNULL);
|
|
if (pt)
|
|
pPrevList->pNext = pt;
|
|
|
|
//Remove current items in list view control
|
|
CleanUpListCtrl();
|
|
m_list.DeleteAllItems();
|
|
|
|
|
|
count = 0;
|
|
|
|
if (fNULL)
|
|
EnumerateServers(NULL, pPrevList->fUseGlobe);
|
|
else
|
|
EnumerateServers(&nr2, pPrevList->fUseGlobe);
|
|
|
|
//Give Cancel pushbutton focus
|
|
m_cancelButton.SetFocus();
|
|
|
|
//Tidy up
|
|
delete nr2.lpLocalName;
|
|
delete nr2.lpRemoteName;
|
|
delete nr2.lpComment;
|
|
delete nr2.lpProvider;
|
|
}
|
|
else
|
|
{
|
|
m_okButton.EnableWindow(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CBrowseDialog::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
|
|
*pResult = 0;
|
|
|
|
//Get current position of mouse cursor and perform
|
|
//a hit test on the tree control
|
|
POINT cursorPos;
|
|
cursorPos.x = 0;
|
|
cursorPos.y = 0;
|
|
BOOL state = GetCursorPos(&cursorPos);
|
|
|
|
m_list.ScreenToClient(&cursorPos);
|
|
|
|
UINT fFlags = 0;
|
|
|
|
int index = m_list.HitTest(cursorPos, &fFlags);
|
|
|
|
if (fFlags & LVHT_ONITEM)
|
|
{
|
|
OnDblclkList2(index);
|
|
}
|
|
}
|
|
|
|
|
|
void CBrowseDialog :: CleanUpListCtrl()
|
|
{
|
|
//Disable back button (if applicable)
|
|
m_backBitmapButton.EnableWindow(FALSE);
|
|
|
|
if (pCurrentSelectionList)
|
|
{
|
|
CNetResourceList* theNext = NULL;
|
|
do
|
|
{
|
|
theNext = pCurrentSelectionList->pNext;
|
|
delete pCurrentSelectionList;
|
|
pCurrentSelectionList = theNext;
|
|
} while (pCurrentSelectionList);
|
|
}
|
|
|
|
pCurrentSelectionList = NULL;
|
|
pCurrentItem = NULL;
|
|
}
|
|
|
|
void CBrowseDialog::OnBackbutton()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
//Remove current items in list view control
|
|
CleanUpListCtrl();
|
|
m_list.DeleteAllItems();
|
|
|
|
//Remove item from front of list
|
|
CNetResourceList* pt = pPrevList->pNext;
|
|
pPrevList->pNext = NULL;
|
|
delete pPrevList;
|
|
pPrevList = pt;
|
|
|
|
//Go back and get previous enumeration
|
|
NETRESOURCE temp;
|
|
temp.lpLocalName = NULL;
|
|
temp.lpRemoteName = NULL;
|
|
temp.lpComment = NULL;
|
|
temp.lpProvider = NULL;
|
|
|
|
|
|
BOOL fGlobe = pPrevList->fUseGlobe;
|
|
BOOL fNULL = pPrevList->fIsNULL;
|
|
|
|
if ( ! fNULL)
|
|
{
|
|
Clone(temp, pPrevList->dwScope, pPrevList->dwType, pPrevList->dwDisplayType, pPrevList->dwUsage,
|
|
pPrevList->lpLocalName, pPrevList->lpRemoteName, pPrevList->lpComment, pPrevList->lpProvider);
|
|
}
|
|
|
|
count = 0;
|
|
|
|
if (fNULL)
|
|
EnumerateServers(NULL, fGlobe);
|
|
else
|
|
EnumerateServers(&temp, fGlobe);
|
|
|
|
//Give Cancel pushbutton focus
|
|
m_cancelButton.SetFocus();
|
|
|
|
//Tidy Up
|
|
delete temp.lpLocalName;
|
|
delete temp.lpRemoteName;
|
|
delete temp.lpComment;
|
|
delete temp.lpProvider;
|
|
}
|
|
|
|
void CBrowseDialog::OnListbutton()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
m_listBitmapButton.EnableWindow(FALSE);
|
|
m_detailBitmapButton.EnableWindow(TRUE);
|
|
|
|
int cCount = m_list.GetItemCount();
|
|
|
|
:: SetWindowLong (m_list.m_hWnd,
|
|
GWL_STYLE, oldStyle | LVS_LIST | LVS_SINGLESEL);
|
|
|
|
m_list.RedrawItems(0, cCount - 1);
|
|
UpdateWindow();
|
|
}
|
|
|
|
void CBrowseDialog::OnDetailbutton()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
m_detailBitmapButton.EnableWindow(FALSE);
|
|
m_listBitmapButton.EnableWindow(TRUE);
|
|
|
|
int cCount = m_list.GetItemCount();
|
|
|
|
:: SetWindowLong (m_list.m_hWnd,
|
|
GWL_STYLE, oldStyle | LVS_NOCOLUMNHEADER | LVS_ICON | LVS_REPORT | LVS_SINGLESEL);
|
|
|
|
m_list.RedrawItems(0, cCount - 1);
|
|
UpdateWindow();
|
|
}
|
|
|
|
BOOL CBrowseDialog::OnNeedText(UINT id, NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
TOOLTIPTEXT* pTTT = (TOOLTIPTEXT*)pNMHDR;
|
|
UINT nID = pNMHDR->idFrom;
|
|
if (pTTT->uFlags & TTF_IDISHWND)
|
|
{
|
|
//idFrom is actually the HWND of the tool
|
|
nID= :: GetDlgCtrlID((HWND)nID);
|
|
switch (nID)
|
|
{
|
|
case IDC_BACKBUTTON:
|
|
{
|
|
pTTT->lpszText = MAKEINTRESOURCE(STR_PREVIOUS);
|
|
pTTT->hinst = AfxGetResourceHandle();
|
|
return (TRUE);
|
|
}
|
|
break;
|
|
case IDC_LISTBUTTON:
|
|
{
|
|
pTTT->lpszText = MAKEINTRESOURCE(STR_LIST_VIEW);
|
|
pTTT->hinst = AfxGetResourceHandle();
|
|
return (TRUE);
|
|
}
|
|
break;
|
|
case IDC_DETAILBUTTON:
|
|
{
|
|
pTTT->lpszText = MAKEINTRESOURCE(STR_REPORT_VIEW);
|
|
pTTT->hinst = AfxGetResourceHandle();
|
|
return (TRUE);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
return (FALSE);
|
|
}
|
|
void CBrowseDialog :: OnNcDestroy ()
|
|
{
|
|
CWindowInfo *pwindowInfo = NULL;
|
|
BOOL found = windowMap.Lookup ((SHORT) ((DWORD)m_hWnd & 0xffff), pwindowInfo);
|
|
ASSERT (found);
|
|
if (found)
|
|
{
|
|
:: SetWindowLong (m_hWnd, GWL_WNDPROC, (DWORD) pwindowInfo->m_oldWindowProc);
|
|
windowMap.RemoveKey ((SHORT) ((DWORD)m_hWnd & 0xffff));
|
|
delete pwindowInfo;
|
|
}
|
|
m_cancelButton.Detach ();
|
|
m_okButton.Detach ();
|
|
m_list.Detach ();
|
|
CDialog :: OnNcDestroy ();
|
|
}
|
|
|
|
void CBrowseDialog::OnOK()
|
|
{
|
|
//Get name of selected item using selected item index
|
|
LV_ITEM tempItem;
|
|
tempItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
|
|
tempItem.iItem = iSelectedItem;
|
|
tempItem.iSubItem = 0;
|
|
tempItem.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
|
|
tempItem.pszText = lpServerName;
|
|
tempItem.cchTextMax = MAX_SERVER_NAME_LENGTH;
|
|
|
|
if ( m_list.GetItem(&tempItem) )
|
|
{
|
|
//Copy name of network resource
|
|
// lpServerName[0] = 0;
|
|
// if (tempItem.pszText)
|
|
// {
|
|
// strncpy(lpServerName, tempItem.pszText, MAX_SERVER_NAME_LENGTH);
|
|
// lpServerName[MAX_SERVER_NAME_LENGTH] = 0;
|
|
// }
|
|
}
|
|
|
|
CDialog::OnOK();
|
|
}
|
|
|
|
//Populates a NETRESOURCE structure with the input parameters
|
|
void CBrowseDialog :: Clone(NETRESOURCE &nrClone, DWORD nrScope, DWORD nrType, DWORD nrDisplayType, DWORD nrUsage,
|
|
LPSTR lpLocalName, LPSTR lpRemoteName, LPSTR lpComment, LPSTR lpProvider)
|
|
{
|
|
nrClone.lpLocalName = NULL;
|
|
nrClone.lpRemoteName = NULL;
|
|
nrClone.lpComment = NULL;
|
|
nrClone.lpProvider = NULL;
|
|
|
|
|
|
nrClone.dwScope = nrScope;
|
|
nrClone.dwType = nrType;
|
|
nrClone.dwDisplayType = nrDisplayType;
|
|
nrClone.dwUsage = nrUsage;
|
|
|
|
if (lpLocalName)
|
|
{
|
|
nrClone.lpLocalName = new char [strlen(lpLocalName) + 1];
|
|
nrClone.lpLocalName[0] = 0;
|
|
strcpy(nrClone.lpLocalName, lpLocalName);
|
|
}
|
|
|
|
if (lpRemoteName)
|
|
{
|
|
nrClone.lpRemoteName = new char [strlen(lpRemoteName) + 1];
|
|
nrClone.lpRemoteName[0] = 0;
|
|
strcpy(nrClone.lpRemoteName, lpRemoteName);
|
|
}
|
|
|
|
if (lpComment)
|
|
{
|
|
nrClone.lpComment = new char [strlen(lpComment) + 1];
|
|
nrClone.lpComment[0] = 0;
|
|
strcpy(nrClone.lpComment, lpComment);
|
|
}
|
|
|
|
if (lpProvider)
|
|
{
|
|
nrClone.lpProvider = new char [strlen(lpProvider) + 1];
|
|
nrClone.lpProvider[0] = 0;
|
|
strcpy(nrClone.lpProvider, lpProvider);
|
|
}
|
|
|
|
}
|
|
|
|
// -1 if no selected index
|
|
int CBrowseDialog::GetSelectedIndex(DWORD &dwDisplayType)
|
|
{
|
|
//Check if one item is selected
|
|
int selecCount = m_list.GetSelectedCount();
|
|
int itemCount = m_list.GetItemCount();
|
|
|
|
if ( selecCount == 1 )
|
|
{
|
|
int mySelIndex = m_list.GetNextItem ( -1 , LVNI_ALL | LVNI_SELECTED ) ;
|
|
|
|
if (mySelIndex != -1)
|
|
{
|
|
LV_ITEM myItem;
|
|
myItem.mask = LVIF_STATE | LVIF_IMAGE | LVIF_PARAM;
|
|
myItem.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
|
|
myItem.iItem = mySelIndex;
|
|
myItem.iSubItem = 0;
|
|
|
|
//Find index to this item
|
|
if ( m_list.GetItem(&myItem) )
|
|
{
|
|
CNetResourceList* pNR = (CNetResourceList*)myItem.lParam;
|
|
|
|
if (pNR)
|
|
dwDisplayType = pNR->dwDisplayType;
|
|
|
|
return mySelIndex; //break out now
|
|
}
|
|
}
|
|
}
|
|
|
|
//No selected item found
|
|
return -1;
|
|
}
|
|
|
|
void CBrowseDialog::OnItemchangedList3(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
|
|
// TODO: Add your control notification handler code here
|
|
|
|
*pResult = 0;
|
|
|
|
ODBCTRACE ("\nCBrowseDialog::OnItemchangedList3\n");
|
|
|
|
DWORD dwDisplayType = 0;
|
|
int mySelectedIndex = GetSelectedIndex(dwDisplayType);
|
|
if ( mySelectedIndex != -1 )
|
|
{
|
|
iSelectedItem = mySelectedIndex;
|
|
|
|
//check if selected item is a server
|
|
if (dwDisplayType == RESOURCEDISPLAYTYPE_SERVER)
|
|
m_okButton.EnableWindow(TRUE);
|
|
else
|
|
m_okButton.EnableWindow(FALSE);
|
|
}
|
|
}
|
|
|
|
void CBrowseDialog::OnKeyDown(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
ODBCTRACE ("\nCBrowseDialog::OnKeyDown\n");
|
|
|
|
TV_KEYDOWN* lParam = (TV_KEYDOWN*)pNMHDR;
|
|
// TODO: Add your control notification handler code here
|
|
|
|
*pResult = 0;
|
|
|
|
//Check if SPACE BAR is pressed (to expand node)
|
|
if ( lParam->wVKey == VK_SPACE )
|
|
{
|
|
DWORD dwDisplayType = 0;
|
|
int mySelectedIndex = GetSelectedIndex(dwDisplayType);
|
|
OnDblclkList2(mySelectedIndex);
|
|
}
|
|
else if (lParam->wVKey == VK_BACK)
|
|
{
|
|
//BACKSPACE PRESSED (for Up One Level)
|
|
if ( m_backBitmapButton.IsWindowEnabled() )
|
|
{
|
|
OnBackbutton();
|
|
}
|
|
}
|
|
else if (lParam->wVKey == 'L')
|
|
{
|
|
//L PRESSED (for List View)
|
|
OnListbutton();
|
|
}
|
|
else if (lParam->wVKey == 'D')
|
|
{
|
|
//D PRESSED (for Details View)
|
|
OnDetailbutton();
|
|
}
|
|
}
|