ActivityManager::ActivityManager(QObject *parent) :QObject(parent) { _conductorOne = new talk_base::RefCountedObject<Conductor>(this,"ONE"); _conductorTwo = new talk_base::RefCountedObject<Conductor>(this,"TWO"); QObject::connect(_conductorOne,SIGNAL(sendBye()),_conductorTwo,SLOT(callbackBye())); QObject::connect(_conductorOne,SIGNAL(sendDescription(std::string,std::string)), _conductorTwo,SLOT(callbackDescription(std::string,std::string))); QObject::connect(_conductorOne,SIGNAL(sendCandidate(std::string,int,std::string)), _conductorTwo,SLOT(callbackCandidate(std::string,int,std::string))); QObject::connect(_conductorTwo,SIGNAL(sendBye()),_conductorOne,SLOT(callbackBye())); QObject::connect(_conductorTwo,SIGNAL(sendDescription(std::string,std::string)), _conductorOne,SLOT(callbackDescription(std::string,std::string))); QObject::connect(_conductorTwo,SIGNAL(sendCandidate(std::string,int,std::string)), _conductorOne,SLOT(callbackCandidate(std::string,int,std::string))); _peer_connection_factory = webrtc::CreatePeerConnectionFactory(); talk_base::scoped_refptr<webrtc::AudioTrackInterface> audio_track(_peer_connection_factory->CreateAudioTrack("Audio", _peer_connection_factory->CreateAudioSource(NULL))); talk_base::scoped_refptr<webrtc::VideoTrackInterface> video_track( _peer_connection_factory->CreateVideoTrack("Video",_peer_connection_factory->CreateVideoSource(OpenVideoCaptureDevice(),NULL))); _globalstream = _peer_connection_factory->CreateLocalMediaStream("Stream"); _globalstream->AddTrack(audio_track); _globalstream->AddTrack(video_track); }
int main(int argc, char** argv) { struct soap* serv = soap_new1(SOAP_IO_UDP | SOAP_IO_KEEPALIVE); serv->bind_flags=SO_REUSEADDR; serv->connect_flags = SO_BROADCAST; if (!soap_valid_socket(soap_bind(serv, NULL, port, 1000))) { soap_print_fault(serv, stderr); exit(1); } ip_mreq mcast; mcast.imr_multiaddr.s_addr = inet_addr(host); mcast.imr_interface.s_addr = htonl(INADDR_ANY); if (setsockopt(serv->master, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mcast, sizeof(mcast))<0) { std::cout << "group membership failed:" << strerror(errno) << std::endl; } sendHello(); mainloop(serv); signal(SIGINT, &sighandler); while (!stop) { mainloop(serv); } sendBye(); mainloop(serv); return 0; }
void UserAgent::doDefaultAction(void) { switch(defaultAction) { case SIP_DISCONN: printf("\n\tSIP: Disconnected."); cleanup(); break; case SIP_BYE: if(5 > rptCount++) { memo = common->sipRmg->allocMemo(); sendBye(); defaultAction = SIP_BYE; } else { rptCount=0; state = SIP_UA_DISCONNECTED; defaultAction = SIP_DISCONN; } waitMSec=500; break; case SIP_CONN: printf("\n\tSIP: Connect failed: Timed out!"); state = SIP_UA_DISCONNECTED; cleanup(); defaultAction= SIP_NONE; break; case SIP_INV_ACK: defaultAction= SIP_NONE; break; case SIP_INCOMING: common->isRinging=0; defaultAction= SIP_NONE; cleanup(); break; case SIP_RINGING: printf("\n\tSIP: Ringing callee..."); waitMSec=3000; break; case SIP_SEND_RING: printf("\n\tRing #%d!!!",rptCount); if(5 > rptCount++) { memo = common->sipRmg->allocMemo(); sendRinging(); defaultAction = SIP_SEND_RING; } else { rptCount=0; defaultAction = SIP_INCOMING; } waitMSec=3000; break; default: break; } }
void* UserAgent::run(void* arg) { common = (Common *)arg; init(0); while(common->go) { memo = (Memo*)common->signalQ->waitForData(waitMSec); if(memo) switch(memo->code) { case VIVOCE_SIP_INVITE: if(state==SIP_UA_DISCONNECTED) { //printf("\n\tSending INVITE...."); name = strtok_r(memo->bytes,"@",&temp); remoteId = (char*)malloc(strlen(name)+1); sprintf(remoteId,"%s",name); name = strtok_r(NULL,":",&temp); if(name) { remoteHost = (char*) malloc(strlen(name)+1); sprintf(remoteHost,"%s",name); name=name = strtok_r(NULL,":",&temp); if(name) remoteSipPort = atoi(name); else remoteSipPort = VIVOCE_SIP_PORT; sendInvite(); common->reset(); } else { printf("\n\tSIP: Malformed URI"); common->sipRmg->releaseMemo(memo); } } else common->sipRmg->releaseMemo(memo); break; case VIVOCE_SIP_BYE: if(common->isConnected) { common->isConnected=0; printf("\n\tDisconnecting...."); rptCount=0; sendBye(); } else common->sipRmg->releaseMemo(memo); break; case VIVOCE_SIP_ACCEPT: if(state == SIP_UA_RCVD_INV) { //printf("\n\tSending OK...."); sendOk(); state = SIP_UA_ACCEPTED; common->isRinging=0; } else common->sipRmg->releaseMemo(memo); break; case VIVOCE_SIP_REJECT: if(state == SIP_UA_RCVD_INV) { //printf("\n\tSending DECLINE...."); sendDecline(); common->isRinging=0; } else common->sipRmg->releaseMemo(memo); break; case VIVOCE_SIP_RCVD: //incoming!! if(common->verbose) { printf("\n\tINFO: SIP Msg Recv=%d bytes:\n%s", memo->data1,memo->bytes); } sipPackRecv->reset(); ret = SIPHandler::read(memo->bytes, memo->data1, sipPackRecv); if(ret<0) { printf("\n\tSIP: Error in parsing SIP packet"); } else { if((!sipPackRecv->isRequest) && (sipPackRecv->responseCode!=SIP_RESPONSE_OK)) { printf("\n\tSIP: Received response code %d.", sipPackRecv->responseCode); } switch(state) { case SIP_UA_DISCONNECTED: if((sipPackRecv->isRequest) && (sipPackRecv->requestCode==SIP_METHOD_INV)) { checkPacket(); if(discard) { printf("\n\tSIP: Incorrect SDP content: discarding"); common->sipRmg->releaseMemo(memo); checkSrc=false; } else { callId = sipPackRecv->callId; callIdHost = (char*)malloc(strlen(sipPackRecv->callIdHost)+1); sprintf(callIdHost, "%s", sipPackRecv->callIdHost); //memory leak in these mallocs, but fixing them with realloc causes segfaults! for now, waste these ~100 bytes... remoteId = (char*)malloc(strlen(sipPackRecv->contactUri.id)+1); sprintf(remoteId, "%s", sipPackRecv->contactUri.id); remoteHost = (char*)malloc(strlen(sipPackRecv->contactUri.host)+1); sprintf(remoteHost,"%s", sipPackRecv->contactUri.host); printf("\n\tSIP: Recvd invite from %s at %s!!!", sipPackRecv->contactUri.id, sipPackRecv->contactUri.host); printf("\n\tRing!!!"); sendRinging(); waitMSec=2500; state = SIP_UA_RCVD_INV; defaultAction = SIP_SEND_RING; } } else common->sipRmg->releaseMemo(memo); //else discard break; case SIP_UA_SENT_INV: if((!sipPackRecv->isRequest) && (sipPackRecv->callId == callId) && (!strcmp(callIdHost,sipPackRecv->callIdHost))) { if(sipPackRecv->responseCode==SIP_RESPONSE_RING) { printf("\n\tSIP: Ringing callee...."); common->isRinging=1; waitMSec=5000; defaultAction = SIP_CONN; //display ringing for some time common->sipRmg->releaseMemo(memo); } else if(sipPackRecv->responseCode==SIP_RESPONSE_BUSY) { printf("\n\tSIP: Callee is Busy! Try again later"); waitMSec=500; defaultAction = SIP_DISCONN; common->sipRmg->releaseMemo(memo); common->isRinging=0; } else if(sipPackRecv->responseCode==SIP_RESPONSE_DECLINE) { printf("\n\tSIP: Callee has declined to accept your call"); waitMSec=500; defaultAction = SIP_DISCONN; common->sipRmg->releaseMemo(memo); common->isRinging=0; } else if(sipPackRecv->responseCode==SIP_RESPONSE_OK) { checkPacket(); if(discard) { printf("\n\tSIP: Incorrect SDP content: discarding"); common->sipRmg->releaseMemo(memo); checkSrc=false; } else { if(common->verbose) { printf("\n\tINFO: Listening for RTP/RTCP on ports %d/%d", remoteRtpPort, remoteRtcpPort); } UdpBase::initRemoteAddr(common, remoteHost, remoteRtpPort, remoteRtcpPort, 0); printf("\n\tSIP: Connected!!!"); sendAck(); common->isRinging=0; } } else checkSrc=true; } else checkSrc=true; break; case SIP_UA_SENT_BYE: if(!sipPackRecv->isRequest) { if(sipPackRecv->responseCode==SIP_RESPONSE_OK) { printf("\n\tSIP: Disconnect complete."); state = SIP_UA_DISCONNECTED; cleanup(); defaultAction = SIP_NONE; } common->sipRmg->releaseMemo(memo); } else checkSrc=true; break; case SIP_UA_ACCEPTED: if(sipPackRecv->isRequest && (sipPackRecv->requestCode== SIP_METHOD_ACK) && (sipPackRecv->callId == callId) && (!strcmp(callIdHost, sipPackRecv->callIdHost))) { //printf("\n\tSIP: Acknowledged...."); common->isConnected = 1; common->rtpMgr->init(RTP_PAYLOAD_TYPE_ADPCM, const_cast<char*>("stats")); waitMSec=2500; defaultAction = SIP_NONE; state = SIP_UA_IN_CALL; common->sipRmg->releaseMemo(memo); common->isRinging=0; } else checkSrc=true; break; case SIP_UA_REJECTED: if(sipPackRecv->isRequest && (sipPackRecv->requestCode== SIP_METHOD_ACK) && (sipPackRecv->callId == callId) && (!strcmp(callIdHost,sipPackRecv->callIdHost))) { //printf("\n\tSIP: Acknowledged...."); common->isConnected=0; waitMSec=500; defaultAction = SIP_DISCONN; common->sipRmg->releaseMemo(memo); common->isRinging=0; } else checkSrc=true; break; case SIP_UA_IN_CALL: if(sipPackRecv->isRequest && (sipPackRecv->requestCode==SIP_METHOD_BYE) && (sipPackRecv->callId == callId)) { //printf("\n\tSending OK for BYE...."); printf("\n\tSIP: Disconnected by peer."); sendOk(); common->isConnected=0; waitMSec=2500; defaultAction = SIP_DISCONN; state = SIP_UA_DISCONNECTED; } else checkSrc=true; break; default: checkSrc=true; break; } if(checkSrc) { checkSrc=false; if(sipPackRecv->callId != callId) { //printf("\n\tSending BUSY"); UdpBase::initTempRemoteAddr(common, sipPackRecv->contactUri.host, remoteSipPort); sendBusy(); } else common->sipRmg->releaseMemo(memo); } break; } break; default: printf("\n\tSIP: In invalid state! %d",state); common->sipRmg->releaseMemo(memo); break; case VIVOCE_RESPOND: printf("\n\tUser Agent active - %d",state); common->sipRmg->releaseMemo(memo); break; } else doDefaultAction(); } printf("UserAgent stopped. "); return NULL; }
void CommunicationClientDetector::stop() { sendBye(); _udpCommunication->stop(); }