⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 contact.cs

📁 破解的飞信源代码
💻 CS
📖 第 1 页 / 共 3 页
字号:
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 + -