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 "itempayloadinternals_p.h"
30 #include <QtCore/QByteArray>
31 #include <QtCore/QMetaType>
32 #include <QtCore/QSet>
34 #include <boost/static_assert.hpp>
35 #include <boost/type_traits/is_pointer.hpp>
36 #include <boost/utility/enable_if.hpp>
115 class AKONADI_EXPORT Item :
public Entity
121 typedef QList<Item> List;
126 typedef QByteArray Flag;
131 typedef QSet<QByteArray> Flags;
137 static const char* FullPayload;
147 explicit Item( Id
id );
154 explicit Item(
const QString &mimeType );
159 Item(
const Item &other );
169 static Item fromUrl(
const KUrl &url );
180 QDateTime modificationTime()
const;
189 void setModificationTime(
const QDateTime &datetime );
195 bool hasFlag(
const QByteArray &name )
const;
200 void setFlag(
const QByteArray &name );
205 void clearFlag(
const QByteArray &name );
210 void setFlags(
const Flags &flags );
224 void setPayloadFromData(
const QByteArray &data );
232 QByteArray payloadData()
const;
238 QSet<QByteArray> loadedPayloadParts()
const;
257 void setRevision(
int revision );
262 int revision()
const;
279 void setSize( qint64 size );
291 void setMimeType(
const QString &mimeType );
296 QString mimeType()
const;
304 QVector<int> availablePayloadMetaTypeIds()
const;
317 template <
typename T>
void setPayload(
const T &p );
319 template <
typename T>
void setPayload( T* p );
320 template <
typename T>
void setPayload( std::auto_ptr<T> p );
336 template <
typename T> T payload()
const;
341 bool hasPayload()
const;
352 template <
typename T>
bool hasPayload()
const;
366 KUrl url( UrlType type = UrlShort )
const;
376 QSet<QByteArray> availablePayloadParts()
const;
387 QSet<QByteArray> cachedPayloadParts()
const;
402 void apply(
const Item &other );
413 template <
typename T>
static void addToLegacyMapping(
const QString & mimeType );
414 void setCachedPayloadParts(
const QSet<QByteArray> &cachedParts);
418 friend class ItemCreateJob;
419 friend class ItemModifyJob;
420 friend class ItemModifyJobPrivate;
421 friend class ItemSync;
422 friend class ProtocolHelper;
423 PayloadBase* payloadBase()
const;
424 void setPayloadBase( PayloadBase* );
425 PayloadBase* payloadBaseV2(
int sharedPointerId,
int metaTypeId )
const;
427 void setPayloadBaseV2(
int sharedPointerId,
int metaTypeId, std::auto_ptr<PayloadBase> p );
428 void addPayloadBaseVariant(
int sharedPointerId,
int metaTypeId, std::auto_ptr<PayloadBase> p )
const;
429 static void addToLegacyMappingImpl(
const QString & mimeType,
int sharedPointerId,
int metaTypeId, std::auto_ptr<PayloadBase> p );
435 bool ensureMetaTypeId(
int mtid )
const;
437 template <
typename T>
438 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
void>::type
439 setPayloadImpl(
const T &,
const int * = 0 );
440 template <
typename T>
441 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
void>::type
442 setPayloadImpl(
const T & );
444 template <
typename T>
445 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,T>::type
446 payloadImpl(
const int * = 0 )
const;
447 template <
typename T>
448 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,T>::type
451 template <
typename T>
452 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
bool>::type
453 hasPayloadImpl(
const int * = 0 )
const;
454 template <
typename T>
455 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
bool>::type
456 hasPayloadImpl()
const;
458 template <
typename T>
459 typename boost::enable_if<Internal::is_shared_pointer<T>,
bool>::type
460 tryToClone( T *,
const int * = 0 )
const;
461 template <
typename T>
462 typename boost::disable_if<Internal::is_shared_pointer<T>,
bool>::type
463 tryToClone( T * )
const;
470 void setStorageCollectionId(
Entity::Id collectionId);
476 QString payloadExceptionText(
int spid,
int mtid )
const;
483 inline void throwPayloadException(
int spid,
int mtid )
const {
484 throw PayloadException( payloadExceptionText( spid, mtid ) );
487 void throwPayloadException(
int spid,
int mtid )
const;
491 AKONADI_DECLARE_PRIVATE( Item )
495 template <
typename T>
496 T Item::payload()
const
498 BOOST_STATIC_ASSERT( !boost::is_pointer<T>::value );
501 throwPayloadException( -1, -1 );
503 return payloadImpl<T>();
506 template <
typename T>
507 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,T>::type
508 Item::payloadImpl(
const int * )
const
510 typedef Internal::PayloadTrait<T> PayloadType;
511 BOOST_STATIC_ASSERT(( PayloadType::isPolymorphic ));
513 typedef typename Internal::get_hierarchy_root<T>::type Root_T;
514 typedef Internal::PayloadTrait<Root_T> RootType;
515 BOOST_STATIC_ASSERT(( !RootType::isPolymorphic ));
517 return PayloadType::castFrom( payloadImpl<Root_T>() );
520 template <
typename T>
521 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,T>::type
522 Item::payloadImpl()
const
524 typedef Internal::PayloadTrait<T> PayloadType;
525 BOOST_STATIC_ASSERT(( !PayloadType::isPolymorphic ));
527 const int metaTypeId = PayloadType::elementMetaTypeId();
530 if ( !ensureMetaTypeId( metaTypeId ) )
531 throwPayloadException( PayloadType::sharedPointerId, metaTypeId );
535 if (
const Payload<T> *
const p = Internal::payload_cast<T>( payloadBaseV2( PayloadType::sharedPointerId, metaTypeId ) ) )
539 if ( !tryToClone<T>( &ret ) )
540 throwPayloadException( PayloadType::sharedPointerId, metaTypeId );
544 template <
typename T>
545 typename boost::enable_if<Internal::is_shared_pointer<T>,
bool>::type
546 Item::tryToClone( T * ret,
const int * )
const
548 typedef Internal::PayloadTrait<T> PayloadType;
549 BOOST_STATIC_ASSERT(( !PayloadType::isPolymorphic ));
551 const int metaTypeId = PayloadType::elementMetaTypeId();
556 typedef typename Internal::shared_pointer_traits<T>::next_shared_ptr NewT;
557 typedef Internal::PayloadTrait<NewT> NewPayloadType;
559 if (
const Payload<NewT> *
const p = Internal::payload_cast<NewT>( payloadBaseV2( NewPayloadType::sharedPointerId, metaTypeId ) ) ) {
561 const T nt = PayloadType::clone( p->payload );
562 if ( !PayloadType::isNull( nt ) ) {
564 std::auto_ptr<PayloadBase> npb(
new Payload<T>( nt ) );
565 addPayloadBaseVariant( PayloadType::sharedPointerId, metaTypeId, npb );
567 if ( ret ) *ret = nt;
575 template <
typename T>
576 typename boost::disable_if<Internal::is_shared_pointer<T>,
bool>::type
577 Item::tryToClone( T * )
const
579 typedef Internal::PayloadTrait<T> PayloadType;
580 BOOST_STATIC_ASSERT(( !PayloadType::isPolymorphic ));
585 template <
typename T>
586 bool Item::hasPayload()
const
588 BOOST_STATIC_ASSERT( !boost::is_pointer<T>::value );
589 return hasPayload() && hasPayloadImpl<T>();
592 template <
typename T>
593 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
bool>::type
594 Item::hasPayloadImpl(
const int * )
const
596 typedef Internal::PayloadTrait<T> PayloadType;
597 BOOST_STATIC_ASSERT(( PayloadType::isPolymorphic ));
599 typedef typename Internal::get_hierarchy_root<T>::type Root_T;
600 typedef Internal::PayloadTrait<Root_T> RootType;
601 BOOST_STATIC_ASSERT(( !RootType::isPolymorphic ));
604 return hasPayloadImpl<Root_T>()
605 && PayloadType::canCastFrom( payload<Root_T>() );
606 }
catch (
const Akonadi::PayloadException & ) {
611 template <
typename T>
612 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
bool>::type
613 Item::hasPayloadImpl()
const
615 typedef Internal::PayloadTrait<T> PayloadType;
616 BOOST_STATIC_ASSERT(( !PayloadType::isPolymorphic ));
618 const int metaTypeId = PayloadType::elementMetaTypeId();
621 if ( !ensureMetaTypeId( metaTypeId ) )
626 if (
const Payload<T> *
const p = Internal::payload_cast<T>( payloadBaseV2( PayloadType::sharedPointerId, metaTypeId ) ) )
629 return tryToClone<T>( 0 );
632 template <
typename T>
633 void Item::setPayload(
const T &p )
635 BOOST_STATIC_ASSERT(( !boost::is_pointer<T>::value ));
639 template <
typename T>
640 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic>::type
641 Item::setPayloadImpl(
const T & p,
const int * )
643 typedef Internal::PayloadTrait<T> PayloadType;
644 BOOST_STATIC_ASSERT(( PayloadType::isPolymorphic ));
646 typedef typename Internal::get_hierarchy_root<T>::type Root_T;
647 typedef Internal::PayloadTrait<Root_T> RootType;
648 BOOST_STATIC_ASSERT(( !RootType::isPolymorphic ));
650 setPayloadImpl<Root_T>( p );
653 template <
typename T>
654 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic>::type
655 Item::setPayloadImpl(
const T & p )
657 typedef Internal::PayloadTrait<T> PayloadType;
658 std::auto_ptr<PayloadBase> pb(
new Payload<T>( p ) );
659 setPayloadBaseV2( PayloadType::sharedPointerId,
660 PayloadType::elementMetaTypeId(),
664 template <
typename T>
665 void Item::setPayload( T* p )
667 p->You_MUST_NOT_use_a_pointer_as_payload;
670 template <
typename T>
671 void Item::setPayload( std::auto_ptr<T> p )
673 p.Nice_try_but_a_std_auto_ptr_is_not_allowed_as_payload_either;
676 template <
typename T>
677 void Item::addToLegacyMapping(
const QString & mimeType ) {
678 typedef Internal::PayloadTrait<T> PayloadType;
679 BOOST_STATIC_ASSERT(( !PayloadType::isPolymorphic ));
680 std::auto_ptr<PayloadBase> p(
new Payload<T> );
681 addToLegacyMappingImpl( mimeType, PayloadType::sharedPointerId, PayloadType::elementMetaTypeId(), p );
686 Q_DECLARE_METATYPE(Akonadi::Item)
687 Q_DECLARE_METATYPE(Akonadi::Item::List)
qint64 Id
Describes the unique id type.