public override bool RenameResource(IStorageProviderSession session, ICloudFileSystemEntry fsentry, string newName)
        {
            if (String.IsNullOrEmpty(newName) || GoogleDocsResourceHelper.IsNoolOrRoot(fsentry))
            {
                return(false);
            }

            var url = String.Format(GoogleDocsConstants.GoogleDocsResourceUrlFormat, fsentry.Id.ReplaceFirst("_", "%3a"));

            var request = CreateWebRequest(session, url, "PUT", null);

            request.Headers.Add("If-Match", fsentry.GetPropertyValue(GoogleDocsConstants.EtagProperty));
            GoogleDocsXmlParser.WriteAtom(request, GoogleDocsXmlParser.EntryElement(GoogleDocsXmlParser.TitleElement(newName)));

            try
            {
                var response = (HttpWebResponse)request.GetResponse();
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    //check if extension added
                    if (!(fsentry is ICloudDirectoryEntry) && String.IsNullOrEmpty(Path.GetExtension(newName)))
                    {
                        newName = newName + Path.GetExtension(fsentry.Name);
                    }
                    (fsentry as BaseFileEntry).Name = newName;
                    return(true);
                }
            }
            catch (WebException)
            {
            }

            return(false);
        }
        public override ICloudFileSystemEntry RequestResource(IStorageProviderSession session, string Name, ICloudDirectoryEntry parent)
        {
            if (GoogleDocsResourceHelper.IsNoolOrRoot(parent) && GoogleDocsResourceHelper.IsRootName(Name))
            {
                var root = new BaseDirectoryEntry("/", 0, DateTime.Now, session.Service, session)
                {
                    Id = GoogleDocsConstants.RootFolderId
                };
                root.SetPropertyValue(GoogleDocsConstants.ResCreateMediaProperty, GoogleDocsConstants.RootResCreateMediaUrl);
                RefreshDirectoryContent(session, root);
                return(root);
            }

            if (Name.Equals("/"))
            {
                RefreshDirectoryContent(session, parent as BaseDirectoryEntry);
            }

            if (GoogleDocsResourceHelper.IsResorceId(Name))
            {
                var url     = String.Format(GoogleDocsConstants.GoogleDocsResourceUrlFormat, Name.ReplaceFirst("_", "%3a"));
                var request = CreateWebRequest(session, url, "GET", null);
                try
                {
                    var response = (HttpWebResponse)request.GetResponse();
                    var rs       = response.GetResponseStream();

                    var xml   = new StreamReader(rs).ReadToEnd();
                    var entry = GoogleDocsXmlParser.ParseEntriesXml(session, xml).FirstOrDefault();

                    if (entry == null)
                    {
                        throw new SharpBoxException(SharpBoxErrorCodes.ErrorFileNotFound);
                    }

                    if (parent != null)
                    {
                        (parent as BaseDirectoryEntry).AddChild(entry);
                    }

                    var dirEntry = entry as BaseDirectoryEntry;

                    if (dirEntry == null)
                    {
                        return(entry);
                    }

                    RefreshDirectoryContent(session, dirEntry);
                    return(dirEntry);
                }
                catch (WebException)
                {
                    throw new SharpBoxException(SharpBoxErrorCodes.ErrorFileNotFound);
                }
            }

            throw new SharpBoxException(SharpBoxErrorCodes.ErrorInvalidFileOrDirectoryName);
        }
        public override ICloudFileSystemEntry CreateResource(IStorageProviderSession session, string name, ICloudDirectoryEntry parent)
        {
            if (String.IsNullOrEmpty(name))
            {
                throw new ArgumentException("Name cannot be empty");
            }

            var url = GoogleDocsResourceHelper.IsNoolOrRoot(parent)
                          ? GoogleDocsConstants.GoogleDocsFeedUrl
                          : String.Format(GoogleDocsConstants.GoogleDocsContentsUrlFormat, parent.Id.ReplaceFirst("_", "%3a"));

            var request = CreateWebRequest(session, url, "POST", null);

            GoogleDocsXmlParser.WriteAtom(request, GoogleDocsXmlParser.EntryElement(GoogleDocsXmlParser.CategoryElement(), GoogleDocsXmlParser.TitleElement(name)));

            try
            {
                using (var response = (HttpWebResponse)request.GetResponse())
                {
                    if (response.StatusCode == HttpStatusCode.Created)
                    {
                        using (var rs = response.GetResponseStream())
                            using (var streamReader = new StreamReader(rs))
                            {
                                var xml   = streamReader.ReadToEnd();
                                var entry = GoogleDocsXmlParser.ParseEntriesXml(session, xml).First();

                                if (parent != null)
                                {
                                    (parent as BaseDirectoryEntry).AddChild(entry);
                                }

                                return(entry);
                            }
                    }
                }
            }
            catch (WebException)
            {
                throw new SharpBoxException(SharpBoxErrorCodes.ErrorCreateOperationFailed);
            }

            return(null);
        }
        public override bool MoveResource(IStorageProviderSession session, ICloudFileSystemEntry fsentry, ICloudDirectoryEntry newParent)
        {
            if (fsentry == null || newParent == null || GoogleDocsResourceHelper.IsNoolOrRoot(fsentry))
            {
                return(false);
            }

            if (RemoveResource(session, fsentry, RemoveMode.FromParentCollection) && AddToCollection(session, fsentry, newParent))
            {
                if (fsentry.Parent != null)
                {
                    (fsentry.Parent as BaseDirectoryEntry).RemoveChild(fsentry as BaseFileEntry);
                }
                (newParent as BaseDirectoryEntry).AddChild(fsentry as BaseFileEntry);

                return(true);
            }

            return(false);
        }
        public override bool DeleteResource(IStorageProviderSession session, ICloudFileSystemEntry entry)
        {
            if (GoogleDocsResourceHelper.IsNoolOrRoot(entry))
            {
                return(false);
            }

            if (RemoveResource(session, entry, RemoveMode.Delete))
            {
                (entry as BaseFileEntry).IsDeleted = true;
                if (entry.Parent != null)
                {
                    (entry.Parent as BaseDirectoryEntry).RemoveChildById(entry.Id);
                }

                return(true);
            }

            return(false);
        }