Re: [Ekiga-devel-list] Restoring presence in the SIP code



On 23/09/10 14:32, Julien Puydt wrote:
Le 23/09/2010 14:22, Eugen Dedu a écrit :
I do not understand: does the code work or not? If not, could you fix it
(or have you find when the problem is introduced etc.)?

The thing is that opal doesn't seem to call our
OnPresenceInfoReceived/OnDialogInfoReceived methods -- if it were, the
rest looks correct.

And I don't know why opal doesn't call them :-/

Without a patch, OnPresenceInfoReceived (maybe OnDialogInfoReceived too) is not called. With the patch, it is called (I have tested it). Have you patched ekiga, as I said in the e-mail attached (in French)?

--
Eugen
--- Begin Message ---
Bonjour les codeurs,

Le dernier bastion pour une release unstable et la présence.

Grâce à la réponse de Robert, j'ai réglé, dans une certaine mesure, le problème de présence dans master. En fait, NOTIFY présence marche maintenant (le client répond OK), mais le NOTIFY dialog;sla ne marche pas :

2010/08/14 12:34:27.845 0:03.470 Opal Liste...0x55f91710 SIPPres NOTIFY contains unsupported Content-Type "", expecting "application/dialog-info+xml"

Est-ce que le NOTIFY dialog;sla est important ? Si oui, je m'arrête ici avec ce problème, je n'arrive pas à le résoudre (à moins qu'il ne soit pas une erreur dans opal, ou que ce soit fait exprès).

Si non, en dépit du fait que l'échange de présence fonctionne, le roster n'est pas actualisé (le bonhomme ne devient pas vert). Je soupçonne fortement un problème de raffraîchissement du roster (un signal qui n'est pas triggered ?!) Julien, pourrais-tu y jeter un coup d'œil ? Pour tester, il faut régler la présence comme suit :
- dans lib/engine/components/opal/sip-endpoint.cpp il faut ajouter
#include <ptclib/pxml.h>
- dans le même fichier il faut ajouter à la fin par ex. le code du fichier joint
ensuite lancer ekiga et voir pourquoi le roster ne se raffraîchit pas.

--
Eugen
class SIPPresenceEventPackageHandler : public SIPEventPackageHandler
{
  virtual PCaselessString GetContentType() const
  {
    return "application/pidf+xml";
  }

  virtual bool OnReceivedNOTIFY(SIPHandler & handler, SIP_PDU & request)
  {
    SIPURL from = request.GetMIME().GetFrom();
    from.Sanitise(SIPURL::ExternalURI);

    SIPURL to = request.GetMIME().GetTo();
    to.Sanitise(SIPURL::ExternalURI);

    SIPPresenceInfo info;
    info.m_entity = from.AsQuotedString();
    info.m_target = to.AsQuotedString();

    // Check for empty body, if so then is OK, just a ping ...
    if (request.GetEntityBody().IsEmpty()) {
      handler.GetEndPoint().OnPresenceInfoReceived(info);
      return true;
    }

    PXML xml;
    if (!xml.Load(request.GetEntityBody()))
      return false;

    PXMLElement * rootElement = xml.GetRootElement();
    if (rootElement == NULL || rootElement->GetName() != "presence")
      return false;

    PXMLElement * tupleElement = rootElement->GetElement("tuple");
    if (tupleElement == NULL)
      return false;

    PXMLElement * statusElement = tupleElement->GetElement("status");
    if (statusElement == NULL)
      return false;

    PXMLElement * basicElement = statusElement->GetElement("basic");
    if (basicElement != NULL) {
      PCaselessString value = basicElement->GetData();
      if (value == "open")
        info.m_state = SIPPresenceInfo::Available;
      else if (value == "closed")
        info.m_state = SIPPresenceInfo::Unavailable;
    }

    PXMLElement * noteElement = statusElement->GetElement("note");
    if (!noteElement)
      noteElement = rootElement->GetElement("note");
    if (!noteElement)
      noteElement = tupleElement->GetElement("note");
    if (noteElement)
      info.m_note = noteElement->GetData();

    PXMLElement * contactElement = tupleElement->GetElement("contact");
    if (contactElement != NULL)
      info.m_contact = contactElement->GetData();

    handler.GetEndPoint().OnPresenceInfoReceived(info);
    return true;
  }
};

static SIPEventPackageFactory::Worker<SIPPresenceEventPackageHandler> presenceEventPackageHandler(SIPSubscribe::Presence);

--- End Message ---


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]