Akonadi::Attribute Class

class Akonadi::Attribute

Provides interface for custom attributes for Entity. More...

Public Functions

virtual ~Attribute()
virtual Akonadi::Attribute *clone() const = 0
virtual void deserialize(const QByteArray &data) = 0
virtual QByteArray serialized() const = 0
virtual QByteArray type() const = 0

Detailed Description

This class is an interface for custom attributes, that can be stored in an entity. Attributes should be meta data, e.g. ACLs, quotas etc. that are not part of the entities' data itself.

Note that attributes are per user, i.e. when an attribute is added to an entity, it only applies to the current user.

To provide custom attributes, you have to subclass from this interface and reimplement the pure virtual methods.

 class SecrecyAttribute : public Akonadi::Attribute
 {
     Q_GADGET

 public:
     enum Secrecy
     {
         Public,
         Private,
         Confidential
     };
     Q_ENUM(Secrecy);

     SecrecyAttribute(Secrecy secrecy = Public)
         : mSecrecy(secrecy)
     {
     }

     void setSecrecy(Secrecy secrecy)
     {
         mSecrecy = secrecy;
     }

     Secrecy secrecy() const
     {
         return mSecrecy;
     }

     virtual QByteArray type() const
     {
         return "secrecy";
     }

     virtual Attribute* clone() const
     {
         return new SecrecyAttribute(mSecrecy);
     }

     virtual QByteArray serialized() const
     {
         switch (mSecrecy) {
         case Public:
             return "public";
         case Private:
             return "private";
         case Confidential:
             return "confidential";
         }
     }

     virtual void deserialize(const QByteArray &data)
     {
         if (data == "public") {
             mSecrecy = Public;
         } else if (data == "private") {
             mSecrecy = Private;
         } else if (data == "confidential") {
             mSecrecy = Confidential;
         }
     }
 }

Additionally, you need to register your attribute with Akonadi::AttributeFactory for automatic deserialization during retrieving of collections or items:

 AttributeFactory::registerAttribute<SecrecyAttribute>();

Third party attributes need to be registered once by each application that uses them. So the above snippet needs to be in the resource that adds the attribute, and each application that uses the resource. This may be simplified in the future.

The custom attributes can be used in the following way:

 Akonadi::Item item(QStringLiteral("text/directory"));
 SecrecyAttribute* attr = item.attribute<SecrecyAttribute>(Item::AddIfMissing);
 attr->setSecrecy(SecrecyAttribute::Confidential);

and

 Akonadi::Item item = ...

 if (item.hasAttribute<SecrecyAttribute>()) {
   SecrecyAttribute *attr = item.attribute<SecrecyAttribute>();

   SecrecyAttribute::Secrecy secrecy = attr->secrecy();
   ...
 }

@author Volker Krause <vkrause@kde.org>

Member Function Documentation

[virtual noexcept] Attribute::~Attribute()

Destroys this attribute.

[pure virtual] Akonadi::Attribute *Attribute::clone() const

Creates a copy of this attribute.

[pure virtual] void Attribute::deserialize(const QByteArray &data)

Sets the data of this attribute, using the same encoding as returned by toByteArray().

data The encoded attribute data.

[pure virtual] QByteArray Attribute::serialized() const

Returns a QByteArray representation of the attribute which will be storaged. This can be raw binary data, no encoding needs to be applied.

[pure virtual] QByteArray Attribute::type() const

Returns the type of the attribute.