/* This file is part of libkcal. Copyright (c) 2002,2006 David Jarvie This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "customproperties.h" #include using namespace KCal; CustomProperties::CustomProperties() { } CustomProperties::CustomProperties(const CustomProperties &cp) : mProperties(cp.mProperties) { } CustomProperties::~CustomProperties() { } bool CustomProperties::operator==( const CustomProperties &other ) const { if ( mProperties.count() != other.mProperties.count() ) return false; TQMap::ConstIterator it; for( it = mProperties.begin(); it != mProperties.end(); ++it ) { TQMap::ConstIterator itOther = other.mProperties.find( it.key() ); if ( itOther == other.mProperties.end() ) { return false; } if ( itOther.data() != it.data() ) return false; } return true; } void CustomProperties::setCustomProperty(const TQCString &app, const TQCString &key, const TQString &value) { if (value.isNull() || key.isEmpty() || app.isEmpty()) return; TQCString property = "X-TDE-" + app + "-" + key; if (!checkName(property)) return; mProperties[property] = value; customPropertyUpdated(); } void CustomProperties::removeCustomProperty(const TQCString &app, const TQCString &key) { removeNonKDECustomProperty(TQCString("X-TDE-" + app + "-" + key)); } TQString CustomProperties::customProperty(const TQCString &app, const TQCString &key) const { return nonKDECustomProperty(TQCString("X-TDE-" + app + "-" + key)); } void CustomProperties::setNonKDECustomProperty(const TQCString &name, const TQString &value) { if (value.isNull() || !checkName(name)) return; mProperties[name] = value; customPropertyUpdated(); } void CustomProperties::removeNonKDECustomProperty(const TQCString &name) { TQMap::Iterator it = mProperties.find(name); if (it != mProperties.end()) { mProperties.remove(it); customPropertyUpdated(); } } TQString CustomProperties::nonKDECustomProperty(const TQCString &name) const { TQMap::ConstIterator it = mProperties.find(name); if (it == mProperties.end()) return TQString(); return it.data(); } void CustomProperties::setCustomProperties(const TQMap &properties) { bool changed = false; for (TQMap::ConstIterator it = properties.begin(); it != properties.end(); ++it) { // Validate the property name and convert any null string to empty string if (checkName(it.key())) { mProperties[it.key()] = it.data().isNull() ? TQString("") : it.data(); changed = true; } } if (changed) customPropertyUpdated(); } TQMap CustomProperties::customProperties() const { return mProperties; } bool CustomProperties::checkName(const TQCString &name) { // Check that the property name starts with 'X-' and contains // only the permitted characters const char* n = name; int len = name.length(); if (len < 2 || n[0] != 'X' || n[1] != '-') return false; for (int i = 2; i < len; ++i) { char ch = n[i]; if (ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9' || ch == '-') continue; return false; // invalid character found } return true; }