📄 personalinfoaction.cs
字号:
namespace Imps.Client.Core
{
using Imps.Base.Sipc;
using Imps.Client;
using Imps.Client.Base;
using Imps.Client.Core.Login;
using Imps.Utils;
using System;
using System.IO;
using System.Threading;
using System.Xml;
public sealed class PersonalInfoAction : LoginAction
{
private const string errorMessage = "获取个人信息过程中出现错误";
private bool? localCacheHit;
private bool result;
private AutoResetEvent waitPersonalInfo;
public PersonalInfoAction(User user, ILoginListner listener) : base(user, listener)
{
}
public override void Cancel()
{
}
public override void Clear()
{
}
public override void Dispose()
{
}
public override bool Execute()
{
XmlHelper.WriteXmlContentDelegate writeContentCallback = null;
try
{
this.result = false;
base.NotifyMessage("开始获取个人信息");
SipRequest msg = base.User.CreateSipRequest("S");
msg.Message.AddHeader(new SipcEventHeader("GetPersonalInfo"));
using (StringWriter tw = new StringWriter())
{
if (writeContentCallback == null)
{
writeContentCallback = delegate (XmlWriter writer, object context) {
writer.WriteStartElement("personal");
if (!string.IsNullOrEmpty(base.User.PersonalInfo.Version))
{
writer.WriteAttributeString("version", base.User.PersonalInfo.Version);
}
writer.WriteAttributeString("attributes", "all");
writer.WriteEndElement();
writer.WriteStartElement("services");
writer.WriteAttributeString("version", base.User.ServiceVersion);
writer.WriteAttributeString("attributes", "all");
writer.WriteEndElement();
writer.WriteStartElement("config");
writer.WriteAttributeString("version", base.User.Configuration.UserSetting.CfgVersion.ToString());
writer.WriteAttributeString("attributes", "all");
writer.WriteEndElement();
writer.WriteStartElement("mobile-device");
writer.WriteAttributeString("attributes", "all");
writer.WriteEndElement();
};
}
XmlHelper.CreateXmlWriterForSipRequest(tw, null, writeContentCallback);
msg.Message.Body = tw.ToString();
}
msg.FinalResponseReceived += new EventHandler<SipResponseReceivedEventArgs>(this, (IntPtr) this.req_FinalResponseReceived);
msg.SendMessageFailed += new EventHandler<FailedEventArgs>(this, (IntPtr) this.req_SendMessageFailed);
msg.WaitResponseTimeout += new EventHandler(this.req_WaitResponseTimeout);
if (this.waitPersonalInfo == null)
{
this.waitPersonalInfo = new AutoResetEvent(false);
}
base.User.SendSipMessage(msg);
if (!this.waitPersonalInfo.WaitOne(this.TimeOut, false))
{
ReflectionHelper.ClearAllEvents(msg);
base.NotifyLoginFailed("获取个人信息超时", ExceptionType.SipCException, null);
}
base.NotifyMessage("获取个人信息结束");
}
catch (ThreadAbortException exception)
{
base.NotifyWarning("获取个人信息过程中出现错误", exception);
}
catch (Exception exception2)
{
base.NotifyLoginFailed("获取个人信息过程中出现错误", ExceptionType.CommonException, exception2);
}
return this.result;
}
private void req_FinalResponseReceived(object sender, SipResponseReceivedEventArgs e)
{
PersistentDelegate save = null;
SipResponse response = e.Response;
try
{
if (response.Message.StatusCode == 200)
{
XmlDocument document = new XmlDocument();
document.LoadXml(e.Response.Message.Body);
foreach (XmlNode node in document.DocumentElement.ChildNodes)
{
switch (node.Name)
{
case "config":
{
try
{
node.Attributes.Remove(node.Attributes["save-message"]);
base.User.Configuration.LoadUserSetting(document.DocumentElement);
}
catch (Exception exception)
{
base.NotifyException("加载用户配置过程中出现错误", exception);
}
continue;
}
case "service":
{
if (node.Attributes.Count > 0)
{
string text = XmlHelper.ReadXmlAttributeString(node, "version", true);
if (text != base.User.ServiceVersion)
{
base.User.LoadServicesNode(node);
base.User.ServiceVersion = text;
if (save == null)
{
save = delegate (XmlNode node) {
XmlHelper.SetNodeAttribute(node, "version", base.User.ServiceVersion);
node.InnerXml = base.User.ToServiceNodeXml();
};
}
base.User.PersistentManager.SaveSubscribedServiceInfos(save);
}
}
continue;
}
case "personal":
break;
default:
{
continue;
}
}
if ((node.Attributes.Count > 0) && (XmlHelper.ReadXmlAttributeString(node, "version", true) != base.User.PersonalInfo.Version))
{
base.User.PersonalInfo.LoadPersonalXmlNode(node);
base.User.PersistentManager.SaveUserInfo(new PersistentDelegate(base.User.PersonalInfo.SaveToXmlNode));
}
}
this.result = true;
this.waitPersonalInfo.Set();
}
else
{
base.NotifyLoginFailed("获取个人信息过程中出现错误", ExceptionType.SipCException, new SipCException(response.Message.StatusCode, "获取个人信息过程中出现错误"));
this.result = false;
this.waitPersonalInfo.Set();
}
}
catch (Exception exception2)
{
base.NotifyLoginFailed("获取个人信息过程中出现错误", ExceptionType.CommonException, exception2);
this.result = false;
this.waitPersonalInfo.Set();
}
}
private void req_SendMessageFailed(object sender, FailedEventArgs e)
{
base.NotifyLoginFailed("获取个人信息过程中出现错误", ExceptionType.CommonException, new SipCException(900, "获取个人信息过程中出现错误"));
this.result = false;
this.waitPersonalInfo.Set();
}
private void req_WaitResponseTimeout(object sender, EventArgs e)
{
base.NotifyLoginFailed("获取个人信息过程中出现错误", ExceptionType.SipCException, new SipCException(0x385, "获取个人信息过程中出现错误"));
this.result = false;
this.waitPersonalInfo.Set();
}
public override void Retry(RetryResult retryResult)
{
try
{
if (this.result)
{
retryResult.IsCompleted = true;
}
else
{
retryResult.IsSucceed = this.Execute();
}
}
catch (Exception)
{
}
}
public override bool LocalCacheHit
{
get
{
if (!this.localCacheHit.get_HasValue())
{
try
{
base.NotifyMessage("开始加载个人信息本地缓存");
int num = 0;
if (!string.IsNullOrEmpty(base.User.PersonalInfo.Version))
{
int.TryParse(base.User.PersonalInfo.Version, ref num);
}
this.localCacheHit = new bool?(num > 0);
base.NotifyMessage("个人信息本地缓存加载完毕");
}
catch (Exception exception)
{
base.NotifyException("获取个人信息过程中出现错误", exception);
}
}
return this.localCacheHit.get_Value();
}
}
public override Imps.Client.Core.LoginStage LoginStage
{
get
{
return Imps.Client.Core.LoginStage.RetrivePersonalInfo;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -