/// <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; } } }