vcardmanager.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "vcardmanager.h"
00015 #include "vcardhandler.h"
00016 #include "vcard.h"
00017 #include "clientbase.h"
00018 #include "disco.h"
00019 #include "error.h"
00020
00021 namespace gloox
00022 {
00023
00024 VCardManager::VCardManager( ClientBase* parent )
00025 : m_parent( parent )
00026 {
00027 if( m_parent )
00028 {
00029 m_parent->registerIqHandler( this, ExtVCard );
00030 m_parent->disco()->addFeature( XMLNS_VCARD_TEMP );
00031 m_parent->registerStanzaExtension( new VCard() );
00032 }
00033 }
00034
00035 VCardManager::~VCardManager()
00036 {
00037 if( m_parent )
00038 {
00039 m_parent->disco()->removeFeature( XMLNS_VCARD_TEMP );
00040 m_parent->removeIqHandler( this, ExtVCard );
00041 m_parent->removeIDHandler( this );
00042 }
00043 }
00044
00045 void VCardManager::fetchVCard( const JID& jid, VCardHandler* vch )
00046 {
00047 if( !m_parent || !vch )
00048 return;
00049
00050 TrackMap::const_iterator it = m_trackMap.find( jid.bare() );
00051 if( it != m_trackMap.end() )
00052 return;
00053
00054 const std::string& id = m_parent->getID();
00055 IQ iq ( IQ::Get, jid, id );
00056 iq.addExtension( new VCard() );
00057
00058 m_trackMap[id] = vch;
00059 m_parent->send( iq, this,VCardHandler::FetchVCard );
00060 }
00061
00062 void VCardManager::cancelVCardOperations( VCardHandler* vch )
00063 {
00064 TrackMap::iterator t;
00065 TrackMap::iterator it = m_trackMap.begin();
00066 while( it != m_trackMap.end() )
00067 {
00068 t = it;
00069 ++it;
00070 if( (*t).second == vch )
00071 m_trackMap.erase( t );
00072 }
00073 }
00074
00075 void VCardManager::storeVCard( VCard* vcard, VCardHandler* vch )
00076 {
00077 if( !m_parent || !vch )
00078 return;
00079
00080 const std::string& id = m_parent->getID();
00081 IQ iq( IQ::Set, JID(), id );
00082 iq.addExtension( vcard );
00083
00084 m_trackMap[id] = vch;
00085 m_parent->send( iq, this, VCardHandler::StoreVCard );
00086 }
00087
00088 void VCardManager::handleIqID( const IQ& iq, int context )
00089 {
00090 TrackMap::iterator it = m_trackMap.find( iq.id() );
00091 if( it != m_trackMap.end() )
00092 {
00093 switch( iq.subtype() )
00094 {
00095 case IQ::Result:
00096 {
00097 switch( context )
00098 {
00099 case VCardHandler::FetchVCard:
00100 {
00101 const VCard* v = iq.findExtension<VCard>( ExtVCard );
00102 (*it).second->handleVCard( iq.from(), v );
00103 break;
00104 }
00105 case VCardHandler::StoreVCard:
00106 (*it).second->handleVCardResult( VCardHandler::StoreVCard, iq.from() );
00107 break;
00108 }
00109 }
00110 break;
00111 case IQ::Error:
00112 {
00113 (*it).second->handleVCardResult( (VCardHandler::VCardContext)context,
00114 iq.from(),
00115 iq.error() ? iq.error()->error()
00116 : StanzaErrorUndefined );
00117 break;
00118 }
00119 default:
00120 break;
00121 }
00122
00123 m_trackMap.erase( it );
00124 }
00125 }
00126
00127 }