--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkCntModel/src/TContactFieldDataImpl.cpp Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,278 @@
+/*
+* Copyright (c) 2004-2007 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:
+*
+*/
+
+
+// INCLUDES
+#include "TContactFieldDataImpl.h"
+#include <VPbkError.h>
+#include <cntdef.h>
+#include <cntfield.h>
+#include <cntfldst.h>
+#include "VPbkCntModelUid.h"
+
+
+
+
+namespace VPbkCntModel {
+
+_LIT(KColon, ":");
+
+// TContactFieldTextData
+TBool TContactFieldTextData::IsEmpty() const
+ {
+ return !iCntModelField->Storage()->IsFull();
+ }
+
+void TContactFieldTextData::CopyL(const MVPbkContactFieldData& aFieldData)
+ {
+ __ASSERT_ALWAYS(DataType() == aFieldData.DataType(),
+ VPbkError::Panic(VPbkError::EFieldDataTypeMismatch));
+ SetTextL(MVPbkContactFieldTextData::Cast(aFieldData).Text());
+ }
+
+TPtrC TContactFieldTextData::Text() const
+ {
+ return iCntModelField->TextStorage()->Text();
+ }
+
+void TContactFieldTextData::SetTextL(const TDesC& aText)
+ {
+ iCntModelField->TextStorage()->SetTextL(aText);
+ }
+
+TInt TContactFieldTextData::MaxLength() const
+ {
+ return KVPbkUnlimitedFieldLength;
+ }
+
+// TContactFieldBinaryData
+TBool TContactFieldBinaryData::IsEmpty() const
+ {
+ return !iCntModelField->Storage()->IsFull();
+ }
+
+void TContactFieldBinaryData::CopyL(const MVPbkContactFieldData& aFieldData)
+ {
+ __ASSERT_ALWAYS(DataType() == aFieldData.DataType(),
+ VPbkError::Panic(VPbkError::EFieldDataTypeMismatch));
+ SetBinaryDataL(MVPbkContactFieldBinaryData::Cast(aFieldData).BinaryData());
+ }
+
+TPtrC8 TContactFieldBinaryData::BinaryData() const
+ {
+ TPtrC8 result;
+ HBufC8* buf = iCntModelField->StoreStorage()->Thing();
+ if (buf)
+ {
+ result.Set(*buf);
+ }
+ return result;
+ }
+
+void TContactFieldBinaryData::SetBinaryDataL(const TDesC8& aBinaryData)
+ {
+ iCntModelField->StoreStorage()->SetThingL(aBinaryData);
+ }
+
+// TContactFieldDateTimeData
+TBool TContactFieldDateTimeData::IsEmpty() const
+ {
+ return !iCntModelField->Storage()->IsFull();
+ }
+
+void TContactFieldDateTimeData::CopyL(const MVPbkContactFieldData& aFieldData)
+ {
+ __ASSERT_ALWAYS(DataType() == aFieldData.DataType(),
+ VPbkError::Panic(VPbkError::EFieldDataTypeMismatch));
+ SetDateTime(MVPbkContactFieldDateTimeData::Cast(aFieldData).DateTime());
+ }
+
+TTime TContactFieldDateTimeData::DateTime() const
+ {
+ return iCntModelField->DateTimeStorage()->Time();
+ }
+
+void TContactFieldDateTimeData::SetDateTime(const TTime& aTime)
+ {
+ iCntModelField->DateTimeStorage()->SetTime(aTime);
+ }
+
+// TContactFieldUriData
+TBool TContactFieldUriData::IsEmpty() const
+ {
+ return !iCntModelField->Storage()->IsFull();
+ }
+
+void TContactFieldUriData::CopyL(const MVPbkContactFieldData& aFieldData)
+ {
+ __ASSERT_ALWAYS(DataType() == aFieldData.DataType(),
+ VPbkError::Panic(VPbkError::EFieldDataTypeMismatch));
+ SetUriL(MVPbkContactFieldUriData::Cast(aFieldData).Uri());
+ }
+
+TPtrC TContactFieldUriData::Scheme() const
+ {
+ TPtrC ptr = iCntModelField->TextStorage()->Text();
+ if (!ptr.Length())
+ {
+ return ptr;
+ }
+ TInt pos = ptr.Find(KColon);
+ __ASSERT_DEBUG(pos > 0,
+ VPbkError::Panic(VPbkError::EFieldDataTypeMismatch));
+ return ptr.Left(pos);
+ }
+
+TPtrC TContactFieldUriData::Text() const
+ {
+ TPtrC ptr = iCntModelField->TextStorage()->Text();
+ if (!ptr.Length())
+ {
+ return ptr;
+ }
+ TInt pos = ptr.Find(KColon);
+ __ASSERT_DEBUG(pos > 0 && pos + 1 < ptr.Length(),
+ VPbkError::Panic(VPbkError::EFieldDataTypeMismatch));
+ return ptr.Mid(++pos);
+ }
+
+TPtrC TContactFieldUriData::Uri() const
+ {
+ return iCntModelField->TextStorage()->Text();
+ }
+
+// aUri: URI as specified in RFC 3986
+// For example:
+// ftp://ftp.is.co.za/rfc/rfc1808.txt
+// ldap://[2001:db8::7]/c=GB?objectClass?one
+// mailto:John.Doe@example.com
+// tel:+1-816-555-1212
+void TContactFieldUriData::SetUriL(const TDesC& aUri)
+ {
+ if (aUri.Length())
+ {
+ // skip th validate if field type is IMPP, because IMPP is not URI,
+ // scheme of URI is taken from sXP service name, which might contains
+ // special characters
+ TFieldType fType = {KUidContactFieldIMPPValue};
+ if (!iCntModelField->ContentType().ContainsFieldType(fType))
+ {
+ if ( !Validate(aUri, ETrue) )
+ {
+ User::Leave(KErrNotSupported);
+ }
+ }
+ else // If it is an IMPP field
+ {
+ TInt pos = aUri.Find(KColon);
+ // If the service name or the colon doesn't exist, let it leave the function.
+ // e.g.:
+ // (1) If the value is YAHOO:peterpan@yahoo.com, YAHOO is the service name
+ // (2) If the value is :peterpan@yahoo.com, the service name is NULL
+ // (3) If the value is peterpan@yahoo.com, neither the service name and the colon exists
+ if( 0 == pos || KErrNotFound == pos )
+ {
+ User::Leave(KErrNotSupported);
+ }
+ }
+ }
+ iCntModelField->TextStorage()->SetTextL(aUri);
+ }
+
+// aScheme: scheme part of URI aText: rest of URI
+// For example:
+// aScheme: aText:
+// ftp //ftp.is.co.za/rfc/rfc1808.txt
+// ldap //[2001:db8::7]/c=GB?objectClass?one
+// mailto John.Doe@example.com
+// tel +1-816-555-1212
+void TContactFieldUriData::SetUriL(const TDesC& aScheme, const TDesC& aText)
+ {
+ if (!aText.Length())
+ {
+ if (aScheme.Length())
+ {
+ User::Leave(KErrCorrupt);
+ }
+ }
+ if (aScheme.Length())
+ {
+ /*
+ skip th validate if field type is IMPP, because IMPP is not URI,
+ scheme of URI is taken from sXP service name, which might contains
+ special characters
+ */
+ TFieldType fType = {KUidContactFieldIMPPValue};
+ if (!iCntModelField->ContentType().ContainsFieldType(fType))
+ {
+ if ( !Validate(aScheme, EFalse))
+ {
+ User::Leave(KErrCorrupt);
+ }
+ }
+ HBufC* buf = HBufC::NewLC(aScheme.Length() + KColon().Length() +
+ aText.Length());
+ TPtr ptr(NULL, 0);
+ ptr.Set(buf->Des());
+ ptr = aScheme;
+ ptr.Append(KColon);
+ ptr.Append(aText);
+ iCntModelField->TextStorage()->SetTextL(*buf);
+ CleanupStack::PopAndDestroy(buf);
+ }
+ else
+ {
+ if (aText.Length())
+ {
+ User::Leave(KErrCorrupt);
+ }
+ iCntModelField->TextStorage()->SetTextL(KNullDesC);
+ }
+ }
+
+TInt TContactFieldUriData::MaxLength() const
+ {
+ return KVPbkUnlimitedFieldLength;
+ }
+
+TBool TContactFieldUriData::Validate(const TDesC& aUri, TBool aFullUri)
+ {
+ if (!((TChar)aUri[0]).IsAlpha())
+ {
+ return EFalse;
+ }
+ for (TInt i = 1; i < aUri.Length(); i++)
+ {
+ TChar chr = aUri[i];
+ if ((chr == ':') && aFullUri)
+ {
+ return ETrue;
+ }
+ if (!chr.IsAlphaDigit() && (chr != '+') && (chr != '-') && (chr != '.'))
+ {
+ return EFalse;
+ }
+ }
+ if (aFullUri)
+ {
+ return EFalse;
+ }
+ return ETrue;
+ }
+
+} // namespace VPbkCntModel
+