filter - フィルタリング処理

------------------------------------------------------------------------------
FilterTiming

typedef enum
{
	FLT_TIMING_ANY,
	FLT_TIMING_ON_RECEIVE,
	FLT_TIMING_MANUAL
} FilterTiming;

------------------------------------------------------------------------------
FilterCondType

typedef enum
{
	FLT_COND_HEADER,
	FLT_COND_ANY_HEADER,
	FLT_COND_TO_OR_CC,
	FLT_COND_BODY,
	FLT_COND_CMD_TEST,
	FLT_COND_SIZE_GREATER,
	FLT_COND_AGE_GREATER,
	FLT_COND_UNREAD,
	FLT_COND_MARK,
	FLT_COND_COLOR_LABEL,
	FLT_COND_MIME,
	FLT_COND_ACCOUNT
} FilterCondType;

------------------------------------------------------------------------------
typedef enum
{
	FLT_CONTAIN,
	FLT_EQUAL,
	FLT_REGEX
} FilterMatchType;

------------------------------------------------------------------------------
typedef enum
{
	FLT_NOT_MATCH	= 1 << 0,
	FLT_CASE_SENS	= 1 << 1
} FilterMatchFlag;

------------------------------------------------------------------------------
typedef enum
{
	FLT_OR,
	FLT_AND
} FilterBoolOp;

------------------------------------------------------------------------------
typedef enum
{
	FLT_ACTION_MOVE,
	FLT_ACTION_COPY,
	FLT_ACTION_NOT_RECEIVE,
	FLT_ACTION_DELETE,
	FLT_ACTION_EXEC,
	FLT_ACTION_EXEC_ASYNC,
	FLT_ACTION_MARK,
	FLT_ACTION_COLOR_LABEL,
	FLT_ACTION_MARK_READ,
	FLT_ACTION_FORWARD,
	FLT_ACTION_FORWARD_AS_ATTACHMENT,
	FLT_ACTION_REDIRECT,
	FLT_ACTION_STOP_EVAL,
	FLT_ACTION_NONE
} FilterActionType;

------------------------------------------------------------------------------
typedef enum
{
	FLT_BY_NONE,
	FLT_BY_AUTO,
	FLT_BY_FROM,
	FLT_BY_TO,
	FLT_BY_SUBJECT
} FilterCreateType;

------------------------------------------------------------------------------
#define FLT_IS_NOT_MATCH(flag)

FilterMatchFlag 型の値 flag に FLT_NOT_MATCH フラグが立っていれば TRUE を
返します。

------------------------------------------------------------------------------
#define FLT_IS_CASE_SENS(flag)

FilterMatchFlag 型の値 flag に FLT_CASE_SENS フラグが立っていれば TRUE を
返します。

------------------------------------------------------------------------------
struct _FilterCond
{
	FilterCondType type;

	gchar *header_name;

	gchar *str_value;
	gint int_value;

	FilterMatchType match_type;
	FilterMatchFlag match_flag;

	StrFindFunc match_func;
};

フィルタの条件を表す構造体です。

------------------------------------------------------------------------------
struct _FilterAction
{
	FilterActionType type;

	gchar *str_value;
	gint int_value;
};

フィルタの条件にマッチしたときに実行するアクションを表す構造体です。

------------------------------------------------------------------------------
struct _FilterRule
{
	gchar *name;

	FilterBoolOp bool_op;

	GSList *cond_list;
	GSList *action_list;

	FilterTiming timing;
	gboolean enabled;

	gchar *target_folder;
	gboolean recursive;
};

フィルタルールを表す構造体です。一つのフィルタルールには任意の個数の
条件とアクションを設定できます。

------------------------------------------------------------------------------
struct _FilterInfo
{
	PrefsAccount *account;
	MsgFlags flags;

	gboolean actions[FLT_ACTION_NONE];
	GSList *dest_list;
	FolderItem *move_dest;
	gboolean drop_done;
};

フィルタルールを適用した際の情報を格納するための構造体です。

------------------------------------------------------------------------------
gint filter_apply			(GSList			*fltlist,
					 const gchar		*file,
					 FilterInfo		*fltinfo);

メッセージファイル file にフィルタルール FilterRule のリスト fltlist を
適用します。 fltinfo にはフィルタルールを適用した場合の情報が格納されます。

fltlist: FilterRule 構造体へのポインタのリスト
file: メッセージファイルのパス
fltinfo: FilterInfo 構造体へのポインタ
戻り値: 成功した場合は 0
        エラーの場合は -1

------------------------------------------------------------------------------
gint filter_apply_msginfo		(GSList			*fltlist,
					 MsgInfo		*msginfo,
					 FilterInfo		*fltinfo);

メッセージ msginfo にフィルタルール FilterRule のリスト fltlist を
適用します。 fltinfo にはフィルタルールを適用した場合の情報が格納されます。

fltlist: FilterRule 構造体へのポインタのリスト
msginfo: MsgInfo 構造体へのポインタ
fltinfo: FilterInfo 構造体へのポインタ
戻り値: 成功した場合は 0
        エラーの場合は -1

------------------------------------------------------------------------------
gint filter_action_exec			(FilterRule		*rule,
					 MsgInfo		*msginfo,
					 const gchar		*file,
					 FilterInfo		*fltinfo);

メッセージ msginfo に対してフィルタルール rule のアクションを実行します。
msginfo に対応するメッセージファイル file も同時に指定する必要があります。

rule: 適用するアクションを格納した FilterRule 構造体へのポインタ
msginfo: MsgInfo 構造体へのポインタ
file: msginfo に対応するメッセージファイルのパス
fltinfo: FilterInfo 構造体へのポインタ
戻り値: 成功した場合は 0
        エラーの場合は -1

------------------------------------------------------------------------------
gboolean filter_match_rule		(FilterRule		*rule,
					 MsgInfo		*msginfo,
					 GSList			*hlist,
					 FilterInfo		*fltinfo);

フィルタルール rule がメッセージ msginfo にマッチするかどうかを調べ、
マッチした場合は TRUE を返します。
msginfo に対応するヘッダリスト hlist は procheader_get_header_list_from_file()
等であらかじめ作成しておいて渡す必要があります。

rule: FilterRule 構造体へのポインタ
msginfo: MsgInfo 構造体へのポインタ
hlist: msginfo に対応する Header 構造体へのポインタのリスト
fltinfo: FilterInfo 構造体へのポインタ
戻り値: rule が msginfo にマッチした場合は TRUE
        マッチしなければ FALSE

------------------------------------------------------------------------------
gboolean filter_rule_requires_full_headers	(FilterRule	*rule);

フィルタルール rule の条件の判定に完全なヘッダ情報が必要かどうかを返します。
これが FALSE の場合は、 filter_match_rule() に渡すヘッダリストに
procheader_get_header_list_from_msginfo() を使用し、処理を軽減できます。

rule: FilterRule 構造体へのポインタ
戻り値: 条件の判定に完全なヘッダ情報が必要な場合は TRUE
        そうでない場合は FALSE

------------------------------------------------------------------------------
GSList *filter_xml_node_to_filter_list	(GNode			*node);

xml_parse_file() でフィルタルールを記述した XML ファイルを読み込んだ結果
から、 FilterRule のリストを生成します。

返ったリストは filter_rule_list_free() で解放する必要があります。

node: xml_parse_file() が生成した XML ツリー
戻り値: FilterRule 構造体へのポインタのリスト

------------------------------------------------------------------------------
GSList *filter_read_file		(const gchar		*file);

フィルタルールを記述した XML ファイル file を読み込み、 FilterRule の
リストを生成します。

file: フィルタルールを記述した XML ファイルへのパス
戻り値: FilterRule 構造体へのポインタのリスト

------------------------------------------------------------------------------
void filter_read_config			(void);

設定ファイルのディレクトリ以下の XML ファイルを読み込み、フィルタルールの
リストを PrefsCommon::fltlist に格納します。

------------------------------------------------------------------------------
void filter_write_file			(GSList			*list,
					 const gchar		*file);

フィルタルールのリスト list の内容を file に XML ファイルとして書き出します。

list: FilterRule 構造体へのポインタのリスト
file: 出力するファイルのパス

------------------------------------------------------------------------------
void filter_write_config		(void);

PrefsCommon::fltlist の内容を設定ファイルのディレクトリ以下に XML ファイル
として書き出します。

------------------------------------------------------------------------------
/* gchar *filter_get_str		(FilterRule		*rule); */
------------------------------------------------------------------------------
/* FilterRule *filter_read_str		(const gchar		*str); */
------------------------------------------------------------------------------
FilterRule *filter_rule_new		(const gchar		*name,
					 FilterBoolOp		 bool_op,
					 GSList			*cond_list,
					 GSList			*action_list);

FilterRule 構造体を作成します。

返った値は filter_rule_free() で解放する必要があります。

name: フィルタルール名
bool_op: AND 条件の場合は FLT_AND
         OR 条件の場合は FLT_OR
cond_list: FilterCond 構造体へのポインタのリスト
action_list: FilterAction 構造体へのポインタのリスト
戻り値: FilterRule 構造体へのポインタ

------------------------------------------------------------------------------
FilterCond *filter_cond_new		(FilterCondType		 type,
					 FilterMatchType	 match_type,
					 FilterMatchFlag	 match_flag,
					 const gchar		*header,
					 const gchar		*value);

FilterCond 構造体を作成します。

返った値は GSList 型のリストに入れた後、 filter_cond_list_free() で
解放する必要があります。

type: 条件のタイプ
match_type: 文字列のマッチタイプ
match_flag: マッチの反転と大小文字の区別の指定
header: ヘッダ文字列(type が FLT_COND_HEADER の場合有効)
value: 条件の値となる文字列

------------------------------------------------------------------------------
FilterAction *filter_action_new		(FilterActionType	 type,
					 const gchar		*str);

FilterAction 構造体を作成します。

返った値は GSList 型のリストに入れた後、 filter_action_list_free() で
解放する必要があります。

type: アクションのタイプ
str: アクションの値となる文字列

------------------------------------------------------------------------------
FilterInfo *filter_info_new		(void);

FilterInfo 構造体を作成します。

返った値は filter_info_free() で解放する必要があります。

戻り値: FilterInfo 構造体へのポインタ

------------------------------------------------------------------------------
void filter_rule_rename_dest_path	(FilterRule		*rule,
					 const gchar		*old_path,
					 const gchar		*new_path);

フィルタルール rule に含まれるアクションの移動先フォルダのパスが
old_path に一致する場合、または old_path が親フォルダに該当する場合は
それを new_path に書き換えます。

rule: FilterRule 構造体へのポインタ
old_path: 置換前のパス
new_path: 置換後のパス

------------------------------------------------------------------------------
void filter_rule_delete_action_by_dest_path
					(FilterRule		*rule,
					 const gchar		*path);

フィルタルール rule に含まれるアクションの移動先フォルダのパスが
path に一致する場合、または path が親フォルダに該当する場合は
そのアクションを削除します。

rule: FilterRule 構造体へのポインタ
path: 削除対象となるフォルダのパス

------------------------------------------------------------------------------
void filter_list_rename_path		(const gchar		*old_path,
					 const gchar		*new_path);

PrefsCommon::fltlist のすべてのルールのアクションの old_path を new_path
に置換します。

old_path: 置換前のパス
new_path: 置換後のパス

------------------------------------------------------------------------------
void filter_list_delete_path		(const gchar		*path);

PrefsCommon::fltlist のすべてのルールのアクションの移動先フォルダが
path に該当するアクションを削除します。アクションが空になった場合は
そのフィルタルールも削除します。

------------------------------------------------------------------------------
void filter_rule_match_type_str_to_enum	(const gchar		*type_str,
					 FilterMatchType	*type,
					 FilterMatchFlag	*flag);

マッチタイプの文字列を enum 型に変換します。

type_str: マッチタイプの文字列
type: FilterMatchType 型の enum 変数へのポインタ
flag: FilterMatchFlag 型の enum 変数へのポインタ

------------------------------------------------------------------------------
void filter_get_keyword_from_msg	(MsgInfo		*msginfo,
					 gchar		       **header,
					 gchar		       **key,
					 FilterCreateType	 type);

メッセージ msginfo からフィルタルールを自動生成するためのヘッダ名と
キー文字列を取得します。 type で対象ヘッダを指定できます。

msginfo: MsgInfo 構造体へのポインタ
header: ヘッダ名を返すためのポインタ
key: キー文字列を返すためのポインタ
type: FilterCreateType 型の値

------------------------------------------------------------------------------
void filter_rule_list_free		(GSList			*fltlist);

FilterRule のリストを解放します。

fltlist: FilterRule 構造体へのポインタのリスト

------------------------------------------------------------------------------
void filter_rule_free			(FilterRule		*rule);

フィルタルール rule を解放します。

rule: FilterRule 構造体へのポインタ

------------------------------------------------------------------------------
void filter_cond_list_free		(GSList			*cond_list);

FilterCond のリストを解放します。

cond_list: FilterCond 構造体へのポインタのリスト

------------------------------------------------------------------------------
void filter_action_list_free		(GSList			*action_list);

FilterAction のリストを解放します。

action_list: FilterAction 構造体へのポインタのリスト

------------------------------------------------------------------------------
void filter_info_free			(FilterInfo		*info);

FilterInfo 構造体を解放します。

info: FilterInfo 構造体へのポインタ
