00001
00002
00003
00004
00005
00006 #include <msvstd.h>
00007 #include <msvstore.h>
00008 #include <MSVUIDS.H>
00009 #include <centralrepository.h>
00010 #include "txut.h"
00011
00012
00013 #include <msvuids.h>
00014 const TUint32 KNullId = 0x00000000;
00015 const TUint32 KIncrementAccount = 0x00100000;
00016 const TInt KMaxAccount = 2048;
00017 const TUint32 KDefaultServiceId = 0x80000000;
00018 const TUint32 EAccountMask = 0x800FFFFF;
00019
00020
00021 enum
00022 {
00023 EServiceId = 0,
00024 EFolderSettingId = 1
00025 };
00026
00027
00028 EXPORT_C CMTMTxtSettings* CMTMTxtSettings::NewL()
00029 {
00030 CMTMTxtSettings* self = new (ELeave) CMTMTxtSettings();
00031 CleanupStack::PushL(self);
00032 self->ConstructL();
00033 CleanupStack::Pop();
00034 return self;
00035 }
00036
00037
00038 CMTMTxtSettings::~CMTMTxtSettings()
00039 {
00040 delete iRepository;
00041 }
00042
00043
00044 EXPORT_C void CMTMTxtSettings::DeleteSettingsL(TMsvId aServiceId)
00045 {
00046 TUint32 serviceKey = FindAccountL(aServiceId);
00047 DeleteSettingL(serviceKey);
00048 DeleteSettingL(serviceKey + EFolderSettingId);
00049 }
00050
00058 EXPORT_C void CMTMTxtSettings::LoadSettingsL(TMsvId aServiceId, TMTMTxtSettings& aSettings) const
00059 {
00060 TUint32 serviceKey = FindAccountL(aServiceId);
00061 TFileName rootFolder;
00062 User::LeaveIfError(iRepository->Get(serviceKey + EFolderSettingId, rootFolder));
00063 aSettings.SetRootFolder(rootFolder);
00064 }
00065
00073 EXPORT_C void CMTMTxtSettings::SaveSettingsL(TMsvId aServiceId, const TMTMTxtSettings& aSettings)
00074 {
00075 TUint32 accountId = 0;
00076 TInt error = 0;
00077
00078 TRAP(error, accountId = FindAccountL(aServiceId));
00079 if (error != KErrUnknown) User::LeaveIfError(error);
00080
00081 if (error == KErrUnknown) accountId = GetNextAccountSlotL();
00082
00083 TRAP( error,
00084
00085 CreateOrSetL(accountId, static_cast<TInt>(aServiceId));
00086 CreateOrSetL(accountId + EFolderSettingId, aSettings.RootFolder());
00087 );
00088 if (error != KErrNone)
00089 {
00090
00091 DeleteSettingsL(aServiceId);
00092 User::Leave(error);
00093 }
00094 }
00095
00101 EXPORT_C void CMTMTxtSettings::SetDefaultServiceL(TMsvId aService)
00102 {
00103 CreateOrSetL(KDefaultServiceId, static_cast<TInt>(aService));
00104 }
00105
00113 EXPORT_C TMsvId CMTMTxtSettings::DefaultServiceL() const
00114 {
00115
00116 TInt temp = 0;
00117 User::LeaveIfError(iRepository->Get(KDefaultServiceId, temp));
00118 return static_cast<TMsvId>(temp);
00119 }
00120
00124 EXPORT_C void CMTMTxtSettings::DeleteDefaultServiceSettingL()
00125 {
00126 DeleteSettingL(KDefaultServiceId);
00127 }
00128
00129
00130 void CMTMTxtSettings::ConstructL()
00131 {
00132
00133
00134
00135
00136
00137 const TInt KUidDefaultMtmRepositoryFileValue = 0x10274556;
00138 const TUid KUidMtm = { KUidDefaultMtmRepositoryFileValue };
00139
00140
00141 iRepository = CRepository::NewL(KUidMtm);
00142
00143 }
00144
00145
00146 void CMTMTxtSettings::CreateOrSetL(TUint aKey, const TDesC& aValue)
00147 {
00148 TInt error = iRepository->Set(aKey, aValue);
00149 if (error == KErrNotFound)
00150 {
00151
00152 User::LeaveIfError(iRepository->Create(aKey, aValue));
00153 }
00154 else
00155 {
00156 User::LeaveIfError(error);
00157 }
00158 }
00159
00160
00161 void CMTMTxtSettings::CreateOrSetL(TUint aKey, TInt aValue)
00162 {
00163 TInt error = iRepository->Set(aKey, aValue);
00164 if (error == KErrNotFound)
00165 {
00166
00167 User::LeaveIfError(iRepository->Create(aKey, aValue));
00168 }
00169 else
00170 {
00171 User::LeaveIfError(error);
00172 }
00173 }
00174
00175
00176 TUint32 CMTMTxtSettings::FindAccountL(TMsvId aService) const
00177 {
00178 RArray<TUint32> accounts;
00179 CleanupClosePushL(accounts);
00180 TInt error = iRepository->FindEqL(KNullId, static_cast<TUint32>(EAccountMask), static_cast<TInt>(aService), accounts);
00181 if (error == KErrNotFound)
00182 {
00183
00184 User::Leave(KErrUnknown);
00185 }
00186 else
00187 {
00188 User::LeaveIfError(error);
00189 }
00190
00191 if (accounts.Count()>1)
00192 {
00193
00194 User::Leave(KErrOverflow);
00195 }
00196
00197 TUint32 account = accounts[0];
00198 CleanupStack::PopAndDestroy(&accounts);
00199 return account;
00200 }
00201
00202
00203
00204 EXPORT_C void TMTMTxtSettings::ExternalizeL( RMsvWriteStream& aWriteStream ) const
00205 {
00206
00207 aWriteStream << iRootFolder;
00208 return;
00209 }
00210
00211 EXPORT_C void TMTMTxtSettings::InternalizeL( RMsvReadStream& aReadStream )
00212 {
00213 aReadStream >> iRootFolder;
00214 return;
00215 }
00216
00217 EXPORT_C void TMTMTxtSettings::StoreL(CMsvStore& aMsvStore) const
00218 {
00219 RMsvWriteStream out;
00220 out.AssignLC( aMsvStore, KUidTxtMTMSettings );
00221 ExternalizeL(out);
00222 out.CommitL();
00223 CleanupStack::PopAndDestroy();
00224 }
00225
00226
00227 TUint CMTMTxtSettings::GetNextAccountSlotL()
00228 {
00229 TUint32 accountId = KNullId;
00230 TInt serviceId = 0;
00231 TInt error = 0;
00232 TBool found = EFalse;
00233
00234 for (TInt count = 0; count < KMaxAccount; ++count)
00235 {
00236 accountId = accountId + KIncrementAccount;
00237 error = iRepository->Get(accountId, serviceId);
00238 if (error == KErrNotFound)
00239 {
00240 found = ETrue;
00241 break;
00242 }
00243 else
00244 {
00245 User::LeaveIfError(error);
00246 }
00247 }
00248
00249 if (found == EFalse)
00250 {
00251
00252 User::Leave(KErrNotFound);
00253 }
00254
00255 return accountId;
00256 }
00257
00258
00259 void CMTMTxtSettings::DeleteSettingL(TUint32 settingId)
00260 {
00261 TInt error = iRepository->Delete(settingId);
00262 if (error != KErrNotFound)
00263 {
00264 User::LeaveIfError(error);
00265 }
00266 }
00267 EXPORT_C void TMTMTxtSettings::RestoreL(const CMsvStore& aMessageStore )
00268
00269 {
00270 if (aMessageStore.IsPresentL(KUidTxtMTMSettings))
00271 {
00272 RMsvReadStream in;
00273 in.OpenLC( aMessageStore, KUidTxtMTMSettings );
00274 InternalizeL(in);
00275 CleanupStack::PopAndDestroy();
00276 }
00277 }
00278
00279
00280
00281
00282
00283 EXPORT_C void TxtUtils::GetEntryFileNameL(TFileName& aFileName, TMsvEntry& aEntry)
00284
00285 {
00286 CMTMTxtSettings* settings = CMTMTxtSettings::NewL();
00287 CleanupStack::PushL(settings);
00288 TMTMTxtSettings root;
00289 settings->LoadSettingsL(aEntry.iServiceId, root);
00290 CleanupStack::PopAndDestroy();
00291 aFileName = root.RootFolder();
00292 aFileName.Append(aEntry.iDetails);
00293 aFileName.Append(aEntry.iDescription);
00294 if (aEntry.iType == KUidMsvFolderEntry)
00295 aFileName.Append(KPathDelimiter);
00296 }
00297
00298 EXPORT_C void TxtUtils::FindFileL(const TDesC& aFileName, const TDesC& aLocation, TFileName& aRetVal)
00299 {
00300 RFs fs;
00301 User::LeaveIfError(fs.Connect());
00302 CleanupClosePushL(fs);
00303 TFindFile finder(fs);
00304 User::LeaveIfError(finder.FindByDir(aFileName, aLocation));
00305 aRetVal = finder.File();
00306 CleanupStack::PopAndDestroy();
00307 }
00308
00309
00310
00311
00312
00313 EXPORT_C CMsvOpWait* CMsvOpWait::NewLC(TInt aPriority)
00314 {
00315 CMsvOpWait* self = new (ELeave) CMsvOpWait(aPriority);
00316 CleanupStack::PushL(self);
00317 return self;
00318 }
00319
00320 CMsvOpWait::CMsvOpWait(TInt aPriority)
00321 : CActive(aPriority)
00322 {
00323 CActiveScheduler::Add(this);
00324 }
00325
00326 EXPORT_C CMsvOpWait::~CMsvOpWait()
00327 {
00328 Cancel();
00329 }
00330
00331 EXPORT_C void CMsvOpWait::Start()
00332 {
00333 SetActive();
00334 }
00335
00336 void CMsvOpWait::RunL()
00337 {
00338 CActiveScheduler::Stop();
00339 }
00340
00341 void CMsvOpWait::DoCancel()
00342 {
00343 TRequestStatus* s=&iStatus;
00344 User::RequestComplete(s, KErrCancel);
00345 }
00346
00347
00348
00349
00350 EXPORT_C CMsvCompOperation* CMsvCompOperation::NewL(CMsvSession& aSession, TUid aMtm,
00351 const TDesC8& aProgress, TMsvId aService, TRequestStatus& aObserverRequestStatus, TInt aError)
00352
00353
00354
00355
00356 {
00357 CMsvCompOperation* self = new (ELeave) CMsvCompOperation(aSession, aObserverRequestStatus);
00358 CleanupStack::PushL(self);
00359 self->ConstructL(aMtm, aError, aProgress, aService);
00360 CleanupStack::Pop(self);
00361 return self;
00362 }
00363
00364 CMsvCompOperation::CMsvCompOperation(CMsvSession& aSession, TRequestStatus& aObserverRequestStatus)
00365 : CMsvOperation(aSession, EPriorityStandard, aObserverRequestStatus)
00366 {
00367 }
00368
00369 EXPORT_C CMsvCompOperation::~CMsvCompOperation()
00370 {
00371 Cancel();
00372 delete iProgress;
00373 }
00374
00375 void CMsvCompOperation::ConstructL(TUid aMtm, TInt aError, const TDesC8& aProgress, TMsvId aService)
00376 {
00377 iProgress = HBufC8::NewL(aProgress.Length());
00378 *iProgress = aProgress;
00379 iMtm=aMtm;
00380 iService=aService;
00381
00382 CActiveScheduler::Add(this);
00383 iStatus = KRequestPending;
00384 SetActive();
00385
00386 TRequestStatus* pstat=&iStatus;
00387 User::RequestComplete(pstat, aError);
00388 iObserverRequestStatus = KRequestPending;
00389 }
00390
00391 const TDesC8& CMsvCompOperation::ProgressL()
00392 {
00393 return *iProgress;
00394 }
00395
00396 void CMsvCompOperation::DoCancel()
00397 {
00398
00399 }
00400
00401 void CMsvCompOperation::RunL()
00402 {
00403 TRequestStatus* pstat=&iObserverRequestStatus;
00404 User::RequestComplete(pstat, iStatus.Int());
00405 }