private void OnLiveClientGetCompleted(object sender, LiveOperationCompletedEventArgs e)
		{
			// Cancels the timeout timer.
			CancelTimeoutTimer();
			
			// No result? Nothing to do.
			if (e.Result == null)
			{
				EndSyncDownloads(); 
				return;
			}

			if ("root".Equals(e.UserState))
			{
				// Sync Step 2: We are getting results for the root folder.
				// We need to enumerate through all file entries and find the first
				// folder whose name is "Geowigo".
				// Then, we will ask for file enumerations of this folder.
				// If no folder is found, the sync is over.

				// Enumerates through all the file entries.
				List<object> data = (List<object>)e.Result["data"];
				foreach (IDictionary<string, object> content in data)
				{
					// Is it a folder?
					if ("folder".Equals(content["type"]))
					{
						// Is its name "Geowigo"?
						if ("Geowigo".Equals((string)content["name"], StringComparison.InvariantCultureIgnoreCase))
						{
							// Sync Step 3. Asks for the list of files in this folder.

							// Stores the folder id.
							_geowigoFolderId = (string)content["id"];

							// Asks for the list of files.
							_liveClient.GetAsync((string)content["id"] + "/files", "geowigo");

							// Starts the timeout timer.
							StartTimeoutTimer(GetRequestTimeoutTimeSpan);

							// Nothing more to do.
							return;
						}
					}
				}
				
				// If we are here, it means that the Geowigo folder was not found.
				// The sync ends.
				EndSyncDownloads();
				return;
			}
			else if ("geowigo".Equals(e.UserState))
			{
				// Sync Step 4: We are getting results for the Geowigo folder.
				// We need to enumerate through all files and download each GWC
				// or GWS file in the background.

				List<object> data = (List<object>)e.Result["data"];

				// Enumerates through all the file entries.
				List<SkyDriveFile> cartFiles = new List<SkyDriveFile>();
				List<SkyDriveFile> extraFiles = new List<SkyDriveFile>();
				foreach (IDictionary<string, object> content in data)
				{
					// Is it a cartridge file?
					string name = (string)content["name"];
					string lname = name.ToLower();
					object type = content["type"];
					if ("file".Equals(type))
					{
						if (lname.EndsWith(".gwc"))
						{
							// Adds the file to the list of cartridges.
							cartFiles.Add(new SkyDriveFile((string)content["id"], name, IsoStoreCartridgesPath));
						}
						else if (lname.EndsWith(".gws"))
						{
							// Adds the file to the list of extra files.
							extraFiles.Add(new SkyDriveFile((string)content["id"], name, IsoStoreCartridgeContentPath));
						}
					}
					else if ("folder".Equals(type) && UploadFolderName.Equals(name, StringComparison.InvariantCultureIgnoreCase))
					{
						// We found the uploads folder.
						// Stores its id.
						_uploadsFolderId = (string)content["id"];
					}
				}

				// Creates the list of cartridges in the isostore that do not exist 
				// on SkyDrive anymore.
				// These will be removed. Extra files are not removed even if they are not
				// on SkyDrive anymore.
				List<string> isoStoreFiles;
				List<string> toRemoveFiles;
				List<string> isoStoreExtraFiles;
				using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
				{
					isoStoreExtraFiles = isf.GetAllFiles(IsoStoreCartridgeContentPath + "/*.gws");
					
					isoStoreFiles =
						isf
						.GetFileNames(GetIsoStorePath("*.gwc", IsoStoreCartridgesPath))
						.Select(s => IsoStoreCartridgesPath + "/" + s)
						.ToList();

					toRemoveFiles =
						isoStoreFiles
						.Where(s => !cartFiles.Any(sd => sd.Name == System.IO.Path.GetFileName(s)))
						.ToList();
				}

				// Clears from the list of extra files to download those which
				// are already somewhere in the isolated storage.
				foreach (SkyDriveFile ef in extraFiles.ToList())
				{
					if (isoStoreExtraFiles.Any(s => s.EndsWith("/" + ef.Name, StringComparison.InvariantCultureIgnoreCase)))
					{
						// The file needn't be downloaded.
						extraFiles.Remove(ef);
					}
				} 

				// Creates the list of cartridges and extra files that are on SkyDrive but
				// not in the isolated storage.
				List<SkyDriveFile> toDlFiles = cartFiles
					.Where(sd => !isoStoreFiles.Contains(GetIsoStorePath(sd.Name, sd.DownloadDirectory)))
					.Union(extraFiles)
					.ToList();

				// Bakes an event for when the sync will be over.
				lock (_syncRoot)
				{
					_syncEventArgs = new CartridgeProviderSyncEventArgs()
					{
						AddedFiles = toDlFiles
							.Select(sd => GetIsoStorePath(sd.Name, sd.DownloadDirectory))
							.ToList(),
						ToRemoveFiles = toRemoveFiles
					};
				}

				// Sends a progress event for removing the files marked
				// to be removed.
				if (toRemoveFiles.Count > 0)
				{
					RaiseSyncProgress(toRemoveFiles: toRemoveFiles);
				}

				// Starts downloading all new files, or terminate
				// the sync if no new file is to be downloaded.
				if (toDlFiles.Count > 0)
				{
					toDlFiles.ForEach(sd => BeginDownloadFile(sd));
				}
				else
				{
					EndSyncDownloads();
				}
			}
		}
		private void EndSync()
		{
			CartridgeProviderSyncEventArgs e;

			// Marks the sync as completed.
			lock (_syncRoot)
			{
				e = _syncEventArgs;
				_syncEventArgs = null;
			}
			IsSyncing = false;

			// Notifies that the sync is finished.
			if (e != null)
			{
				if (SyncCompleted != null)
				{
					SyncCompleted(this, e);
				}
			}
		}