// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).// All rights reserved.// This component and the accompanying materials are made available// under the terms of "Eclipse Public License v1.0"// which accompanies this distribution, and is available// at the URL "http://www.eclipse.org/legal/epl-v10.html".//// Initial Contributors:// Nokia Corporation - initial contribution.//// Contributors://// Description://#include "DbUndo.h"// UNDO Class for Integersvoid CDbUndoInt::ConstructL(const TDesC &aColumn, const TUint32 &aValue) { iColumn.Set(aColumn); iValue=aValue; }CDbUndoInt *CDbUndoInt::NewL(const TDesC &aColumn, const TUint32 &aValue) { CDbUndoInt *undo = new(ELeave) CDbUndoInt(); CleanupStack::PushL(undo); undo->ConstructL(aColumn, aValue); CleanupStack::Pop(); return undo; }void CDbUndoInt::UndoL(CDbAgtBase *aDb) { // Reset value in the table back to the values stored in this undo object aDb->ModifyColumnIntL(iColumn, iValue); }// UNDO Class for Booleansvoid CDbUndoBool::ConstructL(const TDesC &aColumn, const TBool &aValue) { iColumn.Set(aColumn); iValue=aValue; }CDbUndoBool *CDbUndoBool::NewL(const TDesC &aColumn, const TBool &aValue) { CDbUndoBool *undo = new(ELeave) CDbUndoBool(); CleanupStack::PushL(undo); undo->ConstructL(aColumn, aValue); CleanupStack::Pop(); return undo; }void CDbUndoBool::UndoL(CDbAgtBase *aDb) { // Reset value in the table back to the values stored in this undo object aDb->ModifyColumnBoolL(iColumn, iValue); }// UNDO Class for textvoid CDbUndoText::ConstructL(const TDesC &aColumn, const TDesC16& aValue) { iColumn.Set(aColumn); iText.Copy(aValue); }CDbUndoText *CDbUndoText::NewL(const TDesC &aColumn, const TDesC16& aValue) { CDbUndoText *undo = new(ELeave) CDbUndoText(); CleanupStack::PushL(undo); undo->ConstructL(aColumn, aValue); CleanupStack::Pop(); return undo; }void CDbUndoText::UndoL(CDbAgtBase *aDb) { // Reset text value in the table back to the text values stored in this undo object aDb->ModifyColumnTextL(iColumn, iText); }// UNDO Class for long textvoid CDbUndoLongText::ConstructL(const TDesC &aColumn, const HBufC* aValue) { iColumn.Set(aColumn); // Save the long text from CommDB, allocate it! iLongText = aValue->AllocL(); }CDbUndoLongText *CDbUndoLongText::NewL(const TDesC &aColumn, const HBufC* aValue) { CDbUndoLongText *undo = new(ELeave) CDbUndoLongText(); CleanupStack::PushL(undo); undo->ConstructL(aColumn, aValue); CleanupStack::Pop(); return undo; }void CDbUndoLongText::UndoL(CDbAgtBase *aDb) { // Reset text value in the table back to the text values stored in this undo object TPtr value(iLongText->Des()); aDb->ModifyColumnLongTextL(iColumn, value); // Allocated in ConstructL, remeber to delete! delete iLongText; }// UNDO Class for Agent Extension namevoid CDbUndoAgentExt::ConstructL(const TDesC &aService, const TDesC& aAgentExt) { iColumn.Set(aService); iText.Copy(aAgentExt); }CDbUndoAgentExt *CDbUndoAgentExt::NewL(const TDesC &aService, const TDesC& aAgentExt) { CDbUndoAgentExt *undo = new(ELeave) CDbUndoAgentExt(); CleanupStack::PushL(undo); undo->ConstructL(aService, aAgentExt); CleanupStack::Pop(); return undo; }void CDbUndoAgentExt::UndoL(CDbAgtBase* /*aDb*/) { }// Base class routines, used to open a CCommsDatabase and modify recordsCDbAgtBase::CDbAgtBase() : iQHeader(_FOFF(CDbUndoBase,iLink)), iQIter(iQHeader) { }void CDbAgtBase::ConstructL() {#ifdef SYMBIAN_NON_SEAMLESS_NETWORK_BEARER_MOBILITY iDb = CMDBSession::NewL(KCDVersion1_2);#else iDb = CMDBSession::NewL(KCDVersion1_1);#endif }CDbAgtBase::~CDbAgtBase() { delete iDb; }void CDbAgtBase::SetColumnIntL(const TDesC &aColumn, const TUint32 &aValue) { // Used by a client to set a value in the database, also remembers the change // for undo purposes later TUint32 OldValue; CDbUndoInt *oldRecord; // Get the current value in the table TInt ValType; CMDBField<TUint>* field = static_cast<CMDBField<TUint>*>(iTable->iRecords[iCurrentRecord]->GetFieldByNameL(aColumn, ValType)); OldValue = *field; // Add to the undo list oldRecord = CDbUndoInt::NewL(aColumn, OldValue); iQHeader.AddLast(*oldRecord); // Change the record to the new value ModifyColumnIntL(aColumn, aValue); }void CDbAgtBase::ModifyColumnIntL(const TDesC &aColumn, const TUint32 &aValue) { TInt ValType; CMDBField<TUint>* field = static_cast<CMDBField<TUint>*>(iTable->iRecords[iCurrentRecord]->GetFieldByNameL(aColumn, ValType)); *field = aValue; field->ModifyL(*iDb); }void CDbAgtBase::SetColumnBoolL(const TDesC &aColumn, const TBool &aValue) { // Used by a client to set a value in the database, also remembers the change // for undo purposes later TBool OldValue; CDbUndoBool *oldRecord; // Get the current value in the table TInt ValType; CMDBField<TBool>* field = static_cast<CMDBField<TBool>*>(iTable->iRecords[iCurrentRecord]->GetFieldByNameL(aColumn, ValType)); OldValue = static_cast<TBool>(*field); // Add to the undo list oldRecord = CDbUndoBool::NewL(aColumn, OldValue); iQHeader.AddLast(*oldRecord); // Change the record to the new value ModifyColumnBoolL(aColumn, aValue); }void CDbAgtBase::ModifyColumnBoolL(const TDesC &aColumn, const TBool &aValue) { TInt ValType; CMDBField<TBool>* field = static_cast<CMDBField<TBool>*>(iTable->iRecords[iCurrentRecord]->GetFieldByNameL(aColumn, ValType)); *field = aValue; field->ModifyL(*iDb); }void CDbAgtBase::SetColumnTextL(const TDesC &aColumn, const TDesC16& aValue) { // Used by a client to set a text value in the database, also remembers the change // for undo purposes later TBuf16<KCommsDbSvrMaxFieldLength> OldText; CDbUndoText *oldRecord; // Get the current value in the table TInt ValType; CMDBField<TDesC>* field = static_cast<CMDBField<TDesC>*>(iTable->iRecords[iCurrentRecord]->GetFieldByNameL(aColumn, ValType)); OldText = static_cast<TDesC>(*field); // Add to the undo list oldRecord = CDbUndoText::NewL(aColumn, OldText); iQHeader.AddLast(*oldRecord); // Change the record to the new value ModifyColumnTextL(aColumn, aValue); }void CDbAgtBase::ModifyColumnTextL(const TDesC &aColumn, const TDesC16& aValue) { TInt ValType; CMDBField<TDesC>* field = static_cast<CMDBField<TDesC>*>(iTable->iRecords[iCurrentRecord]->GetFieldByNameL(aColumn, ValType)); *field = aValue; field->ModifyL(*iDb); }void CDbAgtBase::SetColumnLongTextL(const TDesC &aColumn, const TDesC16& aValue) { // Used by a client to set a long text value in the database, also remembers the change // for undo purposes later CDbUndoLongText *oldRecord; // Get the current long text in the table, it is allocated in CommDB in ReadLongTextLC. // The method returns a pointer into HBufC. TInt ValType; CMDBField<TDesC>* field = static_cast<CMDBField<TDesC>*>(iTable->iRecords[iCurrentRecord]->GetFieldByNameL(aColumn, ValType)); HBufC* OldLongText = HBufC::NewL(static_cast<TDesC>(*field).Length()); CleanupStack::PushL(OldLongText); *OldLongText = *field; // Add to the undo list oldRecord = CDbUndoLongText::NewL(aColumn, OldLongText); iQHeader.AddLast(*oldRecord); // Allocated into CDbUndoLongText in ConstructL, and this one was created in CommDB so delete it! // this is pushed above so clean up properly CleanupStack::PopAndDestroy(OldLongText); // Change the record to the new value ModifyColumnLongTextL(aColumn, aValue); }void CDbAgtBase::ModifyColumnLongTextL(const TDesC &aColumn, const TDesC16& aValue) { TInt ValType; CMDBField<TDesC>* field = static_cast<CMDBField<TDesC>*>(iTable->iRecords[iCurrentRecord]->GetFieldByNameL(aColumn, ValType)); field->SetMaxLengthL(aValue.Length()); *field = aValue; field->ModifyL(*iDb); }void CDbAgtBase::UndoDatabaseChangesL() { CDbUndoBase* currentitem; // Traverse back through the changes and reset database to the way it was iQIter.SetToLast(); while((currentitem = iQIter--) != NULL) { // reset the value of this record in the database currentitem->UndoL(this); currentitem->iLink.Deque(); delete currentitem; }; }// GPRS OUTGOING TABLE access classCDbGPRSOutgoingTable *CDbGPRSOutgoingTable::NewL() { CDbGPRSOutgoingTable *gprs = new(ELeave) CDbGPRSOutgoingTable(); CleanupStack::PushL(gprs); gprs->ConstructL(); CleanupStack::Pop(); return gprs; }CDbGPRSOutgoingTable::CDbGPRSOutgoingTable() { }void CDbGPRSOutgoingTable::ConstructL() { CDbAgtBase::ConstructL(); iTable = new CMDBRecordSet<CCDWCDMAPacketServiceRecord>(KCDTIdWCDMAPacketServiceRecord); iTable->LoadL(*iDb); iCurrentRecord = 0; }CDbGPRSOutgoingTable::~CDbGPRSOutgoingTable() { delete iTable; }// CSD DIAL OUT table classCDbCsdTable *CDbCsdTable::NewL() { CDbCsdTable *csd = new(ELeave) CDbCsdTable(); CleanupStack::PushL(csd); csd->ConstructL(); CleanupStack::Pop(); return csd; }CDbCsdTable::CDbCsdTable() { }void CDbCsdTable::ConstructL() { CDbAgtBase::ConstructL(); iTable = new CMDBRecordSet<CCDDialOutISPRecord>(KCDTIdDialOutISPRecord); iTable->LoadL(*iDb); iCurrentRecord = 0; }CDbCsdTable::~CDbCsdTable() { delete iTable; }// MODEM table classCDbModemTable *CDbModemTable::NewL() { CDbModemTable *modem = new(ELeave) CDbModemTable(); CleanupStack::PushL(modem); modem->ConstructL(); CleanupStack::Pop(); return modem; }CDbModemTable::CDbModemTable() { }void CDbModemTable::ConstructL() { CDbAgtBase::ConstructL(); iTable = new CMDBRecordSet<CCDModemBearerRecord>(KCDTIdModemBearerRecord); iTable->LoadL(*iDb); iCurrentRecord = 0; }CMDBRecordSetBase*CDbCsdTable::Table() { return(iTable); }CDbModemTable::~CDbModemTable() { delete iTable; }