phonebookengines/VirtualPhonebook/VPbkCntModel/src/TContactFieldDataImpl.cpp
branchRCL_3
changeset 63 f4a778e096c2
child 64 c1e8ba0c2b16
--- /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
+