示例#1
0
        public override void FromProperties(PropertyBag propertyBag)
        {
            base.FromProperties(propertyBag);

            if (null != propertyBag && propertyBag.Count > 0)
            {
                if (propertyBag.TryGetProperty(MACRO_NAME, out PropertyString property))
                {
                    this.macroName = property.StringValue;
                }
            }
        }
        /// <summary>
        /// Scopes the date time property to the appropriate time zone, if necessary.
        /// </summary>
        /// <param name="service">The service emitting the request.</param>
        /// <param name="dateTime">The date time.</param>
        /// <param name="propertyBag">The property bag.</param>
        /// <param name="isUpdateOperation">Indicates whether the scoping is to be performed in the context of an update operation.</param>
        /// <returns>The converted DateTime.</returns>
        internal override DateTime ScopeToTimeZone(
            ExchangeServiceBase service,
            DateTime dateTime,
            PropertyBag propertyBag,
            bool isUpdateOperation)
        {
            if (!propertyBag.Owner.GetIsCustomDateTimeScopingRequired())
            {
                // Most item types do not require a custom scoping mechanism. For those item types,
                // use the default scoping mechanism.
                return base.ScopeToTimeZone(
                    service,
                    dateTime,
                    propertyBag,
                    isUpdateOperation);
            }
            else
            {
                // Appointment, however, requires a custom scoping mechanism which is based on an
                // associated time zone property.
                PropertyDefinition timeZoneProperty = this.GetTimeZoneProperty(service.RequestedServerVersion);
                object timeZonePropertyValue = null;

                bool timeZonePropertyIsSet = propertyBag.TryGetProperty(timeZoneProperty, out timeZonePropertyValue);

                if (timeZonePropertyValue != null && propertyBag.IsPropertyUpdated(timeZoneProperty))
                {
                    // If we have the associated time zone property handy and if it has been updated locally,
                    // then we scope the date time to that time zone.
                    try
                    {
                        DateTime convertedDateTime = EwsUtilities.ConvertTime(
                            dateTime,
                            (TimeZoneInfo)timeZonePropertyValue,
                            TimeZoneInfo.Utc);

                        // This is necessary to stamp the date/time with the Local kind.
                        return new DateTime(convertedDateTime.Ticks, DateTimeKind.Utc);
                    }
                    catch (TimeZoneConversionException e)
                    {
                        throw new PropertyException(
                            string.Format(Strings.InvalidDateTime, dateTime),
                            this.Name,
                            e);
                    }
                }
                else
                {
                    if (isUpdateOperation)
                    {
                        // In an update operation, what we do depends on what version of EWS
                        // we are targeting.
                        if (service.RequestedServerVersion == ExchangeVersion.Exchange2007_SP1)
                        {
                            // For Exchange 2007 SP1, we still need to scope to the service's time zone.
                            return base.ScopeToTimeZone(
                                service,
                                dateTime,
                                propertyBag,
                                isUpdateOperation);
                        }
                        else
                        {
                            // Otherwise, we let the server scope to the appropriate time zone.
                            return dateTime;
                        }
                    }
                    else
                    {
                        // In a Create operation, always scope to the service's time zone.
                        return base.ScopeToTimeZone(
                            service,
                            dateTime,
                            propertyBag,
                            isUpdateOperation);
                    }
                }
            }
        }