Release Notes

# This document lists the changes in the different releases

## 2.2.0.0

- Features
- - New product spec attributes and new feeds for the Content API for Shopping.
  - Added support for both OpenSearch 1.0 and 1.1 when parsing a feed.
- Bugfixes/changes
- - Fixed OAuth signature encoding issue with international characters.
  - Fixed NPE in YouTubeEntry accessor.
  - Fixing format for the docs:description element.

## 2.1.0.0

- Features
- - Many changes to the Content API for Shopping.
  - Added the docs:description element to the DocumentEntry object.
- Bugfixes/changes
- - Some fixes to the Datapoint and CustomGroup elements of the Content API for Shopping ProductEntry class.
  - Fixed NPE in WorksheetEntry.Cols and WorksheetEntry.Rows.
  - Using the correct endpoint for the UpdateWebclip method of the Email Settings API.
  - Fixed a response parsing issue with batch requests.

## 2.0.1.0

- Features
- - Minor release to address a bug in YouTubeService.

## 2.0.0.0

- Features
- - Added OAuth 2.0 support and an OAuth 2.0 sample application.
  - The Documents List client library now fully supports version 3.0 of the API.
  - Added basic show scanning support to the YouTube library.
  - Added support for Multi Client Accounts endpoint of Content API for Shopping.
  - Dropped support for the deprecated Google Health API, CodeSearch API, EmailList service and Windows Mobile.
- Bugfixes/changes
- - New version of the Google Apps GroupsService and some fixes to the user/nickname provisioning services.
  - Added support for label deletion in the Email Settings API client library.
  - Some fixes to the ResumableUploader component.
  - Some fixes and minor additions to the YouTube API.
  - Many bugfixes.

## 1.9.0.0

- Features
- - Added support for 3-legged OAuth.
  - Added BookThemAll and unshare_profiles sample applications.
  - Added support for 20+ new elements to the Content for Shopping API.
  - Added support for new yt:rating system and Access Control settings to the YouTube API.
- Bugfixes/changes
- - Removed support for the retired Google Base
  - Fixed updating document or file content with the resumable protocol
  - ResumableUploader now correctly setting AsyncOperationCompletedEventArgs.Entry when upload is complete
  - Updated Email Settings API to support new fields for vacation responder and to update webclip settings
  - Fixed 17 bugs from the issue tracker

## 1.8.0.0

- Features
- - Added support for the Google Apps Audit API.
  - Added support for the Google Content for Shopping API.
  - Added support for the Google Calendar Resource API.
  - Extended the Email Settings API service to implement the new functionalities to retrieve the existing settings, support new filter actions and manage email delegation.
- Bugfixes/changes
- - Turned on SSL for Contacts, Documents, Health, Picasa, Spreadsheets, Youtube, Codesearch APIs.
  - Added support for PPTX files in DocumentService and updated DoclistUploader sample.
  - Fixed concurrent upload in ResumableUploader.
  - Extended CreateUser method for Multidomain Provisioning API to support hashed passwords.
  - Added support for SVG and JPEG in DownloadType.
  - Added support for Drawing objects in DocumentType.

## 1.7.0.0

- Features
- - Added support for Organization Units to the Provisioning API.
  - Added support for Multiple Domains to the Provisioning API.
  - Added default retry count for failed requests.
- Bugfixes/changes
- - Fixed ResumableUpload implementation. Kudos to Andrew Fields. (issue 431)
  - Many small fixes to the project setup and build scripts.

## 1.6.0.0

- Features
- - Bugfixes and unittests for OAuth support. As far as we know, OAuth, in all variations works fine now
  - Added support for the new analytics api by Morten Christensen (http://blog.sitereactor.dk) (see details below). You can find this in the Google.GData.Analytics namespace.
  - Added AnalyticsService extends the basic Service abstraction to define a service that is preconfigured for access to the Google Analytics data API.
  - Added AccountQuery and DataQuery subclasses of FeedQuery, to create an Analytics Account and Data query URI.
  - Added AccountFeed and DataFeed (SourceFeed is also added) that lets you access the analytics accounts you own and data for those accounts.
  - Added AccountEntry and DataEntry for getting entries in an account or data feed.
  - Added extensions for all of the above, including: aggregates, dimension, metric, property, tableId and tableName. These are all located in the Analytics namespace (Google.GData.Analytics).
  - Unit tests for the analytics project added to the unittest project in the VS2005 solution (Created by Alex Maitland)
  - Simple sample application created and added to the sample library and VS2005 solution (Created by Morten Christensen)
  - Added support for OAuth requests using the new RequestSettings object. RequestSettings got one more constructor.
  - Added support for Contacts V3, including structured address/name informations
  - Documentlist: Added support for writersCanInvite
  - Documentlist: Added support for resourceId
  - Documentlist: Added a property to get the ACL URI directly on the Document object
  - ResumableUpload: Added support for a generic resumable upload component, and a complex YouTube sample for this
- Bugfixes/changes
- - For a complete list of bugfixes included in this release, click here
  - Atom Content handling was still weird/wrong/incomplete. I changed this again, hopefully for the last time:
    - everything that is text/html, or text, or text/* will be treated as text, and ReadString will be called.
    - everything that is xml media type will be treated by being processed into extension elements
    - everything that is not above, has to be base 64 encoded, and that encoded stuff will be read with ReadString again
    This is now completely per atom spec. So xhtml (which i do not believe any service uses) will be treated over subelements.

## 1.4.0.2

- Features
- - Added PlaylistID and PlaylistTitle support to the subscription entries in youtube feeds, added support for subscriptions to the Google.YouTube namespace
  - Added Google Contacts v2 support, including a new, vertical model like the YouTube programming model. You can find this in the Google.Contacts namespace.
  - Added Batch access to the new generics model. You can now create a FeedRequest object, and use it's Batch method to send a List of entry objects to the server. Entry and Feed expose access to the batch data.
  - Added Google Documents v2 support including the new download functionallity
  - Added a new Google Documents exporter sample. It allows you to populate a treeview with your Google Documents and then export each individual file in a variety of formats.
  - Extended the YouTube Notifier sample to use the User Events feed as well.
- Bugfixes/changes
- - Added the missing contacts DLL to the setup program.
  - Changed the new Feed model code to lazily load the feed on construction.
  - Removed the CreateInstance methods from the new feedmodel and changed the internals to lazyily create the inner objects on demand. That means, no more Video v = Vidoe.CreateInstance() in your code, but Video v = new Video() is now fine.
  - Removed an incorrect check for HTTP.StatusOK (200) as the result for an HTTP.Delete operation. Delete can return any 2xx code in theory.
  - Fixed issue 209, an feed.Entries.Add(entryOfAnotherFeed) did create a source element automatically. That was too smart for it's own good. There is an explict method Entries.MoveOrCopy(entry) that does that, add will just change the ownership to the new collection.
  - Changed Google.Client.Entry.ID to Google.Client.Entry.Id
  - fixed the feed.Entries iterator to restart from the beginning when you want to use it again. Note that you should cache the output of the iterator is you want to use that in a loop.
  - Fixed issue 217, a call to setUserCredentials now automatically invalidates a stored authtoken.
  - Fixed issue 200. A feedQuery now supports an etag property, and several new service method overloads for query and send support an etag as a parameter.
  - Service.Query(FeedQuery, ifModifiedSince) is now marked obsolete. You can use the ModifiedSince property on the FeedQuery object and Query(FeedQuery) instead.
  - Added the ability to store a client token to GDataCredentials. Setting the credentials property will take this into account.
  - Changed the base apps feed uri for Google Apps
  - Changed GBatchStatus and GBatchError to use the correct namespace, it was incorrectly using the prefix instead.
  - fixed issue 218, setting org.Title or org.name in a contact to null or an empty string did not remove the element.
  - fixed issue 203, you can now retrieve the ACL feed for a document
  - fixed issue 200, feedquery now has an etag property to create if-match queries.
  - Fixed issue 221, setting private to false in an YouTubeEntry resulted in failure to persist that entr.
  - Added a setter for Entry.Id
  - Added a batch method for Feed
  - YouTube.Video.VideoId now has a setter
  - YouTube.YouTubeRequest has an AddComment method.
  - Google.Client.FeedRequest has a new Get(Uri uri) method
  - Added AppControl and IsDraft accessors to Google.Client.Entry
  - Added a Get(uri) method to the Google.Client.FeedRequest
  - Fixed YouTubeEntry.State to actually parse and return the yt:state element
  - Added property accessors to YouTube.State
  - Added a State property accessor to Google.YouTube.YouTubeRequest
  - Added a GetVideoMetaData method to YouTubeRequest
  - Changed Get on the FeedRequest to Retrieve for single entries. This was required for the new overloads introduced. Also, as Retrieve directly accesses the service, compared to Get wich is defered, a name change is a good distinction.
  - Video.Rating, ViewCount and CommentCount returns -1 as default if no value was found.
  - Lot's of addtions to the Entry Model and it's subclasses. Check the documentation for details

## 1.3.1.0

- Features
- - Added a mergemodule for the Core libraries.
  - Added a mergemodule for the YouTube libraries.
  - Added a new sample application for YouTube, the YouTube Notifier
  - Added a YouTubeQuery.GetYouTubeCategories method that returns a collection of category objects based on parsing the youtube category file hosted on the web.
  - YouTube project template.
  - New, simpler, YouTube object model. Look at the items in the new Google.YouTube namespace. This new code is used in the YouTube Sample application, the template above, and the youtubetest.cs file in the unittests.
  - Added a ModifiedSince property on the FeedQuery object. If set to something different than DateTime.MinValue this results in an if-modified-since HTTP header produced if the FeedQuery is used in a Service.Query call.
  - OAuth support for two-legged authentication. Look in samples/OAuth for a usage example. Code for this graciously provided by Andrew Smith and Eran Sandler. Note that due to different support on the Compact Framework, this is not available in the Windows Mobile build.
- Bugfixes/changes
- - Fixed issue 198. HealthEntry.CCR returned null, as a wrong cast after the recent refactory that happened to the extensions returned always null.
  - Fixed issue 195. Service.Update could call itself, resulting in recursion.
  - Fixed bug 194. CreatePicasaUri was confusing because it used the albumname as a parameter compared to an albumid. Changed to now use an AlbumID.
  - Removed the ASP build and marked the standard release assemblies as Partially Trusted.
  - Fixed issue 191, Overloaded AuthSubUtil.getRequestUrl(hostedDomain, nextUrl, scope, secure, session) is broken
  - Fixed issue 189, Cannot select Contacts by group
  - Fixed an issue in AlbumEntry Accessor for Picasa, where ComentingEnabled accidently set the wrong element in the xml
  - Removed the Service(service, application, library) constructor as this variation did not use the passsed in information. If you used this, just remove the 3rd parameter.
  - Entry.Update and Entry.Delete will now thow an InvalidOperationException when they are called without a valid service object being set, instead of not doing anything silently.
  - Removed the usage of StringCollection and replaced it with a generic List
  - CommentingEnabled was accidently setting the CommentCount element.
  - Made the created useragent string more uniform and meaningful
  - AtomFeed.Entries are not an ILIst<> an no longer an arraylist.
  - Fixed several v2 related YouTube issues
  - Fixed issue 186 by removing the verification check at the end of the reminder parser

## 1.2.3.0

- Features
- - Added support for EMail Settings in Google Apps
  - Added support for the protocol version 2
  - - YouTube will work against version 2 of the protocol by default. Added support for the version 2 of the YouTube feed. Old methods are marked as obsolete and will be removed in future releases.
    - Bloogger will work against version 2 of the protocol by default.
  - Created a blogger service, feed, entry and query class. The query class allows the OrderBy parameter. This also fixes issue 151 on the public issue list. Added a PostUri method to the blogger entry.
  - Added the Error subelement collection to GDataBatchStatus. Removed the Value element as it was not used.
  - Issue 166: Added a GetTokenInfo helper method that returns a Dictionary with the Information returned about the authentication token.
  - Added a bool property Private to the YouTubeEntry identifying if a video is private
  - Added a script to create a linux friendly tarball
  - Issue 165: Added the ability to access the error collection from inside the batch error.

Bugfixes/changes

- Fixed issue 154: you can now access the publishing priority element on a GBaseEntry directly.
- Fixed issue 176: onProgress events were potentially not being raised in the Async Methods.
- Fixed issue 178: Groups feeds on the contacts service did not work when using https.
- Fixed issue 180: Passwords with some special characters were incorrectly encoded, leading to a failure in authentication.
- Removed the version dependency for the NUNIT tests, so that the tests can now be used with different installed versions of the NUNIT framework.
- Some typographical changes. getExtensionValue and setExtension are now named GetExtensionValue and SetExtensionValue
- Unknown extension elements are now stored in a Wrapper XmlExtension element, which implements the usual IExtensionElements interfaces to enable removing untyped lists internally.
- Moved the core of the extension functionallity, so just the base classes, into the Google.GData.Client, so that the base AtomFeed/AtomEntry can be extended using this extension system. Otherwise there would be a circular reference between client.dll and extension.dll

## 1.2.2.0

- Features
- - Added a SetRequestFactory method on the AppsService. This allows a user of the AppsService to set advanced HTTP properties for the underlying service objects used (like setting a proxy server, additional headers etc.) by creating a new RequestFactory object and passing it into the service. To make it easy to create this factory object a helper CreateRequestFactory was added to the AppsService object as well.
  - Asyncronous/background support including a sample application. You can now easily fire off that long running YouTube upload, or the download of a picture as a seperate thread, so that your main application is no longer blocked. It uses the AsyncOperation pattern, and is not available (due to missing base support in the compact framework) in the Windows Mobile build.
    The sample PhotoBrowser application was changed to use that pattern, and a page in the helpfile introduces the concept.
  - Added support for Issue 163: the calendar recently introduced several new elements, this adds support for syncEvent, uui and sequence
- Bugfixes
- - Fixed a bug in CommentingEnabled on the PhotoAccessor, which was setting internally the wrong property.
  - Changed the behaviour of AlbumEntry.AlbumAuthor. The setter will now create a new author is no author is present.
  - Fixed an issue regarding content, type=text. This element was not encoding correctly which could lead to server errors based on the contents of the element.
  - Fixed issue 164, the code will now throw an exception if we get an empty location header in a redirect situation
  - Fixed issue 161, changed the WebProxy property on the RequestFactory object to IWebProxy to make this interface more flexible.
  - Removed an obsolete size check for the authentication response for client login and login for webapplications.
  - Fixed issue 160, FirstName in the profile feed of YouTube was spelled wrong and hence not loaded correctly.
  - Fixed issue 157, Slug Header encoding. This was not correctly confirming to RFC5023. Introduced a new helper method in the utilities class for this purpose.
  - Fixed issue 147, a composite feed with a comment was not loading
  - Fixed issue 148, RemoveAt did not remove the object from the containing collection, only locally. Fixed by overriding the OnRemove method.
  - Fixed issue 155, there was no way to create a read only youtube service, or rephrased, one that did not require a developer key
  - Fixed issue 159, a typo in the makefile that prevented gac install/uninstall
  - Fixed issue 156, if an exception happened during upload, the resource was kept open
  - Fixed issue 149, the Who element failed to parse attendee status if a whitespace element was encountered
  - Fixed issue 144, recurrenceexception is not parsed correctly
  - Fixed issue 145, FeedLink element parser error
  - Fixed issue 146. Passwords containing percentage signs were not properly encoded.

## 1.2.1.0

- Features
- - Added media:rating to media:group
  - Added the most-popular constants to the defined youtube queries
  - Added missing convienience classes to YouTube (Comments, Complaints etc, check the YouTube documentation)
  - Added PDF support to the Google Documents API
  - Added a CategoryQueriesAsParameter property on the feedquery class, and making that false by default. On the YouTubeQuery this is true by default. The effect is that category queries will not be created by extending/changing the path portion of the URL, but instead using a new parameter "category" and putting the categories comma delimited into the query part of the uri.
- Bugfixes
- - Fixed issue 135. There was a bug in the FeedQuery parsing code that resulted in URIs with date parameters that are encoded to potentially throw
  - Removed the Cookie property and replaced it with a Cookies properter on the RequestFactory. The old code, using just a simple string, was implemented for mobile benefits, as the CookieContainer, that is used now, does not exist on the compact framework. The simple solution though is creating problems in some scenarios, and had to be removed.
  - Added over 100 more unittests for the YouTube service
  - Fixed issue 102, 142

## 1.2.0.0

- Features
- - Added support for the gd:rating element
  - Added direct properties for Url, Height, Width for the MediaThumbnail
  - Added support for mediarss:category as a childcollection of media:group
  - Created a real app:control extension. This one is currently only used in the YouTube namespace.
  - Added support for YouTube
  - Added support for Google Health
  - Added HealthTool in the samples directory as a supporting tool for Google Health
  - Added support for the timeout property of the http request. You do this by setting tbe timeout on the GDataRequestFactory to something else than -1, which indicates the default of the created HTTPRequest object.
  - Added support for the new Contacts feed.
    - ContactEntry now has a collection of ExtendedProperties
    - ContactEntry now has a collection of GroupMemberships
    - The ContactsQuery.CreateContactsUri returns a FULL projection now by default. There is a new CreateContactsUri(user,projection) to get the old behaviour, or get other projections
    - There is a new ContactsQuery.CreateGroupsUri helper
    - ContactsQuery now supports the group parameter
- Bugfixes/Changes
- - It a text element is of type XHTML we now use the XmlWriter.WriteRaw method. This leaves encoding/decoding in the hands of the user of the API, but it seems to be the only way to guarantee that all kind of xhtml can be created.
  - Changed the way AtomUris are loaded. In the past they were, for readability reasons, decoded on the load. This caused issue in certain situations, where the server expected the encoded version to be exactly the same later on. For that reason, AtomUris are now not decoded/encoded automatically, but this is left to the programmer.
  - Changed the Service.StreamInsert to a more appropriate name. It is now called Service.EntrySend and virtual
  - Added a MediaService subclass that is going to be used for all media/mime multipart enabled services (YouTube, Picasa)
  - Fixed a memory leak related to the embedded gzip stream
  - Fixed a parsing bug in the AtomLink class
  - Fixed the build script for building ASP dlls. A corruption in the solution file resulted in those not being rebuild anymore since 1.1.3.1
  - Fixed issue 120: cellQuery range and return-empty problem on empty cells. Created a set of new helpers on the feedQuery object that solve that issue.
  - Fixed another round of FxCop violations. Where this has an external effect, this is noted below.
    - Changed Apps.IpWhiteListed to Apps.IPWhiteListed
  - Service.SetAuthenticationToken will now work for ClientLogin and AuthSub
  - The PhotoBrowser sample application will no longer crash when photos can not be retrieved, or when you cancel the login screen.

## 1.1.4.1

- Features
- - Added PrimaryEmail, PrimaryPostalAddress, PrimaryPhonenumber and PrimaryIMAddress to the ContactEntry as convienience accessors
- Bugfixes
- - Added the Recurrence class as an extension element back to the EventEntry
  - Fixed the setup to put the contacts.cs file into the correct place, so that the SDK solution file would work
  - Removed the default app.ico files from the sample solutions
  - Corrected a reference in the apps migration sample project
  - The setup program did not put the Access Control Extension into the correct place, so some references might have been wrong
  - Fixed a bug in FeedQuery that would error if no uri was precalculated

## 1.1.4.0

- Features
- - Moved the codebase to .NET 2.0. Note this means that gradually more code will change to use generics and other .NET 2.0 only features.
  - Added project templates for VS 2005 that are installed by the setup program. If you use the .zip download, copy the templates into the VS 2005 template folder
  - The setup program now points VS 2005 to the lib/release path for the Google DLLs. The DLLs are no longer installed in the GAC
  - Implemented IComparable and equal operators for AtomId
  - Google Contacts support
  - Added a GDataVersionConflictException that is thrown when you tried to modified/update a resource and the server detected a version conflict.
  - Added support for the hd parameter for AuthSubRequests, so that a particular domain can be specified.
  - Added support for a UseSSL property on the FeedQuery class. If set, requests are made against the https version of the feed, if available. This is mostly relevant for hosted domains.
  - Added a UriEncodeUnsafe to the Utilities class to help with encoding of user emails during the URL construction
  - Added new VS 2005 solution files for all targets for the contacts library.
- Bugfixes/changes
- - Changed a lot of codeplaces due to a new FxCop run. Where this has a public, visible effect, it is noted below:
  - - removed the setter for CustomHeaders, Google.GData.Client.GDataRequestFactory.CustomHeaders
  - Updated to VS 2005 solution files. VS 2003 files are removed.
  - Changed documentation build to January Sandcastle release
  - Entry.SetAlternateUri was not setting the correct link releationship and mediatype.
  - small bugfixes to the base code (exceptions sometimes on missing attributes)
  - Fixed a number of bugs in the calendar extension classes that occured if you set new objects into the accessors
  - Fixed a crashing bug in the equal operator of the EnumConstruct class
  - Fixed issue 105: Cannot add a reminder in a Recurring event using C# Calendar library
  - The Reminders property is now a typed generic collection

  ## 1.1.3.0

  - Features
  - - Added conditional Get support. The service object has an overloaded Query method now, that allows you to pass a ifModifiedSince DateTime object into it.s
    - Added Authsub token revocation support. There is a new method revokeToken in AuthsubUtil, similiar to the java class library
  - Bugfixes/changes
  - Issue 93: ReFixed Title Exact Queries for Spreadsheets. Using Title-Exact resulted in two question marks in the query string.
  - Fixed the GeoRSS where extension, which lived in a mistyped namespace.
  - Fixed the Latitude property, which was misspelled Lattitude
  - Added the Doclist assemblies to the setup program
  - s
  - Added MediaGroup.Contents as a Collection: as there could be more than one. So all previous usages should be changed to access the first element in a collection. The old method will remain in there.

## 1.1.2.0

- Features
- - The SpreadsheetEntry has a new property, Worksheets. This property returns a WorksheetFeed object that can be used to retrieve the Worksheets feed for a given Spreadsheet.
  - The SpreadsheetEntry has a new property, WorksheetsLink. This property returns a string that can be used to retrieve the Worksheets feed uri for a given Spreadsheet.
  - Added CreateBatchFeed to the Atomfeed object. This will create a default batch feed for you, if the feed supports batching. The created batch feed will contain all currently dirty entries.
  - Added a GDataBatchRequestException for that operation.
  - Added Delete(Uri uir) to the service interface.
  - Added more constructors to the CellEntry object, and moved accessors for the CellEntry.Cell up to the CellEntry object. So instead of writing CellEntry.Cell.Column, you can call CellEntry.Column directly (and others).
  - Added an index accessor to the CellFeed, you can now access Cells on the CellFeed like this: CellEntry entry = CellFeed[1,1]. This will retrieve not existing cells if needed.
  - Added QueryCellFeed() and QueryCellFeedLink(ReturnEmptyCells parameter) to the WorksheetEntry. The method with no parameters will get you the serverdefault cell feed.
  - Added the CellFeedLink property on the WorksheetEntry. This returns the URI to the CellFeed as string.
  - Added an overloaded Insert method to the WorksheetFeed so that you do not need to cast the return anymore.
  - Added support for the Apps Migration API. The Google Apps Email Migration API allows administrators and users of Google Apps to migrate mail from legacy email systems into their domain's hosted Gmail accounts. Your client application can upload email messages into these accounts using standard Google data API feeds.
  - Added the gapps_migration_sample: A simple application that demonstrates†how to migrate email messages to a Google Apps email account. See the readme file in the samples/appsforyourdomain/migration directory for more details
- Bugfixes/changes
- - When an entry was copied from one feed to another, the internal service object was set incorrectly.
  - Added unittests for the new spreadsheet code.
  - Issue 90: Corrected the override for Equals and GetHashCode for an EnumConstruct
  - Issue 93: Fixed Title Exact Queries for Spreadsheets
  - Issue 94: Fixed some incorrect Exception handlings

## 1.1.1.0

- Features
- - Added an EventId property to the EventEntry object. This one parses the atomId URI to just provided the EventId, which is used elsewhere (e.g., for recurring events).
  - Added QueryAuthToken() on the service. If the Service is a Google authenticated service, you can use this to obtain an authentication token for ClientLogin
  - Added CreatePicasaUri helper on the PicasaQuery classes to create a Uri based on a userID
  - Added new PhotoBrowser sample project. The resulting file PhotoTool.exe is produced using the ILMerge tool from Microsoft (free download). That way, PhotoTool.exe is a standalone application with no further assembly dependencies.
- Bugfixes/Changes
- - Fixed the parsing of the OriginalEvent@id attribute. The SimpleContainer parent class was broken in the sense that it did not call the generic parsing method at all. So all SimpleContainers would not have read in attributes, luckily OriginalEvent was the only instance of this.
  - Fixed the OriginalStartTime get/set method which was using the wrong constant of the OriginalEvent object.
  - Fixed the onclear() handler of the new extensionCollection base class. It was incorrectly casting to When obects, which could cause a runtime error when called.
  - Fixed a bug in the simplecontainer class that could lead to an exception if the extension list was empty
  - Fixed a bug in Originalevent where the wrong prefix was persisted, making saving an originalevent impossible
  - Fixed NULL response object being used for authentication exceptions. Now the correct object used for the authentication request is passed to the exception.
  - Changed the AuthException code to provide the status code detail as well
  - CalendarEntry did use the wrong namespace to find the location object, hence retrieval of a calendar location was broken.
  - Fixed ExtensionBase to not save NULL attributes as empty strings. This could cause Picasa updates to fail.
  - Fixed MediaGroup to allow the retrieval of multiple Thumbnails. Introduced the ThumbnailCollection for this. To enable this, SimpleContainer and AtomBase now implement IExtensionContainer, a common interface that encapsulates owning Extension elements.
  - Added a default constructor to CalendarQuery so that you can use it on .NET CF with a starting URI
  - Changed the Reminder element to send an empty one to enable creation of default Reminders in the calendar

## 1.1.0.0

- Features
  - added GZip support for .NET 1.1, 2.0 and .NET Compact Framework 2.0.
  - added the ability to use authsubtokens to the ExecRequest utility (including exchange of a onetime token to a session token). Just run ExecRequest for the command line parameters, or read the help file page about it.
  - Support for Google Calendar WebContent Gadgets is included. A WebContent element has a SortedList property to set and retrieve those preferences. See caltest.cs for an example.
  - Picasa support:
    - Added all media extensions (media:rss, exif and photo>
    - Added a PhotoEntry and PhotoFeed class that contain all of those extensions
    - Added unittests to query an album and insert a new photo
  - Added the QuickAdd feature for the Google Calendar. An EventEntry has a QuickAdd boolean property. Setting it to true causes an insert to be treated like a quickAdd operation.
  - Added the webcontentlink class to the Google Calendar Support to enable easier creation of Gadgets in calendars.
  - Batch support for Google Calendar
  - ASP .NET support for medium trust
- Changes and Bugfixes
  - Complete refactoring of Apps extension to use the new extension system (IExtensionElementFactory, AbstractEntry and AbstractFeed).
  - To enable ASP.NET hosting in medium trust, we removed the usage of the NetworkCredentials class. From now on, credentials are either passed as username/password, or using the GDataCredentials. (issue 57)
  - Changed "adminUserName" to "adminEmailAddress" in AppsService so that it's more clear what information is actually required for this parameter.
  - fixed a Google Base issue (The server doesn't accept scientific notations for floats)
  - fixed typo in the blogger sample (www..blogger), which made the sample hard to use
  - make the GAuthToken property of the GAuthRequestFactory public. It was mistakenly marked internal, so that the token could not be retrieved by a client application for caching.
  - fixed a parsing issue that resulted in Batch Upload hanging if an unknown element was encountered
  - added a helper method on AtomBase (entry and feed) to find exensionelements by specifying a localname and an optional namespace (issue 81)
  - the extension mechanism was reworked by creating an ExtensionElementFactory interface that takes care of parsing elements. ElementFactories are registered on the AtomBase (entry and feed) level.
  - Fixed Issue 60, mulitple Reminders per Event. Note, that this introduces slight changes when dealing with this. A new property, EventEntry.Reminders, was created. The old property, EventEntry.Reminder, still exists, and only works on the first Reminder in the list. Setting the old property will delete all addtional reminders.The Reminders property is of type ArrayList (this is an artifact of being .NET 1.1 compatible, once we move to .NET 2.0 or later, if that ever happens, this could/should be typed).
  - Modified data model for Spreadsheets worksheets to make it easier to change and construct associated meta-data
  - Added the ctz parameter to the EventQuery class. This parameter allows to specify the timezone that is used to calculate start/end times for the returned events
  - Added an AlternateUri Property on the AtomEntry class. This property returns the AtomUri of a rel=alternate type=html LINK entry. As this is similiar to the ill named LINK helper on the spreadsheet entry, that helper was removed, as they do serve the same purpose, and the link helper was read only.
  - Added an FeedUri Property on the AtomEntry class. This property returns the AtomUri of a rel=#feed type=atom+xml LINK entry.
  - Added an MediaUri Property on the AtomEntry class. This property returns the AtomUri of a rel=#edit-media type=atom+xml LINK entry.
  - Added new methods on the AtomCategory collection. Find searches for a category of a given term, or a term/scheme combination. Also changed the implementation of the Contains method to compare not just object fidelity, but also term/value pairs
  - Added a ConvertToXSDSTring() helper in the Utilites class. As booleans are represented as "True"/"False" in .NET, and xsd requires "true"/"false" this helper takes care of that conversion.
  - Added the ability to create custom AtomBase subclassed objects to custom feeds/entries. Look at CreateAtomSubElement() in AtomBase. This is used to create custom clases like WebContentLink in the derived services

## 1.0.9.9

- added GBase support for m:adjusted_name and gm:adjusted_value inside attributes (returned only when adjustments are enabled)
- Google Apps changes:
  - Added new AppsService.createUser methods with hashed password support
  - Updated AppsException with new Google Apps error codes
  - Added the following properties to Login.cs: string hashFunctionName
  - to hash user account password, bool agreedToTerms
  - to see if the user has accepted the Google Apps Terms Of Service, bool admin
  - to see if the user is a domain admin, bool changePasswordAtNextLogin
  - to force the user to change password at next login
  - Updated unittests to test new properties

## 1.0.9.8

- fixed a parsing bug in SpreadsheetService
- fixed a bug in GDataRequestException that would prevent AppsException from accessing the server's response.
- modified AppsException to comply with new GDataRequestException
- fixed a bug in CalculateBaseUri, that caused a crash if the passed in parameters are all NULL. This caused composite feeds to not load if there was a comment feed embedded
- fixed a bug in the CalendarEventEntry, it was not parsing extendedProperties. They are now parsed and added correctly to the ExtensionElements
- added ACL support. This resulted in changes in the CalendarService.Query method
- as a CalendarService can now return an EventFeed or an AccessControlFeed is returns now an AtomFeed that you can cast to what you are expecting. Added Query overloads to accept EventQuery or AclQuery and return the appropriate Feeds
- added a cmd line tool to query/insert/update to a service based on streams
- modified the Spreadsheet service to use the new scheme of service subclassing. This should fix a bundle of issues with regard to entry castings.
- changed persistence of gd:extendedProperty to save the value attribute, even if there is no data to persist
- Added an ASP.NET release (lib/ASP.NET) where the DLLs are build with the AllowPartiallyTrustedCallers attribute n enabled. Please use with caution and refer to the readme.txt in that subdirectory for more information.

## 1.0.9.7

- fixed an incorrect trace statement in request.cs that had the result of disabling reading the error response.

## 1.0.9.6

- added Google Apps for Your Domain support, a new helper DLL Google.GData.Apps.dll, and a sample, as well as unittests. Version number is increased to distinguish from Subversion, as this will be a binary download as well.

## 1.0.9.5

- fix for incorrect encoding of usernames/passwords during authentication (you could run into problems if you had an email like "foo&joe@test.com"
- exposure of the accountType as a property on the factory. If you happen to have an identical user name for a Google account and a hosted account, you need to set this property depending on which account you want to access. Default is GOOGLE_OR_HOSTED, other values are GOOGLE or HOSTED as strings.
- fixed an issue with the edit/self uris on the entry. They were not correctly setable.
- fixed an issue that one you used an authenticated service, but did not supply credentials, we would send an empty authentication header.
- added Captcha Handling and more detailed exceptions when the authentication request fails. See authexceptions.cs for the list of potential exceptions thrown
- added some preliminary unittests for the new exceptions
- added a new constructor for the TokenCollection, so that captcha parsing is handled correctly
- made the debug output depending on the TRACE define, and removed that define for the release build

## 1.0.9.4

- Google Base: fix for incorrect Price attribute behaviour
- Google Base: fix for incorrectly persisting duplicate attributes
- Fix for Content.Type having no default value (issue 41)
- Fix for Content.Type="text/html" parsing incorrectly. The strict check for type= "text" is now relaxed to be type="text*", so all text subtypes will be treated the same
- Fix for Content.Type = "html" and "text/html" persistence. What the code does now is: first HTMLDecode the value held, than run the standard XMLWriter.WriteString over it (which does HTML encoding). This seems to work fine.
- Added the gm:stats tags to the Windows Mobile build, accidently forgot to change that project file
- the calendarfeed discarded entries unknown to it in the calendar namespace. This is fixed now. Unknown entries to the parser are now correctly added to the extension elements.
- added the return-empty parameter to the cellquery class
- added URL encoding to the authentication parameters (username/passwords etc that had unallowed FORM post chars caused failed login attempts)

## 1.0.9.3

- Google Base changes: New features:
  - GBaseQuery supports the following optional parameters; orderby, sortorder, refine and content
  - Support for gm:stats tags
  - GBaseUriFactory can now generate the feed uri of other customers Fixes:
  - Fixed the GBaseAttributeType hierarchy for date/dateTime/dateTimeRange
  - Fixed the type of the hardcoded ExpirationDate property in GBaseAttributes
- Added a Makefile for Mono builds. This one replaces the Ant file.

## 1.0.9.2

- Removed the MethodOverride default for the CalendarService. If you need that (due to firewalls not allowing PUT/DELETE requests, you can reenable this with setting the MethodOverride flag on the factory: ((GDataGAuthRequestFactory)calsvc.RequestFactory).MethodOverride = false;
- Changed the X-Method-Override behaviour for DELETE, to fix an issue with .NET mobile (the mobile client would crash when the contentLength was set to 0 and no stream was requested).

## 1.0.9.1

- Added a KeepAlive property to the factory object. This is set to true by default. .NET 2.0 clients, are due to behaviour changes in that runtime encouraged to set this to false.

## 1.0.9

- Fixed an issue where the login services changed the response contenttype. The check for text/plain is now more relaxed.
- Added the missing location calls for Geolocation for GoogleBase
- Fixed a build issue for Windows Mobile in release. The code now compiles for PocketPC and WindowsMobile symbols defined.

## 1.0.8

- Fixed issue 13 from the public issue list. If a content element contained xhtml, and not just text, the content was not read correctly.
- Fixed issue 17 from the public issue list. XHTML content was not persisted correctly.
- Added support for hosted domain feeds. This is done automatically, no codechanges needed for the application developer. The authentication code was changed to ask for Hosted domains first, then google accounts.
- Added support for the app:control/app:draft element, but only in the way to expose a boolean on the AtomEntry. The new member on AtomEntry is called IsDraft.
- Changed the way atom:content is parsed. Text & HTML types use xmlreader.ReadString() to get the inner content. XHTML and all other types use readInnerXml() to get the content.
- changed Exception handling. The code now throws more detailed exceptions based on what was happening: -> GDataRequestException: generic exception -> GDataForbiddenException: exception thrown when the server return a Forbidden on authentication -> GDataRedirectException: exception thrown when the server returned a redirect
- changed redirect handling on Post. The library will follow redirects on Post automatically by default, to accomodate Blogger (which currently may return 302s on posts). This can be turned off by setting the .StrictRedirect property to true on the GDataAuthRequestFactory. If it is turned off, the code will throw if a redirect is happening on an HTTP verb other than GET.
- changed redirect handling for DELETE/PUT the same as for POST
- removed cookie handling. The code will handle cookies now without using the CookieContainer (one hurdle on the way to the CompactFramework Port).
- Fixed persistence of "initialized" date values for udpated/published on the atom.entry. This resolves an issue with the Blogger.
- Added EventEntry.Notifications. This property (boolean) indicates if an update on an entry should send notifications to the attendees of the Event.
- Fixed the gbase project (the NumberFormat.cs file was missing in the project file).
- Added a proxy property for the GDataRequestFactory.
- Setting content-length correctly to fix WindowsMobile issues. This fix is a user submitted, and created by Steeve Morin
- Fixes to the authsub code, provided by Ryan Boyd
- The DLLs were renamed, to follow the Windows .NET standard. gdata.dll -> Google.GData.Client.dll gbase.dll -> Google.GData.GoogleBase.dll gcalendar.dll -> Google.GData.Calendar.dll gcodesearch.dll -> Google.GData.CodeSearch.dll gextensions.dll -> Google.GData.Extensions.dll and the new one -> Google.GData.Spreadsheets.dll

## 1.0.7

- Added support for published-min/published-max as standard query parameters
- Added support for codesearch. A new DLL gcodesearch.dll and a new sample for this is available.
- Added support for the WebContent calendar extension
- Added signing to the gbase.dll

## 1.0.6

- Added support for sortoder, futurevents, singleevents on the calendarquery
- Added a ResponseString property on the GDataRequestException to make debugging server side errors easier
- Fixed an issue with the GoogleBaseService, if you did set the RequestFactory property twice, you would create too many header entries, and hence end up with request denied responses
- Added the shipping attribute for GoogleBase
- Changed the payment attribute to payment_accepted for GoogleBase

## 1.0.5

- Added batch support for GoogleFeeds, the first property to support this is the GoogleBase product
- Added a unittest for GoogleBase. This code shows update/insert/delete against base for single entries and batch entries refer to clients/cs/src/unittests/gbase.cs for sample code.
- Added IComparable to atomuri.cs (based on a feature request on our issue list)
- GDataAuthRequestFactory is now a subclass of GDataRequestFactory
- Moved GCookies from GDataAuthRequestFactory to GDataRequestFactory and renamed it to Cookies
- removed the debug binaries from the lib directory
- added a GoogleBase sample application in VB !
- added the build executables to the lib directory
- added GoogleBase classes (similiar to the java classes) to access Google base specific feeds Known issues:
- recurrenceException is not fully tested
- authsubutil and gauthsubrequest are not fully tested

## 1.0.4

- Fixed a .NET 2.0 issue in calendarservice.cs, that dropped connections during repeated calls.
- Made the execution path more robust.
- Added a property, numberOfRetries on the GAuthRequestFactory to indicate how often an Execution should be retried if the server returns an error.
- Fixed a bug in the daterange query creation (the +sign for the timezone was not escaped properly)
- Fixed an issue with updating, where if you used the same AtomEntry/EventEntry several times to update, it could happen that extension elements were doubled, and the update failed.
- Fixed a bug in the parsing of all elements. This could cause an endless loop when the content was empty.
- Fixed several content creation issues (issues 5-9 on the issue list)
- added support for the gd:extendedProperty
- Added a calendar example application
- added a sample application to access Blogger feeds, and post to blogger feeds. Known issues:
- recurrenceException is not fully tested
- authsubutil and gauthsubrequest are not fully tested Solved issues:
- .NET 2.0 seems to loose resources in some circumstances. Hard to reproduce.

## 1.0.3

- Fixed the namespace creation for extensions, the wireformat should no longer create the namespace declaration when it's not required
- Fixed the reminder persistence code
- added a TimeZone property on the EventFeed to retrieve the timezone value
- added a FindEvent method on the EventFeed. This one takes an OriginalEvent object, and returns the Event that this is based on. This will go to the server if required.
- Fixed recurrance issues in the extensions
- Moved EventFeed and EventEntry from the Google.GData.Extensions namespace to the Google.GData.Calendar namespace
- Fixed a bug in the parsing of Atom:Content elements. This could cause an endless loop when the content was empty.

## 1.0.2

- Fixed a problem persisting feedlink elements
- added an AllDay flag to the When class to allow parsing and persting of all day events
- cleaned up the persistence code in the extension classes
- fixed a problem that resulted in persisting multiple extensionn objects instead of one
- added a timestamp method to the Tracing class to help measuring performance in simple cases

## 1.0.1

- Correctly uses 'rel.previous' instead of 'rel.prev' as required by Atom Publishing Protocol.
- Corrected the time-shift portion of the DateTime output for time zones with a negative shift from UTC.
- Corrected the time-shift to permit fractional hour shifts from UTC.
- Correctly output "startTime" and "endTime" as attributes of the "when" extension rather than child elements.
- Refactored class hierarchy, now based on IExtensionElement.

## 1.0.0

- Initial Release