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/ex…
==============================================================================
--- 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/ex…
==============================================================================
--- 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/ex…
==============================================================================
--- 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/ex…
==============================================================================
--- 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