bool InboundRTMPSDiscriminatorProtocol::BindSSL(IOBuffer &buffer) { //1. Create the RTMP protocol BaseProtocol *pRTMP = new InboundRTMPProtocol(); if (!pRTMP->Initialize(GetCustomParameters())) { FATAL("Unable to create RTMP protocol"); pRTMP->EnqueueForDelete(); return false; } //2. Destroy the link BaseProtocol *pFar = _pFarProtocol; pFar->ResetNearProtocol(); ResetFarProtocol(); //3. Create the new links pFar->SetNearProtocol(pRTMP); pRTMP->SetFarProtocol(pFar); //4. Set the application pRTMP->SetApplication(GetApplication()); //5. Enqueue for delete this protocol EnqueueForDelete(); //6. Process the data if (!pRTMP->SignalInputData(buffer)) { FATAL("Unable to process data"); pRTMP->EnqueueForDelete(); } return true; }
BaseProtocol *InboundHTTP4RTMP::Bind(string sid) { BaseProtocol *pResult = NULL; if (_pNearProtocol == NULL) { //14. This might be a new connection. Do we have that sid generated? if (!MAP_HAS1(_generatedSids, sid)) { FATAL("Invalid sid: %s", STR(sid)); return false; } //15. See if we have to generate a new connection or we just pick up //a disconnected one if (MAP_HAS1(_protocolsBySid, sid)) { pResult = ProtocolManager::GetProtocol(_protocolsBySid[sid]); } else { pResult = new InboundRTMPProtocol(); pResult->Initialize(GetCustomParameters()); pResult->SetApplication(GetApplication()); _protocolsBySid[sid] = pResult->GetId(); SetNearProtocol(pResult); pResult->SetFarProtocol(this); } } else { pResult = _pNearProtocol; } return pResult; }
void HTTPBuffAppProtocolHandler::RegisterProtocol(BaseProtocol *pProtocol) { //1. Get the TS protocol ID from the parameters uint32_t tsId = pProtocol->GetCustomParameters()["payload"]["tsId"]; //2. Get the TS protocol BaseProtocol *pTSProtocol = ProtocolManager::GetProtocol(tsId); if (pTSProtocol == NULL) { FATAL("Unable to get TS protocol by id: %u", tsId); pProtocol->EnqueueForDelete(); return; } //3. Link them pProtocol->SetNearProtocol(pTSProtocol); pTSProtocol->SetFarProtocol(pProtocol); //4. make sure that upper protocols survive AES protocol death pProtocol->DeleteNearProtocol(false); //5. Do the HTTP request if (!((GenericProtocol *) pProtocol)->DoHTTPRequest()) { FATAL("Unable to do HTTP request"); pProtocol->EnqueueForDelete(); return; } }