2
|
1 |
/*
|
|
2 |
* Copyright (c) 2007-2010 Sebastian Brannstrom, Lars Persson, EmbedDev AB
|
|
3 |
*
|
|
4 |
* All rights reserved.
|
|
5 |
* This component and the accompanying materials are made available
|
|
6 |
* under the terms of the License "Eclipse Public License v1.0"
|
|
7 |
* which accompanies this distribution, and is available
|
|
8 |
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
|
|
9 |
*
|
|
10 |
* Initial Contributors:
|
|
11 |
* EmbedDev AB - initial contribution.
|
|
12 |
*
|
|
13 |
* Contributors:
|
|
14 |
*
|
|
15 |
* Description:
|
|
16 |
*
|
|
17 |
*/
|
|
18 |
|
|
19 |
#include <bautils.h>
|
|
20 |
#include <s32file.h>
|
|
21 |
#include "SettingsEngine.h"
|
|
22 |
#include "FeedEngine.h"
|
|
23 |
#include "ShowEngine.h"
|
|
24 |
|
|
25 |
const TUid KMainSettingsStoreUid = {0x1000};
|
|
26 |
const TUid KMainSettingsUid = {0x1002};
|
|
27 |
const TUid KExtraSettingsUid = {0x2001};
|
|
28 |
const TInt KMaxParseBuffer = 1024;
|
|
29 |
|
|
30 |
CSettingsEngine::CSettingsEngine(CPodcastModel& aPodcastModel) : iPodcastModel(aPodcastModel)
|
|
31 |
{
|
|
32 |
}
|
|
33 |
|
|
34 |
CSettingsEngine::~CSettingsEngine()
|
|
35 |
{
|
|
36 |
TRAP_IGNORE(SaveSettingsL());
|
|
37 |
}
|
|
38 |
|
|
39 |
CSettingsEngine* CSettingsEngine::NewL(CPodcastModel& aPodcastModel)
|
|
40 |
{
|
|
41 |
CSettingsEngine* self = new (ELeave) CSettingsEngine(aPodcastModel);
|
|
42 |
CleanupStack::PushL(self);
|
|
43 |
self->ConstructL();
|
|
44 |
CleanupStack::Pop();
|
|
45 |
return self;
|
|
46 |
}
|
|
47 |
|
|
48 |
void CSettingsEngine::ConstructL()
|
|
49 |
{
|
|
50 |
DP("CSettingsEngine::ConstructL BEGIN");
|
|
51 |
// default values
|
|
52 |
iUpdateFeedInterval = KDefaultUpdateFeedInterval;
|
|
53 |
iDownloadAutomatically = EFalse;
|
|
54 |
iUpdateAutomatically = EAutoUpdateOff;
|
|
55 |
iMaxListItems = KDefaultMaxListItems;
|
|
56 |
iIap = 0;
|
|
57 |
|
|
58 |
// Check that our basedir exist. Create it otherwise;
|
|
59 |
GetDefaultBaseDirL(iBaseDir);
|
|
60 |
DP1("Base dir: %S", &iBaseDir);
|
|
61 |
|
|
62 |
// load settings
|
|
63 |
TRAPD(loadErr, LoadSettingsL());
|
|
64 |
if (loadErr != KErrNone)
|
|
65 |
{
|
|
66 |
DP1("CSettingsEngine::ConstructL\tLoadSettingsL returned error=%d", loadErr);
|
|
67 |
DP("CSettingsEngine::ConstructL\tUsing default settings instead");
|
|
68 |
|
|
69 |
TRAPD(error,SaveSettingsL());
|
|
70 |
if (error != KErrNone)
|
|
71 |
{
|
|
72 |
DP1("error saving: %d", error);
|
|
73 |
}
|
|
74 |
}
|
|
75 |
DP("CSettingsEngine::ConstructL END");
|
|
76 |
}
|
|
77 |
|
|
78 |
void CSettingsEngine::GetDefaultBaseDirL(TDes & /*aBaseDir*/)
|
|
79 |
{
|
|
80 |
CDesCArray* disks = new(ELeave) CDesCArrayFlat(10);
|
|
81 |
CleanupStack::PushL(disks);
|
|
82 |
|
|
83 |
BaflUtils::GetDiskListL(iPodcastModel.FsSession(), *disks);
|
|
84 |
|
|
85 |
#ifdef __WINS__
|
|
86 |
iBaseDir.Copy(KPodcastDir3);
|
|
87 |
CleanupStack::PopAndDestroy(disks);
|
|
88 |
return;
|
|
89 |
#endif
|
|
90 |
|
|
91 |
DP1("Disks count: %u", disks->Count());
|
|
92 |
|
|
93 |
for (int i=0;i<disks->Count();i++) {
|
|
94 |
TPtrC ptr = disks->operator[](i);
|
|
95 |
DP2("Disk %u: %S", i, &ptr);
|
|
96 |
}
|
|
97 |
|
|
98 |
if (disks->Count() == 1) // if only one drive, use C:
|
|
99 |
{
|
|
100 |
iBaseDir.Copy(KPodcastDir3);
|
|
101 |
}
|
|
102 |
else // else we use the flash drive
|
|
103 |
{
|
|
104 |
iBaseDir.Copy(KPodcastDir1);
|
|
105 |
DP1("Trying podcast dir '%S'", &iBaseDir);
|
|
106 |
|
|
107 |
TRAPD(err, BaflUtils::EnsurePathExistsL(iPodcastModel.FsSession(), iBaseDir));
|
|
108 |
|
|
109 |
if (err != KErrNone)
|
|
110 |
{
|
|
111 |
DP("Leave in EnsurePathExistsL");
|
|
112 |
iBaseDir.Copy(KPodcastDir2);
|
|
113 |
DP1("Trying podcast dir '%S'", &iBaseDir);
|
|
114 |
TRAPD(err, BaflUtils::EnsurePathExistsL(iPodcastModel.FsSession(), iBaseDir));
|
|
115 |
if (err != KErrNone)
|
|
116 |
{
|
|
117 |
DP("Leave in EnsurePathExistsL");
|
|
118 |
iBaseDir.Copy(KPodcastDir3);
|
|
119 |
DP1("Trying podcast dir '%S'", &iBaseDir);
|
|
120 |
TRAPD(err, BaflUtils::EnsurePathExistsL(iPodcastModel.FsSession(), iBaseDir));
|
|
121 |
if (err != KErrNone)
|
|
122 |
{
|
|
123 |
DP("Leave in EnsurePathExistsL");
|
|
124 |
}
|
|
125 |
}
|
|
126 |
}
|
|
127 |
}
|
|
128 |
CleanupStack::PopAndDestroy(disks);
|
|
129 |
}
|
|
130 |
|
|
131 |
void CSettingsEngine::LoadSettingsL()
|
|
132 |
{
|
|
133 |
DP("CSettingsEngine::LoadSettingsL\t Trying to load settings");
|
|
134 |
|
|
135 |
// Create path for the config file
|
|
136 |
TFileName configPath;
|
|
137 |
configPath.Copy(PrivatePath());
|
|
138 |
configPath.Append(KConfigFile);
|
|
139 |
|
|
140 |
DP1("Checking settings file: %S", &configPath);
|
|
141 |
|
|
142 |
CDictionaryFileStore* store = CDictionaryFileStore::OpenLC(iPodcastModel.FsSession(), configPath, KMainSettingsStoreUid);
|
|
143 |
|
|
144 |
if( store->IsPresentL(KMainSettingsUid) )
|
|
145 |
{
|
|
146 |
RDictionaryReadStream stream;
|
|
147 |
stream.OpenLC(*store, KMainSettingsUid);
|
|
148 |
|
|
149 |
TInt len = stream.ReadInt32L();
|
|
150 |
stream.ReadL(iBaseDir, len);
|
|
151 |
iUpdateFeedInterval = stream.ReadInt32L();
|
|
152 |
iUpdateAutomatically = static_cast<TAutoUpdateSetting>(stream.ReadInt32L());
|
|
153 |
iDownloadAutomatically = stream.ReadInt32L();
|
|
154 |
|
|
155 |
|
|
156 |
iDownloadSuspended = stream.ReadInt32L(); // was iMaxSimultaneousDownloads
|
|
157 |
iIap = stream.ReadInt32L();
|
|
158 |
|
|
159 |
TInt low = stream.ReadInt32L();
|
|
160 |
TInt high = stream.ReadInt32L();
|
|
161 |
iUpdateFeedTime = MAKE_TINT64(high, low);
|
|
162 |
TInt dummy;
|
|
163 |
dummy = stream.ReadInt32L(); // was iSelectOnlyUnplayed
|
|
164 |
dummy = stream.ReadInt32L(); // was iSeekStepTime
|
|
165 |
|
|
166 |
CleanupStack::PopAndDestroy(1); // readStream and iniFile
|
|
167 |
DP("CSettingsEngine::LoadSettingsL\t Settings loaded OK");
|
|
168 |
}
|
|
169 |
CleanupStack::PopAndDestroy();// close store
|
|
170 |
}
|
|
171 |
|
|
172 |
EXPORT_C void CSettingsEngine::SaveSettingsL()
|
|
173 |
{
|
|
174 |
DP("CSettingsEngine::SaveSettingsL BEGIN");
|
|
175 |
|
|
176 |
TFileName configPath;
|
|
177 |
configPath.Copy(PrivatePath());
|
|
178 |
configPath.Append(KConfigFile);
|
|
179 |
|
|
180 |
CDictionaryFileStore* store = CDictionaryFileStore::OpenLC(iPodcastModel.FsSession(), configPath, KMainSettingsStoreUid);
|
|
181 |
|
|
182 |
RDictionaryWriteStream stream;
|
|
183 |
stream.AssignLC(*store, KMainSettingsUid);
|
|
184 |
|
|
185 |
stream.WriteInt32L(iBaseDir.Length());
|
|
186 |
stream.WriteL(iBaseDir);
|
|
187 |
stream.WriteInt32L(iUpdateFeedInterval);
|
|
188 |
stream.WriteInt32L(iUpdateAutomatically);
|
|
189 |
stream.WriteInt32L(iDownloadAutomatically);
|
|
190 |
stream.WriteInt32L(iDownloadSuspended);
|
|
191 |
stream.WriteInt32L(iIap);
|
|
192 |
|
|
193 |
stream.WriteInt32L(I64LOW(iUpdateFeedTime.Int64()));
|
|
194 |
stream.WriteInt32L(I64HIGH(iUpdateFeedTime.Int64()));
|
|
195 |
stream.WriteInt32L(0); // was iSelectOnlyUnplayed
|
|
196 |
stream.WriteInt32L(0); // was iSeekStepTime
|
|
197 |
|
|
198 |
stream.CommitL();
|
|
199 |
store->CommitL();
|
|
200 |
CleanupStack::PopAndDestroy(2); // stream and store
|
|
201 |
DP("CSettingsEngine::SaveSettingsL END");
|
|
202 |
}
|
|
203 |
|
|
204 |
TFileName CSettingsEngine::DefaultFeedsFileName()
|
|
205 |
{
|
|
206 |
TFileName defaultFeeds;
|
|
207 |
defaultFeeds.Append(PrivatePath());
|
|
208 |
defaultFeeds.Append(KDefaultFeedsFile);
|
|
209 |
DP1("Default feeds file: %S", &defaultFeeds);
|
|
210 |
return defaultFeeds;
|
|
211 |
}
|
|
212 |
|
|
213 |
TFileName CSettingsEngine::ImportFeedsFileName()
|
|
214 |
{
|
|
215 |
TFileName importFeeds;
|
|
216 |
importFeeds.Append(BaseDir());
|
|
217 |
importFeeds.Append(KImportFeedsFile);
|
|
218 |
return importFeeds;
|
|
219 |
}
|
|
220 |
|
|
221 |
|
|
222 |
TFileName CSettingsEngine::PrivatePath()
|
|
223 |
{
|
|
224 |
TFileName privatePath;
|
|
225 |
iPodcastModel.FsSession().PrivatePath(privatePath);
|
60
|
226 |
|
2
|
227 |
TRAP_IGNORE(BaflUtils::EnsurePathExistsL(iPodcastModel.FsSession(), privatePath));
|
|
228 |
return privatePath;
|
|
229 |
}
|
|
230 |
|
|
231 |
TInt CSettingsEngine::MaxListItems()
|
|
232 |
{
|
|
233 |
return iMaxListItems;
|
|
234 |
}
|
|
235 |
|
|
236 |
EXPORT_C TFileName& CSettingsEngine::BaseDir()
|
|
237 |
{
|
|
238 |
return iBaseDir;
|
|
239 |
}
|
|
240 |
|
|
241 |
EXPORT_C void CSettingsEngine::SetBaseDir(TFileName& aFileName)
|
|
242 |
{
|
|
243 |
TInt length = aFileName.Length();
|
|
244 |
if (length > 0)
|
|
245 |
{
|
|
246 |
if (aFileName[length-1] != '\\')
|
|
247 |
{
|
|
248 |
aFileName.Append(_L("\\"));
|
|
249 |
}
|
|
250 |
}
|
|
251 |
iBaseDir = aFileName;
|
|
252 |
}
|
|
253 |
|
|
254 |
EXPORT_C TInt CSettingsEngine::UpdateFeedInterval()
|
|
255 |
{
|
|
256 |
return iUpdateFeedInterval;
|
|
257 |
}
|
|
258 |
|
|
259 |
EXPORT_C void CSettingsEngine::SetUpdateFeedInterval(TInt aInterval)
|
|
260 |
{
|
|
261 |
iUpdateFeedInterval = aInterval;
|
|
262 |
iPodcastModel.FeedEngine().RunFeedTimer();
|
|
263 |
}
|
|
264 |
|
|
265 |
EXPORT_C TAutoUpdateSetting CSettingsEngine::UpdateAutomatically()
|
|
266 |
{
|
|
267 |
if (iUpdateAutomatically == EAutoUpdateOff ||
|
|
268 |
iUpdateAutomatically == EAutoUpdatePeriod1 ||
|
|
269 |
iUpdateAutomatically == EAutoUpdatePeriod2 ||
|
|
270 |
iUpdateAutomatically == EAutoUpdatePeriod3 ||
|
|
271 |
iUpdateAutomatically == EAutoUpdatePeriod4)
|
|
272 |
return iUpdateAutomatically;
|
|
273 |
else
|
|
274 |
return EAutoUpdateOff;
|
|
275 |
}
|
|
276 |
|
|
277 |
EXPORT_C void CSettingsEngine::SetUpdateAutomatically(TAutoUpdateSetting aAutoSetting)
|
|
278 |
{
|
|
279 |
iUpdateAutomatically = aAutoSetting;
|
|
280 |
|
|
281 |
if (aAutoSetting > 0) {
|
|
282 |
SetUpdateFeedInterval(aAutoSetting);
|
|
283 |
}
|
|
284 |
}
|
|
285 |
|
|
286 |
EXPORT_C TBool CSettingsEngine::DownloadAutomatically()
|
|
287 |
{
|
|
288 |
return iDownloadAutomatically;
|
|
289 |
}
|
|
290 |
|
|
291 |
EXPORT_C void CSettingsEngine::SetDownloadAutomatically(TBool aDownloadAuto)
|
|
292 |
{
|
|
293 |
iDownloadAutomatically = aDownloadAuto;
|
|
294 |
}
|
|
295 |
|
|
296 |
EXPORT_C TTime CSettingsEngine::UpdateFeedTime()
|
|
297 |
{
|
|
298 |
return iUpdateFeedTime;
|
|
299 |
}
|
|
300 |
|
|
301 |
EXPORT_C void CSettingsEngine::SetUpdateFeedTime(TTime aUpdateTime)
|
|
302 |
{
|
|
303 |
iUpdateFeedTime = aUpdateTime;
|
|
304 |
iPodcastModel.FeedEngine().RunFeedTimer();
|
|
305 |
}
|
|
306 |
|
|
307 |
EXPORT_C TInt CSettingsEngine::SpecificIAP()
|
|
308 |
{
|
|
309 |
if (iIap == 0 || iIap == -1) {
|
|
310 |
return iIap;
|
|
311 |
}
|
|
312 |
|
|
313 |
for (int i=0;i<iPodcastModel.IAPIds().Count();i++) {
|
|
314 |
if (((TInt)iPodcastModel.IAPIds()[i].iIapId) == (iIap&KUseIAPMask)) {
|
|
315 |
return iIap;
|
|
316 |
}
|
|
317 |
|
|
318 |
}
|
|
319 |
|
|
320 |
for (int i=0;i<iPodcastModel.SNAPIds().Count();i++) {
|
|
321 |
if (((TInt)iPodcastModel.SNAPIds()[i].iIapId) == (iIap&KUseIAPMask)) {
|
|
322 |
return iIap;
|
|
323 |
}
|
|
324 |
|
|
325 |
}
|
|
326 |
|
|
327 |
return iPodcastModel.IAPIds()[0].iIapId;
|
|
328 |
}
|
|
329 |
|
|
330 |
EXPORT_C void CSettingsEngine::SetSpecificIAP(TInt aIap)
|
|
331 |
{
|
|
332 |
iIap = aIap;
|
|
333 |
}
|
|
334 |
|
|
335 |
EXPORT_C TBool CSettingsEngine::DownloadSuspended()
|
|
336 |
{
|
|
337 |
return iDownloadSuspended;
|
|
338 |
}
|
|
339 |
|
|
340 |
EXPORT_C void CSettingsEngine::SetDownloadSuspended(TBool aSuspended)
|
|
341 |
{
|
|
342 |
DP1("CSettingsEngine::SetDownloadSuspended, aSuspended=%d", aSuspended);
|
|
343 |
iDownloadSuspended = aSuspended;
|
|
344 |
}
|