Esempio n. 1
0
 /// <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);
Esempio n. 2
0
        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);
        }