using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using XihSolutions.DotMSN;
using XihSolutions.DotMSN.Core;
using XihSolutions.DotMSN.DataTransfer;
using Log;
using INI;
using System.IO;
using System.Threading;
namespace Notification


{

/**//// <summary>
/// Class1 的摘要说明。
/// </summary>
public class MSN:MarshalByRefObject

{
private XihSolutions.DotMSN.Messenger messenger = new Messenger();
private Conversation conversation;
private int status=0;
public MSN()

{
messenger.NameserverProcessor.ConnectionEstablished += new EventHandler(NameserverProcessor_ConnectionEstablished);
messenger.Nameserver.SignedIn += new EventHandler(Nameserver_SignedIn);
messenger.Nameserver.SignedOff += new SignedOffEventHandler(Nameserver_SignedOff);
messenger.NameserverProcessor.ConnectingException += new ProcessorExceptionEventHandler(NameserverProcessor_ConnectingException);
messenger.Nameserver.ExceptionOccurred += new HandlerExceptionEventHandler(Nameserver_ExceptionOccurred);
messenger.Nameserver.AuthenticationError += new HandlerExceptionEventHandler(Nameserver_AuthenticationError);
messenger.Nameserver.ServerErrorReceived += new ErrorReceivedEventHandler(Nameserver_ServerErrorReceived);
messenger.ConversationCreated += new ConversationCreatedEventHandler(messenger_ConversationCreated);
messenger.TransferInvitationReceived += new MSNSLPInvitationReceivedEventHandler(messenger_TransferInvitationReceived);
messenger.Credentials.ClientID = "msmsgs@msnmsgr.com";
messenger.Credentials.ClientCode = "Q1P7W2E4J9R8U3S5";
}
public void Connect()

{ //读配置文件
IniStructure dbini=new IniStructure();
string loc=Path.GetFullPath(AppDomain.CurrentDomain.SetupInformation.ApplicationBase);
dbini= IniStructure.ReadIni(loc+"RNS_Service.ini");
string account=dbini.GetValue("MSN","Account");
string password=dbini.GetValue("MSN","Password");
messenger.Credentials.Account = account;
messenger.Credentials.Password = password;
if(messenger.Connected)

{
messenger.Disconnect();
}
messenger.Connect();
}
public void Disconnect()

{
messenger.Disconnect();
}
public bool Notify(string account,string msg)

{
try

{
TextMessage message = new TextMessage(msg);
switch(status)

{
case 1:
conversation.Invite(account);
for(int i=0;i<10;i++)

{
if (status==2)

{
if(conversation.SwitchboardProcessor.Connected == false)

{
conversation.Messenger.Nameserver.RequestSwitchboard(conversation.Switchboard, this);
}
conversation.Switchboard.SendTextMessage(message);
FLogger.Log("发送
",LogLevel.HIGH);
break;
}
else

{
Thread.Sleep(1000);
}
}
FLogger.Log("连接用户超时,发送不成功!",LogLevel.HIGH);
return false;
case 2:
if(conversation.SwitchboardProcessor.Connected == false)

{
conversation.Messenger.Nameserver.RequestSwitchboard(conversation.Switchboard, this);
}
conversation.Switchboard.SendTextMessage(message);
FLogger.Log("发送
",LogLevel.HIGH);
break;
case 0:
FLogger.Log("服务器未准备好,发送不成功!",LogLevel.HIGH);
return false;
}
return true;
}
catch(Exception ee)

{
FLogger.Log("发送不成功!"+ee.Message,LogLevel.HIGH);
return false;
}
}
private void NameserverProcessor_ConnectionEstablished(object sender, EventArgs e)

{
FLogger.Log("Connected to server",LogLevel.HIGH);
}
private void Nameserver_SignedIn(object sender, EventArgs e)

{
messenger.Owner.Status = PresenceStatus.Online;
conversation=messenger.CreateConversation();
conversation.Switchboard.TextMessageReceived += new TextMessageReceivedEventHandler(Switchboard_TextMessageReceived);
conversation.Switchboard.SessionClosed += new SBChangedEventHandler(Switchboard_SessionClosed);
conversation.Switchboard.ContactJoined += new ContactChangedEventHandler(Switchboard_ContactJoined);
conversation.Switchboard.ContactLeft += new ContactChangedEventHandler(Switchboard_ContactLeft);
FLogger.Log("Signed into the messenger network as " + messenger.Owner.Name ,LogLevel.HIGH);
}
private void Nameserver_SignedOff(object sender, SignedOffEventArgs e)

{
FLogger.Log("Signed off from the messenger network",LogLevel.HIGH);
}
private void Nameserver_ExceptionOccurred(object sender, ExceptionEventArgs e)

{
// ignore the unauthorized exception, since we're handling that error in another method.
if(e.Exception is UnauthorizedException)
return;
FLogger.Log("Nameserver exception:"+e.Exception.ToString(),LogLevel.HIGH);
}
private void NameserverProcessor_ConnectingException(object sender, ExceptionEventArgs e)

{
FLogger.Log("Connecting failed"+e.ToString(),LogLevel.HIGH);
}
private void Nameserver_AuthenticationError(object sender, ExceptionEventArgs e)

{
FLogger.Log("Authentication failed",LogLevel.HIGH);
}
private void Nameserver_ServerErrorReceived(object sender, MSNErrorEventArgs e)

{
// when the MSN server sends an error code we want to be notified.
FLogger.Log("Server error received:"+e.MSNError.ToString(),LogLevel.HIGH);
}
private void messenger_ConversationCreated(object sender, ConversationCreatedEventArgs e)

{
status=1;
}
private void messenger_TransferInvitationReceived(object sender, MSNSLPInvitationEventArgs e)

{
}
private void Switchboard_TextMessageReceived(object sender, TextMessageEventArgs e)

{
Notify(e.Sender.Mail,"这是系统通知,请勿回复!");
FLogger.Log(e.Sender.Name+" said:"+e.Message.Text,LogLevel.HIGH);
}
private void Switchboard_SessionClosed(object sender, EventArgs e)

{
status=1;
}
private void Switchboard_ContactJoined(object sender, ContactEventArgs e)

{
status=2;
}
private void Switchboard_ContactLeft(object sender, ContactEventArgs e)

{
status=1;
}
public string Status

{
get

{
switch (status)

{
case 1:
return "READY"; //已连接
case 2:
return "READY"; //远程联系人已进入会话
case 0:
return "NOT_READY";//未连接
default:
return "NOT_READY";
}
}
}
}
}
和dotMSN自带的例子的区别就是设置了状态,防止在不适当的时候做不适当的事导致出错。
dotMSN的例子就打了个时间差,没有对当前状态的判断。