/// <summary> /// This method retreived the HTML of the browser and pass it on to the gelegated function /// </summary> /// <param name="callBack"></param> /// <returns></returns> public abstract bool GetBuffer(GetBufferCallback callBack);
public override bool GetBuffer(GetBufferCallback callBack) { this.getBufferCallback = callBack; if (this.buffer != null && callBack != null) { callBack(this.buffer); return(true); } if (this.m_pIWebBrowser2 == null) { SetState(BrowserStatus.Error); isRefreshingForBuffer = false; return(false); } IHTMLDocument2 document = this.m_pIWebBrowser2.Document as IHTMLDocument2; if (document == null) { SetState(BrowserStatus.Error); isRefreshingForBuffer = false; return(false); } IPersistStreamInit ips = document as IPersistStreamInit; if (ips == null) { SetState(BrowserStatus.Error); isRefreshingForBuffer = false; return(false); } try { IStream istream; CreateStreamOnHGlobal(IntPtr.Zero, true, out istream); if (istream == null) { SetState(BrowserStatus.Error); isRefreshingForBuffer = false; return(false); } int cb; unsafe { int hr = ips.Save(istream, false); if (hr != HRESULT.S_OK) { Marshal.ThrowExceptionForHR(hr); SetState(BrowserStatus.Error); return(false); } istream.Seek(0, 0, IntPtr.Zero); byte[] buffer = new byte[1024]; StringBuilder sb = new StringBuilder(); int * pcb = &cb; IntPtr readOffset = new IntPtr(pcb); do { istream.Read(buffer, 1024, readOffset); sb.Append(System.Text.ASCIIEncoding.UTF8.GetString(buffer, 0, cb)); } while (cb > 0); istream = null; ips = null; if (sb.Length <= 0) { SetState(BrowserStatus.Error); isRefreshingForBuffer = false; return(false); } isRefreshingForBuffer = false; this.buffer = sb.ToString(); } } catch (Exception e) { // workaround a bug on IE // when there's a "no-cache" http header // the HTML Source is invisible, so to fix it, // we need to refresh the page.. if (e is FileNotFoundException) { // Call refresh unless called before... if (isRefreshingForBuffer || m_pIWebBrowser2 == null) { SetState(BrowserStatus.Error); return(false); } isRefreshingForBuffer = true; SetState(BrowserStatus.Processing); m_pIWebBrowser2.Refresh(); return(true); } else { SetState(BrowserStatus.Error); return(false); } } if (callBack != null) { callBack(this.buffer); } return(true); }