diff -r 89d6a7a84779 -r 25a17d01db0c Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/timerentry_8cpp-source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/timerentry_8cpp-source.html Fri Jan 22 18:26:19 2010 +0000 @@ -0,0 +1,237 @@ + +
+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 // Contains definition of functions defined in the CTimerEntry class. +00015 // +00016 +00017 +00018 +00023 #include "timerentry.h" +00024 +00029 CTimerEntry* CTimerEntry::NewL(CConsoleBase* aConsole) +00030 { +00031 CTimerEntry* self = new (ELeave) CTimerEntry(aConsole); +00032 CleanupStack::PushL(self); +00033 self->ConstructL(); +00034 CleanupStack::Pop(self); +00035 return self; +00036 } +00037 +00041 void CTimerEntry::ConstructL() +00042 { +00043 // Construct the timer object. +00044 CTimer::ConstructL(); +00045 // Add the object to the active scheduler. +00046 CActiveScheduler::Add(this); +00047 } +00048 +00053 CTimerEntry::CTimerEntry(CConsoleBase* aConsole): +00054 // Constructor of the timer object. +00055 CTimer(CActive::EPriorityStandard), +00056 // Create the iterator object. +00057 iIterator(iQueue), +00058 // Set count to -1. +00059 iCount(-1), +00060 // Set increment operation as +00061 // the default operation. +00062 iOp(EInsert), +00063 iConsole(aConsole), +00064 iWaitFlag(ETrue) +00065 { +00066 } +00067 +00071 void CTimerEntry::RunL() +00072 { +00073 // Call the arbitrator function. +00074 ArbitratorL(); +00075 // Print the contents of the queue. +00076 PrintQue(); +00077 // Maintain an outstanding request. +00078 IssueRequest(); +00079 } +00080 +00081 +00085 void CTimerEntry::IssueRequest() +00086 { +00087 // Get a random number for number of seconds to wait. +00088 // Issue the wait request. +00089 TUint waitTime = KWaitTime; +00090 if (iWaitFlag) +00091 { +00092 waitTime = Math::Random() % KMaxTimeToWait; +00093 // Make sure that time to wait is not zero; +00094 waitTime++; +00095 } +00096 CTimer::After((waitTime) * 1000000); +00097 } +00098 +00104 void CTimerEntry::ArbitratorL() +00105 { +00106 // The increment operation. +00107 // Add elements to the list. +00108 if(iOp == EInsert) +00109 { +00110 // Get the tick count. +00111 TInt tc = (TInt)User::TickCount(); +00112 // Try to add an element to the list. +00113 TBool redo = AddToQueueL(tc); +00114 // The queue is full. +00115 if(!redo) +00116 { +00117 _LIT(KTextQueFull,"Queue is full!\n"); +00118 iConsole->Printf(KTextQueFull); +00119 // Stop adding elements to the queue. +00120 // Set iWaitFlag to EFalse. +00121 // The timer will wait for 1 second before removing an element +00122 // from the queue. +00123 iWaitFlag = EFalse; +00124 } +00125 } +00126 // The decrement operation. +00127 // Remove elements from the list. +00128 else +00129 { +00130 // Try to remove an element from the list. +00131 TBool redo = RemoveFromQueue(); +00132 // The queue is empty. +00133 if(!redo) +00134 { +00135 _LIT(KTextQueEmpty,"Queue is empty!\n"); +00136 iConsole->Printf(KTextQueEmpty); +00137 // Stop removing elements from the queue. +00138 // Set iWaitFlag to ETrue. +00139 // The timer will wait for a random interval of time +00140 // before adding an element to the queue. +00141 iWaitFlag = ETrue; +00142 } +00143 } +00144 } +00145 +00151 TBool CTimerEntry::AddToQueueL(TInt aTicks) +00152 { +00153 // Check if the queue is full. +00154 if(iCount >= (KMaxEntry - 1)) +00155 { +00156 iOp = ERemove; +00157 return EFalse; +00158 } +00159 +00160 // Add the tick count to the delta queue. +00161 _LIT(KTextAddTick,"Added %d to the queue\n"); +00162 iConsole->Printf(KTextAddTick,aTicks); +00163 iCount++; +00164 +00165 TTimerEntry* ptr = new (ELeave) TTimerEntry; +00166 iQueue.Add(*ptr,aTicks); +00167 +00168 return ETrue; +00169 } +00170 +00174 void CTimerEntry::PrintQue() +00175 { +00176 _LIT(KTextCont,"Contents of the List:\n***\nINDEX\tDELTA\n"); +00177 iConsole->Printf(KTextCont); +00178 // Set the iterator to the first node of the list. +00179 iIterator.SetToFirst(); +00180 // Iterate the list and print all TDigit objects +00181 TTimerEntry *ptr = iIterator++; +00182 // List index. +00183 TInt ix = 0; +00184 while (ptr != NULL) +00185 { +00186 _LIT(KTextFormat,"%d\t\t%d\n"); +00187 iConsole->Printf(KTextFormat,ix,ptr->iLink.iDelta); +00188 ptr = iIterator++; +00189 ix++; +00190 } +00191 _LIT(KTextEnd,"***\n"); +00192 iConsole->Printf(KTextEnd); +00193 } +00194 +00199 TBool CTimerEntry::RemoveFromQueue() +00200 { +00201 // Check if the queue is empty. +00202 if(iCount < 0) +00203 { +00204 iOp = EInsert; +00205 return EFalse; +00206 } +00207 +00208 iIterator.SetToFirst(); +00209 +00210 // The index of the node to be removed in the list. +00211 TInt pos = 0; +00212 +00213 // Get a random value for position. +00214 if(iCount > 0) +00215 { +00216 pos = Math::Random() % iCount; +00217 } +00218 +00219 // Iterate the list until the node pointed to by +00220 // the pos variable is reached. +00221 for(TInt ix = 1; ix <= pos; ix++) +00222 { +00223 iIterator++; +00224 } +00225 +00226 TTimerEntry* ptr = iIterator; +00227 +00228 _LIT(KTextRemove,"Removed an element from the queue. Index: %d\n"); +00229 iConsole->Printf(KTextRemove,pos); +00230 +00231 // Remove an element from the delta queue. +00232 iQueue.Remove(*ptr); +00233 delete ptr; +00234 +00235 iCount--; +00236 +00237 return ETrue; +00238 } +00239 +00245 CTimerEntry::~CTimerEntry() +00246 { +00247 // Cancel any outstanding request. +00248 Cancel(); +00249 // Delete the elements from the list +00250 if(iIterator) +00251 { +00252 iIterator.SetToFirst(); +00253 // Iterate the list and delete all TDigit objects +00254 TTimerEntry *ptr = iIterator++; +00255 while (ptr != NULL) +00256 { +00257 delete ptr; +00258 ptr = iIterator++; +00259 } +00260 } +00261 } +00262 +00266 void CTimerEntry::DoCancel() +00267 { +00268 // Call DoCancel() on the base class. +00269 CTimer::DoCancel(); +00270 } +00271 +