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 m_parent->removeIqHandler( XMLNS_VCARD_TEMP );
00037 }
00038
00039 void VCardManager::fetchVCard( const JID& jid, VCardHandler *vch )
00040 {
00041 if( !m_parent || !vch )
00042 return;
00043
00044 TrackMap::const_iterator it = m_trackMap.find( jid.bare() );
00045 if( it != m_trackMap.end() )
00046 return;
00047
00048 const std::string id = m_parent->getID();
00049 Tag *iq = new Tag( "iq" );
00050 iq->addAttribute( "type", "get" );
00051 iq->addAttribute( "id", id );
00052 iq->addAttribute( "to", jid.bare() );
00053 Tag *v = new Tag( iq, "vCard" );
00054 v->addAttribute( "xmlns", XMLNS_VCARD_TEMP );
00055
00056 m_parent->trackID( this, id, VCardHandler::FetchVCard );
00057 m_trackMap[id] = vch;
00058 m_parent->send( iq );
00059 }
00060
00061 void VCardManager::storeVCard( const VCard *vcard, VCardHandler *vch )
00062 {
00063 if( !m_parent || !vch )
00064 return;
00065
00066 const std::string id = m_parent->getID();
00067 Tag *iq = new Tag( "iq" );
00068 iq->addAttribute( "type", "set" );
00069 iq->addAttribute( "id", id );
00070 iq->addChild( vcard->tag() );
00071
00072 m_parent->trackID( this, id, VCardHandler::StoreVCard );
00073 m_trackMap[id] = vch;
00074 m_parent->send( iq );
00075 }
00076
00077 bool VCardManager::handleIq( Stanza * )
00078 {
00079 return false;
00080 }
00081
00082 bool VCardManager::handleIqID( Stanza *stanza, int context )
00083 {
00084 TrackMap::const_iterator it = m_trackMap.find( stanza->id() );
00085 if( it != m_trackMap.end() )
00086 {
00087 switch( stanza->subtype() )
00088 {
00089 case StanzaIqResult:
00090 {
00091 switch( context )
00092 {
00093 case VCardHandler::FetchVCard:
00094 {
00095 Tag *v = stanza->findChild( "vCard", "xmlns", XMLNS_VCARD_TEMP );
00096 if( v )
00097 {
00098 (*it).second->handleVCard( stanza->from(), new VCard( v ) );
00099 }
00100 break;
00101 }
00102 case VCardHandler::StoreVCard:
00103 (*it).second->handleVCardResult( VCardHandler::StoreVCard, stanza->from() );
00104 break;
00105 }
00106 }
00107 break;
00108 case StanzaIqError:
00109 {
00110 switch( context )
00111 {
00112 case VCardHandler::FetchVCard:
00113 (*it).second->handleVCardResult( VCardHandler::FetchVCard, stanza->from(), stanza->error() );
00114 break;
00115 case VCardHandler::StoreVCard:
00116 (*it).second->handleVCardResult( VCardHandler::StoreVCard, stanza->from(), stanza->error() );
00117 break;
00118 }
00119 break;
00120 }
00121 default:
00122 return false;
00123 }
00124 }
00125 return false;
00126 }
00127
00128 }