private void StreamOut(Stream data, int flags, bool includeCrLfs) { // set up the EDITSTREAM structure for the callback. Debug.Assert(data != null, "StreamOut passed a null stream"); editStream = data; try { int cookieVal = 0; NativeMethods.EDITSTREAM es = new NativeMethods.EDITSTREAM(); if ((flags & RichTextBoxConstants.SF_UNICODE) != 0) { cookieVal = OUTPUT | UNICODE; } else { cookieVal = OUTPUT | ANSI; } if ((flags & RichTextBoxConstants.SF_RTF) != 0) { cookieVal |= RTF; } else { if (includeCrLfs) { cookieVal |= TEXTCRLF; } else { cookieVal |= TEXTLF; } } es.dwCookie = (IntPtr) cookieVal; es.pfnCallback = new NativeMethods.EditStreamCallback(this.EditStreamProc); //Get Text //Weird hack needed for 64-bit if (IntPtr.Size == 8) { NativeMethods.EDITSTREAM64 es64 = ConvertToEDITSTREAM64(es); UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), RichTextBoxConstants.EM_STREAMOUT, flags, es64); //Assign back dwError value es.dwError = GetErrorValue64(es64); } else { UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), RichTextBoxConstants.EM_STREAMOUT, flags, es); } // check to make sure things went well if (es.dwError != 0) throw new InvalidOperationException(SR.GetString(SR.SaveTextError)); } finally { // release any storage space held. editStream = null; } }
public static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, NativeMethods.EDITSTREAM lParam);
private void StreamIn(Stream data, int flags) { // clear out the selection only if we are replacing all the text // if ((flags & RichTextBoxConstants.SFF_SELECTION) == 0) { NativeMethods.CHARRANGE cr = new NativeMethods.CHARRANGE(); UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), RichTextBoxConstants.EM_EXSETSEL, 0, cr); } try { editStream = data; Debug.Assert(data != null, "StreamIn passed a null stream"); // If SF_RTF is requested then check for the RTF tag at the start // of the file. We don't load if the tag is not there // if ((flags & RichTextBoxConstants.SF_RTF) != 0) { long streamStart = editStream.Position; byte[] bytes = new byte[SZ_RTF_TAG.Length]; editStream.Read(bytes, (int)streamStart, SZ_RTF_TAG.Length); string str = Encoding.Default.GetString(bytes); if (!SZ_RTF_TAG.Equals(str)) throw new ArgumentException(SR.GetString(SR.InvalidFileFormat)); // put us back at the start of the file editStream.Position = streamStart; } int cookieVal = 0; // set up structure to do stream operation NativeMethods.EDITSTREAM es = new NativeMethods.EDITSTREAM(); if ((flags & RichTextBoxConstants.SF_UNICODE) != 0) { cookieVal = INPUT | UNICODE; } else { cookieVal = INPUT | ANSI; } if ((flags & RichTextBoxConstants.SF_RTF) != 0) { cookieVal |= RTF; } else { cookieVal |= TEXTLF; } es.dwCookie = (IntPtr) cookieVal; es.pfnCallback = new NativeMethods.EditStreamCallback(this.EditStreamProc); // gives us TextBox compatible behavior, programatic text change shouldn't // be limited... // SendMessage(RichTextBoxConstants.EM_EXLIMITTEXT, 0, Int32.MaxValue); // go get the text for the control //Weird hack needed for 64-bit if (IntPtr.Size == 8) { NativeMethods.EDITSTREAM64 es64 = ConvertToEDITSTREAM64(es); UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), RichTextBoxConstants.EM_STREAMIN, flags, es64); //Assign back dwError value es.dwError = GetErrorValue64(es64); } else { UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), RichTextBoxConstants.EM_STREAMIN, flags, es); } UpdateMaxLength(); // If we failed to load because of protected // text then return protect event was fired so no // exception is required for the the error if (GetProtectedError()) return; if (es.dwError != 0) throw new InvalidOperationException(SR.GetString(SR.LoadTextError)); // set the modify tag on the control SendMessage(NativeMethods.EM_SETMODIFY, -1, 0); // EM_GETLINECOUNT will cause the RichTextBoxConstants to recalculate its line indexes SendMessage(NativeMethods.EM_GETLINECOUNT, 0, 0); } finally { // release any storage space held. editStream = null; } }