// Caller must hold mLock. void SipPresenceMonitor::notifyStateChange(UtlString& contact, SipPresenceEvent* presenceEvent) { // Loop through the notifier list UtlHashMapIterator iterator(mStateChangeNotifiers); UtlString* listUri; StateChangeNotifier* notifier; Url contactUrl(contact); while ((listUri = dynamic_cast <UtlString *> (iterator()))) { notifier = dynamic_cast <StateChangeNotifier *> (mStateChangeNotifiers.findValue(listUri)); UtlString id; makeId(id, contact); Tuple* tuple = presenceEvent->getTuple(id); if (tuple) { UtlString status; tuple->getStatus(status); notifier->setStatus(contactUrl, status.compareTo(STATUS_CLOSED) == 0 ? StateChangeNotifier::AWAY : StateChangeNotifier::PRESENT); } else { notifier->setStatus(contactUrl, StateChangeNotifier::AWAY); } } }
void SipPresenceMonitor::notifyStateChange(UtlString& contact, SipPresenceEvent* presenceEvent) { // Loop through the notifier list UtlHashMapIterator iterator(mStateChangeNotifiers); UtlString* listUri; StateChangeNotifier* notifier; Url contactUrl(contact); mLock.acquire(); while (listUri = dynamic_cast <UtlString *> (iterator())) { notifier = dynamic_cast <StateChangeNotifier *> (mStateChangeNotifiers.findValue(listUri)); if (presenceEvent->isEmpty()) { notifier->setStatus(contactUrl, StateChangeNotifier::AWAY); } else { UtlString id; NetMd5Codec::encode(contact, id); Tuple* tuple = presenceEvent->getTuple(id); UtlString status; tuple->getStatus(status); if (status.compareTo(STATUS_CLOSE) == 0) { notifier->setStatus(contactUrl, StateChangeNotifier::AWAY); } else { notifier->setStatus(contactUrl, StateChangeNotifier::PRESENT); } } } mLock.release(); }
void SipPresenceMonitor::publishContent(UtlString& contact, SipPresenceEvent* presenceEvent) { bool contentChanged; // Loop through all the resource lists UtlHashMapIterator iterator(mMonitoredLists); UtlString* listUri; SipResourceList* list; Resource* resource; UtlString id, state; while (listUri = dynamic_cast <UtlString *> (iterator())) { contentChanged = false; list = dynamic_cast <SipResourceList *> (mMonitoredLists.findValue(listUri)); OsSysLog::add(FAC_SIP, PRI_DEBUG, "SipPresenceMonitor::publishContent listUri %s list %p", listUri->data(), list); // Search for the contact in this list resource = list->getResource(contact); if (resource) { resource->getInstance(id, state); if (presenceEvent->isEmpty()) { resource->setInstance(id, STATE_TERMINATED); } else { UtlString id; NetMd5Codec::encode(contact, id); Tuple* tuple = presenceEvent->getTuple(id); UtlString status; tuple->getStatus(status); if (status.compareTo(STATUS_CLOSE) == 0) { resource->setInstance(id, STATE_TERMINATED); } else { resource->setInstance(id, STATE_ACTIVE); } } list->buildBody(); contentChanged = true; } if (contentChanged) { int numOldContents; HttpBody* oldContent[1]; // Publish the content to the subscribe server if (!mSipPublishContentMgr.publish(listUri->data(), PRESENCE_EVENT_TYPE, DIALOG_EVENT_TYPE, 1, (HttpBody**)&list, 1, numOldContents, oldContent)) { UtlString presenceContent; int length; list->getBytes(&presenceContent, &length); OsSysLog::add(FAC_SIP, PRI_ERR, "SipPresenceMonitor::publishContent PresenceEvent %s\n was not successfully published to the subscribe server", presenceContent.data()); } } } }
void SipPresenceMonitor::publishContent(UtlString& contact, SipPresenceEvent* presenceEvent) { #ifdef SUPPORT_RESOURCE_LIST // Loop through all the resource lists UtlHashMapIterator iterator(mMonitoredLists); UtlString* listUri; SipResourceList* list; Resource* resource; UtlString id, state; while (listUri = dynamic_cast <UtlString *> (iterator())) { bool contentChanged = false; list = dynamic_cast <SipResourceList *> (mMonitoredLists.findValue(listUri)); OsSysLog::add(FAC_SIP, PRI_DEBUG, "SipPresenceMonitor::publishContent listUri %s list %p", listUri->data(), list); // Search for the contact in this list resource = list->getResource(contact); if (resource) { resource->getInstance(id, state); if (presenceEvent->isEmpty()) { resource->setInstance(id, STATE_TERMINATED); } else { UtlString id; makeId(id, contact); Tuple* tuple = presenceEvent->getTuple(id); UtlString status; tuple->getStatus(status); if (status.compareTo(STATUS_CLOSED) == 0) { resource->setInstance(id, STATE_TERMINATED); } else { resource->setInstance(id, STATE_ACTIVE); } } list->buildBody(); contentChanged = true; } if (contentChanged) { // Publish the content to the subscribe server // Make a copy, because mpSipPublishContentMgr will own it. HttpBody* pHttpBody = new HttpBody(*(HttpBody*)list); mSipPublishContentMgr.publish(listUri->data(), PRESENCE_EVENT_TYPE, PRESENCE_EVENT_TYPE, 1, &pHttpBody); } } #endif // Publish the content to the subscribe server // Make a copy, because mpSipPublishContentMgr will own it. HttpBody* pHttpBody = new HttpBody(*(HttpBody*)presenceEvent); mSipPublishContentMgr.publish(contact.data(), PRESENCE_EVENT_TYPE, PRESENCE_EVENT_TYPE, 1, &pHttpBody); }
// Write the presence events to the persistent file. void SipPresenceMonitor::writePersistentFile() { mLock.acquire(); // Create an empty document TiXmlDocument document; // Create a hard coded standalone declaration section document.Parse("<?xml version=\"1.0\" standalone=\"yes\"?>"); // Create the root node container TiXmlElement itemsElement ("items"); itemsElement.SetAttribute("type", sType.data()); itemsElement.SetAttribute("xmlns", sXmlNamespace.data()); int timeNow = (int)OsDateTime::getSecsSinceEpoch(); itemsElement.SetAttribute("timestamp", timeNow); // mPresenceEventList is a hash map that maps contacts to SipPresenceEvents. // SipPresenceEvents are hash maps of contacts to Tuples. In practice, // a SipPresenceEvent has only one Tuple. (And if it had more, there // would be no way to discover what they are, as there is no iterator.) // Tuples are triples: id, contact, status. // Loop through all the events in mPresenceEventList. UtlHashMapIterator iterator(mPresenceEventList); UtlString* contact; while ((contact = dynamic_cast <UtlString*> (iterator()))) { // Create an item container TiXmlElement itemElement ("item"); // Get the SipPresenceEvent. SipPresenceEvent* event = dynamic_cast <SipPresenceEvent*> (iterator.value()); // Calculate the id of the Tuple. UtlString id; makeId(id, *contact); // Get the Tuple. Tuple* tuple = event->getTuple(id); // Get the status. UtlString status; tuple->getStatus(status); // Construct the <item>. TiXmlElement id_element("id"); TiXmlText id_content(id); id_element.InsertEndChild(id_content); itemElement.InsertEndChild(id_element); TiXmlElement contact_element("contact"); TiXmlText contact_content(contact->data()); contact_element.InsertEndChild(contact_content); itemElement.InsertEndChild(contact_element); TiXmlElement status_element("status"); TiXmlText status_content(status); status_element.InsertEndChild(status_content); itemElement.InsertEndChild(status_element); // Add the <item> element to the <items> element. itemsElement.InsertEndChild ( itemElement ); } // Attach <items> to the root node to the document document.InsertEndChild(itemsElement); document.SaveFile(mPersistentFile); mLock.release(); OsSysLog::add(FAC_SIP, PRI_DEBUG, "SipPresenceMonitorPersistenceTask::writePersistentFile file written"); }