diff -r 000000000000 -r 3553901f7fa8 telephonyprotocols/csdagt/TS_CsdAgt/DbUndo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyprotocols/csdagt/TS_CsdAgt/DbUndo.cpp Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,378 @@ +// 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 Integers +void 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 Booleans +void 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 text +void 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 text +void 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 name +void 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 records +CDbAgtBase::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* field = static_cast*>(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* field = static_cast*>(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* field = static_cast*>(iTable->iRecords[iCurrentRecord]->GetFieldByNameL(aColumn, ValType)); + OldValue = static_cast(*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* field = static_cast*>(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 OldText; + CDbUndoText *oldRecord; + + // Get the current value in the table + TInt ValType; + CMDBField* field = static_cast*>(iTable->iRecords[iCurrentRecord]->GetFieldByNameL(aColumn, ValType)); + OldText = static_cast(*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* field = static_cast*>(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* field = static_cast*>(iTable->iRecords[iCurrentRecord]->GetFieldByNameL(aColumn, ValType)); + HBufC* OldLongText = HBufC::NewL(static_cast(*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* field = static_cast*>(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 class +CDbGPRSOutgoingTable *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(KCDTIdWCDMAPacketServiceRecord); + iTable->LoadL(*iDb); + iCurrentRecord = 0; + } + +CDbGPRSOutgoingTable::~CDbGPRSOutgoingTable() + { + delete iTable; + } + +// CSD DIAL OUT table class +CDbCsdTable *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(KCDTIdDialOutISPRecord); + iTable->LoadL(*iDb); + iCurrentRecord = 0; + } + +CDbCsdTable::~CDbCsdTable() + { + delete iTable; + } + + +// MODEM table class +CDbModemTable *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(KCDTIdModemBearerRecord); + iTable->LoadL(*iDb); + iCurrentRecord = 0; + } + +CMDBRecordSetBase*CDbCsdTable::Table() + { + return(iTable); + } +CDbModemTable::~CDbModemTable() + { + delete iTable; + }