]> Dogcows Code - chaz/carfire/blobdiff - Project06/CS 3505 Project 06/CS 3505 Project 06/NetworkGame.cs
New delegate method for getting and handling errors during the async calls. Need...
[chaz/carfire] / Project06 / CS 3505 Project 06 / CS 3505 Project 06 / NetworkGame.cs
index 0d1ac6d00ca8fa7644095410d8630c8349ea404c..792d16d2063e8b2fe3f756bd216cc442ca7d819f 100644 (file)
@@ -36,6 +36,21 @@ namespace CS_3505_Project_06
         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
@@ -101,11 +116,27 @@ namespace CS_3505_Project_06
         {\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
@@ -135,8 +166,18 @@ namespace CS_3505_Project_06
         }\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
@@ -156,8 +197,16 @@ namespace CS_3505_Project_06
         {\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
@@ -210,7 +259,7 @@ namespace CS_3505_Project_06
             mNetworkSession.StartGame();\r
             mNetworkSession.ResetReady();\r
 \r
-            Reset();\r
+            //Reset();\r
         }\r
 \r
 \r
@@ -235,18 +284,12 @@ namespace CS_3505_Project_06
                 }\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
This page took 0.028996 seconds and 4 git commands to generate.