reSIProcate
SIP stack, Dialog Usage Manager and related libraries
Loading...
Searching...
No Matches
ConversationManagerCmds.hxx
Go to the documentation of this file.
1#if !defined(ConversationManagerCmds_hxx)
2#define ConversationManagerCmds_hxx
3
5#include <rutil/Logger.hxx>
6
8#include "Conversation.hxx"
11#include "LocalParticipant.hxx"
13#include "MediaStackAdapter.hxx"
14#ifdef USE_KURENTO
16#endif
17#ifdef USE_GSTREAMER
19#endif
20#ifdef USE_LIBWEBRTC
22#endif
23
24#define RESIPROCATE_SUBSYSTEM ReconSubsystem::RECON
25
26namespace recon
27{
28
38{
39 public:
48 virtual void executeCommand()
49 {
50 Conversation* conversation = mConversationManager->getMediaStackAdapter().createConversationInstance(mConvHandle, 0, mSharedMediaInterfaceConvHandle, mAutoHoldMode);
52 }
53 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " CreateConversationCmd: "; return strm; }
54 private:
55 ConversationManager* mConversationManager;
56 ConversationHandle mConvHandle;
58 ConversationHandle mSharedMediaInterfaceConvHandle;
59};
60
62{
63 public:
68 virtual void executeCommand()
69 {
70 Conversation* conversation = mConversationManager->getConversation(mConvHandle);
71 if(conversation)
72 {
74 }
75 }
76 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " DestroyConversationCmd: "; return strm; }
77 private:
78 ConversationManager* mConversationManager;
79 ConversationHandle mConvHandle;
80};
81
83{
84 public:
91 virtual void executeCommand()
92 {
93 Conversation* sourceConversation = mConversationManager->getConversation(mSourceConvHandle);
94 Conversation* destConversation = mConversationManager->getConversation(mDestConvHandle);
96 {
98 {
99 // NoOp
100 return;
101 }
102
103 // If either conversation has a Remote or Media participant, then make sure both conversations are using the same
104 // media interface
105 if (sourceConversation->getNumRemoteParticipants() != 0 || sourceConversation->getNumMediaParticipants() != 0 ||
106 destConversation->getNumRemoteParticipants() != 0 || destConversation->getNumMediaParticipants() != 0)
107 {
108 // Safety check when running in sipXConversationMediaInterfaceMode - ensure both conversation are using the same
109 // media interface
111 {
112 WarningLog(<< "JoinConversationCmd: not supported for sourceConv=" << mSourceConvHandle << ", and destConv=" << mDestConvHandle);
113 return;
114 }
115 }
116
117 // Join source Conversation into dest Conversation and destroy source conversation
119 }
120 else
121 {
123 {
124 WarningLog(<< "JoinConversationCmd: invalid source conversation handle: " << mSourceConvHandle);
125 }
126 if (!destConversation)
127 {
128 WarningLog(<< "JoinConversationCmd: invalid destination conversation handle: " << mDestConvHandle);
129 }
130 }
131 }
132 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " JoinConversationCmd: "; return strm; }
133 private:
134 ConversationManager* mConversationManager;
135 ConversationHandle mSourceConvHandle;
136 ConversationHandle mDestConvHandle;
137};
138
140{
141 public:
145 const resip::NameAddr& destination,
147 std::shared_ptr<ConversationProfile> callerProfile = nullptr,
148 const std::multimap<resip::Data,resip::Data>& extraHeaders = (std::multimap<resip::Data,resip::Data>()))
149 : mConversationManager(conversationManager),
150 mPartHandle(partHandle),
151 mConvHandle(convHandle),
152 mDestination(destination),
153 mForkSelectMode(forkSelectMode),
154 mCallerProfile(callerProfile),
155 mExtraHeaders(extraHeaders) {}
156 virtual void executeCommand()
157 {
158 Conversation* conversation = mConversationManager->getConversation(mConvHandle);
159 if(conversation)
160 {
162 RemoteParticipant *participant = participantDialogSet->createUACOriginalRemoteParticipant(mPartHandle);
163 if(participant)
164 {
165 conversation->addParticipant(participant);
166 participant->initiateRemoteCall(mDestination, mCallerProfile, mExtraHeaders);
167 }
168 else
169 {
170 WarningLog(<< "CreateRemoteParticipantCmd: error creating UACOriginalRemoteParticipant.");
172 }
173 }
174 else
175 {
176 WarningLog(<< "CreateRemoteParticipantCmd: invalid conversation handle: " << mConvHandle);
178 }
179 }
180 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " CreateRemoteParticipantCmd: "; return strm; }
181 private:
182 ConversationManager* mConversationManager;
183 ParticipantHandle mPartHandle;
184 ConversationHandle mConvHandle;
185 resip::NameAddr mDestination;
187 std::shared_ptr<ConversationProfile> mCallerProfile;
188 std::multimap<resip::Data,resip::Data> mExtraHeaders;
189};
190
192{
193public:
196 const resip::NameAddr& destination,
197 std::shared_ptr<ConversationProfile> conversationProfile = nullptr)
198 : mConversationManager(conversationManager),
199 mPartHandle(partHandle),
200 mDestination(destination),
201 mConversationProfile(conversationProfile) {}
202 virtual void executeCommand()
203 {
204 new RemoteIMPagerParticipant(mPartHandle, *mConversationManager, mDestination, mConversationProfile);
205 }
206 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " CreateRemoteIMPagerParticipantCmd: "; return strm; }
207private:
208 ConversationManager* mConversationManager;
209 ParticipantHandle mPartHandle;
210 resip::NameAddr mDestination;
211 std::shared_ptr<ConversationProfile> mConversationProfile;
212};
213
215{
216public:
219 const resip::NameAddr& destination,
221 std::shared_ptr<ConversationProfile> callerProfile = nullptr,
222 const std::multimap<resip::Data, resip::Data>& extraHeaders = (std::multimap<resip::Data, resip::Data>()))
223 : mConversationManager(conversationManager),
224 mPartHandle(partHandle),
225 mDestination(destination),
226 mForkSelectMode(forkSelectMode),
227 mCallerProfile(callerProfile),
228 mExtraHeaders(extraHeaders) {}
229 virtual void executeCommand()
230 {
231 RemoteParticipantDialogSet* participantDialogSet = mConversationManager->createRemoteIMSessionParticipantDialogSetInstance(mForkSelectMode, mCallerProfile);
232 RemoteParticipant* participant = participantDialogSet->createUACOriginalRemoteParticipant(mPartHandle);
233 if (participant)
234 {
235 participant->initiateRemoteCall(mDestination, mCallerProfile, mExtraHeaders);
236 }
237 else
238 {
239 WarningLog(<< "CreateRemoteIMSessionParticipantCmd: error creating UACOriginalRemoteParticipant.");
241 }
242 }
243 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " CreateRemoteIMSessionParticipantCmd: "; return strm; }
244private:
245 ConversationManager* mConversationManager;
246 ParticipantHandle mPartHandle;
247 resip::NameAddr mDestination;
249 std::shared_ptr<ConversationProfile> mCallerProfile;
250 std::multimap<resip::Data, resip::Data> mExtraHeaders;
251};
252
254{
255 public:
259 const resip::Uri& mediaUrl,
260 const std::shared_ptr<resip::Data>& audioBuffer,
262 : mConversationManager(conversationManager),
263 mPartHandle(partHandle),
264 mConvHandle(convHandle),
265 mMediaUrl(mediaUrl),
266 mAudioBuffer(audioBuffer),
267 mRecordingCircularBuffer(recordingCircularBuffer) {}
268 virtual void executeCommand()
269 {
270 Conversation* conversation = mConversationManager->getConversation(mConvHandle);
271 if(conversation)
272 {
273 MediaResourceParticipant* mediaResourceParticipant = mConversationManager->getMediaStackAdapter().createMediaResourceParticipantInstance(mPartHandle, mMediaUrl, mAudioBuffer, mRecordingCircularBuffer);
275 {
276 conversation->addParticipant(mediaResourceParticipant);
277 mediaResourceParticipant->startResource(); // Note: Can call delete this (MediaResourceParticipant) on failures
278 }
279 else
280 {
281 WarningLog(<< "CreateMediaResourceParticipantCmd: error creating MediaResourceParticipant.");
283 }
284 }
285 else
286 {
287 WarningLog(<< "CreateMediaResourceParticipantCmd: invalid conversation handle: " << mConvHandle);
289 }
290 }
291 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " CreateMediaResourceParticipantCmd: "; return strm; }
292 private:
293 ConversationManager* mConversationManager;
294 ParticipantHandle mPartHandle;
295 ConversationHandle mConvHandle;
296 resip::Uri mMediaUrl;
297 std::shared_ptr<resip::Data> mAudioBuffer;
298 void* mRecordingCircularBuffer;
299};
300
302{
303 public:
308 virtual void executeCommand()
309 {
310 mConversationManager->getMediaStackAdapter().createLocalParticipantInstance(mPartHandle);
311 }
312 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " CreateLocalParticipantCmd: "; return strm; }
313 private:
314 ConversationManager* mConversationManager;
315 ParticipantHandle mPartHandle;
316};
317
319{
320 public:
325 : mConversationManager(rhs.mConversationManager), mPartHandle(rhs.mPartHandle) {}
326 virtual void executeCommand()
327 {
328 Participant* participant = mConversationManager->getParticipant(mPartHandle);
329 if(participant)
330 {
332 }
333 }
334 virtual resip::Message* clone() const { return new DestroyParticipantCmd(*this); }
335 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " DestroyParticipantCmd: "; return strm; }
336 private:
337 ConversationManager* mConversationManager;
338 ParticipantHandle mPartHandle;
339};
340
342{
343 public:
350 virtual void executeCommand()
351 {
352 Participant* participant = mConversationManager->getParticipant(mPartHandle);
353 Conversation* conversation = mConversationManager->getConversation(mConvHandle);
354
356 {
357 // Participants using a media interface (ie: those with a connection port) can only belong to multiple conversations if they
358 // have the same media interface
359 if (participant->getConversations().size() > 0 && participant->getConnectionPortOnBridge() != -1)
360 {
361 // All conversations they are currently in will have the same media interface, just check that first conversation's media interface
362 // matches the new conversation we are trying to add to.
363 if (!mConversationManager->getMediaStackAdapter().canConversationsShareParticipants(participant->getConversations().begin()->second, conversation))
364 {
365 WarningLog(<< "AddParticipantCmd: participants cannot belong to multiple conversations that don't share a media interface in sipXConversationMediaInterfaceMode.");
366 return;
367 }
368 }
369 conversation->addParticipant(participant);
370 }
371 else
372 {
373 if(!participant)
374 {
375 WarningLog(<< "AddParticipantCmd: invalid participant handle: " << mPartHandle);
376 }
377 if(!conversation)
378 {
379 WarningLog(<< "AddParticipantCmd: invalid conversation handle: " << mConvHandle);
380 }
381 }
382 }
383 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " AddParticipantCmd: "; return strm; }
384 private:
385 ConversationManager* mConversationManager;
386 ConversationHandle mConvHandle;
387 ParticipantHandle mPartHandle;
388};
389
391{
392 public:
399 virtual void executeCommand()
400 {
401 Participant* participant = mConversationManager->getParticipant(mPartHandle);
402 Conversation* conversation = mConversationManager->getConversation(mConvHandle);
404 {
405 // When using multiple media interfaces, only local participants and remote IM participants can exist outside of any conversations. We need to
406 // prevent removal of other participant types (ie: those with a connection port on the bridge) from all conversations in this mode.
407 if (mConversationManager->getMediaStackAdapter().supportsMultipleMediaInterfaces() && participant->getNumConversations() == 1)
408 {
410 if (!localPart && participant->getConnectionPortOnBridge() != -1) // Note: connection port on bridge check eliminates RemoteIMParticipants from falling into if
411 {
412 WarningLog(<< "RemoveParticipantCmd: you cannot remove non-local participants from all conversations when in sipXConversationMediaInterfaceMode.");
413 return;
414 }
415 }
416 conversation->removeParticipant(participant);
417 }
418 }
419 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " RemoveParticipantCmd: "; return strm; }
420 private:
421 ConversationManager* mConversationManager;
422 ConversationHandle mConvHandle;
423 ParticipantHandle mPartHandle;
424};
425
427{
428 public:
437 virtual void executeCommand()
438 {
439 Participant* participant = mConversationManager->getParticipant(mPartHandle);
440 Conversation* sourceConversation = mConversationManager->getConversation(mSourceConvHandle);
441 Conversation* destConversation = mConversationManager->getConversation(mDestConvHandle);
443 {
445 {
446 // No-Op
447 return;
448 }
449
450 // If participant uses a media interface, then ensure it's safe to move
451 if (participant->getConnectionPortOnBridge() != -1)
452 {
453 // Safety check, mostly for when running in sipXConversationMediaInterfaceMode
454 // - ensure both conversation are using the same media interface
456 {
457 WarningLog(<< "MoveParticipantCmd: failed, both conversations must be using the same media interface.");
458 return;
459 }
460 }
461
462 // Add to new conversation and remove from old (add before remove, so that hold/unhold won't happen)
463 destConversation->addParticipant(participant);
464 sourceConversation->removeParticipant(participant);
465 }
466 else
467 {
468 if(!participant)
469 {
470 WarningLog(<< "MoveParticipantCmd: invalid participant handle: " << mPartHandle);
471 }
473 {
474 WarningLog(<< "MoveParticipantCmd: invalid source conversation handle: " << mSourceConvHandle);
475 }
477 {
478 WarningLog(<< "MoveParticipantCmd: invalid destination conversation handle: " << mDestConvHandle);
479 }
480 }
481 }
482 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " RemoveParticipantCmd: "; return strm; }
483 private:
484 ConversationManager* mConversationManager;
485 ParticipantHandle mPartHandle;
486 ConversationHandle mSourceConvHandle;
487 ConversationHandle mDestConvHandle;
488};
489
491{
492 public:
496 unsigned int inputGain,
497 unsigned int outputGain)
498 : mConversationManager(conversationManager),
499 mConvHandle(convHandle),
500 mPartHandle(partHandle),
501 mInputGain(inputGain),
502 mOutputGain(outputGain) {}
503 virtual void executeCommand()
504 {
505 Participant* participant = mConversationManager->getParticipant(mPartHandle);
506 Conversation* conversation = mConversationManager->getConversation(mConvHandle);
508 {
509 conversation->modifyParticipantContribution(participant, mInputGain, mOutputGain);
510 }
511 else
512 {
513 if(!participant)
514 {
515 WarningLog(<< "ModifyParticipantContributionCmd: invalid participant handle: " << mPartHandle);
516 }
517 if(!conversation)
518 {
519 WarningLog(<< "ModifyParticipantContributionCmd: invalid conversation handle: " << mConvHandle);
520 }
521 }
522 }
523 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " ModifyParticipantContributionCmd: "; return strm; }
524 private:
525 ConversationManager* mConversationManager;
526 ConversationHandle mConvHandle;
527 ParticipantHandle mPartHandle;
528 unsigned int mInputGain;
529 unsigned int mOutputGain;
530};
531
533{
534public:
539 virtual void executeCommand()
540 {
541 if (mChannelNum >= 1 && mChannelNum <= 2)
542 {
543 Participant* participant = mConversationManager->getParticipant(mPartHandle);
544 if (participant)
545 {
546 participant->setRecordChannelNum(mChannelNum);
547 }
548 else
549 {
550 WarningLog(<< "ModifyParticipantRecordChannelCmd: invalid participant handle: " << mPartHandle);
551 }
552 }
553 else
554 {
555 WarningLog(<< "ModifyParticipantRecordChannelCmd: partHandle=" << mPartHandle << ", invalid channelNum=" << mChannelNum << ", expecting either 1 or 2.");
556 }
557 }
558 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " ModifyParticipantRecordChannelCmd: partHandle=" << mPartHandle << ", channelNum=" << mChannelNum; return strm; }
559private:
560 ConversationManager* mConversationManager;
561 ParticipantHandle mPartHandle;
562 unsigned int mChannelNum;
563};
564
566{
567 public:
570 virtual void executeCommand()
571 {
572 mConversationManager->getMediaStackAdapter().outputBridgeMatrixImpl(mConversationHandle);
573 }
574 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " OutputBridgeMixWeightsCmd: conversationHandle=" << mConversationHandle; return strm; }
575 private:
576 ConversationManager* mConversationManager;
577 ConversationHandle mConversationHandle;
578};
579
581{
582 public:
585 bool earlyFlag)
586 : mConversationManager(conversationManager),
587 mPartHandle(partHandle),
588 mEarlyFlag(earlyFlag) {}
589 virtual void executeCommand()
590 {
591 RemoteParticipant* remoteParticipant = dynamic_cast<RemoteParticipant*>(mConversationManager->getParticipant(mPartHandle));
592 if(remoteParticipant)
593 {
594 if(mConversationManager->getMediaStackAdapter().supportsMultipleMediaInterfaces() && mEarlyFlag)
595 {
596 // Need to ensure, that the remote paticipant is added to a conversation before doing an operation that requires
597 // media (ie. EarlyMediaFlag set to true).
598 if(remoteParticipant->getConversations().size() == 0)
599 {
600 WarningLog(<< "AlertParticipantCmd: remote participants must be added to a conversation before alert with early flag can be used when in sipXConversationMediaInterfaceMode.");
601 return;
602 }
603 }
604 remoteParticipant->alert(mEarlyFlag);
605 }
606 else
607 {
608 WarningLog(<< "AlertParticipantCmd: invalid remote participant handle: " << mPartHandle);
609 }
610 }
611 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " AlertParticipantCmd: "; return strm; }
612 private:
613 ConversationManager* mConversationManager;
614 ParticipantHandle mPartHandle;
615 bool mEarlyFlag;
616};
617
619{
620 public:
625 virtual void executeCommand()
626 {
627 Participant* participant = mConversationManager->getParticipant(mPartHandle);
628 RemoteParticipant* remoteParticipant = dynamic_cast<RemoteParticipant*>(participant);
629 if(remoteParticipant)
630 {
631 if(mConversationManager->getMediaStackAdapter().supportsMultipleMediaInterfaces())
632 {
633 // Need to ensure, that the remote paticipant is added to a conversation before accepting the call
634 if(remoteParticipant->getConversations().size() == 0)
635 {
636 WarningLog(<< "AnswerParticipantCmd: remote participant must be added to a conversation before calling answer in sipXConversationMediaInterfaceMode.");
637 return;
638 }
639 }
640 remoteParticipant->accept();
641 return;
642 }
643
646 {
648 return;
649 }
650
651 WarningLog(<< "AnswerParticipantCmd: invalid remote participant handle: " << mPartHandle);
652 }
653 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " AnswerParticipantCmd: "; return strm; }
654 private:
655 ConversationManager* mConversationManager;
656 ParticipantHandle mPartHandle;
657};
658
660{
661 public:
664 unsigned int rejectCode)
665 : mConversationManager(conversationManager),
666 mPartHandle(partHandle),
667 mRejectCode(rejectCode) {}
668 virtual void executeCommand()
669 {
670 Participant* participant = mConversationManager->getParticipant(mPartHandle);
671 RemoteParticipant* remoteParticipant = dynamic_cast<RemoteParticipant*>(participant);
672 if(remoteParticipant)
673 {
674 remoteParticipant->reject(mRejectCode);
675 return;
676 }
677
680 {
681 remoteIMPagerParticipant->reject(mRejectCode);
682 return;
683 }
684
685 WarningLog(<< "RejectParticipantCmd: invalid remote participant handle: " << mPartHandle);
686 }
687 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " RejectParticipantCmd: "; return strm; }
688 private:
689 ConversationManager* mConversationManager;
690 ParticipantHandle mPartHandle;
691 unsigned int mRejectCode;
692};
693
695{
696 public:
699 const resip::NameAddr& destination,
700 unsigned int redirectCode,
702 : mConversationManager(conversationManager),
703 mPartHandle(partHandle),
704 mDestination(destination),
705 mRedirectCode(redirectCode),
706 mSuccessCondition(successCondition) {}
707 virtual void executeCommand()
708 {
709 RemoteParticipant* remoteParticipant = dynamic_cast<RemoteParticipant*>(mConversationManager->getParticipant(mPartHandle));
710 if(remoteParticipant)
711 {
712 remoteParticipant->redirect(mDestination, mRedirectCode, mSuccessCondition);
713 }
714 else
715 {
716 WarningLog(<< "RedirectParticipantCmd: invalid remote participant handle: " << mPartHandle);
717 }
718 }
719 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " RedirectParticipantCmd: "; return strm; }
720 private:
721 ConversationManager* mConversationManager;
722 ParticipantHandle mPartHandle;
723 resip::NameAddr mDestination;
724 unsigned int mRedirectCode;
726};
727
729{
730 public:
739 virtual void executeCommand()
740 {
741 RemoteParticipant* remoteParticipant = dynamic_cast<RemoteParticipant*>(mConversationManager->getParticipant(mPartHandle));
742 RemoteParticipant* destRemoteParticipant = dynamic_cast<RemoteParticipant*>(mConversationManager->getParticipant(mDestPartHandle));
743 if(remoteParticipant && destRemoteParticipant)
744 {
745 remoteParticipant->redirectToParticipant(destRemoteParticipant->getInviteSessionHandle(), mSuccessCondition);
746 }
747 else
748 {
749 if(!remoteParticipant)
750 {
751 WarningLog(<< "RedirectToParticipantCmd: invalid remote participant handle: " << mPartHandle);
752 }
754 {
755 WarningLog(<< "RedirectToParticipantCmd: invalid destination remote participant handle: " << mDestPartHandle);
756 }
757 }
758 }
759 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " RedirectToParticipantCmd: "; return strm; }
760 private:
761 ConversationManager* mConversationManager;
762 ParticipantHandle mPartHandle;
763 ParticipantHandle mDestPartHandle;
765};
766
768{
769 public:
772 bool hold)
773 : mConversationManager(conversationManager),
774 mPartHandle(partHandle),
775 mHold(hold) {}
776 virtual void executeCommand()
777 {
778 RemoteParticipant* remoteParticipant = dynamic_cast<RemoteParticipant*>(mConversationManager->getParticipant(mPartHandle));
779 if(remoteParticipant)
780 {
781 if(mConversationManager->getMediaStackAdapter().supportsMultipleMediaInterfaces() && mHold)
782 {
783 // Need to ensure, that the remote paticipant is added to a conversation before doing an opertation that requires
784 // media (ie. hold set to true).
785 if(remoteParticipant->getConversations().size() == 0)
786 {
787 WarningLog(<< "HoldParticipantCmd: remote participants must be added to a conversation before hold can be used when in sipXConversationMediaInterfaceMode.");
788 return;
789 }
790 }
791 remoteParticipant->setLocalHold(mHold);
792 }
793 else
794 {
795 WarningLog(<< "HoldParticipantCmd: invalid remote participant handle: " << mPartHandle);
796 }
797 }
798 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " HoldParticipantCmd: "; return strm; }
799 private:
800 ConversationManager* mConversationManager;
801 ParticipantHandle mPartHandle;
802 bool mHold;
803};
804
806{
807public:
810 std::unique_ptr<resip::Contents> contents)
811 : mConversationManager(conversationManager),
812 mPartHandle(partHandle),
813 mContents(std::move(contents)) {}
814 virtual void executeCommand()
815 {
816 Participant* participant = mConversationManager->getParticipant(mPartHandle);
818 if (imParticipant)
819 {
820 imParticipant->sendInstantMessage(std::move(mContents));
821 return;
822 }
823
824 WarningLog(<< "SendIMToParticipantCmd: invalid remote participant handle: " << mPartHandle);
825 }
826 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " SendIMToParticipantCmd: "; return strm; }
827private:
828 ConversationManager* mConversationManager;
829 ParticipantHandle mPartHandle;
830 std::unique_ptr<resip::Contents> mContents;
831};
832
834{
835 public:
840 virtual Message* clone() const { return new RequestKeyframeCmd(*this); }
841 virtual void executeCommand()
842 {
843 RemoteParticipant* remoteParticipant = dynamic_cast<RemoteParticipant*>(mConversationManager->getParticipant(mPartHandle));
844 if(remoteParticipant)
845 {
846 remoteParticipant->requestKeyframe();
847 }
848 else
849 {
850 WarningLog(<< "RequestKeyframeCmd: invalid remote participant handle: " << mPartHandle);
851 }
852 }
853 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " HoldParticipantCmd: "; return strm; }
854 private:
855 ConversationManager* mConversationManager;
856 ParticipantHandle mPartHandle;
857};
858
860{
861 public:
866 virtual Message* clone() const { return new RequestKeyframeFromPeerCmd(*this); }
867 virtual void executeCommand()
868 {
869 RemoteParticipant* remoteParticipant = dynamic_cast<RemoteParticipant*>(mConversationManager->getParticipant(mPartHandle));
870 if(remoteParticipant)
871 {
872 remoteParticipant->requestKeyframeFromPeer();
873 }
874 else
875 {
876 WarningLog(<< "RequestKeyframeFromPeerCmd: invalid remote participant handle: " << mPartHandle);
877 }
878 }
879 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " RequestKeyframeFromPeerCmd: "; return strm; }
880 private:
881 ConversationManager* mConversationManager;
882 ParticipantHandle mPartHandle;
883};
884
886{
887 public:
890 std::chrono::duration<double> interval)
891 : mConversationManager(conversationManager),
892 mPartHandle(partHandle),
893 mInterval(interval) {}
894 virtual Message* clone() const { return new RequestKeyframeFromPeerRecurringCmd(*this); }
895 virtual void executeCommand()
896 {
897 RemoteParticipant* remoteParticipant = dynamic_cast<RemoteParticipant*>(mConversationManager->getParticipant(mPartHandle));
898 if(remoteParticipant)
899 {
900 remoteParticipant->requestKeyframeFromPeerTimeout(false);
901 mConversationManager->requestKeyframeFromPeerRecurring(mPartHandle, mInterval);
902 }
903 else
904 {
905 WarningLog(<< "RequestKeyframeFromPeerRecurringCmd: invalid remote participant handle.");
906 }
907 }
908 EncodeStream& encodeBrief(EncodeStream& strm) const { strm << " RequestKeyframeFromPeerRecurringCmd: "; return strm; }
909 private:
910 ConversationManager* mConversationManager;
911 ParticipantHandle mPartHandle;
912 std::chrono::duration<double> mInterval;
913};
914
916{
917public:
919 unsigned int timerId, unsigned int timerData1, unsigned int timerData2)
920 : mConversationManager(conversationManager),
921 mTimerId(timerId),
922 mTimerData1(timerData1),
923 mTimerData2(timerData2) {}
924 virtual void executeCommand()
925 {
926 mConversationManager->onApplicationTimer(mTimerId, mTimerData1, mTimerData2);
927 }
928 resip::Message* clone() const { return new ApplicationTimerCmd(mConversationManager, mTimerId, mTimerData1, mTimerData2); }
929 EncodeStream& encode(EncodeStream& strm) const { strm << " ApplicationTimerCmd: timerId=" << mTimerId << ", data1=" << mTimerData1 << ", data2=" << mTimerData2; return strm; }
931private:
932 ConversationManager* mConversationManager;
933 unsigned int mTimerId;
934 unsigned int mTimerData1;
935 unsigned int mTimerData2;
936};
937
938}
939
940#undef RESIPROCATE_SUBSYSTEM
941
942#endif
943
944
945/* ====================================================================
946
947 Copyright (c) 2021-2023, SIP Spectrum, Inc. http://www.sipspectrum.com
948 Copyright (c) 2022, Software Freedom Institute https://softwarefreedom.institute
949 Copyright (c) 2021-2022, Daniel Pocock https://danielpocock.com
950 Copyright (c) 2007-2008, Plantronics, Inc.
951 All rights reserved.
952
953 Redistribution and use in source and binary forms, with or without
954 modification, are permitted provided that the following conditions are
955 met:
956
957 1. Redistributions of source code must retain the above copyright
958 notice, this list of conditions and the following disclaimer.
959
960 2. Redistributions in binary form must reproduce the above copyright
961 notice, this list of conditions and the following disclaimer in the
962 documentation and/or other materials provided with the distribution.
963
964 3. Neither the name of Plantronics nor the names of its contributors
965 may be used to endorse or promote products derived from this
966 software without specific prior written permission.
967
968 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
969 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
970 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
971 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
972 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
973 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
974 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
975 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
976 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
977 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
978 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
979
980 ==================================================================== */
#define WarningLog(args_)
Definition Logger.hxx:134
#define resip_assert(x)
This file needs to work for both C and C++ code.
AddParticipantCmd(ConversationManager *conversationManager, ConversationHandle convHandle, ParticipantHandle partHandle)
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
AlertParticipantCmd(ConversationManager *conversationManager, ParticipantHandle partHandle, bool earlyFlag)
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
AnswerParticipantCmd(ConversationManager *conversationManager, ParticipantHandle partHandle)
ApplicationTimerCmd(ConversationManager *conversationManager, unsigned int timerId, unsigned int timerData1, unsigned int timerData2)
EncodeStream & encode(EncodeStream &strm) const
output the entire message to stream
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
This class is one of two main classes of concern to an application using the UserAgent library.
virtual void onApplicationTimer(unsigned int timerId, unsigned int timerData1, unsigned int timerData2)
MediaStackAdapter & getMediaStackAdapter()
Conversation * getConversation(ConversationHandle convHandle)
virtual void requestKeyframeFromPeerRecurring(ParticipantHandle partHandle, std::chrono::duration< double > interval)
virtual void onParticipantDestroyed(ParticipantHandle partHandle)=0
Notifies an application when a Participant has been destroyed.
virtual RemoteParticipantDialogSet * createRemoteIMSessionParticipantDialogSetInstance(ConversationManager::ParticipantForkSelectMode forkSelectMode=ConversationManager::ForkSelectAutomatic, std::shared_ptr< ConversationProfile > conversationProfile=nullptr)
This class is used to manage membership of participants.
void modifyParticipantContribution(Participant *participant, unsigned int inputGain, unsigned int outputGain)
The classes defined here are used to pass commands from the application thread to the UserAgent threa...
CreateConversationCmd(ConversationManager *conversationManager, ConversationHandle convHandle, ConversationManager::AutoHoldMode autoHoldMode, ConversationHandle sharedMediaInterfaceConvHandle)
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
CreateLocalParticipantCmd(ConversationManager *conversationManager, ParticipantHandle partHandle)
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
CreateMediaResourceParticipantCmd(ConversationManager *conversationManager, ParticipantHandle partHandle, ConversationHandle convHandle, const resip::Uri &mediaUrl, const std::shared_ptr< resip::Data > &audioBuffer, void *recordingCircularBuffer)
CreateRemoteIMPagerParticipantCmd(ConversationManager *conversationManager, ParticipantHandle partHandle, const resip::NameAddr &destination, std::shared_ptr< ConversationProfile > conversationProfile=nullptr)
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
CreateRemoteIMSessionParticipantCmd(ConversationManager *conversationManager, ParticipantHandle partHandle, const resip::NameAddr &destination, ConversationManager::ParticipantForkSelectMode forkSelectMode, std::shared_ptr< ConversationProfile > callerProfile=nullptr, const std::multimap< resip::Data, resip::Data > &extraHeaders=(std::multimap< resip::Data, resip::Data >()))
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
CreateRemoteParticipantCmd(ConversationManager *conversationManager, ParticipantHandle partHandle, ConversationHandle convHandle, const resip::NameAddr &destination, ConversationManager::ParticipantForkSelectMode forkSelectMode, std::shared_ptr< ConversationProfile > callerProfile=nullptr, const std::multimap< resip::Data, resip::Data > &extraHeaders=(std::multimap< resip::Data, resip::Data >()))
DestroyConversationCmd(ConversationManager *conversationManager, ConversationHandle convHandle)
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
DestroyParticipantCmd(const DestroyParticipantCmd &rhs)
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
virtual resip::Message * clone() const
DestroyParticipantCmd(ConversationManager *conversationManager, ParticipantHandle partHandle)
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
HoldParticipantCmd(ConversationManager *conversationManager, ParticipantHandle partHandle, bool hold)
This class represents base functionality for a participant that supports IMs.
virtual void sendInstantMessage(std::unique_ptr< resip::Contents > contents)=0
JoinConversationCmd(ConversationManager *conversationManager, ConversationHandle sourceConvHandle, ConversationHandle destConvHandle)
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
This class represents a local participant.
This class represents a media resource participant.
virtual LocalParticipant * createLocalParticipantInstance(ParticipantHandle partHandle)=0
virtual MediaResourceParticipant * createMediaResourceParticipantInstance(ParticipantHandle partHandle, const resip::Uri &mediaUrl, const std::shared_ptr< resip::Data > &playAudioBuffer, void *recordingCircularBuffer)=0
virtual Conversation * createConversationInstance(ConversationHandle handle, RelatedConversationSet *relatedConversationSet, ConversationHandle sharedMediaInterfaceConvHandle, ConversationManager::AutoHoldMode autoHoldMode)=0
virtual bool supportsMultipleMediaInterfaces()=0
virtual bool canConversationsShareParticipants(Conversation *conversation1, Conversation *conversation2)=0
virtual RemoteParticipantDialogSet * createRemoteParticipantDialogSetInstance(ConversationManager::ParticipantForkSelectMode forkSelectMode=ConversationManager::ForkSelectAutomatic, std::shared_ptr< ConversationProfile > conversationProfile=nullptr)=0
ModifyParticipantContributionCmd(ConversationManager *conversationManager, ConversationHandle convHandle, ParticipantHandle partHandle, unsigned int inputGain, unsigned int outputGain)
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
ModifyParticipantRecordChannelCmd(ConversationManager *conversationManager, ParticipantHandle partHandle, unsigned int channelNum)
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
MoveParticipantCmd(ConversationManager *conversationManager, ParticipantHandle partHandle, ConversationHandle sourceConvHandle, ConversationHandle destConvHandle)
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
OutputBridgeMixWeightsCmd(ConversationManager *conversationManager, ConversationHandle convHandle)
This is the base class for a RemoteParticipant, LocalParticipant and a MediaResourceParticipant.
virtual void setRecordChannelNum(unsigned int channelNum)
virtual void destroyParticipant()=0
const ConversationMap & getConversations()
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
RedirectParticipantCmd(ConversationManager *conversationManager, ParticipantHandle partHandle, const resip::NameAddr &destination, unsigned int redirectCode, ConversationManager::RedirectSuccessCondition successCondition)
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
RedirectToParticipantCmd(ConversationManager *conversationManager, ParticipantHandle partHandle, ParticipantHandle destPartHandle, ConversationManager::RedirectSuccessCondition successCondition)
RejectParticipantCmd(ConversationManager *conversationManager, ParticipantHandle partHandle, unsigned int rejectCode)
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
This class represent an Instant Message remote participant.
virtual void reject(unsigned int rejectCode)
This class is used by Invite DialogSets.
This class represent a remote participant.
virtual void requestKeyframeFromPeerTimeout(bool reset)
virtual void redirectToParticipant(resip::InviteSessionHandle &destParticipantInviteSessionHandle, ConversationManager::RedirectSuccessCondition successCondition=ConversationManager::RedirectSuccessOnConnected)
virtual void redirect(resip::NameAddr &destination, unsigned int redirectCode=302, ConversationManager::RedirectSuccessCondition successCondition=ConversationManager::RedirectSuccessOnConnected)
virtual void initiateRemoteCall(const resip::NameAddr &destination)
virtual void setLocalHold(bool hold)
virtual void reject(unsigned int rejectCode)
virtual void alert(bool earlyFlag)
virtual void requestKeyframe()=0
RemoveParticipantCmd(ConversationManager *conversationManager, ConversationHandle convHandle, ParticipantHandle partHandle)
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
RequestKeyframeCmd(ConversationManager *conversationManager, ParticipantHandle partHandle)
virtual Message * clone() const
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
RequestKeyframeFromPeerCmd(ConversationManager *conversationManager, ParticipantHandle partHandle)
RequestKeyframeFromPeerRecurringCmd(ConversationManager *conversationManager, ParticipantHandle partHandle, std::chrono::duration< double > interval)
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
SendIMToParticipantCmd(ConversationManager *conversationManager, ParticipantHandle partHandle, std::unique_ptr< resip::Contents > contents)
EncodeStream & encodeBrief(EncodeStream &strm) const
output a brief description to stream
The base-class used for message-passing.
Definition Message.hxx:21
Represents the "name-addr" and the "addr-spec" elements in the RFC 3261 grammar.
Definition NameAddr.hxx:19
Represents the "SIP-URI" and "SIPS-URI" elements in the RFC 3261 grammar.
Definition Uri.hxx:22
unsigned int ConversationHandle
unsigned int ParticipantHandle
#define EncodeStream
void list()
Definition userAdmin.cxx:66