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 MySIPEndPoint::OnRegistrationStatus(const RegistrationStatus & status) { SIPEndPoint::OnRegistrationStatus(status); if (status.m_reason < 200 || (status.m_reRegistering && status.m_reason < 300)) return; SIPURL aor = status.m_addressofRecord; aor.Sanitise(SIPURL::ExternalURI); PString aor_str = aor.AsString (); char *address_of_record = g_strdup (aor_str); g_signal_emit_by_name (m_sipep, "registration-status", address_of_record, gboolean (status.m_wasRegistering), GopalStatusCodes (status.m_reason)); }
SIPURL Opal::Sip::EndPoint::GetRegisteredPartyName (const SIPURL & aor, const OpalTransport & transport) { PWaitAndSignal m(aorMutex); std::string local_aor = accounts[(const char*) aor.GetHostName ()]; if (!local_aor.empty ()) return local_aor.c_str (); // as a last resort, use the local address return GetDefaultRegisteredPartyName (transport); }
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)); }
SIPURL Opal::Sip::EndPoint::GetRegisteredPartyName (const SIPURL & host) { PString local_address; PIPSocket::Address address; WORD port; PString url; SIPURL registration_address; /* If we are registered to an account corresponding to host, use it. */ PSafePtr<SIPHandler> info = activeSIPHandlers.FindSIPHandlerByDomain(host.GetHostName (), SIP_PDU::Method_REGISTER, PSafeReadOnly); if (info != NULL) { return SIPURL ("\"" + GetDefaultDisplayName () + "\" <" + info->GetTargetAddress ().AsString () + ">"); } else { /* If we are not registered to host, * then use the default account as outgoing identity. * If we are exchanging messages with a peer on our network, * then do not use the default account as outgoing identity. */ if (host.GetHostAddress ().GetIpAndPort (address, port) && !manager.IsLocalAddress (address)) { Ekiga::Account *account = account_core.find_account ("ekiga.net"); if (account) return SIPURL ("\"" + GetDefaultDisplayName () + "\" <" + PString(account->get_aor ()) + ">"); } } /* As a last resort, ie not registered to host, no default account or * dialog with a local peer, then use the local address */ return GetDefaultRegisteredPartyName (); }