diff -r 89d6a7a84779 -r 25a17d01db0c Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/dealer_8cpp-source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/dealer_8cpp-source.html Fri Jan 22 18:26:19 2010 +0000 @@ -0,0 +1,973 @@ + +
+00001 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +00002 // All rights reserved. +00003 // This component and the accompanying materials are made available +00004 // under the terms of "Eclipse Public License v1.0" +00005 // which accompanies this distribution, and is available +00006 // at the URL "http://www.eclipse.org/legal/epl-v10.html". +00007 // +00008 // Initial Contributors: +00009 // Nokia Corporation - initial contribution. +00010 // +00011 // Contributors: +00012 // +00013 // Description: +00014 // +00015 +00016 #include <e32base.h> +00017 #include <e32cons.h> +00018 +00019 #include <btsdp.h> +00020 #include "dealer.h" +00021 #include "cardgamedealer.h" +00022 +00023 +00024 +00028 CScabbyQueenDealer* CScabbyQueenDealer::NewL(CConsoleBase& aConsole, +00029 RArray<TInetAddr>& aRemoteNames, +00030 RSocket& aSocket) +00031 { +00032 CScabbyQueenDealer* self = new CScabbyQueenDealer(aConsole, aRemoteNames, aSocket); +00033 self->ConstructL(); +00034 return self; +00035 } +00036 +00040 CScabbyQueenDealer::CScabbyQueenDealer(CConsoleBase& aConsole, +00041 RArray<TInetAddr>& aRemoteNames, +00042 RSocket& aSocket) +00043 :iConsole(aConsole) +00044 { +00045 TRAPD(err,CCardGameDealer::ConstructL(aRemoteNames, aSocket)); +00046 } +00047 +00048 void CScabbyQueenDealer::StartTheGame() +00049 { +00050 InformStaticPlayers(); +00051 } +00052 +00056 CScabbyQueenDealer::~CScabbyQueenDealer() +00057 { +00058 iLostPlayers.Close(); +00059 iFinishedPlayers.Close(); +00060 iCurrentPlayers.Close(); +00061 } +00062 +00066 void CScabbyQueenDealer::ConstructL() +00067 { +00068 iPlayerToken = 0; +00069 // construct the deck. +00070 iFullDeck = HBufC8::NewL(KDeckBufferLength); +00071 iFullDeck->Des().Append(KHearts); +00072 iFullDeck->Des().Append(KDiamonds); +00073 iFullDeck->Des().Append(KSpades); +00074 iFullDeck->Des().Append(KClubs); +00075 iGameOverBuffer = KErrCompletion; +00076 iPlayerNum = 0; +00077 } +00078 +00082 void CScabbyQueenDealer::SendPlayerNumbers() +00083 { +00084 // Player are waiting to receive player numbers from +00085 // us so give them +00086 if (iPlayerNum() < iRemoteNames.Count()) +00087 { +00088 iSendMode = ESendPlayerNum; +00089 BaseSendTo(iPlayerNum, iRemoteNames[iPlayerNum()]); +00090 iPlayerNum()++; +00091 } +00092 +00093 } +00097 void CScabbyQueenDealer::DealDeckL() +00098 { +00099 DealCardsL(*iFullDeck); +00100 iConsole.Printf(_L("\nDealt")); +00101 iFullDeck->Des().Delete(0, iFullDeck->Length()); +00102 } +00103 +00104 +00108 void CScabbyQueenDealer::SendComplete(TInt aError) +00109 { +00110 switch(iSendMode) +00111 { +00112 case ESendPlayerNum: +00113 SendPlayerNumbers(); +00114 break; +00115 case ESendRecvToken: +00116 ReceivingPlayerInformed(aError); +00117 break; +00118 +00119 case ESendSendToken: +00120 RecvHandSize(aError); +00121 break; +00122 +00123 case ESendWaitToken: +00124 SendCompleted(aError); +00125 break; +00126 +00127 case ESendCard: +00128 CardSent(); +00129 break; +00130 +00131 case ESendCheckRecvStatus: +00132 SendOfCheckStatusComplete(aError); +00133 break; +00134 +00135 case ESendCheckSenderStatus: +00136 SendOfCheckStatusComplete(aError); +00137 break; +00138 +00139 case ESendReadyInquiry: +00140 ReadyInquirySent(aError); +00141 break; +00142 +00143 case ESendPlayerUpdate: +00144 PlayerUpdateSent(aError); +00145 break; +00146 +00147 case ESendHandSize: +00148 SendCompleted(aError); +00149 break; +00150 +00151 case ESendPlayerCardNumber: +00152 SendCompleted(aError); +00153 break; +00154 +00155 case ESendGameOver: +00156 SentGameOverMessage(); +00157 break; +00158 default: +00159 break; +00160 } +00161 } +00162 +00163 +00164 +00168 void CScabbyQueenDealer::RecvComplete(TInetAddr /*aRecvAddr*/, TInt /*aError*/) +00169 { +00170 +00171 switch (iRecvMode) +00172 { +00173 case ERecvSuccess: +00174 InformSendingPlayer(); +00175 break; +00176 +00177 case ERecvCardNotification: +00178 RecvOfFinishNotify(); +00179 break; +00180 +00181 case EDealerRecvCard: +00182 RecvOfCardComplete(); +00183 break; +00184 +00185 case ERecvStatusRecv: +00186 DealWithStatusFromRecv(); +00187 break; +00188 +00189 case ERecvStatusSender: +00190 DealWithStatusFromSender(); +00191 break; +00192 +00193 case ERecvReadyResult: +00194 SendReadyInquiry();// call the next +00195 break; +00196 +00197 case ERecvUpdateResult: +00198 SendPlayerUpdate();//call the next +00199 break; +00200 +00201 case EDealerRecvHandSize: +00202 SendHandSize(); +00203 break; +00204 +00205 case EDealerRecvCardNum: +00206 SendCardNumber(); +00207 break; +00208 +00209 case EDealerRecvAck: +00210 RecvOfAckComplete(); +00211 break; +00212 +00213 default: +00214 break; +00215 } +00216 +00217 +00218 } +00219 +00220 void CScabbyQueenDealer::TimerComplete() +00221 { +00222 // the ack timer has complete before we have received the ack +00223 iConsole.Printf(_L("\nTimed out! Informing players of Game Over")); +00224 iConsole.Printf(_L("\nFatal Error, exiting game")); +00225 BaseCancelSendTo(); +00226 InformNextGameOver(); +00227 +00228 } +00229 +00230 +00234 void CScabbyQueenDealer::ShowDeckL() +00235 { +00236 TInt cardNum; +00237 iConsole.Printf(_L("\nThe Deck...\n")); +00238 +00239 for (TInt i=0; i<=iFullDeck->Length()-KCardLength; i=i+KCardLength) +00240 { +00241 if (i==0) +00242 cardNum = i; +00243 else +00244 cardNum = i/2; +00245 HBufC16* buffer = HBufC16::NewL(4); +00246 buffer->Des().Copy(iFullDeck->Mid(i,2)); +00247 iConsole.Printf(_L("%d - %S | "),cardNum,buffer); +00248 } +00249 iConsole.Getch(); +00250 } +00251 +00252 +00257 void CScabbyQueenDealer::InformReceivingPlayer() +00258 { +00259 if (iPlayerToken == iRemoteNames.Count()) +00260 { +00261 // reset the Token to start of socket array +00262 iPlayerToken = 0; +00263 } +00264 +00265 iRecvMode = ERecvSuccess; +00266 iCheckSize.Create(iAck); +00267 BaseRecvFrom(iAck); // On return iRecvDes will be filled with iAck +00268 iCheckSize.Close(); +00269 //iAckTimer->Cancel(); +00270 StopTimer(); +00271 iStatusBuffer = EReceiving; +00272 iSendMode = ESendRecvToken;// set the mode for the active object +00273 BaseSendTo(iStatusBuffer, iRemoteNames[iPlayerToken]); +00274 StartTimer(KMaxSendTime); +00275 } +00276 +00284 void CScabbyQueenDealer::ReceivingPlayerInformed(TInt aError) +00285 { +00286 if (aError == KErrNone) +00287 { +00288 +00289 } +00290 else +00291 { +00292 // send has failed. +00293 StopTimer(); +00294 BaseCancelRecvFrom(); +00295 // that the game is over. +00296 iConsole.Printf(_L("\nFatal Error, exiting game")); +00297 iCount = iSender; +00298 InformNextGameOver(); +00299 } +00300 } +00301 +00305 void CScabbyQueenDealer::InformSendingPlayer() +00306 { +00307 if (iAck() == KErrNone) +00308 { +00309 StopTimer(); +00310 // We wont set an ack this time, instead when the sender sends +00311 // back their hand size we will use this as an ack. +00312 iStatusBuffer = ESending; +00313 iSendMode = ESendSendToken; +00314 BaseSendTo(iStatusBuffer, iRemoteNames[iSender]); +00315 StartTimer(KMaxSendTime); +00316 } +00317 else +00318 { +00319 // We did get an Ack back but it was what we expected +00320 } +00321 +00322 } +00323 +00328 void CScabbyQueenDealer::InformStaticPlayers() +00329 { +00330 StopTimer(); +00331 InformStaticPlayersProcess(); +00332 } +00333 +00337 void CScabbyQueenDealer::InformStaticPlayersProcess() +00338 { +00339 // inform everyone except current receviver (iPlayerToken) and iSender +00340 while (iFinishedPlayers.Find(iPlayerToken) != KErrNotFound)// make sure we are not a finished player +00341 { +00342 iPlayerToken++; +00343 if (iPlayerToken == iRemoteNames.Count()) +00344 iPlayerToken = 0;// we have come to the end so start over. +00345 } +00346 iCount++;// increment count, this will be used to address the socket array. +00347 +00348 if (iPlayerToken == 0) +00349 iSender = iRemoteNames.Count()-1; +00350 else +00351 iSender = iPlayerToken-1; +00352 +00353 if (iPlayerCount == 2) +00354 { +00355 InformReceivingPlayer();// no waiting players so move directly to next stage +00356 } +00357 else +00358 { +00359 // as there are more that 2 players we need to send out wait nofitications +00360 if (iCount == iRemoteNames.Count()) +00361 { +00362 iCount = 0; +00363 } +00364 +00365 +00366 if (iCount != iPlayerToken && iCount != iSender) +00367 // make sure that iCount isn't a sender or receiver +00368 { +00369 // Get ready to receive the ack back +00370 iRecvMode = EDealerRecvAck; +00371 iCheckSize.Create(iAck); +00372 BaseRecvFrom(iAck); +00373 iCheckSize.Close(); +00374 StopTimer(); +00375 iSendMode = ESendWaitToken; +00376 iStatusBuffer = EWaiting; +00377 BaseSendTo(iStatusBuffer, iRemoteNames[iCount]); +00378 StartTimer(KMaxSendTime); +00379 } +00380 else +00381 { +00382 // If iCount is a S or R then recall the function to increment iCount +00383 InformStaticPlayers(); +00384 } +00385 } +00386 } +00387 +00395 void CScabbyQueenDealer::StaticPlayersInformed(TInt aError) +00396 { +00397 StopTimer(); +00398 if (aError == KErrNone) +00399 { +00400 // this will be called when all static players have been informed +00401 iResponseCount = 0; +00402 InformReceivingPlayer(); +00403 } +00404 else +00405 { +00406 // send has failed. +00407 BaseCancelSendTo(); +00408 iConsole.Printf(_L("\nFatal Error, exiting game")); +00409 InformNextGameOver(); +00410 } +00411 +00412 } +00413 +00417 void CScabbyQueenDealer::RecvHandSize(TInt aError) +00418 { +00419 if (aError == KErrNone) +00420 { +00421 // This will also act as the ack for sender token send as well +00422 iRecvMode = EDealerRecvHandSize; +00423 iCheckSize.Create(iSenderHandSize); +00424 BaseRecvFrom(iSenderHandSize); +00425 iCheckSize.Close(); +00426 } +00427 else +00428 { +00429 // send has failed. +00430 BaseCancelSendTo(); +00431 iConsole.Printf(_L("\nFatal Error, exiting game")); +00432 iCount = iSender; +00433 InformNextGameOver(); +00434 } +00435 +00436 } +00437 +00438 +00444 void CScabbyQueenDealer::RecvOfAckComplete() +00445 { +00446 // when the ack recv completes we will get called. +00447 // if all is ok then we want to setup the next stage. +00448 iResendCount = 0; +00449 StopTimer(); +00450 if (iAck() == KErrNone)// did they receive it ok? +00451 { +00452 switch (iSendMode) +00453 { +00454 case ESendHandSize: +00455 ReceiveCardNum(); +00456 break; +00457 +00458 case ESendWaitToken: +00459 { +00460 // We have received the ack after dealer told waiting player +00461 iWaitingPlayerCount++; +00462 if (iWaitingPlayerCount == iPlayerCount-2) +00463 { +00464 // All waiting players informed +00465 StaticPlayersInformed(KErrNone); +00466 iWaitingPlayerCount = 0; +00467 } +00468 else +00469 { +00470 //we havent finished telling all the waiting players yet +00471 InformStaticPlayers(); +00472 } +00473 } +00474 +00475 break; +00476 default: +00477 break; +00478 } +00479 } +00480 else +00481 { +00482 // we have the ack back but the sender has reported an error +00483 iConsole.Printf(_L("\nFatal Error, exiting game")); +00484 iCount = 0; +00485 BaseCancelSendTo(); +00486 InformNextGameOver(); +00487 } +00488 } +00489 +00495 void CScabbyQueenDealer::SendHandSize() +00496 { +00497 // We have now recv the hand size from sender, this is also the ack. +00498 if (iSenderHandSize() >= 0) +00499 { +00500 StopTimer(); +00501 // get ready to receive the ack +00502 iRecvMode = EDealerRecvAck; +00503 iCheckSize.Create(iAck); +00504 BaseRecvFrom(iAck); +00505 iCheckSize.Close(); +00506 //now send the hand size on +00507 iSendMode = ESendHandSize; +00508 BaseSendTo(iSenderHandSize, iRemoteNames[iPlayerToken]); +00509 StartTimer(KMaxSendTime); +00510 } +00511 else +00512 { +00513 // We have fail to send twice +00514 iConsole.Printf(_L("\nFatal Error, exiting game")); +00515 BaseCancelSendTo(); +00516 iCount = iPlayerToken; +00517 InformNextGameOver(); +00518 } +00519 +00520 } +00521 +00522 +00527 void CScabbyQueenDealer::InformNextGameOver() +00528 { +00529 +00530 if (iRemoteNames.Count() > iLostPlayers.Count())// still got players? +00531 { +00532 // before we tell the next player that we have finished +00533 // check that we havent already disconnected. +00534 TInt index = iLostPlayers.Find(iCount); +00535 if (index == KErrNotFound) +00536 { +00537 // remove the device just lost +00538 iLostPlayers.Append(iCount); +00539 iRemoteNames.Remove(iCount); +00540 iCount++;//move onto next +00541 // we are ok to disconnect a device +00542 +00543 if (iCount == iRemoteNames.Count()) +00544 iCount = 0; +00545 //now send the hand size on +00546 iSendMode = ESendGameOver; +00547 BaseSendTo(iGameOverBuffer, iRemoteNames[iCount]); +00548 } +00549 else +00550 { +00551 // device already disconnected, move onto next +00552 iCount++; +00553 InformNextGameOver(); +00554 } +00555 } +00556 else +00557 { +00558 iConsole.Printf(_L("\nAll players have left the game")); +00559 } +00560 +00561 } +00562 +00566 void CScabbyQueenDealer::ReceiveCardNum() +00567 { +00568 iRecvMode = EDealerRecvCardNum; +00569 BaseSendTo(iCardNum, iRemoteNames[iPlayerToken]); +00570 } +00571 +00576 void CScabbyQueenDealer::SendCardNumber() +00577 { +00578 if (iCardNum() >= 0) +00579 { +00580 StopTimer(); +00581 // get ready to receive the card (this will also be the ack) +00582 RecvCard(); +00583 // send the player the card number we just received +00584 iSendMode = ESendPlayerCardNumber; +00585 BaseSendTo(iCardNum, iRemoteNames[iSender]); +00586 StartTimer(KMaxSendTime); +00587 } +00588 else +00589 { +00590 // We have failed to send twice, start the game over procedure. +00591 iConsole.Printf(_L("\nFatal Error, exiting game")); +00592 BaseCancelSendTo(); +00593 BaseCancelRecvFrom(); +00594 iCount = iPlayerToken; +00595 InformNextGameOver(); +00596 } +00597 } +00598 +00604 void CScabbyQueenDealer::SendCompleted(TInt aError) +00605 { +00606 // in the case where the send completes successfully nothing will be done. +00607 // if there was an error in the send we will cancel the timer and attempt a resend +00608 if (aError !=KErrNone) +00609 { +00610 // we have failed to send +00611 // cancel timer +00612 StopTimer(); +00613 BaseCancelRecvFrom(); +00614 // We have failed to send twice, start the game over procedure. +00615 iConsole.Printf(_L("\nFatal Error, exiting game")); +00616 iCount = 0; +00617 InformNextGameOver(); +00618 } +00619 else +00620 { +00621 //we have sent successfully, timer will continue. +00622 // when recv of ack completes we can proceed +00623 } +00624 } +00625 +00626 +00630 void CScabbyQueenDealer::RecvCard() +00631 { +00632 iRecvMode = EDealerRecvCard; +00633 BaseRecvFrom(iReceivedCard); +00634 } +00635 +00636 +00641 void CScabbyQueenDealer::RecvOfCardComplete() +00642 { +00643 // we have recvd the card from sender. this is also the ack. +00644 if (iReceivedCard != KNullDesC8) +00645 { +00646 StopTimer(); +00647 iSendMode = ESendCard; +00648 BaseSendTo(iReceivedCard, iRemoteNames[iPlayerToken]); +00649 } +00650 else +00651 { +00652 // We have failed to send twice so start the Game over procedure. +00653 iConsole.Printf(_L("\nFatal Error, exiting game")); +00654 iCount = iSender; +00655 BaseCancelSendTo(); +00656 InformNextGameOver(); +00657 } +00658 +00659 } +00660 +00665 void CScabbyQueenDealer::CardSent() +00666 { +00667 // We have sent the card to the player, now get ready to receive an ack from them +00668 iRecvMode = ERecvCardNotification; +00669 iCheckSize.Create(iStatusBuffer); +00670 BaseRecvFrom(iStatusBuffer); +00671 iCheckSize.Close(); +00672 } +00673 +00674 +00680 void CScabbyQueenDealer::RecvOfFinishNotify() +00681 { +00682 // receiver has told us he has received the card, he and the sender are waiting +00683 // this stuff want to go into function called after we have heard back from player status +00684 if (iStatusBuffer() == EReceivedCard) +00685 { +00686 iConsole.Printf(_L("\nPlayer[%d] ----> Player[%d]"),iSender , iPlayerToken); +00687 CheckPlayerStatus(); +00688 } +00689 else +00690 { +00691 iConsole.Printf(_L("\nWe were expecting received card!")); +00692 } +00693 +00694 } +00695 +00701 void CScabbyQueenDealer::SendOfCheckStatusComplete(TInt aError) +00702 { +00703 if (iSendMode == ESendCheckRecvStatus) +00704 { +00705 // we have sent to the recv'r +00706 if (aError == KErrNone) +00707 { +00708 iRecvMode = ERecvStatusRecv; +00709 iCheckSize.Create(iGameStatus); +00710 BaseRecvFrom(iGameStatus); +00711 iCheckSize.Close(); +00712 } +00713 else +00714 { +00715 // send has failed. +00716 StartTimer(KMaxSendTime); +00717 BaseCancelSendTo(); +00718 iConsole.Printf(_L("\nFatal Error, exiting game")); +00719 iCount = iSender; +00720 InformNextGameOver(); +00721 } +00722 } +00723 else +00724 { +00725 // we have sent to the sender. +00726 if (aError == KErrNone) +00727 { +00728 iRecvMode = ERecvStatusSender; +00729 iCheckSize.Create(iGameStatus); +00730 BaseRecvFrom(iGameStatus); +00731 iCheckSize.Close(); +00732 } +00733 else +00734 { +00735 // send has failed. +00736 StopTimer(); +00737 BaseCancelSendTo(); +00738 iConsole.Printf(_L("\nFatal Error, exiting game")); +00739 iCount = iPlayerToken; +00740 InformNextGameOver(); +00741 } +00742 } +00743 } +00744 +00745 +00750 void CScabbyQueenDealer::DealWithStatusFromSender() +00751 { +00752 // We have got the status of the Sender, deal with it +00753 StopTimer(); +00754 iResendCount = 0; +00755 DealWithGameStatus(iGameStatus()); +00756 } +00757 +00763 void CScabbyQueenDealer::DealWithStatusFromRecv() +00764 { +00765 // We have got the status from receiver, deal with it +00766 StopTimer(); +00767 iResendCount = 0; +00768 DealWithGameStatus(iGameStatus()); +00769 // Now we want to tell the Sender to send their status +00770 iGameStatus = EGameStatusRequest; +00771 iSendMode = ESendCheckSenderStatus; +00772 BaseSendTo(iGameStatus, iRemoteNames[iSender]); +00773 StartTimer(KMaxSendTime); +00774 } +00775 +00776 +00780 void CScabbyQueenDealer::CheckPlayerStatus() +00781 { +00782 // Tell the Receiver that we want their game status +00783 StopTimer(); +00784 iGameStatus = EGameStatusRequest; +00785 iSendMode = ESendCheckRecvStatus; +00786 BaseSendTo(iGameStatus, iRemoteNames[iPlayerToken]); +00787 StartTimer(KMaxSendTime); +00788 } +00789 +00790 +00797 void CScabbyQueenDealer::DealWithGameStatus(TGameStatus aGameStatus) +00798 { +00799 +00800 if (iResponseCount == 0) +00801 { +00802 // First response, reset Update +00803 iCurrentPlayers.Reset(); +00804 iPlayerUpdate.Delete(0,iPlayerUpdate.Length()); +00805 } +00806 +00807 iResponseCount++; +00808 +00809 // Check the enum status that we have received, and append the +00810 // appropriate player number to the appropriate array. +00811 switch(aGameStatus) +00812 { +00813 case EPlayingZero: +00814 iCurrentPlayers.Append(0); +00815 break; +00816 +00817 case EPlayingOne: +00818 iCurrentPlayers.Append(1); +00819 break; +00820 +00821 case EPlayingTwo: +00822 iCurrentPlayers.Append(2); +00823 break; +00824 +00825 case EPlayingThree: +00826 iCurrentPlayers.Append(3); +00827 break; +00828 +00829 case EPlayingFour: +00830 iCurrentPlayers.Append(4); +00831 break; +00832 +00833 case EPlayingFive: +00834 iCurrentPlayers.Append(5); +00835 break; +00836 +00837 case EPlayingSix: +00838 iCurrentPlayers.Append(6); +00839 break; +00840 +00841 case EPlayingSeven: +00842 iCurrentPlayers.Append(7); +00843 break; +00844 +00845 case EFinishedZero: +00846 iFinishedPlayers.Append(0); +00847 break; +00848 +00849 case EFinishedOne: +00850 iFinishedPlayers.Append(1); +00851 break; +00852 +00853 case EFinishedTwo: +00854 iFinishedPlayers.Append(2); +00855 break; +00856 +00857 case EFinishedThree: +00858 iFinishedPlayers.Append(3); +00859 break; +00860 +00861 case EFinishedFour: +00862 iFinishedPlayers.Append(4); +00863 break; +00864 +00865 case EFinishedFive: +00866 iFinishedPlayers.Append(5); +00867 break; +00868 +00869 case EFinishedSix: +00870 iFinishedPlayers.Append(6); +00871 break; +00872 +00873 case EFinishedSeven: +00874 iFinishedPlayers.Append(7); +00875 break; +00876 +00877 default: +00878 break; +00879 } +00880 +00881 if (iResponseCount == 2)// heard back from both +00882 { +00883 if (iOldPlayerUpdate == KNullDesC8)// first time +00884 { +00885 // as this is the first time we can construct the +00886 // update descriptor as follows +00887 // append any finished players +00888 for (TInt i=0;i<iFinishedPlayers.Count();i++) +00889 { +00890 iPlayerUpdate.AppendNum(iFinishedPlayers[i]); +00891 } +00892 // append the F that seperates In and Out Players. +00893 iPlayerUpdate.Append('F'); +00894 +00895 // append the players that are still in +00896 for (TInt i=0;i<iCurrentPlayers.Count();i++) +00897 { +00898 iPlayerUpdate.AppendNum(iCurrentPlayers[i]); +00899 } +00900 +00901 // append all the players that didnt do nothing +00902 for (TInt i=0;i<iRemoteNames.Count();i++) +00903 { +00904 if (i == iPlayerToken || i == iSender) +00905 { +00906 } +00907 else +00908 { +00909 iPlayerUpdate.AppendNum(i); +00910 } +00911 } +00912 } +00913 else +00914 { +00915 +00916 // as oldupdate contains something then this isn't the first time +00917 // a card has been exchanged we need to inspect the finished array. +00918 // for each of the values in the array we need to check whether it is to the left of the +00919 // F (we already know that they have finished) if it isn't then we need to add it. +00920 // and remove it from the right of the F (these are the current players) +00921 +00922 +00923 TInt index = 0; +00924 // locate where the F is +00925 while (iOldPlayerUpdate[index] != 'F') +00926 { +00927 index++; +00928 } +00929 +00930 // index is position of F +00931 // get a pointer to finished players +00932 TPtrC8 playersOut(iOldPlayerUpdate.Mid(0, index)); +00933 +00934 +00935 for (TInt i=0; i<iFinishedPlayers.Count();i++) +00936 { +00937 // i is a finished player, check that we have this number to the left of the F +00938 // if we dont then add it. +00939 TBuf8<1> num; +00940 num.AppendNum(iFinishedPlayers[i]); +00941 TInt loc = playersOut.Find(num);// has num finished already +00942 if (loc == KErrNotFound) +00943 { +00944 // we have finished with i but it isnt in the finished descriptor list +00945 iPlayerUpdate.AppendNum(iFinishedPlayers[i]); +00946 TInt match = iOldPlayerUpdate.Find(num); +00947 if (match != KErrNotFound) +00948 { +00949 iOldPlayerUpdate.Delete(match, 1); +00950 } +00951 } +00952 } +00953 iPlayerUpdate.Insert(0, playersOut); +00954 index = 0; +00955 // locate where the F is +00956 while (iOldPlayerUpdate[index] != 'F') +00957 { +00958 index++; +00959 } +00960 iOldPlayerUpdate.Delete(0, index); +00961 } +00962 +00963 +00964 if (iOldPlayerUpdate.Length() == 2)// we only have one char to the right of the F +00965 { +00966 // we have our loser. hopefully they will have the scabby queen! +00967 // instead of sending a ready inquiry send a notification that tells the user game has finished. +00968 iGameOver = ETrue; +00969 } +00970 +00971 iPlayerUpdate.Append(iOldPlayerUpdate); +00972 iOldPlayerUpdate.Copy(iPlayerUpdate); +00973 TBufC16<20> buffer; +00974 buffer.Des().Copy(iPlayerUpdate); +00975 iConsole.Printf(_L("Update : %S"), &buffer); +00976 +00977 iResponseCount=0; +00978 iCount = 0; +00979 SendReadyInquiry(); +00980 } +00981 } +00982 +00987 void CScabbyQueenDealer::TimerCompleted() +00988 { +00989 // the ack timer has complete before we have received the ack +00990 iConsole.Printf(_L("\nTimed out! Informing players of Game Over")); +00991 iConsole.Printf(_L("\nFatal Error, exiting game")); +00992 BaseCancelSendTo(); +00993 InformNextGameOver(); +00994 } +00995 +00996 +01001 void CScabbyQueenDealer::ReadyInquirySent(TInt aError) +01002 { +01003 // we have sent a size update +01004 if (aError == KErrNone) +01005 { +01006 iRecvMode = ERecvReadyResult; +01007 iCheckSize.Create(iGameStatus); +01008 BaseRecvFrom(iGameStatus); +01009 iCheckSize.Close(); +01010 iCount++; +01011 } +01012 else +01013 { +01014 // send has failed. +01015 iConsole.Printf(_L("\nFatal Error, exiting game")); +01016 BaseCancelSendTo(); +01017 InformNextGameOver(); +01018 } +01019 +01020 } +01021 +01022 +01027 void CScabbyQueenDealer::SendReadyInquiry() +01028 { +01029 StopTimer(); +01030 if (iCount < iRemoteNames.Count()) +01031 { +01032 iSendMode = ESendReadyInquiry; +01033 iUpdateSize = iPlayerUpdate.Length();// this is the update size +01034 BaseSendTo(iUpdateSize, iRemoteNames[iCount]); +01035 StartTimer(KMaxSendTime); +01036 } +01037 else +01038 { +01039 // all are ready, move on to send update +01040 iCount = 0; +01041 SendPlayerUpdate(); +01042 } +01043 } +01044 +01049 void CScabbyQueenDealer::SendPlayerUpdate() +01050 {// here we need to a send update +01051 StopTimer(); +01052 BaseCancelSendTo(); +01053 if (iCount < iRemoteNames.Count()) +01054 { +01055 iSendMode = ESendPlayerUpdate; +01056 BaseSendTo(iPlayerUpdate, iRemoteNames[iCount]); +01057 StartTimer(KMaxSendTime); +01058 } +01059 else +01060 {// all are ready, move on to send update +01061 //DONE! +01062 if (iGameOver) +01063 { +01064 iConsole.Printf(_L("\n GAME OVER")); +01065 } +01066 else +01067 { +01068 iCount = 0; +01069 iPlayerToken++;// player token is on reciever always!! +01070 InformStaticPlayers();//START OVER +01071 } +01072 } +01073 } +01074 +01079 void CScabbyQueenDealer::PlayerUpdateSent(TInt aError) +01080 { +01081 if (aError == KErrNone) +01082 { +01083 iRecvMode = ERecvUpdateResult; +01084 iCheckSize.Create(iGameStatus); +01085 BaseRecvFrom(iGameStatus); +01086 iCheckSize.Close(); +01087 iCount++; +01088 } +01089 else +01090 { +01091 // send has failed. +01092 StopTimer(); +01093 BaseCancelSendTo(); +01094 iConsole.Printf(_L("\nFatal Error, exiting game")); +01095 InformNextGameOver(); +01096 } +01097 } +01098 +01103 void CScabbyQueenDealer::SentGameOverMessage() +01104 { +01105 // we have sent a message to a player, move onto next +01106 iConsole.Printf(_L("\nPlayer %d has left the game"), iCount); +01107 InformNextGameOver(); +01108 } +