|  | /* | 
|  | * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, 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) | 
|  | { | 
|  | BYTE * 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)(DWORD_PTR)Dde_OnConnect(hsz1, hsz2); | 
|  | case XTYP_CONNECT_CONFIRM: | 
|  | Dde_OnConnectConfirm(hconv, hsz1, hsz2); | 
|  | return NULL; | 
|  | case XTYP_WILDCONNECT: | 
|  | return (HDDEDATA)(DWORD_PTR)Dde_OnWildConnect(hsz1, hsz2); | 
|  | case XTYP_REQUEST: | 
|  | return (HDDEDATA)Dde_OnRequest(uFmt, hconv, hsz1, hsz2); | 
|  | case XTYP_EXECUTE: | 
|  | return (HDDEDATA)(DWORD_PTR)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); | 
|  | } | 
|  | } |