43 // --------------------------------------------------------------------------- |
43 // --------------------------------------------------------------------------- |
44 // CHarvesterRequestQueue::CHarvesterRequestQueue() |
44 // CHarvesterRequestQueue::CHarvesterRequestQueue() |
45 // C++ default constructor can NOT contain any code, that might leave. |
45 // C++ default constructor can NOT contain any code, that might leave. |
46 // --------------------------------------------------------------------------- |
46 // --------------------------------------------------------------------------- |
47 // |
47 // |
48 CHarvesterRequestQueue::CHarvesterRequestQueue(): CActive( CActive::EPriorityStandard ) |
48 CHarvesterRequestQueue::CHarvesterRequestQueue(): CActive( CActive::EPriorityUserInput ) |
49 { |
49 { |
50 CActiveScheduler::Add( this ); |
50 CActiveScheduler::Add( this ); |
51 } |
51 } |
52 |
52 |
53 |
53 |
117 void CHarvesterRequestQueue::RunL() |
117 void CHarvesterRequestQueue::RunL() |
118 { |
118 { |
119 WRITELOG2( "CHarvesterRequestQueue::RunL() begin - requests: %d, active requests: %d", |
119 WRITELOG2( "CHarvesterRequestQueue::RunL() begin - requests: %d, active requests: %d", |
120 iRequests.Count(), iActiveRequests ); |
120 iRequests.Count(), iActiveRequests ); |
121 |
121 |
122 CHarvesterRequestActive* selectedRequest = NULL; |
122 const TInt status = iStatus.Int(); |
123 |
123 |
124 for ( TInt i = 0; i < iRequests.Count(); i++ ) |
124 if ( status >= KErrNone && !iShutdown ) |
125 { |
125 { |
126 CHarvesterRequestActive* request = iRequests[i]; |
126 CHarvesterRequestActive* selectedRequest = NULL; |
|
127 |
|
128 for ( TInt i = 0; i < iRequests.Count(); i++ ) |
|
129 { |
|
130 CHarvesterRequestActive* request = iRequests[i]; |
127 |
131 |
128 // remove completed tasks |
132 // remove completed tasks |
129 if ( request->RequestCompleted() && !request->IsActive() ) |
133 if ( !request || (request->RequestCompleted() && !request->IsActive()) ) |
130 { |
134 { |
131 // delete completed task |
135 // delete completed task |
132 delete request; |
136 delete request; |
133 iRequests.Remove( i ); |
137 request = NULL; |
|
138 iRequests.Remove( i ); |
134 |
139 |
135 // correct the index so that no tasks are skipped |
140 // correct the index so that no tasks are skipped |
136 i--; |
141 i--; |
137 if(i <= -1) |
142 if(i <= -1) |
|
143 { |
|
144 i = -1; |
|
145 } |
|
146 |
|
147 WRITELOG( "CHarvesterRequestQueue::RunL() - removing completed request"); |
|
148 } |
|
149 // select priorised task |
|
150 else |
138 { |
151 { |
139 i = -1; |
152 // not yet activated |
|
153 if( !request->IsActive() ) |
|
154 { |
|
155 selectedRequest = request; |
|
156 break; |
|
157 } |
140 } |
158 } |
141 |
159 } |
142 WRITELOG( "CHarvesterRequestQueue::RunL() - removing completed request"); |
160 |
143 } |
161 // activate selected |
144 // select priorised task |
162 if ( selectedRequest && !iShutdown ) |
|
163 { |
|
164 iActiveRequests++; |
|
165 selectedRequest->Start(); |
|
166 } |
|
167 |
|
168 #ifdef _DEBUG |
|
169 WRITELOG2( "CHarvesterRequestQueue::RunL() end - requests: %d, active requests: %d", |
|
170 iRequests.Count(), iActiveRequests ); |
|
171 #endif |
|
172 |
|
173 // continue processing if needed |
|
174 if ( !iShutdown && (iActiveRequests < KMaxClientRequests) && |
|
175 (iRequests.Count() > iActiveRequests)) |
|
176 { |
|
177 SetActive(); |
|
178 TRequestStatus* statusPtr = &iStatus; |
|
179 User::RequestComplete( statusPtr, KErrNone ); |
|
180 } |
145 else |
181 else |
146 { |
182 { |
147 // not yet activated |
183 iRequests.Compress(); |
148 if( !request->IsActive() ) |
184 } |
149 { |
185 } |
150 selectedRequest = request; |
186 else if( status != KErrCancel ) |
151 } |
187 { |
152 } |
188 // continue processing if needed |
153 } |
189 if ( !iShutdown && (iActiveRequests < KMaxClientRequests) && |
154 |
190 (iRequests.Count() > iActiveRequests)) |
155 // activate selected |
191 { |
156 if ( selectedRequest ) |
192 SetActive(); |
157 { |
193 TRequestStatus* statusPtr = &iStatus; |
158 iActiveRequests++; |
194 User::RequestComplete( statusPtr, KErrNone ); |
159 selectedRequest->Start(); |
195 } |
160 } |
196 } |
161 |
|
162 WRITELOG2( "CHarvesterRequestQueue::RunL() end - requests: %d, active requests: %d", |
|
163 iRequests.Count(), iActiveRequests ); |
|
164 |
|
165 // continue processing if needed |
|
166 if ( !iShutdown && (iActiveRequests < KMaxClientRequests) && |
|
167 (iRequests.Count() > iActiveRequests)) |
|
168 { |
|
169 SetActive(); |
|
170 TRequestStatus* statusPtr = &iStatus; |
|
171 User::RequestComplete( statusPtr, KErrNone ); |
|
172 } |
|
173 else |
|
174 { |
|
175 iRequests.Compress(); |
|
176 } |
|
177 } |
197 } |
178 |
198 |
179 // --------------------------------------------------------------------------- |
199 // --------------------------------------------------------------------------- |
180 // Handle any error from RunL |
200 // Handle any error from RunL |
181 // --------------------------------------------------------------------------- |
201 // --------------------------------------------------------------------------- |
201 // --------------------------------------------------------------------------- |
221 // --------------------------------------------------------------------------- |
202 // |
222 // |
203 void CHarvesterRequestQueue::DoCancel() |
223 void CHarvesterRequestQueue::DoCancel() |
204 { |
224 { |
205 WRITELOG( "CHarvesterRequestQueue::DoCancel()"); |
225 WRITELOG( "CHarvesterRequestQueue::DoCancel()"); |
206 |
226 |
207 for( TInt i(0); i < iRequests.Count(); i++ ) |
|
208 { |
|
209 iRequests[i]->Cancel(); |
|
210 } |
|
211 |
|
212 iShutdown = ETrue; |
227 iShutdown = ETrue; |
|
228 |
|
229 const TInt count( iRequests.Count() ); |
|
230 for( TInt i = 0; i < count; i++ ) |
|
231 { |
|
232 CHarvesterRequestActive* request = iRequests[i]; |
|
233 if( request ) |
|
234 { |
|
235 request->Cancel(); |
|
236 } |
|
237 } |
213 } |
238 } |
214 |
239 |
215 |
240 |
216 // --------------------------------------------------------------------------- |
241 // --------------------------------------------------------------------------- |
217 // CHarvesterRequestQueue::RequestComplete() |
242 // CHarvesterRequestQueue::RequestComplete() |
245 // |
270 // |
246 void CHarvesterRequestQueue::ForceRequests() |
271 void CHarvesterRequestQueue::ForceRequests() |
247 { |
272 { |
248 WRITELOG( "CHarvesterRequestQueue::ForceRequests()"); |
273 WRITELOG( "CHarvesterRequestQueue::ForceRequests()"); |
249 |
274 |
250 Cancel(); |
|
251 |
|
252 for ( TInt i = 0; i < iRequests.Count(); i++ ) |
275 for ( TInt i = 0; i < iRequests.Count(); i++ ) |
253 { |
276 { |
254 CHarvesterRequestActive* request = iRequests[i]; |
277 CHarvesterRequestActive* request = iRequests[i]; |
255 // remove completed tasks |
278 |
256 if ( request->RequestCompleted() ) |
279 if ( request && !request->RequestCompleted() ) |
257 { |
280 { |
258 // delete completed task |
281 request->ForceHarvest(); |
259 delete request; |
282 } |
260 iRequests.Remove( i ); |
283 // delete completed task |
|
284 delete request; |
|
285 request = NULL; |
|
286 iRequests.Remove( i ); |
261 |
287 |
262 // correct the index so that no tasks are skipped |
288 // correct the index so that no tasks are skipped |
263 i--; |
289 i--; |
264 if(i <= -1) |
290 if(i <= -1) |
265 { |
291 { |
266 i = -1; |
292 i = -1; |
267 } |
293 } |
268 } |
294 } |
269 else |
295 } |
270 { |
296 |
271 iRequests[i]->ForceHarvest(); |
297 // --------------------------------------------------------------------------- |
272 } |
298 // CHarvesterRequestQueue::DoCancel() |
273 } |
299 // --------------------------------------------------------------------------- |
|
300 // |
|
301 TBool CHarvesterRequestQueue::RequestsPending() |
|
302 { |
|
303 if( iRequests.Count() > 0 ) |
|
304 { |
|
305 return ETrue; |
|
306 } |
|
307 return EFalse; |
274 } |
308 } |
275 |
309 |
276 // End of file |
310 // End of file |
|
311 |