亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ucontactsync.pas

?? FMA is a free1 powerful phone editing tool allowing users to easily manage all of the personal data
?? PAS
?? 第 1 頁 / 共 3 頁
字號:
unit uContactSync;

{
*******************************************************************************
* Descriptions: Main Contact Sync Unit
* $Source: /cvsroot/fma/fma/uContactSync.pas,v $
* $Locker:  $
*
* Todo:
*   - Let the OOD reflect the xml
*   - Filters on the external contacts
*   - Hash sperate items of a contact so less conflicts arise
*   - Do it using interfaces. IIdentifiable INameble IConflictSolver ISynchronizable
*
* Change Log:
* $Log: uContactSync.pas,v $
*
}

interface

uses
  Contnrs, Classes, TntClasses, SysUtils, TntSysUtils;

resourcestring
  sContactSyncConfirm = '%s.'+sLinebreak+sLinebreak+'Please, confirm to continue.';

const
  MaxCardinal = High(Cardinal);

type
  ESynchronize = class(Exception);

  TContactState = (csUnknown, csUnchanged, csNew, csChanged, csDeleted);
  TContactSollution = (slLeft, slRight, slNeither);
  TContactAction = (caAdd, caUpdate, caDelete, caUnlink);
  TContactActions = set of TContactAction;

  TBaseContact = class(TObject)
  private
    FTitle: WideString;
    FCellPhone: WideString;
    FFaxPhone: WideString;
    FOtherPhone: WideString;
    FOrganization: WideString;
    FEMail: WideString;
    FName: WideString;
    FWorkPhone: WideString;
    FSurName: WideString;
    FHomePhone: WideString;
    FCity: WideString;
    FRegion: WideString;
    FCountry: WideString;
    FStreet: WideString;
    FPostalCode: WideString;
    FBirthday: TDateTime;
    function GetFullName: WideString;
  public
  { REFFERENCE !!!
    TBaseContact = class;
    TFMAContactFieldMapper.Create;
    TContactFieldMapper.LoadStandardFields;
    TOutlookContactSource.Read/Write();
  }
    property Title: WideString read FTitle write FTitle;
    property Name: WideString read FName write FName;
    property SurName: WideString read FSurName write FSurName;
    property Organization: WideString read FOrganization write FOrganization;
    property EMail: WideString read FEMail write FEMail;
    property HomePhone: WideString read FHomePhone write FHomePhone;
    property WorkPhone: WideString read FWorkPhone write FWorkPhone;
    property CellPhone: WideString read FCellPhone write FCellPhone;
    property FaxPhone: WideString read FFaxPhone write FFaxPhone;
    property OtherPhone: WideString read FOtherPhone write FOtherPhone;
    property Street: WideString read FStreet write FStreet;
    property City: WideString read FCity write FCity;
    property Region: WideString read FRegion write FRegion;
    property PostalCode: WideString read FPostalCode write FPostalCode;
    property Country: WideString read FCountry write FCountry;

    property Birthday: TDateTime read FBirthday write FBirthday;

    property FullName: WideString read GetFullName;
  end;

  TContactSource = class;

  TContact = class(TBaseContact)
  private
    FSyncID: Cardinal;
    FID: Variant;
    FSyncHash: Cardinal;
    FLinkedContact: TContact;
    FSynchronized: Boolean;
    FContactSource: TContactSource;
    function GetHash: Cardinal;
  protected
    function GetHashString: String; virtual;
    function Exists: Boolean; virtual; abstract;
  public
    constructor Create(ContactSource: TContactSource);

    property ContactSource: TContactSource read FContactSource write FContactSource;

    property Synchronized: Boolean read FSynchronized write FSynchronized;

    property SyncID: Cardinal read FSyncID write FSyncID;
    property ID: Variant read FID write FID;
    property SyncHash: Cardinal read FSyncHash write FSyncHash;
    property Hash: Cardinal read GetHash;
    property LinkedContact: TContact read FLinkedContact write FLinkedContact;

    function IsUnchanged: Boolean;
    function IsNew: Boolean; virtual;
    function IsChanged: Boolean; virtual;
    function IsDeleted: Boolean; virtual;
    function GetContactState: TContactState;

    procedure Clone(Value: TContact);
  end;

  TContacts = class
  private
    FList: TObjectList;
    function GetItem(Index: Integer): TContact;
    function GetCount: Integer;
    procedure PutItem(Index: Integer; const Value: TContact);
  public
    constructor Create;
    destructor Destroy; override;

    function Add(Item: TContact): Integer;
    procedure Clear;
    procedure Delete(Index: Integer);
    procedure Remove(Item: TContact);
    function IndexOf(Item: TContact): Integer;
    property Count: Integer read GetCount;
    property Items[Index: Integer]: TContact read GetItem write PutItem; default;
    function FindByID(ID: Variant): TContact;
    function FindBySyncID(SyncID: Cardinal): TContact;
  end;

  TContactFieldMapper = class
  private
    FMappedFields: TStrings;
    FFields: TStrings;
    FStandardFields: TStrings;

    function GetCellPhone: WideString;
    function GetEMail: WideString;
    function GetFaxPhone: WideString;
    function GetHomePhone: WideString;
    function GetName: WideString;
    function GetOrganization: WideString;
    function GetOtherPhone: WideString;
    function GetSurName: WideString;
    function GetTitle: WideString;
    function GetWorkPhone: WideString;
    procedure SetCellPhone(const Value: WideString);
    procedure SetEMail(const Value: WideString);
    procedure SetFaxPhone(const Value: WideString);
    procedure SetHomePhone(const Value: WideString);
    procedure SetName(const Value: WideString);
    procedure SetOrganization(const Value: WideString);
    procedure SetOtherPhone(const Value: WideString);
    procedure SetSurName(const Value: WideString);
    procedure SetTitle(const Value: WideString);
    procedure SetWorkPhone(const Value: WideString);
    function GetCity: WideString;
    function GetCountry: WideString;
    function GetPostalCode: WideString;
    function GetRegion: WideString;
    function GetStreet: WideString;
    procedure SetCity(const Value: WideString);
    procedure SetCountry(const Value: WideString);
    procedure SetPostalCode(const Value: WideString);
    procedure SetRegion(const Value: WideString);
    procedure SetStreet(const Value: WideString);

    function GetMappedField(Field: String): String;
    procedure SetMappedFields(const Value: TStrings);
    function GetMappedValue(Field: String): Variant;
    procedure SetMappedValue(Field: String; const AValue: Variant);
    procedure SetFields(const Value: TStrings);

    procedure LoadStandardFields;
    function GetBirthday: TDateTime;
    procedure SetBirthday(const Value: TDateTime);
  protected
    function GetVariant(Field: String): Variant; virtual; abstract;
    procedure SetVariant(Field: String; const Value: Variant); virtual; abstract;
  public
    constructor Create;
    destructor Destroy; override;

    property Title: WideString read GetTitle write SetTitle;
    property Name: WideString read GetName write SetName;
    property SurName: WideString read GetSurName write SetSurName;
    property Organization: WideString read GetOrganization write SetOrganization;
    property EMail: WideString read GetEMail write SetEMail;
    property HomePhone: WideString read GetHomePhone write SetHomePhone;
    property WorkPhone: WideString read GetWorkPhone write SetWorkPhone;
    property CellPhone: WideString read GetCellPhone write SetCellPhone;
    property FaxPhone: WideString read GetFaxPhone write SetFaxPhone;
    property OtherPhone: WideString read GetOtherPhone write SetOtherPhone;
    property Street: WideString read GetStreet write SetStreet;
    property City: WideString read GetCity write SetCity;
    property Region: WideString read GetRegion write SetRegion;
    property PostalCode: WideString read GetPostalCode write SetPostalCode;
    property Country: WideString read GetCountry write SetCountry;

    property Birthday: TDateTime read GetBirthday write SetBirthday;

    property Fields: TStrings read FFields write SetFields;
    property MappedField[Field: String]: String read GetMappedField;
    property MappedFields: TStrings read FMappedFields write SetMappedFields;
    property VariantValue[Field: String]: Variant read GetVariant write SetVariant;
    property MappedValue[Field: String]: Variant read GetMappedValue write SetMappedValue;
    property StandardFields: TStrings read FStandardFields;
  end;

  TContactSource = class
  private
    FContacts: TContacts;
    FConfirmActions: TContactActions;
    FFieldMapper: TContactFieldMapper;
  protected
    function GetName: String; virtual; abstract;
    function DeformatPhoneNumber(PhoneNumber: String): String; virtual;
  public
    constructor Create;
    destructor Destroy; override;

    property FieldMapper: TContactFieldMapper read FFieldMapper write FFieldMapper;

    property Name: String read GetName;

    property Contacts: TContacts read FContacts;

    function New: TContact; virtual; abstract;
    function Add(Value: TContact): TContact; virtual; abstract;
    procedure Update(Contact, Value: TContact); virtual; abstract;
    procedure Delete(Contact: TContact); virtual; abstract;
    function Find(SyncID: Cardinal): TContact;
    procedure Unlink(Contact: TContact); virtual;

    procedure Load; virtual; abstract;

    property ConfirmActions: TContactActions read FConfirmActions write FConfirmActions;
  end;

  TPossibleLink = class
  private
    FScore: Integer;
    FContact: TContact;
  public
    property Contact: TContact read FContact write FContact;
    property Score: Integer read FScore write FScore;
  end;

  TPossibleLinks = class
  private
    FList: TObjectList;
    function GetItem(Index: Integer): TPossibleLink;
    function GetCount: Integer;
    procedure PutItem(Index: Integer; const Value: TPossibleLink);
  public
    constructor Create;
    destructor Destroy; override;

    function Add(Contact: TContact; Score: Integer): Integer;
    procedure Clear;
    procedure Delete(Index: Integer);
    procedure Remove(Item: TPossibleLink);
    function IndexOf(Item: TPossibleLink): Integer;
    property Count: Integer read GetCount;
    property Items[Index: Integer]: TPossibleLink read GetItem write PutItem; default;
    procedure Sort;
  end;

  TSyncContactsConflictEvent = procedure(Sender: TObject; Contact,OtherContact: TContact;
    const Description: WideString; const Item0Name, Item1Name: WideString; var SelectedItem: Integer) of object;
  TSyncContactsFirstTimeEvent = procedure(Sender: TObject; var Continue: Boolean) of object;
  TSyncContactsErrorEvent = procedure(Sender: TObject; const Message: String) of object;
  TSyncContactsConfirmEvent = procedure(Sender: TObject; Contact: TContact; Action: TContactAction;
    const Description: WideString; var Confirmed: Boolean) of object;
  TSyncContactsChooseContactEvent = procedure(Sender: TObject; Contact: TContact; PossibleLinks: TPossibleLinks;
    var OtherContact: TContact) of object;

  TSynchronizeContacts = class
  private
    FFMA: TContactSource;
    FExtern: TContactSource;
    FFileName: String;
    FOnConflict: TSyncContactsConflictEvent;
    FSWitched: Boolean;
    FOnFirstTime: TSyncContactsFirstTimeEvent;
    FOnError: TSyncContactsErrorEvent;
    FOnConfirm: TSyncContactsConfirmEvent;
    FOnChooseLink: TSyncContactsChooseContactEvent;
    procedure DoSynchronize(Left, Right: TContactSource);
    function CalculateLinkScore(Contact, OtherContact: TContact): Integer;
    function FindLink(Contact: TContact; OtherSource: TContactSource): TContact;
    function Conflict(Left, Right: TContact): TContactSollution;
    function Confirm(Action: TContactAction; Source: TContactSource; Contact: TContact): Boolean;
    function BuildCompareDescription(Contact, OtherContact: TContact): WideString;
    function BuildActionDescription(Action: TContactAction; Source: TContactSource; Contact: TContact): WideString;
    function Add(Source: TContactSource; Value: TContact): TContact;
    procedure Update(Source: TContactSource; Contact, Value: TContact);
    procedure Delete(Source: TContactSource; Contact, OtherContact: TContact);
    procedure Link(Contact, OtherContact: TContact);
  protected
    procedure DoConflict(Contact,OtherContact: TContact;
      const Description: WideString; const Item0Name, Item1Name: String;
      var SelectedItem: Integer); virtual;
    function DoFirstTime: Boolean; virtual;
    procedure DoError(const Message: String); virtual;
    procedure DoConfirm(Contact: TContact; Action: TContactAction;
      const Description: WideString; var Confirmed: Boolean); virtual;
    procedure DoChooseLink(Contact: TContact; PossibleLinks: TPossibleLinks; var OtherContact: TContact); virtual;
  public
    property FileName: String read FFileName write FFileName;
    property FMA: TContactSource read FFMA write FFMA;
    property Extern: TContactSource read FExtern write FExtern;
    property OnConflict: TSyncContactsConflictEvent read FOnConflict write FOnConflict;
    property OnFirstTime: TSyncContactsFirstTimeEvent read FOnFirstTime write FOnFirstTime;
    property OnError: TSyncContactsErrorEvent read FOnError write FOnError;
    property OnConfirm: TSyncContactsConfirmEvent read FOnConfirm write FOnConfirm;
    property OnChooseLink: TSyncContactsChooseContactEvent read FOnChooseLink write FOnChooseLink;

    procedure Load;
    procedure Synchronize;
    procedure Save;

    procedure Unlink(CDID: TGUID);
  end;

implementation

uses
  gnugettext, gnugettexthelpers, uLogger, uConnProgress, uThreadSafe,
  Forms, TntForms, Variants, uXMLContactSync, CRC32, uSyncPhonebook, Unit1;

{ TSynchronizeContacts }

procedure TSynchronizeContacts.DoSynchronize(Left, Right: TContactSource);
var I: Integer;
    LeftContact, RightContact: TContact;
    LeftState, RightState: TContactState;
    Sollution: TContactSollution;
begin
  for I := 0 to Left.Contacts.Count - 1 do begin
    LeftContact := Left.Contacts[I];
    if not LeftContact.Synchronized then begin
      LeftState := LeftContact.GetContactState;

      RightContact := LeftContact.LinkedContact;

      if LeftState = csNew then begin
        RightContact := FindLink(LeftContact, Right);
        if Assigned(RightContact) then
          Link(LeftContact, RightContact)
        else
          Add(Right, LeftContact);
      end
      else begin
        if not Assigned(RightContact) then
          raise ESynchronize.Create(_('Linked contact not found'));

        RightState := RightContact.GetContactState;

        if LeftState = csChanged then begin
          if RightState = csUnchanged then begin
            Update(Right, RightContact, LeftContact);
          end
          else if RightState = csChanged then begin
            Sollution := Conflict(LeftContact, RightContact);
            if Sollution = slLeft then begin
              Update(Right, RightContact, LeftContact);
            end
            else if Sollution = slRight then begin
              Update(Left, LeftContact, RightContact);
            end;
          end
          else if RightState = csDeleted then begin
            Sollution := Conflict(LeftContact, RightContact);
            if Sollution = slLeft then begin
              Add(Right, LeftContact);
            end
            else if Sollution = slRight then begin
              Delete(Left, LeftContact, RightContact);
            end;
          end;
        end
        else if LeftState = csDeleted then begin
          if RightState = csUnchanged then begin
            Delete(Right, RightContact, LeftContact);
          end
          else if RightState = csChanged then begin
            Sollution := Conflict(LeftContact, RightContact);
            if Sollution = slLeft then begin
              Delete(Right, RightContact, LeftContact);
            end
            else if Sollution = slRight then begin
              Add(Left, RightContact);
            end;
          end;
        end;
      end;
    end;
    { Allow synchronization to be canceled }
    Application.ProcessMessages;
    if ThreadSafe.AbortDetected then Abort;
  end;
end;

procedure TSynchronizeContacts.Synchronize;
begin
  Log.AddSynchronizationMessage(_('Synchronize started'));
  try
    FSwitched := False;
    DoSynchronize(FMA, Extern);
    FSwitched := True;
    DoSynchronize(Extern, FMA);

    Log.AddSynchronizationMessage(_('Synchronize completed'));
  except
    on E: ESynchronize do begin
      Log.AddSynchronizationMessageFmt(_('Synchronize error: %s'), [E.Message], lsError);
      DoError(E.Message);
    end;
  end;
end;

function TSynchronizeContacts.Conflict(Left, Right: TContact): TContactSollution;
var Contact, OtherContact: TContact;
    SelectedItem: Integer;
    Description: WideString;
begin
  if FSwitched then begin
    Contact := Right;
    OtherContact := Left;
  end
  else begin
    Contact := Left;
    OtherContact := Right;
  end;
  SelectedItem := 0;
  Description := BuildCompareDescription(Contact, OtherContact);
  Log.AddSynchronizationMessageFmt(_('%s has a conflict: %s'), [Contact.FullName, Description], lsDebug);
  DoConflict(Contact, OtherContact, Description, Contact.ContactSource.Name, Contact.LinkedContact.ContactSource.Name, SelectedItem);
  case SelectedItem of
    0: begin
      if Contact = Left then
        Result := slLeft
      else
        Result := slRight;
      Log.AddSynchronizationMessageFmt(_('Conflict has been solved in favor of %s'), [Contact.ContactSource.Name], lsDebug);
    end;
    1: begin

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人av免费在线播放| 一区二区三区欧美激情| 久久99国产精品麻豆| 91精品国产入口在线| 免费人成精品欧美精品 | 国产亚洲精品7777| 国产一区二区电影| 国产精品麻豆99久久久久久| av亚洲精华国产精华| 国产呦萝稀缺另类资源| 日韩区在线观看| 国产一区二区女| 自拍偷自拍亚洲精品播放| 欧美网站一区二区| 蜜臀a∨国产成人精品| 欧美国产一区在线| 91国内精品野花午夜精品| 日韩制服丝袜av| 国产精品网站导航| 欧美色综合网站| 久久国产婷婷国产香蕉| 国产精品久久久久久亚洲毛片| 99re这里只有精品6| 日韩二区在线观看| 欧美高清在线一区| 欧美日韩国产色站一区二区三区| 久久精品国产99国产精品| 中文字幕日韩av资源站| 欧美男人的天堂一二区| 成人午夜短视频| 五月激情六月综合| 国产精品久久久久久久久久久免费看 | 亚洲va韩国va欧美va| 精品国产99国产精品| 日本精品免费观看高清观看| 卡一卡二国产精品| 亚洲精品国产a久久久久久| 日韩欧美精品三级| 91国偷自产一区二区使用方法| 精东粉嫩av免费一区二区三区| 亚洲同性gay激情无套| 精品日韩成人av| 欧美日韩免费电影| 94-欧美-setu| 国产精品18久久久久久vr| 亚洲va韩国va欧美va| 亚洲色图20p| 国产欧美视频在线观看| 日韩精品一区二| 欧美视频一区二区三区在线观看| 国产成人在线观看| 久久国产精品免费| 五月婷婷综合网| 亚洲欧美精品午睡沙发| 国产欧美一二三区| 精品国产99国产精品| 日韩一区二区三区四区五区六区| 91久久精品国产91性色tv| 国产福利一区二区三区| 麻豆精品在线播放| 男女激情视频一区| 婷婷综合在线观看| 午夜欧美大尺度福利影院在线看| 亚洲女同一区二区| 中文字幕字幕中文在线中不卡视频| 久久婷婷成人综合色| 欧美v国产在线一区二区三区| 91精品国产综合久久福利| 欧美色老头old∨ideo| 色狠狠色狠狠综合| 91黄色激情网站| 日本高清不卡一区| 色成人在线视频| 在线中文字幕一区二区| 色狠狠桃花综合| 欧美私人免费视频| 欧美日韩在线播放一区| 91黄视频在线观看| 欧美视频一区二区| 69精品人人人人| 日韩午夜中文字幕| 精品久久久影院| 26uuu国产电影一区二区| 久久久九九九九| 日本一区二区在线不卡| 国产精品毛片高清在线完整版| 国产精品免费人成网站| 亚洲色图视频网| 亚洲电影一级片| 日日摸夜夜添夜夜添亚洲女人| 日本网站在线观看一区二区三区| 美女被吸乳得到大胸91| 国产精一品亚洲二区在线视频| 国产毛片精品国产一区二区三区| 国产成人综合网站| 91丨porny丨户外露出| 欧美亚洲动漫精品| 日韩欧美123| 国产精品久久久久久久久动漫| 亚洲伦理在线精品| 日本美女一区二区三区视频| 国产在线国偷精品免费看| 成人av网站免费| 欧美性做爰猛烈叫床潮| 日韩一区二区免费视频| 欧美激情在线一区二区| 一区二区三区蜜桃网| 欧美96一区二区免费视频| 国产69精品久久777的优势| 一本大道av一区二区在线播放| 欧美精三区欧美精三区| 国产亚洲欧洲997久久综合| 亚洲另类春色校园小说| 蜜桃传媒麻豆第一区在线观看| 国产99久久久久久免费看农村| 91国偷自产一区二区开放时间| 日韩一级二级三级| 成人免费在线播放视频| 欧美96一区二区免费视频| 成人91在线观看| 日韩欧美中文一区二区| 亚洲婷婷国产精品电影人久久| 免费欧美在线视频| 色呦呦日韩精品| 久久久亚洲精品石原莉奈| 洋洋av久久久久久久一区| 国产精品综合在线视频| 欧美日韩精品一区二区在线播放| 久久精品人人爽人人爽| 无码av免费一区二区三区试看| 福利91精品一区二区三区| 这里是久久伊人| 亚洲精品久久久蜜桃| 国产激情一区二区三区桃花岛亚洲| 欧美色综合影院| 中文字幕人成不卡一区| 极品少妇xxxx精品少妇偷拍| 欧美中文字幕不卡| 中文字幕日韩一区二区| 国产在线精品不卡| 日韩免费观看高清完整版 | 91女人视频在线观看| 欧美成人高清电影在线| 亚洲第一狼人社区| 一本大道久久a久久精二百| 国产欧美一区二区三区沐欲| 免播放器亚洲一区| 欧美主播一区二区三区美女| 中文字幕一区在线观看视频| 激情五月播播久久久精品| 88在线观看91蜜桃国自产| 一区av在线播放| 91片黄在线观看| 亚洲视频你懂的| 丁香另类激情小说| 国产女人18毛片水真多成人如厕| 美女视频黄a大片欧美| 欧美一区二区三区色| 五月天激情小说综合| 欧美三级韩国三级日本一级| 一区二区三区在线播| 一本久道久久综合中文字幕| 国产精品国产成人国产三级 | 欧美一区二区三区视频免费| 亚洲国产视频一区二区| 欧美性受xxxx黑人xyx| 亚洲免费av高清| 色欧美日韩亚洲| 亚洲久草在线视频| 欧美视频一区二区三区在线观看 | 欧美日本在线观看| 亚洲成人激情社区| 欧美久久久久免费| 蜜桃视频一区二区| 26uuu欧美日本| 国产.欧美.日韩| 亚洲欧洲成人自拍| 色综合久久九月婷婷色综合| 亚洲自拍偷拍网站| 欧美久久久久久蜜桃| 久久精品国产精品青草| 久久天天做天天爱综合色| 成人永久免费视频| 亚洲精品欧美激情| 美国三级日本三级久久99| 波多野结衣中文字幕一区二区三区| 国产精品美日韩| 国产精品一二二区| 亚洲国产电影在线观看| 色综合中文字幕| 亚洲国产成人高清精品| 日韩你懂的在线观看| 国产不卡视频一区二区三区| 日韩码欧中文字| 91精品国产综合久久久久| 精品一区二区三区久久| 中文字幕欧美国产| 欧美伊人久久大香线蕉综合69 | 91影院在线免费观看| 亚洲线精品一区二区三区|