bool Opal::Sip::EndPoint::OnReceivedMESSAGE (OpalTransport & transport, SIP_PDU & pdu) { if (pdu.GetMIME().GetContentType(false) != "text/plain") return false; // Ignore what we do not handle. PString from = pdu.GetMIME().GetFrom(); PINDEX j = from.Find (';'); if (j != P_MAX_INDEX) from = from.Left(j); // Remove all parameters j = from.Find ('<'); if (j != P_MAX_INDEX && from.Find ('>') == P_MAX_INDEX) from += '>'; SIPURL uri = from; uri.Sanitise (SIPURL::RequestURI); std::string display_name = (const char *) uri.GetDisplayName (); std::string message_uri = (const char *) uri.AsString (); std::string _message = (const char *) pdu.GetEntityBody (); Ekiga::Runtime::run_in_main (boost::bind (&Opal::Sip::EndPoint::push_message_in_main, this, message_uri, display_name, _message)); return SIPEndPoint::OnReceivedMESSAGE (transport, pdu); }
void Opal::Sip::EndPoint::OnMESSAGECompleted (const SIPMessage::Params & params, SIP_PDU::StatusCodes reason) { PTRACE (4, "IM sending completed, reason: " << reason); // after TemporarilyUnavailable, RequestTimeout appears too, hence do not process it too if (reason == SIP_PDU::Successful_OK || reason == SIP_PDU::Failure_RequestTimeout) return; SIPURL to = params.m_remoteAddress; to.Sanitise (SIPURL::ToURI); std::string uri = (const char*) to.AsString (); std::string display_name = (const char*) to.GetDisplayName (); std::string reason_shown = _("Could not send message: "); if (reason == SIP_PDU::Failure_TemporarilyUnavailable) reason_shown += _("user offline"); else reason_shown += SIP_PDU::GetStatusCodeDescription (reason); // too many to translate them with _()... Ekiga::Message::payload_type payload; // FIXME: we push as 'text/plain' without really knowing... payload.insert (std::make_pair ("text/plain", reason_shown)); GTimeVal current; g_get_current_time (¤t); gchar* time = g_time_val_to_iso8601 (¤t); Ekiga::Message msg = {time, "" /* it's a notice */, payload }; g_free (time); Ekiga::Runtime::run_in_main (boost::bind (&Opal::Sip::EndPoint::push_message_in_main, this, uri, msg)); }
bool Opal::Sip::EndPoint::OnReceivedMESSAGE (OpalTransport & transport, SIP_PDU & pdu) { if (pdu.GetMIME().GetContentType(false) != "text/plain") return false; // Ignore what we do not handle. PString from = pdu.GetMIME().GetFrom(); PINDEX j = from.Find (';'); if (j != P_MAX_INDEX) from = from.Left(j); // Remove all parameters j = from.Find ('<'); if (j != P_MAX_INDEX && from.Find ('>') == P_MAX_INDEX) from += '>'; SIPURL uri = from; uri.Sanitise (SIPURL::RequestURI); std::string display_name = (const char *) uri.GetDisplayName (); std::string message_uri = (const char *) uri.AsString (); std::string _message = (const char *) pdu.GetEntityBody (); Ekiga::Message::payload_type payload; // FIXME: we push as 'text/plain' without really knowing payload.insert (std::make_pair ("text/plain", _message)); GTimeVal current; g_get_current_time (¤t); gchar* time = g_time_val_to_iso8601 (¤t); Ekiga::Message msg = {time, display_name, payload }; g_free (time); Ekiga::Runtime::run_in_main (boost::bind (&Opal::Sip::EndPoint::push_message_in_main, this, message_uri, msg)); return SIPEndPoint::OnReceivedMESSAGE (transport, pdu); }
bool Opal::Sip::EndPoint::OnReceivedMESSAGE (OpalTransport & transport, SIP_PDU & pdu) { PString *last = NULL; PString *val = NULL; PString from = pdu.GetMIME().GetFrom(); PINDEX j = from.Find (';'); if (j != P_MAX_INDEX) from = from.Left(j); // Remove all parameters j = from.Find ('<'); if (j != P_MAX_INDEX && from.Find ('>') == P_MAX_INDEX) from += '>'; PWaitAndSignal m(msgDataMutex); last = msgData.GetAt (SIPURL (from).AsString ()); if (!last || *last != pdu.GetMIME ().GetFrom ()) { val = new PString (pdu.GetMIME ().GetFrom ()); msgData.SetAt (SIPURL (from).AsString (), val); SIPURL uri = from; uri.Sanitise (SIPURL::RequestURI); std::string display_name = (const char *) uri.GetDisplayName (); std::string message_uri = (const char *) uri.AsString (); std::string _message = (const char *) pdu.GetEntityBody (); runtime.run_in_main (sigc::bind (sigc::ptr_fun (push_message_in_main), dialect, message_uri, display_name, _message)); } return SIPEndPoint::OnReceivedMESSAGE (transport, pdu); }
void Opal::Sip::EndPoint::OnMessageFailed (const SIPURL & messageUrl, SIP_PDU::StatusCodes /*reason*/) { SIPURL to = messageUrl; to.Sanitise (SIPURL::ToURI); std::string uri = (const char *) to.AsString (); std::string display_name = (const char *) to.GetDisplayName (); runtime.run_in_main (sigc::bind (sigc::ptr_fun (push_notice_in_main), dialect, uri, display_name, _("Could not send message"))); }
void Opal::Sip::EndPoint::OnMESSAGECompleted (const SIPMessage::Params & params, SIP_PDU::StatusCodes reason) { PTRACE (4, "IM sending completed, reason: " << reason); // after TemporarilyUnavailable, RequestTimeout appears too, hence do not process it too if (reason == SIP_PDU::Successful_OK || reason == SIP_PDU::Failure_RequestTimeout) return; SIPURL to = params.m_remoteAddress; to.Sanitise (SIPURL::ToURI); std::string uri = (const char*) to.AsString (); std::string display_name = (const char*) to.GetDisplayName (); std::string reason_shown = _("Could not send message: "); if (reason == SIP_PDU::Failure_TemporarilyUnavailable) reason_shown += _("user offline"); else reason_shown += SIP_PDU::GetStatusCodeDescription (reason); // too many to translate them with _()... Ekiga::Runtime::run_in_main (boost::bind (&Opal::Sip::EndPoint::push_notice_in_main, this, uri, display_name, reason_shown)); }