/* qdbusdatalist.cpp list of DBUS data transport type * * Copyright (C) 2007 Kevin Krammer * * Licensed under the Academic Free License version 2.1 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * */ #include "tqdbusdatalist.h" #include "tqdbusobjectpath.h" #include "tqdbusunixfd.h" #include "tqdbusvariant.h" #include class TQT_DBusDataList::Private { public: Private() : type(TQT_DBusData::Invalid) {} public: TQT_DBusData::Type type; TQT_DBusData containerItem; TQValueList list; }; TQT_DBusDataList::TQT_DBusDataList() : d(new Private()) { } TQT_DBusDataList::TQT_DBusDataList(TQT_DBusData::Type simpleItemType) : d(new Private()) { d->type = simpleItemType; } TQT_DBusDataList::TQT_DBusDataList(const TQT_DBusData& containerItemType) : d(new Private()) { d->type = containerItemType.type(); switch(d->type) { case TQT_DBusData::List: // fall through case TQT_DBusData::Struct: // fall through case TQT_DBusData::Map: d->containerItem = containerItemType; break; default: // not a container break; } } TQT_DBusDataList::TQT_DBusDataList(const TQT_DBusDataList& other) : d(new Private()) { d->type = other.d->type; d->list = other.d->list; d->containerItem = other.d->containerItem; } TQT_DBusDataList::TQT_DBusDataList(const TQValueList& other) : d(new Private()) { if (other.isEmpty()) return; TQValueList::const_iterator it = other.begin(); TQValueList::const_iterator endIt = other.end(); d->type = (*it).type(); TQCString elementSignature; if (hasContainerItemType()) { d->containerItem = other[0]; // would be nice to get an empty one elementSignature = d->containerItem.buildDBusSignature(); } for (++it; it != endIt; ++it) { if (d->type != (*it).type()) { d->type = TQT_DBusData::Invalid; d->containerItem = TQT_DBusData(); return; } else if (hasContainerItemType()) { if ((*it).buildDBusSignature() != elementSignature) { d->type = TQT_DBusData::Invalid; d->containerItem = TQT_DBusData(); return; } } } d->list = other; } TQT_DBusDataList::TQT_DBusDataList(const TQValueList& other) : d(new Private()) { d->type = TQT_DBusData::Bool; if (other.isEmpty()) return; TQValueList::const_iterator it = other.begin(); TQValueList::const_iterator endIt = other.end(); for (; it != endIt; ++it) { d->list << TQT_DBusData::fromBool(*it); } } TQT_DBusDataList::TQT_DBusDataList(const TQValueList& other) : d(new Private()) { d->type = TQT_DBusData::Byte; if (other.isEmpty()) return; TQValueList::const_iterator it = other.begin(); TQValueList::const_iterator endIt = other.end(); for (; it != endIt; ++it) { d->list << TQT_DBusData::fromByte(*it); } } TQT_DBusDataList::TQT_DBusDataList(const TQValueList& other) : d(new Private()) { d->type = TQT_DBusData::Int16; if (other.isEmpty()) return; TQValueList::const_iterator it = other.begin(); TQValueList::const_iterator endIt = other.end(); for (; it != endIt; ++it) { d->list << TQT_DBusData::fromInt16(*it); } } TQT_DBusDataList::TQT_DBusDataList(const TQValueList& other) : d(new Private()) { d->type = TQT_DBusData::UInt16; if (other.isEmpty()) return; TQValueList::const_iterator it = other.begin(); TQValueList::const_iterator endIt = other.end(); for (; it != endIt; ++it) { d->list << TQT_DBusData::fromUInt16(*it); } } TQT_DBusDataList::TQT_DBusDataList(const TQValueList& other) : d(new Private()) { d->type = TQT_DBusData::Int32; if (other.isEmpty()) return; TQValueList::const_iterator it = other.begin(); TQValueList::const_iterator endIt = other.end(); for (; it != endIt; ++it) { d->list << TQT_DBusData::fromInt32(*it); } } TQT_DBusDataList::TQT_DBusDataList(const TQValueList& other) : d(new Private()) { d->type = TQT_DBusData::UInt32; if (other.isEmpty()) return; TQValueList::const_iterator it = other.begin(); TQValueList::const_iterator endIt = other.end(); for (; it != endIt; ++it) { d->list << TQT_DBusData::fromUInt32(*it); } } TQT_DBusDataList::TQT_DBusDataList(const TQValueList& other) : d(new Private()) { d->type = TQT_DBusData::Int64; if (other.isEmpty()) return; TQValueList::const_iterator it = other.begin(); TQValueList::const_iterator endIt = other.end(); for (; it != endIt; ++it) { d->list << TQT_DBusData::fromInt64(*it); } } TQT_DBusDataList::TQT_DBusDataList(const TQValueList& other) : d(new Private()) { d->type = TQT_DBusData::UInt64; if (other.isEmpty()) return; TQValueList::const_iterator it = other.begin(); TQValueList::const_iterator endIt = other.end(); for (; it != endIt; ++it) { d->list << TQT_DBusData::fromUInt64(*it); } } TQT_DBusDataList::TQT_DBusDataList(const TQValueList& other) : d(new Private()) { d->type = TQT_DBusData::Double; if (other.isEmpty()) return; TQValueList::const_iterator it = other.begin(); TQValueList::const_iterator endIt = other.end(); for (; it != endIt; ++it) { d->list << TQT_DBusData::fromDouble(*it); } } TQT_DBusDataList::TQT_DBusDataList(const TQValueList& other) : d(new Private()) { d->type = TQT_DBusData::Variant; if (other.isEmpty()) return; TQValueList::const_iterator it = other.begin(); TQValueList::const_iterator endIt = other.end(); for (; it != endIt; ++it) { d->list << TQT_DBusData::fromVariant(*it); } } TQT_DBusDataList::TQT_DBusDataList(const TQStringList& other) : d(new Private()) { d->type = TQT_DBusData::String; if (other.isEmpty()) return; TQStringList::const_iterator it = other.begin(); TQStringList::const_iterator endIt = other.end(); for (; it != endIt; ++it) { d->list << TQT_DBusData::fromString(*it); } } TQT_DBusDataList::TQT_DBusDataList(const TQValueList& other) : d(new Private()) { d->type = TQT_DBusData::ObjectPath; if (other.isEmpty()) return; TQValueList::const_iterator it = other.begin(); TQValueList::const_iterator endIt = other.end(); for (; it != endIt; ++it) { d->list << TQT_DBusData::fromObjectPath(*it); } } TQT_DBusDataList::TQT_DBusDataList(const TQValueList& other) : d(new Private()) { d->type = TQT_DBusData::UnixFd; if (other.isEmpty()) return; TQValueList::const_iterator it = other.begin(); TQValueList::const_iterator endIt = other.end(); for (; it != endIt; ++it) { d->list << TQT_DBusData::fromUnixFd(*it); } } TQT_DBusDataList::~TQT_DBusDataList() { delete d; } TQT_DBusDataList& TQT_DBusDataList::operator=(const TQT_DBusDataList& other) { if (&other == this) return *this; d->type = other.d->type; d->list = other.d->list; d->containerItem = other.d->containerItem; return *this; } TQT_DBusDataList& TQT_DBusDataList::operator=(const TQValueList& other) { d->list.clear(); d->type = TQT_DBusData::Invalid; d->containerItem = TQT_DBusData(); if (other.isEmpty()) return *this; TQValueList::const_iterator it = other.begin(); TQValueList::const_iterator endIt = other.end(); d->type = (*it).type(); TQCString elementSignature; if (hasContainerItemType()) { d->containerItem = other[0]; // would be nice to get an empty one elementSignature = d->containerItem.buildDBusSignature(); } for (++it; it != endIt; ++it) { if (d->type != (*it).type()) { d->type = TQT_DBusData::Invalid; d->containerItem = TQT_DBusData(); return *this; } else if (hasContainerItemType()) { if ((*it).buildDBusSignature() != elementSignature) { d->type = TQT_DBusData::Invalid; d->containerItem = TQT_DBusData(); return *this; } } } d->list = other; return *this; } TQT_DBusDataList& TQT_DBusDataList::operator=(const TQStringList& other) { d->list.clear(); d->type = TQT_DBusData::String; d->containerItem = TQT_DBusData(); TQStringList::const_iterator it = other.begin(); TQStringList::const_iterator endIt = other.end(); for (; it != endIt; ++it) { d->list << TQT_DBusData::fromString(*it); } return *this; } TQT_DBusData::Type TQT_DBusDataList::type() const { return d->type; } bool TQT_DBusDataList::hasContainerItemType() const { return d->type == TQT_DBusData::List || d->type == TQT_DBusData::Map || d->type == TQT_DBusData::Struct; } TQT_DBusData TQT_DBusDataList::containerItemType() const { return d->containerItem; } bool TQT_DBusDataList::isEmpty() const { return d->list.isEmpty(); } uint TQT_DBusDataList::count() const { return d->list.count(); } bool TQT_DBusDataList::operator==(const TQT_DBusDataList& other) const { if (&other == this) return true; if (d == other.d) return true; bool containerEqual = true; if (hasContainerItemType()) { if (other.hasContainerItemType()) { containerEqual = d->containerItem.buildDBusSignature() == other.d->containerItem.buildDBusSignature(); } else containerEqual = false; } else if (other.hasContainerItemType()) containerEqual = false; return d->type == other.d->type && containerEqual && d->list == other.d->list; } bool TQT_DBusDataList::operator!=(const TQT_DBusDataList& other) const { if (&other == this) return false; if (d == other.d) return false; bool containerEqual = true; if (hasContainerItemType()) { if (other.hasContainerItemType()) { containerEqual = d->containerItem.buildDBusSignature() == other.d->containerItem.buildDBusSignature(); } else containerEqual = false; } else if (other.hasContainerItemType()) containerEqual = false; return d->type != other.d->type || !containerEqual || d->list != other.d->list; } void TQT_DBusDataList::clear() { d->list.clear(); } TQT_DBusDataList& TQT_DBusDataList::operator<<(const TQT_DBusData& data) { if (data.type() == TQT_DBusData::Invalid) return *this; if (d->type == TQT_DBusData::Invalid) { d->type = data.type(); // check if we are now have container items if (hasContainerItemType()) d->containerItem = data; d->list << data; } else if (d->type != data.type()) { qWarning("TQT_DBusDataList: trying to add data of type %s to list of type %s", data.typeName(), TQT_DBusData::typeName(d->type)); } else if (hasContainerItemType()) { TQCString ourSignature = d->containerItem.buildDBusSignature(); TQCString dataSignature = data.buildDBusSignature(); if (ourSignature != dataSignature) { qWarning("TQT_DBusDataList: trying to add data with signature %s " "to list with item signature %s", dataSignature.data(), ourSignature.data()); } else d->list << data; } else d->list << data; return *this; } TQValueList TQT_DBusDataList::toTQValueList() const { return d->list; } TQStringList TQT_DBusDataList::toTQStringList(bool* ok) const { if (d->type != TQT_DBusData::String) { if (ok != 0) *ok = false; return TQStringList(); } TQStringList result; TQValueList::const_iterator it = d->list.begin(); TQValueList::const_iterator endIt = d->list.end(); for (; it != endIt; ++it) { result << (*it).toString(); } if (ok != 0) *ok = true; return result; } TQValueList TQT_DBusDataList::toBoolList(bool* ok) const { if (d->type != TQT_DBusData::Bool) { if (ok != 0) *ok = false; return TQValueList(); } TQValueList result; TQValueList::const_iterator it = d->list.begin(); TQValueList::const_iterator endIt = d->list.end(); for (; it != endIt; ++it) { result << (*it).toBool(); } if (ok != 0) *ok = true; return result; } TQValueList TQT_DBusDataList::toByteList(bool* ok) const { if (d->type != TQT_DBusData::Byte) { if (ok != 0) *ok = false; return TQValueList(); } TQValueList result; TQValueList::const_iterator it = d->list.begin(); TQValueList::const_iterator endIt = d->list.end(); for (; it != endIt; ++it) { result << (*it).toByte(); } if (ok != 0) *ok = true; return result; } TQValueList TQT_DBusDataList::toInt16List(bool* ok) const { if (d->type != TQT_DBusData::Int16) { if (ok != 0) *ok = false; return TQValueList(); } TQValueList result; TQValueList::const_iterator it = d->list.begin(); TQValueList::const_iterator endIt = d->list.end(); for (; it != endIt; ++it) { result << (*it).toInt16(); } if (ok != 0) *ok = true; return result; } TQValueList TQT_DBusDataList::toUInt16List(bool* ok) const { if (d->type != TQT_DBusData::UInt16) { if (ok != 0) *ok = false; return TQValueList(); } TQValueList result; TQValueList::const_iterator it = d->list.begin(); TQValueList::const_iterator endIt = d->list.end(); for (; it != endIt; ++it) { result << (*it).toUInt16(); } if (ok != 0) *ok = true; return result; } TQValueList TQT_DBusDataList::toInt32List(bool* ok) const { if (d->type != TQT_DBusData::Int32) { if (ok != 0) *ok = false; return TQValueList(); } TQValueList result; TQValueList::const_iterator it = d->list.begin(); TQValueList::const_iterator endIt = d->list.end(); for (; it != endIt; ++it) { result << (*it).toInt32(); } if (ok != 0) *ok = true; return result; } TQValueList TQT_DBusDataList::toUInt32List(bool* ok) const { if (d->type != TQT_DBusData::UInt32) { if (ok != 0) *ok = false; return TQValueList(); } TQValueList result; TQValueList::const_iterator it = d->list.begin(); TQValueList::const_iterator endIt = d->list.end(); for (; it != endIt; ++it) { result << (*it).toUInt32(); } if (ok != 0) *ok = true; return result; } TQValueList TQT_DBusDataList::toInt64List(bool* ok) const { if (d->type != TQT_DBusData::Int64) { if (ok != 0) *ok = false; return TQValueList(); } TQValueList result; TQValueList::const_iterator it = d->list.begin(); TQValueList::const_iterator endIt = d->list.end(); for (; it != endIt; ++it) { result << (*it).toInt64(); } if (ok != 0) *ok = true; return result; } TQValueList TQT_DBusDataList::toUInt64List(bool* ok) const { if (d->type != TQT_DBusData::UInt64) { if (ok != 0) *ok = false; return TQValueList(); } TQValueList result; TQValueList::const_iterator it = d->list.begin(); TQValueList::const_iterator endIt = d->list.end(); for (; it != endIt; ++it) { result << (*it).toUInt64(); } if (ok != 0) *ok = true; return result; } TQValueList TQT_DBusDataList::toDoubleList(bool* ok) const { if (d->type != TQT_DBusData::Double) { if (ok != 0) *ok = false; return TQValueList(); } TQValueList result; TQValueList::const_iterator it = d->list.begin(); TQValueList::const_iterator endIt = d->list.end(); for (; it != endIt; ++it) { result << (*it).toDouble(); } if (ok != 0) *ok = true; return result; } TQValueList TQT_DBusDataList::toStringList(bool* ok) const { return toTQStringList(ok); } TQValueList TQT_DBusDataList::toObjectPathList(bool* ok) const { if (d->type != TQT_DBusData::ObjectPath) { if (ok != 0) *ok = false; return TQValueList(); } TQValueList result; TQValueList::const_iterator it = d->list.begin(); TQValueList::const_iterator endIt = d->list.end(); for (; it != endIt; ++it) { result << (*it).toObjectPath(); } if (ok != 0) *ok = true; return result; } TQValueList TQT_DBusDataList::toUnixFdList(bool* ok) const { if (d->type != TQT_DBusData::UnixFd) { if (ok != 0) *ok = false; return TQValueList(); } TQValueList result; TQValueList::const_iterator it = d->list.begin(); TQValueList::const_iterator endIt = d->list.end(); for (; it != endIt; ++it) { result << (*it).toUnixFd(); } if (ok != 0) *ok = true; return result; } TQValueList TQT_DBusDataList::toVariantList(bool* ok) const { if (d->type != TQT_DBusData::Variant) { if (ok != 0) *ok = false; return TQValueList(); } TQValueList result; TQValueList::const_iterator it = d->list.begin(); TQValueList::const_iterator endIt = d->list.end(); for (; it != endIt; ++it) { result << (*it).toVariant(); } if (ok != 0) *ok = true; return result; }