public delegate void FoundSessionsDelegate(AvailableNetworkSessionCollection sessions, NetworkGame networkGame);\r
\r
\r
+ /// <summary>\r
+ /// Called when an exception is thrown during an asynchronous operation.\r
+ /// </summary>\r
+ /// <param name="exception">The exception that was thrown.</param>\r
+ /// <param name="networkGame">The NetworkGame that errored.</param>\r
+ public delegate void CaughtErrorDelegate(Exception exception, NetworkGame networkGame);\r
+\r
+ /// <summary>\r
+ /// Get and set the error delegate, called when an exception is thrown during\r
+ /// and asynchronous operation. This will occur if you try to create or join a\r
+ /// session without being logged into a profile.\r
+ /// </summary>\r
+ public CaughtErrorDelegate ErrorDelegate;\r
+\r
+\r
/// <summary>\r
/// Construct a NetworkGame with a lobby and a game.\r
/// </summary>\r
{\r
Debug.Assert(mNetworkSession == null);\r
\r
- mNetworkSession = NetworkSession.EndCreate(result);\r
- mNetworkSession.AllowHostMigration = true;\r
- mNetworkSession.AllowJoinInProgress = false;\r
-\r
+ try\r
+ {\r
+ mNetworkSession = NetworkSession.EndCreate(result);\r
+ mNetworkSession.AllowHostMigration = true;\r
+ mNetworkSession.AllowJoinInProgress = false;\r
+ mNetworkSession.GameStarted += new EventHandler<GameStartedEventArgs>(mNetworkSession_GameStarted);\r
+ }\r
+ catch (Exception e)\r
+ {\r
+ if (ErrorDelegate != null) ErrorDelegate(e, this);\r
+ return;\r
+ }\r
mJoinedSessionDelegate(mNetworkSession, this);\r
+ mJoinedSessionDelegate = null;\r
+ }\r
+\r
+\r
+ //gamestarted event\r
+ void mNetworkSession_GameStarted(object sender, GameStartedEventArgs e)\r
+ {\r
+ Reset();\r
}\r
\r
/// <summary>\r
}\r
private void FindSessionsEnd(IAsyncResult result)\r
{\r
- AvailableNetworkSessionCollection sessions = NetworkSession.EndFind(result);\r
+ AvailableNetworkSessionCollection sessions;\r
+ try\r
+ {\r
+ sessions = NetworkSession.EndFind(result);\r
+ }\r
+ catch (Exception e)\r
+ {\r
+ if (ErrorDelegate != null) ErrorDelegate(e, this);\r
+ return;\r
+ }\r
mFoundSessionsDelegate(sessions, this);\r
+ mFoundSessionsDelegate = null;\r
}\r
\r
/// <summary>\r
{\r
Debug.Assert(mNetworkSession == null);\r
\r
- mNetworkSession = NetworkSession.EndJoin(result);\r
-\r
+ try\r
+ {\r
+ mNetworkSession = NetworkSession.EndJoin(result);\r
+ mNetworkSession.GameStarted += new EventHandler<GameStartedEventArgs>(mNetworkSession_GameStarted);\r
+ }\r
+ catch (Exception e)\r
+ {\r
+ if (ErrorDelegate != null) ErrorDelegate(e, this);\r
+ return;\r
+ }\r
mJoinedSessionDelegate(mNetworkSession, this);\r
mJoinedSessionDelegate = null;\r
}\r
if (mNetworkSession.SessionState == NetworkSessionState.Lobby)\r
{\r
mLobby.Update(gameTime, this);\r
-\r
- //if state started as lobby and was changed to playing, call reset.\r
- if (mNetworkSession.SessionState == NetworkSessionState.Playing)\r
- Reset();\r
}\r
else if (mNetworkSession.SessionState == NetworkSessionState.Playing)\r
{\r
- //TODO reset needs to be called for all players, currently LocalGamerInfo throughs exception for all nonhosts\r
- // because in start game reset is only called on hosts games thus other clients never get an updated list\r
- // gamers.\r
-\r
-\r
-//thoughs exeption see TODO above\r
- //if (mGame.IsGameOver(LocalGamerInfo) || mGame.IsTerminated(LocalGamerInfo))\r
- //{\r
- // // TODO: Should support moving back to the session lobby.\r
- // LeaveSession();\r
- // return;\r
- //}\r
+ if (mGame.IsGameOver(LocalGamerInfo) || mGame.IsTerminated(LocalGamerInfo))\r
+ {\r
+ // TODO: Should support moving back to the session lobby.\r
+ LeaveSession();\r
+ return;\r
+ }\r
\r
if (HaveNeededEvents)\r
{\r