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;
}
예제 #2
0
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;
	}
}