// Version: $Id: e70ca772182b09d24568f6c60952480d07e23303 $ // // // Commentary: // // // Change Log: // // // Code: #include #include // ///////////////////////////////////////////////////////////////// // dtkComposerTransmitterHandler implementation // ///////////////////////////////////////////////////////////////// template inline void dtkComposerTransmitterHandler::init(dtkComposerTransmitter& t) { t.d->type_list << qMetaTypeId(reinterpret_cast(0)); t.d->variant = QVariant(t.d->type_list.first(), 0); } template inline bool dtkComposerTransmitterHandler::enableConnection(dtkComposerTransmitter& t) { return dtkMetaType::canConvert(t.d->type_list); } template inline T dtkComposerTransmitterHandler::data(dtkComposerTransmitter& t) { return t.variant().value(); } template inline T dtkComposerTransmitterHandler::constData(dtkComposerTransmitter& t) { return t.variant().value(); } // ///////////////////////////////////////////////////////////////// // dtkComposerTransmitterHandler pointer implementation // ///////////////////////////////////////////////////////////////// template inline void dtkComposerTransmitterHandler::init(dtkComposerTransmitter& t) { t.d->type_list << qMetaTypeId(reinterpret_cast(0)); T *ptr = NULL; t.d->variant = QVariant::fromValue(ptr); t.d->swap = QVariant::fromValue(ptr); } template inline bool dtkComposerTransmitterHandler::enableConnection(dtkComposerTransmitter& t) { return dtkMetaType::canConvert(t.d->type_list); } template inline T *dtkComposerTransmitterHandler::data(dtkComposerTransmitter& t) { T *source = t.variant().value(); switch (t.dataTransmission()) { case dtkComposerTransmitter::AutoCopy: if (!t.enableCopy()) { return source; } else { return copy(source, t.d->variant, t.d->swap); } break; case dtkComposerTransmitter::Reference: return source; break; case dtkComposerTransmitter::Copy: return copy(source, t.d->variant, t.d->swap); break; default: return source; } } template inline T *dtkComposerTransmitterHandler::constData(dtkComposerTransmitter& t) { return t.variant().value(); } template inline T *dtkComposerTransmitterHandler::copy(T *source, QVariant& target, QVariant& swap) { if (!source) return source; T *dest = target.value(); if (!dest) { dest = dtkMetaType::clone(source); target.setValue(dest); } else { if (dest != source) { dtkMetaType::copy(source, dest); } else { dest = swap.value(); if (!dest) { dest = dtkMetaType::clone(source); if (!dest) { dtkWarn() << Q_FUNC_INFO << "Copy failed. nullptr is returned."; } } else { dtkMetaType::copy(source, dest); if (!dest) { dtkWarn() << Q_FUNC_INFO << "Copy failed. nullptr is returned."; } } swap.setValue(source); target.setValue(dest); } } return dest; } // ///////////////////////////////////////////////////////////////// // dtkComposerTransmitterHandlerVariant implementation // ///////////////////////////////////////////////////////////////// inline QVariant dtkComposerTransmitterHandlerVariant::data(dtkComposerTransmitter& t) { QVariant source = t.variant(); switch (t.dataTransmission()) { case dtkComposerTransmitter::AutoCopy: if (!t.enableCopy()) { return source; } else { copy(source, t.d->variant); return t.d->variant; } break; case dtkComposerTransmitter::Reference: return source; break; case dtkComposerTransmitter::Copy: copy(source, t.d->variant); return t.d->variant; break; default: return source; } } inline bool dtkComposerTransmitterHandlerVariant::containSamePointer(const QVariant& v0, const QVariant& v1) { if (QString(v0.typeName()).endsWith("*") && QString(v1.typeName()).endsWith("*")) { const void *v0_ptr = *static_cast(v0.data()); const void *v1_ptr = *static_cast(v1.data()); return (v0_ptr && v1_ptr && (v0_ptr == v1_ptr)); } return false; } inline void dtkComposerTransmitterHandlerVariant::clearPointer(QVariant& v) { void *ptr = *static_cast(v.data()); QString type_name = QString(v.typeName()); type_name.chop(1); int type_id = QMetaType::type(qPrintable(type_name)); QMetaType::destroy(type_id, ptr); v.clear(); } inline void dtkComposerTransmitterHandlerVariant::copy(const QVariant& source, QVariant& target) { if (!source.isValid()) { target = source; return; } if (containSamePointer(source, target)) clearPointer(target); target = dtkMetaType::cloneContent(source); } // // dtkComposerTransmitterHandler.tpp ends here