|
1 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
2 // All rights reserved. |
|
3 // This component and the accompanying materials are made available |
|
4 // under the terms of "Eclipse Public License v1.0" |
|
5 // which accompanies this distribution, and is available |
|
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
7 // |
|
8 // Initial Contributors: |
|
9 // Nokia Corporation - initial contribution. |
|
10 // |
|
11 // Contributors: |
|
12 // |
|
13 // Description: |
|
14 // |
|
15 |
|
16 #include "tzswiobserverplugin.h" |
|
17 |
|
18 using namespace Swi; |
|
19 |
|
20 _LIT(KFilterTzPrivate, "!:\\private\\1020383E"); |
|
21 _LIT(KFilterResourceTimezonelocalization, "!:\\resource\\timezonelocalization"); |
|
22 |
|
23 #ifdef _DEBUG |
|
24 //Logging data |
|
25 _LIT(KTzDebugLogFile, "c:\\TzSwiObserver.log"); |
|
26 _LIT(KTzLogDir, "c:\\logs\\Tz"); |
|
27 _LIT(KTzLogFile, "c:\\logs\\Tz\\TzSwiObserver.log"); |
|
28 _LIT8(KTzCRLF, "\r\n"); |
|
29 _LIT8(KTzAdded, "Added "); |
|
30 _LIT8(KTzDeleted, "Deleted "); |
|
31 #endif |
|
32 |
|
33 CTzSwiObserverPlugin* CTzSwiObserverPlugin::NewL() |
|
34 { |
|
35 CTzSwiObserverPlugin* self = new(ELeave) CTzSwiObserverPlugin(); |
|
36 return self; |
|
37 } |
|
38 |
|
39 CTzSwiObserverPlugin::~CTzSwiObserverPlugin() |
|
40 { |
|
41 //Should close the RTz |
|
42 iTz.Close(); |
|
43 #if defined(_DEBUG) |
|
44 delete iFileWriteStream; |
|
45 #endif |
|
46 } |
|
47 |
|
48 CTzSwiObserverPlugin::CTzSwiObserverPlugin() |
|
49 : CSwiObserverPlugin(), iTzConnected(EFalse) |
|
50 { |
|
51 } |
|
52 |
|
53 /** |
|
54 This function is called when the SWI Observer processor starts processing |
|
55 an observation log file. |
|
56 |
|
57 @param aFs File server session handle. |
|
58 */ |
|
59 void CTzSwiObserverPlugin::StartL(RFs& aFs) |
|
60 { |
|
61 iFs = &aFs; |
|
62 |
|
63 #if defined(_DEBUG) |
|
64 TUint fileAtt; |
|
65 if (aFs.Att(KTzLogDir, fileAtt) == KErrNone) |
|
66 { |
|
67 iFileWriteStream = new(ELeave) RFileWriteStream; |
|
68 if (iFileWriteStream) |
|
69 { |
|
70 if (iFileWriteStream->Replace(aFs, KTzDebugLogFile, EFileShareAny | EFileWrite | EFileStreamText ) != KErrNone) |
|
71 { |
|
72 delete iFileWriteStream; |
|
73 iFileWriteStream = NULL; |
|
74 } |
|
75 } |
|
76 } |
|
77 |
|
78 #endif |
|
79 } |
|
80 |
|
81 /** |
|
82 Signals TZ Server that a new installation log is about to be processed. |
|
83 |
|
84 @param aHeader Object containing all observation data related with a specific package. |
|
85 @param aStatus The request status object. |
|
86 */ |
|
87 void CTzSwiObserverPlugin::NextObservedHeaderL(const CObservationHeader& /*aHeader*/, TRequestStatus& aStatus) |
|
88 { |
|
89 TRequestStatus* status = &aStatus; |
|
90 User::RequestComplete(status, KErrNone); |
|
91 } |
|
92 |
|
93 /** |
|
94 This function is called for each actual observation data (i.e. adding/deleting file). |
|
95 |
|
96 @param aData Object for a single observation data. |
|
97 @param aFilterIndex The index of the filter which matches with that notification. |
|
98 @param aStatus The request status object. |
|
99 */ |
|
100 #if defined(_DEBUG) |
|
101 void CTzSwiObserverPlugin::NextObservedDataL(const CObservationData& aData, TInt aFilterIndex, TRequestStatus& aStatus) |
|
102 #else |
|
103 void CTzSwiObserverPlugin::NextObservedDataL(const CObservationData& /*aData*/, TInt aFilterIndex, TRequestStatus& aStatus) |
|
104 #endif |
|
105 { |
|
106 RTz::TSWIObserverFilterIndex idx = static_cast<RTz::TSWIObserverFilterIndex>(aFilterIndex); |
|
107 |
|
108 switch(idx) |
|
109 { |
|
110 case RTz::EFilterTzPrivate: |
|
111 case RTz::EFilterResourceTimezonelocalization: |
|
112 { |
|
113 GetTzClientL().SwiObsFileChangedL(idx); |
|
114 } |
|
115 |
|
116 break; |
|
117 default: |
|
118 // Do nothing |
|
119 break; |
|
120 } |
|
121 |
|
122 #if defined(_DEBUG) |
|
123 if (iFileWriteStream) |
|
124 { |
|
125 if (aData.iFileFlag & Swi::EFileAdded) |
|
126 { |
|
127 iFileWriteStream->WriteL(KTzAdded()); |
|
128 } |
|
129 else if (aData.iFileFlag & Swi::EFileDeleted) |
|
130 { |
|
131 iFileWriteStream->WriteL(KTzDeleted()); |
|
132 } |
|
133 TBuf8<256> fileBuf; |
|
134 fileBuf.Copy(aData.iFileName->Des()); |
|
135 iFileWriteStream->WriteL(fileBuf); |
|
136 iFileWriteStream->WriteL(KTzCRLF()); |
|
137 } |
|
138 #endif |
|
139 |
|
140 TRequestStatus* status = &aStatus; |
|
141 User::RequestComplete(status, KErrNone); |
|
142 } |
|
143 |
|
144 /** |
|
145 This function is called when the SWI Observer processor is finished with |
|
146 the observation log file. |
|
147 |
|
148 @param aStatus The request status object. |
|
149 */ |
|
150 void CTzSwiObserverPlugin::FinalizeL(TRequestStatus& aStatus) |
|
151 { |
|
152 GetTzClientL().SwiObsEndL(); |
|
153 |
|
154 #if defined(_DEBUG) |
|
155 if (iFileWriteStream) |
|
156 { |
|
157 iFileWriteStream->Close(); |
|
158 User::LeaveIfError(iFs->Rename(KTzDebugLogFile, KTzLogFile)); |
|
159 } |
|
160 #endif |
|
161 |
|
162 TRequestStatus* status = &aStatus; |
|
163 User::RequestComplete(status, KErrNone); |
|
164 } |
|
165 |
|
166 /** |
|
167 Returns a list of filters which representing in what folders the tz observer |
|
168 plugin is interested. |
|
169 |
|
170 The tz observer plugin needs to know any change in the \private\1020383E and \resource\timezonelocalization |
|
171 directories of the system drive. |
|
172 |
|
173 @return A list of filters showing the interest of this plugin. |
|
174 */ |
|
175 CObservationFilter* CTzSwiObserverPlugin::GetFilterL() const |
|
176 { |
|
177 CObservationFilter* filterList = CObservationFilter::NewLC(); |
|
178 AddFilterL(*filterList, KFilterTzPrivate); |
|
179 AddFilterL(*filterList, KFilterResourceTimezonelocalization); |
|
180 CleanupStack::Pop(filterList); |
|
181 return filterList; |
|
182 } |
|
183 |
|
184 /** |
|
185 Inserts a new filter into the filter list. |
|
186 Sets the first character of the new filter as the current system drive. |
|
187 |
|
188 @param aFilterList A filter list object. |
|
189 @param aFilter A filter data which will be inserted. |
|
190 */ |
|
191 void CTzSwiObserverPlugin::AddFilterL(CObservationFilter& aFilterList, const TDesC& aFilter) const |
|
192 { |
|
193 HBufC* filterData = aFilter.AllocLC(); |
|
194 TPtr ptr(filterData->Des()); |
|
195 ptr[0] = iFs->GetSystemDriveChar(); |
|
196 aFilterList.AddFilterL(filterData); |
|
197 CleanupStack::Pop(filterData); |
|
198 } |
|
199 |
|
200 void CTzSwiObserverPlugin::RunL() |
|
201 { |
|
202 // Do Nothing |
|
203 } |
|
204 |
|
205 TInt CTzSwiObserverPlugin::RunError(TInt /*aError*/) |
|
206 { |
|
207 return KErrNone; |
|
208 } |
|
209 |
|
210 void CTzSwiObserverPlugin::DoCancel() |
|
211 { |
|
212 } |
|
213 |
|
214 static const TUint KTzSwiObserverImplementationId = 0x1028649F; |
|
215 |
|
216 static const TImplementationProxy ImplementationTable[] = |
|
217 { |
|
218 IMPLEMENTATION_PROXY_ENTRY(KTzSwiObserverImplementationId, CTzSwiObserverPlugin::NewL) |
|
219 }; |
|
220 |
|
221 RTz& CTzSwiObserverPlugin::GetTzClientL() |
|
222 { |
|
223 if (!iTzConnected) |
|
224 { |
|
225 User::LeaveIfError(iTz.Connect()); |
|
226 iTzConnected = ETrue; |
|
227 iTz.SwiObsBeginL(); |
|
228 } |
|
229 return iTz; |
|
230 } |
|
231 |
|
232 /** |
|
233 Standard ECOM factory |
|
234 */ |
|
235 EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount) |
|
236 { |
|
237 aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); |
|
238 return ImplementationTable; |
|
239 } |