uRulerMgr.pas
上传用户:yjb1804
上传日期:2021-01-30
资源大小:3105k
文件大小:9k
源码类别:

Email服务器

开发平台:

Delphi

  1. unit uRulerMgr;
  2. interface
  3. uses Classes,SysUtils,RegExpr,Dialogs;
  4. type
  5.   TRuleArea = (raSubject,raTo,raFrom,raCC,raCB,{raFromName,raFromAddress,raStatus,}raBody,raHeader);
  6.   TRuleCompare = (rcContains,rcEquals,rcEmpty,rcRegExpr);                                   
  7.   TRuleRow = class(TCollectionItem)
  8.   private
  9.     FArea : TRuleArea;
  10.     FCompare : TRuleCompare;
  11.     FText : string;
  12.   protected
  13.     procedure AssignTo(Dest: TPersistent); override;
  14.   published
  15.     property  Area:TRuleArea  read FArea write FArea;
  16.     property  Compare:TRuleCompare  read FCompare write FCompare;
  17.     property  Text:string  read FText write FText;
  18.   end;
  19.   //--------------------------------------------------------------- Rule Rows --
  20.   TRuleRows = class(TCollection)
  21.   private
  22.     function GetItem(Index: Integer): TRuleRow;
  23.     procedure SetItem(Index: Integer; Value: TRuleRow);
  24.   public
  25.     constructor Create;
  26.     function Add: TRuleRow;
  27.   
  28.     property Items[Index: Integer]: TRuleRow read GetItem write SetItem; default;
  29.   end;
  30.   TRuleAction=class(TPersistent)
  31.   private
  32.     FDeleteOnServer:Boolean;
  33.     FIgnoreNotRecv:Boolean;
  34.     FPopTip:Boolean;
  35.     FPlaySound:String;
  36.     FRunExe:String;
  37.   protected
  38.     procedure AssignTo(Dest: TPersistent);override;
  39.   published
  40.     property  DeleteOnServer:Boolean  read FDeleteOnServer write FDeleteOnServer default false;
  41.     property  IgnoreNotRecv:Boolean  read FIgnoreNotRecv write FIgnoreNotRecv default False;
  42.     property  PopTip:Boolean read FPopTip write FPopTip default True ;
  43.     property  PlaySound:String  read FPlaySound write FPlaySound;
  44.     property  RunExe:String  read FRunExe write FRunExe;
  45.   end;
  46.   //--------------------------------------------------------------- Rule Item --
  47.   TRuleItem = class(TCollectionItem)
  48.   private
  49.     FName : ShortString;   //规则名称
  50.     FEnabled : boolean;    // 启用该规则
  51.     FUseToNewEmail : boolean;    //用于新邮件
  52.     FAccount : String; //只适用于该账号的邮件
  53.     FAllAccount:Boolean; //使用于所有邮件
  54.     FRulerAction:TRuleAction;
  55.     FRows : TRuleRows;
  56.     procedure SetRows(const Value: TRuleRows);
  57.     procedure SetRulerAction(const Value: TRuleAction);
  58.   protected
  59.     procedure AssignTo(Dest: TPersistent); override;
  60.   public
  61.     constructor Create(Collection: TCollection); override;
  62.     destructor Destroy;override;
  63.   published
  64.     property  Name:ShortString  read FName write FName;
  65.     property  Enabled : boolean  read FEnabled write FEnabled;
  66.     property  UseToNewEmail : boolean read FUseToNewEmail write FUseToNewEmail;
  67.     property  Account : String  read FAccount write FAccount;
  68.     property  AllAccount:Boolean  read FAllAccount write FAllAccount;
  69.     property  RulerAction:TRuleAction  read FRulerAction write SetRulerAction;
  70.     property  Rows : TRuleRows read FRows write SetRows;
  71.   end;
  72.   //--------------------------------------------------------------- Rule Items --
  73.   TRuleItems = class(TCollection)
  74.   private
  75.     function GetItem(Index: Integer): TRuleItem;
  76.     procedure SetItem(Index: Integer; Value: TRuleItem);
  77.   protected
  78.     //procedure AssignTo(Dest: TPersistent); override;
  79.   public
  80.     constructor Create;
  81.     function Add: TRuleItem;
  82.     procedure Move(CurIndex, NewIndex: Integer);
  83.     
  84.     procedure SaveToFile(AFileName:string);
  85.     class procedure ReadFromFile(AFileName:string;var Return:TRuleItems); // 从文件中载入规则
  86.     class procedure AppendFromFile(AFileName:string;var Return:TRuleItems); // 从文件中载入规则 (不删除Return中以前存在的规则)
  87.     property Items[Index: Integer]: TRuleItem read GetItem write SetItem; default;
  88.     procedure Assign(Source: TPersistent); override;
  89.   end;
  90. implementation
  91. uses NativeXmlObjectStorage, NativeXml, uCommon;
  92. { TRuleRow }
  93. procedure TRuleRow.AssignTo(Dest: TPersistent);
  94. begin
  95.   if Dest is TRuleRow then
  96.     with TRuleRow(Dest) do
  97.     begin
  98.       Area := self.Area;
  99.       Compare := self.Compare;
  100.       Text := self.Text;
  101.     end
  102.   else
  103.     inherited AssignTo(Dest);
  104. end;
  105. { TRuleRows }
  106. constructor TRuleRows.Create;
  107. begin
  108.   inherited Create(TRuleRow);
  109. end;
  110. function TRuleRows.Add: TRuleRow;
  111. begin
  112.   Result := TRuleRow(inherited Add);
  113. end;
  114. function TRuleRows.GetItem(Index: Integer): TRuleRow;
  115. begin
  116.   Result := TRuleRow(inherited GetItem(Index));
  117. end;
  118. procedure TRuleRows.SetItem(Index: Integer; Value: TRuleRow);
  119. begin
  120.   inherited SetItem(Index, Value);
  121. end;
  122. { TRuleItem }
  123. constructor TRuleItem.Create(Collection: TCollection);
  124. begin
  125.   inherited Create(Collection);
  126.   FRows := TRuleRows.Create;
  127.   FRulerAction:=TRuleAction.Create;
  128. end;
  129. procedure TRuleItem.AssignTo(Dest: TPersistent);
  130. var
  131.   I:Integer;
  132. begin
  133.   if Dest is TRuleItem then
  134.   begin
  135.     TRuleItem(Dest).Name := Self.Name;
  136.     TRuleItem(Dest).Enabled := Self.Enabled;    // 启用该规则
  137.     TRuleItem(Dest).UseToNewEmail:= Self.UseToNewEmail;    //用于新邮件
  138.     TRuleItem(Dest).Account:= Self.Account; //只适用于次邮件
  139.     TRuleItem(Dest).AllAccount:= Self.AllAccount; //使用于所有邮件
  140.     TRuleItem(Dest).RulerAction.Assign(Self.RulerAction);
  141.     for I:=0 to Self.Rows.Count-1 do
  142.       TRuleItem(Dest).Rows.Add.Assign(FRows.Items[I]);
  143.     //Rows.Assign(FRows);
  144.   end
  145.   else inherited AssignTo(Dest);
  146. end;
  147. destructor TRuleItem.Destroy;
  148. begin
  149.   FRows.Free;
  150.   FRulerAction.Free;
  151.   inherited;
  152. end;
  153. procedure TRuleItem.SetRows(const Value: TRuleRows);
  154. begin
  155.   if FRows<>Value then   FRows.Assign(Value);
  156. end;
  157. procedure TRuleItem.SetRulerAction(const Value: TRuleAction);
  158. begin
  159.   if FRulerAction <>Value then  FRulerAction.Assign(Value);
  160. end;
  161. { TRuleItems }
  162. constructor TRuleItems.Create;
  163. begin
  164.   inherited Create(TRuleItem);
  165. end;
  166. function TRuleItems.Add: TRuleItem;
  167. begin
  168.   Result := TRuleItem(inherited Add);
  169. end;
  170. function TRuleItems.GetItem(Index: Integer): TRuleItem;
  171. begin
  172.   Result := TRuleItem(inherited GetItem(Index));
  173. end;
  174. procedure TRuleItems.SetItem(Index: Integer; Value: TRuleItem);
  175. begin
  176.   inherited SetItem(Index, Value);
  177. end;
  178. procedure TRuleItems.Move(CurIndex, NewIndex: Integer);
  179. var
  180.   TempItem: TRuleItem;
  181. begin
  182.   if CurIndex <> NewIndex then
  183.   begin
  184.     BeginUpdate;
  185.     try
  186.       TempItem := TRuleItem.Create(nil);
  187.       try
  188.         TempItem.Assign(GetItem(CurIndex));
  189.         Delete(CurIndex);
  190.         Insert(NewIndex);
  191.         SetItem(NewIndex,TempItem);
  192.       finally
  193.         TempItem.Free;
  194.       end;
  195.     finally
  196.       EndUpdate;
  197.     end;
  198.   end;
  199. end;
  200. class procedure TRuleItems.ReadFromFile(AFileName: string;var Return:TRuleItems );
  201. var
  202.   AReader :TsdXmlObjectReader;
  203.   xml:TNativeXml;
  204.   Item:TRuleItem;
  205.   I:Integer;
  206.   Node:TXmlNode;
  207. begin
  208.   Return.Clear;
  209.   xml := TNativeXml.Create;
  210.   try
  211.     try
  212.       xml.LoadFromFile(AFileName);
  213.       AReader := TsdXmlObjectReader.Create;
  214.       try
  215.         AReader.ReadObject(xml.Root, Return, nil);
  216.         I:=0;
  217.         Node:=xml.Root.FindNode('TRuleItem'+inttostr(I));
  218.         while Node<>nil do
  219.         begin
  220.           Item:=Return.Add;
  221.           AReader.ReadObject(Node, Item, nil);
  222.           WriteLog('read object TRuleItem. Rows Count:' +inttostr(Return.Items[I].Rows.Count));
  223.           Inc(I);
  224.           Node:=xml.Root.FindNode('TRuleItem'+inttostr(I));
  225.         end;
  226.       finally
  227.         AReader.Free;
  228.       end;
  229.     except
  230.       raise Exception.Create(Format('文件%S'#$D#$A'不是规则文件,或者已经被破坏或篡改。',[AFileName]));
  231.     end;
  232.   finally
  233.     xml.Free;
  234.   end;
  235. end;
  236. procedure TRuleItems.SaveToFile(AFileName: string);
  237. var
  238.   AWriter:TsdXmlObjectWriter;
  239.   xml:TNativeXml;
  240.   I:Integer;
  241.   Item:TRuleItem;
  242.   Node:TXmlNode;
  243. begin
  244.   xml := TNativeXml.CreateName('Root');
  245.   try
  246.     //xml.Utf8Encoded := True;
  247.     xml.EncodingString := 'GB2312';
  248.     
  249.     AWriter := TsdXmlObjectWriter.Create;
  250.     try
  251.       AWriter.WriteObject(xml.Root, Self, nil);
  252.       for I:=0 to Self.Count-1 do
  253.       begin
  254.         Item:=TRuleItem(Self.Items[I]);
  255.         Node:=xml.Root.NodeNew('TRuleItem'+InttoStr(I));
  256.         AWriter.WriteObject(Node, Item,nil);
  257.       end;  
  258.     finally
  259.       AWriter.Free;
  260.     end;
  261.     xml.SaveToFile(AFileName);
  262.   finally
  263.     xml.Free;
  264.   end;
  265. end;
  266. class procedure TRuleItems.AppendFromFile(AFileName: string;
  267.   var Return: TRuleItems);
  268. var
  269.    temp: TRuleItems;
  270.    I:Integer;
  271. begin
  272.   temp:=TRuleItems.Create;
  273.   try
  274.     TRuleItems.ReadFromFile(AFileName,temp);
  275.     for I:=0 to temp.Count-1 do
  276.     begin
  277.       with Return.Add do
  278.         Assign(temp.Items[I]);
  279.     end;
  280.   finally
  281.     temp.Free;
  282.   end;
  283. end;
  284. procedure TRuleItems.Assign(Source: TPersistent);
  285. var
  286.   I: Integer;
  287.   ri:TRuleItem ;
  288. begin
  289.   if Source is TCollection then
  290.   begin
  291.     BeginUpdate;
  292.     try
  293.       Clear;
  294.       for I := 0 to TCollection(Source).Count - 1 do
  295.       begin
  296.         ri:=TRuleItem(Add);
  297.         ri.Assign(TRuleItems(Source).Items[I]);
  298.       end;
  299.     finally
  300.       EndUpdate;
  301.     end;
  302.     Exit;
  303.   end;
  304.   inherited Assign(Source);
  305. end;
  306. { TRuleAction }
  307. procedure TRuleAction.AssignTo(Dest: TPersistent);
  308. begin
  309.   if Dest is TRuleAction then
  310.   begin
  311.     TRuleAction(Dest).DeleteOnServer:=DeleteOnServer;
  312.     TRuleAction(Dest).IgnoreNotRecv:=IgnoreNotRecv;
  313.     TRuleAction(Dest).PopTip:=PopTip;
  314.     TRuleAction(Dest).PlaySound:=PlaySound;
  315.     TRuleAction(Dest).RunExe:=RunExe;
  316.   end
  317.   else
  318.     inherited;
  319. end;
  320. end.