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>
154 explicit Item(
const QString &mimeType );
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;
391 void apply(
const Item &other );
402 template <
typename T>
static void addToLegacyMapping(
const QString & mimeType );
410 PayloadBase* payloadBase()
const;
411 void setPayloadBase( PayloadBase* );
412 PayloadBase* payloadBaseV2(
int sharedPointerId,
int metaTypeId )
const;
414 void setPayloadBaseV2(
int sharedPointerId,
int metaTypeId, std::auto_ptr<PayloadBase> p );
415 void addPayloadBaseVariant(
int sharedPointerId,
int metaTypeId, std::auto_ptr<PayloadBase> p )
const;
416 static void addToLegacyMappingImpl(
const QString & mimeType,
int sharedPointerId,
int metaTypeId, std::auto_ptr<PayloadBase> p );
422 bool ensureMetaTypeId(
int mtid )
const;
424 template <
typename T>
425 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
void>::type
426 setPayloadImpl(
const T &,
const int * = 0 );
427 template <
typename T>
428 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
void>::type
429 setPayloadImpl(
const T & );
431 template <
typename T>
432 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,T>::type
433 payloadImpl(
const int * = 0 )
const;
434 template <
typename T>
435 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,T>::type
438 template <
typename T>
439 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
bool>::type
440 hasPayloadImpl(
const int * = 0 )
const;
441 template <
typename T>
442 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
bool>::type
443 hasPayloadImpl()
const;
445 template <
typename T>
446 typename boost::enable_if<Internal::is_shared_pointer<T>,
bool>::type
447 tryToClone( T *,
const int * = 0 )
const;
448 template <
typename T>
449 typename boost::disable_if<Internal::is_shared_pointer<T>,
bool>::type
450 tryToClone( T * )
const;
457 void setStorageCollectionId(
Entity::Id collectionId);
463 QString payloadExceptionText(
int spid,
int mtid )
const;
470 inline void throwPayloadException(
int spid,
int mtid )
const {
471 throw PayloadException( payloadExceptionText( spid, mtid ) );
474 void throwPayloadException(
int spid,
int mtid )
const;
478 AKONADI_DECLARE_PRIVATE( Item )
482 template <
typename T>
485 BOOST_STATIC_ASSERT( !boost::is_pointer<T>::value );
488 throwPayloadException( -1, -1 );
490 return payloadImpl<T>();
493 template <
typename T>
494 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,T>::type
495 Item::payloadImpl(
const int * )
const
497 typedef Internal::PayloadTrait<T> PayloadType;
498 BOOST_STATIC_ASSERT(( PayloadType::isPolymorphic ));
500 typedef typename Internal::get_hierarchy_root<T>::type Root_T;
501 typedef Internal::PayloadTrait<Root_T> RootType;
502 BOOST_STATIC_ASSERT(( !RootType::isPolymorphic ));
504 return PayloadType::castFrom( payloadImpl<Root_T>() );
507 template <
typename T>
508 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,T>::type
509 Item::payloadImpl()
const
511 typedef Internal::PayloadTrait<T> PayloadType;
512 BOOST_STATIC_ASSERT(( !PayloadType::isPolymorphic ));
514 const int metaTypeId = PayloadType::elementMetaTypeId();
517 if ( !ensureMetaTypeId( metaTypeId ) )
518 throwPayloadException( PayloadType::sharedPointerId, metaTypeId );
522 if (
const Payload<T> *
const p = Internal::payload_cast<T>( payloadBaseV2( PayloadType::sharedPointerId, metaTypeId ) ) )
526 if ( !tryToClone<T>( &ret ) )
527 throwPayloadException( PayloadType::sharedPointerId, metaTypeId );
531 template <
typename T>
532 typename boost::enable_if<Internal::is_shared_pointer<T>,
bool>::type
533 Item::tryToClone( T * ret,
const int * )
const
535 typedef Internal::PayloadTrait<T> PayloadType;
536 BOOST_STATIC_ASSERT(( !PayloadType::isPolymorphic ));
538 const int metaTypeId = PayloadType::elementMetaTypeId();
543 typedef typename Internal::shared_pointer_traits<T>::next_shared_ptr NewT;
544 typedef Internal::PayloadTrait<NewT> NewPayloadType;
546 if (
const Payload<NewT> *
const p = Internal::payload_cast<NewT>( payloadBaseV2( NewPayloadType::sharedPointerId, metaTypeId ) ) ) {
548 const T nt = PayloadType::clone( p->payload );
549 if ( !PayloadType::isNull( nt ) ) {
551 std::auto_ptr<PayloadBase> npb(
new Payload<T>( nt ) );
552 addPayloadBaseVariant( PayloadType::sharedPointerId, metaTypeId, npb );
554 if ( ret ) *ret = nt;
562 template <
typename T>
563 typename boost::disable_if<Internal::is_shared_pointer<T>,
bool>::type
564 Item::tryToClone( T * )
const
566 typedef Internal::PayloadTrait<T> PayloadType;
567 BOOST_STATIC_ASSERT(( !PayloadType::isPolymorphic ));
572 template <
typename T>
575 BOOST_STATIC_ASSERT( !boost::is_pointer<T>::value );
579 template <
typename T>
580 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
bool>::type
581 Item::hasPayloadImpl(
const int * )
const
583 typedef Internal::PayloadTrait<T> PayloadType;
584 BOOST_STATIC_ASSERT(( PayloadType::isPolymorphic ));
586 typedef typename Internal::get_hierarchy_root<T>::type Root_T;
587 typedef Internal::PayloadTrait<Root_T> RootType;
588 BOOST_STATIC_ASSERT(( !RootType::isPolymorphic ));
591 return hasPayloadImpl<Root_T>()
592 && PayloadType::canCastFrom( payload<Root_T>() );
593 }
catch (
const Akonadi::PayloadException & ) {
598 template <
typename T>
599 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic,
bool>::type
600 Item::hasPayloadImpl()
const
602 typedef Internal::PayloadTrait<T> PayloadType;
603 BOOST_STATIC_ASSERT(( !PayloadType::isPolymorphic ));
605 const int metaTypeId = PayloadType::elementMetaTypeId();
608 if ( !ensureMetaTypeId( metaTypeId ) )
613 if (
const Payload<T> *
const p = Internal::payload_cast<T>( payloadBaseV2( PayloadType::sharedPointerId, metaTypeId ) ) )
616 return tryToClone<T>( 0 );
619 template <
typename T>
622 BOOST_STATIC_ASSERT(( !boost::is_pointer<T>::value ));
626 template <
typename T>
627 typename boost::enable_if_c<Internal::PayloadTrait<T>::isPolymorphic>::type
628 Item::setPayloadImpl(
const T & p,
const int * )
630 typedef Internal::PayloadTrait<T> PayloadType;
631 BOOST_STATIC_ASSERT(( PayloadType::isPolymorphic ));
633 typedef typename Internal::get_hierarchy_root<T>::type Root_T;
634 typedef Internal::PayloadTrait<Root_T> RootType;
635 BOOST_STATIC_ASSERT(( !RootType::isPolymorphic ));
637 setPayloadImpl<Root_T>( p );
640 template <
typename T>
641 typename boost::disable_if_c<Internal::PayloadTrait<T>::isPolymorphic>::type
642 Item::setPayloadImpl(
const T & p )
644 typedef Internal::PayloadTrait<T> PayloadType;
645 std::auto_ptr<PayloadBase> pb(
new Payload<T>( p ) );
646 setPayloadBaseV2( PayloadType::sharedPointerId,
647 PayloadType::elementMetaTypeId(),
651 template <
typename T>
654 p->You_MUST_NOT_use_a_pointer_as_payload;
657 template <
typename T>
660 p.Nice_try_but_a_std_auto_ptr_is_not_allowed_as_payload_either;
663 template <
typename T>
665 typedef Internal::PayloadTrait<T> PayloadType;
666 BOOST_STATIC_ASSERT(( !PayloadType::isPolymorphic ));
667 std::auto_ptr<PayloadBase> p(
new Payload<T> );
668 addToLegacyMappingImpl( mimeType, PayloadType::sharedPointerId, PayloadType::elementMetaTypeId(), p );
674 Q_DECLARE_METATYPE(Akonadi::Item::List)