--- /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<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 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<CCDWCDMAPacketServiceRecord>(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<CCDDialOutISPRecord>(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<CCDModemBearerRecord>(KCDTIdModemBearerRecord);
+ iTable->LoadL(*iDb);
+ iCurrentRecord = 0;
+ }
+
+CMDBRecordSetBase*CDbCsdTable::Table()
+ {
+ return(iTable);
+ }
+CDbModemTable::~CDbModemTable()
+ {
+ delete iTable;
+ }