示例#1
0
        public byte[] GetBytes(WriterCompatibilityMode writerCompatibilityMode)
        {
            switch (writerCompatibilityMode)
            {
            case WriterCompatibilityMode.Outlook2007RTM:
            case WriterCompatibilityMode.Outlook2007SP2:
                WriterVersion2 = Outlook2007VersionSignature;
                break;

            case WriterCompatibilityMode.Outlook2010RTM:
                WriterVersion2 = Outlook2010VersionSignature;
                break;

            default:
                WriterVersion2 = Outlook2003VersionSignature;
                break;
            }
            if (ModifiedInstanceDates.Count > DeletedInstanceDates.Count)
            {
                throw new InvalidRecurrencePatternException("Invalid exception data");
            }

            if (ExceptionList.Count != ModifiedInstanceDates.Count)
            {
                throw new InvalidRecurrencePatternException("Invalid exception data");
            }

            MemoryStream stream = new MemoryStream();

            LittleEndianWriter.WriteUInt16(stream, ReaderVersion);
            LittleEndianWriter.WriteUInt16(stream, WriterVersion);
            LittleEndianWriter.WriteUInt16(stream, (ushort)RecurFrequency);
            LittleEndianWriter.WriteUInt16(stream, (ushort)PatternType);
            LittleEndianWriter.WriteUInt16(stream, CalendarType);
            LittleEndianWriter.WriteUInt32(stream, FirstDateTime);
            LittleEndianWriter.WriteUInt32(stream, Period);
            LittleEndianWriter.WriteUInt32(stream, SlidingFlag);
            WritePatternTypeSpecific(stream);

            LittleEndianWriter.WriteUInt32(stream, (uint)EndType);
            LittleEndianWriter.WriteUInt32(stream, OccurrenceCount);
            LittleEndianWriter.WriteUInt32(stream, FirstDOW);
            LittleEndianWriter.WriteUInt32(stream, (uint)DeletedInstanceDates.Count);
            // [MS-OXOCAL] DeletedInstanceDates - The dates are ordered from earliest to latest
            foreach (DateTime date in ListUtils.GetSorted(DeletedInstanceDates))
            {
                DateTimeHelper.WriteDateTimeInMinutes(stream, date);
            }

            LittleEndianWriter.WriteUInt32(stream, (uint)ModifiedInstanceDates.Count);
            // [MS-OXOCAL] ModifiedInstanceDates - The dates are ordered from earliest to latest
            foreach (DateTime date in ListUtils.GetSorted(ModifiedInstanceDates))
            {
                DateTimeHelper.WriteDateTimeInMinutes(stream, date);
            }

            DateTimeHelper.WriteDateTimeInMinutes(stream, StartDate);
            DateTimeHelper.WriteDateTimeInMinutes(stream, EndDate);

            LittleEndianWriter.WriteUInt32(stream, ReaderVersion2);
            LittleEndianWriter.WriteUInt32(stream, WriterVersion2);

            LittleEndianWriter.WriteUInt32(stream, StartTimeOffset);
            LittleEndianWriter.WriteUInt32(stream, EndTimeOffset);

            LittleEndianWriter.WriteUInt16(stream, (ushort)ExceptionList.Count);
            foreach (ExceptionInfoStructure exception in ExceptionList)
            {
                exception.WriteBytes(stream);
            }

            uint reservedBlock1Size = 0;

            LittleEndianWriter.WriteUInt32(stream, reservedBlock1Size);

            foreach (ExceptionInfoStructure exception in ExceptionList)
            {
                exception.WriteExtendedException(stream, writerCompatibilityMode);
            }

            uint reservedBlock2Size = 0;

            LittleEndianWriter.WriteUInt32(stream, reservedBlock2Size);

            return(stream.ToArray());
        }