Jacek Caban : mshtml: Added begining implementation of
IPersistStreamInit:: Save.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Oct 2 15:01:25 CDT 2006
Module: wine
Branch: master
Commit: 1a4c366f1112c9d4390929f9c786091b80c9a214
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=1a4c366f1112c9d4390929f9c786091b80c9a214
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Oct 2 20:33:08 2006 +0200
mshtml: Added begining implementation of IPersistStreamInit::Save.
---
dlls/mshtml/mshtml_private.h | 1
dlls/mshtml/nsembed.c | 98 ++++++++++++++++++++++++++++++++++++++++++
dlls/mshtml/nsiface.idl | 63 +++++++++++++++++++++++++++
dlls/mshtml/persist.c | 50 +++++++++++++++++++++
4 files changed, 209 insertions(+), 3 deletions(-)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index b4ed556..b3ad479 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -318,6 +318,7 @@ void nsAString_Finish(nsAString*);
nsIInputStream *create_nsstream(const char*,PRInt32);
nsICommandParams *create_nscommand_params(void);
+void nsnode_to_nsstring(nsIDOMNode*,nsAString*);
BSCallback *create_bscallback(IMoniker*);
HRESULT start_binding(BSCallback*);
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c
index 265150c..393e1d9 100644
--- a/dlls/mshtml/nsembed.c
+++ b/dlls/mshtml/nsembed.c
@@ -41,6 +41,7 @@ #define NS_PROFILE_CONTRACTID "@mozilla.
#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 NS_HTMLSERIALIZER_CONTRACTID "@mozilla.org/layout/contentserializer;1?mimetype=text/html"
#define APPSTARTUP_TOPIC "app-startup"
@@ -464,6 +465,103 @@ nsICommandParams *create_nscommand_param
return ret;
}
+static void nsnode_to_nsstring_rec(nsIContentSerializer *serializer, nsIDOMNode *nsnode, nsAString *str)
+{
+ nsIDOMNodeList *node_list = NULL;
+ PRBool has_children = FALSE;
+ PRUint16 type;
+ nsresult nsres;
+
+ nsIDOMNode_HasChildNodes(nsnode, &has_children);
+
+ nsres = nsIDOMNode_GetNodeType(nsnode, &type);
+ if(NS_FAILED(nsres)) {
+ ERR("GetType failed: %08lx\n", nsres);
+ return;
+ }
+
+ switch(type) {
+ case ELEMENT_NODE: {
+ nsIDOMElement *nselem;
+ nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMElement, (void**)&nselem);
+ nsIContentSerializer_AppendElementStart(serializer, nselem, has_children, str);
+ nsIDOMElement_Release(nselem);
+ break;
+ }
+ case TEXT_NODE: {
+ nsIDOMText *nstext;
+ nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMText, (void**)&nstext);
+ nsIContentSerializer_AppendText(serializer, nstext, 0, -1, str);
+ nsIDOMText_Release(nstext);
+ break;
+ }
+ case DOCUMENT_NODE: {
+ nsIDOMDocument *nsdoc;
+ nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMDocument, (void**)&nsdoc);
+ nsIContentSerializer_AppendDocumentStart(serializer, nsdoc, str);
+ nsIDOMDocument_Release(nsdoc);
+ }
+ default:
+ FIXME("Unhandled type %u\n", type);
+ }
+
+ if(has_children) {
+ PRUint32 child_cnt, i;
+ nsIDOMNode *child_node;
+
+ nsIDOMNode_GetChildNodes(nsnode, &node_list);
+ nsIDOMNodeList_GetLength(node_list, &child_cnt);
+
+ for(i=0; i<child_cnt; i++) {
+ nsres = nsIDOMNodeList_Item(node_list, i, &child_node);
+ if(NS_SUCCEEDED(nsres)) {
+ nsnode_to_nsstring_rec(serializer, child_node, str);
+ nsIDOMNode_Release(child_node);
+ }else {
+ ERR("Item failed: %08lx\n", nsres);
+ }
+ }
+
+ nsIDOMNodeList_Release(node_list);
+ }
+
+ if(type == ELEMENT_NODE) {
+ nsIDOMElement *nselem;
+ nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMElement, (void**)&nselem);
+ nsIContentSerializer_AppendElementEnd(serializer, nselem, str);
+ nsIDOMElement_Release(nselem);
+ }
+}
+
+void nsnode_to_nsstring(nsIDOMNode *nsdoc, nsAString *str)
+{
+ nsIContentSerializer *serializer;
+ nsIDOMNode *nsnode;
+ nsresult nsres;
+
+ nsres = nsIComponentManager_CreateInstanceByContractID(pCompMgr,
+ NS_HTMLSERIALIZER_CONTRACTID, NULL, &IID_nsIContentSerializer,
+ (void**)&serializer);
+ if(NS_FAILED(nsres)) {
+ ERR("Could not get nsIContentSerializer: %08lx\n", nsres);
+ return;
+ }
+
+ nsres = nsIContentSerializer_Init(serializer, 0, 100, NULL, FALSE);
+ if(NS_FAILED(nsres))
+ ERR("Init failed: %08lx\n", nsres);
+
+ nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMNode, (void**)&nsnode);
+ nsnode_to_nsstring_rec(serializer, nsnode, str);
+ nsIDOMNode_Release(nsnode);
+
+ nsres = nsIContentSerializer_Flush(serializer, str);
+ if(NS_FAILED(nsres))
+ ERR("Flush failed: %08lx\n", nsres);
+
+ nsIContentSerializer_Release(serializer);
+}
+
void close_gecko()
{
TRACE("()\n");
diff --git a/dlls/mshtml/nsiface.idl b/dlls/mshtml/nsiface.idl
index 601e54e..0e59bc9 100644
--- a/dlls/mshtml/nsiface.idl
+++ b/dlls/mshtml/nsiface.idl
@@ -100,7 +100,6 @@ typedef nsISupports nsIDOMAttr;
typedef nsISupports nsIDOMDocumentType;
typedef nsISupports nsIDOMDOMImplementation;
typedef nsISupports nsIDOMDocumentFragment;
-typedef nsISupports nsIDOMText;
typedef nsISupports nsIDOMComment;
typedef nsISupports nsIDOMCDATASection;
typedef nsISupports nsIDOMProcessingInstruction;
@@ -110,6 +109,7 @@ typedef nsISupports nsIDOMHTMLOptionsCol
typedef nsISupports nsIDOMHTMLCollection;
typedef nsISupports nsIDOMRange;
typedef nsISupports nsIEditor;
+typedef nsISupports nsIWebProgressListener;
[
object,
@@ -391,6 +391,21 @@ interface nsIDOMNodeList : nsISupports
]
interface nsIDOMNode : nsISupports
{
+ enum NSNODETYPE {
+ ELEMENT_NODE = 1,
+ ATTRIBUTE_NODE = 2,
+ TEXT_NODE = 3,
+ CDATA_SELECTION_NODE = 4,
+ ENTITY_REFERENCE_NODE = 5,
+ ENTITY_NODE = 6,
+ PROCESSING_INSTRUCTION_NODE = 7,
+ COMMENT_NODE = 8,
+ DOCUMENT_NODE = 9,
+ DOCUMENT_TYPE_NODE = 10,
+ DOCUMENT_FRAGMENT_NODE = 11,
+ NOTATION_NODE = 12
+ };
+
nsresult GetNodeName(nsAString *aNodeName);
nsresult GetNodeValue(nsAString *aNodeValue);
nsresult SetNodeValue(const nsAString *aNodeValue);
@@ -493,6 +508,31 @@ interface nsIDOMNSHTMLElement : nsISuppo
[
object,
+ uuid(a6cf9072-15b3-11d2-932e-00805f8add32)
+]
+interface nsIDOMCharacterData : nsIDOMNode
+{
+ nsresult GetData(nsAString *aData);
+ nsresult SetData(const nsAString *aData);
+ nsresult GetLength(PRUint32 *aLength);
+ nsresult SubstringData(PRUint32 offset, PRUint32 count, nsAString *_retval);
+ nsresult AppendData(const nsAString *arg);
+ nsresult InsertData(PRUint32 offset, const nsAString *arg);
+ nsresult DeleteData(PRUint32 offset, PRUint32 count);
+ nsresult ReplaceData(PRUint32 offset, PRUint32 count, const nsAString *arg);
+}
+
+[
+ object,
+ uuid(a6cf9082-15b3-11d2-932e-00805f8add32)
+]
+interface nsIDOMText : nsIDOMCharacterData
+{
+ nsresult SplitText(PRUint32 offset, nsIDOMText **_retval);
+}
+
+[
+ object,
uuid(a6cf9075-15b3-11d2-932e-00805f8add32)
]
interface nsIDOMDocument : nsIDOMNode
@@ -1216,6 +1256,27 @@ interface nsICommandManager : nsISupport
nsIDOMWindow *aTargetWindow);
}
+[
+ object,
+ uuid(d650439a-ca29-410d-a906-b0557fb62fcd)
+]
+interface nsIContentSerializer : nsISupports
+{
+ nsresult Init(PRUint32 flags, PRUint32 aWrapColumn, const char* aCharSet, PRBool aIsCopying);
+ nsresult AppendText(nsIDOMText *aText, PRInt32 aStartOffset, PRInt32 aEndOffset, nsAString *aStr);
+ nsresult AppendCDATASection(nsIDOMCDATASection *aCDATASection, PRInt32 aStartOffset,
+ PRInt32 aEndOffset, nsAString *aStr);
+ nsresult AppendProcessingInstruction(nsIDOMProcessingInstruction* aPI, PRInt32 aStartOffset,
+ PRInt32 aEndOffset, nsAString *aStr);
+ nsresult AppendComment(nsIDOMComment *aComment, PRInt32 aStartOffset, PRInt32 aEndOffset,
+ nsAString *aStr);
+ nsresult AppendDoctype(nsIDOMDocumentType *aDoctype, nsAString *aStr);
+ nsresult AppendElementStart(nsIDOMElement *aElement, PRBool aHasChildren, nsAString *aStr);
+ nsresult AppendElementEnd(nsIDOMElement *aElement, nsAString *aStr);
+ nsresult Flush(nsAString *aStr);
+ nsresult AppendDocumentStart(nsIDOMDocument *aDocument, nsAString *aStr);
+}
+
/*
* NOTE:
* This is a private Wine interface that is implemented by our implementation
diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c
index d9eb099..407d7c5 100644
--- a/dlls/mshtml/persist.c
+++ b/dlls/mshtml/persist.c
@@ -464,8 +464,54 @@ static HRESULT WINAPI PersistStreamInit_
BOOL fClearDirty)
{
HTMLDocument *This = PERSTRINIT_THIS(iface);
- FIXME("(%p)->(%p %x)\n", This, pStm, fClearDirty);
- return E_NOTIMPL;
+ nsIDOMDocument *nsdoc;
+ nsIDOMNode *nsnode;
+ nsAString nsstr;
+ LPCWSTR strw;
+ char *str;
+ DWORD len, written=0;
+ nsresult nsres;
+ HRESULT hres;
+
+ WARN("(%p)->(%p %x) needs more work\n", This, pStm, fClearDirty);
+
+ if(!This->nscontainer)
+ return S_OK;
+
+ nsres = nsIWebNavigation_GetDocument(This->nscontainer->navigation, &nsdoc);
+ if(NS_FAILED(nsres)) {
+ ERR("GetDocument failed: %08lx\n", nsres);
+ return E_FAIL;
+ }
+
+ nsres = nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMNode, (void**)&nsnode);
+ nsIDOMDocument_Release(nsdoc);
+ if(NS_FAILED(nsres)) {
+ ERR("Could not get nsIDOMNode failed: %08lx\n", nsres);
+ return E_FAIL;
+ }
+
+ nsAString_Init(&nsstr, NULL);
+ nsnode_to_nsstring(nsnode, &nsstr);
+ nsIDOMNode_Release(nsnode);
+
+ nsAString_GetData(&nsstr, &strw, NULL);
+
+ len = WideCharToMultiByte(CP_ACP, 0, strw, -1, NULL, 0, NULL, NULL);
+ str = mshtml_alloc(len);
+ WideCharToMultiByte(CP_ACP, 0, strw, -1, str, len, NULL, NULL);
+
+ nsAString_Finish(&nsstr);
+
+ ERR("%s\n", debugstr_a(str));
+
+ hres = IStream_Write(pStm, str, len, &written);
+ if(FAILED(hres))
+ FIXME("Write failed: %08lx\n", hres);
+
+ mshtml_free(str);
+
+ return S_OK;
}
static HRESULT WINAPI PersistStreamInit_GetSizeMax(IPersistStreamInit *iface,
More information about the wine-cvs
mailing list