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