serviceproviders/sapi_contacts_vpbk/contactservice/src/singlecontact.cpp
changeset 5 989d2f495d90
child 10 fc9cf246af83
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/serviceproviders/sapi_contacts_vpbk/contactservice/src/singlecontact.cpp	Fri Jul 03 15:51:24 2009 +0100
@@ -0,0 +1,262 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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 <MVPbkFieldType.h>
+#include <MVPbkContactFieldTextData.h>
+#include <MVPbkContactLink.h>
+#include <MVPbkContactLinkArray.h>
+#include <MVPbkContactGroup.h>
+#include <barsread.h>
+#include <eikenv.h>
+#include <TVPbkFieldTypeMapping.h>
+#include <MVPbkContactFieldTextData.h>					     
+#include <MVPbkContactFieldData.h>
+#include <MVPbkContactFieldBinaryData.h>
+#include <MVPbkContactFieldDateTimeData.h>			      
+#include <MVPbkStoreContactField.h>
+
+#include "singlecontact.h"
+
+//NewL method for CSingleContact class. It holds MVPbkStoreContact variable as its member
+CSingleContact* CSingleContact::NewL(MVPbkStoreContact* aSingleContact, Ttype aIndicator)
+    {
+	CSingleContact* self = new( ELeave ) CSingleContact();
+	CleanupStack::PushL( self );
+	self->ConstructL(aSingleContact, aIndicator);
+	CleanupStack::Pop( self );
+	return self;
+    }
+
+EXPORT_C
+CSingleContact* CSingleContact::NewL()
+    {
+    CSingleContact* self = new( ELeave ) CSingleContact();
+    CleanupStack::PushL( self );
+    self->iContactId = KNullDesC8().AllocL();
+    CleanupStack::Pop( self );
+	return self;		
+    }
+
+
+// ---------------------------------------------------------------------------
+//Constructor
+// ---------------------------------------------------------------------------
+CSingleContact::CSingleContact()
+	{	
+	}
+
+void CSingleContact::ConstructL(MVPbkStoreContact* aSingleContact, Ttype aIndicator)
+    {
+	iIndicator = aIndicator;
+	iContactId = KNullDesC8().AllocL();
+	ConvertContactToFieldListL(aSingleContact);
+    }
+
+void CSingleContact::ConvertContactToFieldListL(MVPbkStoreContact* aSingleContact)
+    {
+
+	if(aSingleContact)
+	{
+	TInt fieldCount = aSingleContact->Fields().FieldCount();	
+	CSingleContactField* field = NULL;
+	for(TInt fieldIndex = 0; fieldIndex < fieldCount ; fieldIndex++)
+		{
+		field = NextFieldL(aSingleContact, fieldIndex);
+		if(field !=NULL)
+			{
+			iFields.AppendL(field);	
+			}
+		}
+	}
+		delete aSingleContact;
+
+    }
+//Returns the Next field in the contact if any, otherwise returns NULL
+CSingleContactField* CSingleContact::NextFieldL(MVPbkStoreContact* aSingleContact, TInt aIndex)
+	{
+    TPtrC text(KNullDesC);
+    TTime time;
+    TPtrC8 val;
+    
+	CSingleContactField* contactField = CSingleContactField::NewL();
+    CleanupStack::PushL(contactField);
+	if(iIndicator == EContacts)
+		{
+		//Get the field at iFieldIndex in the contact
+		MVPbkStoreContactField& field = aSingleContact->Fields().FieldAt(aIndex);
+		
+		//Get the fieldKey of the field 
+	    TPtrC8 fieldKey = CSearchFields::GetFieldKeyFromId(field.BestMatchingFieldType()->FieldTypeResId());
+		if(fieldKey.Compare(KNullDesC8) == 0)
+			{
+			CleanupStack::PopAndDestroy(contactField);		
+			return NULL;
+			}
+		//Get the label of the field
+	    TPtrC label(field.FieldLabel());
+       		
+		//Get the value of the field
+
+		TVPbkFieldStorageType storageType = field.FieldData().DataType();
+		//TBuf<KMinHeapGrowBy> value;
+		
+	    if( EVPbkFieldStorageTypeBinary == storageType )
+	    	{
+	        val.Set((MVPbkContactFieldBinaryData::Cast(field.FieldData())).BinaryData());
+	        //value.Copy(val);
+	    	}
+	    else if( EVPbkFieldStorageTypeDateTime == storageType )
+	    	{
+	    	time = (MVPbkContactFieldDateTimeData::Cast(field.FieldData())).DateTime();
+	    	contactField->SetDateTime(time);
+	    	}
+	    else
+	    	{
+	    	text.Set((MVPbkContactFieldTextData::Cast(field.FieldData())).Text());
+	    	}
+			
+		//Set the parameters in CSingleContactField object
+		contactField->SetFieldParamsL(fieldKey, label, text);
+		
+		}
+	else if(iIndicator == EGroups)
+		{
+		TPtrC groupLabel = (aSingleContact->Group())->GroupLabel();
+		
+		MVPbkContactLinkArray* linkArray = (aSingleContact->Group())->ItemsContainedLC();
+		TInt noOfEntries = linkArray->Count();		    	
+		if(noOfEntries > 0)
+			{
+			RPointerArray<HBufC8> array(noOfEntries);
+			CleanupClosePushL(array);
+			const HBufC8* packedLink;
+			
+			for(int i=0; i<noOfEntries; i++)
+				{
+				packedLink = const_cast <MVPbkContactLink&>(linkArray->At(i)).PackLC();
+				array.AppendL(packedLink);
+				}
+			
+			//Set the parameters in CSingleContactField object
+			contactField->SetFieldParamsL(groupLabel, array);
+
+			CleanupStack::Pop(noOfEntries);
+            CleanupStack::Pop(&array);		    		
+			}
+		else
+			{
+			RPointerArray<HBufC8> array;
+			//Set the parameters in CSingleContactField object
+			contactField->SetFieldParamsL(groupLabel, array);
+			}
+		CleanupStack::PopAndDestroy();
+		}
+	CleanupStack::Pop(contactField);		
+	return contactField;
+	}
+// ---------------------------------------------------------------------------
+//Sets the contact id of a contact
+// ---------------------------------------------------------------------------
+EXPORT_C void CSingleContact::SetContactIdL(const TDesC8& aContactId)
+	{
+	if(iContactId)
+    	{
+    	delete iContactId;
+    	iContactId = NULL;
+    	}
+    iContactId = aContactId.AllocL();
+	}
+
+// ---------------------------------------------------------------------------
+//Gets the contact id of a contact
+// ---------------------------------------------------------------------------
+ EXPORT_C TDesC8& CSingleContact::GetContactId()
+	{	    
+    return *iContactId;
+	}
+// ---------------------------------------------------------------------------
+// CSingleContact::RemoveFieldL
+// Removes the specified field from the contact
+// ---------------------------------------------------------------------------
+
+EXPORT_C TInt CSingleContact::RemoveField(TInt aIndex)
+    {
+	TInt retVal = KErrArgument;
+	
+	if((aIndex >= 0) && (aIndex < iFields.Count()))
+		{
+		delete iFields[aIndex];
+		iFields[aIndex] = NULL;
+		iFields.Remove(aIndex);
+		retVal = KErrNone;
+		}
+	
+	return retVal;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSingleContact::RemoveAllFields
+// Removes all fields from the contact
+// ---------------------------------------------------------------------------
+
+EXPORT_C void CSingleContact::RemoveAllFields()
+    {
+	iFields.ResetAndDestroy();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSingleContact::AddFieldToContactL
+// Add a Field to Contact
+// ---------------------------------------------------------------------------
+
+EXPORT_C void CSingleContact::AddFieldToContactL( const CSingleContactField* aField )
+    {
+    iFields.AppendL(aField);	
+    } 
+    
+
+//Destructor
+CSingleContact::~CSingleContact()
+	{
+	iFields.ResetAndDestroy();
+	delete iContactId;
+	}
+	
+
+//Get the  number of fields in the contact
+EXPORT_C 
+TInt CSingleContact::FieldCount()
+    {
+	return iFields.Count();
+    }
+//Get the field at the index;
+EXPORT_C 
+CSingleContactField* CSingleContact::FieldAt(TInt aIndex)
+    {
+    if((aIndex >= 0) && (aIndex < iFields.Count()))
+    	{
+    	return iFields[aIndex];	
+    	}
+    else
+    	{
+    	return NULL;	
+    	}
+    }
+