📄 contact.cs
字号:
namespace Imps.Client.Core
{
using Imps.Base.Sipc;
using Imps.Client;
using Imps.Client.Base;
using Imps.Client.Resource;
using Imps.Client.Utils;
using Imps.Common;
using Imps.Common.Permission;
using Imps.Utils;
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Xml;
public abstract class Contact : UserItemBase, IComparable<Imps.Client.Core.Contact>, IDisposable
{
private DateTime? _addedTime;
private bool _beenGetContactInfo;
private bool _beenSubscribed;
private double? _contactFrequency;
private bool _getContactsInfoOK;
private Imps.Client.Core.ContactInfo _info;
private DateTime? _lastChatTime;
private ProposedData<bool> _onlineNotify;
private List<int> _ownedGroups;
private PermissionDict _permissionDict;
private ContactPresence _presence;
private int? _relationStatus;
private bool _subscribePresenceOK;
private int? _totalChatCount;
private IicUri _uri;
public event EventHandler FinalPremissionChanged;
public event EventHandler InfoChanged;
public event EventHandler<BlockEventArgs> IsBlockChanged;
public event EventHandler OperationFailed;
public event EventHandler PresenceChanged;
public event EventHandler RelationStatusChanged;
public event EventHandler<ContactTypeChangedEventArgs> TypeChanged;
protected Contact(Imps.Client.Core.User owner, string uri) : this(owner, uri, true)
{
}
protected Contact(Imps.Client.Core.User owner, string uri, bool getInfo) : base(owner)
{
this._onlineNotify = new ProposedData<bool>(false);
this.Uri = new IicUri(uri);
this._presence = new ContactPresence(this);
this._info = new Imps.Client.Core.ContactInfo(this);
this._ownedGroups = new List<int>();
if (getInfo)
{
AsyncBizOperation op = new AsyncBizOperation();
op.IsImpsErrorHandled = true;
owner.ContactList.AsyncGetContactsInfo(this, op, null, true, new string[] { "provisioning", "impresa", "mobile-no", "nickname", "name", "portrait-crc", "ivr-enabled" });
}
this._beenGetContactInfo = getInfo;
}
public bool AsyncBlock()
{
if (this.IsBlocked)
{
return true;
}
PermissionDict permissions = this.Permissions;
permissions.PermissionPointPresence.SetProposedValueSafely(0);
permissions.PermissionPointContact.SetProposedValueSafely(2);
AsyncBizOperation op = new AsyncBizOperation();
op.IsImpsErrorHandled = true;
return base.Owner.PermissionManager.AsyncSetContactPermission(this, op);
}
public void AsyncChangePermissionIdentity(bool isOpen)
{
if (isOpen != this.IsOpenIdentity)
{
if (isOpen)
{
this.Permissions[PermissionPointName.Identity].SetProposedValueSafely(1);
}
else
{
this.Permissions[PermissionPointName.Identity].SetProposedValueSafely(0);
}
base.Owner.PermissionManager.AsyncSetContactPermission(this, new AsyncBizOperation());
}
}
public virtual bool AsyncDelete(AsyncBizOperation op)
{
return true;
}
public static void AsyncGetUserSetContactInfo(Imps.Client.Core.User user, Imps.Client.Core.Contact contact, bool getWithVersion, AsyncBizOperation op)
{
if (contact.Type != ContactType.Vodafone)
{
SipRequest req = user.CreateSipRequest("S");
req.Message.AddHeader(new SipcEventHeader("GetLocalContactsInfo"));
StringWriter tw = new StringWriter();
XmlHelper.CreateXmlWriterForSipRequest(tw, null, delegate (XmlWriter writer, object context) {
writer.WriteStartElement("contacts");
writer.WriteAttributeString("attributes", "all");
writer.WriteStartElement("contact");
writer.WriteAttributeString("uri", contact.Uri.Raw);
if (getWithVersion)
{
writer.WriteAttributeString("version", contact.PersonalInfo.UserSetVersion);
}
writer.WriteEndElement();
writer.WriteEndElement();
});
req.Message.Body = tw.ToString();
tw.Dispose();
ErrorHelper.HandleSendRequestErrorAndTimeout(req);
req.FinalResponseReceived += new EventHandler<SipResponseReceivedEventArgs>(contact.PersonalInfo, (IntPtr) this.finalResponseReceived_GetLocalContactInfo);
user.SendSipMessage(req);
}
}
public bool AsyncUnblock()
{
if (!this.IsBlocked)
{
return false;
}
PermissionDict permissions = this.Permissions;
permissions.PermissionPointContact.SetProposedValueSafely(1);
permissions.PermissionPointPresence.SetProposedValueSafely(1);
AsyncBizOperation op = new AsyncBizOperation();
op.IsImpsErrorHandled = true;
return base.Owner.PermissionManager.AsyncSetContactPermission(this, op);
}
internal void ClearCustimizedPermissions()
{
this._permissionDict = null;
}
public int CompareTo(Imps.Client.Core.Contact other)
{
int num;
int num2;
if (other == null)
{
return 1;
}
int? relationStatus = this.RelationStatus;
if ((relationStatus.GetValueOrDefault() == 1) && relationStatus.get_HasValue())
{
if (this.Presence.MainPresence == MainPresence.SmsOnline)
{
num = (this.Type == ContactType.MobileBuddy) ? 3 : 2;
}
else if (this.Presence.IsOnline)
{
num = 1;
}
else
{
num = 4;
}
}
else
{
int? nullable2 = this.RelationStatus;
if ((nullable2.GetValueOrDefault() == 0) && nullable2.get_HasValue())
{
num = (this.Type == ContactType.MobileBuddy) ? 6 : 5;
}
else
{
int? nullable3 = this.RelationStatus;
if ((nullable3.GetValueOrDefault() == 2) && nullable3.get_HasValue())
{
num = (this.Type == ContactType.MobileBuddy) ? 8 : 7;
}
else
{
num = 9;
}
}
}
int? nullable4 = other.RelationStatus;
if ((nullable4.GetValueOrDefault() == 1) && nullable4.get_HasValue())
{
if (other.Presence.MainPresence == MainPresence.SmsOnline)
{
num2 = (other.Type == ContactType.MobileBuddy) ? 3 : 2;
}
else if (other.Presence.IsOnline)
{
num2 = 1;
}
else
{
num2 = 4;
}
}
else
{
int? nullable5 = other.RelationStatus;
if ((nullable5.GetValueOrDefault() == 0) && nullable5.get_HasValue())
{
num2 = (other.Type == ContactType.MobileBuddy) ? 6 : 5;
}
else
{
int? nullable6 = other.RelationStatus;
if ((nullable6.GetValueOrDefault() == 2) && nullable6.get_HasValue())
{
num2 = (other.Type == ContactType.MobileBuddy) ? 8 : 7;
}
else
{
num2 = 9;
}
}
}
if (num != num2)
{
return (num - num2);
}
int num3 = string.Compare(this.DisplayName, other.DisplayName);
if (num3 == 0)
{
return this.Uri.CompareTo(other.Uri.Raw);
}
return num3;
}
public virtual void Dispose()
{
this.PersonalInfo.Clear();
this.Presence.Clear();
this.Permissions.Clear();
}
internal void InnerOnContactIsBlockChanged(BlockEventArgs e)
{
FuncDispatcher.InvokeEventHandlerInUiThread<BlockEventArgs>(this, this.IsBlockChanged, e);
}
internal void InnerOnContactTypeChanged(ContactTypeChangedEventArgs e)
{
if (this.TypeChanged != null)
{
e.AutoResetEvent = new AutoResetEvent(false);
FuncDispatcher.InvokeEventHandlerInUiThread<ContactTypeChangedEventArgs>(this, this.TypeChanged, e);
e.AutoResetEvent.WaitOne(100, true);
}
}
public virtual bool MatchSearch(string keyWord)
{
int length = keyWord.Length;
return ((!string.IsNullOrEmpty(this.PersonalInfo.MobileNo) && this.PersonalInfo.MobileNo.StartsWith(keyWord, 2)) || (((this.PersonalInfo.Nickname.ContactSetData.Length >= length) && this.PersonalInfo.Nickname.ContactSetData.ToLower().Contains(keyWord)) || (((this.PersonalInfo.Name.ContactSetData.Length >= length) && this.PersonalInfo.Name.ContactSetData.ToLower().Contains(keyWord)) || (((this.PersonalInfo.Name.HasUserSetData && (this.PersonalInfo.Name.UserSetData.OriginalValue.Length >= length)) && this.PersonalInfo.Name.UserSetData.OriginalValue.ToLower().Contains(keyWord)) || (this.PersonalInfo.NicknamePYFull.ToLower().Contains(keyWord) || (this.PersonalInfo.NamePYFull.ToLower().Contains(keyWord) || (this.PersonalInfo.NameUserSetPYFull.ToLower().Contains(keyWord) || (this.PersonalInfo.NicknamePYAb.ToLower().Contains(keyWord) || (this.PersonalInfo.NamePYAb.ToLower().Contains(keyWord) || (this.PersonalInfo.NameUserSetPYAb.ToLower().Contains(keyWord) || (this.Uri.Belongs(IicUriType.Sip) && this.Uri.Sid.ToString().StartsWith(keyWord, 2))))))))))));
}
internal virtual void ParseInfoNode(XmlNode node, DownloadPortraitPriority priority, string requestedProperties)
{
XmlNode personalNode = node.SelectSingleNode("personal");
if (personalNode != null)
{
this.PersonalInfo.LoadContactSetXmlNode(personalNode, priority, requestedProperties);
}
XmlNode extendedNode = node.SelectSingleNode("extended");
if (extendedNode != null)
{
this.PersonalInfo.LoadContactSetXmlNode_Extended(extendedNode);
}
}
internal virtual void ParseInfoNode_Need(XmlNode node, DownloadPortraitPriority priority)
{
XmlNode personalNode = node.SelectSingleNode("personal");
if (personalNode != null)
{
this.PersonalInfo.LoadContactSetXmlNode_Need(personalNode, priority);
}
}
internal void RemoveFromGroups()
{
try
{
if (this.BelongToGroups.get_Count() > 0)
{
for (int i = this.BelongToGroups.get_Count() - 1; i >= 0; i--)
{
int num2 = this.BelongToGroups.get_Item(i);
Imps.Client.Core.ContactGroup group = base.Owner.ContactList.Groups[new int?(num2)] as Imps.Client.Core.ContactGroup;
if (group != null)
{
group.Contacts.Remove(this);
}
}
}
}
catch (Exception exception)
{
ClientLogger.WriteException(exception);
}
}
internal void SetUpdatePermissionValues(string values, PermissionManager manager)
{
bool isBlocked = this.IsBlocked;
this.Permissions.UpdateValues(values, manager);
FuncDispatcher.InvokeEventHandlerInUiThread(this, this.FinalPremissionChanged, EventArgs.Empty);
if (isBlocked != this.IsBlocked)
{
this.InnerOnContactIsBlockChanged(new BlockEventArgs(this.IsBlocked));
}
}
public override string ToString()
{
return this.DisplayName;
}
internal abstract void WriteContactSetInfoXml(XmlTextWriter writer);
internal void WriteUserSetContactInfoXml(XmlTextWriter writer)
{
writer.WriteStartElement("contact");
writer.WriteAttributeString("uri", this.Uri.Raw);
writer.WriteAttributeString("version", this.PersonalInfo.UserSetVersion);
if (this.PersonalInfo.Name.HasUserSetData)
{
writer.WriteAttributeString("local-name", this.PersonalInfo.Name.UserSetData.OriginalValue);
}
if (this.PersonalInfo.Notes.HasUserSetData)
{
writer.WriteAttributeString("profile", this.PersonalInfo.Notes.UserSetData.OriginalValue);
}
if (this.PersonalInfo.BirthDate.HasUserSetData)
{
writer.WriteAttributeString("birth-date", this.PersonalInfo.BirthDate.UserSetData.OriginalValue.ToShortDateString());
}
if (this.PersonalInfo.IsBirthdayValid.HasUserSetData)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -