00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <avkon.hrh>
00012 #include <aknnotewrappers.h>
00013 #include "EComCalculatorAppUi.h"
00014 #include "EComCalculatorAppView.h"
00015 #include "EComCalculator.hrh"
00016 #include "EComInterfaceDefinition.h"
00017
00018
00019
00020
00021
00022
00023 _LIT8(KSumOperationName,"sum");
00024 _LIT8(KMultiplyOperationName,"multiply");
00025 _LIT(KImplNotFound,"Implementation not found: ");
00026 _LIT(KEComErr,"ECOM error: ");
00027 _LIT(KEComErrCont,". Is the Calculation plugin installed?");
00028
00029 const TInt KOpNameLength=32;
00030 const TInt KOpLength = 64;
00031 const TInt KErrMsgLength = 128;
00032
00033
00034
00035 void CEComCalculatorAppUi::ConstructL()
00036 {
00037 BaseConstructL(EAknEnableSkin);
00038
00039
00040
00041 iAppView = CEComCalculatorAppView::NewL(ClientRect());
00042
00043
00044
00045 AddToStackL(iAppView);
00046 }
00047
00048
00049 CEComCalculatorAppUi::CEComCalculatorAppUi()
00050 {
00051
00052 }
00053
00054
00055 CEComCalculatorAppUi::~CEComCalculatorAppUi()
00056 {
00057 if (iAppView)
00058 {
00059
00060 iEikonEnv->RemoveFromStack(iAppView);
00061 }
00062
00063 delete iAppView;
00064 iAppView = NULL;
00065
00066 #ifdef __SERIES60_3X__
00067 REComSession::FinalClose();
00068 #endif
00069 }
00070
00071
00072 void CEComCalculatorAppUi::HandleCommandL(TInt aCommand)
00073 {
00074 switch(aCommand)
00075 {
00076 case ECalculateSumCmd:
00077 case ECalculateMultiplyCmd:
00078 CalculateL(aCommand);
00079 break;
00080
00081 case EAknSoftkeyExit:
00082 case EEikCmdExit:
00083 Exit();
00084 break;
00085
00086 default:
00087 break;
00088 }
00089 }
00090
00091
00092 void CEComCalculatorAppUi::CalculateL(TInt aCommand)
00093 {
00094 TBuf8<KOpNameLength> operationName;
00095
00096 TReal A, B, calcResult;
00097 _LIT(KFailedA,"Failed. A is not a valid number.");
00098 _LIT(KFailedB,"Failed. B is not a valid number.");
00099
00100
00101 if( iAppView->GetA(A) != KErrNone )
00102 {
00103 ShowNoteL(KFailedA);
00104 return;
00105 }
00106 if( iAppView->GetB(B) != KErrNone )
00107 {
00108 ShowNoteL(KFailedB);
00109 return;
00110 }
00111
00112 if(aCommand == ECalculateSumCmd)
00113 {
00114 operationName.Append(KSumOperationName);
00115 }
00116 else
00117 {
00118 operationName.Append(KMultiplyOperationName);
00119 }
00120
00121 if(DoEComCalculationL(operationName, A, B, calcResult) == KErrNone)
00122 iAppView->ShowResultL(operationName, calcResult);
00123 }
00124
00125
00126 TInt CEComCalculatorAppUi::DoEComCalculationL(const TDesC8& aOperationName,
00127 TReal aA, TReal aB, TReal& aResult)
00128 {
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154 CCalculationInterfaceDefinition* calculateInterface = NULL;
00155 TRAPD(error,
00156 calculateInterface =
00157 CCalculationInterfaceDefinition::NewL(aOperationName);
00158 )
00159 if( error )
00160 {
00161 HandleEComInitializationErrorL(error, aOperationName);
00162 return error;
00163 }
00164 CleanupStack::PushL(calculateInterface);
00165
00166
00167 aResult = calculateInterface->Calculate(aA, aB);
00168
00169 CleanupStack::PopAndDestroy(calculateInterface);
00170 return KErrNone;
00171 }
00172
00173
00174 void CEComCalculatorAppUi::HandleEComInitializationErrorL(TInt aError,
00175 const TDesC8& aOperationName) const
00176 {
00177
00178 TBuf<KOpLength> operationName16bit;
00179 TBuf<KErrMsgLength> errorMsg;
00180 operationName16bit.Copy(aOperationName);
00181
00182 if(aError == KErrNotFound)
00183 {
00184 errorMsg.Append(KImplNotFound);
00185 errorMsg.Append(operationName16bit);
00186 ShowNoteL(errorMsg);
00187 }
00188 else if(aError != KErrNone)
00189 {
00190 errorMsg.Append(KEComErr);
00191 errorMsg.AppendNum(aError);
00192 errorMsg.Append(KEComErrCont);
00193 ShowNoteL(errorMsg);
00194 }
00195 }
00196
00197
00198
00199 void CEComCalculatorAppUi::ShowNoteL(const TDesC& aMessage) const
00200 {
00201
00202 CAknInformationNote* note = new(ELeave)CAknInformationNote;
00203 note->ExecuteLD(aMessage);
00204 }
00205
00206 void CEComCalculatorAppUi::HandleResourceChangeL(TInt aType)
00207 {
00208 CAknAppUi::HandleResourceChangeL(aType);
00209
00210
00211
00212 if ( aType == KEikDynamicLayoutVariantSwitch )
00213 {
00214 iAppView->SetRect( ClientRect() );
00215 }
00216 }