Author: dquintana
Date: Sat Jul  5 00:35:43 2014
New Revision: 63684

URL: http://svn.reactos.org/svn/reactos?rev=63684&view=rev
Log:
[EXPLORER-NEW]
* Fix a typo that broke tray notify icons.
* Implement loading of Shell Service Objects. Works in win2003 but no idea if 
it works in ros since we don't have any SSO implemented yet ;P

Added:
    branches/shell-experiments/base/shell/explorer-new/shellservice.c   (with 
props)
Modified:
    branches/shell-experiments/base/shell/explorer-new/CMakeLists.txt
    branches/shell-experiments/base/shell/explorer-new/trayntfy.c
    branches/shell-experiments/base/shell/explorer-new/traywnd.c

Modified: branches/shell-experiments/base/shell/explorer-new/CMakeLists.txt
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/explorer-new/CMakeLists.txt?rev=63684&r1=63683&r2=63684&view=diff
==============================================================================
--- branches/shell-experiments/base/shell/explorer-new/CMakeLists.txt   
[iso-8859-1] (original)
+++ branches/shell-experiments/base/shell/explorer-new/CMakeLists.txt   
[iso-8859-1] Sat Jul  5 00:35:43 2014
@@ -9,6 +9,7 @@
     explorer.c
     rshell.c
     settings.c
+       shellservice.c
     startmnu.c
     startup.c
     taskband.c

Added: branches/shell-experiments/base/shell/explorer-new/shellservice.c
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/explorer-new/shellservice.c?rev=63684
==============================================================================
--- branches/shell-experiments/base/shell/explorer-new/shellservice.c   (added)
+++ branches/shell-experiments/base/shell/explorer-new/shellservice.c   
[iso-8859-1] Sat Jul  5 00:35:43 2014
@@ -0,0 +1,125 @@
+/*
+* ReactOS Explorer
+*
+* Copyright 2014 - David Quintana
+*
+* 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 Street, Fifth Floor, Boston, MA  02110-1301  
USA
+*/
+
+#include "precomp.h"
+
+extern HRESULT InitShellServices(HDPA * phdpa);
+extern HRESULT ShutdownShellServices(HDPA hdpa);
+
+static int CALLBACK InitializeAllCallback(void* pItem, void* pData)
+{
+    IOleCommandTarget * pOct = pItem;
+    HRESULT * phr = pData;
+    *phr = IOleCommandTarget_Exec(pOct, &CGID_ShellServiceObject, 
OLECMDID_NEW, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
+    return SUCCEEDED(*phr);
+}
+
+static int CALLBACK ShutdownAllCallback(void* pItem, void* pData)
+{
+    IOleCommandTarget * pOct = pItem;
+    IOleCommandTarget_Exec(pOct, &CGID_ShellServiceObject, OLECMDID_SAVE, 
OLECMDEXECOPT_DODEFAULT, NULL, NULL);
+    return TRUE;
+}
+
+static int CALLBACK DeleteAllEnumCallback(void* pItem, void* pData)
+{
+    IOleCommandTarget * pOct = pItem;
+    IUnknown_Release(pOct);
+    return TRUE;
+}
+
+HRESULT InitShellServices(HDPA * phdpa)
+{
+    IOleCommandTarget * pOct;
+    HKEY    hkey;
+    CLSID   clsid;
+    WCHAR   name[MAX_PATH];
+    WCHAR   value[MAX_PATH];
+    DWORD   type;
+    LONG    ret;
+    HDPA    hdpa;
+    HRESULT hr = S_OK;
+    int     count = 0;
+
+    hdpa = DPA_Create(5);
+
+    if (RegOpenKey(HKEY_LOCAL_MACHINE,
+        
L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ShellServiceObjectDelayLoad",
+        &hkey))
+    {
+        return HRESULT_FROM_WIN32(GetLastError());
+    }
+
+    /* Enumerate */
+    do
+    {
+        DWORD   name_len = MAX_PATH;
+        DWORD   value_len = sizeof(value); /* byte count! */
+
+        ret = RegEnumValueW(hkey, count, name, &name_len, 0, &type, (LPBYTE) 
&value, &value_len);
+        if (ret)
+            break;
+
+        if (type != REG_SZ)
+            continue;
+
+        hr = CLSIDFromString(value, &clsid);
+        if (FAILED(hr))
+            goto cleanup;
+
+        hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, 
&IID_IOleCommandTarget, (VOID**) &pOct);
+        if (FAILED(hr))
+            goto cleanup;
+
+        DPA_AppendPtr(hdpa, pOct);
+
+        count++;
+    }
+    while (1);
+
+    if (ret != ERROR_NO_MORE_ITEMS)
+    {
+        hr = HRESULT_FROM_WIN32(GetLastError());
+        goto cleanup;
+    }
+
+    RegCloseKey(hkey);
+
+    /* Initialize */
+    DPA_EnumCallback(hdpa, InitializeAllCallback, &hr);
+    if (FAILED(hr))
+        goto cleanup;
+
+    *phdpa = hdpa;
+    return count > 0 ? S_OK : S_FALSE;
+
+cleanup:
+    *phdpa = NULL;
+    ShutdownShellServices(hdpa);
+    return hr;
+}
+
+HRESULT ShutdownShellServices(HDPA hdpa)
+{
+    DPA_EnumCallback(hdpa, ShutdownAllCallback, NULL);
+    DPA_EnumCallback(hdpa, DeleteAllEnumCallback, NULL);
+    DPA_Destroy(hdpa);
+    return S_OK;
+}

Propchange: branches/shell-experiments/base/shell/explorer-new/shellservice.c
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: branches/shell-experiments/base/shell/explorer-new/trayntfy.c
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/explorer-new/trayntfy.c?rev=63684&r1=63683&r2=63684&view=diff
==============================================================================
--- branches/shell-experiments/base/shell/explorer-new/trayntfy.c       
[iso-8859-1] (original)
+++ branches/shell-experiments/base/shell/explorer-new/trayntfy.c       
[iso-8859-1] Sat Jul  5 00:35:43 2014
@@ -437,7 +437,7 @@
         CopyMemory(
             &data,
             (PSYS_PAGER_COPY_DATA) cpData->lpData,
-            cpData->dwData);
+            cpData->cbData);
         iconData = &data.nicon_data;
 
         switch (data.notify_code)

Modified: branches/shell-experiments/base/shell/explorer-new/traywnd.c
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/explorer-new/traywnd.c?rev=63684&r1=63683&r2=63684&view=diff
==============================================================================
--- branches/shell-experiments/base/shell/explorer-new/traywnd.c        
[iso-8859-1] (original)
+++ branches/shell-experiments/base/shell/explorer-new/traywnd.c        
[iso-8859-1] Sat Jul  5 00:35:43 2014
@@ -20,6 +20,9 @@
 
 #include "precomp.h"
 
+extern HRESULT InitShellServices(HDPA * phdpa);
+extern HRESULT ShutdownShellServices(HDPA hdpa);
+
 static const TRAYWINDOW_CTXMENU TrayWindowCtxMenu;
 
 #define WM_APP_TRAYDESTROY  (WM_APP + 0x100)
@@ -94,6 +97,8 @@
 
     HWND hwndTrayPropertiesOwner;
     HWND hwndRunFileDlgOwner;
+
+    HDPA hdpaShellServices;
 } ITrayWindowImpl;
 
 BOOL LaunchCPanel(HWND hwnd, LPCTSTR applet)
@@ -659,6 +664,8 @@
 ITrayWindowImpl_ResizeWorkArea(IN OUT ITrayWindowImpl *This)
 {
     RECT rcTray,rcWorkArea;
+
+    return;
 
     /* If monitor has changed then fix the previous monitors work area */
     if (This->PreviousMonitor != This->Monitor)
@@ -768,10 +775,11 @@
 
         /* FIXME: Are there more flags? */
 
-        if (sr.Position > ABE_BOTTOM)
-            This->Position = ABE_BOTTOM;
-        else
-            This->Position = sr.Position;
+        //if (sr.Position > ABE_BOTTOM)
+        //    This->Position = ABE_BOTTOM;
+        //else
+        //    This->Position = sr.Position;
+        This->Position = ABE_LEFT;
 
         /* Try to find out which monitor the tray window was located on last.
            Here we're only interested in the monitor screen that we think
@@ -985,6 +993,13 @@
 {
     (void)InterlockedExchangePointer((PVOID*)&This->hWnd,
                                      NULL);
+
+
+    if (This->hdpaShellServices != NULL)
+    {
+        ShutdownShellServices(This->hdpaShellServices);
+        This->hdpaShellServices = NULL;
+    }
 
     if (This->himlStartBtn != NULL)
     {
@@ -1586,6 +1601,8 @@
     /* Align all controls on the tray window */
     ITrayWindowImpl_AlignControls(This,
                                   NULL);
+
+    InitShellServices(&(This->hdpaShellServices));
 }
 
 static HRESULT STDMETHODCALLTYPE


Reply via email to