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 "itempayloadinternals_p.h"
31 #include <QtCore/QByteArray>
32 #include <QtCore/QMetaType>
33 #include <QtCore/QSet>
35 #include <boost/static_assert.hpp>
36 #include <boost/type_traits/is_pointer.hpp>
37 #include <boost/utility/enable_if.hpp>
116 class AKONADI_EXPORT Item :
public Entity
122 typedef QList<Item> List;
127 typedef QByteArray Flag;
132 typedef QSet<QByteArray> Flags;
138 static const char* FullPayload;
148 explicit Item( Id
id );
155 explicit Item(
const QString &mimeType );
160 Item(
const Item &other );
170 static Item fromUrl(
const KUrl &url );
181 QDateTime modificationTime()
const;
190 void setModificationTime(
const QDateTime &datetime );
196 bool hasFlag(
const QByteArray &name )
const;
201 void setFlag(
const QByteArray &name );
206 void clearFlag(
const QByteArray &name );
211 void setFlags(
const Flags &flags );
218 void setTags(
const Tag::List &list );
220 void setTag(
const Tag & );
222 Tag::List tags()
const;
224 bool hasTag(
const Tag & )
const;
226 void clearTag(
const Tag & );
237 void setPayloadFromData(
const QByteArray &data );
245 QByteArray payloadData()
const;
251 QSet<QByteArray> loadedPayloadParts()
const;
270 void setRevision(
int revision );
275 int revision()
const;
292 void setSize( qint64 size );
304 void setMimeType(
const QString &mimeType );
309 QString mimeType()
const;
316 void setGid(
const QString &gid );
331 QVector<int> availablePayloadMetaTypeIds()
const;
344 template <
typename T>
void setPayload(
const T &p );
346 template <
typename T>
void setPayload( T* p );
347 template <
typename T>
void setPayload( std::auto_ptr<T> p );
363 template <
typename T> T payload()
const;
368 bool hasPayload()
const;
379 template <
typename T>
bool hasPayload()
const;
393 KUrl url( UrlType type = UrlShort )
const;
403 QSet<QByteArray> availablePayloadParts()
const;
414 QSet<QByteArray> cachedPayloadParts()
const;
429 void apply(
const Item &other );
440 template <
typename T>
static void addToLegacyMapping(
const QString & mimeType );
441 void setCachedPayloadParts(
const QSet<QByteArray> &cachedParts);
445 friend class ItemCreateJob;
446 friend class ItemModifyJob;
447 friend class ItemModifyJobPrivate;
448 friend class ItemSync;
449 friend class ProtocolHelper;
450 PayloadBase* payloadBase()
const;
451 void setPayloadBase( PayloadBase* );
452 PayloadBase* payloadBaseV2(
int sharedPointerId,
int metaTypeId )
const;
454 void setPayloadBaseV2(
int sharedPointerId,
int metaTypeId, std::auto_ptr<PayloadBase> p );
455 void addPayloadBaseVariant(
int sharedPointerId,
int metaTypeId, std::auto_ptr<PayloadBase> p )
const;
456 static void addToLegacyMappingImpl(
const QString & mimeType,
int sharedPointerId,
int metaTypeId, std::auto_ptr<PayloadBase> p );
462 bool ensureMetaTypeId(
int mtid )
const;
464 template <
typename T>
465 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
void>::type
466 setPayloadImpl(
const T &,
const int * = 0 );
467 template <
typename T>
468 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
void>::type
469 setPayloadImpl(
const T & );
471 template <
typename T>
472 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,T>::type
473 payloadImpl(
const int * = 0 )
const;
474 template <
typename T>
475 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,T>::type
478 template <
typename T>
479 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
bool>::type
480 hasPayloadImpl(
const int * = 0 )
const;
481 template <
typename T>
482 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
bool>::type
483 hasPayloadImpl()
const;
485 template <
typename T>
486 typename boost::enable_if<Internal::is_shared_pointer<T>,
bool>::type
487 tryToClone( T *,
const int * = 0 )
const;
488 template <
typename T>
489 typename boost::disable_if<Internal::is_shared_pointer<T>,
bool>::type
490 tryToClone( T * )
const;
497 void setStorageCollectionId(
Entity::Id collectionId);
503 QString payloadExceptionText(
int spid,
int mtid )
const;
510 inline void throwPayloadException(
int spid,
int mtid )
const {
511 throw PayloadException( payloadExceptionText( spid, mtid ) );
514 void throwPayloadException(
int spid,
int mtid )
const;
518 AKONADI_DECLARE_PRIVATE( Item )
521 template <
typename T>
522 T Item::payload()
const
524 BOOST_STATIC_ASSERT( !boost::is_pointer<T>::value );
527 throwPayloadException( -1, -1 );
529 return payloadImpl<T>();
532 template <
typename T>
533 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,T>::type
534 Item::payloadImpl(
const int * )
const
536 typedef Internal::PayloadTrait<T> PayloadType;
537 BOOST_STATIC_ASSERT(( PayloadType::isPolymorphic ));
539 typedef typename Internal::get_hierarchy_root<T>::type Root_T;
540 typedef Internal::PayloadTrait<Root_T> RootType;
541 BOOST_STATIC_ASSERT(( !RootType::isPolymorphic ));
543 return PayloadType::castFrom( payloadImpl<Root_T>() );
546 template <
typename T>
547 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,T>::type
548 Item::payloadImpl()
const
550 typedef Internal::PayloadTrait<T> PayloadType;
551 BOOST_STATIC_ASSERT(( !PayloadType::isPolymorphic ));
553 const int metaTypeId = PayloadType::elementMetaTypeId();
556 if ( !ensureMetaTypeId( metaTypeId ) )
557 throwPayloadException( PayloadType::sharedPointerId, metaTypeId );
561 if (
const Payload<T> *
const p = Internal::payload_cast<T>( payloadBaseV2( PayloadType::sharedPointerId, metaTypeId ) ) )
565 if ( !tryToClone<T>( &ret ) )
566 throwPayloadException( PayloadType::sharedPointerId, metaTypeId );
570 template <
typename T>
571 typename boost::enable_if<Internal::is_shared_pointer<T>,
bool>::type
572 Item::tryToClone( T * ret,
const int * )
const
574 typedef Internal::PayloadTrait<T> PayloadType;
575 BOOST_STATIC_ASSERT(( !PayloadType::isPolymorphic ));
577 const int metaTypeId = PayloadType::elementMetaTypeId();
582 typedef typename Internal::shared_pointer_traits<T>::next_shared_ptr NewT;
583 typedef Internal::PayloadTrait<NewT> NewPayloadType;
585 if (
const Payload<NewT> *
const p = Internal::payload_cast<NewT>( payloadBaseV2( NewPayloadType::sharedPointerId, metaTypeId ) ) ) {
587 const T nt = PayloadType::clone( p->payload );
588 if ( !PayloadType::isNull( nt ) ) {
590 std::auto_ptr<PayloadBase> npb(
new Payload<T>( nt ) );
591 addPayloadBaseVariant( PayloadType::sharedPointerId, metaTypeId, npb );
603 template <
typename T>
604 typename boost::disable_if<Internal::is_shared_pointer<T>,
bool>::type
605 Item::tryToClone( T * )
const
607 typedef Internal::PayloadTrait<T> PayloadType;
608 BOOST_STATIC_ASSERT(( !PayloadType::isPolymorphic ));
613 template <
typename T>
614 bool Item::hasPayload()
const
616 BOOST_STATIC_ASSERT( !boost::is_pointer<T>::value );
617 return hasPayload() && hasPayloadImpl<T>();
620 template <
typename T>
621 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
bool>::type
622 Item::hasPayloadImpl(
const int * )
const
624 typedef Internal::PayloadTrait<T> PayloadType;
625 BOOST_STATIC_ASSERT(( PayloadType::isPolymorphic ));
627 typedef typename Internal::get_hierarchy_root<T>::type Root_T;
628 typedef Internal::PayloadTrait<Root_T> RootType;
629 BOOST_STATIC_ASSERT(( !RootType::isPolymorphic ));
632 return hasPayloadImpl<Root_T>()
633 && PayloadType::canCastFrom( payload<Root_T>() );
634 }
catch (
const Akonadi::PayloadException & ) {
639 template <
typename T>
640 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
bool>::type
641 Item::hasPayloadImpl()
const
643 typedef Internal::PayloadTrait<T> PayloadType;
644 BOOST_STATIC_ASSERT(( !PayloadType::isPolymorphic ));
646 const int metaTypeId = PayloadType::elementMetaTypeId();
649 if ( !ensureMetaTypeId( metaTypeId ) )
654 if (
const Payload<T> *
const p = Internal::payload_cast<T>( payloadBaseV2( PayloadType::sharedPointerId, metaTypeId ) ) )
657 return tryToClone<T>( 0 );
660 template <
typename T>
661 void Item::setPayload(
const T &p )
663 BOOST_STATIC_ASSERT(( !boost::is_pointer<T>::value ));
667 template <
typename T>
668 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic>::type
669 Item::setPayloadImpl(
const T & p,
const int * )
671 typedef Internal::PayloadTrait<T> PayloadType;
672 BOOST_STATIC_ASSERT(( PayloadType::isPolymorphic ));
674 typedef typename Internal::get_hierarchy_root<T>::type Root_T;
675 typedef Internal::PayloadTrait<Root_T> RootType;
676 BOOST_STATIC_ASSERT(( !RootType::isPolymorphic ));
678 setPayloadImpl<Root_T>( p );
681 template <
typename T>
682 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic>::type
683 Item::setPayloadImpl(
const T & p )
685 typedef Internal::PayloadTrait<T> PayloadType;
686 std::auto_ptr<PayloadBase> pb(
new Payload<T>( p ) );
687 setPayloadBaseV2( PayloadType::sharedPointerId,
688 PayloadType::elementMetaTypeId(),
692 template <
typename T>
693 void Item::setPayload( T* p )
695 p->You_MUST_NOT_use_a_pointer_as_payload;
698 template <
typename T>
699 void Item::setPayload( std::auto_ptr<T> p )
701 p.Nice_try_but_a_std_auto_ptr_is_not_allowed_as_payload_either;
704 template <
typename T>
705 void Item::addToLegacyMapping(
const QString & mimeType ) {
706 typedef Internal::PayloadTrait<T> PayloadType;
707 BOOST_STATIC_ASSERT(( !PayloadType::isPolymorphic ));
708 std::auto_ptr<PayloadBase> p(
new Payload<T> );
709 addToLegacyMappingImpl( mimeType, PayloadType::sharedPointerId, PayloadType::elementMetaTypeId(), p );
714 Q_DECLARE_METATYPE(Akonadi::Item)
715 Q_DECLARE_METATYPE(Akonadi::Item::List)
qint64 Id
Describes the unique id type.