diff -r 000000000000 -r dfb7c4ff071f commsconfig/commsdatabaseshim/commdbshim/SCDB/CDBTEMP.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commsconfig/commsdatabaseshim/commdbshim/SCDB/CDBTEMP.CPP Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,616 @@ +// Copyright (c) 2006-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: +// Comms Database Template Record Table View defintions +// +// + +/** + @file + @deprecated since v9.1. Functionality is replaced with commsdat. +*/ + +#include "cdbtemp.h" +#include "CDBSTD.H" +#include +#include "commdb_impl.H" + +const TBool KTHidden = ETrue; +const TBool KTNotReadOnly = EFalse; +const TBool KTTemplateCall = ETrue; + +// +// CCommsDbTemplateRecord definitions +// + +EXPORT_C CCommsDbTemplateRecord* CCommsDbTemplateRecord::NewL(CCommsDatabaseBase* aDb,const TDesC& aTableName) +/** Allocates and constructs a view, which includes only the template record, on +the table whose name is defined in the specified descriptor and which is in +the specified communications database. + +The view is restricted to the single template record in the table. + +The communications database, pointed to by aDb should already have been opened. + +@param aDb A pointer to the communications database object. This pointer must +not be NULL. +@param aTableName A reference to a descriptor containing the name of a table +in the communications database. +@return A pointer to the view object which just includes the template record. */ + { + CCommsDbTemplateRecord* r=new(ELeave) CCommsDbTemplateRecord(); + CleanupStack::PushL(r); + r->ConstructL(aDb,aTableName); + CleanupStack::Pop(r); + return r; + } + +CCommsDbTemplateRecord::CCommsDbTemplateRecord() +/** +Default Constructor +*/ + {} + +void CCommsDbTemplateRecord::ConstructL(CCommsDatabaseBase* aDb,const TDesC& aTableName) + { + iView=CCommsDbTableView::NewLC(aTableName, *aDb); + iView->iTableExt->SetShowHiddenRecords(ETrue); // they've specifically asked for a template view + CleanupStack::Pop(iView); + + if (!iView->TableWithTemplateRecord()) + { + User::Leave(KErrNotSupported); + } + //2aDb. + } + +EXPORT_C CCommsDbTemplateRecord::~CCommsDbTemplateRecord() +/** Frees all resources owned by this object, prior to its destruction. Specifically, +it closes the view. */ + { + delete iView; + } + +EXPORT_C TInt CCommsDbTemplateRecord::Modify() +/** Prepares to update the template record, if it exists. If the template record +does not exist, it is created and left ready for modification. The function must +be called before writing to any column. Once all changes to the template record +are complete, a call must be made to either StoreModifications() or +CancelModifications() as appropriate. + +From v9.1 template record always exist + +This function raises a CommsDbServer 1 or a CommsDbServer 2 panic if a previous +call to Modify() has already been made. + +This function must be called before any attempt is made to write to a column +otherwise subsequent write operations raise a CommsDbServer 12 panic. + +Once this function has completed successfully, no attempt can be made to read +from a column until either StoreModifications() or CancelModifications() has +been called to complete the record insertion operation, otherwise the read +operations raise a CommsDbServer 10 panic. + +@return KErrNone if successful, otherwise another of the system-wide error +codes. */ + { + TBool hidden = SetHiddenMask(); + + TInt retval = Reposition(); + if (iRecordExists) + { + retval = iView->UpdateRecord(); + } + else + { + // if record doesn't exist insert one + retval = iView->InsertTemplateRecord(); + } + + ClearHiddenMask(hidden); + + return retval; + } + +EXPORT_C TInt CCommsDbTemplateRecord::Delete() +/** Deletes the template record. + +This function raises a CommsDbServer 3 panic if a previous call to Modify() +has been made. + +@return KErrNone if successful, otherwise another of the system-wide error +codes. +@capability Dependent on table, see the guide page referenced below. */ + { + TBool hidden = SetHiddenMask(); + + TInt ret = Reposition(); + + if(ret == KErrNone) + { + if(iRecordExists) + { + ret = iView->DeleteRecord(); + } + else + { + ret = KErrNotFound; + } + } + + ClearHiddenMask(hidden); + + return ret; + } + +EXPORT_C TInt CCommsDbTemplateRecord::StoreModifications() +/** Confirms changes made to the template record which were started by a call to +Modify(). + +A call to Modify() must have previously been made otherwise the function raises +a CommsDbServer 4 panic. + +@return KErrNone if successful, otherwise another of the system-wide error +codes. +@capability Dependent on table, see the guide page referenced below. */ + { + TInt ret=iView->DoPutRecordChanges(KTHidden,KTNotReadOnly,KTTemplateCall); + if (ret==KErrNone) + { + iRecordExists=ETrue; + } + return ret; + } + +EXPORT_C void CCommsDbTemplateRecord::CancelModifications() +/** Abandons changes made to the template record which were started by a call to +Modify(). + +A call to Modify() must have previously been made otherwise the function raises +a CommsDbServer 5 panic. + +@return KErrNone if successful, otherwise another of the system-wide error +codes. */ + { + TBool hidden = SetHiddenMask(); + iView->CancelRecordChanges(); + ClearHiddenMask(hidden); + } + +EXPORT_C void CCommsDbTemplateRecord::ReadTextL(const TDesC& aColumn, TDes8& aValue) +/** Reads narrow (ASCII) text located in a specific column within the template +record and copies it to the specified 8 bit modifiable descriptor. The column +is identified by the name supplied in the descriptor aColumn. + +The maximum length of text expected by this function is the value of the constant +KCommsDbSvrMaxColumnNameLength. The maximum length of aValue supplied by the +caller can, therefore, be the same. + +If the template record does not exist, this function will just return with an empty +aValue desciptor. + +This read operation must not occur if any of the operations involved in changing +the template record are still outstanding, otherwise the function raises a +CommsDbServer 10 panic. For example, the panic is raised if this function +is called between calls to Modify() and StoreModifications(). + +The CommsDbServer 10 panic is also raised if this function is called after +the view has been closed. + +@param aColumn A reference to a descriptor containing the name of the column +in the template record whose (narrow text) value is to be read. +@param aValue A reference to an 8 bit descriptor passed by the caller. +@capability Dependent on table, see the guide page referenced below. */ + + { + Reposition(); + if (iRecordExists) + { + iView->ReadTextL(aColumn,aValue); + } + else + { + aValue.SetLength(0); + } + } + +EXPORT_C void CCommsDbTemplateRecord::ReadTextL(const TDesC& aColumn, TDes16& aValue) +/** Reads wide (UNICODE) text located in a specific column within the template +record and copies it to the specified 16 bit modifiable descriptor. The column +is identified by the name supplied in the descriptor aColumn. + +The maximum length of text expected by this function is the value of the constant +KCommsDbSvrMaxColumnNameLength. The maximum length of aValue supplied by the +caller can, therefore, be the same. + +This read operation must not occur if any of the operations involved in changing +the template record are still outstanding, otherwise the function raises a +CommsDbServer 10 panic. For example, the panic is raised if this function +is called between calls to Modify() and StoreModifications(). + +The CommsDbServer 10 panic is also raised if this function is called after +the view has been closed. + +If the template record does not exist, this function will just return with an empty +aValue desciptor. + +@param aColumn A reference to a descriptor containing the name of the column +in the template record whose (wide text) value is to be read. +@param aValue A reference to a 16 bit descriptor passed by the caller. +@capability Dependent on table, see the guide page referenced below. */ + { + Reposition(); + if (iRecordExists) + { + iView->ReadTextL(aColumn,aValue); + } + else + { + aValue.SetLength(0); + } + } + +EXPORT_C HBufC* CCommsDbTemplateRecord::ReadLongTextLC(const TDesC& aColumn) +/** Reads the long text located in a specific column within the template record +and copies this text to a heap descriptor. The heap descriptor is allocated +and its pointer returned by this function. The column is identified by the +name supplied in the descriptor aColumn. + +While the text in columns retrieved by the ReadTextL() functions is limited +in length, there is no restriction on the length of long text. + +If the template record does not exist, this function will just return an empty +desciptor. Also in this case, the caller is still responsible for removing this +object from the cleanup stack. + +This read operation must not occur if any of the operations involved in changing +a record are still outstanding, otherwise the function raises a CommsDbServer +10 panic. For example, the panic is raised if this function is called between +calls to Modify() and StoreModifications(). + +The CommsDbServer 10 panic is also raised if this function is called after +the view has been closed. + +@param aColumn A reference to a descriptor containing the name of a column +in the template record. +@return Pointer to a heap descriptor containing the long text. +@capability Dependent on table, see the guide page referenced below. */ + { + Reposition(); + HBufC* buf; + if (iRecordExists) + { + buf=iView->ReadLongTextLC(aColumn); + } + else + { + buf=HBufC::NewLC(0); + } + return buf; + } + +EXPORT_C void CCommsDbTemplateRecord::ReadUintL(const TDesC& aColumn, TUint32& aValue) +/** Reads an unsigned integer value located in a specific column within the template +record and copies it into the specified unsigned integer. The column is identified +by the name supplied in the descriptor aColumn. + +This read operation must not occur if any of the operations involved in changing +the template record are still outstanding, otherwise the function raises a +CommsDbServer 10 panic. For example, the panic is raised if this function +is called between calls to Modify() and StoreModifications(). + +The CommsDbServer 10 panic is also raised if this function is called after +the view has been closed. + +If the template record does not exist then the function leaves with KErrUnknown. + +@param aColumn A reference to a descriptor containing the name of the column +in the template record whose (unsigned integer) value is to be read. +@param aValue A reference to an unsigned integer passed by the caller. +@capability Dependent on table, see the guide page referenced below. */ + { + Reposition(); + if (iRecordExists) + { + iView->ReadUintL(aColumn,aValue); + } + else + { + User::Leave(KErrUnknown); + } + } + +EXPORT_C void CCommsDbTemplateRecord::ReadBoolL(const TDesC& aColumn, TBool& aValue) +/** Reads a boolean value located in a specific column within the template record +and copies it into the specified descriptor. The column is identified by the +name supplied in the descriptor aColumn. + +This read operation must not occur if any of the operations involved in changing +the template record are still outstanding, otherwise the function raises a +CommsDbServer 10 panic. For example, the panic is raised if this function +is called between calls to Modify() and StoreModifications(). + +The CommsDbServer 10 panic is also raised if this function is called after +the view has been closed. + +If the template record does not exist then the function leaves with KErrUnknown. + +@param aColumn A reference to a descriptor containing the name of the column +in the template record whose (boolean) value is to be read. +@param aValue A reference to a TBool passed by the caller. +@capability Dependent on table, see the guide page referenced below. */ + { + Reposition(); + if (iRecordExists) + { + iView->ReadBoolL(aColumn,aValue); + } + else + { + User::Leave(KErrUnknown); + } + } + +EXPORT_C void CCommsDbTemplateRecord::ReadTypeAttribL(const TDesC& aColumn, TDbColType& aColType, TUint32& aAttrib) +/** Gets the type and the attributes of a specific column within the template record +and puts them into a reference to an object and a reference to an unsigned +integer respectively. The column is identified by the name supplied in the +descriptor aColumn. + +The column type is described by the TDbColType enumerator. + +The column attributes are one or more of the values TDbCol::ENotNull and TDbCol::EAutoIncrement. + +This function must not be called if any of the operations involved in changing +the template record are still outstanding, otherwise the function raises a +CommsDbServer 10 panic. For example, the panic is raised if this function +is called between calls to Modify() and StoreModifications(). + +@param aColumn A reference to a descriptor containing the name of the column +in the template record whose type and attributes are to be fetched. +@param aColType A reference to a TDbColType object passed by the caller. On +successful return from this function, contains a copy of the column type. +@param aAttrib A reference to an unsigned integer passed by the caller. On +successful return from this function, contains a copy of the column attributes. +@capability Dependent on table, see the guide page referenced below. */ + { + Reposition(); + iView->ReadTypeAttribL(aColumn,aColType,aAttrib); + } + +EXPORT_C void CCommsDbTemplateRecord::ReadColumnLengthL(const TDesC& aColumn, TInt& aLength) +/** Gets the length of a specific column within the template record and copies +it to an integer passed by the caller. The column is identified by the name +supplied in the descriptor aColumn. + +This read operation must not occur if any of the operations involved in changing +a template record are still outstanding, otherwise the function raises a CommsDbServer +10 panic. For example, the panic is raised if this function is called between +calls to Modify() and StoreModifications(). + +The CommsDbServer 10 panic is also raised if this function is called after +the view has been closed. + +If the template record does not exist, this function will just return with aLength set to +zero. + +@param aColumn A reference to a descriptor containing the name of a column +in the template record. +@param aLength A reference to an integer passed by the caller. On successful +return from this function, contains a copy of the length of the column. +@capability Dependent on table, see the guide page referenced below. */ + { + Reposition(); + if (iRecordExists) + { + iView->ReadColumnLengthL(aColumn,aLength); + } + else + { + aLength=0; + } + } + +EXPORT_C void CCommsDbTemplateRecord::WriteTextL(const TDesC& aColumn, const TDesC8& aValue) +/** Writes the narrow (ASCII) text from the specified 8 bit descriptor to a specific +column within the template record. The column is identified by the name supplied +in the descriptor aColumn. + +An earlier call to Modify() must have been made before calling this function +otherwise the function raises a CommsDbServer 12 panic. + +@param aColumn A reference to a descriptor containing the name of a column +in the template record. +@param aValue A reference to an 8 bit descriptor containing the narrow text +to be written into the column. +@leave The function can leave for reasons defined by DBMS. It will also +leave if the length of the text is greater than the maximum permitted - +equal to the value of the constant KCommsDbSvrMaxColumnNameLength. +KErrNotFound The column name does not exist. +@capability Dependent on table, see the guide page referenced below. */ + { + iView->WriteTextL(aColumn,aValue); + } + +EXPORT_C void CCommsDbTemplateRecord::WriteTextL(const TDesC& aColumn, const TDesC16& aValue) +/** Writes the wide (Unicode) text from the specified 16 bit descriptor to a specific +column within the template record. The column is identified by the name supplied +in the descriptor aColumn. + +An earlier call to Modify() must have been made before calling this function +otherwise the function raises a CommsDbServer 12 panic. + +The CommsDbServer 12 panic is also raised if this function is called after +the view has been closed. + +@param aColumn A reference to a descriptor containing the name of a column +in the current record. +@param aValue A reference to a 16 bit descriptor containing the wide text to +be written into the column. +@leave The function can leave for reasons defined by DBMS. It will also +leave if the length of the text is greater than the maximum permitted - +equal to the value of the constant KCommsDbSvrMaxColumnNameLength. +KErrNotFound The column name does not exist. +@capability Dependent on table, see the guide page referenced below. */ + { + iView->WriteTextL(aColumn,aValue); + } + +EXPORT_C void CCommsDbTemplateRecord::WriteLongTextL(const TDesC& aColumn, const TDesC& aValue) +/** Writes the long text from a specified descriptor to a specific column within +the template record. The column is identified by the name supplied in the +descriptor aColumn. + +An earlier call to Modify() must have been made before calling this function +otherwise the function raises a CommsDbServer 12 panic. + +The CommsDbServer 12 panic is also raised if this function is called after +the view has been closed. + +While the text written by WriteTextL() functions is limited in length, there +is no restriction on the length of long text. + +@param aColumn A reference to a descriptor containing the name of a column +in the template record. +@param aValue A reference to a descriptor containing the long text to be written +into the column. +@leave KErrNotFound The column name does not exist. +@capability Dependent on table, see the guide page referenced below. */ + { + iView->WriteLongTextL(aColumn,aValue); + } + +EXPORT_C void CCommsDbTemplateRecord::WriteUintL(const TDesC& aColumn, const TUint32& aValue) +/** Writes a specified unsigned integer value to a specific column within the template +record. The column is identified by the name supplied in the descriptor aColumn. + +An earlier call to Modify() must have been made before calling this function +otherwise the function raises a CommsDbServer 12 panic. + +The CommsDbServer 12 panic is also raised if this function is called after +the view has been closed. + +The column being changed must not be the Id column (symbolic name COMMDB_ID) +otherwise the function raises a CommsDbServer 13 panic. + +@param aColumn A reference to a descriptor containing the name of a column +in the template record. +@param aValue A reference to an unsigned integer containing the value to be +written into the column. +@leave KErrNotFound The column name does not exist. +@capability Dependent on table, see the guide page referenced below. */ + { + iView->WriteUintL(aColumn,aValue); + } + +EXPORT_C void CCommsDbTemplateRecord::WriteBoolL(const TDesC& aColumn, const TBool& aValue) +/** Writes a specified boolean value to a specific column within the template record. +The column is identified by the name supplied in the descriptor aColumn. + +An earlier call to Modify() must have been made before calling this function +otherwise the function raises a CommsDbServer 12 panic. + +The CommsDbServer 12 panic is also raised if this function is called after +the view has been closed. + +@param aColumn A reference to a descriptor containing the name of a column +in the template record. +@param aValue A reference to TBool containing the value to be written into +the column. +@leave KErrNotFound The column name does not exist. +@capability Dependent on table, see the guide page referenced below. */ + { + iView->WriteBoolL(aColumn,aValue); + } + +EXPORT_C void CCommsDbTemplateRecord::GetTableName(TDes& aTableName) const +/** Gets the name of the table associated with this view and copy it into the descriptor +supplied by the caller. + +@param aTableName A reference to a descriptor passed by the caller. On return +from this function it contains the name of the table. */ + { + iView->GetTableName(aTableName); + } + +EXPORT_C TBool CCommsDbTemplateRecord::TemplateRecordExists() +/** Tests whether a template record exists in this table. + +@return ETrue, if a template record exists; EFalse, otherwise */ + { + (void) Reposition(); // it seems wrong to ignore error, but old API does not allow for handling this better + return iRecordExists; + } + +EXPORT_C TInt CCommsDbTemplateRecord::InsertCopy(TUint32& aId) +/** +Creates a new record based on the contents of the template record + +@param aId On return contains the unique Id associated with this new record. +@return KErrNone if successful, otherwise another of the system-wide error codes. +@capability Dependent on table, see the guide page referenced below. +*/ + { + TBool hidden = SetHiddenMask(); + + TInt ret = Reposition(); + if (iRecordExists) + { + ret = iView->InsertCopyRecord(aId); + } + + ClearHiddenMask(hidden); + + return ret; + } + +TInt CCommsDbTemplateRecord::Reposition() + { + TBool hidden = SetHiddenMask(); + + TInt ret=iView->GotoFirstRecord(); + if (ret==KErrNone) + { + iRecordExists=ETrue; + } + else if(ret != KErrNoMemory) + { + iRecordExists=EFalse; + ret = KErrNone; + } + + ClearHiddenMask(hidden); + return ret; + } + + +void CCommsDbTemplateRecord::ClearHiddenMask(TBool aClearHiddenMask) + { + if (aClearHiddenMask) + { + iView->iDb.iImpl->iDbs->ClearAttributeMask(ECDHidden); + } + } + +TBool CCommsDbTemplateRecord::SetHiddenMask() + { + CMDBSession* dbSession = iView->iDb.iImpl->iDbs; + if (! dbSession->IsSetAttributeMask(ECDHidden)) + { + dbSession->SetAttributeMask(ECDHidden); + return ETrue; + } + else + return EFalse; + } +