void KOAttendeeListView::dropEvent( QDropEvent *e ) { #ifndef KORG_NODND QString text; QString vcards; #ifndef KORG_NOKABC if ( KVCardDrag::decode( e, vcards ) ) { KABC::VCardConverter converter; KABC::Addressee::List list = converter.parseVCards( vcards ); KABC::Addressee::List::Iterator it; for ( it = list.begin(); it != list.end(); ++it ) { QString em( (*it).fullEmail() ); if (em.isEmpty()) { em=(*it).realName(); } addAttendee( em ); } } else #endif // KORG_NOKABC if (QTextDrag::decode(e,text)) { kdDebug(5850) << "Dropped : " << text << endl; QStringList emails = QStringList::split(",",text); for(QStringList::ConstIterator it = emails.begin();it!=emails.end();++it) { addAttendee(*it); } } #endif //KORG_NODND }
void KoRdfFoaF::exportToFile(const QString &fileNameConst) const { QString fileName = fileNameConst; #ifdef KDEPIMLIBS_FOUND if (!fileName.size()) { fileName = KFileDialog::getSaveFileName( KUrl("kfiledialog:///ExportDialog"), "*.vcf|vCard files", 0, "Export to selected vCard file"); if (!fileName.size()) { kDebug(30015) << "no filename given, cancel export.."; return; } } KABC::Addressee addr = toKABC(); KABC::VCardConverter converter; QByteArray ba = converter.createVCard(addr); QFile file(fileName); file.open(QIODevice::WriteOnly); file.write(ba); file.close(); kDebug(30015) << "wrote " << ba.size() << " bytes to export file:" << fileName; #else kDebug(30015) << "KDEPIM support not built!"; #endif }
void ResourceGroupwise::slotReadJobData( KIO::Job *job , const QByteArray &data ) { kdDebug() << "ResourceGroupwise::slotReadJobData()" << endl; Q_UNUSED( job ); mJobData.append( data.data() ); KABC::VCardConverter conv; QTime profile; profile.start(); Addressee::List addressees = conv.parseVCards( mJobData ); // kdDebug() << " parsed " << addressees.count() << " contacts in " << profile.elapsed() << "ms, now adding to resource..." << endl; Addressee::List::ConstIterator it; for( it = addressees.begin(); it != addressees.end(); ++it ) { KABC::Addressee addr = *it; if ( !addr.isEmpty() ) { addr.setResource( this ); QString remote = addr.custom( "GWRESOURCE", "UID" ); QString local = idMapper().localId( remote ); if ( local.isEmpty() ) { idMapper().setRemoteId( addr.uid(), remote ); } else { addr.setUid( local ); } insertAddressee( addr ); clearChange( addr ); } } mJobData = QString::null; }
bool GroupDavGlobals::interpretAddressBookDownloadItemsJob( KABC::AddressBookAdaptor *adaptor, KIO::Job *job, const QString &jobData) { kdDebug(5800) << "GroupDavGlobals::interpretAddressBookDownloadItemsJob, vCard=" << endl; kdDebug(5800) << jobData << endl; if(!adaptor || !job) return false; KABC::VCardConverter conv; KABC::Addressee::List addrs(conv.parseVCards(jobData)); if(addrs.count() != 1) { kdError() << "Parsed vCard does not contain exactly one addressee." << endl; return false; } KABC::Addressee a = addrs.first(); KIO::SimpleJob *sjob = dynamic_cast<KIO::SimpleJob *>(job); KURL remoteId; if(sjob) remoteId = sjob->url(); QString fingerprint = extractFingerprint(job, jobData); adaptor->addressbookItemDownloaded(a, a.uid(), remoteId, fingerprint, remoteId.prettyURL()); return true; }
void updateView( const QVariantList &localCustomFieldDescriptions = QVariantList(), const QString &addressBookName = QString() ) { static QPixmap defaultPixmap = KIcon( QLatin1String( "user-identity" ) ).pixmap( QSize( 100, 100 ) ); mParent->setWindowTitle( i18n( "Contact %1", mCurrentContact.assembledName() ) ); if ( mCurrentContact.photo().isIntern() ) { mBrowser->document()->addResource( QTextDocument::ImageResource, QUrl( QLatin1String( "contact_photo" ) ), mCurrentContact.photo().data() ); } else { mBrowser->document()->addResource( QTextDocument::ImageResource, QUrl( QLatin1String( "contact_photo" ) ), defaultPixmap ); } mBrowser->document()->addResource( QTextDocument::ImageResource, QUrl( QLatin1String( "map_icon" ) ), KIcon( QLatin1String( "document-open-remote" ) ).pixmap( QSize( 16, 16 ) ) ); mBrowser->document()->addResource( QTextDocument::ImageResource, QUrl( QLatin1String( "sms_icon" ) ), KIcon( IMProtocols::self()->icon( QString::fromLatin1( "messaging/sms" ) ) ).pixmap( QSize( 16, 16 ) ) ); #ifdef HAVE_PRISON KConfig config( QLatin1String( "akonadi_contactrc" ) ); KConfigGroup group( &config, QLatin1String( "View" ) ); if ( group.readEntry( "QRCodes", true ) ) { KABC::VCardConverter converter; KABC::Addressee addr( mCurrentContact ); addr.setPhoto( KABC::Picture() ); addr.setLogo( KABC::Picture() ); const QString data = QString::fromUtf8( converter.createVCard( addr ) ); mQRCode->setData( data ); mDataMatrix->setData( data ); mBrowser->document()->addResource( QTextDocument::ImageResource, QUrl( QLatin1String( "qrcode" ) ), mQRCode->toImage( QSizeF( 50, 50 ) ) ); mBrowser->document()->addResource( QTextDocument::ImageResource, QUrl( QLatin1String( "datamatrix" ) ), mDataMatrix->toImage( QSizeF( 50, 50 ) ) ); } #endif // HAVE_PRISON // merge local and global custom field descriptions QList<QVariantMap> customFieldDescriptions; foreach ( const QVariant &entry, localCustomFieldDescriptions ) { customFieldDescriptions << entry.toMap(); } const CustomField::List globalCustomFields = CustomFieldManager::globalCustomFieldDescriptions(); foreach ( const CustomField &field, globalCustomFields ) { QVariantMap description; description.insert( QLatin1String( "key" ), field.key() ); description.insert( QLatin1String( "title" ), field.title() ); customFieldDescriptions << description; }
void Groupwise::slotReadReceiveAddressees(const KABC::Addressee::List addressees) { kdDebug() << "Groupwise::slotReadReceiveAddressees() - passing " << addressees.count() << " contacts back to application" << endl; KABC::VCardConverter conv; QString vcard = conv.createVCards(addressees); data(vcard.utf8()); }
bool KVCardDrag::populateMimeData( QMimeData *md, const KABC::Addressee::List &addressees ) { KABC::VCardConverter converter; QByteArray vcards = converter.createVCards( addressees ); if ( !vcards.isEmpty() ) { return populateMimeData( md, vcards ); } else { return false; } }
void KOrganizerPlugin::processDropEvent( QDropEvent *event ) { QString text; KABC::VCardConverter converter; if ( KVCardDrag::canDecode( event ) && KVCardDrag::decode( event, text ) ) { KABC::Addressee::List contacts = converter.parseVCards( text ); KABC::Addressee::List::Iterator it; QStringList attendees; for ( it = contacts.begin(); it != contacts.end(); ++it ) { QString email = (*it).fullEmail(); if ( email.isEmpty() ) attendees.append( (*it).realName() + "<>" ); else attendees.append( email ); } interface()->openEventEditor( i18n( "Meeting" ), QString::null, QString::null, attendees ); return; } if ( QTextDrag::decode( event, text ) ) { kdDebug(5602) << "DROP:" << text << endl; interface()->openEventEditor( text ); return; } KPIM::MailList mails; if ( KPIM::MailListDrag::decode( event, mails ) ) { if ( mails.count() != 1 ) { KMessageBox::sorry( core(), i18n("Drops of multiple mails are not supported." ) ); } else { KPIM::MailSummary mail = mails.first(); QString txt = i18n("From: %1\nTo: %2\nSubject: %3").arg( mail.from() ) .arg( mail.to() ).arg( mail.subject() ); KTempFile tf; tf.setAutoDelete( true ); QString uri = QString::fromLatin1("kmail:") + QString::number( mail.serialNumber() ); tf.file()->writeBlock( event->encodedData( "message/rfc822" ) ); tf.close(); interface()->openEventEditor( i18n("Mail: %1").arg( mail.subject() ), txt, uri, tf.name(), QStringList(), "message/rfc822" ); } return; } KMessageBox::sorry( core(), i18n("Cannot handle drop events of type '%1'.") .arg( event->format() ) ); }
void ResourceGroupwise::slotUpdateJobData( KIO::Job *job, const QByteArray &data ) { kdDebug() << "ResourceGroupwise::slotUpdateJobData()" << endl; kdDebug() << " Job address: " << job << endl; KABC::VCardConverter conv; mJobData.append( data.data() ); Addressee::List addressees = conv.parseVCards( mJobData ); Addressee::List::ConstIterator it; for( it = addressees.begin(); it != addressees.end(); ++it ) { KABC::Addressee addr = *it; if ( !addr.isEmpty() ) { // if added or changed QString syncType = addr.custom( "GWRESOURCE", "SYNC" ); QString remote = addr.custom( "GWRESOURCE", "UID" ); QString local = idMapper().localId( remote ); if ( syncType == "ADD" || syncType == "UPD" ) { addr.setResource( this ); if ( local.isEmpty() ) { idMapper().setRemoteId( addr.uid(), remote ); } else { addr.setUid( local ); } insertAddressee( addr ); clearChange( addr ); } else if ( syncType == "DEL" ) { // if deleted if ( !remote.isEmpty() ) { if ( !local.isEmpty() ) { idMapper().removeRemoteId( remote ); KABC::Addressee addrToDelete = findByUid( local ); removeAddressee( addrToDelete ); } } else kdError() << "Addressee to delete did not have a remote UID, unable to find the corresponding local contact" << endl; } } } mJobData = QString::null; }
void ViewManager::startDrag() { // Get the list of all the selected addressees KABC::Addressee::List addrList; const QStringList uidList = selectedUids(); if(uidList.isEmpty()) return; kdDebug(5720) << "ViewManager::startDrag: starting to drag" << endl; QStringList::ConstIterator it; for(it = uidList.begin(); it != uidList.end(); ++it) addrList.append(mCore->addressBook()->findByUid(*it)); KMultipleDrag *drag = new KMultipleDrag(this); KABC::VCardConverter converter; QString vcards = converter.createVCards(addrList); // Best text representation is given by textdrag, so it must be first drag->addDragObject(new QTextDrag(AddresseeUtil::addresseesToEmails(addrList), this)); drag->addDragObject(new KVCardDrag(vcards, this)); KTempDir tempDir; // can't set tempDir to autoDelete, in case of dropping on the desktop, the copy is async... if(tempDir.status() == 0) { QString fileName; if(addrList.count() == 1) fileName = addrList[ 0 ].givenName() + "_" + addrList[ 0 ].familyName() + ".vcf"; else fileName = "contacts.vcf"; QFile tempFile(tempDir.name() + "/" + fileName); if(tempFile.open(IO_WriteOnly)) { tempFile.writeBlock(vcards.utf8()); tempFile.close(); KURLDrag *urlDrag = new KURLDrag(KURL(tempFile.name()), this); drag->addDragObject(urlDrag); } } drag->setPixmap(KGlobal::iconLoader()->loadIcon("vcard", KIcon::Desktop)); drag->dragCopy(); }
bool AddressbookHandler::addAddressees( KABC::Addressee::List& p_addresseeList ) { bool ret = true; KABC::VCardConverter vCardConv; QString vCard; RRA_Uint32Vector* added_ids = rra_uint32vector_new(); if ( p_addresseeList.begin() == p_addresseeList.end() ) { goto finish; } for (KABC::Addressee::List::Iterator it = p_addresseeList.begin(); it != p_addresseeList.end(); ++it ) { incrementSteps(); kdDebug(2120) << "Adding Contact on Device: " << (*it).uid() << endl; vCard = vCardConv.createVCard ( ( *it ) ); uint32_t newObjectId = m_rra->putVCard( vCard, mTypeId, 0 ); if (newObjectId == 0) { addErrorEntry((*it).realName()); ret = false; } m_rra->markIdUnchanged( mTypeId, newObjectId ); mUidHelper->addId("SynCEAddressbook", "RRA-ID-" + QString::number ( newObjectId, 16 ).rightJustify( 8, '0' ), (*it).uid()); kdDebug(2120) << " ID-Pair: KDEID: " << (*it).uid() << " DeviceID: " << "RRA-ID-" + QString::number ( newObjectId, 16 ).rightJustify( 8, '0' ) << endl; rra_uint32vector_add(added_ids, newObjectId); KApplication::kApplication()->processEvents(); } finish: m_rra->registerAddedObjects(mTypeId, added_ids); rra_uint32vector_destroy(added_ids, true); return ret; }
int main( int argc, char **argv ) { KApplication::disableAutoDcopRegistration(); KAboutData aboutData( "testread", "vCard test reader", "0.1" ); aboutData.addAuthor( "Cornelius Schumacher", 0, "*****@*****.**" ); KCmdLineArgs::init( argc, argv, &aboutData ); KCmdLineArgs::addCmdLineOptions( options ); KApplication app( false, false ); KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); if ( args->count() != 1 ) { std::cerr << "Missing argument" << std::endl; return 1; } QString inputFile( args->arg( 0 ) ); QFile file( inputFile ); if ( !file.open( IO_ReadOnly ) ) { qDebug( "Unable to open file '%s' for reading!", file.name().latin1() ); return 1; } QString text; QTextStream s( &file ); s.setEncoding( QTextStream::Latin1 ); text = s.read(); file.close(); KABC::VCardConverter converter; KABC::Addressee::List list = converter.parseVCards( text ); if ( args->isSet( "vcard21" ) ) { text = converter.createVCards( list, KABC::VCardConverter::v2_1 ); // uses version 2.1 } else { text = converter.createVCards( list ); // uses version 3.0 } std::cout << text.utf8(); return 0; }
void ViewManager::dropped(QDropEvent *e) { kdDebug(5720) << "ViewManager::dropped: got a drop event" << endl; // don't allow drops from our own drags if(e->source() == this) return; QString clipText, vcards; KURL::List urls; if(KURLDrag::decode(e, urls)) { KURL::List::ConstIterator it = urls.begin(); int c = urls.count(); if(c > 1) { QString questionString = i18n("Import one contact into your addressbook?", "Import %n contacts into your addressbook?", c); if(KMessageBox::questionYesNo(this, questionString, i18n("Import Contacts?"), i18n("Import"), i18n("Do Not Import")) == KMessageBox::Yes) { for(; it != urls.end(); ++it) emit urlDropped(*it); } } else if(c == 1) emit urlDropped(*it); } else if(KVCardDrag::decode(e, vcards)) { KABC::VCardConverter converter; const KABC::Addressee::List list = converter.parseVCards(vcards); KABC::Addressee::List::ConstIterator it; for(it = list.begin(); it != list.end(); ++it) { KABC::Addressee a = mCore->addressBook()->findByUid((*it).uid()); if(a.isEmpty()) // not yet in address book { mCore->addressBook()->insertAddressee(*it); emit modified(); } } mActiveView->refresh(); } }
void KoRdfFoaF::importFromData(const QByteArray &ba, KoDocumentRdf *_rdf, KoCanvasBase *host) { Q_D (KoRdfFoaF); #ifdef KDEPIMLIBS_FOUND kDebug(30015) << "data.sz:" << ba.size(); kDebug(30015) << "_rdf:" << _rdf; if (_rdf) { d->m_rdf = _rdf; } KABC::VCardConverter converter; KABC::Addressee addr = converter.parseVCard(ba); d->fromKABC(addr); kDebug(30015) << "adding name:" << d->m_name; kDebug(30015) << "uri:" << d->m_uri; importFromDataComplete(ba, documentRdf(), host); #else kDebug(30015) << "KDEPIM support not built!"; #endif }
bool AddressbookHandler::retrieveAddresseeListFromDevice( KABC::Addressee::List &mAddresseeList, QValueList<uint32_t> &idList ) { KABC::VCardConverter vCardConv; bool ret = true; for ( QValueList<uint32_t>::const_iterator it = idList.begin(); it != idList.end(); ++it ) { incrementSteps(); kdDebug(2120) << "Retrieving Contact from device: " << "RRA-ID-" + QString::number ( *it, 16 ).rightJustify( 8, '0' ) << endl; QString vCard = m_rra->getVCard( mTypeId, *it ); if (vCard.isEmpty()) { addErrorEntry("RRA-ID-" + QString::number ( *it, 16 ).rightJustify( 8, '0' )); ret = false; } KABC::Addressee addr = vCardConv.parseVCard ( vCard ); addr.setFormattedName(addr.formattedName().replace("\\,", ",")); QString kdeId; if ((kdeId = mUidHelper->kdeId("SynCEAddressbook", addr.uid(), "---")) != "---") { addr.setUid(kdeId); } else { mUidHelper->addId("SynCEAddressbook", addr.uid(), addr.uid()); } kdDebug(2120) << " ID-Pair: KDEID: " << addr.uid() << " DeviceID: " << "RRA-ID-" + QString::number ( *it, 16 ).rightJustify( 8, '0' ) << endl; mAddresseeList.push_back( addr ); KApplication::kApplication()->processEvents(); } return ret; }
bool AddressbookHandler::updateAddressees( KABC::Addressee::List& p_addresseeList ) { bool ret = true; KABC::Addressee::List::Iterator it = p_addresseeList.begin(); KABC::VCardConverter vCardConv; QString vCard; if ( p_addresseeList.begin() == p_addresseeList.end() ) { goto finish; } setStatus("Writing changed Contacts"); for ( ; it != p_addresseeList.end(); ++it ) { incrementSteps(); QString kUid = mUidHelper->konnectorId("SynCEAddressbook", (*it).uid(), "---"); if (kUid != "---") { kdDebug(2120) << "Updating Contact on Device: " << "ID-Pair: KDEID: " << (*it).uid() << " DeviceId: " << kUid << endl; vCard = vCardConv.createVCard ( ( *it ) ); uint32_t retId = m_rra->putVCard ( vCard, mTypeId, getOriginalId( kUid ) ); if (retId == 0) { addErrorEntry((*it).realName()); ret = false; } m_rra->markIdUnchanged( mTypeId, getOriginalId( kUid ) ); } KApplication::kApplication()->processEvents(); } finish: return ret; }
bool VCardXXPort::exportContacts( const KABC::AddresseeList &addrList, const QString &data ) { KABC::VCardConverter converter; KURL url; KABC::AddresseeList list; list = filterContacts( addrList ); bool ok = true; if ( list.isEmpty() ) { return ok; } else if ( list.count() == 1 ) { url = KFileDialog::getSaveURL( list[ 0 ].givenName() + "_" + list[ 0 ].familyName() + ".vcf" ); if ( url.isEmpty() ) return true; if ( data == "v21" ) ok = doExport( url, converter.createVCards( list, KABC::VCardConverter::v2_1 ) ); else ok = doExport( url, converter.createVCards( list, KABC::VCardConverter::v3_0 ) ); } else { QString msg = i18n( "You have selected a list of contacts, shall they be " "exported to several files?" ); switch ( KMessageBox::questionYesNo( parentWidget(), msg, QString::null, i18n("Export to Several Files"), i18n("Export to One File") ) ) { case KMessageBox::Yes: { KURL baseUrl = KFileDialog::getExistingURL(); if ( baseUrl.isEmpty() ) return true; KABC::AddresseeList::ConstIterator it; uint counter = 0; for ( it = list.begin(); it != list.end(); ++it ) { QString testUrl; if ( (*it).givenName().isEmpty() && (*it).familyName().isEmpty() ) testUrl = baseUrl.url() + "/" + (*it).organization(); else testUrl = baseUrl.url() + "/" + (*it).givenName() + "_" + (*it).familyName(); if ( KIO::NetAccess::exists( testUrl + (counter == 0 ? "" : QString::number( counter )) + ".vcf", false, parentWidget() ) ) { counter++; url = testUrl + QString::number( counter ) + ".vcf"; } else url = testUrl + ".vcf"; bool tmpOk; KABC::AddresseeList tmpList; tmpList.append( *it ); if ( data == "v21" ) tmpOk = doExport( url, converter.createVCards( tmpList, KABC::VCardConverter::v2_1 ) ); else tmpOk = doExport( url, converter.createVCards( tmpList, KABC::VCardConverter::v3_0 ) ); ok = ok && tmpOk; } break; } case KMessageBox::No: default: { url = KFileDialog::getSaveURL( "addressbook.vcf" ); if ( url.isEmpty() ) return true; if ( data == "v21" ) ok = doExport( url, converter.createVCards( list, KABC::VCardConverter::v2_1 ) ); else ok = doExport( url, converter.createVCards( list, KABC::VCardConverter::v3_0 ) ); } } } return ok; }
QString KTnef::msTNEFToVPart( const QByteArray &tnef ) { bool bOk = false; KTNEFParser parser; QByteArray b( tnef ); QBuffer buf( &b ); MemoryCalendar::Ptr cal( new MemoryCalendar( KDateTime::UTC ) ); KABC::Addressee addressee; ICalFormat calFormat; Event::Ptr event( new Event() ); if ( parser.openDevice( &buf ) ) { KTNEFMessage *tnefMsg = parser.message(); //QMap<int,KTNEFProperty*> props = parser.message()->properties(); // Everything depends from property PR_MESSAGE_CLASS // (this is added by KTNEFParser): QString msgClass = tnefMsg->findProp( 0x001A, QString(), true ).toUpper(); if ( !msgClass.isEmpty() ) { // Match the old class names that might be used by Outlook for // compatibility with Microsoft Mail for Windows for Workgroups 3.1. bool bCompatClassAppointment = false; bool bCompatMethodRequest = false; bool bCompatMethodCancled = false; bool bCompatMethodAccepted = false; bool bCompatMethodAcceptedCond = false; bool bCompatMethodDeclined = false; if ( msgClass.startsWith( QLatin1String( "IPM.MICROSOFT SCHEDULE." ) ) ) { bCompatClassAppointment = true; if ( msgClass.endsWith( QLatin1String( ".MTGREQ" ) ) ) { bCompatMethodRequest = true; } if ( msgClass.endsWith( QLatin1String( ".MTGCNCL" ) ) ) { bCompatMethodCancled = true; } if ( msgClass.endsWith( QLatin1String( ".MTGRESPP" ) ) ) { bCompatMethodAccepted = true; } if ( msgClass.endsWith( QLatin1String( ".MTGRESPA" ) ) ) { bCompatMethodAcceptedCond = true; } if ( msgClass.endsWith( QLatin1String( ".MTGRESPN" ) ) ) { bCompatMethodDeclined = true; } } bool bCompatClassNote = ( msgClass == "IPM.MICROSOFT MAIL.NOTE" ); if ( bCompatClassAppointment || "IPM.APPOINTMENT" == msgClass ) { // Compose a vCal bool bIsReply = false; QString prodID = "-//Microsoft Corporation//Outlook "; prodID += tnefMsg->findNamedProp( "0x8554", "9.0" ); prodID += "MIMEDIR/EN\n"; prodID += "VERSION:2.0\n"; calFormat.setApplication( "Outlook", prodID ); iTIPMethod method; if ( bCompatMethodRequest ) { method = iTIPRequest; } else if ( bCompatMethodCancled ) { method = iTIPCancel; } else if ( bCompatMethodAccepted || bCompatMethodAcceptedCond || bCompatMethodDeclined ) { method = iTIPReply; bIsReply = true; } else { // pending(khz): verify whether "0x0c17" is the right tag ??? // // at the moment we think there are REQUESTS and UPDATES // // but WHAT ABOUT REPLIES ??? // // if ( tnefMsg->findProp(0x0c17) == "1" ) { bIsReply = true; } method = iTIPRequest; } /// ### FIXME Need to get this attribute written ScheduleMessage schedMsg( event, method, ScheduleMessage::Unknown ); QString sSenderSearchKeyEmail( tnefMsg->findProp( 0x0C1D ) ); if ( !sSenderSearchKeyEmail.isEmpty() ) { int colon = sSenderSearchKeyEmail.indexOf( ':' ); // May be e.g. "SMTP:[email protected]" if ( sSenderSearchKeyEmail.indexOf( ':' ) == -1 ) { sSenderSearchKeyEmail.remove( 0, colon+1 ); } } QString s( tnefMsg->findProp( 0x8189 ) ); const QStringList attendees = s.split( ';' ); if ( attendees.count() ) { for ( QStringList::const_iterator it = attendees.begin(); it != attendees.end(); ++it ) { // Skip all entries that have no '@' since these are // no mail addresses if ( (*it).indexOf( '@' ) == -1 ) { s = (*it).trimmed(); Attendee::Ptr attendee( new Attendee( s, s, true ) ); if ( bIsReply ) { if ( bCompatMethodAccepted ) { attendee->setStatus( Attendee::Accepted ); } if ( bCompatMethodDeclined ) { attendee->setStatus( Attendee::Declined ); } if ( bCompatMethodAcceptedCond ) { attendee->setStatus( Attendee::Tentative ); } } else { attendee->setStatus( Attendee::NeedsAction ); attendee->setRole( Attendee::ReqParticipant ); } event->addAttendee( attendee ); } } } else { // Oops, no attendees? // This must be old style, let us use the PR_SENDER_SEARCH_KEY. s = sSenderSearchKeyEmail; if ( !s.isEmpty() ) { Attendee::Ptr attendee( new Attendee( QString(), QString(), true ) ); if ( bIsReply ) { if ( bCompatMethodAccepted ) { attendee->setStatus( Attendee::Accepted ); } if ( bCompatMethodAcceptedCond ) { attendee->setStatus( Attendee::Declined ); } if ( bCompatMethodDeclined ) { attendee->setStatus( Attendee::Tentative ); } } else { attendee->setStatus( Attendee::NeedsAction ); attendee->setRole( Attendee::ReqParticipant ); } event->addAttendee( attendee ); } } s = tnefMsg->findProp( 0x3ff8 ); // look for organizer property if ( s.isEmpty() && !bIsReply ) { s = sSenderSearchKeyEmail; } // TODO: Use the common name? if ( !s.isEmpty() ) { event->setOrganizer( s ); } s = tnefMsg->findProp( 0x819b ).remove( QChar( '-' ) ).remove( QChar( ':' ) ); event->setDtStart( KDateTime::fromString( s ) ); // ## Format?? s = tnefMsg->findProp( 0x819c ).remove( QChar( '-' ) ).remove( QChar( ':' ) ); event->setDtEnd( KDateTime::fromString( s ) ); s = tnefMsg->findProp( 0x810d ); event->setLocation( s ); // is it OK to set this to OPAQUE always ?? //vPart += "TRANSP:OPAQUE\n"; ###FIXME, portme! //vPart += "SEQUENCE:0\n"; // is "0x0023" OK - or should we look for "0x0003" ?? s = tnefMsg->findProp( 0x0023 ); event->setUid( s ); // PENDING(khz): is this value in local timezone? Must it be // adjusted? Most likely this is a bug in the server or in // Outlook - we ignore it for now. s = tnefMsg->findProp( 0x8202 ).remove( QChar( '-' ) ).remove( QChar( ':' ) ); // ### kcal always uses currentDateTime() // event->setDtStamp( QDateTime::fromString( s ) ); s = tnefMsg->findNamedProp( "Keywords" ); event->setCategories( s ); s = tnefMsg->findProp( 0x1000 ); event->setDescription( s ); s = tnefMsg->findProp( 0x0070 ); event->setSummary( s ); s = tnefMsg->findProp( 0x0026 ); event->setPriority( s.toInt() ); // is reminder flag set ? if ( !tnefMsg->findProp( 0x8503 ).isEmpty() ) { Alarm::Ptr alarm( new Alarm( event.data() ) ); // TODO: fix when KCalCore::Alarm is fixed KDateTime highNoonTime = pureISOToLocalQDateTime( tnefMsg->findProp( 0x8502 ). remove( QChar( '-' ) ).remove( QChar( ':' ) ) ); KDateTime wakeMeUpTime = pureISOToLocalQDateTime( tnefMsg->findProp( 0x8560, "" ). remove( QChar( '-' ) ).remove( QChar( ':' ) ) ); alarm->setTime( wakeMeUpTime ); if ( highNoonTime.isValid() && wakeMeUpTime.isValid() ) { alarm->setStartOffset( Duration( highNoonTime, wakeMeUpTime ) ); } else { // default: wake them up 15 minutes before the appointment alarm->setStartOffset( Duration( 15 * 60 ) ); } alarm->setDisplayAlarm( i18n( "Reminder" ) ); // Sorry: the different action types are not known (yet) // so we always set 'DISPLAY' (no sounds, no images...) event->addAlarm( alarm ); } //ensure we have a uid for this event if ( event->uid().isEmpty() ) { event->setUid( CalFormat::createUniqueId() ); } cal->addEvent( event ); bOk = true; // we finished composing a vCal } else if ( bCompatClassNote || "IPM.CONTACT" == msgClass ) { addressee.setUid( stringProp( tnefMsg, attMSGID ) ); addressee.setFormattedName( stringProp( tnefMsg, MAPI_TAG_PR_DISPLAY_NAME ) ); addressee.insertEmail( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_EMAIL1EMAILADDRESS ), true ); addressee.insertEmail( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_EMAIL2EMAILADDRESS ), false ); addressee.insertEmail( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_EMAIL3EMAILADDRESS ), false ); addressee.insertCustom( "KADDRESSBOOK", "X-IMAddress", sNamedProp( tnefMsg, MAPI_TAG_CONTACT_IMADDRESS ) ); addressee.insertCustom( "KADDRESSBOOK", "X-SpousesName", stringProp( tnefMsg, MAPI_TAG_PR_SPOUSE_NAME ) ); addressee.insertCustom( "KADDRESSBOOK", "X-ManagersName", stringProp( tnefMsg, MAPI_TAG_PR_MANAGER_NAME ) ); addressee.insertCustom( "KADDRESSBOOK", "X-AssistantsName", stringProp( tnefMsg, MAPI_TAG_PR_ASSISTANT ) ); addressee.insertCustom( "KADDRESSBOOK", "X-Department", stringProp( tnefMsg, MAPI_TAG_PR_DEPARTMENT_NAME ) ); addressee.insertCustom( "KADDRESSBOOK", "X-Office", stringProp( tnefMsg, MAPI_TAG_PR_OFFICE_LOCATION ) ); addressee.insertCustom( "KADDRESSBOOK", "X-Profession", stringProp( tnefMsg, MAPI_TAG_PR_PROFESSION ) ); QString s = tnefMsg->findProp( MAPI_TAG_PR_WEDDING_ANNIVERSARY ). remove( QChar( '-' ) ).remove( QChar( ':' ) ); if ( !s.isEmpty() ) { addressee.insertCustom( "KADDRESSBOOK", "X-Anniversary", s ); } addressee.setUrl( KUrl( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_WEBPAGE ) ) ); // collect parts of Name entry addressee.setFamilyName( stringProp( tnefMsg, MAPI_TAG_PR_SURNAME ) ); addressee.setGivenName( stringProp( tnefMsg, MAPI_TAG_PR_GIVEN_NAME ) ); addressee.setAdditionalName( stringProp( tnefMsg, MAPI_TAG_PR_MIDDLE_NAME ) ); addressee.setPrefix( stringProp( tnefMsg, MAPI_TAG_PR_DISPLAY_NAME_PREFIX ) ); addressee.setSuffix( stringProp( tnefMsg, MAPI_TAG_PR_GENERATION ) ); addressee.setNickName( stringProp( tnefMsg, MAPI_TAG_PR_NICKNAME ) ); addressee.setRole( stringProp( tnefMsg, MAPI_TAG_PR_TITLE ) ); addressee.setOrganization( stringProp( tnefMsg, MAPI_TAG_PR_COMPANY_NAME ) ); /* the MAPI property ID of this (multiline) )field is unknown: vPart += stringProp(tnefMsg, "\n","NOTE", ... , "" ); */ KABC::Address adr; adr.setPostOfficeBox( stringProp( tnefMsg, MAPI_TAG_PR_HOME_ADDRESS_PO_BOX ) ); adr.setStreet( stringProp( tnefMsg, MAPI_TAG_PR_HOME_ADDRESS_STREET ) ); adr.setLocality( stringProp( tnefMsg, MAPI_TAG_PR_HOME_ADDRESS_CITY ) ); adr.setRegion( stringProp( tnefMsg, MAPI_TAG_PR_HOME_ADDRESS_STATE_OR_PROVINCE ) ); adr.setPostalCode( stringProp( tnefMsg, MAPI_TAG_PR_HOME_ADDRESS_POSTAL_CODE ) ); adr.setCountry( stringProp( tnefMsg, MAPI_TAG_PR_HOME_ADDRESS_COUNTRY ) ); adr.setType( KABC::Address::Home ); addressee.insertAddress( adr ); adr.setPostOfficeBox( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_BUSINESSADDRESSPOBOX ) ); adr.setStreet( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_BUSINESSADDRESSSTREET ) ); adr.setLocality( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_BUSINESSADDRESSCITY ) ); adr.setRegion( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_BUSINESSADDRESSSTATE ) ); adr.setPostalCode( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_BUSINESSADDRESSPOSTALCODE ) ); adr.setCountry( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_BUSINESSADDRESSCOUNTRY ) ); adr.setType( KABC::Address::Work ); addressee.insertAddress( adr ); adr.setPostOfficeBox( stringProp( tnefMsg, MAPI_TAG_PR_OTHER_ADDRESS_PO_BOX ) ); adr.setStreet( stringProp( tnefMsg, MAPI_TAG_PR_OTHER_ADDRESS_STREET ) ); adr.setLocality( stringProp( tnefMsg, MAPI_TAG_PR_OTHER_ADDRESS_CITY ) ); adr.setRegion( stringProp( tnefMsg, MAPI_TAG_PR_OTHER_ADDRESS_STATE_OR_PROVINCE ) ); adr.setPostalCode( stringProp( tnefMsg, MAPI_TAG_PR_OTHER_ADDRESS_POSTAL_CODE ) ); adr.setCountry( stringProp( tnefMsg, MAPI_TAG_PR_OTHER_ADDRESS_COUNTRY ) ); adr.setType( KABC::Address::Dom ); addressee.insertAddress( adr ); // problem: the 'other' address was stored by KOrganizer in // a line looking like the following one: // vPart += "\nADR;TYPE=dom;TYPE=intl;TYPE=parcel;TYPE=postal;TYPE=work;" // "TYPE=home:other_pobox;;other_str1\nother_str2;other_loc;other_region;" // "other_pocode;other_country" QString nr; nr = stringProp( tnefMsg, MAPI_TAG_PR_HOME_TELEPHONE_NUMBER ); addressee.insertPhoneNumber( KABC::PhoneNumber( nr, KABC::PhoneNumber::Home ) ); nr = stringProp( tnefMsg, MAPI_TAG_PR_BUSINESS_TELEPHONE_NUMBER ); addressee.insertPhoneNumber( KABC::PhoneNumber( nr, KABC::PhoneNumber::Work ) ); nr = stringProp( tnefMsg, MAPI_TAG_PR_MOBILE_TELEPHONE_NUMBER ); addressee.insertPhoneNumber( KABC::PhoneNumber( nr, KABC::PhoneNumber::Cell ) ); nr = stringProp( tnefMsg, MAPI_TAG_PR_HOME_FAX_NUMBER ); addressee.insertPhoneNumber( KABC::PhoneNumber( nr, KABC::PhoneNumber::Fax | KABC::PhoneNumber::Home ) ); nr = stringProp( tnefMsg, MAPI_TAG_PR_BUSINESS_FAX_NUMBER ); addressee.insertPhoneNumber( KABC::PhoneNumber( nr, KABC::PhoneNumber::Fax | KABC::PhoneNumber::Work ) ); s = tnefMsg->findProp( MAPI_TAG_PR_BIRTHDAY ). remove( QChar( '-' ) ).remove( QChar( ':' ) ); if ( !s.isEmpty() ) { addressee.setBirthday( QDateTime::fromString( s ) ); } bOk = ( !addressee.isEmpty() ); } else if ( "IPM.NOTE" == msgClass ) { } // else if ... and so on ... } } // Compose return string // KDAB_TODO: Interesting, without the explicit QString the toString call is // reported to be ambigious with toString( const Incidence::Ptr & ). const QString iCal = calFormat.toString( cal, QString() ); if ( !iCal.isEmpty() ) { // This was an iCal return iCal; } // Not an iCal - try a vCard KABC::VCardConverter converter; return QString::fromUtf8( converter.createVCard( addressee ) ); }
bool VCard_LDIFCreator::readContents( const QString &path ) { // read file contents QFile file( path ); if ( !file.open( QIODevice::ReadOnly ) ) return false; QString info; text.truncate(0); // read the file QByteArray contents = file.readAll(); file.close(); // convert the file contents to a KABC::Addressee address KABC::Addressee::List addrList; KABC::Addressee addr; KABC::VCardConverter converter; addrList = converter.parseVCards( contents); if ( addrList.count() == 0 ) { KABC::AddresseeList l; // FIXME porting if ( !KABC::LDIFConverter::LDIFToAddressee( contents, l ) ) return false; // FIXME porting KABC::AddresseeList::ConstIterator it( l.constBegin() ); for ( ; it != l.constEnd(); ++ it ) { addrList.append( *it ); } } if ( addrList.count()>1 ) { // create an overview (list of all names) name = i18np("One contact found:", "%1 contacts found:", addrList.count()); int no, linenr; for (linenr=no=0; linenr<30 && no<addrList.count(); ++no) { addr = addrList[no]; info = addr.formattedName().simplified(); if (info.isEmpty()) info = addr.givenName() + ' ' + addr.familyName(); info = info.simplified(); if (info.isEmpty()) continue; text.append(info); text.append("\n"); ++linenr; } return true; } // create card for _one_ contact addr = addrList[ 0 ]; // prepare the text name = addr.formattedName().simplified(); if ( name.isEmpty() ) name = addr.givenName() + ' ' + addr.familyName(); name = name.simplified(); KABC::PhoneNumber::List pnList = addr.phoneNumbers(); QStringList phoneNumbers; for (int no=0; no<pnList.count(); ++no) { QString pn = pnList[no].number().simplified(); if (!pn.isEmpty() && !phoneNumbers.contains(pn)) phoneNumbers.append(pn); } if ( !phoneNumbers.isEmpty() ) text += phoneNumbers.join("\n") + '\n'; info = addr.organization().simplified(); if ( !info.isEmpty() ) text += info + '\n'; // get an address KABC::Address address = addr.address(KABC::Address::Work); if (address.isEmpty()) address = addr.address(KABC::Address::Home); if (address.isEmpty()) address = addr.address(KABC::Address::Pref); info = address.formattedAddress(); if ( !info.isEmpty() ) text += info + '\n'; return true; }
QString AddresseeUtil::addresseesToClipboard(const KABC::Addressee::List &list) { KABC::VCardConverter converter; return converter.createVCards(list); }
KABC::Addressee::List AddresseeUtil::clipboardToAddressees(const QString &data) { KABC::VCardConverter converter; return converter.parseVCards(data); }
KABC::AddresseeList VCardXXPort::parseVCard( const QString &data ) const { KABC::VCardConverter converter; return converter.parseVCards( data ); }