Skip to content

Commit 5557222

Browse files
Merge 7794302 into 01c8d2b
2 parents 01c8d2b + 7794302 commit 5557222

File tree

4 files changed

+159
-2
lines changed

4 files changed

+159
-2
lines changed

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,18 @@ The softphone exposes the following resources on port `6060`.
134134
<td>Break specified <code>call_id</code> out of conference</td>
135135
</tr>
136136
<tr>
137+
<td><code>/calls/{call_id}/join/{call_to_join_id}</code></td>
138+
<td>POST</td>
139+
<td></td>
140+
<td>Merges the current call (<code>call_id</code>) with another running call (<code>call_to_join_id</code>)</td>
141+
</tr>
142+
<tr>
143+
<td><code>/calls/{call_id}/unjoin/{call_to_unjoin_id}</code></td>
144+
<td>POST</td>
145+
<td></td>
146+
<td>Break specified <code>call_id</code> out of conference with <code>call_to_unjoin_id</code></td>
147+
</tr>
148+
<tr>
137149
<td><code>/calls/{call_id}/transfer</code></td>
138150
<td>POST</td>
139151
<td>

tinyphone/phone.cpp

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -531,5 +531,59 @@ namespace tp {
531531
return true;
532532
}
533533

534-
}
534+
bool TinyPhone::Join(SIPCall* call, SIPCall* call_to_join) {
535+
try {
536+
call_to_join->UnHoldCall();
537+
} catch(...) {
538+
PJ_LOG(3, (__FILENAME__, "TinyPhone::Join UnHoldCall Error"));
539+
return false;
540+
}
541+
542+
AudioMedia aud_med, aud_med2;
543+
try {
544+
aud_med = call->getAudioMedia(-1);
545+
aud_med2 = call_to_join->getAudioMedia(-1);
546+
} catch(...) {
547+
PJ_LOG(3, (__FILENAME__, "TinyPhone::Join getAudioMedia Error"));
548+
return false;
549+
}
550+
551+
try {
552+
aud_med.startTransmit(aud_med2);
553+
aud_med2.startTransmit(aud_med);
554+
} catch(...) {
555+
PJ_LOG(3, (__FILENAME__, "TinyPhone::Join startTransmit Error"));
556+
return false;
557+
}
558+
559+
return true;
560+
}
535561

562+
bool TinyPhone::Unjoin(SIPCall* call, SIPCall* call_to_unjoin) {
563+
try {
564+
call_to_unjoin->HoldCall();
565+
} catch(...) {
566+
PJ_LOG(3, (__FILENAME__, "TinyPhone::Unjoin HoldCall Error"));
567+
return false;
568+
}
569+
570+
AudioMedia aud_med, aud_med2;
571+
try {
572+
aud_med = call->getAudioMedia(-1);
573+
aud_med2 = call_to_unjoin->getAudioMedia(-1);
574+
} catch(...) {
575+
PJ_LOG(3, (__FILENAME__, "TinyPhone::Unjoin getAudioMedia Error"));
576+
return false;
577+
}
578+
579+
try {
580+
aud_med.stopTransmit(aud_med2);
581+
aud_med2.stopTransmit(aud_med);
582+
} catch(...) {
583+
PJ_LOG(3, (__FILENAME__, "TinyPhone::Unjoin stopTransmit Error"));
584+
return false;
585+
}
586+
587+
return true;
588+
}
589+
}

tinyphone/phone.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,9 @@ namespace tp {
122122

123123
bool Conference(SIPCall* call);
124124
bool BreakConference(SIPCall* call);
125+
126+
bool Join(SIPCall* call, SIPCall* call_to_join);
127+
bool Unjoin(SIPCall* call, SIPCall* call_to_unjoin);
125128

126129
void HangupAllCalls();
127130

tinyphone/server.cpp

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,95 @@ void TinyPhoneHttpServer::Start() {
591591
return tp::response(200, response);
592592
}
593593
});
594-
594+
595+
CROW_ROUTE(app, "/calls/<int>/join/<int>")
596+
.methods("POST"_method)
597+
([&phone](int call_id, int call_to_join_id) {
598+
pj_thread_auto_register();
599+
600+
SIPCall* call = phone.CallById(call_id);
601+
SIPCall* call_to_join = phone.CallById(call_to_join_id);
602+
603+
if (call == nullptr) {
604+
return tp::response(400, {
605+
{ "message", "Current Call Not Found" },
606+
{ "call_id" , call_id },
607+
{ "call_to_join_id" , call_to_join_id },
608+
});
609+
}
610+
else if (call_to_join == nullptr) {
611+
return tp::response(400, {
612+
{ "message", "Call To Join Not Found" },
613+
{ "call_id" , call_id },
614+
{ "call_to_join_id" , call_to_join_id }
615+
});
616+
}
617+
else if (call->HoldState() == +HoldStatus::LOCAL_HOLD) {
618+
json response = {
619+
{ "message", "Bad Request, CallOnHold Currently" },
620+
{ "call_id" , call_id },
621+
{ "call_to_join_id" , call_to_join_id },
622+
{ "status", "400" }
623+
};
624+
625+
return tp::response(400, response);
626+
}
627+
else {
628+
json response = {
629+
{ "message", "Calls Join Triggered" },
630+
{ "call_id" , call_id },
631+
{ "call_to_join_id" , call_to_join_id },
632+
{ "response", phone.Join(call, call_to_join) }
633+
};
634+
635+
return tp::response(200, response);
636+
}
637+
});
638+
639+
CROW_ROUTE(app, "/calls/<int>/unjoin/<int>")
640+
.methods("POST"_method)
641+
([&phone](int call_id, int call_to_unjoin_id) {
642+
pj_thread_auto_register();
643+
644+
SIPCall* call = phone.CallById(call_id);
645+
SIPCall* call_to_unjoin = phone.CallById(call_to_unjoin_id);
646+
647+
if (call == nullptr) {
648+
return tp::response(400, {
649+
{ "message", "Current Call Not Found" },
650+
{ "call_id" , call_id },
651+
{ "call_to_unjoin_id" , call_to_unjoin_id },
652+
});
653+
}
654+
else if (call_to_unjoin == nullptr) {
655+
return tp::response(400, {
656+
{ "message", "Call To Unjoin Not Found" },
657+
{ "call_id" , call_id },
658+
{ "call_to_unjoin_id" , call_to_unjoin_id }
659+
});
660+
}
661+
else if (call->HoldState() == +HoldStatus::LOCAL_HOLD) {
662+
json response = {
663+
{ "message", "Bad Request, CallOnHold Currently" },
664+
{ "call_id" , call_id },
665+
{ "call_to_unjoin_id" , call_to_unjoin_id },
666+
{ "status", "400" }
667+
};
668+
669+
return tp::response(400, response);
670+
}
671+
else {
672+
json response = {
673+
{ "message", "Calls Unjoin Triggered" },
674+
{ "call_id" , call_id },
675+
{ "call_to_unjoin_id" , call_to_unjoin_id },
676+
{ "response", phone.Unjoin(call, call_to_unjoin) }
677+
};
678+
679+
return tp::response(200, response);
680+
}
681+
});
682+
595683
CROW_ROUTE(app, "/calls/<int>/transfer")
596684
.methods("POST"_method)
597685
([&phone](const crow::request& req, int call_id) {

0 commit comments

Comments
 (0)