Author: mjansen
Date: Sun Aug 21 19:58:32 2016
New Revision: 72416

URL: http://svn.reactos.org/svn/reactos?rev=72416&view=rev
Log:
[SHELL32] Partially implement CFolderItems. Thanks to Giannis for the advice :)

Modified:
    trunk/reactos/dll/win32/shell32/CFolder.cpp
    trunk/reactos/dll/win32/shell32/CFolderItems.cpp
    trunk/reactos/dll/win32/shell32/CFolderItems.h

Modified: trunk/reactos/dll/win32/shell32/CFolder.cpp
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/CFolder.cpp?rev=72416&r1=72415&r2=72416&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/CFolder.cpp [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/CFolder.cpp [iso-8859-1] Sun Aug 21 
19:58:32 2016
@@ -82,9 +82,17 @@
 
 HRESULT STDMETHODCALLTYPE CFolder::Items(FolderItems **ppid)
 {
-    CFolderItems* item = new CComObject<CFolderItems>();
-    item->AddRef();
-    *ppid = item;
+    CFolderItems* items = new CComObject<CFolderItems>();
+    items->AddRef();
+
+    HRESULT hr = items->Init(ILClone(m_idlist));
+    if (FAILED_UNEXPECTEDLY(hr))
+    {
+        items->Release();
+        return hr;
+    }
+
+    *ppid = items;
     return S_OK;
 }
 

Modified: trunk/reactos/dll/win32/shell32/CFolderItems.cpp
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/CFolderItems.cpp?rev=72416&r1=72415&r2=72416&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/CFolderItems.cpp    [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/CFolderItems.cpp    [iso-8859-1] Sun Aug 21 
19:58:32 2016
@@ -1,7 +1,7 @@
 /*
  * FolderItem(s) implementation
  *
- * Copyright 2015 Mark Jansen
+ * Copyright 2015,2016 Mark Jansen
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -162,18 +162,65 @@
 
 
 CFolderItems::CFolderItems()
+    :m_Count(-1)
 {
 }
 
 CFolderItems::~CFolderItems()
 {
+}
+
+HRESULT CFolderItems::Init(LPITEMIDLIST idlist)
+{
+    CComPtr<IShellFolder> psfDesktop, psfTarget;
+
+    m_idlist.Attach(idlist);
+
+    HRESULT hr = SHGetDesktopFolder(&psfDesktop);
+    if (FAILED_UNEXPECTEDLY(hr))
+        return hr;
+
+    hr = psfDesktop->BindToObject(m_idlist, NULL, IID_PPV_ARG(IShellFolder, 
&psfTarget));
+    if (FAILED_UNEXPECTEDLY(hr))
+        return hr;
+
+    hr = psfTarget->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, 
&m_EnumIDList);
+
+    if (FAILED_UNEXPECTEDLY(hr))
+        return hr;
+
+    return S_OK;
 }
 
 // *** FolderItems methods ***
 HRESULT STDMETHODCALLTYPE CFolderItems::get_Count(long *plCount)
 {
-    TRACE("(%p, %p)\n", this, plCount);
-    return E_NOTIMPL;
+    if (!m_EnumIDList)
+        return E_FAIL;
+
+    if (!plCount)
+        return E_POINTER;
+
+    if (m_Count == -1)
+    {
+        long count = 0;
+
+        HRESULT hr = m_EnumIDList->Reset();
+        if (FAILED_UNEXPECTEDLY(hr))
+            return hr;
+
+        CComHeapPtr<ITEMIDLIST> Pidl;
+        hr = m_EnumIDList->Next(1, &Pidl, 0);
+        while (hr != S_FALSE)
+        {
+            count++;
+            Pidl.Free();
+        }
+        m_Count = count;
+    }
+    *plCount = m_Count;
+
+    return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE CFolderItems::get_Application(IDispatch **ppid)
@@ -190,13 +237,43 @@
 
 HRESULT STDMETHODCALLTYPE CFolderItems::Item(VARIANT index, FolderItem **ppid)
 {
-    TRACE("(%p, %s, %p)\n", this, wine_dbgstr_variant(&index), ppid);
-    return E_NOTIMPL;
+    if (!m_EnumIDList)
+        return E_FAIL;
+
+    if (V_VT(&index) != VT_I4 && V_VT(&index) != VT_UI4)
+        return E_INVALIDARG;
+
+    ULONG count = V_UI4(&index);
+
+    HRESULT hr = m_EnumIDList->Reset();
+    if (FAILED_UNEXPECTEDLY(hr))
+        return hr;
+
+    hr = m_EnumIDList->Skip(count);
+
+    if (FAILED_UNEXPECTEDLY(hr))
+        return hr;
+
+    CComHeapPtr<ITEMIDLIST> spPidl;
+    hr = m_EnumIDList->Next(1, &spPidl, 0);
+    if (hr == S_OK)
+    {
+        CFolderItem* item = new CComObject<CFolderItem>();
+        item->AddRef();
+        item->Init(spPidl.Detach());
+        *ppid = item;
+        return S_OK;
+    }
+
+    return hr;
 }
 
 HRESULT STDMETHODCALLTYPE CFolderItems::_NewEnum(IUnknown **ppunk)
 {
-    TRACE("(%p, %p)\n", this, ppunk);
-    return E_NOTIMPL;
-}
-
+    CFolderItems* items = new CComObject<CFolderItems>();
+    items->AddRef();
+    items->Init(ILClone(m_idlist));
+    *ppunk = items;
+    return S_OK;
+}
+

Modified: trunk/reactos/dll/win32/shell32/CFolderItems.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/CFolderItems.h?rev=72416&r1=72415&r2=72416&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/CFolderItems.h      [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/CFolderItems.h      [iso-8859-1] Sun Aug 21 
19:58:32 2016
@@ -34,6 +34,7 @@
     CFolderItem();
     ~CFolderItem();
 
+    // Please note: CFolderItem takes ownership of idlist.
     void Init(LPITEMIDLIST idlist);
 
 
@@ -72,10 +73,16 @@
     public IDispatchImpl<FolderItems, &IID_FolderItems>
 {
 private:
+    CComHeapPtr<ITEMIDLIST> m_idlist;
+    CComPtr<IEnumIDList> m_EnumIDList;
+    long m_Count;
 
 public:
     CFolderItems();
     ~CFolderItems();
+
+    // Please note: CFolderItems takes ownership of idlist.
+    HRESULT Init(LPITEMIDLIST idlist);
 
     // *** FolderItems methods ***
     virtual HRESULT STDMETHODCALLTYPE get_Count(long *plCount);


Reply via email to