给gloox加上支持接收好友更新头像的信息

项目需要,可能实现的有点麻烦,大家如果有好方法,请告诉我!

在gloox库的基础上,要实现的功能:

当好友头像信息修改后(vcard),本地立即去获取好友头像。

1、增加一个头文件:VCardUpdateHandler.h  用来接收好友头像变更消息

class VCardUpdateHandler
{
public:
    virtual ~VCardUpdateHandler()  {;}
    //有人更新VCard信息
    virtual void VCardUpdateHash(const JID& jid , const std::string& hash) = 0;
};
    

转载请注明来源:blog.csdn.net/doubleuto

2、增加一个类VCardUpdatePresence,用来过滤包 ;

 class GLOOX_API VCardUpdatePresence : public StanzaExtension
    {
    public:
        VCardUpdatePresence(VCardUpdateHandler* phandler);
        VCardUpdatePresence(VCardUpdateHandler* phandler , const Tag* tag );
        
        /**
         * Virtual destructor.
         */
        virtual ~VCardUpdatePresence();
        
    private:
        
        // reimplemented from StanzaExtension
        virtual const std::string& filterString() const;
        
        // reimplemented from StanzaExtension
        virtual StanzaExtension* newInstance( const Tag* tag ) const
        {
            return new VCardUpdatePresence( m_pHandler, tag );
        }
        
        // reimplemented from StanzaExtension
        virtual Tag* tag() const;
        
        // reimplemented from StanzaExtension
        virtual StanzaExtension* clone() const
        {
            return new VCardUpdatePresence( *this );
        }
        
    private:
        JID         m_fromjid;
        std::string m_hash;
        bool        m_valid;
        
        VCardUpdateHandler* m_pHandler;
    };

3、在主要位置注册Handler:

        pVCardUpdatePresence_ = new VCardUpdatePresence(new VCardupdateHandler);
        pClient_->registerStanzaExtension(pVCardUpdatePresence_);

现在就可以再需要的地方,接收好友更新头像的信息了!


附注:VCardUpdatePresence.CPP源码


 VCardUpdatePresence::VCardUpdatePresence(VCardUpdateHandler* phandler)
    : StanzaExtension( ExtVCardUpdate ),m_valid(false),m_porgTag(NULL),m_pHandler(phandler)
    {
    }
    VCardUpdatePresence::VCardUpdatePresence( VCardUpdateHandler* phandler , const Tag* tag )
    : StanzaExtension( ExtVCardUpdate ),m_valid(false),m_porgTag(NULL),m_pHandler(phandler)
    {
        if( !tag || tag->name() != "presence" )
            return;
        
        //from
        const std::string& fromjidstring = tag->findAttribute("from");
        if( fromjidstring.empty() )
            return;
        m_fromjid = fromjidstring;
        
        //<x xmlns='vcard-temp:x:update'>
        Tag* x = tag->findChild("x");
        if( x && x->name() == "x" && x->hasAttribute( XMLNS, XMLNS_X_VCARD_UPDATE ) )
        {
           if( x->hasChild( "photo" ) )
           {
               m_hash = x->findChild( "photo" )->cdata();
               if( !m_hash.empty() )
                   m_valid = true;
            }
            
            if( m_valid && m_pHandler)
            {
               m_pHandler->VCardUpdateHash(m_fromjid,m_hash);
            }
        }
    }
    
    VCardUpdatePresence::~VCardUpdatePresence()
    {
    }
    
    const std::string& VCardUpdatePresence::filterString() const
    {
        static const std::string filter = "/presence";
        return filter;
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值