vcardmanager.cpp

00001 /*
00002   Copyright (c) 2006 by Jakob Schroeter <js@camaya.net>
00003   This file is part of the gloox library. http://camaya.net/gloox
00004 
00005   This software is distributed under a license. The full license
00006   agreement can be found in the file LICENSE in this distribution.
00007   This software may not be copied, modified, sold or distributed
00008   other than expressed in the named license agreement.
00009 
00010   This software is distributed without any warranty.
00011 */
00012 
00013 
00014 #include "vcardmanager.h"
00015 #include "vcardhandler.h"
00016 #include "vcard.h"
00017 #include "clientbase.h"
00018 #include "disco.h"
00019 
00020 namespace gloox
00021 {
00022 
00023   VCardManager::VCardManager( ClientBase *parent, Disco *disco )
00024     : m_parent( parent )
00025   {
00026     if( m_parent )
00027       m_parent->registerIqHandler( this, XMLNS_VCARD_TEMP );
00028 
00029     if( disco )
00030       disco->addFeature( XMLNS_VCARD_TEMP );
00031   }
00032 
00033   VCardManager::~VCardManager()
00034   {
00035     if( m_parent )
00036     {
00037       m_parent->removeIqHandler( XMLNS_VCARD_TEMP );
00038       m_parent->removeIDHandler( this );
00039     }
00040   }
00041 
00042   void VCardManager::fetchVCard( const JID& jid, VCardHandler *vch )
00043   {
00044     if( !m_parent || !vch )
00045       return;
00046 
00047     TrackMap::const_iterator it = m_trackMap.find( jid.bare() );
00048     if( it != m_trackMap.end() )
00049       return;
00050 
00051     const std::string id = m_parent->getID();
00052     Tag *iq = new Tag( "iq" );
00053     iq->addAttribute( "type", "get" );
00054     iq->addAttribute( "id", id );
00055     iq->addAttribute( "to", jid.bare() );
00056     Tag *v = new Tag( iq, "vCard" );
00057     v->addAttribute( "xmlns", XMLNS_VCARD_TEMP );
00058 
00059     m_parent->trackID( this, id, VCardHandler::FetchVCard );
00060     m_trackMap[id] = vch;
00061     m_parent->send( iq );
00062   }
00063 
00064   void VCardManager::cancelVCardOperations( VCardHandler *vch )
00065   {
00066     TrackMap::iterator t;
00067     TrackMap::iterator it = m_trackMap.begin();
00068     while( it != m_trackMap.end() )
00069     {
00070       t = it;
00071       ++it;
00072       if( (*t).second == vch )
00073         m_trackMap.erase( t );
00074     }
00075   }
00076 
00077   void VCardManager::storeVCard( const VCard *vcard, VCardHandler *vch )
00078   {
00079     if( !m_parent || !vch )
00080       return;
00081 
00082     const std::string id = m_parent->getID();
00083     Tag *iq = new Tag( "iq" );
00084     iq->addAttribute( "type", "set" );
00085     iq->addAttribute( "id", id );
00086     iq->addChild( vcard->tag() );
00087 
00088     m_parent->trackID( this, id, VCardHandler::StoreVCard );
00089     m_trackMap[id] = vch;
00090     m_parent->send( iq );
00091   }
00092 
00093   bool VCardManager::handleIq( Stanza * /*stanza*/ )
00094   {
00095     return false;
00096   }
00097 
00098   bool VCardManager::handleIqID( Stanza *stanza, int context )
00099   {
00100     TrackMap::iterator it = m_trackMap.find( stanza->id() );
00101     if( it != m_trackMap.end() )
00102     {
00103       switch( stanza->subtype() )
00104       {
00105         case StanzaIqResult:
00106         {
00107           switch( context )
00108           {
00109             case VCardHandler::FetchVCard:
00110             {
00111               Tag *v = stanza->findChild( "vCard", "xmlns", XMLNS_VCARD_TEMP );
00112               if( v )
00113                 (*it).second->handleVCard( stanza->from(), new VCard( v ) );
00114               else
00115                 (*it).second->handleVCard( stanza->from(), 0 );
00116               break;
00117             }
00118             case VCardHandler::StoreVCard:
00119               (*it).second->handleVCardResult( VCardHandler::StoreVCard, stanza->from() );
00120               break;
00121           }
00122         }
00123         break;
00124         case StanzaIqError:
00125         {
00126           switch( context )
00127           {
00128             case VCardHandler::FetchVCard:
00129               (*it).second->handleVCardResult( VCardHandler::FetchVCard, stanza->from(), stanza->error() );
00130               break;
00131             case VCardHandler::StoreVCard:
00132               (*it).second->handleVCardResult( VCardHandler::StoreVCard, stanza->from(), stanza->error() );
00133               break;
00134           }
00135           break;
00136         }
00137         default:
00138           return false;
00139       }
00140 
00141       m_trackMap.erase( it );
00142     }
00143     return false;
00144   }
00145 
00146 }

Generated on Tue May 1 14:20:20 2007 for gloox by  doxygen 1.5.1