17 |
17 |
18 #include "FreestyleEmailUiAppui.h" |
18 #include "FreestyleEmailUiAppui.h" |
19 #include "ceuiexitguardian.h" |
19 #include "ceuiexitguardian.h" |
20 #include "emailtrace.h" |
20 #include "emailtrace.h" |
21 |
21 |
|
22 |
22 // --------------------------------------------------------------------------- |
23 // --------------------------------------------------------------------------- |
23 // CEUiExitGuardian::NewL |
24 // CEUiExitGuardian::NewL |
24 // |
25 // |
25 // --------------------------------------------------------------------------- |
26 // --------------------------------------------------------------------------- |
26 // |
27 // |
27 CEUiExitGuardian* CEUiExitGuardian::NewL( CFreestyleEmailUiAppUi& aAppUi ) |
28 CEUiExitGuardian* CEUiExitGuardian::NewL( CFreestyleEmailUiAppUi& aAppUi ) |
28 { |
29 { |
29 FUNC_LOG; |
30 FUNC_LOG; |
30 |
31 |
31 CEUiExitGuardian* self = new (ELeave) CEUiExitGuardian(aAppUi); |
32 CEUiExitGuardian* self = new (ELeave) CEUiExitGuardian( aAppUi ); |
32 CleanupStack::PushL(self); |
33 CleanupStack::PushL( self ); |
33 self->ConstructL(); |
34 self->ConstructL(); |
34 CleanupStack::Pop(self); |
35 CleanupStack::Pop( self ); |
35 return self; |
36 return self; |
36 } |
37 } |
37 |
38 |
38 // --------------------------------------------------------------------------- |
39 // --------------------------------------------------------------------------- |
39 // CEUiExitGuardian::CEUiExitGuardian |
40 // CEUiExitGuardian::CEUiExitGuardian |
40 // |
41 // |
41 // --------------------------------------------------------------------------- |
42 // --------------------------------------------------------------------------- |
42 // |
43 // |
43 CEUiExitGuardian::CEUiExitGuardian( CFreestyleEmailUiAppUi& aAppUi ) |
44 CEUiExitGuardian::CEUiExitGuardian( CFreestyleEmailUiAppUi& aAppUi ) |
44 : iAppUi(aAppUi) |
45 : iAppUi( aAppUi ) |
45 { |
46 { |
46 FUNC_LOG; |
47 FUNC_LOG; |
47 } |
48 } |
48 |
49 |
49 // --------------------------------------------------------------------------- |
50 // --------------------------------------------------------------------------- |
53 // |
54 // |
54 CEUiExitGuardian::~CEUiExitGuardian() |
55 CEUiExitGuardian::~CEUiExitGuardian() |
55 { |
56 { |
56 FUNC_LOG; |
57 FUNC_LOG; |
57 |
58 |
58 delete iIdle; |
59 if ( iPeriodicTimer ) |
|
60 { |
|
61 iPeriodicTimer->Cancel(); |
|
62 delete iPeriodicTimer; |
|
63 } |
59 } |
64 } |
|
65 |
60 |
66 |
61 // --------------------------------------------------------------------------- |
67 // --------------------------------------------------------------------------- |
62 // CEUiExitGuardian::ConstructL |
68 // CEUiExitGuardian::ConstructL |
63 // |
69 // |
64 // --------------------------------------------------------------------------- |
70 // --------------------------------------------------------------------------- |
65 // |
71 // |
66 void CEUiExitGuardian::ConstructL() |
72 void CEUiExitGuardian::ConstructL() |
67 { |
73 { |
68 FUNC_LOG; |
74 FUNC_LOG; |
69 |
75 |
70 iIdle = CIdle::NewL(CActive::EPriorityStandard); |
76 iPeriodicTimer = CPeriodic::NewL( CActive::EPriorityStandard ); |
|
77 iPeriodicTimerStarted = EFalse; |
71 } |
78 } |
72 |
79 |
|
80 |
73 // --------------------------------------------------------------------------- |
81 // --------------------------------------------------------------------------- |
74 // CEUiExitGuardian::EnterLC |
82 // CEUiExitGuardian::PeriodicCallBack |
75 // |
83 // |
76 // --------------------------------------------------------------------------- |
84 // --------------------------------------------------------------------------- |
77 // |
85 // |
78 void CEUiExitGuardian::EnterLC() |
86 TInt CEUiExitGuardian::PeriodicCallBack( TAny* aPtr ) |
79 { |
87 { |
80 FUNC_LOG; |
88 FUNC_LOG; |
81 |
89 |
82 if (iExitPending) |
90 reinterpret_cast<CEUiExitGuardian*>(aPtr)->TryExitApplication(); |
83 { |
91 return KErrNone; |
84 User::Leave(KErrNotReady); |
|
85 } |
|
86 iEnterCount++; |
|
87 CleanupStack::PushL(TCleanupItem(Exit, this)); |
|
88 } |
92 } |
89 |
93 |
|
94 |
90 // --------------------------------------------------------------------------- |
95 // --------------------------------------------------------------------------- |
91 // CEUiExitGuardian::Exit |
96 // CEUiExitGuardian::TryExitApplication |
92 // |
97 // |
93 // --------------------------------------------------------------------------- |
98 // --------------------------------------------------------------------------- |
94 // |
99 // |
95 void CEUiExitGuardian::Exit(TAny* aPtr) |
100 TInt CEUiExitGuardian::TryExitApplication() |
96 { |
101 { |
97 FUNC_LOG; |
102 FUNC_LOG; |
|
103 const TInt KDelay = 200*1000; // 200 ms |
|
104 |
|
105 TInt ret = KRequestPending; |
98 |
106 |
99 reinterpret_cast<CEUiExitGuardian*>(aPtr)->DoExit(); |
107 CActiveScheduler* scheduler = CActiveScheduler::Current(); |
100 } |
108 TInt nestedLevelCount = scheduler->StackDepth(); |
101 |
109 if ( nestedLevelCount == 1 ) |
102 // --------------------------------------------------------------------------- |
|
103 // CEUiExitGuardian::DoExit |
|
104 // |
|
105 // --------------------------------------------------------------------------- |
|
106 // |
|
107 void CEUiExitGuardian::DoExit() |
|
108 { |
|
109 FUNC_LOG; |
|
110 |
|
111 iEnterCount--; |
|
112 if (iExitPending && !iEnterCount && !iIdle->IsActive()) |
|
113 { |
110 { |
114 // Start async exit processing to rewind recursion before the actual |
111 iPeriodicTimer->Cancel(); |
115 // exit |
112 iAppUi.ExitNow(); |
116 iIdle->Start( TCallBack( IdleCallBack, this ) ); |
113 ret = KErrNone; |
117 } |
114 } |
118 } |
115 else if ( !iPeriodicTimerStarted ) |
119 |
|
120 // --------------------------------------------------------------------------- |
|
121 // CEUiExitGuardian::IdleCallBack |
|
122 // |
|
123 // --------------------------------------------------------------------------- |
|
124 // |
|
125 TInt CEUiExitGuardian::IdleCallBack( TAny* aPtr ) |
|
126 { |
|
127 FUNC_LOG; |
|
128 |
|
129 reinterpret_cast<CEUiExitGuardian*>( aPtr )->iAppUi.ExitNow(); |
|
130 return KErrNone; |
|
131 } |
|
132 |
|
133 // --------------------------------------------------------------------------- |
|
134 // CEUiExitGuardian::ExitApplication |
|
135 // |
|
136 // --------------------------------------------------------------------------- |
|
137 // |
|
138 TInt CEUiExitGuardian::ExitApplication() |
|
139 { |
|
140 FUNC_LOG; |
|
141 |
|
142 TInt result( KRequestPending ); |
|
143 iExitPending = ETrue; |
|
144 if (!iEnterCount) |
|
145 { |
116 { |
146 result = KErrNone; |
117 iPeriodicTimer->Start( KDelay, KDelay, TCallBack(PeriodicCallBack, this) ); |
147 iAppUi.ExitNow(); |
118 iPeriodicTimerStarted = ETrue; |
148 } |
119 } |
149 return result; |
120 |
|
121 return ret; |
150 } |
122 } |
151 |
123 |
152 // end of file |
124 // end of file |