/// <summary>
 /// Finds the comments.
 /// </summary>
 /// <param name="asset">The asset.</param>
 /// <returns></returns>
 public List<Comment> FindComments(Asset asset)
 {
     return this.ServiceAdapter.FindComments(asset);
 }
 /// <summary>
 /// Creates the and map comment.
 /// </summary>
 /// <param name="asset">The asset.</param>
 /// <param name="node">The node.</param>
 /// <returns></returns>
 protected Comment CreateAndMapComment(Asset asset, XmlNode node)
 {
     Comment c = new Comment();
     this.MapComment(asset, c, node);
     return c;
 }
 /// <summary>
 /// Deletes the asset.
 /// </summary>
 /// <param name="asset">The asset.</param>
 /// <returns></returns>
 public bool DeleteAsset(Asset asset)
 {
     return this.ServiceAdapter.DeleteAsset(asset);
 }
 /// <summary>
 /// Maps the comment.
 /// </summary>
 /// <param name="asset">The asset.</param>
 /// <param name="c">The c.</param>
 /// <param name="node">The node.</param>
 protected void MapComment(Asset asset, Comment c, XmlNode node)
 {
     c.CreatedAt = this.ExtractDateTime(this.ExtractInnerText(node, "created_at"));
     c.Contents = this.ExtractInnerText(node, "contents");
     c.Id = this.ExtractInt(node, "id");
     c.Asset = asset;
 }
        /// <summary>
        /// Updates the asset.
        /// </summary>
        /// <param name="asset">The asset.</param>
        /// <returns></returns>
        public bool UpdateAsset(Asset asset)
        {
            if (asset == null)
                throw new ArgumentNullException("asset", "The given asset can't be null");

            bool updated = false;
            Drop drop = asset.Drop;

            NameValueCollection parameters = new NameValueCollection();

            string token = string.IsNullOrEmpty(drop.AdminToken) ? drop.GuestToken : drop.AdminToken;
            parameters.Add("token", token);
            parameters.Add("name", asset.Name);

            this.AddTypedProperties(parameters, asset);

            HttpWebRequest request = this.CreatePutRequest(this.CreateAssetUrl(drop.Name, asset.Name), parameters);
            CompleteRequest(request, delegate(HttpWebResponse response)
            {
                ReadResponse(response, delegate(XmlDocument doc)
                {
                    XmlNodeList nodes = doc.SelectNodes("/asset");

                    this.MapAsset(asset, drop, nodes[0]);
                    updated = true;
                });
            });

            return updated;
        }
 /// <summary>
 /// Sends to emails.
 /// </summary>
 /// <param name="asset">The asset.</param>
 /// <param name="emails">The emails.</param>
 /// <param name="message">The message.</param>
 public void SendToEmails(Asset asset, List<string> emails, string message)
 {
     this.ServiceAdapter.SendToEmails(asset, emails, message);
 }
 /// <summary>
 /// Saves the asset.
 /// </summary>
 /// <param name="asset">The asset.</param>
 /// <returns></returns>
 public bool UpdateAsset(Asset asset)
 {
     return this.ServiceAdapter.UpdateAsset(asset);
 }
        /// <summary>
        /// Finds the comments.
        /// </summary>
        /// <param name="asset">The asset.</param>
        /// <returns></returns>
        public List<Comment> FindComments(Asset asset)
        {
            if (asset == null)
                throw new ArgumentNullException("asset", "The given asset can't be null");

            List<Comment> comments = new List<Comment>();

            Drop drop = asset.Drop;

            string token = string.IsNullOrEmpty(drop.AdminToken) ? drop.GuestToken : drop.AdminToken;

            HttpWebRequest request = this.CreateGetRequest(this.CreateCommentUrl(drop.Name, asset.Name), token);
            CompleteRequest(request, delegate(HttpWebResponse response)
            {
                ReadResponse(response, delegate(XmlDocument doc)
                {
                    XmlNodeList nodes = doc.SelectNodes("/comments/comment");

                    foreach (XmlNode node in nodes)
                    {
                        Comment c = this.CreateAndMapComment(asset, node);
                        comments.Add(c);
                    }
                });
            });

            return comments;
        }
 /// <summary>
 /// Generates the authenticated asset URL.
 /// </summary>
 /// <param name="asset">The asset.</param>
 /// <returns></returns>
 public string GenerateAuthenticatedAssetUrl(Asset asset)
 {
     string unixTime = GenerateUnixTimestamp().ToString();
     string signature = GenerateSignature(asset.Drop, unixTime);
     StringBuilder sb = new StringBuilder();
     sb.Append(this.BaseUrl);
     sb.Append(asset.Drop.Name);
     sb.Append("/asset/");
     sb.Append(asset.Name);
     sb.Append(FROM_API);
     sb.Append("?&signature=");
     sb.Append(signature);
     sb.Append("&expires=");
     sb.Append(unixTime);
     return sb.ToString();
 }
        /// <summary>
        /// Creates the comment.
        /// </summary>
        /// <param name="asset">The asset.</param>
        /// <param name="contents">The contents.</param>
        /// <returns></returns>
        public Comment CreateComment(Asset asset, string contents)
        {
            if (asset == null)
                throw new ArgumentNullException("asset", "The given asset can't be null");

            Comment c = null;
            Drop drop = asset.Drop;

            NameValueCollection parameters = new NameValueCollection();

            string token = string.IsNullOrEmpty(drop.AdminToken) ? drop.GuestToken : drop.AdminToken;
            parameters.Add("token", token);
            parameters.Add("contents", contents);

            HttpWebRequest request = this.CreatePostRequest(this.CreateCommentUrl(drop.Name, asset.Name), parameters);
            CompleteRequest(request, delegate(HttpWebResponse response)
            {
                ReadResponse(response, delegate(XmlDocument doc)
                {
                    XmlNodeList nodes = doc.SelectNodes("/comment");
                    c = this.CreateAndMapComment(asset, nodes[0]);
                });
            });

            return c;
        }
        /// <summary>
        /// Deletes the asset.
        /// </summary>
        /// <param name="asset">The asset.</param>
        /// <returns></returns>
        public bool DeleteAsset(Asset asset)
        {
            if (asset == null)
                throw new ArgumentNullException("asset", "The given asset can't be null");

            bool destroyed = false;
            Drop drop = asset.Drop;

            NameValueCollection parameters = new NameValueCollection();

            string token = string.IsNullOrEmpty(drop.AdminToken) ? drop.GuestToken : drop.AdminToken;
            parameters.Add("token", token);

            HttpWebRequest request = this.CreateDeleteRequest(this.CreateAssetUrl(drop.Name, asset.Name), parameters);
            CompleteRequest(request, (HttpWebResponse response) => { destroyed = true; });

            return destroyed;
        }
 /// <summary>
 /// Adds the typed properties.
 /// </summary>
 /// <param name="parameters">The parameters.</param>
 /// <param name="asset">The asset.</param>
 private void AddTypedProperties(NameValueCollection parameters, Asset asset)
 {
     switch (asset.DisplayType)
     {
         case "Link":
             parameters.Add("title", ((Link)asset).Title);
             parameters.Add("description", ((Link)asset).Description);
             parameters.Add("url", ((Link)asset).Url);
             break;
         case "Note":
             parameters.Add("title", ((Note)asset).Title);
             parameters.Add("contents", ((Note)asset).Contents);
             break;
     }
 }
        /// <summary>
        /// Sends the specified parameters.
        /// </summary>
        /// <param name="parameters">The parameters.</param>
        protected void Send(Asset a, NameValueCollection parameters)
        {
            if (a == null)
                throw new ArgumentNullException("a", "The given asset can't be null");

            Drop drop = a.Drop;

            string token = string.IsNullOrEmpty(drop.AdminToken) ? drop.GuestToken : drop.AdminToken;

            parameters.Add("token", token);

            HttpWebRequest request = this.CreatePostRequest(this.CreateSendToUrl(drop.Name, a.Name), parameters);
            CompleteRequest(request, null);
        }
 /// <summary>
 /// Maps the typed data.
 /// </summary>
 /// <param name="asset">The asset.</param>
 /// <param name="node">The node.</param>
 protected void MapTypedData(Asset asset, XmlNode node)
 {
     switch (asset.DisplayType)
     {
         case "Audio":
             Audio a = asset as Audio;
             a.Artist = this.ExtractInnerText(node, "artist");
             a.Title = this.ExtractInnerText(node, "title");
             a.Duration = this.ExtractInt(node, "duration");
             break;
         case "Document":
             Document d = asset as Document;
             d.Pages = this.ExtractInt(node, "pages");
             break;
         case "Note":
             Note n = asset as Note;
             n.Title = this.ExtractInnerText(node, "title");
             n.Contents = this.ExtractInnerText(node, "contents");
             break;
         case "Image":
             Image i = asset as Image;
             i.Height = this.ExtractInt(node, "height");
             i.Width = this.ExtractInt(node, "width");
             break;
         case "Movie":
             Movie m = asset as Movie;
             m.Duration = this.ExtractInt(node, "duration");
             break;
         case "Link":
             Link l = asset as Link;
             l.Title = this.ExtractInnerText(node, "title");
             l.Description = this.ExtractInnerText(node, "description");
             l.Url = this.ExtractInnerText(node, "url");
             break;
     }
 }
 /// <summary>
 /// Generates the authenticated asset URL.
 /// </summary>
 /// <param name="asset">The asset.</param>
 /// <returns></returns>
 public string GenerateAuthenticatedAssetUrl(Asset asset)
 {
     return this.ServiceAdapter.GenerateAuthenticatedAssetUrl(asset);
 }
 /// <summary>
 /// Sends to drop.
 /// </summary>
 /// <param name="asset">The asset.</param>
 /// <param name="dropName">Name of the drop.</param>
 public void SendToDrop(Asset asset, string dropName)
 {
     NameValueCollection parameters = new NameValueCollection();
     parameters.Add("medium", "drop");
     parameters.Add("drop_name", dropName);
     this.Send(asset, parameters);
 }
 /// <summary>
 /// Sends to drop.
 /// </summary>
 /// <param name="asset">The asset.</param>
 /// <param name="dropName">Name of the drop.</param>
 public void SendToDrop(Asset asset, string dropName)
 {
     this.ServiceAdapter.SendToDrop(asset, dropName);
 }
        /// <summary>
        /// Sends to emails.
        /// </summary>
        /// <param name="asset">The asset.</param>
        /// <param name="emails">The emails.</param>
        /// <param name="message">The message.</param>
        public void SendToEmails(Asset asset, List<string> emails, string message)
        {
            NameValueCollection parameters = new NameValueCollection();
            parameters.Add("medium", "email");

            StringBuilder emailList = new StringBuilder();
            foreach (string email in emails)
            {
                emailList.Append(email + ",");
            }

            parameters.Add("emails", emailList.ToString());
            parameters.Add("message", message);
            this.Send(asset, parameters);
        }
 /// <summary>
 /// Sends to fax.
 /// </summary>
 /// <param name="asset">The asset.</param>
 /// <param name="faxNumber">The fax number.</param>
 public void SendToFax(Asset asset, string faxNumber)
 {
     this.ServiceAdapter.SendToFax(asset, faxNumber);
 }
 /// <summary>
 /// Sends to fax.
 /// </summary>
 /// <param name="asset">The asset.</param>
 /// <param name="faxNumber">The fax number.</param>
 public void SendToFax(Asset asset, string faxNumber)
 {
     NameValueCollection parameters = new NameValueCollection();
     parameters.Add("medium", "fax");
     parameters.Add("fax_number", faxNumber);
     this.Send(asset, parameters);
 }
 /// <summary>
 /// Creates the comment.
 /// </summary>
 /// <param name="asset">The asset.</param>
 /// <param name="contents">The contents.</param>
 /// <returns></returns>
 public Comment CreateComment(Asset asset, string contents)
 {
     return this.ServiceAdapter.CreateComment(asset, contents);
 }
        /// <summary>
        /// Maps the asset.
        /// </summary>
        /// <param name="asset">The asset.</param>
        /// <param name="drop">The drop.</param>
        /// <param name="node">The node.</param>
        protected void MapAsset(Asset asset, Drop drop, XmlNode node)
        {
            asset.CreatedAt = this.ExtractDateTime(this.ExtractInnerText(node, "created_at"));
            asset.Filesize = this.ExtractInt(node, "filesize");
            asset.Status = (Status)Enum.Parse(typeof(Status), this.ExtractInnerText(node,"status"), true);
            asset.Name = this.ExtractInnerText(node, "name");
            asset.ThumbnailUrl = this.ExtractInnerText(node, "thumbnail");
            asset.FileUrl = this.ExtractInnerText(node, "file");
            asset.ConvertedFileUrl = this.ExtractInnerText(node, "converted");
            asset.Drop = drop;

            this.MapTypedData(asset, node);
        }