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
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 * )
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 }