[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wine-devel
Subject:    Re: shell32 - ShellDDEInit
From:       Robert Shearman <rob () codeweavers ! com>
Date:       2005-04-28 9:04:49
Message-ID: 4270A731.9090107 () codeweavers ! com
[Download RAW message or body]

Steven Edwards wrote:

>The ReactOS guys are tired of seeing the fixme message.
>  
>

But they forgot to include a FIXME for the unimplemented callback.

The attached untested patch is probably better.

Rob

["shelldde.diff" (text/x-patch)]

? dlls/shell32/dde.c
? dlls/shell32/version.res
Index: dlls/shell32/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/shell32/Makefile.in,v
retrieving revision 1.89
diff -u -p -r1.89 Makefile.in
--- dlls/shell32/Makefile.in	11 Apr 2005 13:04:41 -0000	1.89
+++ dlls/shell32/Makefile.in	28 Apr 2005 09:00:21 -0000
@@ -17,6 +17,7 @@ C_SRCS = \
 	clipboard.c \
 	control.c \
 	cpanelfolder.c \
+	dde.c \
 	dataobject.c \
 	debughlp.c \
 	dialogs.c \
Index: dlls/shell32/shell32_main.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shell32_main.c,v
retrieving revision 1.148
diff -u -p -r1.148 shell32_main.c
--- dlls/shell32/shell32_main.c	11 Apr 2005 13:04:41 -0000	1.148
+++ dlls/shell32/shell32_main.c	28 Apr 2005 09:00:21 -0000
@@ -981,14 +981,6 @@ void WINAPI FreeIconList( DWORD dw )
 }
 
 
-/*************************************************************************
- * ShellDDEInit (SHELL32.@)
- */
-void WINAPI ShellDDEInit(BOOL start)
-{
-    FIXME("stub: %d\n", start);
-}
-
 /***********************************************************************
  * DllGetVersion [SHELL32.@]
  *
--- /dev/null	2005-04-28 10:22:32.349471640 +0100
+++ dlls/shell32/dde.c	2005-04-28 09:54:11.863491387 +0100
@@ -0,0 +1,177 @@
+/*
+ * Shell DDE Handling
+ *
+ * Copyright 2004 Robert Shearman
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "ddeml.h"
+#include "shellapi.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(shell);
+
+/* String handles */
+static HSZ hszProgmanTopic;
+static HSZ hszProgmanService;
+static HSZ hszAsterisk;
+static HSZ hszShell;
+static HSZ hszAppProperties;
+static HSZ hszFolders;
+/* DDE Instance ID */
+static DWORD dwDDEInst;
+
+
+static inline BOOL Dde_OnConnect(HSZ hszTopic, HSZ hszService)
+{
+    if ((hszTopic == hszProgmanTopic) && (hszService == hszProgmanService))
+        return TRUE;
+    if ((hszTopic == hszProgmanTopic) && (hszService == hszAppProperties))
+        return TRUE;
+    if ((hszTopic == hszShell) && (hszService == hszFolders))
+        return TRUE;
+    if ((hszTopic == hszShell) && (hszService == hszAppProperties))
+        return TRUE;
+    return FALSE;
+}
+
+static inline void Dde_OnConnectConfirm(HCONV hconv, HSZ hszTopic, HSZ hszService)
+{
+    FIXME("stub\n");
+}
+
+static inline BOOL Dde_OnWildConnect(HSZ hszTopic, HSZ hszService)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+static inline HDDEDATA Dde_OnRequest(UINT uFmt, HCONV hconv, HSZ hszTopic,
+                                     HSZ hszItem)
+{
+    FIXME("stub\n");
+    return NULL;
+}
+
+static inline DWORD Dde_OnExecute(HCONV hconv, HSZ hszTopic, HDDEDATA hdata)
+{
+    char * pszCommand;
+
+    pszCommand = DdeAccessData(hdata, NULL);
+    if (!pszCommand)
+        return DDE_FNOTPROCESSED;
+
+    FIXME("stub: %s\n", pszCommand);
+
+    DdeUnaccessData(hdata);
+
+    return DDE_FNOTPROCESSED;
+}
+
+static inline void Dde_OnDisconnect(HCONV hconv)
+{
+    FIXME("stub\n");
+}
+
+static HDDEDATA CALLBACK DdeCallback(      
+    UINT uType,
+    UINT uFmt,
+    HCONV hconv,
+    HSZ hsz1,
+    HSZ hsz2,
+    HDDEDATA hdata,
+    ULONG_PTR dwData1,
+    ULONG_PTR dwData2)
+{
+    switch (uType)
+    {
+    case XTYP_CONNECT:
+        return (HDDEDATA)Dde_OnConnect(hsz1, hsz2);
+    case XTYP_CONNECT_CONFIRM:
+        Dde_OnConnectConfirm(hconv, hsz1, hsz2);
+        return NULL;
+    case XTYP_WILDCONNECT:
+        return (HDDEDATA)Dde_OnWildConnect(hsz1, hsz2);
+    case XTYP_REQUEST:
+        return (HDDEDATA)Dde_OnRequest(uFmt, hconv, hsz1, hsz2);
+    case XTYP_EXECUTE:
+        return (HDDEDATA)Dde_OnExecute(hconv, hsz1, hdata);
+    case XTYP_DISCONNECT:
+        Dde_OnDisconnect(hconv);
+        return NULL;
+    default:
+        return NULL;
+    }
+}
+
+/*************************************************************************
+ * ShellDDEInit (SHELL32.@)
+ *
+ * Registers the Shell DDE services with the system so that applications
+ * can use them.
+ *
+ * PARAMS
+ *  bInit [I] TRUE to initialize the services, FALSE to uninitalize.
+ *
+ * RETURNS
+ *  Nothing.
+ */
+void WINAPI ShellDDEInit(BOOL bInit)
+{
+    TRACE("bInit = %s\n", bInit ? "TRUE" : "FALSE");
+
+    if (bInit)
+    {
+        static const WCHAR wszProgman[] = {'P','r','o','g','m','a','n',0};
+        static const WCHAR wszAsterisk[] = {'*',0};
+        static const WCHAR wszShell[] = {'S','h','e','l','l',0};
+        static const WCHAR wszAppProperties[] =
+            {'A','p','p','P','r','o','p','e','r','t','i','e','s',0};
+        static const WCHAR wszFolders[] = {'F','o','l','d','e','r','s',0};
+
+        DdeInitializeW(&dwDDEInst, DdeCallback, CBF_FAIL_ADVISES | CBF_FAIL_POKES, 0);
+
+        hszProgmanTopic = DdeCreateStringHandleW(dwDDEInst, wszProgman, CP_WINUNICODE);
+        hszProgmanService = DdeCreateStringHandleW(dwDDEInst, wszProgman, CP_WINUNICODE);
+        hszAsterisk = DdeCreateStringHandleW(dwDDEInst, wszAsterisk, CP_WINUNICODE);
+        hszShell = DdeCreateStringHandleW(dwDDEInst, wszShell, CP_WINUNICODE);
+        hszAppProperties = DdeCreateStringHandleW(dwDDEInst, wszAppProperties, CP_WINUNICODE);
+        hszFolders = DdeCreateStringHandleW(dwDDEInst, wszFolders, CP_WINUNICODE);
+
+        DdeNameService(dwDDEInst, hszFolders, 0, DNS_REGISTER);
+        DdeNameService(dwDDEInst, hszProgmanService, 0, DNS_REGISTER);
+        DdeNameService(dwDDEInst, hszShell, 0, DNS_REGISTER);
+    }
+    else
+    {
+        /* unregister all services */
+        DdeNameService(dwDDEInst, 0, 0, DNS_UNREGISTER);
+
+        DdeFreeStringHandle(dwDDEInst, hszFolders);
+        DdeFreeStringHandle(dwDDEInst, hszAppProperties);
+        DdeFreeStringHandle(dwDDEInst, hszShell);
+        DdeFreeStringHandle(dwDDEInst, hszAsterisk);
+        DdeFreeStringHandle(dwDDEInst, hszProgmanService);
+        DdeFreeStringHandle(dwDDEInst, hszProgmanTopic);
+
+        DdeUninitialize(dwDDEInst);
+    }
+}


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic