diff -r 89d6a7a84779 -r 25a17d01db0c Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/_c_inverter_8cpp-source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/_c_inverter_8cpp-source.html Fri Jan 22 18:26:19 2010 +0000 @@ -0,0 +1,195 @@ + + +TB10.1 Example Applications: examples/Base/MessageQueueExample/Inverter/src/CInverter.cpp Source File + + + + +

examples/Base/MessageQueueExample/Inverter/src/CInverter.cpp

Go to the documentation of this file.
00001 // Copyright (c) 2008-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 // The following class describes the Inverter class which recieves input 
+00015 // through InverterInq and sends it to InverterOutQ after inverting the recieved words.
+00016 // It implements a periodic timer which opens the InverterInq every 10 seconds.
+00017 //
+00018 
+00019 
+00020 
+00025 #include "CInverter.h"
+00026 #include "e32keys.h"     // for EKeyEscape.
+00027 
+00028 //Periodic timer interval of 10 seconds.
+00029 const TInt KPeriodicTimerInterval10Sec(10000000);
+00030 
+00031 //Error code to indicate Stop command.
+00032 const TInt KErrStop = -100; 
+00033 
+00037 CInverter::~CInverter()
+00038         {
+00039     if(iTimer)
+00040         {
+00041         // Calling Cancel without checking if the timer is active is safe
+00042         iTimer->Cancel();
+00043         }
+00044     delete iTimer;
+00045         iInMsgQ.Close();
+00046         iOutMsgQ.Close();
+00047         }
+00048 
+00049 CInverter* CInverter::NewL()
+00050         {
+00051         CInverter* self=new(ELeave)CInverter();
+00052         CleanupStack::PushL(self);
+00053         self->ConstructL();
+00054         CleanupStack::Pop(self);
+00055         return self;
+00056         }
+00060 void CInverter::ConstructL()
+00061     {
+00062     // Initialize the periodic timer.
+00063     iTimer = CPeriodic::NewL(CActive::EPriorityIdle);
+00064     // Start the periodic timer, when ever the time elapsed
+00065     // the StaticWake() will get called.
+00066 
+00067     iTimer->Start(KPeriodicTimerInterval10Sec, KPeriodicTimerInterval10Sec,TCallBack(StaticWake, this));
+00068     
+00069     }
+00070 
+00075 TInt CInverter::StaticWake(TAny* aAny)
+00076         {
+00077         CInverter* self = static_cast<CInverter*>( aAny );
+00078         TInt ret = self->RecieveMsg();
+00079         if(ret!= KErrStop) //KErrStop indicates that system has to be stopped and no more messages to be sent.
+00080         self->SendMsg();
+00081         return KErrNone; // Return value ignored by CPeriodic
+00082         }
+00083 
+00090 TInt CInverter::RecieveMsg()
+00091     {
+00092 
+00093     //Opens the message queue input to the inverter.
+00094     _LIT(KGlobalInverterInQ, "InverterInQ");
+00095     TInt ret = iInMsgQ.OpenGlobal(KGlobalInverterInQ); 
+00096         
+00097         if (ret == KErrNone)
+00098         {
+00099         //Recieve the message coming from the first process.
+00100         iMsgQData.Zero();
+00101         iInMsgQ.ReceiveBlocking(iMsgQData);
+00102         
+00103         //If the recieved data indicates stop command, stop the system.
+00104         if(iMsgQData[0]==EKeyEscape)
+00105                         {
+00106                         this->Stop();
+00107                         return KErrStop;
+00108                         }
+00109         }
+00110         return KErrNone;
+00111     }
+00112 
+00116 void CInverter::SendMsg()
+00117         {
+00118         //Opens the global message Queue named InverterOutQ.
+00119         _LIT(KGlobalInverterOutQ, "InverterOutQ");
+00120         TInt ret = iOutMsgQ.OpenGlobal(KGlobalInverterOutQ); 
+00121         
+00122         //Sends the inverted words to the opened message queue.
+00123         if (ret == KErrNone)
+00124         {
+00125         DoInvert();
+00126         iOutMsgQ.SendBlocking(idestMsg);
+00127         }
+00128         }
+00129 
+00133 void CInverter::DoInvert()
+00134 {
+00135 idestMsg.Zero();
+00136 TInt i=0; 
+00137 while(iMsgQData[i]!= '\r')
+00138 {
+00139         while((iMsgQData[i]!= ' ')&&(iMsgQData[i]!= '\r'))
+00140         {
+00141         iwords.Append(iMsgQData[i]);
+00142         i++; 
+00143         }
+00144         ReverseWord(iwords);
+00145         idestMsg.Append(itmpWord); 
+00146         idestMsg.Append(' ');
+00147         if(iMsgQData[i]== '\r')
+00148         {
+00149         i--;
+00150         }
+00151         i++;
+00152         iwords.Zero();
+00153     }
+00154 }
+00155 
+00159 void CInverter::ReverseWord(TBuf<20> buf)
+00160         {
+00161         itmpWord.Zero();
+00162         TInt size = (buf.Size())/2;
+00163         for(int i=1; i<= size; i++)
+00164                 {
+00165                 itmpWord.Append(buf[size -i]);
+00166                 }
+00167         }
+00168 
+00173 void CInverter::Stop()
+00174         {
+00175         iTimer->Cancel();
+00176         CActiveScheduler::Stop();
+00177         }
+00178 
+00179 LOCAL_C void DoStartL()
+00180         {
+00181 
+00182         CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+00183         CleanupStack::PushL(scheduler);
+00184         CActiveScheduler::Install(scheduler);   
+00185         
+00186         CInverter* invert = CInverter::NewL();
+00187         CleanupStack::PushL(invert);
+00188         
+00189         //Start the scheduler for the periodic timer
+00190         CActiveScheduler::Start();
+00191         
+00192         CleanupStack::PopAndDestroy(invert);
+00193         CleanupStack::PopAndDestroy(scheduler);
+00194         }
+00195 
+00196 GLDEF_C TInt E32Main()
+00197         {
+00198         __UHEAP_MARK;
+00199         CTrapCleanup* cleanup = CTrapCleanup::New();
+00200         if(cleanup == NULL)
+00201                 {
+00202                 return KErrNoMemory;
+00203                 }
+00204         
+00205 
+00206         TRAPD(mainError, DoStartL());
+00207         if(mainError != KErrNone)
+00208                 {
+00209                 _LIT(KUserPanic,"Failed to complete");  
+00210                 User::Panic(KUserPanic, mainError);
+00211                 }
+00212 
+00213                 delete cleanup;
+00214                 __UHEAP_MARKEND;
+00215                 return KErrNone;
+00216         }
+

Generated on Thu Jan 21 10:32:57 2010 for TB10.1 Example Applications by  + +doxygen 1.5.3
+ +