using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using NaGet.Tasks;
namespace NaGet.SubCommands
{
#region NaGetTaskQueryHandler関連
public delegate NaGetTaskQueryResult NaGetTaskQueryHandler(object sender, NaGetTaskQueryArgs e);
public class NaGetTaskQueryArgs
{
///
/// タスクの現況のメッセージ
///
public string Message;
///
/// 回答の種類のフラグ
///
public NaGetTaskQueryResult SelectionFlag;
public NaGetTaskQueryArgs(string message, NaGetTaskQueryResult selectionFlag)
{
this.Message = message;
this.SelectionFlag = selectionFlag;
}
}
///
/// 質問の答え
///
[Flags()]
public enum NaGetTaskQueryResult : uint
{
///
/// 継続(=OK)
///
CONTINUE = 0x01,
///
/// 再試行
///
RETRY = 0x02,
///
/// キャンセル、中止
///
CANCEL = 0x04,
///
/// 自動的なキャンセル(ユーザの手ではないもの)
///
CANCELED_AUTOMATICALLY = 0x00,
}
#endregion
///
/// NaGetタスク処理のパック
///
public abstract class NaGetTaskSet : Task
{
///
/// タスク処理中の質問のハンドラ
///
public event NaGetTaskQueryHandler TaskQueryRaised;
///
/// 文字列で表現した作業一覧リスト
///
protected IList taskSetNames;
///
/// 文字列で表現した作業一覧リスト
///
public virtual IList TaskSetNames {
get {
return new ReadOnlyCollection(taskSetNames);
}
}
///
/// 現在実行中の作業番号
///
public abstract int CurrentTaskSetIndex {
get;
}
///
/// 現在の進捗を戻す。
///
/// 作業の状態
/// サブタスクの進捗
/// 現在の進捗
protected virtual float GetProgressPercent(TaskEventType type, float subTaskProgress)
{
if (CurrentTaskSetIndex >= 0) {
if (subTaskProgress >= 0) {
return (CurrentTaskSetIndex * 100 + subTaskProgress) / taskSetNames.Count;
}
switch (type) {
case TaskEventType.STARTED:
return 0;
case TaskEventType.COMPLETED:
return 100;
case TaskEventType.COMPLETED_SUBTASK:
return ((CurrentTaskSetIndex+1) * 100) / taskSetNames.Count;
default:
return (CurrentTaskSetIndex * 100) / taskSetNames.Count;
}
}
return -1;
}
#region TaskEvent便利メソッド
protected virtual void RaiseTaskSetEvent(TaskEventType type, string message)
{
RaiseTaskSetEvent(type, message, GetProgressPercent(type, -1));
}
protected virtual void ReceivedErrorData(object sender, NaGet.Utils.AnyDataEventArgs e)
{
if (! string.IsNullOrEmpty(e.Data)) {
RaiseTaskSetEvent(TaskEventType.WARNING, e.Data);
}
}
protected virtual void ReceivedOutputData(object sender, NaGet.Utils.AnyDataEventArgs e)
{
if (! string.IsNullOrEmpty(e.Data)) {
RaiseTaskSetEvent(TaskEventType.INFO, e.Data);
}
}
#endregion
protected virtual NaGetTaskQueryResult RaiseTaskSetQueryEvent(string message, NaGetTaskQueryResult selection)
{
if (TaskQueryRaised != null) {
return TaskQueryRaised(this, new NaGetTaskQueryArgs(message, selection));
}
return NaGetTaskQueryResult.CANCELED_AUTOMATICALLY;
}
public override bool Running {
get { return CurrentTaskSetIndex >= 0 && !Done; }
}
}
}