Added parent reference in ContactField for private events notification 18/58618/4
authorEugene Kurzberg <i.kurtsberg@samsung.com>
Wed, 3 Feb 2016 13:51:53 +0000 (15:51 +0200)
committerEugene Kurzberg <i.kurtsberg@samsung.com>
Thu, 4 Feb 2016 10:00:14 +0000 (12:00 +0200)
instead of occupying public callback.

Change-Id: I2a54f533ca40626d4b861a52044190a9814a3050
Signed-off-by: Eugene Kurzberg <i.kurtsberg@samsung.com>
lib-contact/inc/Contacts/Model/ContactField.h
lib-contact/inc/Contacts/Model/ContactFieldContainer.h
lib-contact/inc/Contacts/Model/ContactFieldFactory.h
lib-contact/src/Contacts/Model/Contact.cpp
lib-contact/src/Contacts/Model/ContactField.cpp
lib-contact/src/Contacts/Model/ContactFieldContainer.cpp
lib-contact/src/Contacts/Model/ContactFieldFactory.cpp
lib-contact/src/Contacts/Model/ContactTextField.cpp
lib-contact/src/Contacts/Model/ContactTypedObject.cpp

index 2fb460d5499c7f4780aabfb8ba3bf505f2664f65..9a1c96763d911df95d7232e441d49b9d020b0fe4 100644 (file)
@@ -31,6 +31,7 @@ namespace Contacts
        namespace Model
        {
                class ContactFieldMetadata;
+               class ContactFieldContainer;
 
                /**
                 * @brief Polymorphic adapter for contacts_record_h property.
@@ -48,9 +49,11 @@ namespace Contacts
 
                        /**
                         * @brief Create contact field.
+                        * @param[in]   parent      Parent field container
                         * @param[in]   metadata    Field metadata
                         */
-                       ContactField(const ContactFieldMetadata &metadata);
+                       ContactField(ContactFieldContainer *parent,
+                                       const ContactFieldMetadata &metadata);
                        virtual ~ContactField() { }
 
                        /**
@@ -136,6 +139,11 @@ namespace Contacts
                         */
                        unsigned getPropertyId() const;
 
+                       /**
+                        * @return Parent container.
+                        */
+                       ContactFieldContainer *getParent() const;
+
                protected:
                        /**
                         * @return Field metadata.
@@ -157,6 +165,7 @@ namespace Contacts
                private:
                        contacts_record_h m_Record;
                        const ContactFieldMetadata &m_Metadata;
+                       ContactFieldContainer *m_Parent;
                        FillCallback m_OnFilled;
                };
 
index d9d9b16b9c68d2496e1ee5c2459d93c56435ddff..321dc5cdc93216c3d30e3b66d33a6d6cff90f574 100644 (file)
@@ -81,7 +81,8 @@ namespace Contacts
                        void removeField(ContactField &field);
 
                private:
-                       void onChildFilled(bool isChildFilled);
+                       friend ContactField;
+                       void onChildFilled(ContactField &field, bool isChildFilled);
 
                        ContactFields m_Fields;
                        size_t m_FilledCount = 0;
index c178d8e0f6a09445cce4c866fb5a8bd93f510e95..a167ea5bc85d4477a815c9063f87625988a2e295 100644 (file)
@@ -32,10 +32,12 @@ namespace Contacts
                public:
                        /**
                         * @brief Create record property adaptor.
+                        * @param[in]   parent      Parent field container
                         * @param[in]   metadata    Adaptor field metadata
                         * @return Adaptor field.
                         */
-                       static ContactFieldPtr createField(const ContactFieldMetadata &metadata);
+                       static ContactFieldPtr createField(ContactFieldContainer *parent,
+                                       const ContactFieldMetadata &metadata);
                };
        }
 }
index 2bda2a3c2dd6f404d73406e0cdf9bfad490c0eae..96531cdbcb50e7b2edf34e0d394da9cf73aa8e20 100644 (file)
@@ -21,7 +21,7 @@
 using namespace Contacts::Model;
 
 Contact::Contact(ContactObjectType type)
-       : ContactObject(*getContactMetadata(type)), m_IsNew(true)
+       : ContactObject(nullptr, *getContactMetadata(type)), m_IsNew(true)
 {
 }
 
index ac01830fae99aed81b59145328c7bbb19e9c5efb..154d475881e90d10fac3d632e86015ccb3eb479a 100644 (file)
@@ -26,8 +26,9 @@
 
 using namespace Contacts::Model;
 
-ContactField::ContactField(const ContactFieldMetadata &metadata)
-       : m_Record(nullptr), m_Metadata(metadata)
+ContactField::ContactField(ContactFieldContainer *parent,
+               const ContactFieldMetadata &metadata)
+       : m_Record(nullptr), m_Metadata(metadata), m_Parent(parent)
 {
 }
 
@@ -102,6 +103,11 @@ unsigned ContactField::getPropertyId() const
        return m_Metadata.propId;
 }
 
+ContactFieldContainer *ContactField::getParent() const
+{
+       return m_Parent;
+}
+
 const ContactFieldMetadata &ContactField::getMetadata() const
 {
        return m_Metadata;
@@ -112,4 +118,8 @@ void ContactField::onFilled(bool isFilled)
        if (m_OnFilled) {
                m_OnFilled(isFilled);
        }
+
+       if (m_Parent) {
+               m_Parent->onChildFilled(*this, isFilled);
+       }
 }
index 5dabf8b875cceba361a47b4b451fea32e4af4a5e..f3341b09ea5a3152fba1cdf80b4b59485f4b95b1 100644 (file)
@@ -17,7 +17,6 @@
 
 #include "Contacts/Model/ContactFieldContainer.h"
 #include "Contacts/Model/ContactFieldFactory.h"
-
 #include <algorithm>
 
 using namespace Contacts::Model;
@@ -75,18 +74,9 @@ size_t ContactFieldContainer::getFieldCount() const
 ContactField &ContactFieldContainer::addField(contacts_record_h record,
                const ContactFieldMetadata &metadata)
 {
-       ContactFieldPtr field = ContactFieldFactory::createField(metadata);
+       ContactFieldPtr field = ContactFieldFactory::createField(this, metadata);
        field->initialize(record);
 
-       if (field->isRequired()) {
-               if (field->isFilled()) {
-                       onChildFilled(true);
-               }
-
-               field->setFillCallback(std::bind(&ContactFieldContainer::onChildFilled,
-                               this, std::placeholders::_1));
-       }
-
        m_Fields.push_back(std::move(field));
        return *m_Fields.back();
 }
@@ -97,15 +87,19 @@ void ContactFieldContainer::removeField(ContactField &field)
                return ptr.get() == &field;
        };
 
-       if (field.isRequired() && field.isFilled()) {
-               onChildFilled(false);
+       if (field.isFilled()) {
+               onChildFilled(field, false);
        }
 
        m_Fields.erase(std::remove_if(m_Fields.begin(), m_Fields.end(), comp), m_Fields.end());
 }
 
-void ContactFieldContainer::onChildFilled(bool isChildFilled)
+void ContactFieldContainer::onChildFilled(ContactField &field, bool isChildFilled)
 {
+       if (!field.isRequired()) {
+               return;
+       }
+
        /* Equals zero if no fields were PREVIOUSLY filled or no fields are NOW filled */
        size_t checkCount = isChildFilled ? m_FilledCount++ : --m_FilledCount;
 
index e2a8c7a0873c6972af968ad6d314f5cedc79d9d0..d47a056502f8cd4520b03347fc5e708967144047 100644 (file)
 
 using namespace Contacts::Model;
 
-ContactFieldPtr ContactFieldFactory::createField(const ContactFieldMetadata &metadata)
+ContactFieldPtr ContactFieldFactory::createField(ContactFieldContainer *parent,
+               const ContactFieldMetadata &metadata)
 {
        ContactField *field = nullptr;
        switch(metadata.typeMetadata->type) {
                case TypeBool:
-                       field = new ContactBoolField(metadata); break;
+                       field = new ContactBoolField(parent, metadata); break;
                case TypeEnum:
-                       field = new ContactEnumField(metadata); break;
+                       field = new ContactEnumField(parent, metadata); break;
                case TypeText:
-                       field = new ContactTextField(metadata); break;
+                       field = new ContactTextField(parent, metadata); break;
                case TypeDate:
-                       field = new ContactDateField(metadata); break;
+                       field = new ContactDateField(parent, metadata); break;
                case TypeArray:
-                       field = new ContactArray(metadata); break;
+                       field = new ContactArray(parent, metadata); break;
                case TypeObject:
                {
                        unsigned subType = metadata.typeMetadata->subType;
                        if (subType & ObjectTyped) {
-                               field = new ContactTypedObject(metadata);
+                               field = new ContactTypedObject(parent, metadata);
                        } else if (subType & ObjectCompound) {
                                switch (metadata.id) {
                                        case FieldName:
-                                               field = new ContactName(metadata);
+                                               field = new ContactName(parent, metadata);
                                                break;
                                        case FieldPhoneticName:
-                                               field = new ContactPhoneticName(metadata);
+                                               field = new ContactPhoneticName(parent, metadata);
                                                break;
                                }
                        } else {
-                               field = new ContactObject(metadata);
+                               field = new ContactObject(parent, metadata);
                        }
                }
                        break;
index 9c853d97354a10479ee3787cf8c39cfadbd7676f..df6ae3b89f05a4cd60c509602cde20620650c7c9 100644 (file)
@@ -70,4 +70,7 @@ void ContactTextField::onInitialize(contacts_record_h record)
        if (value) {
                m_InitialValue = value;
        }
+       if (!m_InitialValue.empty()) {
+               onFilled(true);
+       }
 }
index c233e208e8b8627df90eaef34b3fe8e5b5bf4059..bd249382e7a54b2415adf492117d782b2e696697 100644 (file)
@@ -65,8 +65,8 @@ const ContactTypedObjectMetadata &ContactTypedObject::getTypedObjectMetadata() c
 void ContactTypedObject::onInitialize(contacts_record_h record)
 {
        ContactObject::onInitialize(record);
-       m_TypeField = ContactFieldFactory::createField(getTypedObjectMetadata().typeField);
-       m_LabelField = ContactFieldFactory::createField(getTypedObjectMetadata().labelField);
+       m_TypeField = ContactFieldFactory::createField(this, getTypedObjectMetadata().typeField);
+       m_LabelField = ContactFieldFactory::createField(this, getTypedObjectMetadata().labelField);
 
        m_TypeField->initialize(record);
        m_LabelField->initialize(record);