OSDN Git Service

・フォトライフの対応一応完了
authorazyobuzin <azyobuzin@users.sourceforge.jp>
Wed, 11 May 2011 10:28:48 +0000 (19:28 +0900)
committerazyobuzin <azyobuzin@users.sourceforge.jp>
Wed, 11 May 2011 10:28:48 +0000 (19:28 +0900)
・その他いろいろWsseAtomConnectionとかいじった

HatenaDiaryClient/Models/Hatena/FotolifeEntry.cs
HatenaDiaryClient/Models/Hatena/HatenaDiary.cs
HatenaDiaryClient/Models/Hatena/HatenaFotolife.cs
HatenaDiaryClient/Models/Hatena/WsseAtomConnection.cs

index 0fc4a30..bf9555f 100644 (file)
@@ -1,9 +1,7 @@
 using System;
-using System.Collections.Generic;
 using System.Linq;
-using System.Text;
-using System.Xml.Linq;
 using System.Text.RegularExpressions;
+using System.Xml.Linq;
 
 namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
 {
@@ -19,26 +17,28 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
         public string HatenaSyntax { set; get; }
 
         public FotolifeEntry() { }
-        public FotolifeEntry(XElement xml, bool isRdf)
+        public FotolifeEntry(XElement xml)
         {
-            if (isRdf)
-            {
-                //TODO
-            }
-            else
-            {
-                this.Title = xml.Element(XmlNamespaces.Atom02Spec + "title").Value;
-                this.PageUri = xml.Elements(XmlNamespaces.Atom02Spec + "link")
-                    .Where(_ => _.Attribute("rel").Value == "alternate")
-                    .Select(_ => _.Attribute("href").Value)
-                    .FirstOrDefault();
-                this.Id = Regex.Match(this.PageUri, @"\d+$").ToString();
-                this.Issued = DateTime.Parse(xml.Element(XmlNamespaces.Atom02Spec + "issued").Value);
-                this.Folder = xml.Element(XmlNamespaces.DublinCore + "subject").Value;
-                this.ImageUri = xml.Element(XmlNamespaces.HatenaNs + "imageurl").Value;
-                this.ThumbnailUri = xml.Element(XmlNamespaces.HatenaNs + "imageurlsmall").Value;
-                this.HatenaSyntax = xml.Element(XmlNamespaces.HatenaNs + "syntax").Value;
-            }
+            Console.WriteLine(xml.ToString());
+            this.Title = xml.Element(XmlNamespaces.Atom02Spec + "title").Value;
+            this.PageUri = xml.Elements(XmlNamespaces.Atom02Spec + "link")
+                .Where(_ => _.Attribute("rel").Value == "alternate")
+                .Select(_ => _.Attribute("href").Value)
+                .FirstOrDefault();
+            this.Id = Regex.Match(this.PageUri, @"\d+$").ToString();
+            var issuedXml = xml.Element(XmlNamespaces.Atom02Spec + "issued").Value;
+            if (!string.IsNullOrWhiteSpace(issuedXml))
+                this.Issued = DateTime.Parse(issuedXml);
+            var folderXml = xml.Element(XmlNamespaces.DublinCore + "subject");
+            if (folderXml != null)
+                this.Folder = folderXml.Value;
+            this.ImageUri = xml.Element(XmlNamespaces.HatenaNs + "imageurl").Value;
+            this.ThumbnailUri = xml.Element(XmlNamespaces.HatenaNs + "imageurlsmall").Value;
+            this.HatenaSyntax = string.Format(
+                "f:id:{0}:{1}j:image",
+                xml.Element(XmlNamespaces.Atom02Spec + "author")
+                    .Element(XmlNamespaces.Atom02Spec + "name").Value,
+                this.Id);
         }
     }
 }
index 09c1044..73279f9 100644 (file)
@@ -1,9 +1,8 @@
 using System;
 using System.Collections.Generic;
+using System.Collections.Specialized;
 using System.Linq;
-using System.Net;
 using System.Text;
-using System.Text.RegularExpressions;
 using System.Xml.Linq;
 
 namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
@@ -23,6 +22,7 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
         {
             var xdoc = WsseAtomConnection.Get(
                 string.Format("http://d.hatena.ne.jp/{0}/atom/blog?page={1}", this.userName, page),
+                Encoding.UTF8,
                 this.userName,
                 this.password);
             var title = xdoc.Root.Element(XmlNamespaces.Atom + "title").Value;
@@ -58,6 +58,7 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
         {
             var xdoc = WsseAtomConnection.Get(
                 string.Format("http://d.hatena.ne.jp/{0}/atom/blog/{1}", this.userName, dateId),
+                Encoding.UTF8,
                 this.userName,
                 this.password);
             return new BlogEntry(xdoc.Root);
@@ -89,6 +90,7 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
         {
             var xdoc = WsseAtomConnection.Get(
                 string.Format("http://d.hatena.ne.jp/{0}/atom/draft?page={1}", this.userName, page),
+                Encoding.UTF8,
                 this.userName,
                 this.password);
             var title = xdoc.Root.Element(XmlNamespaces.Atom + "title").Value;
@@ -114,6 +116,7 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
         {
             var xdoc = WsseAtomConnection.Get(
                 string.Format("http://d.hatena.ne.jp/{0}/atom/draft/{1}", this.userName, id),
+                Encoding.UTF8,
                 this.userName,
                 this.password);
             return new BlogEntry(xdoc.Root);
@@ -141,22 +144,22 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
                 this.password);
         }
 
-        public string PublishDraft(string id)
+        public BlogEntry PublishDraft(string id)
         {
-            var req = (HttpWebRequest)WebRequest.Create(string.Format(
-                "http://d.hatena.ne.jp/{0}/atom/draft/{1}",
-                this.userName,
-                id));
-            req.Method = "PUT";
-            req.AllowAutoRedirect = false;
-            req.Headers.Add(WsseAtomConnection.CreateHeader(this.userName, this.password));
-            req.Headers.Add("X-HATENA-PUBLISH: 1");
-            using (var res = req.GetResponse())
-                return Regex.Match(
-                    res.Headers[HttpResponseHeader.Location],
-                    @"\d+/\d+"
+            return new BlogEntry(
+                XElement.Parse(
+                    WsseAtomConnection.Put(
+                        string.Format(
+                            "http://d.hatena.ne.jp/{0}/atom/draft/{1}",
+                            this.userName,
+                            id),
+                        new NameValueCollection() { { "X-HATENA-PUBLISH", "1" } },
+                        null,
+                        Encoding.UTF8,
+                        this.userName,
+                        this.password)
                 )
-                .ToString();
+            );
         }
     }
 }
index cefc45f..bdb6cf9 100644 (file)
@@ -1,10 +1,9 @@
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Text;
-using System.IO;
 using System.Xml.Linq;
-using System.Net;
 
 namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
 {
@@ -38,30 +37,30 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
                 case "bmp":
                     mimeType = "image/x-bmp";
                     break;
-                case "mov":
-                    mimeType = "video/quicktime";
-                    break;
-                case "mpg":
-                case "mpeg":
-                case "m1v":
-                    mimeType = "video/mpeg";
-                    break;
-                case "wmv":
-                    mimeType = "video/x-ms-wmv";
-                    break;
-                case "avi":
-                    mimeType = "video/avi";
-                    break;
-                case "flv":
-                    mimeType = "video/x-flv";
-                    break;
-                case "3gp":
-                case "3gpp":
-                    mimeType = "video/3gpp";
-                    break;
-                case "3g2":
-                    mimeType = "video/3gpp2";
-                    break;
+                //case "mov":
+                //    mimeType = "video/quicktime";
+                //    break;
+                //case "mpg":
+                //case "mpeg":
+                //case "m1v":
+                //    mimeType = "video/mpeg";
+                //    break;
+                //case "wmv":
+                //    mimeType = "video/x-ms-wmv";
+                //    break;
+                //case "avi":
+                //    mimeType = "video/avi";
+                //    break;
+                //case "flv":
+                //    mimeType = "video/x-flv";
+                //    break;
+                //case "3gp":
+                //case "3gpp":
+                //    mimeType = "video/3gpp";
+                //    break;
+                //case "3g2":
+                //    mimeType = "video/3gpp2";
+                //    break;
                 default:
                     throw new ArgumentException("対応してないファイルです。");
             } 
@@ -84,7 +83,59 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
                 Encoding.GetEncoding("shift_jis"),
                 this.userName,
                 this.password);
-            return new FotolifeEntry(reXml.Root, false);
+            return new FotolifeEntry(reXml.Root);
+        }
+
+        public FotolifeEntry GetEntry(string id)
+        {
+            return new FotolifeEntry(
+                WsseAtomConnection.Get(
+                    "http://f.hatena.ne.jp/atom/edit/" + id,
+                    Encoding.UTF8,
+                    this.userName,
+                    this.password
+                )
+                .Root
+            );
+        }
+
+        public void EditEntry(string id, string newTitle)
+        {
+            WsseAtomConnection.Put(
+                "http://f.hatena.ne.jp/atom/edit/" + id,
+                null,
+                Encoding.GetEncoding("shift_jis").GetBytes(
+                    new XDocument(
+                        new XElement(XmlNamespaces.Atom02Spec + "entry",
+                            new XElement(XmlNamespaces.Atom02Spec + "title", newTitle)
+                        )
+                    )
+                    .ToString()
+                ),
+                null,
+                this.userName,
+                this.password);
+        }
+
+        public void DeleteEntry(string id)
+        {
+            WsseAtomConnection.Delete(
+                "http://f.hatena.ne.jp/atom/edit/" + id,
+                this.userName,
+                this.password);
+        }
+
+        public IEnumerable<FotolifeEntry> GetEntrys(int page = 1)
+        {
+            return WsseAtomConnection.Get(
+                "http://f.hatena.ne.jp/atom/feed?page=" + page.ToString(),
+                Encoding.UTF8,
+                this.userName,
+                this.password
+            )
+            .Root
+            .Elements(XmlNamespaces.Atom02Spec + "entry")
+            .Select(_ => new FotolifeEntry(_));
         }
     }
 }
index d01cc00..d751f52 100644 (file)
@@ -1,4 +1,6 @@
 using System;
+using System.Collections.Specialized;
+using System.IO;
 using System.Linq;
 using System.Net;
 using System.Security.Cryptography;
@@ -25,13 +27,13 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
                 userName, digest, Convert.ToBase64String(nonce), created);
         }
 
-        public static XDocument Get(string reqUri, string userName, string password)
+        public static XDocument Get(string reqUri, Encoding enc, string userName, string password)
         {
             using (var wc = new WebClient())
             {
                 wc.Headers.Add(CreateHeader(userName, password));
-                using (var stream = wc.OpenRead(reqUri))
-                    return XDocument.Load(stream);
+                using (var sr = new StreamReader(wc.OpenRead(reqUri), enc ?? Encoding.UTF8))
+                    return XDocument.Load(sr);
             }
         }
 
@@ -49,7 +51,7 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
             req.Method = method;
             req.Headers.Add(CreateHeader(userName, password));
             req.ContentType = "application/x.atom+xml";
-            var bs = Encoding.GetEncoding("shift_jis").GetBytes(reqData.ToString());
+            var bs = enc.GetBytes(reqData.ToString());
             req.ContentLength = bs.Length;
             using (var stream = req.GetRequestStream())
                 stream.Write(bs, 0, bs.Length);
@@ -66,5 +68,21 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
         {
             return PostOrPut(reqUri, "PUT", reqData, enc, userName, password);
         }
+
+        public static string Put(string reqUri, NameValueCollection headers, byte[] data, Encoding enc, string userName, string password)
+        {
+            var req = WebRequest.Create(reqUri);
+            req.Method = "PUT";
+            req.Headers.Add(CreateHeader(userName, password));
+            if (headers != null)
+                req.Headers.Add(headers);
+            if (data != null && data.Any())
+            {
+                using (var stream = req.GetRequestStream())
+                    stream.Write(data, 0, data.Length);
+            }
+            using (var sr = new StreamReader(req.GetResponse().GetResponseStream(), enc ?? Encoding.UTF8))
+                return sr.ReadToEnd();
+        }
     }
 }
\ No newline at end of file