Example #1
0
        /// <summary>
        /// Query Google Calendar for a user and return the event feed
        /// </summary>
        /// <param name="email">Email address of the user to query</param>
        /// <param name="visibility">Feed Visibility (Public/Private) to query for</param>
        /// <param name="projection">Feed projection - type of feed to get</param>
        /// <param name="modifiedSince">Last modified time from last check</param>
        /// <param name="window">DateTime range to query between</param>
        /// <returns>An event feed for the user</returns>
        public EventFeed QueryGCal(
            string email,
            GCalVisibility visibility,
            GCalProjection projection,
            DateTime modifiedSince,
            DateTimeRange window)
        {
            // Perform mapping on the username if necessary
            string user = ConfigCache.MapToExternalDomain(email);

            if (log.IsDebugEnabled)
            {
                log.InfoFormat(
                    "FeedQuery with parameters: {0}, {1}, {2}, {3} [{4}]",
                    user,
                    visibility,
                    projection,
                    modifiedSince,
                    window);
            }

            StringBuilder sb = new StringBuilder(ConfigCache.GCalAddress);

            if (!ConfigCache.GCalAddress.EndsWith("/"))
            {
                sb.Append("/");
            }

            sb.AppendFormat("feeds/{0}/", user);

            switch (visibility)
            {
            case GCalVisibility.Public:
                sb.Append("public/");
                break;

            case GCalVisibility.Private:
            default:
                sb.Append("private/");
                break;
            }

            switch (projection)
            {
            case GCalProjection.Full:
                sb.Append("full");
                break;

            case GCalProjection.FullNoAttendees:
                sb.Append("full-noattendees");
                break;

            case GCalProjection.Composite:
                sb.Append("composite");
                break;

            case GCalProjection.AttendeesOnly:
                sb.Append("attendees-only");
                break;

            case GCalProjection.FreeBusy:
                sb.Append("free-busy");
                break;

            case GCalProjection.Basic:
            default:
                sb.Append("basic");
                break;
            }

            EventQuery query = new EventQuery(sb.ToString());

            if (projection != GCalProjection.FreeBusy)
            {
                query.SingleEvents = true;
            }

            GDataRequestFactory f = (GDataRequestFactory)service.RequestFactory;

            f.UseGZip = ConfigCache.EnableHttpCompression;

            if (window.Start != DateTime.MinValue)
            {
                query.StartTime = window.Start;
            }

            if (window.End != DateTime.MaxValue)
            {
                query.EndTime = window.End;
            }

            query.NumberToRetrieve = int.MaxValue; // Make sure we get everything

            try
            {
                return(QueryGCal(query, user, modifiedSince));
            }
            catch (System.IO.IOException e)
            {
                // Known problem with .NET 2.0 - Sometimes keep-alive connection is
                // closed by a proxy and we need to re-attemp the connection
                //
                // http://code.google.com/p/google-gdata/wiki/KeepAliveAndUnderlyingConnectionIsClosed

                if (e.InnerException.GetType().ToString().Equals("System.Net.Sockets.SocketException"))
                {
                    log.Info(String.Format("Attempt Retry Query after keep-alive termination"));
                    // One shot retry i case the keep-alive was closed
                    return(QueryGCal(query, user, modifiedSince));
                }
                else
                {
                    throw;
                }
            }
        }
        /// <summary>
        /// Query Google Calendar for a user and return the event feed
        /// </summary>
        /// <param name="email">Email address of the user to query</param>
        /// <param name="visibility">Feed Visibility (Public/Private) to query for</param>
        /// <param name="projection">Feed projection - type of feed to get</param>
        /// <param name="modifiedSince">Last modified time from last check</param>
        /// <param name="window">DateTime range to query between</param>
        /// <returns>An event feed for the user</returns>
        public EventFeed QueryGCal(
            string email,
            GCalVisibility visibility,
            GCalProjection projection,
            DateTime modifiedSince,
            DateTimeRange window)
        {
            // Perform mapping on the username if necessary
            string user = ConfigCache.MapToExternalDomain(email);

            if (log.IsDebugEnabled)
            {
                log.InfoFormat(
                    "FeedQuery with parameters: {0}, {1}, {2}, {3} [{4}]",
                    user,
                    visibility,
                    projection,
                    modifiedSince,
                    window);
            }

            StringBuilder sb = new StringBuilder(ConfigCache.GCalAddress);
            if (!ConfigCache.GCalAddress.EndsWith("/"))
            {
                sb.Append("/");
            }

            sb.AppendFormat("feeds/{0}/", user);

            switch (visibility)
            {
                case GCalVisibility.Public:
                    sb.Append("public/");
                    break;

                case GCalVisibility.Private:
                default:
                    sb.Append("private/");
                    break;
            }

            switch (projection)
            {
                case GCalProjection.Full:
                    sb.Append("full");
                    break;

                case GCalProjection.FullNoAttendees:
                    sb.Append("full-noattendees");
                    break;

                case GCalProjection.Composite:
                    sb.Append("composite");
                    break;

                case GCalProjection.AttendeesOnly:
                    sb.Append("attendees-only");
                    break;

                case GCalProjection.FreeBusy:
                    sb.Append("free-busy");
                    break;

                case GCalProjection.Basic:
                default:
                    sb.Append("basic");
                    break;
            }

            EventQuery query = new EventQuery(sb.ToString());
            if (projection != GCalProjection.FreeBusy)
            {
                query.SingleEvents = true;
            }

            GDataRequestFactory f = (GDataRequestFactory)service.RequestFactory;
            f.UseGZip = ConfigCache.EnableHttpCompression;

            if (window.Start != DateTime.MinValue)
            {
                query.StartTime = window.Start;
            }

            if (window.End != DateTime.MaxValue)
            {
                query.EndTime = window.End;
            }

            query.NumberToRetrieve = int.MaxValue; // Make sure we get everything

            try
            {
                return QueryGCal(query, user, modifiedSince);
            }
            catch (System.IO.IOException e)
            {
                // Known problem with .NET 2.0 - Sometimes keep-alive connection is
                // closed by a proxy and we need to re-attemp the connection
                //
                // http://code.google.com/p/google-gdata/wiki/KeepAliveAndUnderlyingConnectionIsClosed

                if (e.InnerException.GetType().ToString().Equals("System.Net.Sockets.SocketException"))
                {
                    log.Info(String.Format("Attempt Retry Query after keep-alive termination"));
                    // One shot retry i case the keep-alive was closed
                    return QueryGCal(query, user, modifiedSince);
                }
                else
                {
                    throw;
                }
            }

        }