[ros-diffs] [janderwald] 35707: - Start Implementing Network Connections ShellFolder

janderwald at svn.reactos.org janderwald at svn.reactos.org
Wed Aug 27 19:18:25 CEST 2008


Author: janderwald
Date: Wed Aug 27 12:18:25 2008
New Revision: 35707

URL: http://svn.reactos.org/svn/reactos?rev=35707&view=rev
Log:
- Start Implementing Network Connections ShellFolder

Added:
    trunk/reactos/dll/win32/netshell/   (with props)
    trunk/reactos/dll/win32/netshell/classfactory.c   (with props)
    trunk/reactos/dll/win32/netshell/enumlist.c   (with props)
    trunk/reactos/dll/win32/netshell/lang/   (with props)
    trunk/reactos/dll/win32/netshell/netshell.c   (with props)
    trunk/reactos/dll/win32/netshell/netshell.rbuild   (with props)
    trunk/reactos/dll/win32/netshell/netshell.rc   (with props)
    trunk/reactos/dll/win32/netshell/netshell.spec   (with props)
    trunk/reactos/dll/win32/netshell/precomp.h   (with props)
    trunk/reactos/dll/win32/netshell/res/   (with props)
    trunk/reactos/dll/win32/netshell/res/netshell.ico
      - copied unchanged from r35689, trunk/reactos/dll/win32/shell32/res/icons/172.ico
    trunk/reactos/dll/win32/netshell/resource.h   (with props)
    trunk/reactos/dll/win32/netshell/shfldr_netconnect.c   (with props)
Modified:
    trunk/reactos/dll/win32/win32.rbuild

Propchange: trunk/reactos/dll/win32/netshell/
------------------------------------------------------------------------------
--- bugtraq:logregex (added)
+++ bugtraq:logregex Wed Aug 27 12:18:25 2008
@@ -1,0 +1,2 @@
+([Ii]ssue|[Bb]ug)s? #?(\d+)(,? ?#?(\d+))*(,? ?(and |or )?#?(\d+))?
+(\d+)

Propchange: trunk/reactos/dll/win32/netshell/
------------------------------------------------------------------------------
    bugtraq:message = See issue #%BUGID% for more details.

Propchange: trunk/reactos/dll/win32/netshell/
------------------------------------------------------------------------------
    bugtraq:url = http://www.reactos.org/bugzilla/show_bug.cgi?id=%BUGID%

Propchange: trunk/reactos/dll/win32/netshell/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed Aug 27 12:18:25 2008
@@ -1,0 +1,7 @@
+GNUmakefile
+*.vcproj
+*.user
+*.cbp
+*.ncb
+*.suo
+*.sln

Propchange: trunk/reactos/dll/win32/netshell/
------------------------------------------------------------------------------
    tsvn:logminsize = 10

Added: trunk/reactos/dll/win32/netshell/classfactory.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netshell/classfactory.c?rev=35707&view=auto
==============================================================================
--- trunk/reactos/dll/win32/netshell/classfactory.c (added)
+++ trunk/reactos/dll/win32/netshell/classfactory.c [iso-8859-1] Wed Aug 27 12:18:25 2008
@@ -1,0 +1,125 @@
+#include <precomp.h>
+
+typedef struct
+{
+    const IClassFactoryVtbl    *lpVtbl;
+    LONG                       ref;
+    CLSID                      *rclsid;
+    LPFNCREATEINSTANCE         lpfnCI;
+    const IID *                riidInst;
+} IClassFactoryImpl;
+
+
+static
+HRESULT
+WINAPI
+IClassFactory_fnQueryInterface(
+    LPCLASSFACTORY iface,
+    REFIID riid,
+    LPVOID *ppvObj)
+{
+    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+
+    *ppvObj = NULL;
+
+    if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IClassFactory))
+    {
+        *ppvObj = This;
+        InterlockedIncrement(&This->ref);
+        return S_OK;
+    }
+    return E_NOINTERFACE;
+}
+
+static
+ULONG
+WINAPI
+IClassFactory_fnAddRef(
+    LPCLASSFACTORY iface)
+{
+    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+    ULONG refCount = InterlockedIncrement(&This->ref);
+
+    return refCount;
+}
+
+static
+ULONG
+WINAPI
+IClassFactory_fnRelease(
+    LPCLASSFACTORY iface)
+{
+    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+    ULONG refCount = InterlockedDecrement(&This->ref);
+
+    if (!refCount)
+    {
+        HeapFree(GetProcessHeap(),0,This);
+        return 0;
+    }
+    return refCount;
+}
+
+static
+HRESULT
+WINAPI
+IClassFactory_fnCreateInstance(
+    LPCLASSFACTORY iface,
+    LPUNKNOWN pUnkOuter,
+    REFIID riid,
+    LPVOID *ppvObject)
+{
+    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+
+    *ppvObject = NULL;
+
+    if ( This->riidInst==NULL || IsEqualCLSID(riid, This->riidInst) || IsEqualCLSID(riid, &IID_IUnknown) )
+    {
+        return This->lpfnCI(pUnkOuter, riid, ppvObject);
+    }
+
+    return E_NOINTERFACE;
+}
+
+static
+HRESULT
+WINAPI IClassFactory_fnLockServer(
+    LPCLASSFACTORY iface,
+    BOOL fLock)
+{
+    //IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+    return E_NOTIMPL;
+}
+
+
+static const IClassFactoryVtbl dclfvt =
+{
+    IClassFactory_fnQueryInterface,
+    IClassFactory_fnAddRef,
+    IClassFactory_fnRelease,
+    IClassFactory_fnCreateInstance,
+    IClassFactory_fnLockServer
+};
+
+
+IClassFactory * 
+IClassFactory_fnConstructor(
+    LPFNCREATEINSTANCE lpfnCI, 
+    PLONG pcRefDll, 
+    REFIID riidInst)
+{
+    IClassFactoryImpl* lpclf;
+
+    lpclf = HeapAlloc(GetProcessHeap(),0,sizeof(IClassFactoryImpl));
+    lpclf->ref = 1;
+    lpclf->lpVtbl = &dclfvt;
+    lpclf->lpfnCI = lpfnCI;
+
+    if (pcRefDll)
+        InterlockedIncrement(pcRefDll);
+    lpclf->riidInst = riidInst;
+
+    return (LPCLASSFACTORY)lpclf;
+}
+
+

Propchange: trunk/reactos/dll/win32/netshell/classfactory.c
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/netshell/enumlist.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netshell/enumlist.c?rev=35707&view=auto
==============================================================================
--- trunk/reactos/dll/win32/netshell/enumlist.c (added)
+++ trunk/reactos/dll/win32/netshell/enumlist.c [iso-8859-1] Wed Aug 27 12:18:25 2008
@@ -1,0 +1,364 @@
+#include <precomp.h>
+
+WINE_DEFAULT_DEBUG_CHANNEL(shell);
+
+typedef struct tagGUIDStruct
+{
+    BYTE dummy; /* offset 01 is unknown */
+    GUID guid;  /* offset 02 */
+} GUIDStruct;
+
+#define PT_GUID		0x1F
+
+typedef struct tagPIDLDATA
+{
+    BYTE type;			/*00*/
+    union
+    {
+        struct tagGUIDStruct guid;
+        struct tagVALUEStruct value;
+    }u;
+} PIDLDATA, *LPPIDLDATA;
+
+typedef struct tagENUMLIST
+{
+    struct tagENUMLIST	*pNext;
+    LPITEMIDLIST		pidl;
+
+}ENUMLIST, *LPENUMLIST;
+
+typedef struct
+{
+    const IEnumIDListVtbl *lpVtbl;
+    LONG        ref;
+    LPENUMLIST  mpFirst;
+    LPENUMLIST  mpLast;
+    LPENUMLIST  mpCurrent;
+
+} IEnumIDListImpl;
+
+/**************************************************************************
+ *  AddToEnumList()
+ */
+BOOL 
+AddToEnumList(
+    IEnumIDList * iface,
+    LPITEMIDLIST pidl)
+{
+    LPENUMLIST  pNew;
+    IEnumIDListImpl *This = (IEnumIDListImpl *)iface;
+
+
+    if (!iface || !pidl)
+        return FALSE;
+
+    pNew = (LPENUMLIST)SHAlloc(sizeof(ENUMLIST));
+    if(pNew)
+    {
+        pNew->pNext = NULL;
+        pNew->pidl = pidl;
+
+        if(!This->mpFirst)
+        {
+            This->mpFirst = pNew;
+            This->mpCurrent = pNew;
+        }
+
+        if(This->mpLast)
+        {
+            /*add the new item to the end of the list */
+            This->mpLast->pNext = pNew;
+        }
+
+        /*update the last item pointer */
+        This->mpLast = pNew;
+        return TRUE;
+    }
+    return FALSE;
+}
+
+static
+HRESULT
+WINAPI
+IEnumIDList_fnQueryInterface(
+    IEnumIDList * iface,
+    REFIID riid,
+    LPVOID *ppvObj)
+{
+    IEnumIDListImpl *This = (IEnumIDListImpl *)iface;
+
+    *ppvObj = NULL;
+
+    if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IEnumIDList))
+    {
+        *ppvObj = This;
+        IEnumIDList_AddRef((IEnumIDList*)*ppvObj);
+        return S_OK;
+    }
+
+    return E_NOINTERFACE;
+}
+
+static
+ULONG
+WINAPI
+IEnumIDList_fnAddRef(
+    IEnumIDList * iface)
+{
+    IEnumIDListImpl *This = (IEnumIDListImpl *)iface;
+    ULONG refCount = InterlockedIncrement(&This->ref);
+
+    return refCount;
+}
+
+static
+ULONG
+WINAPI IEnumIDList_fnRelease(
+    IEnumIDList * iface)
+{
+    LPENUMLIST  pDelete;
+    IEnumIDListImpl *This = (IEnumIDListImpl *)iface;
+    ULONG refCount = InterlockedDecrement(&This->ref);
+
+    if (!refCount) 
+    {
+        while(This->mpFirst)
+        {
+            pDelete = This->mpFirst;
+            This->mpFirst = pDelete->pNext;
+            SHFree(pDelete->pidl);
+            SHFree(pDelete);
+        }
+        HeapFree(GetProcessHeap(),0,This);
+    }
+    return refCount;
+}
+
+static 
+HRESULT
+WINAPI
+IEnumIDList_fnNext(
+    IEnumIDList * iface,
+    ULONG celt,
+    LPITEMIDLIST * rgelt,
+    ULONG *pceltFetched)
+{
+    IEnumIDListImpl *This = (IEnumIDListImpl *)iface;
+
+    ULONG    i;
+    HRESULT  hr = S_OK;
+    LPITEMIDLIST  temp;
+
+    if(pceltFetched)
+        *pceltFetched = 0;
+
+    *rgelt=0;
+
+    if(celt > 1 && !pceltFetched)
+    {
+        return E_INVALIDARG;
+    }
+
+    if(celt > 0 && !This->mpCurrent)
+    {
+        return S_FALSE;
+    }
+
+    for(i = 0; i < celt; i++)
+    {
+        if(!(This->mpCurrent))
+            break;
+
+        temp = ILClone(This->mpCurrent->pidl);
+        rgelt[i] = temp;
+        This->mpCurrent = This->mpCurrent->pNext;
+    }
+
+    if(pceltFetched)
+    {
+        *pceltFetched = i;
+    }
+
+    return hr;
+}
+
+static
+HRESULT
+WINAPI
+IEnumIDList_fnSkip(
+    IEnumIDList * iface,ULONG celt)
+{
+    IEnumIDListImpl *This = (IEnumIDListImpl *)iface;
+
+    DWORD    dwIndex;
+    HRESULT  hr = S_OK;
+
+    for(dwIndex = 0; dwIndex < celt; dwIndex++)
+    {
+        if(!This->mpCurrent)
+        {
+            hr = S_FALSE;
+            break;
+        }
+        This->mpCurrent = This->mpCurrent->pNext;
+    }
+    return hr;
+}
+
+static
+HRESULT
+WINAPI
+IEnumIDList_fnReset(
+    IEnumIDList * iface)
+{
+    IEnumIDListImpl *This = (IEnumIDListImpl *)iface;
+
+    This->mpCurrent = This->mpFirst;
+    return S_OK;
+}
+
+static
+HRESULT
+WINAPI
+IEnumIDList_fnClone(
+    IEnumIDList * iface,
+    LPENUMIDLIST * ppenum)
+{
+    //IEnumIDListImpl *This = (IEnumIDListImpl *)iface;
+
+    return E_NOTIMPL;
+}
+
+static const IEnumIDListVtbl eidlvt =
+{
+    IEnumIDList_fnQueryInterface,
+    IEnumIDList_fnAddRef,
+    IEnumIDList_fnRelease,
+    IEnumIDList_fnNext,
+    IEnumIDList_fnSkip,
+    IEnumIDList_fnReset,
+    IEnumIDList_fnClone,
+};
+
+IEnumIDList * IEnumIDList_Constructor(void)
+{
+    IEnumIDListImpl *lpeidl = HeapAlloc(GetProcessHeap(),
+     HEAP_ZERO_MEMORY, sizeof(IEnumIDListImpl));
+
+    if (lpeidl)
+    {
+        lpeidl->ref = 1;
+        lpeidl->lpVtbl = &eidlvt;
+    }
+
+    return (IEnumIDList*)lpeidl;
+}
+
+LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl)
+{
+    if(pidl && pidl->mkid.cb != 0x00)
+        return (LPPIDLDATA) &(pidl->mkid.abID);
+    return NULL;
+}
+
+LPITEMIDLIST _ILAlloc(BYTE type, unsigned int size)
+{
+    LPITEMIDLIST pidlOut = NULL;
+
+    pidlOut = SHAlloc(size + 5);
+    if(pidlOut)
+    {
+        LPPIDLDATA pData;
+
+        ZeroMemory(pidlOut, size + 5);
+        pidlOut->mkid.cb = size + 3;
+        pData = _ILGetDataPointer(pidlOut);
+        if (pData)
+            pData->type = type;
+
+    }
+
+    return pidlOut;
+}
+
+LPITEMIDLIST _ILCreateNetConnect()
+{
+    LPITEMIDLIST pidlOut;
+
+    pidlOut = _ILAlloc(PT_GUID, sizeof(GUIDStruct));
+    if (pidlOut)
+    {
+        LPPIDLDATA pData = _ILGetDataPointer(pidlOut);
+
+        memcpy(&(pData->u.guid.guid), &CLSID_NetworkConnections, sizeof(GUID));
+    }
+    else
+    {
+        pidlOut = NULL;
+    }
+    return pidlOut;
+}
+
+IID* _ILGetGUIDPointer(LPCITEMIDLIST pidl)
+{
+    LPPIDLDATA pdata =_ILGetDataPointer(pidl);
+
+    if (!pdata)
+        return NULL;
+
+    if (pdata->type != PT_GUID)
+        return NULL;
+    else
+        return &(pdata->u.guid.guid);
+
+}
+
+BOOL _ILIsNetConnect(LPCITEMIDLIST pidl)
+{
+    REFIID iid = _ILGetGUIDPointer(pidl);
+
+    if (iid)
+        return IsEqualIID(iid, &CLSID_NetworkConnections);
+    return FALSE;
+}
+
+LPITEMIDLIST ILCreateNetConnectItem(MIB_IFROW * pRow, LPWSTR szName, LPWSTR szAdapterName)
+{
+    PIDLDATA tmp;
+    LPITEMIDLIST pidl;
+    VALUEStruct * p;
+    int size = sizeof(struct tagVALUEStruct);
+
+    tmp.type = 0x00;
+    tmp.u.value.dummy = 0xFF;
+
+    tmp.u.value.dwOperStatus = pRow->dwOperStatus;
+    tmp.u.value.dwType = pRow->dwType;
+    tmp.u.value.dwNameLength = wcslen(szName) + 1;
+
+    size += (tmp.u.value.dwNameLength + wcslen(szAdapterName)) * sizeof(WCHAR);
+
+    pidl = (LPITEMIDLIST)SHAlloc(size + 4);
+    if (!pidl)
+        return pidl;
+
+    pidl->mkid.cb = size+2;
+    memcpy(pidl->mkid.abID, &tmp, 2+sizeof(struct tagVALUEStruct));
+
+    p = &((PIDLDATA*)pidl->mkid.abID)->u.value;
+    wcscpy(&p->szName[0], szName);
+    wcscpy(p->szName + tmp.u.value.dwNameLength, szAdapterName);
+
+    *(WORD*)((char*)pidl+(size+2)) = 0;
+    return pidl;
+}
+
+VALUEStruct * _ILGetValueStruct(LPCITEMIDLIST pidl)
+{
+    LPPIDLDATA pdata = _ILGetDataPointer(pidl);
+
+    if (pdata && pdata->type==0x00)
+        return (VALUEStruct*)&(pdata->u.value);
+
+    return NULL;
+}

Propchange: trunk/reactos/dll/win32/netshell/enumlist.c
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: trunk/reactos/dll/win32/netshell/lang/
------------------------------------------------------------------------------
--- bugtraq:logregex (added)
+++ bugtraq:logregex Wed Aug 27 12:18:25 2008
@@ -1,0 +1,2 @@
+([Ii]ssue|[Bb]ug)s? #?(\d+)(,? ?#?(\d+))*(,? ?(and |or )?#?(\d+))?
+(\d+)

Propchange: trunk/reactos/dll/win32/netshell/lang/
------------------------------------------------------------------------------
    bugtraq:message = See issue #%BUGID% for more details.

Propchange: trunk/reactos/dll/win32/netshell/lang/
------------------------------------------------------------------------------
    bugtraq:url = http://www.reactos.org/bugzilla/show_bug.cgi?id=%BUGID%

Propchange: trunk/reactos/dll/win32/netshell/lang/
------------------------------------------------------------------------------
    tsvn:logminsize = 10

Added: trunk/reactos/dll/win32/netshell/netshell.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netshell/netshell.c?rev=35707&view=auto
==============================================================================
--- trunk/reactos/dll/win32/netshell/netshell.c (added)
+++ trunk/reactos/dll/win32/netshell/netshell.c [iso-8859-1] Wed Aug 27 12:18:25 2008
@@ -1,0 +1,144 @@
+#include "precomp.h"
+
+HINSTANCE netshell_hInstance;
+const GUID CLSID_NetworkConnections      = {0x7007ACC7, 0x3202, 0x11D1, {0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E}};
+const GUID GUID_DEVCLASS_NET             = {0x4d36e972, 0xe325, 0x11ce, {0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}};
+static const WCHAR szNetConnectClass[] = L"CLSID\\{7007ACC7-3202-11D1-AAD2-00805FC1270E}";
+static const WCHAR szNamespaceKey[] = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace\\{7007ACC7-3202-11D1-AAD2-00805FC1270E}";
+
+static INTERFACE_TABLE InterfaceTable[] =
+{
+    {
+        &CLSID_NetworkConnections,
+        ISF_NetConnect_Constructor
+    },
+    {
+        NULL,
+        NULL
+    }
+};
+
+
+BOOL
+WINAPI
+DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
+{
+    switch (fdwReason)
+    {
+        case DLL_PROCESS_ATTACH:
+            netshell_hInstance = hinstDLL;
+            DisableThreadLibraryCalls(netshell_hInstance);
+            break;
+    default:
+        break;
+    }
+
+    return TRUE;
+}
+
+HRESULT
+WINAPI
+DllCanUnloadNow(void)
+{
+    return S_FALSE;
+}
+
+STDAPI
+DllRegisterServer(void)
+{
+    HKEY hKey, hSubKey;
+    WCHAR szName[MAX_PATH] = {0};
+    WCHAR szNet[20];
+    UINT Length, Offset;
+
+    if (RegCreateKeyExW(HKEY_CLASSES_ROOT, szNetConnectClass, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS)
+        return SELFREG_E_CLASS;
+
+    if (LoadStringW(netshell_hInstance, IDS_NETWORKCONNECTION, szName, MAX_PATH))
+    {
+        szName[MAX_PATH-1] = L'\0';
+        RegSetValueW(hKey, NULL, REG_SZ, szName, (wcslen(szName)+1) * sizeof(WCHAR));
+    }
+
+    if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, szNamespaceKey, 0, NULL, 0, KEY_WRITE, NULL, &hSubKey, NULL) == ERROR_SUCCESS)
+    {
+        RegSetValueW(hSubKey, NULL, REG_SZ, szName, (wcslen(szName)+1) * sizeof(WCHAR));
+        RegCloseKey(hSubKey);
+    }
+
+    Length = swprintf(szNet, L",-%u", IDS_NETWORKCONNECTION);
+    Offset = GetModuleFileNameW(netshell_hInstance, &szName[1], MAX_PATH);
+    if (Offset + Length + 2 < MAX_PATH)
+    {
+        /* set localized name */
+        szName[0] = L'@';
+        wcscpy(&szName[Offset+1], szNet);
+        RegSetValueExW(hKey, L"LocalizedString", 0, REG_SZ, (const LPBYTE)szName, (wcslen(szName)+1) * sizeof(WCHAR));
+    }
+
+    szName[Offset+1] = L'\0';
+
+    /* store default icon */
+    if (RegCreateKeyExW(hKey, L"DefaultIcon", 0, NULL, 0, KEY_WRITE, NULL, &hSubKey, NULL) == ERROR_SUCCESS)
+    {
+        RegSetValueW(hSubKey, NULL, REG_SZ, &szName[1], (Offset+1) * sizeof(WCHAR));
+        RegCloseKey(hSubKey);
+    }
+    if (RegCreateKeyExW(hKey, L"InProcServer32", 0, NULL, 0, KEY_WRITE, NULL, &hSubKey, NULL) == ERROR_SUCCESS)
+    {
+        RegSetValueW(hSubKey, NULL, REG_SZ, &szName[1], (Offset+1) * sizeof(WCHAR));
+        RegCloseKey(hSubKey);
+    }
+
+    if (RegCreateKeyExW(hKey, L"ShellFolder", 0, NULL, 0, KEY_WRITE, NULL, &hSubKey, NULL) == ERROR_SUCCESS)
+    {
+        DWORD dwAttributes = SFGAO_FOLDER;
+        RegSetValueExW(hSubKey, L"Attributes",0, REG_BINARY, (const LPBYTE)&dwAttributes, sizeof(DWORD));
+    }
+
+    return S_OK;
+}
+
+STDAPI
+DllUnregisterServer(void)
+{
+    SHDeleteKeyW(HKEY_CLASSES_ROOT, szNetConnectClass);
+    SHDeleteKeyW(HKEY_LOCAL_MACHINE, szNamespaceKey);
+    return S_OK;
+}
+
+STDAPI
+DllGetClassObject(
+  REFCLSID rclsid,
+  REFIID riid,
+  LPVOID* ppv 
+)
+{
+    UINT i;
+    HRESULT	hres = E_OUTOFMEMORY;
+    IClassFactory * pcf = NULL;
+
+    if (!ppv)
+        return E_INVALIDARG;
+
+    *ppv = NULL;
+
+    for (i = 0; InterfaceTable[i].riid; i++) 
+    {
+        if (IsEqualIID(InterfaceTable[i].riid, rclsid)) 
+        {
+            pcf = IClassFactory_fnConstructor(InterfaceTable[i].lpfnCI, NULL, NULL);
+            break;
+        }
+    }
+
+    if (!pcf) 
+    {
+        return CLASS_E_CLASSNOTAVAILABLE;
+    }
+
+    hres = IClassFactory_QueryInterface(pcf, riid, ppv);
+    IClassFactory_Release(pcf);
+
+    return hres;
+}

Propchange: trunk/reactos/dll/win32/netshell/netshell.c
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/netshell/netshell.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netshell/netshell.rbuild?rev=35707&view=auto
==============================================================================
--- trunk/reactos/dll/win32/netshell/netshell.rbuild (added)
+++ trunk/reactos/dll/win32/netshell/netshell.rbuild [iso-8859-1] Wed Aug 27 12:18:25 2008
@@ -1,0 +1,27 @@
+<module name="netshell" type="win32dll" baseaddress="${BASEADDRESS_SHELL32}" installbase="system32" installname="netshell.dll">
+	<autoregister infsection="OleControlDlls" type="Both" />
+	<importlibrary definition="netshell.spec.def" />
+	<include base="netshell">.</include>
+	<define name="_WIN32_IE">0x600</define>
+	<define name="_WIN32_WINNT">0x600</define>
+	<define name="WINVER">0x600</define>
+	<define name="_NETSHELL_" />
+	<library>shlwapi</library>
+	<library>shell32</library>
+	<library>version</library>
+	<library>iphlpapi</library>
+	<library>kernel32</library>
+	<library>wine</library>
+	<library>ole32</library>
+	<library>user32</library>
+	<library>uuid</library>
+	<library>advapi32</library>
+	<library>setupapi</library>
+	<pch>precomp.h</pch>
+	<file>netshell.c</file>
+	<file>shfldr_netconnect.c</file>
+	<file>enumlist.c</file>
+	<file>netshell.rc</file>
+	<file>classfactory.c</file>
+	<file>netshell.spec</file>
+</module>

Propchange: trunk/reactos/dll/win32/netshell/netshell.rbuild
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/netshell/netshell.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netshell/netshell.rc?rev=35707&view=auto
==============================================================================
--- trunk/reactos/dll/win32/netshell/netshell.rc (added)
+++ trunk/reactos/dll/win32/netshell/netshell.rc [iso-8859-1] Wed Aug 27 12:18:25 2008
@@ -1,0 +1,10 @@
+#include <windows.h>
+#include "shlobj.h"
+#include "resource.h"
+
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+
+IDI_SHELL_NETWORK_FOLDER    ICON "res/netshell.ico"
+
+#include "lang/de-DE.rc"
+#include "lang/en-US.rc"

Propchange: trunk/reactos/dll/win32/netshell/netshell.rc
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/netshell/netshell.spec
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netshell/netshell.spec?rev=35707&view=auto
==============================================================================
--- trunk/reactos/dll/win32/netshell/netshell.spec (added)
+++ trunk/reactos/dll/win32/netshell/netshell.spec [iso-8859-1] Wed Aug 27 12:18:25 2008
@@ -1,0 +1,34 @@
+
+1 stub DoInitialCleanup
+2 stdcall DllCanUnloadNow()
+3 stdcall DllGetClassObject(ptr ptr ptr)
+4 stdcall DllRegisterServer()
+5 stdcall DllUnregisterServer()
+6 stub HrCreateDesktopIcon
+7 stub HrGetAnswerFileParametersForNetCard
+8 stub HrGetExtendedStatusFromNCS
+9 stub HrGetIconFromMediaType
+10 stub HrGetInstanceGuidOfPreNT5NetCardInstance
+11 stub HrGetNetConExtendedStatusFromGuid
+12 stub HrGetNetConExtendedStatusFromINetConnection
+13 stub HrGetStatusStringFromNetConExtendedStatus
+14 stub HrIsIpStateCheckingEnabled
+15 stub HrLaunchConnection
+16 stub HrLaunchConnectionEx
+17 stub HrLaunchNetworkOptionalComponents
+18 stub HrOemUpgrade
+19 stub HrRenameConnection
+20 stub HrRunWizard
+21 stub InvokeDunFile
+22 stub NcFreeNetconProperties
+23 stub NcIsValidConnectionName
+24 stub NetSetupAddRasConnection
+25 stub NetSetupFinishInstall
+26 stub NetSetupInstallSoftware
+27 stub NetSetupPrepareSysPrep
+28 stub NetSetupRequestWizardPages
+29 stub NetSetupSetProgressCallback
+30 stub NormalizeExtendedStatus
+31 stub RaiseSupportDialog
+32 stub RepairConnection
+33 stub StartNCW

Propchange: trunk/reactos/dll/win32/netshell/netshell.spec
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/netshell/precomp.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netshell/precomp.h?rev=35707&view=auto
==============================================================================
--- trunk/reactos/dll/win32/netshell/precomp.h (added)
+++ trunk/reactos/dll/win32/netshell/precomp.h [iso-8859-1] Wed Aug 27 12:18:25 2008
@@ -1,0 +1,82 @@
+#ifndef _PRECOMP_H__
+#define _PRECOMP_H__
+
+#include "config.h"
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <ctype.h>
+#include <malloc.h>
+
+#define COBJMACROS
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+
+#include <windows.h>
+
+#include <shlguid.h>
+#include <shlwapi.h>
+#include <shlobj.h>
+#include <shldisp.h>
+#include <cpl.h>
+#include <objbase.h>
+#include <ole2.h>
+#include <ocidl.h>
+#include <shobjidl.h>
+#include <shellapi.h>
+#include <olectl.h>
+#include <iphlpapi.h>
+#include <shtypes.h>
+#include <setupapi.h>
+#include <devguid.h>
+
+#include "wine/debug.h"
+#include "wine/unicode.h"
+#include "resource.h"
+
+typedef struct {
+    int colnameid;
+    int pcsFlags;
+    int fmt;
+    int cxChar;
+} shvheader;
+
+typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject);
+typedef struct {
+    REFIID riid;
+    LPFNCREATEINSTANCE lpfnCI;
+} INTERFACE_TABLE;
+
+typedef struct tagVALUEStruct
+{
+    BYTE dummy;
+    DWORD dwType;
+    DWORD dwOperStatus;
+    DWORD dwNameLength;
+    WCHAR szName[1];
+}VALUEStruct;
+
+/* globals */
+extern HINSTANCE netshell_hInstance;
+extern const GUID CLSID_NetworkConnections;
+extern const GUID GUID_DEVCLASS_NET;
+
+
+/* shfldr_netconnect.c */
+HRESULT WINAPI ISF_NetConnect_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);
+
+/* enumlist.c */
+IEnumIDList * IEnumIDList_Constructor(void);
+LPITEMIDLIST _ILCreateNetConnect();
+LPITEMIDLIST ILCreateNetConnectItem(MIB_IFROW * pRow, LPWSTR szName, LPWSTR szAdapterName);
+BOOL _ILIsNetConnect (LPCITEMIDLIST pidl);
+BOOL AddToEnumList(IEnumIDList * iface, LPITEMIDLIST pidl);
+VALUEStruct * _ILGetValueStruct(LPCITEMIDLIST pidl);
+
+/* classfactory.c */
+IClassFactory * IClassFactory_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, REFIID riidInst);
+
+#endif

Propchange: trunk/reactos/dll/win32/netshell/precomp.h
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: trunk/reactos/dll/win32/netshell/res/
------------------------------------------------------------------------------
--- bugtraq:logregex (added)
+++ bugtraq:logregex Wed Aug 27 12:18:25 2008
@@ -1,0 +1,2 @@
+([Ii]ssue|[Bb]ug)s? #?(\d+)(,? ?#?(\d+))*(,? ?(and |or )?#?(\d+))?
+(\d+)

Propchange: trunk/reactos/dll/win32/netshell/res/
------------------------------------------------------------------------------
    bugtraq:message = See issue #%BUGID% for more details.

Propchange: trunk/reactos/dll/win32/netshell/res/
------------------------------------------------------------------------------
    bugtraq:url = http://www.reactos.org/bugzilla/show_bug.cgi?id=%BUGID%

Propchange: trunk/reactos/dll/win32/netshell/res/
------------------------------------------------------------------------------
    tsvn:logminsize = 10

Added: trunk/reactos/dll/win32/netshell/resource.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netshell/resource.h?rev=35707&view=auto
==============================================================================
--- trunk/reactos/dll/win32/netshell/resource.h (added)
+++ trunk/reactos/dll/win32/netshell/resource.h [iso-8859-1] Wed Aug 27 12:18:25 2008
@@ -1,0 +1,31 @@
+
+/* icons */
+
+#define IDI_SHELL_NETWORK_FOLDER 100
+
+
+/* dialogs */
+
+
+
+
+
+/* dialog controls */
+
+
+/* resource constants */
+
+#define	IDS_NETWORKCONNECTION       10000
+#define	IDS_SHV_COLUMN_NAME         10001
+#define IDS_SHV_COLUMN_TYPE         10002
+#define	IDS_SHV_COLUMN_STATE        10003
+#define	IDS_SHV_COLUMN_DEVNAME      10004
+#define IDS_SHV_COLUMN_PHONE        10005
+#define	IDS_SHV_COLUMN_OWNER        10006
+#define IDS_TYPE_ETHERNET           10007
+#define IDS_STATUS_NON_OPERATIONAL  10008
+#define IDS_STATUS_UNREACHABLE      10009
+#define IDS_STATUS_DISCONNECTED     10010
+#define IDS_STATUS_CONNECTING       10011
+#define IDS_STATUS_CONNECTED        10012
+#define IDS_STATUS_OPERATIONAL      10013

Propchange: trunk/reactos/dll/win32/netshell/resource.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/netshell/shfldr_netconnect.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netshell/shfldr_netconnect.c?rev=35707&view=auto
==============================================================================
--- trunk/reactos/dll/win32/netshell/shfldr_netconnect.c (added)
+++ trunk/reactos/dll/win32/netshell/shfldr_netconnect.c [iso-8859-1] Wed Aug 27 12:18:25 2008
@@ -1,0 +1,905 @@
+/*
+ * Network Connections Shell Folder
+ *
+ * Copyright 2008       Johannes Anderwald <janderwald at reactos.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <precomp.h>
+
+WINE_DEFAULT_DEBUG_CHANNEL (shell);
+
+/***********************************************************************
+*   IShellFolder implementation
+*/
+
+typedef struct {
+    const IShellFolder2Vtbl  *lpVtbl;
+    LONG                       ref;
+    const IContextMenu2Vtbl *lpVtblContextMenu;
+    const IPersistFolder2Vtbl *lpVtblPersistFolder2;
+
+    /* both paths are parsible from the desktop */
+    LPITEMIDLIST pidlRoot;	/* absolute pidl */
+    LPCITEMIDLIST apidl;    /* currently focused font item */
+} IGenericSFImpl, *LPIGenericSFImpl;
+
+
+static const shvheader NetConnectSFHeader[] = {
+    {IDS_SHV_COLUMN_NAME, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 20},
+    {IDS_SHV_COLUMN_TYPE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 8},
+    {IDS_SHV_COLUMN_STATE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10},
+    {IDS_SHV_COLUMN_DEVNAME, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 12},
+    {IDS_SHV_COLUMN_PHONE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10},
+    {IDS_SHV_COLUMN_OWNER, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 5}
+};
+
+#define NETCONNECTSHELLVIEWCOLUMNS 6
+
+#define COLUMN_NAME     0
+#define COLUMN_TYPE     1
+#define COLUMN_STATUS   2
+#define COLUMN_DEVNAME  3
+#define COLUMN_PHONE    4
+#define COLUMN_OWNER    5
+
+static LPIGenericSFImpl __inline impl_from_IContextMenu2(IContextMenu2 *iface)
+{
+    return (LPIGenericSFImpl)((char *)iface - FIELD_OFFSET(IGenericSFImpl, lpVtblContextMenu));
+}
+
+static LPIGenericSFImpl __inline impl_from_IPersistFolder2(IPersistFolder2 *iface)
+{
+    return (LPIGenericSFImpl)((char *)iface - FIELD_OFFSET(IGenericSFImpl, lpVtblPersistFolder2));
+}
+
+
+
+/**************************************************************************
+ *	ISF_NetConnect_fnQueryInterface
+ *
+ * NOTE
+ *     supports not IPersist/IPersistFolder
+ */
+static HRESULT WINAPI ISF_NetConnect_fnQueryInterface (IShellFolder2 *iface, REFIID riid, LPVOID *ppvObj)
+{
+    IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+    *ppvObj = NULL;
+
+    if (IsEqualIID (riid, &IID_IUnknown) ||
+        IsEqualIID (riid, &IID_IShellFolder) ||
+        IsEqualIID (riid, &IID_IShellFolder2))
+    {
+        *ppvObj = This;
+    }
+    else if (IsEqualIID (riid, &IID_IPersistFolder) ||
+             IsEqualIID (riid, &IID_IPersistFolder2))
+    {
+        *ppvObj = (LPVOID *)&This->lpVtblPersistFolder2;
+    }
+    if (*ppvObj)
+    {
+        IUnknown_AddRef ((IUnknown *) (*ppvObj));
+        return S_OK;
+    }
+
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI ISF_NetConnect_fnAddRef (IShellFolder2 * iface)
+{
+    IGenericSFImpl *This = (IGenericSFImpl *)iface;
+    ULONG refCount = InterlockedIncrement(&This->ref);
+
+    return refCount;
+}
+
+static ULONG WINAPI ISF_NetConnect_fnRelease (IShellFolder2 * iface)
+{
+    IGenericSFImpl *This = (IGenericSFImpl *)iface;
+    ULONG refCount = InterlockedDecrement(&This->ref);
+
+
+    if (!refCount) 
+    {
+        SHFree (This->pidlRoot);
+        HeapFree (GetProcessHeap(), 0, This);
+    }
+    return refCount;
+}
+
+/**************************************************************************
+*	ISF_NetConnect_fnParseDisplayName
+*/
+static HRESULT WINAPI ISF_NetConnect_fnParseDisplayName (IShellFolder2 * iface,
+               HWND hwndOwner, LPBC pbcReserved, LPOLESTR lpszDisplayName,
+               DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes)
+{
+    //IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+    HRESULT hr = E_UNEXPECTED;
+
+    *ppidl = 0;
+    if (pchEaten)
+        *pchEaten = 0;		/* strange but like the original */
+
+    return hr;
+}
+
+/**************************************************************************
+ *  CreateNetConnectEnumListss()
+ */
+static BOOL CreateNetConnectEnumList(IEnumIDList *list, DWORD dwFlags)
+{
+    DWORD dwSize, dwResult, dwIndex;
+    MIB_IFTABLE *pIfTable;
+    MIB_IFROW IfEntry;
+    IP_ADAPTER_INFO * pAdapterInfo, *pCurrentAdapter;
+    HDEVINFO hInfo;
+    SP_DEVINFO_DATA DevInfo;
+    HKEY hSubKey;
+    WCHAR szNetCfg[50];
+    WCHAR szAdapterNetCfg[50];
+    LPITEMIDLIST pidl;
+    WCHAR szDetail[200] = L"SYSTEM\\CurrentControlSet\\Control\\Class\\";
+    WCHAR szName[130] = L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\";
+
+    /* get the IfTable */
+    dwSize = 0;
+    if (GetIfTable(NULL, &dwSize, TRUE) != ERROR_INSUFFICIENT_BUFFER)
+        return FALSE;
+
+    pIfTable = (PMIB_IFTABLE)HeapAlloc(GetProcessHeap(), 0, dwSize);
+    if (!pIfTable)
+        return FALSE;
+
+    dwResult = GetIfTable(pIfTable, &dwSize, TRUE);
+    if (dwResult != NO_ERROR)
+    {
+        HeapFree(GetProcessHeap(), 0, pIfTable);
+        return FALSE;
+    }
+
+    dwSize = 0;
+    dwResult = GetAdaptersInfo(NULL, &dwSize); 
+    if (dwResult!= ERROR_BUFFER_OVERFLOW)
+    {
+        HeapFree(GetProcessHeap(), 0, pIfTable);
+        return FALSE;
+    }
+
+    pAdapterInfo = (PIP_ADAPTER_INFO)HeapAlloc(GetProcessHeap(), 0, dwSize);
+    if (!pAdapterInfo)
+    {
+        HeapFree(GetProcessHeap(), 0, pIfTable);
+        return FALSE;
+    }
+
+    if (GetAdaptersInfo(pAdapterInfo, &dwSize) != NO_ERROR)
+    {
+        HeapFree(GetProcessHeap(), 0, pIfTable);
+        HeapFree(GetProcessHeap(), 0, pAdapterInfo);
+        return FALSE;
+    }
+
+
+    hInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT );
+    if (!hInfo)
+    {
+        HeapFree(GetProcessHeap(), 0, pIfTable);
+        HeapFree(GetProcessHeap(), 0, pAdapterInfo);
+        return FALSE;
+    }
+
+    dwIndex = 0;
+    do
+    {
+        ZeroMemory(&DevInfo, sizeof(SP_DEVINFO_DATA));
+        DevInfo.cbSize = sizeof(DevInfo);
+        if (SetupDiEnumDeviceInfo(hInfo, dwIndex++, &DevInfo))
+        {
+            if (SetupDiGetDeviceRegistryPropertyW(hInfo, &DevInfo, SPDRP_DRIVER, NULL, (LPBYTE)&szDetail[39], sizeof(szDetail)/sizeof(WCHAR) - 40, &dwSize))
+            {
+                if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szDetail, 0, KEY_READ, &hSubKey) == ERROR_SUCCESS)
+                {
+                    dwSize = sizeof(szNetCfg);
+                    dwResult = RegQueryValueExW(hSubKey, L"NetCfgInstanceId", NULL, NULL, (LPBYTE)szNetCfg, &dwSize);
+                    if (dwResult == ERROR_SUCCESS)
+                    {
+                        pCurrentAdapter = pAdapterInfo;
+                        while(pCurrentAdapter)
+                        {
+                            szAdapterNetCfg[0] = L'\0';
+                            if (MultiByteToWideChar(CP_ACP, 0, pCurrentAdapter->AdapterName, -1, szAdapterNetCfg, sizeof(szAdapterNetCfg)/sizeof(szAdapterNetCfg[0])))
+                            {
+                                szAdapterNetCfg[(sizeof(szAdapterNetCfg)/sizeof(WCHAR))-1] = L'\0';
+                            }
+                            if (!wcsicmp(szAdapterNetCfg, szNetCfg))
+                            {
+                                ZeroMemory(&IfEntry, sizeof(IfEntry));
+                                IfEntry.dwIndex = pCurrentAdapter->Index;
+                                dwResult = GetIfEntry(&IfEntry);
+                                if (dwResult == NO_ERROR)
+                                {
+                                    if (IfEntry.dwType == IF_TYPE_ETHERNET_CSMACD || IfEntry.dwType == IF_TYPE_IEEE80211)
+                                    {
+                                        wcscpy(&szName[80], szNetCfg);
+                                        wcscpy(&szName[118], L"\\Connection");
+                                        if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szName, 0, KEY_READ, &hSubKey) == ERROR_SUCCESS)
+                                        {
+                                            dwSize = sizeof(szAdapterNetCfg);
+                                            if (RegQueryValueExW(hSubKey, L"Name", NULL, NULL, (LPBYTE)szAdapterNetCfg, &dwSize) != ERROR_SUCCESS)
+                                            {
+                                                if (!SetupDiGetDeviceRegistryPropertyW(hInfo, &DevInfo, SPDRP_FRIENDLYNAME, NULL, (PBYTE)szAdapterNetCfg, sizeof(szAdapterNetCfg)/sizeof(WCHAR), &dwSize))
+                                                {
+                                                    szDetail[0] = 0;
+                                                }
+                                            }
+                                            RegCloseKey(hSubKey);
+                                        }
+                                        szNetCfg[0] = 0;
+                                        SetupDiGetDeviceRegistryPropertyW(hInfo, &DevInfo, SPDRP_DEVICEDESC, NULL, (PBYTE)szNetCfg, sizeof(szNetCfg)/sizeof(WCHAR), &dwSize);
+                                        pidl = ILCreateNetConnectItem(&IfEntry, szAdapterNetCfg, szNetCfg);
+                                        if (pidl)
+                                        {
+                                            AddToEnumList(list, pidl);
+                                        }
+                                     }
+                                }
+                                break;
+                            }
+                            pCurrentAdapter = pCurrentAdapter->Next;
+                        }
+                    }
+                }
+            }
+        }else if (GetLastError() == ERROR_NO_MORE_ITEMS)
+        {
+            break;
+        }
+    }while(TRUE);
+
+    HeapFree(GetProcessHeap(), 0, pAdapterInfo);
+    HeapFree(GetProcessHeap(), 0, pIfTable);
+    SetupDiDestroyDeviceInfoList(hInfo);
+
+    return FALSE;
+
+}
+
+/**************************************************************************
+*		ISF_NetConnect_fnEnumObjects
+*/
+static HRESULT WINAPI ISF_NetConnect_fnEnumObjects (IShellFolder2 * iface,
+               HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList)
+{
+    //IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+    *ppEnumIDList = IEnumIDList_Constructor();
+    if(*ppEnumIDList)
+        CreateNetConnectEnumList(*ppEnumIDList, dwFlags);
+
+
+    return (*ppEnumIDList) ? S_OK : E_OUTOFMEMORY;
+}
+
+/**************************************************************************
+*		ISF_NetConnect_fnBindToObject
+*/
+static HRESULT WINAPI ISF_NetConnect_fnBindToObject (IShellFolder2 * iface,
+               LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
+{
+    //IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+    return E_NOTIMPL;
+}
+
+/**************************************************************************
+*	ISF_NetConnect_fnBindToStorage
+*/
+static HRESULT WINAPI ISF_NetConnect_fnBindToStorage (IShellFolder2 * iface,
+               LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
+{
+    //IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+
+    *ppvOut = NULL;
+    return E_NOTIMPL;
+}
+
+/**************************************************************************
+* 	ISF_NetConnect_fnCompareIDs
+*/
+
+static HRESULT WINAPI ISF_NetConnect_fnCompareIDs (IShellFolder2 * iface,
+               LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
+{
+    //IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+
+
+    return E_NOTIMPL;
+}
+
+/**************************************************************************
+*	ISF_NetConnect_fnCreateViewObject
+*/
+static HRESULT WINAPI ISF_NetConnect_fnCreateViewObject (IShellFolder2 * iface,
+               HWND hwndOwner, REFIID riid, LPVOID * ppvOut)
+{
+    //IGenericSFImpl *This = (IGenericSFImpl *)iface;
+    IShellView* pShellView;
+    CSFV cvf;
+    HRESULT hr = E_NOINTERFACE;
+
+    if (!ppvOut)
+        return hr;
+
+    *ppvOut = NULL;
+
+    if (IsEqualIID (riid, &IID_IShellView))
+    {
+        ZeroMemory(&cvf, sizeof(cvf));
+        cvf.cbSize = sizeof(cvf);
+        cvf.pshf = (IShellFolder*)iface;
+
+        hr = SHCreateShellFolderViewEx(&cvf, &pShellView);
+        if (SUCCEEDED(hr))
+        {
+            hr = IShellView_QueryInterface (pShellView, riid, ppvOut);
+            IShellView_Release (pShellView);
+        }
+    }
+
+    return hr;
+}
+
+/**************************************************************************
+*  ISF_NetConnect_fnGetAttributesOf
+*/
+static HRESULT WINAPI ISF_NetConnect_fnGetAttributesOf (IShellFolder2 * iface,
+               UINT cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut)
+{
+    //IGenericSFImpl *This = (IGenericSFImpl *)iface;
+    HRESULT hr = S_OK;
+    static const DWORD dwNetConnectAttributes = SFGAO_STORAGE | SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | 
+        SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER | SFGAO_CANRENAME | SFGAO_CANDELETE;
+
+
+    if (!rgfInOut)
+        return E_INVALIDARG;
+
+    if (cidl && !apidl)
+        return E_INVALIDARG;
+
+    if (*rgfInOut == 0)
+        *rgfInOut = ~0;
+
+    if(cidl == 0)
+        *rgfInOut = dwNetConnectAttributes;
+
+    /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
+    *rgfInOut &= ~SFGAO_VALIDATE;
+
+    return hr;
+}
+
+/**************************************************************************
+*	ISF_NetConnect_fnGetUIObjectOf
+*
+* PARAMETERS
+*  hwndOwner [in]  Parent window for any output
+*  cidl      [in]  array size
+*  apidl     [in]  simple pidl array
+*  riid      [in]  Requested Interface
+*  prgfInOut [   ] reserved
+*  ppvObject [out] Resulting Interface
+*
+*/
+static HRESULT WINAPI ISF_NetConnect_fnGetUIObjectOf (IShellFolder2 * iface,
+               HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl, REFIID riid,
+               UINT * prgfInOut, LPVOID * ppvOut)
+{
+    IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+    IUnknown *pObj = NULL;
+    HRESULT hr = E_INVALIDARG;
+
+    if (!ppvOut)
+        return hr;
+
+    *ppvOut = NULL;
+
+    if (IsEqualIID (riid, &IID_IContextMenu) && (cidl >= 1))
+    {
+        pObj = (IUnknown*)(&This->lpVtblContextMenu);
+        This->apidl = apidl[0];
+        IUnknown_AddRef(pObj);
+        hr = S_OK;
+    }
+    else
+        hr = E_NOINTERFACE;
+
+    if (SUCCEEDED(hr) && !pObj)
+        hr = E_OUTOFMEMORY;
+
+    *ppvOut = pObj;
+    return hr;
+}
+
+/**************************************************************************
+*	ISF_NetConnect_fnGetDisplayNameOf
+*
+*/
+static HRESULT WINAPI ISF_NetConnect_fnGetDisplayNameOf (IShellFolder2 * iface,
+               LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
+{
+    LPWSTR pszName;
+    HRESULT hr = E_FAIL;
+    //IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+    if (!strRet)
+        return E_INVALIDARG;
+
+    pszName = CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR));
+    if (!pszName)
+        return E_OUTOFMEMORY;
+
+    if (_ILIsNetConnect (pidl))
+    {
+        if (LoadStringW(netshell_hInstance, IDS_NETWORKCONNECTION, pszName, MAX_PATH))
+        {
+            pszName[MAX_PATH-1] = L'\0';
+            hr = S_OK;
+        }
+    }
+    else
+    {
+        VALUEStruct * val = _ILGetValueStruct(pidl);
+        if (val)
+        {
+            wcscpy(pszName, val->szName);
+            hr = S_OK;
+        }
+
+    }
+
+    if (SUCCEEDED(hr))
+    {
+        strRet->uType = STRRET_WSTR;
+        strRet->u.pOleStr = pszName;
+    }
+    else
+    {
+        CoTaskMemFree(pszName);
+    }
+
+    return hr;
+}
+
+/**************************************************************************
+*  ISF_NetConnect_fnSetNameOf
+*  Changes the name of a file object or subfolder, possibly changing its item
+*  identifier in the process.
+*
+* PARAMETERS
+*  hwndOwner [in]  Owner window for output
+*  pidl      [in]  simple pidl of item to change
+*  lpszName  [in]  the items new display name
+*  dwFlags   [in]  SHGNO formatting flags
+*  ppidlOut  [out] simple pidl returned
+*/
+static HRESULT WINAPI ISF_NetConnect_fnSetNameOf (IShellFolder2 * iface,
+               HWND hwndOwner, LPCITEMIDLIST pidl,	/*simple pidl */
+               LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut)
+{
+    //IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ISF_NetConnect_fnGetDefaultSearchGUID (
+               IShellFolder2 * iface, GUID * pguid)
+{
+    //IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ISF_NetConnect_fnEnumSearches (IShellFolder2 * iface,
+               IEnumExtraSearch ** ppenum)
+{
+    //IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ISF_NetConnect_fnGetDefaultColumn (IShellFolder2 * iface,
+               DWORD dwRes, ULONG * pSort, ULONG * pDisplay)
+{
+    //IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+    if (pSort)
+        *pSort = 0;
+    if (pDisplay)
+        *pDisplay = 0;
+
+    return S_OK;
+}
+
+static HRESULT WINAPI ISF_NetConnect_fnGetDefaultColumnState (
+               IShellFolder2 * iface, UINT iColumn, DWORD * pcsFlags)
+{
+    //IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+    if (!pcsFlags || iColumn >= NETCONNECTSHELLVIEWCOLUMNS)
+        return E_INVALIDARG;
+    *pcsFlags = NetConnectSFHeader[iColumn].pcsFlags;
+    return S_OK;
+}
+
+static HRESULT WINAPI ISF_NetConnect_fnGetDetailsEx (IShellFolder2 * iface,
+               LPCITEMIDLIST pidl, const SHCOLUMNID * pscid, VARIANT * pv)
+{
+    //IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ISF_NetConnect_fnGetDetailsOf (IShellFolder2 * iface,
+               LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS * psd)
+{
+    //IGenericSFImpl *This = (IGenericSFImpl *)iface;
+    WCHAR buffer[MAX_PATH] = {0};
+    HRESULT hr = E_FAIL;
+    VALUEStruct * val;
+
+    if (iColumn >= NETCONNECTSHELLVIEWCOLUMNS)
+        return E_FAIL;
+
+    psd->fmt = NetConnectSFHeader[iColumn].fmt;
+    psd->cxChar = NetConnectSFHeader[iColumn].cxChar;
+    if (pidl == NULL)
+    {
+        psd->str.uType = STRRET_WSTR;
+        if (LoadStringW(netshell_hInstance, NetConnectSFHeader[iColumn].colnameid, buffer, MAX_PATH))
+            hr = SHStrDupW(buffer, &psd->str.u.pOleStr);
+
+        return hr;
+    }
+
+    if (iColumn == COLUMN_NAME)
+    {
+        psd->str.uType = STRRET_WSTR;
+        return IShellFolder2_GetDisplayNameOf(iface, pidl, SHGDN_NORMAL, &psd->str);
+    }
+
+    val = _ILGetValueStruct(pidl);
+    if (!val)
+        return E_FAIL;
+
+    switch(iColumn)
+    {
+        case COLUMN_TYPE:
+            if (val->dwType == IF_TYPE_ETHERNET_CSMACD || val->dwType == IF_TYPE_IEEE80211)
+            {
+                if (LoadStringW(netshell_hInstance, IDS_TYPE_ETHERNET, buffer, MAX_PATH))
+                {
+                    psd->str.uType = STRRET_WSTR;
+                    hr = SHStrDupW(buffer, &psd->str.u.pOleStr);
+                }
+            }
+            break;
+        case COLUMN_STATUS:
+            buffer[0] = L'\0';
+            if (val->dwOperStatus == MIB_IF_OPER_STATUS_NON_OPERATIONAL)
+                LoadStringW(netshell_hInstance, IDS_STATUS_NON_OPERATIONAL, buffer, MAX_PATH);
+            else if (val->dwOperStatus == MIB_IF_OPER_STATUS_UNREACHABLE)
+                LoadStringW(netshell_hInstance, IDS_STATUS_UNREACHABLE, buffer, MAX_PATH);
+            else if (val->dwOperStatus == MIB_IF_OPER_STATUS_DISCONNECTED)
+                LoadStringW(netshell_hInstance, IDS_STATUS_DISCONNECTED, buffer, MAX_PATH);
+            else if (val->dwOperStatus == MIB_IF_OPER_STATUS_CONNECTING)
+                LoadStringW(netshell_hInstance, IDS_STATUS_CONNECTING, buffer, MAX_PATH);
+            else if (val->dwOperStatus == MIB_IF_OPER_STATUS_CONNECTED)
+                LoadStringW(netshell_hInstance, IDS_STATUS_CONNECTED, buffer, MAX_PATH);
+            else if (val->dwOperStatus == MIB_IF_OPER_STATUS_OPERATIONAL)
+                LoadStringW(netshell_hInstance, IDS_STATUS_OPERATIONAL, buffer, MAX_PATH);
+
+            if (buffer[0])
+            {
+                buffer[MAX_PATH-1] = L'\0';
+                psd->str.uType = STRRET_WSTR;
+                hr = SHStrDupW(buffer, &psd->str.u.pOleStr);
+            }
+            break;
+        case COLUMN_DEVNAME:
+            wcscpy(buffer, val->szName + val->dwNameLength);
+            buffer[MAX_PATH-1] = L'\0';
+            psd->str.uType = STRRET_WSTR;
+            hr = SHStrDupW(buffer, &psd->str.u.pOleStr);
+            break;
+        case COLUMN_PHONE:
+        case COLUMN_OWNER:
+            psd->str.u.cStr[0] = '\0';
+            psd->str.uType = STRRET_CSTR;
+            break;
+    }
+
+    return hr;
+}
+
+static HRESULT WINAPI ISF_NetConnect_fnMapColumnToSCID (IShellFolder2 * iface,
+               UINT column, SHCOLUMNID * pscid)
+{
+    //IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+    return E_NOTIMPL;
+}
+
+static const IShellFolder2Vtbl vt_ShellFolder2 = {
+    ISF_NetConnect_fnQueryInterface,
+    ISF_NetConnect_fnAddRef,
+    ISF_NetConnect_fnRelease,
+    ISF_NetConnect_fnParseDisplayName,
+    ISF_NetConnect_fnEnumObjects,
+    ISF_NetConnect_fnBindToObject,
+    ISF_NetConnect_fnBindToStorage,
+    ISF_NetConnect_fnCompareIDs,
+    ISF_NetConnect_fnCreateViewObject,
+    ISF_NetConnect_fnGetAttributesOf,
+    ISF_NetConnect_fnGetUIObjectOf,
+    ISF_NetConnect_fnGetDisplayNameOf,
+    ISF_NetConnect_fnSetNameOf,
+    /* ShellFolder2 */
+    ISF_NetConnect_fnGetDefaultSearchGUID,
+    ISF_NetConnect_fnEnumSearches,
+    ISF_NetConnect_fnGetDefaultColumn,
+    ISF_NetConnect_fnGetDefaultColumnState,
+    ISF_NetConnect_fnGetDetailsEx,
+    ISF_NetConnect_fnGetDetailsOf,
+    ISF_NetConnect_fnMapColumnToSCID
+};
+
+/**************************************************************************
+* IContextMenu2 Implementation
+*/
+
+/************************************************************************
+ * ISF_NetConnect_IContextMenu_QueryInterface
+ */
+static HRESULT WINAPI ISF_NetConnect_IContextMenu2_QueryInterface(IContextMenu2 * iface, REFIID iid, LPVOID * ppvObject)
+{
+    IGenericSFImpl * This = impl_from_IContextMenu2(iface);
+
+    return IShellFolder2_QueryInterface((IShellFolder2*)This, iid, ppvObject);
+}
+
+/************************************************************************
+ * ISF_NetConnect_IContextMenu_AddRef
+ */
+static ULONG WINAPI ISF_NetConnect_IContextMenu2_AddRef(IContextMenu2 * iface)
+{
+    IGenericSFImpl * This = impl_from_IContextMenu2(iface);
+
+    return IShellFolder2_AddRef((IShellFolder2*)This);
+}
+
+/************************************************************************
+ * ISF_NetConnect_IContextMenu_Release
+ */
+static ULONG WINAPI ISF_NetConnect_IContextMenu2_Release(IContextMenu2  * iface)
+{
+    IGenericSFImpl * This = impl_from_IContextMenu2(iface);
+
+    return IShellFolder2_Release((IShellFolder2*)This);
+}
+
+/**************************************************************************
+* ISF_NetConnect_IContextMenu_QueryContextMenu()
+*/
+static HRESULT WINAPI ISF_NetConnect_IContextMenu2_QueryContextMenu(
+	IContextMenu2 *iface,
+	HMENU hMenu,
+	UINT indexMenu,
+	UINT idCmdFirst,
+	UINT idCmdLast,
+	UINT uFlags)
+{
+    int Count = 1;
+    //IGenericSFImpl * This = impl_from_IContextMenu2(iface);
+
+    return MAKE_HRESULT(SEVERITY_SUCCESS, 0, Count);
+}
+
+
+/**************************************************************************
+* ISF_NetConnect_IContextMenu_InvokeCommand()
+*/
+static HRESULT WINAPI ISF_NetConnect_IContextMenu2_InvokeCommand(
+	IContextMenu2 *iface,
+	LPCMINVOKECOMMANDINFO lpcmi)
+{
+    //IGenericSFImpl * This = impl_from_IContextMenu2(iface);
+
+    return S_OK;
+}
+
+/**************************************************************************
+ *  ISF_NetConnect_IContextMenu_GetCommandString()
+ *
+ */
+static HRESULT WINAPI ISF_NetConnect_IContextMenu2_GetCommandString(
+	IContextMenu2 *iface,
+	UINT_PTR idCommand,
+	UINT uFlags,
+	UINT* lpReserved,
+	LPSTR lpszName,
+	UINT uMaxNameLen)
+{
+    //IGenericSFImpl * This = impl_from_IContextMenu2(iface);
+
+	return E_FAIL;
+}
+
+
+
+/**************************************************************************
+* ISF_NetConnect_IContextMenu_HandleMenuMsg()
+*/
+static HRESULT WINAPI ISF_NetConnect_IContextMenu2_HandleMenuMsg(
+	IContextMenu2 *iface,
+	UINT uMsg,
+	WPARAM wParam,
+	LPARAM lParam)
+{
+    //IGenericSFImpl * This = impl_from_IContextMenu2(iface);
+
+
+    return E_NOTIMPL;
+}
+
+static const IContextMenu2Vtbl vt_ContextMenu2 =
+{
+	ISF_NetConnect_IContextMenu2_QueryInterface,
+	ISF_NetConnect_IContextMenu2_AddRef,
+	ISF_NetConnect_IContextMenu2_Release,
+	ISF_NetConnect_IContextMenu2_QueryContextMenu,
+	ISF_NetConnect_IContextMenu2_InvokeCommand,
+	ISF_NetConnect_IContextMenu2_GetCommandString,
+	ISF_NetConnect_IContextMenu2_HandleMenuMsg
+};
+
+/************************************************************************
+ *	ISF_NetConnect_PersistFolder2_QueryInterface
+ */
+static HRESULT WINAPI ISF_NetConnect_PersistFolder2_QueryInterface (IPersistFolder2 * iface,
+               REFIID iid, LPVOID * ppvObj)
+{
+    IGenericSFImpl * This = impl_from_IPersistFolder2(iface);
+
+    return IShellFolder2_QueryInterface ((IShellFolder2*)This, iid, ppvObj);
+}
+
+/************************************************************************
+ *	ISF_NetConnect_PersistFolder2_AddRef
+ */
+static ULONG WINAPI ISF_NetConnect_PersistFolder2_AddRef (IPersistFolder2 * iface)
+{
+    IGenericSFImpl * This = impl_from_IPersistFolder2(iface);
+
+    return IShellFolder2_AddRef((IShellFolder2*)This);
+}
+
+/************************************************************************
+ *	ISF_NetConnect_PersistFolder2_Release
+ */
+static ULONG WINAPI ISF_NetConnect_PersistFolder2_Release (IPersistFolder2 * iface)
+{
+    IGenericSFImpl * This = impl_from_IPersistFolder2(iface);
+
+    return IShellFolder2_Release((IShellFolder2*)This);
+}
+
+/************************************************************************
+ *	ISF_NetConnect_PersistFolder2_GetClassID
+ */
+static HRESULT WINAPI ISF_NetConnect_PersistFolder2_GetClassID (
+               IPersistFolder2 * iface, CLSID * lpClassId)
+{
+    //IGenericSFImpl * This = impl_from_IPersistFolder2(iface);
+
+    if (!lpClassId)
+        return E_POINTER;
+
+    *lpClassId = CLSID_NetworkConnections;
+
+    return S_OK;
+}
+
+/************************************************************************
+ *	ISF_NetConnect_PersistFolder2_Initialize
+ *
+ * NOTES: it makes no sense to change the pidl
+ */
+static HRESULT WINAPI ISF_NetConnect_PersistFolder2_Initialize (
+               IPersistFolder2 * iface, LPCITEMIDLIST pidl)
+{
+    IGenericSFImpl * This = impl_from_IPersistFolder2(iface);
+
+    SHFree(This->pidlRoot);
+    This->pidlRoot = ILClone(pidl);
+
+    return S_OK;
+}
+
+/**************************************************************************
+ *	ISF_NetConnect_PersistFolder2_GetCurFolder
+ */
+static HRESULT WINAPI ISF_NetConnect_PersistFolder2_GetCurFolder (
+               IPersistFolder2 * iface, LPITEMIDLIST * pidl)
+{
+    IGenericSFImpl * This = impl_from_IPersistFolder2(iface);
+
+
+    if (!pidl)
+        return E_POINTER;
+
+    *pidl = ILClone (This->pidlRoot);
+
+    return S_OK;
+}
+
+static const IPersistFolder2Vtbl vt_PersistFolder2 =
+{
+    ISF_NetConnect_PersistFolder2_QueryInterface,
+    ISF_NetConnect_PersistFolder2_AddRef,
+    ISF_NetConnect_PersistFolder2_Release,
+    ISF_NetConnect_PersistFolder2_GetClassID,
+    ISF_NetConnect_PersistFolder2_Initialize,
+    ISF_NetConnect_PersistFolder2_GetCurFolder
+};
+
+/**************************************************************************
+*	ISF_NetConnect_Constructor
+*/
+HRESULT WINAPI ISF_NetConnect_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv)
+{
+    IGenericSFImpl *sf;
+
+    if (!ppv)
+        return E_POINTER;
+    if (pUnkOuter)
+        return CLASS_E_NOAGGREGATION;
+
+    sf = (IGenericSFImpl *) HeapAlloc ( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof (IGenericSFImpl));
+    if (!sf)
+        return E_OUTOFMEMORY;
+
+    sf->ref = 1;
+    sf->lpVtbl = &vt_ShellFolder2;
+    sf->lpVtblPersistFolder2 = &vt_PersistFolder2;
+    sf->lpVtblContextMenu = &vt_ContextMenu2;
+    sf->pidlRoot = _ILCreateNetConnect();	/* my qualified pidl */
+
+    if (!SUCCEEDED (IShellFolder2_QueryInterface ((IShellFolder2*)sf, riid, ppv)))
+    {
+        IShellFolder2_Release((IShellFolder2*)sf);
+        return E_NOINTERFACE;
+    }
+
+    return S_OK;
+}

Propchange: trunk/reactos/dll/win32/netshell/shfldr_netconnect.c
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: trunk/reactos/dll/win32/win32.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/win32.rbuild?rev=35707&r1=35706&r2=35707&view=diff
==============================================================================
--- trunk/reactos/dll/win32/win32.rbuild [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/win32.rbuild [iso-8859-1] Wed Aug 27 12:18:25 2008
@@ -196,6 +196,9 @@
 <directory name="netid">
 	<xi:include href="netid/netid.rbuild" />
 </directory>
+<directory name="netshell">
+	<xi:include href="netshell/netshell.rbuild" />
+</directory>
 <directory name="newdev">
 	<xi:include href="newdev/newdev.rbuild" />
 </directory>



More information about the Ros-diffs mailing list