| /* | |
| * 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 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); | |
| } | |
| } |