📄 contactpresence.cs
字号:
namespace Imps.Client.Core
{
using Imps.Base.Sipc;
using Imps.Client.Base;
using Imps.Common;
using Imps.Utils;
using System;
using System.IO;
using System.Runtime.CompilerServices;
public class ContactPresence : Imps.Client.Core.Presence
{
private bool? _isLogonPresence;
private Contact _owner;
private int _setCount;
internal event EventHandler<ImpsValueChangedEventArgs<Imps.Common.MainPresence>> InnerMainPresenceChanged;
internal event EventHandler<PropertiesChangedEventArgs> InnerPropertiesChanged;
public ContactPresence(Contact owner) : base(Imps.Common.MainPresence.Invisible, string.Empty)
{
this._isLogonPresence = null;
this._owner = owner;
}
public bool AsyncGetPresence(AsyncBizOperation op)
{
SipRequest req = this._owner.Owner.CreateSipRequest("S");
req.Message.AddHeader(new SipcEventHeader("GetPresence"));
req.Context = op;
StringWriter tw = new StringWriter();
XmlHelper.CreateXmlWriterForSipRequest(tw, null, delegate (XmlWriter writer, object context) {
writer.WriteStartElement("query");
writer.WriteStartElement("contacts");
writer.WriteStartElement("contact");
writer.WriteAttributeString("uri", this.Owner.Uri.Raw);
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteStartElement("presence");
writer.WriteStartElement("extended");
writer.WriteAttributeString("types", "mobile-device-status");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndElement();
});
req.Message.Body = tw.ToString();
tw.Dispose();
ErrorHelper.HandleSendRequestErrorAndTimeout(req);
req.FinalResponseReceived += new EventHandler<SipResponseReceivedEventArgs>(this, (IntPtr) this.req_FinalResponseReceived);
this.Owner.Owner.SendSipMessage(req);
return true;
}
internal override void Clear()
{
this._isLogonPresence = null;
this._setCount = 0;
base.Clear();
}
public bool IsDisplayOnline(Imps.Common.MainPresence mainPresence)
{
return (((mainPresence != Imps.Common.MainPresence.SmsOnline) && (mainPresence != Imps.Common.MainPresence.Offline)) && (this._owner.Type != ContactType.MobileBuddy));
}
protected override void OnPropertiesChanged(PropertiesChangedEventArgs e)
{
FuncDispatcher.OnEventHandler<PropertiesChangedEventArgs>(this, this.InnerPropertiesChanged, e);
base.OnPropertiesChanged(e);
}
private void req_FinalResponseReceived(object sender, SipResponseReceivedEventArgs e)
{
SipResponse sipMsg = e.Response;
if (!sipMsg.IsOK)
{
LogHelper.LogReceivedSipMessage(sipMsg);
}
}
internal override void UpdateValue()
{
if (LoginFramework.GetCurrentLoginPresence(this.Owner.Owner) == Imps.Common.MainPresence.OfflineLogin)
{
this.Value = 0;
return;
}
if (this.Owner.PersonalInfo.Provision == 0)
{
this.Value = 0;
base.SmsStatus = new ProposedData<TimeSpan>(TimeSpan.MaxValue);
return;
}
if (this._owner.Type != ContactType.PersonalGroupMember)
{
if (((this._owner.Type != ContactType.ChatFriend) && (this._owner.Type != ContactType.Stranger)) && (this._owner.Type != ContactType.MobileBuddy))
{
int? relationStatus = this.Owner.RelationStatus;
if ((relationStatus.GetValueOrDefault() == 1) && relationStatus.get_HasValue())
{
goto Label_00B7;
}
}
this.Value = 1;
return;
}
Label_00B7:
if (this.RealValue == -1)
{
this.Value = 1;
}
else if ((this.RealValue == 0) && (base.SmsStatus.OriginalValue <= TimeSpan.Zero))
{
this.Value = 1;
}
else
{
base.UpdateValue();
}
}
public ClientType ClientTypeType
{
get
{
return ClientTypeHelper.String2ClientType(base.ClientType);
}
}
public Imps.Client.Core.CrbtToBuddy CrbtToBuddy
{
get
{
return base.InnerGetPropertyValue<Imps.Client.Core.CrbtToBuddy>("crbt-to-buddy");
}
internal set
{
base.InnerSetPropertyValue<Imps.Client.Core.CrbtToBuddy>("crbt-to-buddy", value);
}
}
public bool IsLogonPresence
{
get
{
if (this._isLogonPresence.get_HasValue())
{
return this._isLogonPresence.get_Value();
}
return (this._setCount <= 1);
}
internal set
{
this._isLogonPresence = new bool?(value);
}
}
public override Imps.Common.MainPresence MainPresence
{
get
{
return (Imps.Common.MainPresence) this.Value;
}
}
public string MoodPhrase
{
get
{
if (this.Owner.RelationStatusIsAgree)
{
return base.InnerGetPropertyValue<string>("MoodPhrase");
}
return string.Empty;
}
internal set
{
base.InnerSetPropertyValue<string>("MoodPhrase", value);
}
}
public Contact Owner
{
get
{
return this._owner;
}
}
internal override int RealValue
{
get
{
return base.RealValue;
}
set
{
if (this._setCount <= 1)
{
this._setCount++;
}
base.RealValue = value;
}
}
public bool ShowCrbtToBuddyText
{
get
{
return base.InnerGetPropertyValue<bool>("show-crbt-to-buddy-text", true);
}
internal set
{
base.InnerSetPropertyValue<bool>("show-crbt-to-buddy-text", value);
}
}
protected override int Value
{
get
{
return base.Value;
}
set
{
base.InnerSetPropertyValue<int>("value", value, true);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -