Jacek Caban : mshtml: Added IDM_FONTNAME implementation.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Aug 28 05:09:21 CDT 2006
Module: wine
Branch: master
Commit: 5f9078040a248a5af5def3072cc942335f12f74e
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=5f9078040a248a5af5def3072cc942335f12f74e
Author: Jacek Caban <jacek at codeweavers.com>
Date: Sun Aug 27 16:01:06 2006 +0200
mshtml: Added IDM_FONTNAME implementation.
---
dlls/mshtml/mshtml_private.h | 1
dlls/mshtml/nsembed.c | 18 ++++++++
dlls/mshtml/olecmd.c | 93 ++++++++++++++++++++++++++++++++++++++++++
3 files changed, 112 insertions(+), 0 deletions(-)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 99de822..b9eb7d3 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -312,6 +312,7 @@ PRUint32 nsAString_GetData(const nsAStri
void nsAString_Finish(nsAString*);
nsIInputStream *create_nsstream(const char*,PRInt32);
+nsICommandParams *create_nscommand_params(void);
BSCallback *create_bscallback(HTMLDocument*,IMoniker*);
HRESULT start_binding(BSCallback*);
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c
index 4fabad7..1089164 100644
--- a/dlls/mshtml/nsembed.c
+++ b/dlls/mshtml/nsembed.c
@@ -40,6 +40,7 @@ #define NS_WEBBROWSER_CONTRACTID "@mozil
#define NS_PROFILE_CONTRACTID "@mozilla.org/profile/manager;1"
#define NS_MEMORY_CONTRACTID "@mozilla.org/xpcom/memory-service;1"
#define NS_STRINGSTREAM_CONTRACTID "@mozilla.org/io/string-input-stream;1"
+#define NS_COMMANDPARAMS_CONTRACTID "@mozilla.org/embedcomp/command-params;1"
#define APPSTARTUP_TOPIC "app-startup"
@@ -447,6 +448,23 @@ nsIInputStream *create_nsstream(const ch
return (nsIInputStream*)ret;
}
+nsICommandParams *create_nscommand_params(void)
+{
+ nsICommandParams *ret = NULL;
+ nsresult nsres;
+
+ if(!pCompMgr)
+ return NULL;
+
+ nsres = nsIComponentManager_CreateInstanceByContractID(pCompMgr,
+ NS_COMMANDPARAMS_CONTRACTID, NULL, &IID_nsICommandParams,
+ (void**)&ret);
+ if(NS_FAILED(nsres))
+ ERR("Could not get nsICommandParams\n");
+
+ return ret;
+}
+
void close_gecko()
{
TRACE("()\n");
diff --git a/dlls/mshtml/olecmd.c b/dlls/mshtml/olecmd.c
index 9b17502..81de774 100644
--- a/dlls/mshtml/olecmd.c
+++ b/dlls/mshtml/olecmd.c
@@ -26,6 +26,7 @@ #define COBJMACROS
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
+#include "winnls.h"
#include "ole2.h"
#include "shlguid.h"
#include "mshtmdid.h"
@@ -268,6 +269,96 @@ static void do_ns_command(NSContainer *T
nsICommandManager_Release(cmdmgr);
}
+static nsresult get_ns_command_state(NSContainer *This, const char *cmd, nsICommandParams *nsparam)
+{
+ nsICommandManager *cmdmgr;
+ nsIInterfaceRequestor *iface_req;
+ nsresult nsres;
+
+ nsres = nsIWebBrowser_QueryInterface(This->webbrowser,
+ &IID_nsIInterfaceRequestor, (void**)&iface_req);
+ if(NS_FAILED(nsres)) {
+ ERR("Could not get nsIInterfaceRequestor: %08lx\n", nsres);
+ return nsres;
+ }
+
+ nsres = nsIInterfaceRequestor_GetInterface(iface_req, &IID_nsICommandManager,
+ (void**)&cmdmgr);
+ nsIInterfaceRequestor_Release(iface_req);
+ if(NS_FAILED(nsres)) {
+ ERR("Could not get nsICommandManager: %08lx\n", nsres);
+ return nsres;
+ }
+
+ nsres = nsICommandManager_GetCommandState(cmdmgr, cmd, NULL, nsparam);
+ if(NS_FAILED(nsres))
+ ERR("GetCommandState(%s) failed: %08lx\n", debugstr_a(cmd), nsres);
+
+ nsICommandManager_Release(cmdmgr);
+ return nsres;
+}
+
+static HRESULT exec_fontname(HTMLDocument *This, VARIANT *in, VARIANT *out)
+{
+ TRACE("(%p)->(%p %p)\n", This, in, out);
+
+ if(!This->nscontainer)
+ return E_FAIL;
+
+ if(in) {
+ nsICommandParams *nsparam = create_nscommand_params();
+ char *stra;
+ DWORD len;
+
+ if(V_VT(in) != VT_BSTR) {
+ FIXME("Unsupported vt=%d\n", V_VT(out));
+ return E_INVALIDARG;
+ }
+
+ len = WideCharToMultiByte(CP_ACP, 0, V_BSTR(in), -1, NULL, 0, NULL, NULL);
+ stra = mshtml_alloc(len);
+ WideCharToMultiByte(CP_ACP, 0, V_BSTR(in), -1, stra, -1, NULL, NULL);
+ nsICommandParams_SetCStringValue(nsparam, "state_attribute", stra);
+ mshtml_free(stra);
+
+ do_ns_command(This->nscontainer, "cmd_fontFace", nsparam);
+
+ nsICommandParams_Release(nsparam);
+ }
+
+ if(out) {
+ nsICommandParams *nsparam;
+ LPWSTR strw;
+ char *stra;
+ DWORD len;
+ nsresult nsres;
+
+ if(V_VT(out) != VT_BSTR) {
+ FIXME("Unsupported vt=%d\n", V_VT(out));
+ return E_INVALIDARG;
+ }
+
+ nsparam = create_nscommand_params();
+
+ nsres = get_ns_command_state(This->nscontainer, "cmd_fontFace", nsparam);
+ if(NS_FAILED(nsres))
+ return S_OK;
+
+ nsICommandParams_GetCStringValue(nsparam, "state_attribute", &stra);
+ nsICommandParams_Release(nsparam);
+
+ len = MultiByteToWideChar(CP_ACP, 0, stra, -1, NULL, 0);
+ strw = mshtml_alloc(len*sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, stra, -1, strw, -1);
+ nsfree(stra);
+
+ V_BSTR(out) = SysAllocString(strw);
+ mshtml_free(strw);
+ }
+
+ return S_OK;
+}
+
static HRESULT exec_bold(HTMLDocument *This)
{
TRACE("(%p)\n", This);
@@ -637,6 +728,8 @@ static HRESULT WINAPI OleCommandTarget_E
return OLECMDERR_E_NOTSUPPORTED;
}else if(IsEqualGUID(&CGID_MSHTML, pguidCmdGroup)) {
switch(nCmdID) {
+ case IDM_FONTNAME:
+ return exec_fontname(This, pvaIn, pvaOut);
case IDM_BOLD:
if(pvaIn || pvaOut)
FIXME("unsupported arguments\n");
More information about the wine-cvs
mailing list