| | 141 | } |
| | 142 | |
| | 143 | #endregion |
| | 144 | |
| | 145 | } |
| | 146 | |
| | 147 | #endregion |
| | 148 | |
| | 149 | #region TodoItemContentReader class |
| | 150 | |
| | 151 | /// <summary> |
| | 152 | /// アイテムの情報をストリーミングするクラス |
| | 153 | /// </summary> |
| | 154 | private sealed class TodoItemContentReader : IContentReader { |
| | 155 | |
| | 156 | #region fields |
| | 157 | |
| | 158 | /// <summary> |
| | 159 | /// アイテムの詳細情報のストリーム |
| | 160 | /// </summary> |
| | 161 | private StringReader reader; |
| | 162 | |
| | 163 | #endregion |
| | 164 | |
| | 165 | #region constructors |
| | 166 | |
| | 167 | /// <summary> |
| | 168 | /// パスを設定するコンストラクタ |
| | 169 | /// </summary> |
| | 170 | /// <param name="path">パス</param> |
| | 171 | public TodoItemContentReader(string path) { |
| | 172 | PSTodoItem item = Deserialize(path); |
| | 173 | |
| | 174 | this.reader = new StringReader( |
| | 175 | item.Description != null ? item.Description : string.Empty |
| | 176 | ); |
| | 177 | } |
| | 178 | |
| | 179 | #endregion |
| | 180 | |
| | 181 | #region IContentReader member |
| | 182 | |
| | 183 | /// <summary> |
| | 184 | /// <see cref="IContentReader.Close"/> |
| | 185 | /// </summary> |
| | 186 | public void Close() { |
| | 187 | reader.Close(); |
| | 188 | } |
| | 189 | |
| | 190 | /// <summary> |
| | 191 | /// <see cref="IContentReader.Read"/> |
| | 192 | /// </summary> |
| | 193 | /// <param name="readCount"></param> |
| | 194 | /// <returns></returns> |
| | 195 | IList IContentReader.Read(long readCount) { |
| | 196 | List<string> lines = new List<string>(); |
| | 197 | |
| | 198 | for(int i = 0; i < readCount; i++) { |
| | 199 | string line = reader.ReadLine(); |
| | 200 | if(line == null) break; |
| | 201 | |
| | 202 | lines.Add(line); |
| | 203 | } |
| | 204 | return lines; |
| | 205 | } |
| | 206 | |
| | 207 | /// <summary> |
| | 208 | /// <see cref="IContentReader.Seek"/> |
| | 209 | /// </summary> |
| | 210 | /// <param name="offset"></param> |
| | 211 | /// <param name="origin"></param> |
| | 212 | void IContentReader.Seek(long offset, SeekOrigin origin) { |
| | 213 | } |
| | 214 | |
| | 215 | #endregion |
| | 216 | |
| | 217 | #region IDisposable member |
| | 218 | |
| | 219 | /// <summary> |
| | 220 | /// <see cref="IDisposable.Dispose()"/> |
| | 221 | /// </summary> |
| | 222 | void IDisposable.Dispose() { |
| | 223 | Close(); |
| | 224 | } |
| | 225 | |
| | 226 | #endregion |
| | 227 | |
| | 228 | } |
| | 229 | |
| | 230 | #endregion |
| | 231 | |
| | 232 | #region TodoItemContentWriter class |
| | 233 | |
| | 234 | /// <summary> |
| | 235 | /// アイテムに情報を書き込むクラス |
| | 236 | /// </summary> |
| | 237 | private class TodoItemContentWriter : IContentWriter { |
| | 238 | |
| | 239 | #region fields |
| | 240 | |
| | 241 | private string path; |
| | 242 | private PSTodoItem item; |
| | 243 | private StringWriter writer; |
| | 244 | |
| | 245 | #endregion |
| | 246 | |
| | 247 | #region constructors |
| | 248 | |
| | 249 | /// <summary> |
| | 250 | /// パスを設定するコンストラクタ |
| | 251 | /// </summary> |
| | 252 | /// <param name="path"></param> |
| | 253 | public TodoItemContentWriter(string path) { |
| | 254 | this.path = path; |
| | 255 | this.item = Deserialize(path); |
| | 256 | |
| | 257 | StringBuilder buf = new StringBuilder( |
| | 258 | !string.IsNullOrEmpty(item.Description) ? item.Description : string.Empty |
| | 259 | ); |
| | 260 | writer = new StringWriter(buf); |
| | 261 | } |
| | 262 | |
| | 263 | #endregion |
| | 264 | |
| | 265 | #region IContentWriter member |
| | 266 | |
| | 267 | /// <summary> |
| | 268 | /// <see cref="IContentWriter.Close"/> |
| | 269 | /// </summary> |
| | 270 | public void Close() { |
| | 271 | writer.Close(); |
| | 272 | item.Description = writer.GetStringBuilder().ToString(); |
| | 273 | |
| | 274 | Serialize(item, path); |
| | 275 | } |
| | 276 | |
| | 277 | /// <summary> |
| | 278 | /// <see cref="IContentWriter.Seek"/> |
| | 279 | /// </summary> |
| | 280 | /// <param name="offset"></param> |
| | 281 | /// <param name="origin"></param> |
| | 282 | void IContentWriter.Seek(long offset, SeekOrigin origin) { |
| | 283 | } |
| | 284 | |
| | 285 | /// <summary> |
| | 286 | /// <see cref="IContentWriter.Write"/> |
| | 287 | /// </summary> |
| | 288 | /// <param name="content"></param> |
| | 289 | /// <returns></returns> |
| | 290 | IList IContentWriter.Write(IList content) { |
| | 291 | foreach(string line in content) writer.WriteLine(line); |
| | 292 | |
| | 293 | return content; |
| | 294 | } |
| | 295 | |
| | 296 | #endregion |
| | 297 | |
| | 298 | #region IDisposable member |
| | 299 | |
| | 300 | /// <summary> |
| | 301 | /// <see cref="IDisposable.Dispose()"/> |
| | 302 | /// </summary> |
| | 303 | void IDisposable.Dispose() { |
| | 304 | Close(); |
| | 631 | #region IContentCmdletProvider member |
| | 632 | |
| | 633 | /// <summary> |
| | 634 | /// <see cref="IContentCmdletProvider.ClearContent"/> |
| | 635 | /// </summary> |
| | 636 | /// <param name="path"></param> |
| | 637 | void IContentCmdletProvider.ClearContent(string path) { |
| | 638 | PSTodoItem item = Deserialize(path); |
| | 639 | item.Description = string.Empty; |
| | 640 | |
| | 641 | Serialize(item, path); |
| | 642 | } |
| | 643 | |
| | 644 | /// <summary> |
| | 645 | /// <see cref="IContentCmdletProvider.ClearContentDynamicParameters"/> |
| | 646 | /// </summary> |
| | 647 | /// <param name="path"></param> |
| | 648 | /// <returns></returns> |
| | 649 | object IContentCmdletProvider.ClearContentDynamicParameters(string path) { |
| | 650 | return null; |
| | 651 | } |
| | 652 | |
| | 653 | /// <summary> |
| | 654 | /// <see cref="IContentCmdletProvider.GetContentReader"/> |
| | 655 | /// </summary> |
| | 656 | /// <param name="path"></param> |
| | 657 | /// <returns></returns> |
| | 658 | IContentReader IContentCmdletProvider.GetContentReader(string path) { |
| | 659 | return new TodoItemContentReader(path); |
| | 660 | } |
| | 661 | |
| | 662 | /// <summary> |
| | 663 | /// <see cref="IContentCmdletProvider.GetContentReaderDynamicParameters"/> |
| | 664 | /// </summary> |
| | 665 | /// <param name="path"></param> |
| | 666 | /// <returns></returns> |
| | 667 | object IContentCmdletProvider.GetContentReaderDynamicParameters(string path) { |
| | 668 | return null; |
| | 669 | } |
| | 670 | |
| | 671 | /// <summary> |
| | 672 | /// <see cref="IContentCmdletProvider.GetContentWriter"/> |
| | 673 | /// </summary> |
| | 674 | /// <param name="path"></param> |
| | 675 | /// <returns></returns> |
| | 676 | IContentWriter IContentCmdletProvider.GetContentWriter(string path) { |
| | 677 | // Add-Content, Set-Contentでこのメソッドが呼び出される。 |
| | 678 | // Set-Contentの場合はこのメソッドの前にClearContentメソッドが呼び出され、 |
| | 679 | // コンテントがクリアされるので要注意!! |
| | 680 | return new TodoItemContentWriter(path); |
| | 681 | } |
| | 682 | |
| | 683 | /// <summary> |
| | 684 | /// <see cref="IContentCmdletProvider.GetContentWriterDynamicParameters"/> |
| | 685 | /// </summary> |
| | 686 | /// <param name="path"></param> |
| | 687 | /// <returns></returns> |
| | 688 | object IContentCmdletProvider.GetContentWriterDynamicParameters(string path) { |
| | 689 | return null; |
| | 690 | } |
| | 691 | |
| | 692 | #endregion |
| | 693 | |