00001 /* qdbusdata.cpp DBUS data transport type 00002 * 00003 * Copyright (C) 2007 Kevin Krammer <kevin.krammer@gmx.at> 00004 * 00005 * Licensed under the Academic Free License version 2.1 00006 * 00007 * This program is free software; you can redistribute it and/or modify 00008 * it under the terms of the GNU General Public License as published by 00009 * the Free Software Foundation; either version 2 of the License, or 00010 * (at your option) any later version. 00011 * 00012 * This program is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 * GNU General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU General Public License 00018 * along with this program; if not, write to the Free Software 00019 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 00020 * USA. 00021 * 00022 */ 00023 00024 #include "dbus/dbus.h" 00025 00026 #include "tqdbusdata.h" 00027 #include "tqdbusdatalist.h" 00028 #include "tqdbusdatamap.h" 00029 #include "tqdbusobjectpath.h" 00030 #include "tqdbusunixfd.h" 00031 #include "tqdbusvariant.h" 00032 00033 #include <tqshared.h> 00034 #include <tqstring.h> 00035 #include <tqvaluelist.h> 00036 00037 class TQT_DBusData::Private : public TQShared 00038 { 00039 public: 00040 Private() : TQShared(), type(TQT_DBusData::Invalid), keyType(TQT_DBusData::Invalid) {} 00041 00042 ~Private() 00043 { 00044 switch (type) 00045 { 00046 case TQT_DBusData::String: 00047 delete (TQString*)value.pointer; 00048 break; 00049 00050 case TQT_DBusData::ObjectPath: 00051 delete (TQT_DBusObjectPath*)value.pointer; 00052 break; 00053 00054 case TQT_DBusData::UnixFd: 00055 delete (TQT_DBusUnixFd*)value.pointer; 00056 break; 00057 00058 case TQT_DBusData::List: 00059 delete (TQT_DBusDataList*)value.pointer; 00060 break; 00061 00062 case TQT_DBusData::Struct: 00063 delete (TQValueList<TQT_DBusData>*)value.pointer; 00064 break; 00065 00066 case TQT_DBusData::Variant: 00067 delete (TQT_DBusVariant*)value.pointer; 00068 break; 00069 00070 case TQT_DBusData::Map: 00071 switch (keyType) 00072 { 00073 case TQT_DBusData::Byte: 00074 delete (TQT_DBusDataMap<TQ_UINT8>*)value.pointer; 00075 break; 00076 00077 case TQT_DBusData::Int16: 00078 delete (TQT_DBusDataMap<TQ_INT16>*)value.pointer; 00079 break; 00080 00081 case TQT_DBusData::UInt16: 00082 delete (TQT_DBusDataMap<TQ_UINT16>*)value.pointer; 00083 break; 00084 00085 case TQT_DBusData::Int32: 00086 delete (TQT_DBusDataMap<TQ_INT32>*)value.pointer; 00087 break; 00088 00089 case TQT_DBusData::UInt32: 00090 delete (TQT_DBusDataMap<TQ_UINT32>*)value.pointer; 00091 break; 00092 00093 case TQT_DBusData::Int64: 00094 delete (TQT_DBusDataMap<TQ_INT64>*)value.pointer; 00095 break; 00096 00097 case TQT_DBusData::UInt64: 00098 delete (TQT_DBusDataMap<TQ_UINT64>*)value.pointer; 00099 break; 00100 00101 case TQT_DBusData::String: 00102 delete (TQT_DBusDataMap<TQString>*)value.pointer; 00103 break; 00104 00105 case TQT_DBusData::ObjectPath: 00106 delete (TQT_DBusDataMap<TQT_DBusObjectPath>*)value.pointer; 00107 break; 00108 00109 case TQT_DBusData::UnixFd: 00110 delete (TQT_DBusDataMap<TQT_DBusUnixFd>*)value.pointer; 00111 break; 00112 00113 default: 00114 tqFatal("TQT_DBusData::Private: unhandled map key type %d(%s)", 00115 keyType, TQT_DBusData::typeName(keyType)); 00116 break; 00117 } 00118 break; 00119 00120 default: 00121 break; 00122 } 00123 } 00124 00125 public: 00126 Type type; 00127 Type keyType; 00128 00129 union 00130 { 00131 bool boolValue; 00132 TQ_UINT8 byteValue; 00133 TQ_INT16 int16Value; 00134 TQ_UINT16 uint16Value; 00135 TQ_INT32 int32Value; 00136 TQ_UINT32 uint32Value; 00137 TQ_INT64 int64Value; 00138 TQ_UINT64 uint64Value; 00139 double doubleValue; 00140 void* pointer; 00141 } value; 00142 }; 00143 00144 // key type definitions for TQT_DBusDataMap 00145 template <> 00146 const TQT_DBusData::Type TQT_DBusDataMap<TQ_UINT8>::m_keyType = TQT_DBusData::Byte; 00147 00148 template <> 00149 const TQT_DBusData::Type TQT_DBusDataMap<TQ_INT16>::m_keyType = TQT_DBusData::Int16; 00150 00151 template <> 00152 const TQT_DBusData::Type TQT_DBusDataMap<TQ_UINT16>::m_keyType = TQT_DBusData::UInt16; 00153 00154 template <> 00155 const TQT_DBusData::Type TQT_DBusDataMap<TQ_INT32>::m_keyType = TQT_DBusData::Int32; 00156 00157 template <> 00158 const TQT_DBusData::Type TQT_DBusDataMap<TQ_UINT32>::m_keyType = TQT_DBusData::UInt32; 00159 00160 template <> 00161 const TQT_DBusData::Type TQT_DBusDataMap<TQ_INT64>::m_keyType = TQT_DBusData::Int64; 00162 00163 template <> 00164 const TQT_DBusData::Type TQT_DBusDataMap<TQ_UINT64>::m_keyType = TQT_DBusData::UInt64; 00165 00166 template <> 00167 const TQT_DBusData::Type TQT_DBusDataMap<TQString>::m_keyType = TQT_DBusData::String; 00168 00169 template <> 00170 const TQT_DBusData::Type TQT_DBusDataMap<TQT_DBusObjectPath>::m_keyType = TQT_DBusData::ObjectPath; 00171 00172 template <> 00173 const TQT_DBusData::Type TQT_DBusDataMap<TQT_DBusUnixFd>::m_keyType = TQT_DBusData::UnixFd; 00174 00175 00176 TQT_DBusData::TQT_DBusData() : d(new Private()) 00177 { 00178 } 00179 00180 TQT_DBusData::TQT_DBusData(const TQT_DBusData& other) : d(0) 00181 { 00182 d = other.d; 00183 00184 d->ref(); 00185 } 00186 00187 TQT_DBusData::~TQT_DBusData() 00188 { 00189 if (d->deref()) delete d; 00190 } 00191 00192 TQT_DBusData& TQT_DBusData::operator=(const TQT_DBusData& other) 00193 { 00194 if (&other == this) return *this; 00195 00196 if (d->deref()) delete d; 00197 00198 d = other.d; 00199 00200 d->ref(); 00201 00202 return *this; 00203 } 00204 00205 bool TQT_DBusData::operator==(const TQT_DBusData& other) const 00206 { 00207 if (&other == this) return true; 00208 00209 if (d == other.d) return true; 00210 00211 if (d->type == other.d->type) 00212 { 00213 switch (d->type) 00214 { 00215 case TQT_DBusData::Invalid: 00216 return true; 00217 00218 case TQT_DBusData::Bool: 00219 return d->value.boolValue == other.d->value.boolValue; 00220 00221 case TQT_DBusData::Byte: 00222 return d->value.byteValue == other.d->value.byteValue; 00223 00224 case TQT_DBusData::Int16: 00225 return d->value.int16Value == other.d->value.int16Value; 00226 00227 case TQT_DBusData::UInt16: 00228 return d->value.uint16Value == other.d->value.uint16Value; 00229 00230 case TQT_DBusData::Int32: 00231 return d->value.int32Value == other.d->value.int32Value; 00232 00233 case TQT_DBusData::UInt32: 00234 return d->value.uint32Value == other.d->value.uint64Value; 00235 00236 case TQT_DBusData::Int64: 00237 return d->value.int64Value == other.d->value.int64Value; 00238 00239 case TQT_DBusData::UInt64: 00240 return d->value.uint64Value == other.d->value.uint64Value; 00241 00242 case TQT_DBusData::Double: 00243 // FIXME: should not compare doubles for equality like this 00244 return d->value.doubleValue == other.d->value.doubleValue; 00245 00246 case TQT_DBusData::String: 00247 return toString() == other.toString(); 00248 00249 case TQT_DBusData::ObjectPath: 00250 return toObjectPath() == other.toObjectPath(); 00251 00252 case TQT_DBusData::UnixFd: 00253 return toUnixFd() == other.toUnixFd(); 00254 00255 case TQT_DBusData::List: 00256 return toList() == other.toList(); 00257 00258 case TQT_DBusData::Struct: 00259 return toStruct() == other.toStruct(); 00260 00261 case TQT_DBusData::Variant: 00262 return toVariant() == other.toVariant(); 00263 00264 case TQT_DBusData::Map: 00265 if (d->keyType != other.d->keyType) return false; 00266 00267 switch (d->keyType) 00268 { 00269 case TQT_DBusData::Byte: 00270 return toByteKeyMap() == other.toByteKeyMap(); 00271 00272 case TQT_DBusData::Int16: 00273 return toInt16KeyMap() == other.toInt16KeyMap(); 00274 00275 case TQT_DBusData::UInt16: 00276 return toUInt16KeyMap() == other.toUInt16KeyMap(); 00277 00278 case TQT_DBusData::Int32: 00279 return toInt32KeyMap() == other.toInt32KeyMap(); 00280 00281 case TQT_DBusData::UInt32: 00282 return toUInt32KeyMap() == other.toUInt32KeyMap(); 00283 00284 case TQT_DBusData::Int64: 00285 return toInt64KeyMap() == other.toInt64KeyMap(); 00286 00287 case TQT_DBusData::UInt64: 00288 return toUInt64KeyMap() == other.toUInt64KeyMap(); 00289 00290 case TQT_DBusData::String: 00291 return toStringKeyMap() == other.toStringKeyMap(); 00292 00293 case TQT_DBusData::ObjectPath: 00294 return toObjectPathKeyMap() == other.toObjectPathKeyMap(); 00295 00296 case TQT_DBusData::UnixFd: 00297 return toUnixFdKeyMap() == other.toUnixFdKeyMap(); 00298 00299 default: 00300 tqFatal("TQT_DBusData operator== unhandled map key type %d(%s)", 00301 d->keyType, TQT_DBusData::typeName(d->keyType)); 00302 break; 00303 } 00304 00305 break; 00306 } 00307 } 00308 00309 return false; 00310 } 00311 00312 bool TQT_DBusData::operator!=(const TQT_DBusData& other) const 00313 { 00314 return !operator==(other); 00315 } 00316 00317 TQT_DBusData::Type TQT_DBusData::type() const 00318 { 00319 return d->type; 00320 } 00321 00322 TQT_DBusData::Type TQT_DBusData::keyType() const 00323 { 00324 if (d->type != TQT_DBusData::Map) return TQT_DBusData::Invalid; 00325 00326 return d->keyType; 00327 } 00328 00329 const char* TQT_DBusData::typeName(Type type) 00330 { 00331 switch (type) 00332 { 00333 case TQT_DBusData::Invalid: return "Invalid"; 00334 case TQT_DBusData::Bool: return "Bool"; 00335 case TQT_DBusData::Byte: return "Byte"; 00336 case TQT_DBusData::Int16: return "Int16"; 00337 case TQT_DBusData::UInt16: return "UInt16"; 00338 case TQT_DBusData::Int32: return "Int32"; 00339 case TQT_DBusData::UInt32: return "UInt32"; 00340 case TQT_DBusData::Int64: return "Int64"; 00341 case TQT_DBusData::UInt64: return "UInt64"; 00342 case TQT_DBusData::Double: return "Double"; 00343 case TQT_DBusData::String: return "String"; 00344 case TQT_DBusData::ObjectPath: return "ObjectPath"; 00345 case TQT_DBusData::UnixFd: return "UnixFd"; 00346 case TQT_DBusData::List: return "List"; 00347 case TQT_DBusData::Struct: return "Struct"; 00348 case TQT_DBusData::Variant: return "Variant"; 00349 case TQT_DBusData::Map: return "Map"; 00350 } 00351 00352 return 0; 00353 } 00354 00355 TQT_DBusData TQT_DBusData::fromBool(bool value) 00356 { 00357 TQT_DBusData data; 00358 00359 data.d->type = TQT_DBusData::Bool; 00360 data.d->value.boolValue = value; 00361 00362 return data; 00363 } 00364 00365 bool TQT_DBusData::toBool(bool* ok) const 00366 { 00367 if (d->type != TQT_DBusData::Bool) 00368 { 00369 if (ok != 0) *ok = false; 00370 return false; 00371 } 00372 00373 if (ok != 0) *ok = true; 00374 00375 return d->value.boolValue; 00376 } 00377 00378 TQT_DBusData TQT_DBusData::fromByte(TQ_UINT8 value) 00379 { 00380 TQT_DBusData data; 00381 00382 data.d->type = TQT_DBusData::Byte; 00383 data.d->value.byteValue = value; 00384 00385 return data; 00386 } 00387 00388 TQ_UINT8 TQT_DBusData::toByte(bool* ok) const 00389 { 00390 if (d->type != TQT_DBusData::Byte) 00391 { 00392 if (ok != 0) *ok = false; 00393 return 0; 00394 } 00395 00396 if (ok != 0) *ok = true; 00397 00398 return d->value.byteValue; 00399 } 00400 00401 TQT_DBusData TQT_DBusData::fromInt16(TQ_INT16 value) 00402 { 00403 TQT_DBusData data; 00404 00405 data.d->type = TQT_DBusData::Int16; 00406 data.d->value.int16Value = value; 00407 00408 return data; 00409 } 00410 00411 TQ_INT16 TQT_DBusData::toInt16(bool* ok) const 00412 { 00413 if (d->type != TQT_DBusData::Int16) 00414 { 00415 if (ok != 0) *ok = false; 00416 return 0; 00417 } 00418 00419 if (ok != 0) *ok = true; 00420 00421 return d->value.int16Value; 00422 } 00423 00424 TQT_DBusData TQT_DBusData::fromUInt16(TQ_UINT16 value) 00425 { 00426 TQT_DBusData data; 00427 00428 data.d->type = TQT_DBusData::UInt16; 00429 data.d->value.uint16Value = value; 00430 00431 return data; 00432 } 00433 00434 TQ_UINT16 TQT_DBusData::toUInt16(bool* ok) const 00435 { 00436 if (d->type != TQT_DBusData::UInt16) 00437 { 00438 if (ok != 0) *ok = false; 00439 return 0; 00440 } 00441 00442 if (ok != 0) *ok = true; 00443 00444 return d->value.uint16Value; 00445 } 00446 00447 TQT_DBusData TQT_DBusData::fromInt32(TQ_INT32 value) 00448 { 00449 TQT_DBusData data; 00450 00451 data.d->type = TQT_DBusData::Int32; 00452 data.d->value.int32Value = value; 00453 00454 return data; 00455 } 00456 00457 TQ_INT32 TQT_DBusData::toInt32(bool* ok) const 00458 { 00459 if (d->type != TQT_DBusData::Int32) 00460 { 00461 if (ok != 0) *ok = false; 00462 return 0; 00463 } 00464 00465 if (ok != 0) *ok = true; 00466 00467 return d->value.int32Value; 00468 } 00469 00470 TQT_DBusData TQT_DBusData::fromUInt32(TQ_UINT32 value) 00471 { 00472 TQT_DBusData data; 00473 00474 data.d->type = TQT_DBusData::UInt32; 00475 data.d->value.uint32Value = value; 00476 00477 return data; 00478 } 00479 00480 TQ_UINT32 TQT_DBusData::toUInt32(bool* ok) const 00481 { 00482 if (d->type != TQT_DBusData::UInt32) 00483 { 00484 if (ok != 0) *ok = false; 00485 return 0; 00486 } 00487 00488 if (ok != 0) *ok = true; 00489 00490 return d->value.uint32Value; 00491 } 00492 00493 TQT_DBusData TQT_DBusData::fromInt64(TQ_INT64 value) 00494 { 00495 TQT_DBusData data; 00496 00497 data.d->type = TQT_DBusData::Int64; 00498 data.d->value.int64Value = value; 00499 00500 return data; 00501 } 00502 00503 TQ_INT64 TQT_DBusData::toInt64(bool* ok) const 00504 { 00505 if (d->type != TQT_DBusData::Int64) 00506 { 00507 if (ok != 0) *ok = false; 00508 return 0; 00509 } 00510 00511 if (ok != 0) *ok = true; 00512 00513 return d->value.int64Value; 00514 } 00515 00516 TQT_DBusData TQT_DBusData::fromUInt64(TQ_UINT64 value) 00517 { 00518 TQT_DBusData data; 00519 00520 data.d->type = TQT_DBusData::UInt64; 00521 data.d->value.uint64Value = value; 00522 00523 return data; 00524 } 00525 00526 TQ_UINT64 TQT_DBusData::toUInt64(bool* ok) const 00527 { 00528 if (d->type != TQT_DBusData::UInt64) 00529 { 00530 if (ok != 0) *ok = false; 00531 return 0; 00532 } 00533 00534 if (ok != 0) *ok = true; 00535 00536 return d->value.uint64Value; 00537 } 00538 00539 TQT_DBusData TQT_DBusData::fromDouble(double value) 00540 { 00541 TQT_DBusData data; 00542 00543 data.d->type = TQT_DBusData::Double; 00544 data.d->value.doubleValue = value; 00545 00546 return data; 00547 } 00548 00549 double TQT_DBusData::toDouble(bool* ok) const 00550 { 00551 if (d->type != TQT_DBusData::Double) 00552 { 00553 if (ok != 0) *ok = false; 00554 return 0.0; 00555 } 00556 00557 if (ok != 0) *ok = true; 00558 00559 return d->value.doubleValue; 00560 } 00561 00562 TQT_DBusData TQT_DBusData::fromString(const TQString& value) 00563 { 00564 TQT_DBusData data; 00565 00566 data.d->type = TQT_DBusData::String; 00567 data.d->value.pointer = new TQString(value); 00568 00569 return data; 00570 } 00571 00572 TQString TQT_DBusData::toString(bool* ok) const 00573 { 00574 if (d->type != TQT_DBusData::String) 00575 { 00576 if (ok != 0) *ok = false; 00577 return TQString(); 00578 } 00579 00580 if (ok != 0) *ok = true; 00581 00582 return *((TQString*)d->value.pointer); 00583 } 00584 00585 TQT_DBusData TQT_DBusData::fromObjectPath(const TQT_DBusObjectPath& value) 00586 { 00587 TQT_DBusData data; 00588 00589 if (value.isValid()) 00590 { 00591 data.d->type = TQT_DBusData::ObjectPath; 00592 data.d->value.pointer = new TQT_DBusObjectPath(value); 00593 } 00594 00595 return data; 00596 } 00597 00598 TQT_DBusObjectPath TQT_DBusData::toObjectPath(bool* ok) const 00599 { 00600 if (d->type != TQT_DBusData::ObjectPath) 00601 { 00602 if (ok != 0) *ok = false; 00603 return TQT_DBusObjectPath(); 00604 } 00605 00606 if (ok != 0) *ok = true; 00607 00608 return *((TQT_DBusObjectPath*)d->value.pointer); 00609 } 00610 00611 TQT_DBusData TQT_DBusData::fromUnixFd(const TQT_DBusUnixFd& value) 00612 { 00613 TQT_DBusData data; 00614 00615 if (value.isValid()) 00616 { 00617 data.d->type = TQT_DBusData::UnixFd; 00618 data.d->value.pointer = new TQT_DBusUnixFd(value); 00619 } 00620 00621 return data; 00622 } 00623 00624 TQT_DBusUnixFd TQT_DBusData::toUnixFd(bool* ok) const 00625 { 00626 if (d->type != TQT_DBusData::UnixFd) 00627 { 00628 if (ok != 0) *ok = false; 00629 return TQT_DBusUnixFd(); 00630 } 00631 00632 if (ok != 0) *ok = true; 00633 00634 return *((TQT_DBusUnixFd*)d->value.pointer); 00635 } 00636 00637 TQT_DBusData TQT_DBusData::fromList(const TQT_DBusDataList& list) 00638 { 00639 TQT_DBusData data; 00640 00641 if (list.type() == TQT_DBusData::Invalid) return data; 00642 00643 data.d->type = TQT_DBusData::List; 00644 data.d->value.pointer = new TQT_DBusDataList(list); 00645 00646 return data; 00647 } 00648 00649 TQT_DBusDataList TQT_DBusData::toList(bool* ok) const 00650 { 00651 if (d->type != TQT_DBusData::List) 00652 { 00653 if (ok != 0) *ok = false; 00654 return TQT_DBusDataList(); 00655 } 00656 00657 if (ok != 0) *ok = true; 00658 00659 return *((TQT_DBusDataList*)d->value.pointer); 00660 } 00661 00662 TQT_DBusData TQT_DBusData::fromTQValueList(const TQValueList<TQT_DBusData>& list) 00663 { 00664 return fromList(TQT_DBusDataList(list)); 00665 } 00666 00667 TQValueList<TQT_DBusData> TQT_DBusData::toTQValueList(bool* ok) const 00668 { 00669 bool internalOk = false; 00670 TQT_DBusDataList list = toList(&internalOk); 00671 00672 if (!internalOk) 00673 { 00674 if (ok != 0) *ok = false; 00675 return TQValueList<TQT_DBusData>(); 00676 } 00677 00678 return list.toTQValueList(); 00679 } 00680 00681 TQT_DBusData TQT_DBusData::fromStruct(const TQValueList<TQT_DBusData>& memberList) 00682 { 00683 TQT_DBusData data; 00684 00685 TQValueList<TQT_DBusData>::const_iterator it = memberList.begin(); 00686 TQValueList<TQT_DBusData>::const_iterator endIt = memberList.end(); 00687 for (; it != endIt; ++it) 00688 { 00689 if ((*it).d->type == Invalid) return data; 00690 } 00691 00692 data.d->type = TQT_DBusData::Struct; 00693 data.d->value.pointer = new TQValueList<TQT_DBusData>(memberList); 00694 00695 return data; 00696 } 00697 00698 TQValueList<TQT_DBusData> TQT_DBusData::toStruct(bool* ok) const 00699 { 00700 if (d->type != TQT_DBusData::Struct) 00701 { 00702 if (ok != 0) *ok = false; 00703 return TQValueList<TQT_DBusData>(); 00704 } 00705 00706 if (ok != 0) *ok = true; 00707 00708 return *((TQValueList<TQT_DBusData>*)d->value.pointer); 00709 } 00710 00711 TQT_DBusData TQT_DBusData::fromVariant(const TQT_DBusVariant& value) 00712 { 00713 TQT_DBusData data; 00714 00715 data.d->type = TQT_DBusData::Variant; 00716 data.d->value.pointer = new TQT_DBusVariant(value); 00717 00718 return data; 00719 } 00720 00721 TQT_DBusVariant TQT_DBusData::toVariant(bool* ok) const 00722 { 00723 if (d->type != TQT_DBusData::Variant) 00724 { 00725 if (ok != 0) *ok = false; 00726 return TQT_DBusVariant(); 00727 } 00728 00729 if (ok != 0) *ok = true; 00730 00731 return *((TQT_DBusVariant*)d->value.pointer); 00732 } 00733 00734 TQT_DBusData TQT_DBusData::fromByteKeyMap(const TQT_DBusDataMap<TQ_UINT8>& map) 00735 { 00736 TQT_DBusData data; 00737 00738 data.d->type = TQT_DBusData::Map; 00739 data.d->keyType = map.keyType(); 00740 data.d->value.pointer = new TQT_DBusDataMap<TQ_UINT8>(map); 00741 00742 return data; 00743 } 00744 00745 TQT_DBusDataMap<TQ_UINT8> TQT_DBusData::toByteKeyMap(bool* ok) const 00746 { 00747 if (d->type != TQT_DBusData::Map && d->keyType != TQT_DBusDataMap<TQ_UINT8>::m_keyType) 00748 { 00749 if (ok != 0) *ok = false; 00750 return TQT_DBusDataMap<TQ_UINT8>(); 00751 } 00752 00753 if (ok != 0) *ok = true; 00754 00755 return *((TQT_DBusDataMap<TQ_UINT8>*)d->value.pointer); 00756 } 00757 00758 TQT_DBusData TQT_DBusData::fromInt16KeyMap(const TQT_DBusDataMap<TQ_INT16>& map) 00759 { 00760 TQT_DBusData data; 00761 00762 data.d->type = TQT_DBusData::Map; 00763 data.d->keyType = map.keyType(); 00764 data.d->value.pointer = new TQT_DBusDataMap<TQ_INT16>(map); 00765 00766 return data; 00767 } 00768 00769 TQT_DBusDataMap<TQ_INT16> TQT_DBusData::toInt16KeyMap(bool* ok) const 00770 { 00771 if (d->type != TQT_DBusData::Map && d->keyType != TQT_DBusDataMap<TQ_INT16>::m_keyType) 00772 { 00773 if (ok != 0) *ok = false; 00774 return TQT_DBusDataMap<TQ_INT16>(); 00775 } 00776 00777 if (ok != 0) *ok = true; 00778 00779 return *((TQT_DBusDataMap<TQ_INT16>*)d->value.pointer); 00780 } 00781 00782 TQT_DBusData TQT_DBusData::fromUInt16KeyMap(const TQT_DBusDataMap<TQ_UINT16>& map) 00783 { 00784 TQT_DBusData data; 00785 00786 data.d->type = TQT_DBusData::Map; 00787 data.d->keyType = map.keyType(); 00788 data.d->value.pointer = new TQT_DBusDataMap<TQ_UINT16>(map); 00789 00790 return data; 00791 } 00792 00793 TQT_DBusDataMap<TQ_UINT16> TQT_DBusData::toUInt16KeyMap(bool* ok) const 00794 { 00795 if (d->type != TQT_DBusData::Map && 00796 d->keyType != TQT_DBusDataMap<TQ_UINT16>::m_keyType) 00797 { 00798 if (ok != 0) *ok = false; 00799 return TQT_DBusDataMap<TQ_UINT16>(); 00800 } 00801 00802 if (ok != 0) *ok = true; 00803 00804 return *((TQT_DBusDataMap<TQ_UINT16>*)d->value.pointer); 00805 } 00806 00807 TQT_DBusData TQT_DBusData::fromInt32KeyMap(const TQT_DBusDataMap<TQ_INT32>& map) 00808 { 00809 TQT_DBusData data; 00810 00811 data.d->type = TQT_DBusData::Map; 00812 data.d->keyType = map.keyType(); 00813 data.d->value.pointer = new TQT_DBusDataMap<TQ_INT32>(map); 00814 00815 return data; 00816 } 00817 00818 TQT_DBusDataMap<TQ_INT32> TQT_DBusData::toInt32KeyMap(bool* ok) const 00819 { 00820 if (d->type != TQT_DBusData::Map && d->keyType != TQT_DBusDataMap<TQ_INT32>::m_keyType) 00821 { 00822 if (ok != 0) *ok = false; 00823 return TQT_DBusDataMap<TQ_INT32>(); 00824 } 00825 00826 if (ok != 0) *ok = true; 00827 00828 return *((TQT_DBusDataMap<TQ_INT32>*)d->value.pointer); 00829 } 00830 00831 TQT_DBusData TQT_DBusData::fromUInt32KeyMap(const TQT_DBusDataMap<TQ_UINT32>& map) 00832 { 00833 TQT_DBusData data; 00834 00835 data.d->type = TQT_DBusData::Map; 00836 data.d->keyType = map.keyType(); 00837 data.d->value.pointer = new TQT_DBusDataMap<TQ_UINT32>(map); 00838 00839 return data; 00840 } 00841 00842 TQT_DBusDataMap<TQ_UINT32> TQT_DBusData::toUInt32KeyMap(bool* ok) const 00843 { 00844 if (d->type != TQT_DBusData::Map && 00845 d->keyType != TQT_DBusDataMap<TQ_UINT32>::m_keyType) 00846 { 00847 if (ok != 0) *ok = false; 00848 return TQT_DBusDataMap<TQ_UINT32>(); 00849 } 00850 00851 if (ok != 0) *ok = true; 00852 00853 return *((TQT_DBusDataMap<TQ_UINT32>*)d->value.pointer); 00854 } 00855 00856 TQT_DBusData TQT_DBusData::fromInt64KeyMap(const TQT_DBusDataMap<TQ_INT64>& map) 00857 { 00858 TQT_DBusData data; 00859 00860 data.d->type = TQT_DBusData::Map; 00861 data.d->keyType = map.keyType(); 00862 data.d->value.pointer = new TQT_DBusDataMap<TQ_INT64>(map); 00863 00864 return data; 00865 } 00866 00867 TQT_DBusDataMap<TQ_INT64> TQT_DBusData::toInt64KeyMap(bool* ok) const 00868 { 00869 if (d->type != TQT_DBusData::Map && d->keyType != TQT_DBusDataMap<TQ_INT64>::m_keyType) 00870 { 00871 if (ok != 0) *ok = false; 00872 return TQT_DBusDataMap<TQ_INT64>(); 00873 } 00874 00875 if (ok != 0) *ok = true; 00876 00877 return *((TQT_DBusDataMap<TQ_INT64>*)d->value.pointer); 00878 } 00879 00880 TQT_DBusData TQT_DBusData::fromUInt64KeyMap(const TQT_DBusDataMap<TQ_UINT64>& map) 00881 { 00882 TQT_DBusData data; 00883 00884 data.d->type = TQT_DBusData::Map; 00885 data.d->keyType = map.keyType(); 00886 data.d->value.pointer = new TQT_DBusDataMap<TQ_UINT64>(map); 00887 00888 return data; 00889 } 00890 00891 TQT_DBusDataMap<TQ_UINT64> TQT_DBusData::toUInt64KeyMap(bool* ok) const 00892 { 00893 if (d->type != TQT_DBusData::Map && 00894 d->keyType != TQT_DBusDataMap<TQ_UINT64>::m_keyType) 00895 { 00896 if (ok != 0) *ok = false; 00897 return TQT_DBusDataMap<TQ_UINT64>(); 00898 } 00899 00900 if (ok != 0) *ok = true; 00901 00902 return *((TQT_DBusDataMap<TQ_UINT64>*)d->value.pointer); 00903 } 00904 00905 TQT_DBusData TQT_DBusData::fromStringKeyMap(const TQT_DBusDataMap<TQString>& map) 00906 { 00907 TQT_DBusData data; 00908 00909 data.d->type = TQT_DBusData::Map; 00910 data.d->keyType = map.keyType(); 00911 data.d->value.pointer = new TQT_DBusDataMap<TQString>(map); 00912 00913 return data; 00914 } 00915 00916 TQT_DBusDataMap<TQString> TQT_DBusData::toStringKeyMap(bool* ok) const 00917 { 00918 if (d->type != TQT_DBusData::Map && d->keyType != TQT_DBusDataMap<TQString>::m_keyType) 00919 { 00920 if (ok != 0) *ok = false; 00921 return TQT_DBusDataMap<TQString>(); 00922 } 00923 00924 if (ok != 0) *ok = true; 00925 00926 return *((TQT_DBusDataMap<TQString>*)d->value.pointer); 00927 } 00928 00929 TQT_DBusData TQT_DBusData::fromObjectPathKeyMap(const TQT_DBusDataMap<TQT_DBusObjectPath>& map) 00930 { 00931 TQT_DBusData data; 00932 00933 data.d->type = TQT_DBusData::Map; 00934 data.d->keyType = map.keyType(); 00935 data.d->value.pointer = new TQT_DBusDataMap<TQT_DBusObjectPath>(map); 00936 00937 return data; 00938 } 00939 00940 TQT_DBusDataMap<TQT_DBusObjectPath> TQT_DBusData::toObjectPathKeyMap(bool* ok) const 00941 { 00942 if (d->type != TQT_DBusData::Map && 00943 d->keyType != TQT_DBusDataMap<TQT_DBusObjectPath>::m_keyType) 00944 { 00945 if (ok != 0) *ok = false; 00946 return TQT_DBusDataMap<TQT_DBusObjectPath>(); 00947 } 00948 00949 if (ok != 0) *ok = true; 00950 00951 return *((TQT_DBusDataMap<TQT_DBusObjectPath>*)d->value.pointer); 00952 } 00953 00954 TQT_DBusData TQT_DBusData::fromUnixFdKeyMap(const TQT_DBusDataMap<TQT_DBusUnixFd>& map) 00955 { 00956 TQT_DBusData data; 00957 00958 data.d->type = TQT_DBusData::Map; 00959 data.d->keyType = map.keyType(); 00960 data.d->value.pointer = new TQT_DBusDataMap<TQT_DBusUnixFd>(map); 00961 00962 return data; 00963 } 00964 00965 TQT_DBusDataMap<TQT_DBusUnixFd> TQT_DBusData::toUnixFdKeyMap(bool* ok) const 00966 { 00967 if (d->type != TQT_DBusData::Map && 00968 d->keyType != TQT_DBusDataMap<TQT_DBusUnixFd>::m_keyType) 00969 { 00970 if (ok != 0) *ok = false; 00971 return TQT_DBusDataMap<TQT_DBusUnixFd>(); 00972 } 00973 00974 if (ok != 0) *ok = true; 00975 00976 return *((TQT_DBusDataMap<TQT_DBusUnixFd>*)d->value.pointer); 00977 } 00978 00979 static const char* qDBusTypeForTQT_DBusType(TQT_DBusData::Type type) 00980 { 00981 switch (type) 00982 { 00983 case TQT_DBusData::Invalid: 00984 return 0; 00985 case TQT_DBusData::Bool: 00986 return DBUS_TYPE_BOOLEAN_AS_STRING; 00987 case TQT_DBusData::Byte: 00988 return DBUS_TYPE_BYTE_AS_STRING; 00989 case TQT_DBusData::Int16: 00990 return DBUS_TYPE_INT16_AS_STRING; 00991 case TQT_DBusData::UInt16: 00992 return DBUS_TYPE_UINT16_AS_STRING; 00993 case TQT_DBusData::Int32: 00994 return DBUS_TYPE_INT32_AS_STRING; 00995 case TQT_DBusData::UInt32: 00996 return DBUS_TYPE_UINT32_AS_STRING; 00997 case TQT_DBusData::Int64: 00998 return DBUS_TYPE_INT64_AS_STRING; 00999 case TQT_DBusData::UInt64: 01000 return DBUS_TYPE_UINT64_AS_STRING; 01001 case TQT_DBusData::Double: 01002 return DBUS_TYPE_DOUBLE_AS_STRING; 01003 case TQT_DBusData::String: 01004 return DBUS_TYPE_STRING_AS_STRING; 01005 case TQT_DBusData::ObjectPath: 01006 return DBUS_TYPE_OBJECT_PATH_AS_STRING; 01007 case TQT_DBusData::UnixFd: 01008 return DBUS_TYPE_UNIX_FD_AS_STRING; 01009 case TQT_DBusData::Variant: 01010 return DBUS_TYPE_VARIANT_AS_STRING; 01011 default: 01012 break; 01013 } 01014 return 0; 01015 } 01016 01017 template <typename T> 01018 TQCString qDBusSignatureForMapValue(const TQT_DBusDataMap<T>& map) 01019 { 01020 if (map.hasContainerValueType()) 01021 return map.containerValueType().buildDBusSignature(); 01022 else 01023 return qDBusTypeForTQT_DBusType(map.valueType()); 01024 } 01025 01026 TQCString TQT_DBusData::buildDBusSignature() const 01027 { 01028 TQCString signature; 01029 01030 switch (d->type) 01031 { 01032 case TQT_DBusData::List: 01033 { 01034 TQT_DBusDataList* list = (TQT_DBusDataList*) d->value.pointer; 01035 signature = DBUS_TYPE_ARRAY_AS_STRING; 01036 if (list->hasContainerItemType()) 01037 signature += list->containerItemType().buildDBusSignature(); 01038 else 01039 signature += qDBusTypeForTQT_DBusType(list->type()); 01040 break; 01041 } 01042 01043 case TQT_DBusData::Struct: 01044 { 01045 signature += DBUS_STRUCT_BEGIN_CHAR; 01046 01047 TQValueList<TQT_DBusData>* memberList = 01048 (TQValueList<TQT_DBusData>*) d->value.pointer; 01049 01050 TQValueList<TQT_DBusData>::const_iterator it = (*memberList).begin(); 01051 TQValueList<TQT_DBusData>::const_iterator endIt = (*memberList).end(); 01052 for (; it != endIt; ++it) 01053 { 01054 signature += (*it).buildDBusSignature(); 01055 } 01056 signature += DBUS_STRUCT_END_CHAR; 01057 break; 01058 } 01059 01060 case TQT_DBusData::Map: 01061 signature += DBUS_TYPE_ARRAY_AS_STRING; 01062 signature += DBUS_DICT_ENTRY_BEGIN_CHAR; 01063 01064 signature += qDBusTypeForTQT_DBusType(keyType()); 01065 01066 switch (keyType()) 01067 { 01068 case TQT_DBusData::Byte: 01069 signature += qDBusSignatureForMapValue<TQ_UINT8>( 01070 *((TQT_DBusDataMap<TQ_UINT8>*) d->value.pointer)); 01071 break; 01072 case TQT_DBusData::Int16: 01073 signature += qDBusSignatureForMapValue<TQ_INT16>( 01074 *((TQT_DBusDataMap<TQ_INT16>*) d->value.pointer)); 01075 break; 01076 case TQT_DBusData::UInt16: 01077 signature += qDBusSignatureForMapValue<TQ_UINT16>( 01078 *((TQT_DBusDataMap<TQ_UINT16>*) d->value.pointer)); 01079 break; 01080 case TQT_DBusData::Int32: 01081 signature += qDBusSignatureForMapValue<TQ_INT32>( 01082 *((TQT_DBusDataMap<TQ_INT32>*) d->value.pointer)); 01083 break; 01084 case TQT_DBusData::UInt32: 01085 signature += qDBusSignatureForMapValue<TQ_UINT32>( 01086 *((TQT_DBusDataMap<TQ_UINT32>*) d->value.pointer)); 01087 break; 01088 case TQT_DBusData::Int64: 01089 signature += qDBusSignatureForMapValue<TQ_INT64>( 01090 *((TQT_DBusDataMap<TQ_INT64>*) d->value.pointer)); 01091 break; 01092 case TQT_DBusData::UInt64: 01093 signature += qDBusSignatureForMapValue<TQ_UINT64>( 01094 *((TQT_DBusDataMap<TQ_UINT64>*) d->value.pointer)); 01095 break; 01096 case TQT_DBusData::String: 01097 signature += qDBusSignatureForMapValue<TQString>( 01098 *((TQT_DBusDataMap<TQString>*) d->value.pointer)); 01099 break; 01100 case TQT_DBusData::ObjectPath: 01101 signature += qDBusSignatureForMapValue<TQT_DBusObjectPath>( 01102 *((TQT_DBusDataMap<TQT_DBusObjectPath>*) d->value.pointer)); 01103 break; 01104 case TQT_DBusData::UnixFd: 01105 signature += qDBusSignatureForMapValue<TQT_DBusUnixFd>( 01106 *((TQT_DBusDataMap<TQT_DBusUnixFd>*) d->value.pointer)); 01107 break; 01108 default: 01109 break; 01110 } 01111 01112 signature += DBUS_DICT_ENTRY_END_CHAR; 01113 break; 01114 01115 default: 01116 signature = qDBusTypeForTQT_DBusType(d->type); 01117 break; 01118 } 01119 01120 return signature; 01121 }
1.6.3