//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1995 - 1995. // // File: enum.cxx // // Contents: Implementation of IEnumIDList // // History: 13-Dec-95 BruceFo Created // //---------------------------------------------------------------------------- #include "headers.hxx" #pragma hdrstop #include "resource.h" #include "enum.hxx" #include "util.hxx" CSharesEnum::CSharesEnum( IN PWSTR pszMachine, IN DWORD level ) : m_pszMachine(pszMachine), m_level(level), m_uFlags(0), m_pShares(NULL), m_cShares(0), m_dwEnumFlags(0), m_iCurrent(0), m_ulRefs(0) { AddRef(); } HRESULT CSharesEnum::Init( ULONG uFlags ) { HRESULT hr = S_OK; LPBYTE pBuf = NULL; DWORD entriesread, totalentries; NET_API_STATUS ret = NERR_Success; m_uFlags = uFlags; // // Enumerate shares. // appAssert(m_level == 1 || m_level == 2); ret = NetShareEnum( m_pszMachine, m_level, &pBuf, 0xffffffff, // get them all! &entriesread, &totalentries, NULL); if (NERR_Success != ret) { hr = HRESULT_FROM_WIN32(ret); } else { appAssert(entriesread == totalentries); m_pShares = (SHARE_INFO_2*)pBuf; // possibly level one info m_cShares = entriesread; #ifdef WIZARDS m_dwEnumFlags = EF_SHOW_NEW_WIZARD; // Now, see if the machine is running the NetWare or Mac server. PSERVER_INFO_101 pServerInfo; NET_API_STATUS ret = NetServerGetInfo(m_pszMachine, 101, (LPBYTE*)&pServerInfo); if (NERR_Success != ret) { hr = HRESULT_FROM_WIN32(ret); } else { if (pServerInfo->sv101_type & SV_TYPE_AFP) { m_dwEnumFlags |= EF_SHOW_MAC_WIZARD; } if (pServerInfo->sv101_type & SV_TYPE_NOVELL) { m_dwEnumFlags |= EF_SHOW_NW_WIZARD; } // If *either* of the non-SMB servers are running, then all the // special "all" wizard object. if (m_dwEnumFlags & (EF_SHOW_MAC_WIZARD | EF_SHOW_NW_WIZARD)) { m_dwEnumFlags |= EF_SHOW_ALL_WIZARD; } } NetApiBufferFree(pServerInfo); #endif // WIZARDS } return hr; } CSharesEnum::~CSharesEnum() { if (NULL != m_pShares) { NetApiBufferFree(m_pShares); } } STDMETHODIMP CSharesEnum::Next( ULONG celt, LPITEMIDLIST* ppidlOut, ULONG* pceltFetched ) { HRESULT hr = S_OK; IDSHARE ids; ULONG celtFetched = 0; if (NULL == pceltFetched) { if (celt != 1) { return E_INVALIDARG; } } else { *pceltFetched = 0; } if (celt == 0) { return S_OK; } if (!(m_uFlags & SHCONTF_NONFOLDERS)) { return S_FALSE; } CopyAnother: if (celtFetched == celt) { if (NULL != pceltFetched) { *pceltFetched = celtFetched; } return S_OK; // got celt elements } #ifdef WIZARDS if (0 != m_dwEnumFlags) { // We still have some special stuff to enumerate if (m_dwEnumFlags & EF_SHOW_NEW_WIZARD) { FillSpecialID(&ids, SHID_SHARE_NEW, IDS_SHARE_NEW); m_dwEnumFlags &= ~EF_SHOW_NEW_WIZARD; goto CopyOne; } if (m_dwEnumFlags & EF_SHOW_NW_WIZARD) { FillSpecialID(&ids, SHID_SHARE_NW, IDS_SHARE_NW); m_dwEnumFlags &= ~EF_SHOW_NW_WIZARD; goto CopyOne; } if (m_dwEnumFlags & EF_SHOW_MAC_WIZARD) { FillSpecialID(&ids, SHID_SHARE_MAC, IDS_SHARE_MAC); m_dwEnumFlags &= ~EF_SHOW_MAC_WIZARD; goto CopyOne; } if (m_dwEnumFlags & EF_SHOW_ALL_WIZARD) { FillSpecialID(&ids, SHID_SHARE_ALL, IDS_SHARE_ALL); m_dwEnumFlags &= ~EF_SHOW_ALL_WIZARD; goto CopyOne; } } #endif // WIZARDS if (m_iCurrent >= m_cShares) { // already enumerated all of them if (NULL != pceltFetched) { *pceltFetched = celtFetched; } return S_FALSE; // didn't copy celt } switch (m_level) { case 1: FillID1(&ids, &(((LPSHARE_INFO_1)m_pShares)[m_iCurrent])); break; case 2: FillID2(&ids, &(((LPSHARE_INFO_2)m_pShares)[m_iCurrent])); break; default: appAssert(FALSE); } ++m_iCurrent; #ifdef WIZARDS CopyOne: #endif // WIZARDS ppidlOut[celtFetched] = ILClone((LPCITEMIDLIST)(&ids)); if (NULL == ppidlOut[celtFetched]) { // free up everything so far for (ULONG i = 0; i < celtFetched; i++) { ILFree(ppidlOut[i]); } return E_OUTOFMEMORY; } ++celtFetched; goto CopyAnother; } STDMETHODIMP CSharesEnum::Skip( ULONG celt ) { if (m_iCurrent >= m_cShares) { return S_FALSE; } m_iCurrent += celt; return NOERROR; } STDMETHODIMP CSharesEnum::Reset( VOID ) { m_iCurrent = 0; return NOERROR; } STDMETHODIMP CSharesEnum::Clone( IEnumIDList** ppenum ) { return E_FAIL; // not supported }