|
1 /* |
|
2 * Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: Static Tls data storage |
|
15 * |
|
16 */ |
|
17 |
|
18 #include "emailtrace.h" |
|
19 #include "resmrpluginextensionstatic.h" |
|
20 #include "cmrmailboxutils.h" |
|
21 |
|
22 /** |
|
23 * Storage class for RESMRStatic. |
|
24 */ |
|
25 class TESMRPluginExtensionData |
|
26 { |
|
27 public: |
|
28 TInt iInstanceCount; |
|
29 TInt iFSMailBoxCount; |
|
30 CFSMailClient* iFSMailClient; |
|
31 CFSMailBox* iDefaultFSMailBox; |
|
32 }; |
|
33 |
|
34 // Unnamed namespace for local definitions, structs and functions |
|
35 namespace { // codescanner::namespace |
|
36 |
|
37 const TInt KMailBox = 0x01; |
|
38 |
|
39 // Definition for equal string |
|
40 const TInt KEqualString(0); |
|
41 |
|
42 // --------------------------------------------------------------------------- |
|
43 // Cleanup operation for RPointerArray. |
|
44 // @param aArray Pointer to RPointerArray. |
|
45 // --------------------------------------------------------------------------- |
|
46 // |
|
47 void MailboxPointerArrayCleanup( TAny* aArray ) |
|
48 { |
|
49 // just to avoid warnings when MR not supported |
|
50 RPointerArray<CFSMailBox>* entryArray = |
|
51 static_cast<RPointerArray<CFSMailBox>*>( aArray ); |
|
52 |
|
53 entryArray->ResetAndDestroy(); |
|
54 entryArray->Close(); |
|
55 } |
|
56 |
|
57 }//namespace |
|
58 |
|
59 // --------------------------------------------------------------------------- |
|
60 // RESMRPluginExtensionStatic::RESMRPluginExtensionStatic |
|
61 // --------------------------------------------------------------------------- |
|
62 // |
|
63 RESMRPluginExtensionStatic::RESMRPluginExtensionStatic( ) |
|
64 { |
|
65 FUNC_LOG; |
|
66 iStaticData = NULL; |
|
67 } |
|
68 |
|
69 // --------------------------------------------------------------------------- |
|
70 // RESMRStatic::~RESMRStatic |
|
71 // --------------------------------------------------------------------------- |
|
72 // |
|
73 RESMRPluginExtensionStatic::~RESMRPluginExtensionStatic( ) |
|
74 { |
|
75 FUNC_LOG; |
|
76 Close(); |
|
77 } |
|
78 |
|
79 // --------------------------------------------------------------------------- |
|
80 // RESMRPluginExtensionStatic::ConnectL |
|
81 // --------------------------------------------------------------------------- |
|
82 // |
|
83 void RESMRPluginExtensionStatic::ConnectL( ) |
|
84 { |
|
85 FUNC_LOG; |
|
86 if ( iStaticData ) |
|
87 { |
|
88 return; |
|
89 } |
|
90 |
|
91 // Retrieve Tls pointer |
|
92 iStaticData = static_cast<TESMRPluginExtensionData*>( Dll::Tls()); |
|
93 |
|
94 // If Tls pointer was not set, create new static stuct |
|
95 // with NULL values |
|
96 if ( !iStaticData ) |
|
97 { |
|
98 iStaticData = new (ELeave) TESMRPluginExtensionData(); |
|
99 memset ( iStaticData, 0, sizeof( TESMRPluginExtensionData) ); |
|
100 Dll::SetTls ( iStaticData ); |
|
101 } |
|
102 ++iStaticData->iInstanceCount; |
|
103 } |
|
104 |
|
105 // --------------------------------------------------------------------------- |
|
106 // RESMRPluginExtensionStatic::Close |
|
107 // --------------------------------------------------------------------------- |
|
108 // |
|
109 void RESMRPluginExtensionStatic::Close( ) |
|
110 { |
|
111 FUNC_LOG; |
|
112 if ( iStaticData ) |
|
113 { |
|
114 |
|
115 // If FSMailClientL or DefaultFSMailBox was used |
|
116 if ( iUsedTypes & KMailBox ) |
|
117 { |
|
118 // Decrease counter |
|
119 --iStaticData->iFSMailBoxCount; |
|
120 |
|
121 // If this was last instance using pointer |
|
122 if ( iStaticData->iFSMailBoxCount == 0 ) |
|
123 { |
|
124 // Owned by CFSMailClient |
|
125 delete iStaticData->iDefaultFSMailBox; |
|
126 iStaticData->iDefaultFSMailBox = NULL; |
|
127 |
|
128 // Delete instance |
|
129 if ( iStaticData->iFSMailClient ) |
|
130 { |
|
131 iStaticData->iFSMailClient->Close(); |
|
132 iStaticData->iFSMailClient = NULL; |
|
133 } |
|
134 } |
|
135 } |
|
136 |
|
137 // Decrease instance counter |
|
138 --iStaticData->iInstanceCount; |
|
139 |
|
140 // If this was last instance using pointer |
|
141 if (iStaticData->iInstanceCount == 0 ) |
|
142 { |
|
143 if ( iStaticData->iDefaultFSMailBox ) |
|
144 { |
|
145 delete iStaticData->iDefaultFSMailBox; |
|
146 iStaticData->iDefaultFSMailBox = NULL; |
|
147 } |
|
148 |
|
149 if (iStaticData->iFSMailClient) |
|
150 { |
|
151 iStaticData->iFSMailClient->Close(); |
|
152 iStaticData->iFSMailClient = NULL; |
|
153 } |
|
154 |
|
155 delete iStaticData; |
|
156 Dll::FreeTls ( ); |
|
157 } |
|
158 iStaticData = NULL; |
|
159 } |
|
160 } |
|
161 |
|
162 // --------------------------------------------------------------------------- |
|
163 // RESMRPluginExtensionStatic::DefaultFSMailBoxL |
|
164 // --------------------------------------------------------------------------- |
|
165 // |
|
166 CFSMailBox& RESMRPluginExtensionStatic::DefaultFSMailBoxL( TBool aForceReset ) |
|
167 { |
|
168 FUNC_LOG; |
|
169 |
|
170 if ( aForceReset && iStaticData->iDefaultFSMailBox ) |
|
171 { |
|
172 delete iStaticData->iDefaultFSMailBox; |
|
173 iStaticData->iDefaultFSMailBox = NULL; |
|
174 } |
|
175 |
|
176 if ( !iStaticData->iDefaultFSMailBox ) |
|
177 { |
|
178 CFSMailClient& fsMailClient = FSMailClientL(); |
|
179 |
|
180 CMRMailboxUtils* mbUtils = |
|
181 CMRMailboxUtils::NewL(); |
|
182 CleanupStack::PushL( mbUtils ); |
|
183 |
|
184 CMRMailboxUtils::TMailboxInfo mbInfo; |
|
185 User::LeaveIfError( |
|
186 mbUtils->GetDefaultMRMailBoxL( mbInfo ) ); |
|
187 |
|
188 // Loop throug all mailboxes in this plug-in |
|
189 RPointerArray<CFSMailBox> mailboxes; // codescanner::resourcenotoncleanupstack |
|
190 CleanupStack::PushL( |
|
191 TCleanupItem( |
|
192 MailboxPointerArrayCleanup, |
|
193 &mailboxes ) ); |
|
194 |
|
195 // With null uid we get all mailboxes |
|
196 TFSMailMsgId msgId; |
|
197 fsMailClient.ListMailBoxes( |
|
198 msgId, mailboxes ); |
|
199 |
|
200 TInt mailboxCount( mailboxes.Count() ); |
|
201 for ( TInt j(0); |
|
202 j < mailboxCount && !iStaticData->iDefaultFSMailBox; |
|
203 ++j ) |
|
204 { |
|
205 TPtrC mailboxOwnerAddName( |
|
206 mailboxes[j]->OwnMailAddress().GetEmailAddress() ); |
|
207 if ( KEqualString == mailboxOwnerAddName.Compare(mbInfo.iEmailAddress) ) |
|
208 { |
|
209 // Correct mailbox is found |
|
210 iStaticData->iDefaultFSMailBox = mailboxes[j]; |
|
211 mailboxes.Remove(j); |
|
212 } |
|
213 } |
|
214 |
|
215 CleanupStack::PopAndDestroy(); // mailboxes |
|
216 CleanupStack::PopAndDestroy( mbUtils ); |
|
217 mbUtils = NULL; |
|
218 |
|
219 if ( !iStaticData->iDefaultFSMailBox ) |
|
220 { |
|
221 User::Leave( KErrAbort ); |
|
222 } |
|
223 } |
|
224 |
|
225 iUsedTypes |= KMailBox; |
|
226 ++iStaticData->iFSMailBoxCount; |
|
227 return *iStaticData->iDefaultFSMailBox; |
|
228 } |
|
229 |
|
230 // --------------------------------------------------------------------------- |
|
231 // RESMRPluginExtensionStatic::FSMailClientL |
|
232 // --------------------------------------------------------------------------- |
|
233 // |
|
234 CFSMailClient& RESMRPluginExtensionStatic::FSMailClientL( ) |
|
235 { |
|
236 FUNC_LOG; |
|
237 if (!iStaticData->iFSMailClient) |
|
238 { |
|
239 iStaticData->iFSMailClient = CFSMailClient::NewL ( ); |
|
240 } |
|
241 |
|
242 return *iStaticData->iFSMailClient; |
|
243 } |
|
244 |
|
245 // EOF |
|
246 |