using (Session user2Session = Session.Login(user2.UserID.UserName,
user2.Password, user2.UserID.Server))
{
// We'll be using these to trigger on
subscriptions being completed
ManualResetEvent user1ToUser2SubscriptionComplete =
new ManualResetEvent(false);
ManualResetEvent user2ToUser1SubscriptionComplete =
new ManualResetEvent(false);
// We have now logged in both users.
// Announce presence for both users.
user1Session.Send(new AvailableRequest());
user2Session.Send(new AvailableRequest());
// We need to have both users listen
for the Subscribe Packets. This is what each user
// will receive once we ask for a presence
subscription
user1Session.AddHandler(null,
typeof(SubscribeRequest),
IncomingSubscribeForUser1,
user1Session, false);
user2Session.AddHandler(null,
typeof(SubscribeRequest),
IncomingSubscribeForUser2,
user2Session, false);
// We need to have both users listen
for the Subscribed Response Packets. This is what
// each user will receive once their
subscription is approved.
user1Session.AddHandler(null,
typeof(SubscribedResponse),
IncomingSubscribedResponseForUser1, user1ToUser2SubscriptionComplete,
false);
user2Session.AddHandler(null,
typeof(SubscribedResponse),
IncomingSubscribedResponseForUser2, user2ToUser1SubscriptionComplete,
false);
/*
* Start out
by having User1 subscribe to User2's presence.
*
* If you're
not familiar with asynchronous programming, this
* is going to
be a bit confusing.
*
*/
user1Session.Send(new SubscribeRequest(user2.UserID));
if (!user1ToUser2SubscriptionComplete.WaitOne(30000,
false))
Assert.Fail("User
1 Subscribing to User 2 never completed.");
/*
* Now have User2
Subscribe to User1
*/
user2Session.Send(new SubscribeRequest(user1.UserID));
if (!user2ToUser1SubscriptionComplete.WaitOne(30000,
false))
Assert.Fail("User
2 Subscribing to User 1 never completed.");
/*
* Subscriptions are now completed.
*
* Let's pull down the roster for each
user, and make sure
* everything is correct.
*
*/
RosterResponse user1Roster = user1Session.Send(new
RosterRequest()) as RosterResponse;
RosterResponse user2Roster = user2Session.Send(new
RosterRequest()) as RosterResponse;
// We now have rosters for both users.
Let's check 'em.
Assert.IsTrue(user1Roster.Items.Count == 1,
"Invalid Number of items in User1 Roster");
Assert.IsTrue(user2Roster.Items.Count == 1,
"Invalid Number of items in User2 Roster");
Assert.IsTrue(user1Roster.Items.Contains(user2.UserID),
"User 2 is not found in
user1's roster");
Assert.IsTrue(user2Roster.Items.Contains(user1.UserID),
"User 2 is not found in
user1's roster");
Assert.IsTrue(user1Roster.Items.Item(user2.UserID).Subscription.Equals
("both", StringComparison.InvariantCultureIgnoreCase),
"Incorrect Subscription type in
User1's Roster");
Assert.IsTrue(user2Roster.Items.Item(user1.UserID).Subscription.Equals
("both", StringComparison.InvariantCultureIgnoreCase),
"Incorrect Subscription type
in User2's Roster");
}