21 #ifndef AKONADI_ITEM_H
22 #define AKONADI_ITEM_H
24 #include "akonadi_export.h"
26 #include <akonadi/entity.h>
27 #include <akonadi/exception.h>
28 #include <akonadi/tag.h>
29 #include <akonadi/collection.h>
30 #include "itempayloadinternals_p.h"
32 #include <QtCore/QByteArray>
33 #include <QtCore/QMetaType>
34 #include <QtCore/QSet>
36 #include <boost/static_assert.hpp>
37 #include <boost/type_traits/is_pointer.hpp>
38 #include <boost/utility/enable_if.hpp>
117 class AKONADI_EXPORT Item :
public Entity
139 static const char *FullPayload;
149 explicit Item(Id
id);
156 explicit Item(
const QString &mimeType);
161 Item(
const Item &other);
171 static Item fromUrl(
const KUrl &url);
191 void setModificationTime(
const QDateTime &datetime);
212 void setFlags(
const Flags &flags);
219 void setTags(
const Tag::List &list);
221 void setTag(
const Tag &tag);
223 Tag::List tags()
const;
225 bool hasTag(
const Tag &tag)
const;
227 void clearTag(
const Tag &tag);
238 void setPayloadFromData(
const QByteArray &data);
271 void setRevision(
int revision);
276 int revision()
const;
293 void setSize(qint64 size);
305 void setMimeType(
const QString &mimeType);
317 void setGid(
const QString &gid);
367 template <
typename T>
void setPayload(
const T &p);
369 template <
typename T>
void setPayload(T *p);
370 template <
typename T>
void setPayload(std::auto_ptr<T> p);
386 template <
typename T> T payload()
const;
391 bool hasPayload()
const;
402 template <
typename T>
bool hasPayload()
const;
415 KUrl url(UrlType type = UrlShort)
const;
451 void apply(
const Item &other);
462 template <
typename T>
static void addToLegacyMapping(
const QString &mimeType);
467 friend class ItemCreateJob;
468 friend class ItemModifyJob;
469 friend class ItemModifyJobPrivate;
470 friend class ItemSync;
471 friend class ProtocolHelper;
472 PayloadBase *payloadBase()
const;
473 void setPayloadBase(PayloadBase *p);
474 PayloadBase *payloadBaseV2(
int sharedPointerId,
int metaTypeId)
const;
476 void setPayloadBaseV2(
int sharedPointerId,
int metaTypeId, std::auto_ptr<PayloadBase> p);
477 void addPayloadBaseVariant(
int sharedPointerId,
int metaTypeId, std::auto_ptr<PayloadBase> p)
const;
478 static void addToLegacyMappingImpl(
const QString &mimeType,
int sharedPointerId,
int metaTypeId, std::auto_ptr<PayloadBase> p);
484 bool ensureMetaTypeId(
int mtid)
const;
486 template <
typename T>
487 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
void>::type
488 setPayloadImpl(
const T &p,
const int * = 0);
489 template <
typename T>
490 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
void>::type
491 setPayloadImpl(
const T &p);
493 template <
typename T>
494 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic, T>::type
495 payloadImpl(
const int * = 0)
const;
496 template <
typename T>
497 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic, T>::type
500 template <
typename T>
501 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
bool>::type
502 hasPayloadImpl(
const int * = 0)
const;
503 template <
typename T>
504 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
bool>::type
505 hasPayloadImpl()
const;
507 template <
typename T>
508 typename boost::enable_if<Internal::is_shared_pointer<T>,
bool>::type
509 tryToClone(T *ret,
const int * = 0)
const;
510 template <
typename T>
511 typename boost::disable_if<Internal::is_shared_pointer<T>,
bool>::type
512 tryToClone(T *)
const;
519 void setStorageCollectionId(
Entity::Id collectionId);
525 QString payloadExceptionText(
int spid,
int mtid)
const;
532 inline void throwPayloadException(
int spid,
int mtid)
const {
533 throw PayloadException(payloadExceptionText(spid, mtid));
536 void throwPayloadException(
int spid,
int mtid)
const;
540 AKONADI_DECLARE_PRIVATE(Item)
543 template <
typename T>
544 T Item::payload()
const
546 BOOST_STATIC_ASSERT(!boost::is_pointer<T>::value);
549 throwPayloadException(-1, -1);
552 return payloadImpl<T>();
555 template <
typename T>
556 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic, T>::type
557 Item::payloadImpl(
const int *)
const
559 typedef Internal::PayloadTrait<T> PayloadType;
560 BOOST_STATIC_ASSERT((PayloadType::isPolymorphic));
562 typedef typename Internal::get_hierarchy_root<T>::type Root_T;
563 typedef Internal::PayloadTrait<Root_T> RootType;
564 BOOST_STATIC_ASSERT((!RootType::isPolymorphic));
566 return PayloadType::castFrom(payloadImpl<Root_T>());
569 template <
typename T>
570 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic, T>::type
571 Item::payloadImpl()
const
573 typedef Internal::PayloadTrait<T> PayloadType;
574 BOOST_STATIC_ASSERT((!PayloadType::isPolymorphic));
576 const int metaTypeId = PayloadType::elementMetaTypeId();
579 if (!ensureMetaTypeId(metaTypeId)) {
580 throwPayloadException(PayloadType::sharedPointerId, metaTypeId);
585 if (
const Payload<T> *
const p = Internal::payload_cast<T>(payloadBaseV2(PayloadType::sharedPointerId, metaTypeId))) {
590 if (!tryToClone<T>(&ret)) {
591 throwPayloadException(PayloadType::sharedPointerId, metaTypeId);
596 template <
typename T>
597 typename boost::enable_if<Internal::is_shared_pointer<T>,
bool>::type
598 Item::tryToClone(T *ret,
const int *)
const
600 typedef Internal::PayloadTrait<T> PayloadType;
601 BOOST_STATIC_ASSERT((!PayloadType::isPolymorphic));
603 const int metaTypeId = PayloadType::elementMetaTypeId();
608 typedef typename Internal::shared_pointer_traits<T>::next_shared_ptr NewT;
609 typedef Internal::PayloadTrait<NewT> NewPayloadType;
611 if (
const Payload<NewT> *
const p = Internal::payload_cast<NewT>(payloadBaseV2(NewPayloadType::sharedPointerId, metaTypeId))) {
613 const T nt = PayloadType::clone(p->payload);
614 if (!PayloadType::isNull(nt)) {
616 std::auto_ptr<PayloadBase> npb(
new Payload<T>(nt));
617 addPayloadBaseVariant(PayloadType::sharedPointerId, metaTypeId, npb);
629 template <
typename T>
630 typename boost::disable_if<Internal::is_shared_pointer<T>,
bool>::type
631 Item::tryToClone(T *)
const
633 typedef Internal::PayloadTrait<T> PayloadType;
634 BOOST_STATIC_ASSERT((!PayloadType::isPolymorphic));
639 template <
typename T>
640 bool Item::hasPayload()
const
642 BOOST_STATIC_ASSERT(!boost::is_pointer<T>::value);
643 return hasPayload() && hasPayloadImpl<T>();
646 template <
typename T>
647 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
bool>::type
648 Item::hasPayloadImpl(
const int *)
const
650 typedef Internal::PayloadTrait<T> PayloadType;
651 BOOST_STATIC_ASSERT((PayloadType::isPolymorphic));
653 typedef typename Internal::get_hierarchy_root<T>::type Root_T;
654 typedef Internal::PayloadTrait<Root_T> RootType;
655 BOOST_STATIC_ASSERT((!RootType::isPolymorphic));
658 return hasPayloadImpl<Root_T>()
659 && PayloadType::canCastFrom(payload<Root_T>());
660 }
catch (
const Akonadi::PayloadException &) {
665 template <
typename T>
666 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
bool>::type
667 Item::hasPayloadImpl()
const
669 typedef Internal::PayloadTrait<T> PayloadType;
670 BOOST_STATIC_ASSERT((!PayloadType::isPolymorphic));
672 const int metaTypeId = PayloadType::elementMetaTypeId();
675 if (!ensureMetaTypeId(metaTypeId)) {
681 if (
const Payload<T> *
const p = Internal::payload_cast<T>(payloadBaseV2(PayloadType::sharedPointerId, metaTypeId))) {
685 return tryToClone<T>(0);
688 template <
typename T>
689 void Item::setPayload(
const T &p)
691 BOOST_STATIC_ASSERT((!boost::is_pointer<T>::value));
695 template <
typename T>
696 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic>::type
697 Item::setPayloadImpl(
const T &p,
const int *)
699 typedef Internal::PayloadTrait<T> PayloadType;
700 BOOST_STATIC_ASSERT((PayloadType::isPolymorphic));
702 typedef typename Internal::get_hierarchy_root<T>::type Root_T;
703 typedef Internal::PayloadTrait<Root_T> RootType;
704 BOOST_STATIC_ASSERT((!RootType::isPolymorphic));
706 setPayloadImpl<Root_T>(p);
709 template <
typename T>
710 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic>::type
711 Item::setPayloadImpl(
const T &p)
713 typedef Internal::PayloadTrait<T> PayloadType;
714 std::auto_ptr<PayloadBase> pb(
new Payload<T>(p));
715 setPayloadBaseV2(PayloadType::sharedPointerId,
716 PayloadType::elementMetaTypeId(),
720 template <
typename T>
721 void Item::setPayload(T *p)
723 p->You_MUST_NOT_use_a_pointer_as_payload;
726 template <
typename T>
727 void Item::setPayload(std::auto_ptr<T> p)
729 p.Nice_try_but_a_std_auto_ptr_is_not_allowed_as_payload_either;
732 template <
typename T>
733 void Item::addToLegacyMapping(
const QString &mimeType) {
734 typedef Internal::PayloadTrait<T> PayloadType;
735 BOOST_STATIC_ASSERT((!PayloadType::isPolymorphic));
736 std::auto_ptr<PayloadBase> p(
new Payload<T>);
737 addToLegacyMappingImpl(mimeType, PayloadType::sharedPointerId, PayloadType::elementMetaTypeId(), p);
742 Q_DECLARE_METATYPE(Akonadi::Item)
743 Q_DECLARE_METATYPE(Akonadi::Item::List)
qint64 Id
Describes the unique id type.
QList< Collection > List
Describes a list of collections.