ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

persist.c
Go to the documentation of this file.
00001 /*
00002  * Copyright 2005 Jacek Caban
00003  *
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Lesser General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2.1 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Lesser General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Lesser General Public
00015  * License along with this library; if not, write to the Free Software
00016  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00017  */
00018 
00019 #include "config.h"
00020 
00021 #include <stdarg.h>
00022 #include <stdio.h>
00023 
00024 #define COBJMACROS
00025 #define NONAMELESSUNION
00026 #define NONAMELESSSTRUCT
00027 
00028 #include "windef.h"
00029 #include "winbase.h"
00030 #include "winuser.h"
00031 #include "ole2.h"
00032 #include "shlguid.h"
00033 #include "idispids.h"
00034 
00035 #include "wine/debug.h"
00036 #include "wine/unicode.h"
00037 
00038 #include "mshtml_private.h"
00039 #include "htmlevent.h"
00040 
00041 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
00042 
00043 typedef struct {
00044     task_t header;
00045     HTMLDocumentObj *doc;
00046     BOOL set_download;
00047 } download_proc_task_t;
00048 
00049 static BOOL use_gecko_script(LPCWSTR url)
00050 {
00051     static const WCHAR fileW[] = {'f','i','l','e',':'};
00052     static const WCHAR aboutW[] = {'a','b','o','u','t',':'};
00053     static const WCHAR resW[] = {'r','e','s',':'};
00054 
00055     return strncmpiW(fileW, url, sizeof(fileW)/sizeof(WCHAR))
00056         && strncmpiW(aboutW, url, sizeof(aboutW)/sizeof(WCHAR))
00057         && strncmpiW(resW, url, sizeof(resW)/sizeof(WCHAR));
00058 }
00059 
00060 void set_current_mon(HTMLWindow *This, IMoniker *mon)
00061 {
00062     HRESULT hres;
00063 
00064     if(This->mon) {
00065         IMoniker_Release(This->mon);
00066         This->mon = NULL;
00067     }
00068 
00069     if(This->url) {
00070         CoTaskMemFree(This->url);
00071         This->url = NULL;
00072     }
00073 
00074     if(!mon)
00075         return;
00076 
00077     IMoniker_AddRef(mon);
00078     This->mon = mon;
00079 
00080     hres = IMoniker_GetDisplayName(mon, NULL, NULL, &This->url);
00081     if(FAILED(hres))
00082         WARN("GetDisplayName failed: %08x\n", hres);
00083 
00084     set_script_mode(This, use_gecko_script(This->url) ? SCRIPTMODE_GECKO : SCRIPTMODE_ACTIVESCRIPT);
00085 }
00086 
00087 static void set_progress_proc(task_t *_task)
00088 {
00089     docobj_task_t *task = (docobj_task_t*)_task;
00090     IOleCommandTarget *olecmd = NULL;
00091     HTMLDocumentObj *doc = task->doc;
00092     HRESULT hres;
00093 
00094     TRACE("(%p)\n", doc);
00095 
00096     if(doc->client)
00097         IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd);
00098 
00099     if(olecmd) {
00100         VARIANT progress_max, progress;
00101 
00102         V_VT(&progress_max) = VT_I4;
00103         V_I4(&progress_max) = 0; /* FIXME */
00104         IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSMAX, OLECMDEXECOPT_DONTPROMPTUSER,
00105                                &progress_max, NULL);
00106 
00107         V_VT(&progress) = VT_I4;
00108         V_I4(&progress) = 0; /* FIXME */
00109         IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER,
00110                                &progress, NULL);
00111         IOleCommandTarget_Release(olecmd);
00112     }
00113 
00114     if(doc->usermode == EDITMODE && doc->hostui) {
00115         DOCHOSTUIINFO hostinfo;
00116 
00117         memset(&hostinfo, 0, sizeof(DOCHOSTUIINFO));
00118         hostinfo.cbSize = sizeof(DOCHOSTUIINFO);
00119         hres = IDocHostUIHandler_GetHostInfo(doc->hostui, &hostinfo);
00120         if(SUCCEEDED(hres))
00121             /* FIXME: use hostinfo */
00122             TRACE("hostinfo = {%u %08x %08x %s %s}\n",
00123                     hostinfo.cbSize, hostinfo.dwFlags, hostinfo.dwDoubleClick,
00124                     debugstr_w(hostinfo.pchHostCss), debugstr_w(hostinfo.pchHostNS));
00125     }
00126 }
00127 
00128 static void set_downloading_proc(task_t *_task)
00129 {
00130     download_proc_task_t *task = (download_proc_task_t*)_task;
00131     HTMLDocumentObj *doc = task->doc;
00132     IOleCommandTarget *olecmd;
00133     HRESULT hres;
00134 
00135     TRACE("(%p)\n", doc);
00136 
00137     if(doc->frame)
00138         IOleInPlaceFrame_SetStatusText(doc->frame, NULL /* FIXME */);
00139 
00140     if(!doc->client)
00141         return;
00142 
00143     if(task->set_download) {
00144         hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd);
00145         if(SUCCEEDED(hres)) {
00146             VARIANT var;
00147 
00148             V_VT(&var) = VT_I4;
00149             V_I4(&var) = 1;
00150 
00151             IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE,
00152                     OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL);
00153             IOleCommandTarget_Release(olecmd);
00154         }
00155 
00156         doc->download_state = 1;
00157     }
00158 
00159     if(doc->view_sink)
00160         IAdviseSink_OnViewChange(doc->view_sink, DVASPECT_CONTENT, -1);
00161 
00162     if(doc->hostui) {
00163         IDropTarget *drop_target = NULL;
00164 
00165         hres = IDocHostUIHandler_GetDropTarget(doc->hostui, NULL /* FIXME */, &drop_target);
00166         if(drop_target) {
00167             FIXME("Use IDropTarget\n");
00168             IDropTarget_Release(drop_target);
00169         }
00170     }
00171 }
00172 
00173 HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, nsChannelBSC *async_bsc, BOOL set_download)
00174 {
00175     nsChannelBSC *bscallback;
00176     docobj_task_t *task;
00177     download_proc_task_t *download_task;
00178     nsWineURI *nsuri;
00179     LPOLESTR url;
00180     HRESULT hres;
00181 
00182     hres = IMoniker_GetDisplayName(mon, pibc, NULL, &url);
00183     if(FAILED(hres)) {
00184         WARN("GetDiaplayName failed: %08x\n", hres);
00185         return hres;
00186     }
00187 
00188     TRACE("got url: %s\n", debugstr_w(url));
00189 
00190     if(This->doc_obj->client) {
00191         VARIANT silent, offline;
00192 
00193         hres = get_client_disp_property(This->doc_obj->client, DISPID_AMBIENT_SILENT, &silent);
00194         if(SUCCEEDED(hres)) {
00195             if(V_VT(&silent) != VT_BOOL)
00196                 WARN("V_VT(silent) = %d\n", V_VT(&silent));
00197             else if(V_BOOL(&silent))
00198                 FIXME("silent == true\n");
00199         }
00200 
00201         hres = get_client_disp_property(This->doc_obj->client,
00202                 DISPID_AMBIENT_OFFLINEIFNOTCONNECTED, &offline);
00203         if(SUCCEEDED(hres)) {
00204             if(V_VT(&silent) != VT_BOOL)
00205                 WARN("V_VT(offline) = %d\n", V_VT(&silent));
00206             else if(V_BOOL(&silent))
00207                 FIXME("offline == true\n");
00208         }
00209     }
00210 
00211     if(This->window->mon) {
00212         update_doc(This, UPDATE_TITLE|UPDATE_UI);
00213     }else {
00214         update_doc(This, UPDATE_TITLE);
00215         set_current_mon(This->window, mon);
00216     }
00217 
00218     set_ready_state(This->window, READYSTATE_LOADING);
00219 
00220     if(This->doc_obj->client) {
00221         IOleCommandTarget *cmdtrg = NULL;
00222 
00223         hres = IOleClientSite_QueryInterface(This->doc_obj->client, &IID_IOleCommandTarget,
00224                 (void**)&cmdtrg);
00225         if(SUCCEEDED(hres)) {
00226             VARIANT var, out;
00227 
00228             if(!async_bsc) {
00229                 V_VT(&var) = VT_I4;
00230                 V_I4(&var) = 0;
00231                 IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 37, 0, &var, NULL);
00232             }else {
00233                 V_VT(&var) = VT_UNKNOWN;
00234                 V_UNKNOWN(&var) = (IUnknown*)HTMLWINDOW2(This->window);
00235                 V_VT(&out) = VT_EMPTY;
00236                 hres = IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 63, 0, &var, &out);
00237                 if(SUCCEEDED(hres))
00238                     VariantClear(&out);
00239             }
00240 
00241             IOleCommandTarget_Release(cmdtrg);
00242         }
00243     }
00244 
00245     hres = create_doc_uri(This->window, url, &nsuri);
00246     CoTaskMemFree(url);
00247     if(FAILED(hres))
00248         return hres;
00249 
00250     if(async_bsc) {
00251         bscallback = async_bsc;
00252     }else {
00253         hres = create_channelbsc(mon, NULL, NULL, 0, &bscallback);
00254         if(FAILED(hres))
00255             return hres;
00256     }
00257 
00258     hres = load_nsuri(This->window, nsuri, bscallback, LOAD_INITIAL_DOCUMENT_URI);
00259     nsISupports_Release((nsISupports*)nsuri); /* FIXME */
00260     if(SUCCEEDED(hres))
00261         set_window_bscallback(This->window, bscallback);
00262     if(bscallback != async_bsc)
00263         IUnknown_Release((IUnknown*)bscallback);
00264     if(FAILED(hres))
00265         return hres;
00266 
00267     HTMLDocument_LockContainer(This->doc_obj, TRUE);
00268 
00269     if(This->doc_obj->frame) {
00270         task = heap_alloc(sizeof(docobj_task_t));
00271         task->doc = This->doc_obj;
00272         push_task(&task->header, set_progress_proc, This->doc_obj->basedoc.task_magic);
00273     }
00274 
00275     download_task = heap_alloc(sizeof(download_proc_task_t));
00276     download_task->doc = This->doc_obj;
00277     download_task->set_download = set_download;
00278     push_task(&download_task->header, set_downloading_proc, This->doc_obj->basedoc.task_magic);
00279 
00280     return S_OK;
00281 }
00282 
00283 void set_ready_state(HTMLWindow *window, READYSTATE readystate)
00284 {
00285     window->readystate = readystate;
00286 
00287     if(window->doc_obj && window->doc_obj->basedoc.window == window)
00288         call_property_onchanged(&window->doc_obj->basedoc.cp_propnotif, DISPID_READYSTATE);
00289 
00290     fire_event(window->doc, EVENTID_READYSTATECHANGE, FALSE, window->doc->node.nsnode, NULL);
00291 
00292     if(window->frame_element)
00293         fire_event(window->frame_element->element.node.doc, EVENTID_READYSTATECHANGE,
00294                    TRUE, window->frame_element->element.node.nsnode, NULL);
00295 }
00296 
00297 static HRESULT get_doc_string(HTMLDocumentNode *This, char **str)
00298 {
00299     nsIDOMNode *nsnode;
00300     LPCWSTR strw;
00301     nsAString nsstr;
00302     nsresult nsres;
00303 
00304     if(!This->nsdoc) {
00305         WARN("NULL nsdoc\n");
00306         return E_UNEXPECTED;
00307     }
00308 
00309     nsres = nsIDOMHTMLDocument_QueryInterface(This->nsdoc, &IID_nsIDOMNode, (void**)&nsnode);
00310     if(NS_FAILED(nsres)) {
00311         ERR("Could not get nsIDOMNode failed: %08x\n", nsres);
00312         return E_FAIL;
00313     }
00314 
00315     nsAString_Init(&nsstr, NULL);
00316     nsnode_to_nsstring(nsnode, &nsstr);
00317     nsIDOMNode_Release(nsnode);
00318 
00319     nsAString_GetData(&nsstr, &strw);
00320     TRACE("%s\n", debugstr_w(strw));
00321 
00322     *str = heap_strdupWtoA(strw);
00323 
00324     nsAString_Finish(&nsstr);
00325 
00326     return S_OK;
00327 }
00328 
00329 
00330 /**********************************************************
00331  * IPersistMoniker implementation
00332  */
00333 
00334 #define PERSISTMON_THIS(iface) DEFINE_THIS(HTMLDocument, PersistMoniker, iface)
00335 
00336 static HRESULT WINAPI PersistMoniker_QueryInterface(IPersistMoniker *iface, REFIID riid,
00337                                                             void **ppvObject)
00338 {
00339     HTMLDocument *This = PERSISTMON_THIS(iface);
00340     return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppvObject);
00341 }
00342 
00343 static ULONG WINAPI PersistMoniker_AddRef(IPersistMoniker *iface)
00344 {
00345     HTMLDocument *This = PERSISTMON_THIS(iface);
00346     return IHTMLDocument2_AddRef(HTMLDOC(This));
00347 }
00348 
00349 static ULONG WINAPI PersistMoniker_Release(IPersistMoniker *iface)
00350 {
00351     HTMLDocument *This = PERSISTMON_THIS(iface);
00352     return IHTMLDocument2_Release(HTMLDOC(This));
00353 }
00354 
00355 static HRESULT WINAPI PersistMoniker_GetClassID(IPersistMoniker *iface, CLSID *pClassID)
00356 {
00357     HTMLDocument *This = PERSISTMON_THIS(iface);
00358     return IPersist_GetClassID(PERSIST(This), pClassID);
00359 }
00360 
00361 static HRESULT WINAPI PersistMoniker_IsDirty(IPersistMoniker *iface)
00362 {
00363     HTMLDocument *This = PERSISTMON_THIS(iface);
00364 
00365     TRACE("(%p)\n", This);
00366 
00367     return IPersistStreamInit_IsDirty(PERSTRINIT(This));
00368 }
00369 
00370 static HRESULT WINAPI PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAvailable,
00371         IMoniker *pimkName, LPBC pibc, DWORD grfMode)
00372 {
00373     HTMLDocument *This = PERSISTMON_THIS(iface);
00374     HRESULT hres;
00375 
00376     TRACE("(%p)->(%x %p %p %08x)\n", This, fFullyAvailable, pimkName, pibc, grfMode);
00377 
00378     if(pibc) {
00379         IUnknown *unk = NULL;
00380 
00381         /* FIXME:
00382          * Use params:
00383          * "__PrecreatedObject"
00384          * "BIND_CONTEXT_PARAM"
00385          * "__HTMLLOADOPTIONS"
00386          * "__DWNBINDINFO"
00387          * "URL Context"
00388          * "_ITransData_Object_"
00389          * "_EnumFORMATETC_"
00390          */
00391 
00392         IBindCtx_GetObjectParam(pibc, (LPOLESTR)SZ_HTML_CLIENTSITE_OBJECTPARAM, &unk);
00393         if(unk) {
00394             IOleClientSite *client = NULL;
00395 
00396             hres = IUnknown_QueryInterface(unk, &IID_IOleClientSite, (void**)&client);
00397             if(SUCCEEDED(hres)) {
00398                 TRACE("Got client site %p\n", client);
00399                 IOleObject_SetClientSite(OLEOBJ(This), client);
00400                 IOleClientSite_Release(client);
00401             }
00402 
00403             IUnknown_Release(unk);
00404         }
00405     }
00406 
00407     hres = set_moniker(This, pimkName, pibc, NULL, TRUE);
00408     if(FAILED(hres))
00409         return hres;
00410 
00411     return start_binding(This->window, NULL, (BSCallback*)This->window->bscallback, pibc);
00412 }
00413 
00414 static HRESULT WINAPI PersistMoniker_Save(IPersistMoniker *iface, IMoniker *pimkName,
00415         LPBC pbc, BOOL fRemember)
00416 {
00417     HTMLDocument *This = PERSISTMON_THIS(iface);
00418     FIXME("(%p)->(%p %p %x)\n", This, pimkName, pbc, fRemember);
00419     return E_NOTIMPL;
00420 }
00421 
00422 static HRESULT WINAPI PersistMoniker_SaveCompleted(IPersistMoniker *iface, IMoniker *pimkName, LPBC pibc)
00423 {
00424     HTMLDocument *This = PERSISTMON_THIS(iface);
00425     FIXME("(%p)->(%p %p)\n", This, pimkName, pibc);
00426     return E_NOTIMPL;
00427 }
00428 
00429 static HRESULT WINAPI PersistMoniker_GetCurMoniker(IPersistMoniker *iface, IMoniker **ppimkName)
00430 {
00431     HTMLDocument *This = PERSISTMON_THIS(iface);
00432 
00433     TRACE("(%p)->(%p)\n", This, ppimkName);
00434 
00435     if(!This->window || !This->window->mon)
00436         return E_UNEXPECTED;
00437 
00438     IMoniker_AddRef(This->window->mon);
00439     *ppimkName = This->window->mon;
00440     return S_OK;
00441 }
00442 
00443 static const IPersistMonikerVtbl PersistMonikerVtbl = {
00444     PersistMoniker_QueryInterface,
00445     PersistMoniker_AddRef,
00446     PersistMoniker_Release,
00447     PersistMoniker_GetClassID,
00448     PersistMoniker_IsDirty,
00449     PersistMoniker_Load,
00450     PersistMoniker_Save,
00451     PersistMoniker_SaveCompleted,
00452     PersistMoniker_GetCurMoniker
00453 };
00454 
00455 /**********************************************************
00456  * IMonikerProp implementation
00457  */
00458 
00459 #define MONPROP_THIS(iface) DEFINE_THIS(HTMLDocument, MonikerProp, iface)
00460 
00461 static HRESULT WINAPI MonikerProp_QueryInterface(IMonikerProp *iface, REFIID riid, void **ppvObject)
00462 {
00463     HTMLDocument *This = MONPROP_THIS(iface);
00464     return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppvObject);
00465 }
00466 
00467 static ULONG WINAPI MonikerProp_AddRef(IMonikerProp *iface)
00468 {
00469     HTMLDocument *This = MONPROP_THIS(iface);
00470     return IHTMLDocument2_AddRef(HTMLDOC(This));
00471 }
00472 
00473 static ULONG WINAPI MonikerProp_Release(IMonikerProp *iface)
00474 {
00475     HTMLDocument *This = MONPROP_THIS(iface);
00476     return IHTMLDocument_Release(HTMLDOC(This));
00477 }
00478 
00479 static HRESULT WINAPI MonikerProp_PutProperty(IMonikerProp *iface, MONIKERPROPERTY mkp, LPCWSTR val)
00480 {
00481     HTMLDocument *This = MONPROP_THIS(iface);
00482 
00483     TRACE("(%p)->(%d %s)\n", This, mkp, debugstr_w(val));
00484 
00485     switch(mkp) {
00486     case MIMETYPEPROP:
00487         heap_free(This->doc_obj->mime);
00488         This->doc_obj->mime = heap_strdupW(val);
00489         break;
00490 
00491     case CLASSIDPROP:
00492         break;
00493 
00494     default:
00495         FIXME("mkp %d\n", mkp);
00496         return E_NOTIMPL;
00497     }
00498 
00499     return S_OK;
00500 }
00501 
00502 static const IMonikerPropVtbl MonikerPropVtbl = {
00503     MonikerProp_QueryInterface,
00504     MonikerProp_AddRef,
00505     MonikerProp_Release,
00506     MonikerProp_PutProperty
00507 };
00508 
00509 /**********************************************************
00510  * IPersistFile implementation
00511  */
00512 
00513 #define PERSISTFILE_THIS(iface) DEFINE_THIS(HTMLDocument, PersistFile, iface)
00514 
00515 static HRESULT WINAPI PersistFile_QueryInterface(IPersistFile *iface, REFIID riid, void **ppvObject)
00516 {
00517     HTMLDocument *This = PERSISTFILE_THIS(iface);
00518     return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppvObject);
00519 }
00520 
00521 static ULONG WINAPI PersistFile_AddRef(IPersistFile *iface)
00522 {
00523     HTMLDocument *This = PERSISTFILE_THIS(iface);
00524     return IHTMLDocument2_AddRef(HTMLDOC(This));
00525 }
00526 
00527 static ULONG WINAPI PersistFile_Release(IPersistFile *iface)
00528 {
00529     HTMLDocument *This = PERSISTFILE_THIS(iface);
00530     return IHTMLDocument2_Release(HTMLDOC(This));
00531 }
00532 
00533 static HRESULT WINAPI PersistFile_GetClassID(IPersistFile *iface, CLSID *pClassID)
00534 {
00535     HTMLDocument *This = PERSISTFILE_THIS(iface);
00536 
00537     TRACE("(%p)->(%p)\n", This, pClassID);
00538 
00539     if(!pClassID)
00540         return E_INVALIDARG;
00541 
00542     *pClassID = CLSID_HTMLDocument;
00543     return S_OK;
00544 }
00545 
00546 static HRESULT WINAPI PersistFile_IsDirty(IPersistFile *iface)
00547 {
00548     HTMLDocument *This = PERSISTFILE_THIS(iface);
00549 
00550     TRACE("(%p)\n", This);
00551 
00552     return IPersistStreamInit_IsDirty(PERSTRINIT(This));
00553 }
00554 
00555 static HRESULT WINAPI PersistFile_Load(IPersistFile *iface, LPCOLESTR pszFileName, DWORD dwMode)
00556 {
00557     HTMLDocument *This = PERSISTFILE_THIS(iface);
00558     FIXME("(%p)->(%s %08x)\n", This, debugstr_w(pszFileName), dwMode);
00559     return E_NOTIMPL;
00560 }
00561 
00562 static HRESULT WINAPI PersistFile_Save(IPersistFile *iface, LPCOLESTR pszFileName, BOOL fRemember)
00563 {
00564     HTMLDocument *This = PERSISTFILE_THIS(iface);
00565     char *str;
00566     DWORD written=0;
00567     HANDLE file;
00568     HRESULT hres;
00569 
00570     TRACE("(%p)->(%s %x)\n", This, debugstr_w(pszFileName), fRemember);
00571 
00572     file = CreateFileW(pszFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
00573                        FILE_ATTRIBUTE_NORMAL, NULL);
00574     if(file == INVALID_HANDLE_VALUE) {
00575         WARN("Could not create file: %u\n", GetLastError());
00576         return E_FAIL;
00577     }
00578 
00579     hres = get_doc_string(This->doc_node, &str);
00580     if(SUCCEEDED(hres))
00581         WriteFile(file, str, strlen(str), &written, NULL);
00582 
00583     CloseHandle(file);
00584     return hres;
00585 }
00586 
00587 static HRESULT WINAPI PersistFile_SaveCompleted(IPersistFile *iface, LPCOLESTR pszFileName)
00588 {
00589     HTMLDocument *This = PERSISTFILE_THIS(iface);
00590     FIXME("(%p)->(%s)\n", This, debugstr_w(pszFileName));
00591     return E_NOTIMPL;
00592 }
00593 
00594 static HRESULT WINAPI PersistFile_GetCurFile(IPersistFile *iface, LPOLESTR *pszFileName)
00595 {
00596     HTMLDocument *This = PERSISTFILE_THIS(iface);
00597     FIXME("(%p)->(%p)\n", This, pszFileName);
00598     return E_NOTIMPL;
00599 }
00600 
00601 static const IPersistFileVtbl PersistFileVtbl = {
00602     PersistFile_QueryInterface,
00603     PersistFile_AddRef,
00604     PersistFile_Release,
00605     PersistFile_GetClassID,
00606     PersistFile_IsDirty,
00607     PersistFile_Load,
00608     PersistFile_Save,
00609     PersistFile_SaveCompleted,
00610     PersistFile_GetCurFile
00611 };
00612 
00613 #define PERSTRINIT_THIS(iface) DEFINE_THIS(HTMLDocument, PersistStreamInit, iface)
00614 
00615 static HRESULT WINAPI PersistStreamInit_QueryInterface(IPersistStreamInit *iface,
00616                                                        REFIID riid, void **ppv)
00617 {
00618     HTMLDocument *This = PERSTRINIT_THIS(iface);
00619     return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppv);
00620 }
00621 
00622 static ULONG WINAPI PersistStreamInit_AddRef(IPersistStreamInit *iface)
00623 {
00624     HTMLDocument *This = PERSTRINIT_THIS(iface);
00625     return IHTMLDocument2_AddRef(HTMLDOC(This));
00626 }
00627 
00628 static ULONG WINAPI PersistStreamInit_Release(IPersistStreamInit *iface)
00629 {
00630     HTMLDocument *This = PERSTRINIT_THIS(iface);
00631     return IHTMLDocument2_Release(HTMLDOC(This));
00632 }
00633 
00634 static HRESULT WINAPI PersistStreamInit_GetClassID(IPersistStreamInit *iface, CLSID *pClassID)
00635 {
00636     HTMLDocument *This = PERSTRINIT_THIS(iface);
00637     return IPersist_GetClassID(PERSIST(This), pClassID);
00638 }
00639 
00640 static HRESULT WINAPI PersistStreamInit_IsDirty(IPersistStreamInit *iface)
00641 {
00642     HTMLDocument *This = PERSTRINIT_THIS(iface);
00643 
00644     TRACE("(%p)\n", This);
00645 
00646     if(This->doc_obj->usermode == EDITMODE)
00647         return editor_is_dirty(This);
00648 
00649     return S_FALSE;
00650 }
00651 
00652 static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, LPSTREAM pStm)
00653 {
00654     HTMLDocument *This = PERSTRINIT_THIS(iface);
00655     IMoniker *mon;
00656     HRESULT hres;
00657 
00658     static const WCHAR about_blankW[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
00659 
00660     TRACE("(%p)->(%p)\n", This, pStm);
00661 
00662     hres = CreateURLMoniker(NULL, about_blankW, &mon);
00663     if(FAILED(hres)) {
00664         WARN("CreateURLMoniker failed: %08x\n", hres);
00665         return hres;
00666     }
00667 
00668     hres = set_moniker(This, mon, NULL, NULL, TRUE);
00669     IMoniker_Release(mon);
00670     if(FAILED(hres))
00671         return hres;
00672 
00673     return channelbsc_load_stream(This->window->bscallback, pStm);
00674 }
00675 
00676 static HRESULT WINAPI PersistStreamInit_Save(IPersistStreamInit *iface, LPSTREAM pStm,
00677                                              BOOL fClearDirty)
00678 {
00679     HTMLDocument *This = PERSTRINIT_THIS(iface);
00680     char *str;
00681     DWORD written=0;
00682     HRESULT hres;
00683 
00684     TRACE("(%p)->(%p %x)\n", This, pStm, fClearDirty);
00685 
00686     hres = get_doc_string(This->doc_node, &str);
00687     if(FAILED(hres))
00688         return hres;
00689 
00690     hres = IStream_Write(pStm, str, strlen(str), &written);
00691     if(FAILED(hres))
00692         FIXME("Write failed: %08x\n", hres);
00693 
00694     heap_free(str);
00695 
00696     if(fClearDirty)
00697         set_dirty(This, VARIANT_FALSE);
00698 
00699     return S_OK;
00700 }
00701 
00702 static HRESULT WINAPI PersistStreamInit_GetSizeMax(IPersistStreamInit *iface,
00703                                                    ULARGE_INTEGER *pcbSize)
00704 {
00705     HTMLDocument *This = PERSTRINIT_THIS(iface);
00706     FIXME("(%p)->(%p)\n", This, pcbSize);
00707     return E_NOTIMPL;
00708 }
00709 
00710 static HRESULT WINAPI PersistStreamInit_InitNew(IPersistStreamInit *iface)
00711 {
00712     HTMLDocument *This = PERSTRINIT_THIS(iface);
00713     IMoniker *mon;
00714     HRESULT hres;
00715 
00716     static const WCHAR about_blankW[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
00717 
00718     TRACE("(%p)\n", This);
00719 
00720     hres = CreateURLMoniker(NULL, about_blankW, &mon);
00721     if(FAILED(hres)) {
00722         WARN("CreateURLMoniker failed: %08x\n", hres);
00723         return hres;
00724     }
00725 
00726     hres = set_moniker(This, mon, NULL, NULL, FALSE);
00727     IMoniker_Release(mon);
00728     if(FAILED(hres))
00729         return hres;
00730 
00731     return start_binding(This->window, NULL, (BSCallback*)This->window->bscallback, NULL);
00732 }
00733 
00734 #undef PERSTRINIT_THIS
00735 
00736 static const IPersistStreamInitVtbl PersistStreamInitVtbl = {
00737     PersistStreamInit_QueryInterface,
00738     PersistStreamInit_AddRef,
00739     PersistStreamInit_Release,
00740     PersistStreamInit_GetClassID,
00741     PersistStreamInit_IsDirty,
00742     PersistStreamInit_Load,
00743     PersistStreamInit_Save,
00744     PersistStreamInit_GetSizeMax,
00745     PersistStreamInit_InitNew
00746 };
00747 
00748 /**********************************************************
00749  * IPersistHistory implementation
00750  */
00751 
00752 #define PERSISTHIST_THIS(iface) DEFINE_THIS(HTMLDocument, PersistHistory, iface)
00753 
00754 static HRESULT WINAPI PersistHistory_QueryInterface(IPersistHistory *iface, REFIID riid, void **ppvObject)
00755 {
00756     HTMLDocument *This = PERSISTHIST_THIS(iface);
00757     return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppvObject);
00758 }
00759 
00760 static ULONG WINAPI PersistHistory_AddRef(IPersistHistory *iface)
00761 {
00762     HTMLDocument *This = PERSISTHIST_THIS(iface);
00763     return IHTMLDocument2_AddRef(HTMLDOC(This));
00764 }
00765 
00766 static ULONG WINAPI PersistHistory_Release(IPersistHistory *iface)
00767 {
00768     HTMLDocument *This = PERSISTHIST_THIS(iface);
00769     return IHTMLDocument2_Release(HTMLDOC(This));
00770 }
00771 
00772 static HRESULT WINAPI PersistHistory_GetClassID(IPersistHistory *iface, CLSID *pClassID)
00773 {
00774     HTMLDocument *This = PERSISTHIST_THIS(iface);
00775     return IPersist_GetClassID(PERSIST(This), pClassID);
00776 }
00777 
00778 static HRESULT WINAPI PersistHistory_LoadHistory(IPersistHistory *iface, IStream *pStream, IBindCtx *pbc)
00779 {
00780     HTMLDocument *This = PERSISTHIST_THIS(iface);
00781     FIXME("(%p)->(%p %p)\n", This, pStream, pbc);
00782     return E_NOTIMPL;
00783 }
00784 
00785 static HRESULT WINAPI PersistHistory_SaveHistory(IPersistHistory *iface, IStream *pStream)
00786 {
00787     HTMLDocument *This = PERSISTHIST_THIS(iface);
00788     FIXME("(%p)->(%p)\n", This, pStream);
00789     return E_NOTIMPL;
00790 }
00791 
00792 static HRESULT WINAPI PersistHistory_SetPositionCookie(IPersistHistory *iface, DWORD dwPositioncookie)
00793 {
00794     HTMLDocument *This = PERSISTHIST_THIS(iface);
00795     FIXME("(%p)->(%x)\n", This, dwPositioncookie);
00796     return E_NOTIMPL;
00797 }
00798 
00799 static HRESULT WINAPI PersistHistory_GetPositionCookie(IPersistHistory *iface, DWORD *pdwPositioncookie)
00800 {
00801     HTMLDocument *This = PERSISTHIST_THIS(iface);
00802     FIXME("(%p)->(%p)\n", This, pdwPositioncookie);
00803     return E_NOTIMPL;
00804 }
00805 
00806 #undef PERSISTHIST_THIS
00807 
00808 static const IPersistHistoryVtbl PersistHistoryVtbl = {
00809     PersistHistory_QueryInterface,
00810     PersistHistory_AddRef,
00811     PersistHistory_Release,
00812     PersistHistory_GetClassID,
00813     PersistHistory_LoadHistory,
00814     PersistHistory_SaveHistory,
00815     PersistHistory_SetPositionCookie,
00816     PersistHistory_GetPositionCookie
00817 };
00818 
00819 void HTMLDocument_Persist_Init(HTMLDocument *This)
00820 {
00821     This->lpPersistMonikerVtbl = &PersistMonikerVtbl;
00822     This->lpPersistFileVtbl = &PersistFileVtbl;
00823     This->lpMonikerPropVtbl = &MonikerPropVtbl;
00824     This->lpPersistStreamInitVtbl = &PersistStreamInitVtbl;
00825     This->lpPersistHistoryVtbl = &PersistHistoryVtbl;
00826 }

Generated on Sun May 27 2012 04:25:07 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.