00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00035 #include "longnumber.h"
00036
00042 CLongNumber* CLongNumber::NewL(CConsoleBase* aConsole)
00043 {
00044 CLongNumber* self = new (ELeave) CLongNumber(aConsole);
00045 self->AddToScheduler();
00046 return self;
00047 }
00048
00053 CLongNumber::CLongNumber(CConsoleBase* aConsole):
00054
00055 CActive(CActive::EPriorityUserInput),
00056
00057 iNumber(_FOFF(TDigit,iSLink)),
00058 iConsole(aConsole),
00059
00060 iIterator(iNumber)
00061 {
00062 }
00063
00064
00068 void CLongNumber::AddToScheduler()
00069 {
00070 CActiveScheduler::Add(this);
00071 }
00072
00076 void CLongNumber::RunL()
00077 {
00078
00079 TUint8 option = iConsole->KeyCode();
00080
00081 _LIT(KTextFormat,"%c\n");
00082 iConsole->Printf(KTextFormat,option);
00083
00084 TInt number = option - (TUint)'0';
00085
00086 if(number <10 && number > -1)
00087 {
00088
00089 switch(iOption)
00090 {
00091
00092 case EAddFirst:
00093 {
00094
00095 TDigit* digit = new (ELeave) TDigit;
00096
00097 digit->Set(number);
00098
00099 iNumber.AddFirst(*digit);
00100 iOption = ETOptionNone;
00101 }
00102
00103 PrintNumber();
00104 break;
00105
00106 case EAddLast:
00107 {
00108
00109 TDigit* digit = new (ELeave) TDigit;
00110
00111 digit->Set(number);
00112
00113 iNumber.AddLast(*digit);
00114 iOption = ETOptionNone;
00115 }
00116
00117 PrintNumber();
00118 break;
00119 case ETOptionNone:
00120 _LIT(KInvalidOption,"Invalid Option!\n");
00121 iConsole->Printf(KInvalidOption);
00122 break;
00123 default:
00124 iOption = ETOptionNone;
00125 break;
00126 }
00127
00128 ReadNumber();
00129 }
00130
00131
00132
00133 else
00134 {
00135 switch(option)
00136 {
00137 case 'f':
00138 {
00139
00140 iOption = EAddFirst;
00141 _LIT(KTextEnterDigit,"\nEnter a digit\n");
00142 iConsole->Printf(KTextEnterDigit);
00143
00144 ReadFunc();
00145 }
00146 break;
00147 case 'l':
00148 {
00149
00150 iOption = EAddLast;
00151 _LIT(KTextEnterDigit,"\nEnter a digit\n");
00152 iConsole->Printf(KTextEnterDigit);
00153
00154 ReadFunc();
00155 }
00156 break;
00157 case 'r':
00158 {
00159 if(iNumber.IsEmpty())
00160 {
00161 _LIT(KTextEmpty,"Empty Queue !\n");
00162 iConsole->Printf(KTextEmpty);
00163 ReadNumber();
00164 break;
00165 }
00166
00167 TDigit* ptr = iNumber.Last();
00168 iNumber.Remove(*ptr);
00169 delete ptr;
00170
00171 PrintNumber();
00172
00173 ReadNumber();
00174 }
00175 break;
00176 default:
00177
00178
00179 TInt sum = 0;
00180 iIterator.SetToFirst();
00181
00182 while(iIterator != NULL)
00183 {
00184
00185 TDigit digit = *iIterator;
00186
00187 sum += digit.Get();
00188
00189 iIterator++;
00190 }
00191 _LIT(KTextInt,"The sum is %d");
00192 iConsole->Printf(KTextInt,sum);
00193
00194
00195 while(!iNumber.IsEmpty())
00196 {
00197 TDigit* ptr = iNumber.Last();
00198 iNumber.Remove(*ptr);
00199 delete ptr;
00200 }
00201
00202 CActiveScheduler::Stop();
00203 }
00204 }
00205 }
00206
00210 void CLongNumber::ReadFunc()
00211 {
00212
00213 iConsole->Read(iStatus);
00214 SetActive();
00215 }
00216
00220 void CLongNumber::ReadNumber()
00221 {
00222 _LIT(KTextMenu,"\nMenu\n***\nAdd [f]irst digit to number\nAdd [l]ast digit to number\n[r]emove last digit from number\nAny other NON-NUMERIC key to stop\n***\n");
00223 iConsole->Printf(KTextMenu);
00224 ReadFunc();
00225 }
00226
00230 void CLongNumber::PrintNumber()
00231 {
00232 if(iNumber.IsEmpty())
00233 {
00234 _LIT(KTextEmpty,"Empty Queue !\n");
00235 iConsole->Printf(KTextEmpty);
00236 }
00237 _LIT(KTextNumber,"The number is: ");
00238 iConsole->Printf(KTextNumber);
00239
00240 iIterator.SetToFirst();
00241
00242
00243 while(iIterator != NULL)
00244 {
00245
00246 TDigit digit = *iIterator;
00247
00248 _LIT(KTextInt,"%d");
00249 iConsole->Printf(KTextInt,digit.Get());
00250
00251 iIterator++;
00252 }
00253 }
00254
00258 void CLongNumber::InitializeIter()
00259 {
00260 iIterator.SetToFirst();
00261 }
00262
00269 TBool CLongNumber::GetNumber(TInt& aValue)
00270 {
00271 if(iIterator == NULL)
00272 {
00273
00274 return EFalse;
00275 }
00276 TDigit digit = *iIterator;
00277 aValue = digit.Get();
00278 return ETrue;
00279 }
00280
00285 TBool CLongNumber::Slide()
00286 {
00287
00288 iIterator++;
00289 if(iIterator == NULL)
00290 {
00291
00292 return EFalse;
00293 }
00294 return ETrue;
00295 }
00296
00300 void CLongNumber::DoCancel()
00301 {
00302 if(IsActive())
00303 {
00304
00305 iConsole->ReadCancel();
00306 }
00307 }
00308
00314 CLongNumber::~CLongNumber()
00315 {
00316
00317 if(iIterator)
00318 {
00319 iIterator.SetToFirst();
00320
00321 TDigit *ptr = iIterator++;
00322 while (ptr != NULL)
00323 {
00324 delete ptr;
00325 ptr = iIterator++;
00326 }
00327 }
00328 }