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

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

?? ucontactsync.pas

?? FMA is a free1 powerful phone editing tool allowing users to easily manage all of the personal data
?? PAS
?? 第 1 頁 / 共 3 頁
字號:
      if Contact = Left then
        Result := slRight
      else
        Result := slLeft;
      Log.AddSynchronizationMessageFmt(_('Conflict has been solved in favor of %s'), [Contact.LinkedContact.ContactSource.Name], lsDebug);
    end;
    else begin
      Result := slNeither;
      Log.AddSynchronizationMessage(_('Conflict has not been solved'), lsDebug);
    end;
  end;
end;

procedure TSynchronizeContacts.Load;
var XMLContactSync: IXMLFmaSyncType;
    XMLContact: IXMLContactType;
    I: Integer;
    FMAContact: TContact;
    ExternContact: TContact;
begin
  Log.AddSynchronizationMessage(_('Loading started'), lsDebug);
  try
    if FileExists(FFileName) then begin
      XMLContactSync := Loadfmasync(FFileName);
      for I := 0 to XMLContactSync.Count - 1 do begin
        XMLContact := XMLContactSync.Contact[I];

        FMAContact := FMA.New;
        FMAContact.SyncID := XMLContact.SyncID;
        FMAContact.ID := XMLContact.FMA.ID;
        FMAContact.SyncHash := StrToInt(XMLContact.FMA.Hash);
        FMA.Contacts.Add(FMAContact);

        ExternContact := Extern.New;
        ExternContact.SyncID := XMLContact.SyncID;
        ExternContact.ID := XMLContact.Extern.ID;
        ExternContact.SyncHash := StrToInt(XMLContact.Extern.Hash);
        Extern.Contacts.Add(ExternContact);

        FMAContact.LinkedContact := ExternContact;
        ExternContact.LinkedContact := FMAContact;

        Application.ProcessMessages;
      end;
      Log.AddSynchronizationMessageFmt(_('Loaded %d contacts from XML'), [XMLContactSync.Count], lsDebug);
    end
    else
      if not DoFirstTime then Abort;

    FMA.Load;
    Extern.Load;

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

procedure TSynchronizeContacts.Save;
var XMLContactSync: IXMLFmaSyncType;
    XMLContact: IXMLContactType;
    I: Integer;
    FMAContact: TContact;
    ExternContact: TContact;
    ID: Integer;
begin
  Log.AddSynchronizationMessage(_('Saving started'), lsDebug);
  try
    XMLContactSync := Newfmasync;

    ID := 0;

    for I := 0 to FMA.Contacts.Count - 1 do begin
      FMAContact := FMA.Contacts[I];
      ExternContact := FMAContact.LinkedContact;

      if Assigned(ExternContact) and (not FMAContact.IsDeleted) and (not ExternContact.IsDeleted) then begin
        XMLContact := XMLContactSync.Add;
        XMLContact.SyncID := ID;

        XMLContact.FMA.ID := FMAContact.ID;
        XMLContact.FMA.Hash := '$' + IntToHex(FMAContact.Hash, 8);

        XMLContact.Extern.ID := ExternContact.ID;
        XMLContact.Extern.Hash := '$' + IntToHex(ExternContact.Hash, 8);

        Inc(ID);
      end;

      Application.ProcessMessages;
    end;

    XMLContactSync.OwnerDocument.SaveToFile(FFileName);

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

procedure TSynchronizeContacts.DoConflict(Contact,OtherContact: TContact; const Description:
    WideString; const Item0Name, Item1Name: String; var SelectedItem: Integer);
begin
  SelectedItem := 0;

  if Assigned(FOnConflict) then
    FOnConflict(Self, Contact, OtherContact, Description, Item0Name, Item1Name, SelectedItem);
  {
  if SelectedItem = -1 then
    SelectedItem := 0;
  }
end;

function TSynchronizeContacts.DoFirstTime: Boolean;
begin
  Result := True;
  
  if Assigned(FOnFirstTime) then
    FOnFirstTime(Self, Result);
end;

procedure TSynchronizeContacts.DoError(const Message: String);
begin
  if Assigned(FOnError) then
    FOnError(Self, Message);
end;

function TSynchronizeContacts.BuildCompareDescription(Contact, OtherContact: TContact): WideString;
{
var
  FullName: WideString;
begin
  if Contact.FullName <> '' then
    FullName := Contact.FullName
  else
    FullName := OtherContact.FullName;
}
begin
  case Contact.GetContactState of
    csUnchanged:
      Result := WideFormat(_('is unchanged in %s'), [Contact.ContactSource.Name]);
    csNew:
      Result := WideFormat(_('is new in %s'), [Contact.ContactSource.Name]);
    csChanged:
      Result := WideFormat(_('is changed in %s'), [Contact.ContactSource.Name]);
    csDeleted:
      Result := WideFormat(_('is deleted from %s'), [Contact.ContactSource.Name]);
    else
      Result := '';
  end;

  case OtherContact.GetContactState of
    csUnchanged:
      Result := Result + WideFormat(_(' and unchanged in %s'), [OtherContact.ContactSource.Name]);
    csNew:
      Result := Result + WideFormat(_(' and new in %s'), [OtherContact.ContactSource.Name]);
    csChanged:
      Result := Result + WideFormat(_(' and changed in %s'), [OtherContact.ContactSource.Name]);
    csDeleted:
      Result := Result + WideFormat(_(' and deleted from %s'), [OtherContact.ContactSource.Name]);
  end;
end;

function TSynchronizeContacts.BuildActionDescription(Action: TContactAction;
    Source: TContactSource; Contact: TContact): WideString;
begin
  case Action of
    caAdd:
      Result := WideFormat(_('%s will be added to %s'), [Contact.FullName, Source.Name]);
    caUpdate:
      Result := WideFormat(_('%s will be updated into %s'), [Contact.FullName, Source.Name]);
    caDelete:
      Result := WideFormat(_('%s will be deleted from %s'), [Contact.FullName, Source.Name]);
    else
      Result := '';
  end;
end;

function TSynchronizeContacts.Confirm(Action: TContactAction; Source: TContactSource; Contact: TContact): Boolean;
var Description: WideString;
begin
  Log.AddSynchronizationMessageFmt(_('Confirmation is asked for %s'), [Contact.FullName], lsDebug);

  Description := BuildActionDescription(Action, Source, Contact);

  DoConfirm(Contact, Action, Description, Result);

  if Result then
    Log.AddSynchronizationMessage(_('Confirmation is granted'), lsDebug)
  else
    Log.AddSynchronizationMessage(_('Confirmation is not granted'), lsDebug);
end;

procedure TSynchronizeContacts.DoConfirm(Contact: TContact; Action: 
    TContactAction; const Description: WideString; var Confirmed: Boolean);
begin
  Confirmed := True;
  if Assigned(FOnConfirm) then
    FOnConfirm(Self, Contact, Action, Description, Confirmed);
end;

function TSynchronizeContacts.Add(Source: TContactSource; Value: TContact): TContact;
begin
  Result := nil;

  if caAdd in Source.ConfirmActions then
    if not Confirm(caAdd, Source, Value) then Exit;

  Result := Source.Add(Value);

  Result.Synchronized := True;
  Value.Synchronized := True;
  Log.AddSynchronizationMessageFmt(_('%s is added to %s'), [Result.FullName, Source.Name], lsInformation);
end;

procedure TSynchronizeContacts.Update(Source: TContactSource; Contact, Value: TContact);
begin
  if caUpdate in Source.ConfirmActions then
    if not Confirm(caUpdate, Source, Value) then Exit;

  Source.Update(Contact, Value);

  Contact.Synchronized := True;
  Value.Synchronized := True;
  Log.AddSynchronizationMessageFmt(_('%s is updated into %s'), [Contact.FullName, Source.Name], lsInformation);
end;

procedure TSynchronizeContacts.Delete(Source: TContactSource; Contact, OtherContact: TContact);
begin
  if caDelete in Source.ConfirmActions then
    if not Confirm(caDelete, Source, Contact) then Exit;

  Source.Delete(Contact);

  Contact.Synchronized := True;
  OtherContact.Synchronized := True;
  Log.AddSynchronizationMessageFmt(_('%s is deleted from %s'), [Contact.FullName, Source.Name], lsInformation);
end;

procedure TSynchronizeContacts.Link(Contact, OtherContact: TContact);
begin
  Contact.LinkedContact := OtherContact;
  OtherContact.LinkedContact := Contact;

  Log.AddSynchronizationMessageFmt(_('%0:s in %1:s is linked to %2:s in %3:s'),
    [Contact.FullName, Contact.ContactSource.Name, OtherContact.FullName, OtherContact.ContactSource.Name], lsInformation);
end;

function TSynchronizeContacts.FindLink(Contact: TContact; OtherSource: TContactSource): TContact;
var I: Integer;
    OtherContact: TContact;
    OtherState: TContactState;
    PossibleLinks: TPossibleLinks;
    Score: Integer;
begin
  PossibleLinks := TPossibleLinks.Create;
  try
    for I := 0 to OtherSource.Contacts.Count - 1 do begin
      OtherContact := OtherSource.Contacts[I];
      if Assigned(OtherContact) then begin
        OtherState := OtherContact.GetContactState;

        if OtherState = csNew then begin
          Score := CalculateLinkScore(Contact, OtherContact);
          PossibleLinks.Add(OtherContact, Score)
        end;
      end;
    end;
    PossibleLinks.Sort;

    OtherContact := nil;
    if PossibleLinks.Count > 0 then
      DoChooseLink(Contact, PossibleLinks, OtherContact);
    Result := OtherContact;
  finally
    PossibleLinks.Free;
  end;
end;

function TSynchronizeContacts.CalculateLinkScore(Contact, OtherContact: TContact): Integer;
begin
  Result := 0;
  
  if Contact.Title = OtherContact.Title then
    Inc(Result, 1);
  if Contact.Name = OtherContact.Name then
    Inc(Result, 10);
  if Contact.SurName = OtherContact.SurName then
    Inc(Result, 100);
  if Contact.Organization = OtherContact.Organization then
    Inc(Result, 1);
  if Contact.Email = OtherContact.Email then
    Inc(Result, 100);
  if Contact.HomePhone = OtherContact.HomePhone then
    Inc(Result, 100);
  if Contact.WorkPhone = OtherContact.WorkPhone then
    Inc(Result, 10);
  if Contact.CellPhone = OtherContact.CellPhone then
    Inc(Result, 100);
  if Contact.FaxPhone = OtherContact.FaxPhone then
    Inc(Result, 10);
  if Contact.OtherPhone = OtherContact.OtherPhone then
    Inc(Result, 10);
  if Contact.Street = OtherContact.Street then
    Inc(Result, 10);
  if Contact.City = OtherContact.City then
    Inc(Result, 10);
  if Contact.Region = OtherContact.Region then
    Inc(Result, 1);
  if Contact.PostalCode = OtherContact.PostalCode then
    Inc(Result, 10);
  if Contact.Country = OtherContact.Country then
    Inc(Result, 1);

  if Contact.Birthday = OtherContact.Birthday then
    Inc(Result, 100);

  if Contact.Name = OtherContact.SurName then
    Inc(Result, 100);
  if Contact.SurName = OtherContact.Name then
    Inc(Result, 100);
end;

procedure TSynchronizeContacts.DoChooseLink(Contact: TContact; PossibleLinks: TPossibleLinks; var OtherContact: TContact);
begin
  if Assigned(FOnChooseLink) then
    FOnChooseLink(Self, Contact, PossibleLinks, OtherContact);
end;

procedure TSynchronizeContacts.Unlink(CDID: TGUID);
var XMLContactSync: IXMLFmaSyncType;
    XMLContact: IXMLContactType;
    I: Integer;
    Confirmed: Boolean;
begin
  Log.AddSynchronizationMessage(_('Unlinking started'), lsDebug);
  try
    if FileExists(FFileName) then begin
      XMLContactSync := Loadfmasync(FFileName);
      for I := 0 to XMLContactSync.Count - 1 do begin
        XMLContact := XMLContactSync.Contact[I];

        if IsEqualGUID(StringToGUID(XMLContact.FMA.ID), CDID) then begin
          Confirmed := False;
          DoConfirm(nil, caUnlink, _('Link found. About to unlinking'), Confirmed);

          if Confirmed then begin
            Log.AddSynchronizationMessageFmt(_('Link %s found and Unlinked'), [GUIDToString(CDID)], lsDebug);
            XMLContactSync.Delete(I);
          end;

          Break;
        end;

        Application.ProcessMessages;
      end;

      XMLContactSync.OwnerDocument.SaveToFile(FFileName);
    end;

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

{ TContact }

procedure TContact.Clone(Value: TContact);
begin
  inherited;

  Title := Value.Title;
  Name := Value.Name;
  SurName := Value.SurName;
  Organization := Value.Organization;
  Email := Value.Email;
  HomePhone := Value.HomePhone;
  WorkPhone := Value.WorkPhone;
  CellPhone := Value.CellPhone;
  FaxPhone := Value.FaxPhone;
  OtherPhone := Value.OtherPhone;
  Street := Value.Street;
  City := Value.City;
  Region := Value.Region;
  PostalCode := Value.PostalCode;
  Country := Value.Country;

  Birthday := Value.Birthday;

  SyncID := Value.SyncID;
  ID := Unassigned;
  SyncHash := Hash;
end;

constructor TContact.Create(ContactSource: TContactSource);
begin
  inherited Create;

  FContactSource := ContactSource;

  FSyncID := MaxCardinal;
end;

function TContact.GetContactState: TContactState;
begin
  if IsDeleted then
    Result := csDeleted
  else if IsNew then
    Result := csNew
  else if IsChanged then
    Result := csChanged
  else
    Result := csUnchanged;
end;

function TContact.GetHash: Cardinal;
var Str: String;
begin
  Str := GetHashString;
  Result := CalculateCRC32(Str[1], Length(Str));
end;

function TContact.GetHashString: String;
begin
  Result := FTitle + '|' + FCellPhone + '|' + FFaxPhone + '|' + FOtherPhone + '|' +
            FOrganization + '|' + FEmail + '|' + FName + '|' + FWorkPhone + '|' +
            FSurName + '|' +FHomePhone + '|' + FStreet + '|' + FCity + '|' +
            FRegion + '|' + FPostalCode + '|' + FCountry + '|' + DateToStr(FBirthday);
end;

function TContact.IsChanged: Boolean;
begin
  Result := FSyncHash <> Hash;
end;

function TContact.IsDeleted: Boolean;
begin
  Result := not Exists;
end;

function TContact.IsNew: Boolean;
begin
  Result := VarIsEmpty(FID) or not Assigned(FLinkedContact);
end;

function TContact.IsUnchanged: Boolean;
begin
  Result := not (IsNew or IsChanged or IsDeleted);
end;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美va亚洲va香蕉在线| 青青草精品视频| 免费欧美高清视频| 一本大道av一区二区在线播放| 91麻豆精品国产自产在线观看一区 | 日韩女优制服丝袜电影| ...av二区三区久久精品| 精品一区二区三区视频在线观看| 色天天综合色天天久久| 欧美激情在线观看视频免费| 久久精品国产在热久久| 欧美三级在线视频| 日韩一区在线看| 国产91在线观看| 亚洲精品在线免费观看视频| 水野朝阳av一区二区三区| 色综合av在线| 亚洲欧美日韩人成在线播放| 成人av在线资源网站| 精品久久久久久久久久久久包黑料| 午夜久久福利影院| 欧美日韩国产综合视频在线观看| 亚洲欧美日韩在线| 99精品视频一区二区| 国产精品久久精品日日| 福利视频网站一区二区三区| 久久免费电影网| 国产高清精品网站| 久久精品亚洲精品国产欧美kt∨| 激情图区综合网| 精品国产乱码久久久久久免费| 看国产成人h片视频| 日韩午夜电影在线观看| 激情偷乱视频一区二区三区| 久久亚洲精华国产精华液 | 香蕉加勒比综合久久| 欧美中文字幕不卡| 亚洲h动漫在线| 欧美日韩精品福利| 奇米色777欧美一区二区| 欧美成人a∨高清免费观看| 精品一区二区在线播放| 国产日产欧美精品一区二区三区| 国产91富婆露脸刺激对白| 国产精品乱码久久久久久 | 国产精品香蕉一区二区三区| 久久久不卡网国产精品一区| 成人av免费在线| 亚洲午夜三级在线| 日韩区在线观看| 成人性视频网站| 亚洲欧美视频一区| 91精品国产91综合久久蜜臀| 精久久久久久久久久久| 亚洲视频一区二区在线| 欧美日韩在线亚洲一区蜜芽| 久久精品999| 国产精品成人网| 777奇米四色成人影色区| 国产精品性做久久久久久| 亚洲免费大片在线观看| 91精品国产综合久久久久久久久久 | 久久精品这里都是精品| 一本一道久久a久久精品| 美女一区二区视频| 中文字幕一区二区三区av| 欧美一区二区在线视频| 高清成人免费视频| 亚洲国产高清aⅴ视频| 91美女片黄在线观看91美女| 亚洲精品国产一区二区精华液| 欧美视频完全免费看| 国产一区在线看| 一区二区三区美女视频| 久久久久国产精品免费免费搜索| 日本久久电影网| 国产伦精品一区二区三区在线观看| 亚洲色图制服诱惑 | 91官网在线观看| 激情国产一区二区| 亚洲综合视频网| 国产日韩成人精品| 日韩精品一区二区三区在线| 91精品福利视频| 成人激情动漫在线观看| 麻豆91免费看| 天天操天天色综合| 亚洲视频一区二区免费在线观看| 日韩精品一区二区三区老鸭窝| 色88888久久久久久影院野外 | 日韩国产欧美三级| 国产精品不卡在线| 久久久亚洲高清| 欧美mv和日韩mv的网站| 欧美日韩一区二区在线视频| 色悠悠亚洲一区二区| 成人午夜免费电影| 国产成人精品免费看| 九色|91porny| 美女尤物国产一区| 日本网站在线观看一区二区三区| 一区二区三区不卡视频在线观看 | av午夜一区麻豆| 国产高清不卡一区| 国内国产精品久久| 麻豆精品久久久| 免费观看30秒视频久久| 日本美女一区二区三区| 五月天视频一区| 日本vs亚洲vs韩国一区三区| 亚洲二区在线观看| 日韩国产欧美在线观看| 日韩在线卡一卡二| 麻豆一区二区99久久久久| 日韩高清在线一区| 奇米亚洲午夜久久精品| 麻豆一区二区99久久久久| 麻豆国产欧美日韩综合精品二区| 日本欧美大码aⅴ在线播放| 日本不卡123| 国内不卡的二区三区中文字幕| 精品一区二区免费看| 国产激情视频一区二区在线观看 | 精品视频一区二区三区免费| 欧日韩精品视频| 这里只有精品电影| 欧美电影免费观看高清完整版在| 日韩精品专区在线影院重磅| 久久这里只有精品视频网| 欧美国产精品一区二区三区| 中文av字幕一区| 亚洲在线视频一区| 三级影片在线观看欧美日韩一区二区| 日韩国产在线一| 国产精品自在欧美一区| 99视频超级精品| 欧美丝袜第三区| 精品乱码亚洲一区二区不卡| 国产日韩欧美在线一区| 亚洲一区二区视频| 老色鬼精品视频在线观看播放| 国产精品一区二区果冻传媒| 色综合天天综合| 欧美高清精品3d| 中文字幕av一区二区三区高| 亚洲精品久久久蜜桃| 看电视剧不卡顿的网站| 成人福利视频在线| 91精品国产色综合久久| 亚洲国产精品成人久久综合一区| 夜夜操天天操亚洲| 精品一区二区在线视频| 日本高清视频一区二区| 精品久久久久久久久久久院品网| 中文字幕欧美一| 激情久久五月天| 欧美在线小视频| 欧美国产丝袜视频| 日韩极品在线观看| 99麻豆久久久国产精品免费| 3d成人动漫网站| 亚洲欧美综合另类在线卡通| 美女在线一区二区| 欧美视频完全免费看| 中文字幕精品—区二区四季| 蜜臀av性久久久久蜜臀aⅴ | 成人免费视频app| 欧美日本精品一区二区三区| 国产欧美一区二区三区在线老狼| 日韩国产在线一| 欧美性高清videossexo| 亚洲国产精品99久久久久久久久| 奇米色一区二区| 欧美色综合网站| 亚洲欧美日韩中文播放| 国产a精品视频| 日韩久久精品一区| 日韩精品一级中文字幕精品视频免费观看| 成人一区二区三区| 欧美精品一区二区久久久| 日本在线不卡一区| 91.麻豆视频| 亚洲大片免费看| 欧美日韩一区二区三区四区五区| 日韩美女视频一区二区| 9久草视频在线视频精品| 国产农村妇女精品| 国产成人免费视频网站| 26uuu成人网一区二区三区| 蜜臀国产一区二区三区在线播放| 欧美日韩亚洲高清一区二区| 亚洲主播在线观看| 91黄色免费观看| 亚洲午夜视频在线| 欧美视频三区在线播放| 午夜精品福利久久久| 欧美日韩国产一二三| 日本不卡视频在线| 亚洲黄网站在线观看| 色婷婷综合久久|