public static MultiValuedProperty <Page> BlobToPageCollection(byte[] blob, MAPIPropertiesDictionary propertiesDictionary) { MultiValuedProperty <Page> multiValuedProperty = new MultiValuedProperty <Page>(); try { uint intFrom4bytes = DetailsTemplateAdapter.GetIntFrom4bytes(blob, 4); int num = 8; int num2 = 0; while ((long)num2 < (long)((ulong)intFrom4bytes)) { uint[] array = new uint[9]; for (int i = 0; i < 9; i++) { array[i] = DetailsTemplateAdapter.GetIntFrom4bytes(blob, num); num += 4; } DetailsTemplateAdapter.AddControl(array, blob, multiValuedProperty, propertiesDictionary); num2++; } } catch (ArgumentException ex) { throw new DataValidationException(new PropertyValidationError(DirectoryStrings.CannotCalculateProperty("Pages", ex.Message), DetailsTemplateSchema.Pages, blob), ex); } catch (InvalidOperationException ex2) { throw new DataValidationException(new PropertyValidationError(DirectoryStrings.CannotCalculateProperty("Pages", ex2.Message), DetailsTemplateSchema.Pages, blob), ex2); } catch (ParsingException ex3) { throw new DataValidationException(new PropertyValidationError(DirectoryStrings.CannotCalculateProperty("Pages", ex3.Message), DetailsTemplateSchema.Pages, blob), ex3); } return(multiValuedProperty); }
public static byte[] PageCollectionToBlob(MultiValuedProperty <Page> pageCollection, MAPIPropertiesDictionary propertiesDictionary) { byte[] result; try { int num = 8; int num2 = 0; if (pageCollection == null || pageCollection.Count == 0) { throw new InvalidOperationException(DirectoryStrings.DetailsTemplateCorrupted); } foreach (Page page in pageCollection) { num2++; num2 += page.Controls.Count; if (page.Text != null) { num += page.Text.Length * 2; } foreach (DetailsTemplateControl detailsTemplateControl in page.Controls) { num += detailsTemplateControl.m_Text.Length * 2; } } num += num2 * 38; byte[] array = new byte[num]; DetailsTemplateAdapter.SetBytesToByteArray(array, 0, DetailsTemplateAdapter.Get4byteFromInt(1U)); DetailsTemplateAdapter.SetBytesToByteArray(array, 4, DetailsTemplateAdapter.Get4byteFromInt((uint)num2)); int num3 = 8; int value = num2 * 9 * 4 + 8; foreach (Page page2 in pageCollection) { DetailsTemplateAdapter.SetBytesToByteArray(array, num3 + 16, DetailsTemplateAdapter.Get4byteFromInt(8U)); DetailsTemplateAdapter.SetBytesToByteArray(array, num3 + 20, DetailsTemplateAdapter.Get4byteFromInt((uint)page2.HelpContext)); DetailsTemplateAdapter.SetBytesToByteArray(array, num3 + 32, DetailsTemplateAdapter.Get4byteFromInt((uint)value)); DetailsTemplateAdapter.SetCaptionToByteArray(array, ref value, page2.Text); num3 += 36; foreach (DetailsTemplateControl control in page2.Controls) { DetailsTemplateAdapter.SetControlToByteArray(array, ref num3, ref value, control, propertiesDictionary); } } result = array; } catch (ArgumentException ex) { throw new DataValidationException(new PropertyValidationError(DirectoryStrings.CannotCalculateProperty("Pages", ex.Message), DetailsTemplateSchema.Pages, pageCollection), ex); } catch (InvalidOperationException ex2) { throw new DataValidationException(new PropertyValidationError(DirectoryStrings.CannotCalculateProperty("Pages", ex2.Message), DetailsTemplateSchema.Pages, pageCollection), ex2); } catch (ParsingException ex3) { throw new DataValidationException(new PropertyValidationError(DirectoryStrings.CannotCalculateProperty("Pages", ex3.Message), DetailsTemplateSchema.Pages, pageCollection), ex3); } return(result); }
private static void SetCaptionToByteArray(byte[] target, ref int captionOffset, string caption) { byte[] array = new byte[2 * caption.Length + 2]; DetailsTemplateAdapter.SetBytesToByteArray(array, 0, Encoding.Unicode.GetBytes(caption)); for (int i = 0; i < 2; i++) { array[array.Length - 1 - i] = 0; } DetailsTemplateAdapter.SetBytesToByteArray(target, captionOffset, array); captionOffset += array.Length; }
internal void BlobToPages() { MultiValuedProperty <Page> multiValuedProperty = this.Pages; if (multiValuedProperty.IsReadOnly) { multiValuedProperty = new MultiValuedProperty <Page>(); } multiValuedProperty = DetailsTemplateAdapter.BlobToPageCollection((byte[])this.propertyBag[DetailsTemplateSchema.TemplateBlob], this.MAPIPropertiesDictionary); multiValuedProperty.ResetChangeTracking(); this.propertyBag.SetField(DetailsTemplateSchema.Pages, multiValuedProperty); this.ValidatePages(); }
private static void SetControlToByteArray(byte[] target, ref int controlOffset, ref int captionOffset, DetailsTemplateControl control, MAPIPropertiesDictionary propertiesDictionary) { uint[] array = new uint[] { (uint)control.X, (uint)control.Width, (uint)control.Y, (uint)control.Height, (uint)control.GetControlType(), (uint)control.GetControlFlags(), DetailsTemplateAdapter.GetMAPIPropTag(control, propertiesDictionary), (uint)control.m_MaxLength }; for (int i = 0; i < array.Length; i++) { DetailsTemplateAdapter.SetBytesToByteArray(target, controlOffset, DetailsTemplateAdapter.Get4byteFromInt(array[i])); controlOffset += 4; } DetailsTemplateAdapter.SetBytesToByteArray(target, controlOffset, DetailsTemplateAdapter.Get4byteFromInt((uint)captionOffset)); DetailsTemplateAdapter.SetCaptionToByteArray(target, ref captionOffset, control.m_Text); controlOffset += 4; }
private static void AddControl(uint[] data, byte[] blob, MultiValuedProperty <Page> pages, MAPIPropertiesDictionary propertiesDictionary) { int x = (int)data[0]; int y = (int)data[2]; int width = (int)data[1]; int height = (int)data[3]; int num = (int)data[8]; int maxLength = (int)data[7]; uint num2 = data[6]; DetailsTemplateControl.ControlFlags controlFlags = (DetailsTemplateControl.ControlFlags)data[5]; string attributeName = propertiesDictionary[(int)(num2 >> 16 & 65535U)] ?? string.Empty; string @string = Encoding.Unicode.GetString(blob, num, DetailsTemplateAdapter.GetNullTerminatedStringLength(blob, num)); DetailsTemplateControl detailsTemplateControl = null; switch (data[4]) { case 0U: detailsTemplateControl = new LabelControl(); break; case 1U: detailsTemplateControl = new EditControl(controlFlags); break; case 2U: detailsTemplateControl = new ListboxControl(controlFlags); break; case 5U: detailsTemplateControl = new CheckboxControl(); break; case 6U: detailsTemplateControl = new GroupboxControl(); break; case 7U: detailsTemplateControl = new ButtonControl(); break; case 8U: pages.Add(new Page { Text = @string, HelpContext = (int)controlFlags }); break; case 11U: detailsTemplateControl = new MultiValuedListboxControl(); break; case 12U: detailsTemplateControl = new MultiValuedDropdownControl(); break; } if (detailsTemplateControl != null) { if (pages.Count == 0) { throw new ParsingException(DirectoryStrings.NoPagesSpecified); } detailsTemplateControl.X = x; detailsTemplateControl.Y = y; detailsTemplateControl.Width = width; detailsTemplateControl.Height = height; detailsTemplateControl.m_MaxLength = maxLength; detailsTemplateControl.m_AttributeName = attributeName; detailsTemplateControl.m_Text = @string; detailsTemplateControl.OriginalFlags = controlFlags; pages[pages.Count - 1].Controls.Add(detailsTemplateControl); } }
internal void PagesToBlob() { this[DetailsTemplateSchema.TemplateBlob] = DetailsTemplateAdapter.PageCollectionToBlob(this.Pages, this.MAPIPropertiesDictionary); this.Pages.ResetChangeTracking(); this.ValidatePages(); }