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>
36#include <boost/static_assert.hpp>
37#include <boost/type_traits/is_pointer.hpp>
38#include <boost/utility/enable_if.hpp>
117class AKONADI_EXPORT Item :
public Entity
123 typedef QList<Item> List;
128 typedef QByteArray Flag;
133 typedef QSet<QByteArray> Flags;
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);
182 QDateTime modificationTime()
const;
191 void setModificationTime(
const QDateTime &datetime);
197 bool hasFlag(
const QByteArray &name)
const;
202 void setFlag(
const QByteArray &name);
207 void clearFlag(
const QByteArray &name);
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);
246 QByteArray payloadData()
const;
252 QSet<QByteArray> loadedPayloadParts()
const;
271 void setRevision(
int revision);
276 int revision()
const;
286 Entity::Id storageCollectionId()
const;
293 void setSize(qint64 size);
305 void setMimeType(
const QString &mimeType);
310 QString mimeType()
const;
317 void setGid(
const QString &gid);
335 void setVirtualReferences(
const Collection::List &collections);
346 Collection::List virtualReferences()
const;
354 QVector<int> availablePayloadMetaTypeIds()
const;
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;
425 QSet<QByteArray> availablePayloadParts()
const;
436 QSet<QByteArray> cachedPayloadParts()
const;
451 void apply(
const Item &other);
462 template <
typename T>
static void addToLegacyMapping(
const QString &mimeType);
463 void setCachedPayloadParts(
const QSet<QByteArray> &cachedParts);
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)
544T Item::payload()
const
546 BOOST_STATIC_ASSERT(!boost::is_pointer<T>::value);
549 throwPayloadException(-1, -1);
552 return payloadImpl<T>();
556typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic, T>::type
557Item::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>());
570typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic, T>::type
571Item::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);
597typename boost::enable_if<Internal::is_shared_pointer<T>,
bool>::type
598Item::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);
630typename boost::disable_if<Internal::is_shared_pointer<T>,
bool>::type
631Item::tryToClone(T *)
const
633 typedef Internal::PayloadTrait<T> PayloadType;
634 BOOST_STATIC_ASSERT((!PayloadType::isPolymorphic));
640bool Item::hasPayload()
const
642 BOOST_STATIC_ASSERT(!boost::is_pointer<T>::value);
643 return hasPayload() && hasPayloadImpl<T>();
647typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
bool>::type
648Item::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 &) {
666typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
bool>::type
667Item::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);
689void Item::setPayload(
const T &p)
691 BOOST_STATIC_ASSERT((!boost::is_pointer<T>::value));
696typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic>::type
697Item::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);
710typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic>::type
711Item::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(),
721void Item::setPayload(T *p)
723 p->You_MUST_NOT_use_a_pointer_as_payload;
727void Item::setPayload(std::auto_ptr<T> p)
729 p.Nice_try_but_a_std_auto_ptr_is_not_allowed_as_payload_either;
733void 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);
742Q_DECLARE_METATYPE(Akonadi::Item)
743Q_DECLARE_METATYPE(Akonadi::Item::List)
FreeBusyManager::Singleton.