Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenpersist.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
1.7.6.1
|