kabc
phonenumber.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "phonenumber.h"
00022
00023 #include <klocale.h>
00024 #include <krandom.h>
00025
00026 #include <QtCore/QDataStream>
00027 #include <QtCore/QSharedData>
00028
00029 using namespace KABC;
00030
00031 static QString cleanupNumber( const QString &input )
00032 {
00033 return input.simplified();
00034 }
00035
00036 class PhoneNumber::Private : public QSharedData
00037 {
00038 public:
00039 Private( Type type )
00040 : mId( KRandom::randomString( 8 ) ), mType( type )
00041 {
00042 }
00043
00044 Private( const Private &other )
00045 : QSharedData( other )
00046 {
00047 mId = other.mId;
00048 mType = other.mType;
00049 mNumber = other.mNumber;
00050 }
00051
00052 QString mId;
00053 Type mType;
00054 QString mNumber;
00055 };
00056
00057 PhoneNumber::PhoneNumber()
00058 : d( new Private( Home ) )
00059 {
00060 }
00061
00062 PhoneNumber::PhoneNumber( const QString &number, Type type )
00063 : d( new Private( type ) )
00064 {
00065 d->mNumber = cleanupNumber( number );
00066 }
00067
00068 PhoneNumber::PhoneNumber( const PhoneNumber &other )
00069 : d( other.d )
00070 {
00071 }
00072
00073 PhoneNumber::~PhoneNumber()
00074 {
00075 }
00076
00077 bool PhoneNumber::operator==( const PhoneNumber &other ) const
00078 {
00079 if ( d->mId != other.d->mId ) {
00080 return false;
00081 }
00082
00083 if ( d->mNumber != other.d->mNumber ) {
00084 return false;
00085 }
00086
00087 if ( d->mType != other.d->mType ) {
00088 return false;
00089 }
00090
00091 return true;
00092 }
00093
00094 bool PhoneNumber::operator!=( const PhoneNumber &other ) const
00095 {
00096 return !( other == *this );
00097 }
00098
00099 PhoneNumber &PhoneNumber::operator=( const PhoneNumber &other )
00100 {
00101 if ( this != &other ) {
00102 d = other.d;
00103 }
00104
00105 return *this;
00106 }
00107
00108 bool PhoneNumber::isEmpty() const
00109 {
00110 return d->mNumber.isEmpty();
00111 }
00112
00113 void PhoneNumber::setId( const QString &id )
00114 {
00115 d->mId = id;
00116 }
00117
00118 QString PhoneNumber::id() const
00119 {
00120 return d->mId;
00121 }
00122
00123 void PhoneNumber::setNumber( const QString &number )
00124 {
00125 d->mNumber = cleanupNumber( number );
00126 }
00127
00128 QString PhoneNumber::number() const
00129 {
00130 return d->mNumber;
00131 }
00132
00133 void PhoneNumber::setType( Type type )
00134 {
00135 d->mType = type;
00136 }
00137
00138 PhoneNumber::Type PhoneNumber::type() const
00139 {
00140 return d->mType;
00141 }
00142
00143 QString PhoneNumber::typeLabel() const
00144 {
00145 QString label;
00146 bool first = true;
00147
00148 const TypeList list = typeList();
00149
00150 TypeList::ConstIterator it;
00151 for ( it = list.begin(); it != list.end(); ++it ) {
00152 if ( ( type() & (*it) ) && ( (*it) != Pref ) ) {
00153 label.append( ( first ? "" : "/" ) + typeLabel( *it ) );
00154 if ( first ) {
00155 first = false;
00156 }
00157 }
00158 }
00159
00160 return label;
00161 }
00162
00163 PhoneNumber::TypeList PhoneNumber::typeList()
00164 {
00165 static TypeList list;
00166
00167 if ( list.isEmpty() ) {
00168 list << Home << Work << Msg << Pref << Voice << Fax << Cell << Video
00169 << Bbs << Modem << Car << Isdn << Pcs << Pager;
00170 }
00171
00172 return list;
00173 }
00174
00175 QString PhoneNumber::typeLabel( Type type )
00176 {
00177 if ( type & Pref ) {
00178 return i18nc( "Preferred phone", "Preferred" );
00179 }
00180
00181 switch ( type ) {
00182 case Home:
00183 return i18nc( "Home phone", "Home" );
00184 break;
00185 case Work:
00186 return i18nc( "Work phone", "Work" );
00187 break;
00188 case Msg:
00189 return i18n( "Messenger" );
00190 break;
00191 case Pref:
00192 return i18n( "Preferred Number" );
00193 break;
00194 case Voice:
00195 return i18n( "Voice" );
00196 break;
00197 case Fax:
00198 return i18n( "Fax" );
00199 break;
00200 case Cell:
00201 return i18nc( "Mobile Phone", "Mobile" );
00202 break;
00203 case Video:
00204 return i18nc( "Video phone", "Video" );
00205 break;
00206 case Bbs:
00207 return i18n( "Mailbox" );
00208 break;
00209 case Modem:
00210 return i18n( "Modem" );
00211 break;
00212 case Car:
00213 return i18nc( "Car Phone", "Car" );
00214 break;
00215 case Isdn:
00216 return i18n( "ISDN" );
00217 break;
00218 case Pcs:
00219 return i18n( "PCS" );
00220 break;
00221 case Pager:
00222 return i18n( "Pager" );
00223 break;
00224 case Home + Fax:
00225 return i18n( "Home Fax" );
00226 break;
00227 case Work + Fax:
00228 return i18n( "Work Fax" );
00229 break;
00230 default:
00231 return i18nc( "another type of phone", "Other" );
00232 }
00233 }
00234
00235 QString PhoneNumber::toString() const
00236 {
00237 QString str;
00238
00239 str += QString( "PhoneNumber {\n" );
00240 str += QString( " Id: %1\n" ).arg( d->mId );
00241 str += QString( " Type: %1\n" ).arg( typeLabel( d->mType ) );
00242 str += QString( " Number: %1\n" ).arg( d->mNumber );
00243 str += QString( "}\n" );
00244
00245 return str;
00246 }
00247
00248 QDataStream &KABC::operator<<( QDataStream &s, const PhoneNumber &phone )
00249 {
00250 return s << phone.d->mId << (uint)phone.d->mType << phone.d->mNumber;
00251 }
00252
00253 QDataStream &KABC::operator>>( QDataStream &s, PhoneNumber &phone )
00254 {
00255 uint type;
00256 s >> phone.d->mId >> type >> phone.d->mNumber;
00257 phone.d->mType = PhoneNumber::Type( type );
00258
00259 return s;
00260 }