/*************************************************************************** dlgjabbervcard.cpp - vCard dialog ------------------- begin : Thu Aug 08 2002 copyright : (C) 2002-2003 by Till Gerken (C) 2005 by Michaƫl Larouche email : kopete-devel@kde.org Rewritten version of the original dialog ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include "dlgjabbervcard.h" // TQt includes #include #include #include #include // KDE includes #include #include #include #include #include #include #include #include #include #include #include // libiris(XMPP backend) includes #include "im.h" #include "xmpp.h" #include "xmpp_tasks.h" // Kopete includes #include "jabberprotocol.h" #include "jabbercontact.h" #include "jabberaccount.h" #include "jabbercontactpool.h" #include "jabberbasecontact.h" #include "jabberclient.h" #include "dlgvcard.h" /* * Constructs a dlgJabberVCard which is a child of 'parent', with the * name 'name' * */ dlgJabberVCard::dlgJabberVCard (JabberAccount *account, JabberBaseContact *contact, TQWidget * parent, const char *name) : KDialogBase (parent, name, false, i18n("Jabber vCard"), Close | User1 | User2, Close, false, i18n("&Save User Info"), i18n("&Fetch vCard") ) { m_account = account; m_contact = contact; m_mainWidget = new dlgVCard(this); setMainWidget(m_mainWidget); connect (this, TQT_SIGNAL (user1Clicked()), this, TQT_SLOT (slotSaveVCard ())); connect (this, TQT_SIGNAL( user2Clicked()), this, TQT_SLOT (slotGetVCard ())); connect (m_mainWidget->btnSelectPhoto, TQT_SIGNAL (clicked()), this, TQT_SLOT (slotSelectPhoto())); connect (m_mainWidget->btnClearPhoto, TQT_SIGNAL (clicked()), this, TQT_SLOT (slotClearPhoto())); connect (m_mainWidget->urlHomeEmail, TQT_SIGNAL (leftClickedURL(const TQString &)), this, TQT_SLOT (slotOpenURL (const TQString &))); connect (m_mainWidget->urlWorkEmail, TQT_SIGNAL (leftClickedURL(const TQString &)), this, TQT_SLOT (slotOpenURL (const TQString &))); connect (m_mainWidget->urlHomepage, TQT_SIGNAL (leftClickedURL(const TQString &)), this, TQT_SLOT (slotOpenURL (const TQString &))); assignContactProperties(); show (); raise (); slotGetVCard(); } /* * Destroys the object and frees any allocated resources */ dlgJabberVCard::~dlgJabberVCard () { // no need to delete child widgets, TQt does it all for us } /* * Activated when the close button gets pressed. Deletes the dialog. */ void dlgJabberVCard::slotClose() { kdDebug(JABBER_DEBUG_GLOBAL) << k_funcinfo << "Deleting dialog." << endl; delayedDestruct(); } /* * Assign the contact properties to this dialog */ void dlgJabberVCard::assignContactProperties () { // general tab m_mainWidget->leNick->setText (m_contact->property(m_account->protocol()->propNickName).value().toString()); m_mainWidget->leName->setText (m_contact->property(m_account->protocol()->propFullName).value().toString()); // Guess the JID from the Kopete::Contact if the propJid is empty. if( m_contact->property( m_account->protocol()->propJid ).value().toString().isEmpty() ) m_mainWidget->leJID->setText (m_contact->rosterItem().jid().full()); else m_mainWidget->leJID->setText (m_contact->property(m_account->protocol()->propJid).value().toString()); m_mainWidget->leBirthday->setText (m_contact->property(m_account->protocol()->propBirthday).value().toString()); m_mainWidget->leTimezone->setText (m_contact->property(m_account->protocol()->propTimezone).value().toString()); TQString homepage = m_contact->property(m_account->protocol()->propHomepage).value().toString(); m_mainWidget->leHomepage->setText (homepage); m_mainWidget->urlHomepage->setText (homepage); m_mainWidget->urlHomepage->setURL (homepage); m_mainWidget->urlHomepage->setUseCursor ( !homepage.isEmpty () ); // Set photo m_photoPath = m_contact->property(m_account->protocol()->propPhoto).value().toString(); if( !m_photoPath.isEmpty() ) { m_mainWidget->lblPhoto->setPixmap( TQPixmap(m_photoPath) ); } // addresses m_mainWidget->leWorkStreet->setText (m_contact->property(m_account->protocol()->propWorkStreet).value().toString()); m_mainWidget->leWorkExtAddr->setText (m_contact->property(m_account->protocol()->propWorkExtAddr).value().toString()); m_mainWidget->leWorkPOBox->setText (m_contact->property(m_account->protocol()->propWorkPOBox).value().toString()); m_mainWidget->leWorkCity->setText (m_contact->property(m_account->protocol()->propWorkCity).value().toString()); m_mainWidget->leWorkPostalCode->setText (m_contact->property(m_account->protocol()->propWorkPostalCode).value().toString()); m_mainWidget->leWorkCountry->setText (m_contact->property(m_account->protocol()->propWorkCountry).value().toString()); m_mainWidget->leHomeStreet->setText (m_contact->property(m_account->protocol()->propHomeStreet).value().toString()); m_mainWidget->leHomeExtAddr->setText (m_contact->property(m_account->protocol()->propHomeExtAddr).value().toString()); m_mainWidget->leHomePOBox->setText (m_contact->property(m_account->protocol()->propHomePOBox).value().toString()); m_mainWidget->leHomeCity->setText (m_contact->property(m_account->protocol()->propHomeCity).value().toString()); m_mainWidget->leHomePostalCode->setText (m_contact->property(m_account->protocol()->propHomePostalCode).value().toString()); m_mainWidget->leHomeCountry->setText (m_contact->property(m_account->protocol()->propHomeCountry).value().toString()); // email m_mainWidget->urlWorkEmail->setUseCursor ( false ); m_mainWidget->urlHomeEmail->setUseCursor ( false ); TQString workEmail = m_contact->property(m_account->protocol()->propWorkEmailAddress).value().toString(); TQString homeEmail = m_contact->property(m_account->protocol()->propEmailAddress).value().toString(); m_mainWidget->leWorkEmail->setText (workEmail); m_mainWidget->urlWorkEmail->setText (workEmail); m_mainWidget->urlWorkEmail->setURL ("mailto:" + workEmail); bool enableMail=!workEmail.stripWhiteSpace().isEmpty (); m_mainWidget->urlWorkEmail->setUseCursor ( enableMail ); m_mainWidget->urlWorkEmail->setEnabled ( enableMail ); m_mainWidget->leHomeEmail->setText (homeEmail); m_mainWidget->urlHomeEmail->setText (homeEmail); enableMail=!homeEmail.stripWhiteSpace().isEmpty (); m_mainWidget->urlHomeEmail->setURL ("mailto:" + homeEmail); m_mainWidget->urlHomeEmail->setUseCursor ( enableMail ); m_mainWidget->urlHomeEmail->setEnabled ( enableMail ); // work information tab m_mainWidget->leCompany->setText (m_contact->property(m_account->protocol()->propCompanyName).value().toString()); m_mainWidget->leDepartment->setText (m_contact->property(m_account->protocol()->propCompanyDepartement).value().toString()); m_mainWidget->lePosition->setText (m_contact->property(m_account->protocol()->propCompanyPosition).value().toString()); m_mainWidget->leRole->setText (m_contact->property(m_account->protocol()->propCompanyRole).value().toString()); // phone numbers tab m_mainWidget->lePhoneFax->setText(m_contact->property(m_account->protocol()->propPhoneFax).value().toString()); m_mainWidget->lePhoneWork->setText(m_contact->property(m_account->protocol()->propWorkPhone).value().toString()); m_mainWidget->lePhoneCell->setText(m_contact->property(m_account->protocol()->propPrivateMobilePhone).value().toString()); m_mainWidget->lePhoneHome->setText(m_contact->property(m_account->protocol()->propPrivatePhone).value().toString()); // about tab m_mainWidget->teAbout->setText (m_contact->property(m_account->protocol()->propAbout).value().toString()); if(m_account->myself() == m_contact) setReadOnly (false); else setReadOnly (true); } void dlgJabberVCard::setReadOnly (bool state) { // general tab m_mainWidget->leNick->setReadOnly (state); m_mainWidget->leName->setReadOnly (state); m_mainWidget->leJID->setReadOnly (state); m_mainWidget->leBirthday->setReadOnly (state); m_mainWidget->leTimezone->setReadOnly (state); m_mainWidget->wsHomepage->raiseWidget(state ? 0 : 1); // Disable photo buttons when read only m_mainWidget->btnSelectPhoto->setEnabled(!state); m_mainWidget->btnClearPhoto->setEnabled(!state); // home address tab m_mainWidget->leHomeStreet->setReadOnly (state); m_mainWidget->leHomeExtAddr->setReadOnly (state); m_mainWidget->leHomePOBox->setReadOnly (state); m_mainWidget->leHomeCity->setReadOnly (state); m_mainWidget->leHomePostalCode->setReadOnly (state); m_mainWidget->leHomeCountry->setReadOnly (state); m_mainWidget->wsHomeEmail->raiseWidget(state ? 0 : 1); // work address tab m_mainWidget->leWorkStreet->setReadOnly (state); m_mainWidget->leWorkExtAddr->setReadOnly (state); m_mainWidget->leWorkPOBox->setReadOnly (state); m_mainWidget->leWorkCity->setReadOnly (state); m_mainWidget->leWorkPostalCode->setReadOnly (state); m_mainWidget->leWorkCountry->setReadOnly (state); m_mainWidget->wsWorkEmail->raiseWidget(state ? 0 : 1); // work information tab m_mainWidget->leCompany->setReadOnly (state); m_mainWidget->leDepartment->setReadOnly (state); m_mainWidget->lePosition->setReadOnly (state); m_mainWidget->leRole->setReadOnly (state); // phone numbers tab m_mainWidget->lePhoneHome->setReadOnly (state); m_mainWidget->lePhoneWork->setReadOnly (state); m_mainWidget->lePhoneFax->setReadOnly (state); m_mainWidget->lePhoneCell->setReadOnly (state); // about tab m_mainWidget->teAbout->setReadOnly (state); // save button enableButton(User1, !state); } void dlgJabberVCard::setEnabled(bool state) { // general tab m_mainWidget->leNick->setEnabled (state); m_mainWidget->leName->setEnabled (state); m_mainWidget->leJID->setEnabled (state); m_mainWidget->leBirthday->setEnabled (state); m_mainWidget->leTimezone->setEnabled (state); m_mainWidget->wsHomepage->raiseWidget(state ? 1 : 0); // Disable photo buttons when read only m_mainWidget->btnSelectPhoto->setEnabled(state); m_mainWidget->btnClearPhoto->setEnabled(state); // home address tab m_mainWidget->leHomeStreet->setEnabled (state); m_mainWidget->leHomeExtAddr->setEnabled (state); m_mainWidget->leHomePOBox->setEnabled (state); m_mainWidget->leHomeCity->setEnabled (state); m_mainWidget->leHomePostalCode->setEnabled (state); m_mainWidget->leHomeCountry->setEnabled (state); m_mainWidget->wsHomeEmail->raiseWidget(state ? 0 : 1); // work address tab m_mainWidget->leWorkStreet->setEnabled (state); m_mainWidget->leWorkExtAddr->setEnabled (state); m_mainWidget->leWorkPOBox->setEnabled (state); m_mainWidget->leWorkCity->setEnabled (state); m_mainWidget->leWorkPostalCode->setEnabled (state); m_mainWidget->leWorkCountry->setEnabled (state); m_mainWidget->wsWorkEmail->raiseWidget(state ? 0 : 1); // work information tab m_mainWidget->leCompany->setEnabled (state); m_mainWidget->leDepartment->setEnabled (state); m_mainWidget->lePosition->setEnabled (state); m_mainWidget->leRole->setEnabled (state); // phone numbers tab m_mainWidget->lePhoneHome->setEnabled (state); m_mainWidget->lePhoneWork->setEnabled (state); m_mainWidget->lePhoneFax->setEnabled (state); m_mainWidget->lePhoneCell->setEnabled (state); // about tab m_mainWidget->teAbout->setEnabled (state); // save button enableButton(User1, state); enableButton(User2, state); } /* * Saves a vCard to the contact properties */ void dlgJabberVCard::slotSaveVCard() { setEnabled(false); m_mainWidget->lblStatus->setText( i18n("Saving vCard to server...") ); XMPP::VCard vCard; XMPP::VCard::AddressList addressList; XMPP::VCard::EmailList emailList; XMPP::VCard::PhoneList phoneList; // General information vCard.setNickName( m_mainWidget->leNick->text() ); vCard.setFullName( m_mainWidget->leName->text() ); vCard.setJid( m_mainWidget->leJID->text() ); vCard.setBdayStr( m_mainWidget->leBirthday->text() ); vCard.setTimezone( m_mainWidget->leTimezone->text() ); vCard.setUrl( m_mainWidget->leHomepage->text() ); // home address tab XMPP::VCard::Address homeAddress; homeAddress.home = true; homeAddress.street = m_mainWidget->leHomeStreet->text(); homeAddress.extaddr = m_mainWidget->leHomeExtAddr->text(); homeAddress.pobox = m_mainWidget->leHomePOBox->text(); homeAddress.locality = m_mainWidget->leHomeCity->text(); homeAddress.pcode = m_mainWidget->leHomePostalCode->text(); homeAddress.country = m_mainWidget->leHomeCountry->text(); // work address tab XMPP::VCard::Address workAddress; workAddress.work = true; workAddress.street = m_mainWidget->leWorkStreet->text(); workAddress.extaddr = m_mainWidget->leWorkExtAddr->text(); workAddress.pobox = m_mainWidget->leWorkPOBox->text(); workAddress.locality = m_mainWidget->leWorkCity->text(); workAddress.pcode = m_mainWidget->leWorkPostalCode->text(); workAddress.country = m_mainWidget->leWorkCountry->text(); addressList.append(homeAddress); addressList.append(workAddress); vCard.setAddressList(addressList); // home email XMPP::VCard::Email homeEmail; homeEmail.home = true; homeEmail.userid = m_mainWidget->leHomeEmail->text(); // work email XMPP::VCard::Email workEmail; workEmail.work = true; workEmail.userid = m_mainWidget->leWorkEmail->text(); emailList.append(homeEmail); emailList.append(workEmail); vCard.setEmailList(emailList); // work information tab XMPP::VCard::Org org; org.name = m_mainWidget->leCompany->text(); org.unit = TQStringList::split(",", m_mainWidget->leDepartment->text()); vCard.setOrg(org); vCard.setTitle( m_mainWidget->lePosition->text() ); vCard.setRole( m_mainWidget->leRole->text() ); // phone numbers tab XMPP::VCard::Phone phoneHome; phoneHome.home = true; phoneHome.number = m_mainWidget->lePhoneHome->text(); XMPP::VCard::Phone phoneWork; phoneWork.work = true; phoneWork.number = m_mainWidget->lePhoneWork->text(); XMPP::VCard::Phone phoneFax; phoneFax.fax = true; phoneFax.number = m_mainWidget->lePhoneFax->text(); XMPP::VCard::Phone phoneCell; phoneCell.cell = true; phoneCell.number = m_mainWidget->lePhoneCell->text(); phoneList.append(phoneHome); phoneList.append(phoneWork); phoneList.append(phoneFax); phoneList.append(phoneCell); vCard.setPhoneList(phoneList); // about tab vCard.setDesc( m_mainWidget->teAbout->text() ); // Set contact photo as a binary value (if he has set a photo) if( !m_photoPath.isEmpty() ) { TQString photoPath = m_photoPath; TQImage image( photoPath ); TQByteArray ba; TQBuffer buffer( ba ); buffer.open( IO_WriteOnly ); image.save( &buffer, "PNG" ); vCard.setPhoto( ba ); } vCard.setVersion("3.0"); vCard.setProdId("Kopete"); XMPP::JT_VCard *task = new XMPP::JT_VCard( m_account->client()->rootTask() ); // signal to ourselves when the vCard data arrived TQObject::connect(task, TQT_SIGNAL(finished()), this, TQT_SLOT(slotVCardSaved())); task->set(vCard); task->go(true); } void dlgJabberVCard::slotVCardSaved() { XMPP::JT_VCard *vCard = (XMPP::JT_VCard*)sender(); if( vCard->success() ) { m_mainWidget->lblStatus->setText( i18n("vCard save sucessful.") ); m_contact->setPropertiesFromVCard( vCard->vcard() ); } else { m_mainWidget->lblStatus->setText( i18n("Error: Unable to save vCard.") ); } setEnabled(true); } void dlgJabberVCard::slotGetVCard() { m_mainWidget->lblStatus->setText( i18n("Fetching contact vCard...") ); setReadOnly(true); setEnabled(false); XMPP::JT_VCard *task = new XMPP::JT_VCard ( m_account->client()->rootTask() ); // signal to ourselves when the vCard data arrived TQObject::connect( task, TQT_SIGNAL ( finished () ), this, TQT_SLOT ( slotGotVCard () ) ); task->get ( m_contact->rosterItem().jid().full() ); task->go ( true ); } void dlgJabberVCard::slotGotVCard() { XMPP::JT_VCard * vCard = (XMPP::JT_VCard *) sender (); if( vCard->success() ) { m_contact->setPropertiesFromVCard( vCard->vcard() ); setEnabled( true ); assignContactProperties(); m_mainWidget->lblStatus->setText( i18n("vCard fetching Done.") ); } else { m_mainWidget->lblStatus->setText( i18n("Error: vCard could not be fetched correctly. Check connectivity with the Jabber server.") ); //it is maybe possible to anyway edit our own vCard (if it is new if(m_account->myself() == m_contact) setEnabled( true ); } } void dlgJabberVCard::slotSelectPhoto() { TQString path; bool remoteFile = false; KURL filePath = KFileDialog::getImageOpenURL( TQString(), this, i18n( "Jabber Photo" ) ); if( filePath.isEmpty() ) return; if( !filePath.isLocalFile() ) { if( !TDEIO::NetAccess::download( filePath, path, this ) ) { KMessageBox::queuedMessageBox( this, KMessageBox::Sorry, i18n( "Downloading of Jabber contact photo failed!" ) ); return; } remoteFile = true; } else path = filePath.path(); TQImage img( path ); img = KPixmapRegionSelectorDialog::getSelectedImage( TQPixmap(img), 96, 96, this ); if( !img.isNull() ) { if(img.width() > 96 || img.height() > 96) { // Scale and crop the picture. img = img.smoothScale( 96, 96, TQ_ScaleMin ); // crop image if not square if(img.width() < img.height()) img = img.copy((img.width()-img.height())/2, 0, 96, 96); else if (img.width() > img.height()) img = img.copy(0, (img.height()-img.width())/2, 96, 96); } else if (img.width() < 32 || img.height() < 32) { // Scale and crop the picture. img = img.smoothScale( 32, 32, TQ_ScaleMin ); // crop image if not square if(img.width() < img.height()) img = img.copy((img.width()-img.height())/2, 0, 32, 32); else if (img.width() > img.height()) img = img.copy(0, (img.height()-img.width())/2, 32, 32); } else if (img.width() != img.height()) { if(img.width() < img.height()) img = img.copy((img.width()-img.height())/2, 0, img.height(), img.height()); else if (img.width() > img.height()) img = img.copy(0, (img.height()-img.width())/2, img.height(), img.height()); } m_photoPath = locateLocal("appdata", "jabberphotos/" + m_contact->rosterItem().jid().full().lower().replace(TQRegExp("[./~]"),"-") +".png"); if( img.save(m_photoPath, "PNG") ) { m_mainWidget->lblPhoto->setPixmap( TQPixmap(img) ); } else { m_photoPath = TQString(); } } else { KMessageBox::queuedMessageBox( this, KMessageBox::Sorry, i18n( "An error occurred when trying to change the photo.
" "Make sure that you have selected a correct image file
" ) ); } if( remoteFile ) TDEIO::NetAccess::removeTempFile( path ); } void dlgJabberVCard::slotClearPhoto() { m_mainWidget->lblPhoto->setPixmap( TQPixmap() ); m_photoPath = TQString(); } void dlgJabberVCard::slotOpenURL(const TQString &url) { if ( !url.isEmpty () || (url == TQString::fromLatin1("mailto:") ) ) new KRun(KURL( url ) ); } #include "dlgjabbervcard.moc"