예제 #1
0
파일: Main.c 프로젝트: AlexDmr/devcomets
int main(void)
{
	UPnPmicroStackChain = ILibCreateChain();
	
	/* TODO: Each device must have a unique device identifier (UDN) */
	UPnPmicroStack = UPnPCreateMicroStack(UPnPmicroStackChain,"Sample Device","f8b67906-edb8-4701-a9b2-36c29262c82d","0000001",15,0);
	
	UPnPFP_ImportedService_getTcpServer=&UPnPImportedService_getTcpServer;
	UPnPFP_ImportedService_setForce=&UPnPImportedService_setForce;
	UPnPFP_ImportedService_setPage=&UPnPImportedService_setPage;
	UPnPFP_ImportedService_setSerial=&UPnPImportedService_setSerial;
	UPnPFP_ImportedService_setX=&UPnPImportedService_setX;
	UPnPFP_ImportedService_setY=&UPnPImportedService_setY;
	
	
	/* All evented state variables MUST be initialized before UPnPStart is called. */
	UPnPSetState_ImportedService_page(UPnPmicroStack,"Sample String");
	UPnPSetState_ImportedService_x(UPnPmicroStack,25000);
	UPnPSetState_ImportedService_y(UPnPmicroStack,25000);
	UPnPSetState_ImportedService_serial(UPnPmicroStack,"Sample String");
	UPnPSetState_ImportedService_force(UPnPmicroStack,25000);
	
	printf("Intel MicroStack 1.0 \r\n\r\n");
	
	UPnPMonitor = ILibCreateLifeTime(UPnPmicroStackChain);
	UPnPIPAddressLength = ILibGetLocalIPAddressList(&UPnPIPAddressList);
	ILibLifeTime_Add(UPnPMonitor,NULL,4,&UPnPIPAddressMonitor,NULL);
	
	signal(SIGINT,BreakSink);
	ILibStartChain(UPnPmicroStackChain);
	
	free(UPnPIPAddressList);
	return 0;
}
void ServerAddedRemoved(struct UPnPDevice *device, int added)
{
	int i;
	if (added != 0)
	{
		for(i=0;i<32;i++)
		{
			if (devices[i] == NULL) {devices[i] = device;break;}
		}
	}
	else
	{
		for(i=0;i<32;i++)
		{
			if (devices[i] == device) {devices[i] = NULL;break;}
		}
		if (MediaListCurrentDevice == device) MainDialog->OnFileMovetoserverlist();
	}

	if (IPAddressList != NULL)
	{
		free (IPAddressList);
		IPAddressList = NULL;
	}
	IPAddressListLen = ILibGetLocalIPAddressList(&IPAddressList);

	if (MediaListCurrentDevice == NULL) DisplayMediaList(NULL);
}
예제 #3
0
파일: Main.c 프로젝트: optman/upnpstack
int main(void)
{
	UPnPmicroStackChain = ILibCreateChain();
	
	/* TODO: Each device must have a unique device identifier (UDN) */
	UPnPmicroStack = UPnPCreateMicroStack(UPnPmicroStackChain,"Intel Media Server","35bb3970-f938-4391-b962-c52d566032ea","0000001",1800,0);
	
	/* All evented state variables MUST be initialized before UPnPStart is called. */
	UPnPSetState_ConnectionManager_SourceProtocolInfo(UPnPmicroStack,"Sample String");
	UPnPSetState_ConnectionManager_SinkProtocolInfo(UPnPmicroStack,"Sample String");
	UPnPSetState_ConnectionManager_CurrentConnectionIDs(UPnPmicroStack,"Sample String");
	UPnPSetState_ContentDirectory_TransferIDs(UPnPmicroStack,"Sample String");
	UPnPSetState_ContentDirectory_ContainerUpdateIDs(UPnPmicroStack,"Sample String");
	UPnPSetState_ContentDirectory_SystemUpdateID(UPnPmicroStack,250);
	
	printf("Intel MicroStack 1.0 - Intel Media Server\r\n\r\n");
	
	UPnPMonitor = ILibCreateLifeTime(UPnPmicroStackChain);
	UPnPIPAddressLength = ILibGetLocalIPAddressList(&UPnPIPAddressList);
	ILibLifeTime_Add(UPnPMonitor,NULL,4,&UPnPIPAddressMonitor,NULL);
	
	signal(SIGINT,BreakSink);
	ILibStartChain(UPnPmicroStackChain);
	
	return 0;
}
예제 #4
0
void ILibSSDP_IPAddressListChanged(void *SSDPToken)
{
    struct SSDPClientModule *RetVal = (struct SSDPClientModule*)SSDPToken;
    int i;
    char* buffer;
    int bufferlength;

    if(RetVal->IPAddress!=NULL)
    {
        free(RetVal->IPAddress);
    }
    RetVal->NumIPAddress = ILibGetLocalIPAddressList(&(RetVal->IPAddress));

    for(i=0; i<RetVal->NumIPAddress; ++i)
    {
        ILibAsyncUDPSocket_JoinMulticastGroup(RetVal->SSDPListenSocket, RetVal->IPAddress[i], inet_addr(UPNP_GROUP));
    }

    buffer = (char*)malloc(105+RetVal->DeviceURNLength);
    bufferlength = sprintf(buffer,"M-SEARCH * HTTP/1.1\r\nMX: 3\r\nST: %s\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\n\r\n",RetVal->DeviceURN);

    for(i=0; i<RetVal->NumIPAddress; ++i)
    {
#if defined(_WIN32_WCE) && _WIN32_WCE < 400
        ILibAsyncUDPSocket_SendTo(RetVal->MSEARCH_Response_Socket, inet_addr(UPNP_GROUP), UPNP_PORT, buffer, bufferlength, ILibAsyncSocket_MemoryOwnership_USER);
#else
        if(ILibAsyncUDPSocket_SetMulticastInterface(RetVal->MSEARCH_Response_Socket, RetVal->IPAddress[i]) == 0)
        {
            ILibAsyncUDPSocket_SendTo(RetVal->MSEARCH_Response_Socket, inet_addr(UPNP_GROUP), UPNP_PORT, buffer, bufferlength, ILibAsyncSocket_MemoryOwnership_USER);
        }
#endif
    }
    free(buffer);
}
예제 #5
0
int main(void)
{
	UpnpmicroStackChain = ILibCreateChain();
	
	/* TODO: Each device must have a unique device identifier (UDN) */
	UpnpmicroStack = UpnpCreateMicroStack(UpnpmicroStackChain,"Intel's Micro Media Server","cefd004c-525b-42f9-95cd-6a9c70371e65","0000001",1800,0);
	
	/* All evented state variables MUST be initialized before UPnPStart is called. */
	UpnpSetState_ContentDirectory_SystemUpdateID(UpnpmicroStack,250);
	UpnpSetState_ConnectionManager_SourceProtocolInfo(UpnpmicroStack,"Sample String");
	UpnpSetState_ConnectionManager_SinkProtocolInfo(UpnpmicroStack,"Sample String");
	UpnpSetState_ConnectionManager_CurrentConnectionIDs(UpnpmicroStack,"Sample String");
	
	printf("Intel MicroStack 1.0 - Intel's Micro Media Server\r\n\r\n");
	
	UpnpMonitor = ILibCreateLifeTime(UpnpmicroStackChain);
	UpnpIPAddressLength = ILibGetLocalIPAddressList(&UpnpIPAddressList);
	ILibLifeTime_Add(UpnpMonitor,NULL,4,&UpnpIPAddressMonitor,NULL);
	
	signal(SIGINT,BreakSink);
	ILibStartChain(UpnpmicroStackChain);
	
	FREE(UpnpIPAddressList);
	return 0;
}
예제 #6
0
파일: Main.c 프로젝트: optman/upnpstack
int main(void)
{
	UPnPmicroStackChain = ILibCreateChain();
	
	/* TODO: Each device must have a unique device identifier (UDN) */
	UPnPmicroStack = UPnPCreateMicroStack(UPnPmicroStackChain,"Intel AV Renderer","fada97a9-5917-4c8f-a2a9-147b44e84953","0000001",1800,0);
	
	/* All evented state variables MUST be initialized before UPnPStart is called. */
	UPnPSetState_RenderingControl_LastChange(UPnPmicroStack,"Sample String");
	UPnPSetState_AVTransport_LastChange(UPnPmicroStack,"Sample String");
	UPnPSetState_ConnectionManager_SourceProtocolInfo(UPnPmicroStack,"Sample String");
	UPnPSetState_ConnectionManager_SinkProtocolInfo(UPnPmicroStack,"Sample String");
	UPnPSetState_ConnectionManager_CurrentConnectionIDs(UPnPmicroStack,"Sample String");
	
	printf("Intel MicroStack 1.0 - Intel AV Renderer\r\n\r\n");
	
	UPnPMonitor = ILibCreateLifeTime(UPnPmicroStackChain);
	UPnPIPAddressLength = ILibGetLocalIPAddressList(&UPnPIPAddressList);
	ILibLifeTime_Add(UPnPMonitor,NULL,4,&UPnPIPAddressMonitor,NULL);
	
	signal(SIGINT,BreakSink);
	ILibStartChain(UPnPmicroStackChain);
	
	return 0;
}
예제 #7
0
파일: Main.c 프로젝트: optman/upnpstack
int _tmain(int argc, _TCHAR* argv[])
{
	UpnpmicroStackChain = ILibCreateChain();
	
	/* TODO: Each device must have a unique device identifier (UDN) */
	UpnpmicroStack = UpnpCreateMicroStack(UpnpmicroStackChain,"MicroDMA","6cace70b-ed87-4648-a6ac-46ee6f5e895c","0000001",1800,0);
	
	/* All evented state variables MUST be initialized before UPnPStart is called. */
	UpnpSetState_ConnectionManager_SourceProtocolInfo(UpnpmicroStack,"Sample String");
	UpnpSetState_ConnectionManager_SinkProtocolInfo(UpnpmicroStack,"Sample String");
	UpnpSetState_ConnectionManager_CurrentConnectionIDs(UpnpmicroStack,"Sample String");
	UpnpSetState_RenderingControl_LastChange(UpnpmicroStack,"Sample String");
	UpnpSetState_AVTransport_LastChange(UpnpmicroStack,"Sample String");
	UpnpSetState_RemoteIO_PeerConnection(UpnpmicroStack,"Sample String");
	UpnpSetState_ChannelManager_RegisteredChannelList(UpnpmicroStack,"Sample String");
	
	printf("Intel MicroStack 1.0 - MicroDMA\r\n\r\n");
	CreateThread(NULL,0,&Run,NULL,0,NULL);
	
	UpnpMonitor = ILibCreateLifeTime(UpnpmicroStackChain);
	UpnpIPAddressLength = ILibGetLocalIPAddressList(&UpnpIPAddressList);
	ILibLifeTime_Add(UpnpMonitor,NULL,4,&UpnpIPAddressMonitor,NULL);
	
	ILibStartChain(UpnpmicroStackChain);
	
	FREE(UpnpIPAddressList);
	return 0;
}
예제 #8
0
unsigned long WINAPI UPnPMain(void* ptr)
{
	int i;
	char guid[20];
	char friendlyname[100];
	WSADATA wsaData;

	MmsOnStatsChanged = &MmsOnStatsChangedSink;
	MmsOnTransfersChanged = &MmsMediaTransferStatsSink;

	srand((int)GetTickCount());
	for (i=0;i<19;i++)
	{
		guid[i] = (rand() % 25) + 66;
	}
	guid[19] = 0;

	if (WSAStartup(MAKEWORD(1,1), &wsaData) != 0) {exit(1);}
	memcpy(friendlyname,"Intel Micro AV Server (",23);
	gethostname(friendlyname+23,68);
	memcpy(friendlyname+strlen(friendlyname),")/Win32\0",8);

	TheChain = ILibCreateChain();
	TheStack = UpnpCreateMicroStack(TheChain, friendlyname, guid, "0000001", 1800, 0);
	InitMms(TheChain, TheStack, ".\\");

	/*
	 *	Set up the app to periodically monitor the available list
	 *	of IP addresses.
	 */
	#ifdef _WINSOCK1
	UpnpMonitor = ILibCreateLifeTime(TheChain);
	UpnpIPAddressLength = ILibGetLocalIPAddressList(&UpnpIPAddressList);
	ILibLifeTime_Add(UpnpMonitor,NULL,4,&UpnpIPAddressMonitor,NULL);
	#endif
	#ifdef _WINSOCK2
	UpnpMonitorSocket = socket(AF_INET,SOCK_DGRAM,0);
	WSAIoctl(UpnpMonitorSocket,SIO_ADDRESS_LIST_CHANGE,NULL,0,NULL,0,&UpnpMonitorSocketReserved,&UpnpMonitorSocketStateObject,&UpnpIPAddressMonitor);
	#endif

	ILibStartChain(TheChain);
	StopMms();
	WSACleanup();

	SendMessage(hWndMainWindow, WM_DESTROY, 0, 0);
	return 0;
}
예제 #9
0
파일: Main.c 프로젝트: optman/upnpstack
int main(int argc, char* argv[])
{
	/*
	 *	Set all of the renderer callbacks.
	 *	If the UPnP device has multiple renderers, it will need
	 *	to map function pointer callbacks for each renderer device.
	 */
	MROnVolumeChangeRequest			= &MROnVolumeChangeRequestSink;
	MROnMuteChangeRequest			= &MROnMuteChangeRequestSink;
	MROnMediaChangeRequest			= &MROnMediaChangeRequestSink;
	MROnGetPositionRequest			= &MROnGetPositionRequestSink;
	MROnSeekRequest					= &MROnSeekRequestSink;
	MROnNextPreviousRequest			= &MROnNextPreviousRequestSink;
	MROnStateChangeRequest			= &MROnStateChangeRequestSink;
	MROnPlayModeChangeRequest		= &MROnPlayModeChangeRequestSink;

	/* TODO: Each device must have a unique device identifier (UDN) - The UDN should be generated dynamically*/
	UpnpMicroStackChain = ILibCreateChain();
	UpnpMicroStack = UpnpCreateMicroStack(UpnpMicroStackChain,"MMR Posix-(Basic)","UDN:MMR PosixBasic","000001",1800, 0);
	MR_MediaRendererState = CreateMediaRenderer(UpnpMicroStackChain, UpnpMicroStack, ILibCreateLifeTime(UpnpMicroStackChain));

	/* Start the renderer thread chain */
	printf("Intel MicroStack 1.0 - Micro Media Renderer\r\n\r\n");

	/*
	 *	Set up the solution to periodically monitor 
	 *	the platform's current list of IP addresses.
	 *	This will allow the upnp layers to appropriately
	 *	react to IP address changes.
	 */
	UpnpMonitor = ILibCreateLifeTime(UpnpMicroStackChain);
	UpnpIPAddressLength = ILibGetLocalIPAddressList(&UpnpIPAddressList);
	ILibLifeTime_Add(UpnpMonitor,NULL,4,&UpnpIPAddressMonitor,NULL);

	/* start UPnP - blocking call*/
	signal(SIGINT,BreakSink);
	ILibStartChain(UpnpMicroStackChain);

	/* be sure to free the address list */
	FREE(UpnpIPAddressList);

	return 0;
}
예제 #10
0
void ILibSSDP_IPAddressListChanged(void *SSDPToken)
{
	struct SSDPClientModule *RetVal = (struct SSDPClientModule*)SSDPToken;
	int i;
	struct sockaddr_in dest_addr;
	
	struct ip_mreq mreq;
	char* buffer;
	int bufferlength;
	struct in_addr interface_addr;
	
	dest_addr.sin_family = AF_INET;
	dest_addr.sin_addr.s_addr = inet_addr(UPNP_GROUP);
	dest_addr.sin_port = htons(UPNP_PORT);
	
	for(i=0;i<RetVal->NumIPAddress;++i)
	{
		mreq.imr_multiaddr.s_addr = inet_addr(UPNP_GROUP);
		mreq.imr_interface.s_addr = RetVal->IPAddress[i];
		if (setsockopt(RetVal->SSDPListenSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP,(char*)&mreq, sizeof(mreq)) < 0)
		{
		}
		
	}
	
	buffer = (char*)MALLOC(105+RetVal->DeviceURNLength);
	bufferlength = sprintf(buffer,"M-SEARCH * HTTP/1.1\r\nMX: 3\r\nST: %s\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\n\r\n",RetVal->DeviceURN);
	
	FREE(RetVal->IPAddress);
	RetVal->NumIPAddress = ILibGetLocalIPAddressList(&(RetVal->IPAddress));
	
	for(i=0;i<RetVal->NumIPAddress;++i)
	{
		interface_addr.s_addr = RetVal->IPAddress[i];
		if (setsockopt(RetVal->MSEARCH_Response_Socket, IPPROTO_IP, IP_MULTICAST_IF,(char*)&interface_addr, sizeof(interface_addr)) == 0)
		{
			sendto(RetVal->MSEARCH_Response_Socket, buffer, bufferlength, 0, (struct sockaddr *) &dest_addr, sizeof(dest_addr));
		}
	}
	
	FREE(buffer);
}
예제 #11
0
파일: Main.c 프로젝트: optman/upnpstack
void UPnPIPAddressMonitor(void *data)
{
	int length;
	int *list;
	
	length = ILibGetLocalIPAddressList(&list);
	if(length!=UPnPIPAddressLength || memcmp((void*)list,(void*)UPnPIPAddressList,sizeof(int)*length)!=0)
	{
		UPnPIPAddressListChanged(UPnPmicroStack);
		
		FREE(UPnPIPAddressList);
		UPnPIPAddressList = list;
		UPnPIPAddressLength = length;
	}
	else
	{
		FREE(list);
	}
	
	
	ILibLifeTime_Add(UPnPMonitor,NULL,4,&UPnPIPAddressMonitor,NULL);
}
예제 #12
0
/*
 *	Method gets periodically executed on the microstack
 *	thread to update the list of known IP addresses.
 *	This allows the upnp layer to adjust to changes
 *	in the IP address list for the platform.
 *
 *	This applies only if winsock1 is used.
 */
void UpnpIPAddressMonitor(void *data)
{
	int length;
	int *list;
	
	length = ILibGetLocalIPAddressList(&list);
	sem_wait(&UpnpIPAddressListLock);
	if(length!=UpnpIPAddressListLength || memcmp((void*)list,(void*)UpnpIPAddressList,sizeof(int)*length)!=0)
	{
		UpnpIPAddressListChanged(StbStack);
		
		FREE(UpnpIPAddressList);
		UpnpIPAddressList = list;
		UpnpIPAddressListLength = length;
	}
	else
	{
		FREE(list);
	}
	sem_post(&UpnpIPAddressListLock);
	
	ILibLifeTime_Add(UpnpMonitor,NULL,4,&UpnpIPAddressMonitor,NULL);
}
예제 #13
0
파일: Main.c 프로젝트: optman/upnpstack
int _tmain(int argc, _TCHAR* argv[])
{
	UpnpmicroStackChain = ILibCreateChain();
	
	/* TODO: Each device must have a unique device identifier (UDN) */
	UpnpmicroStack = UpnpCreateMicroStack(UpnpmicroStackChain,"Remote IO Micro Client","76b5f067-b96f-482b-8c61-dfce4442e719","0000001",1800,0);
	
	/* All evented state variables MUST be initialized before UPnPStart is called. */
	UpnpSetState_RemoteIO_PeerConnection(UpnpmicroStack,"Sample String");
	UpnpSetState_ChannelManager_RegisteredChannelList(UpnpmicroStack,"Sample String");
	
	printf("Intel MicroStack 1.0 - Remote IO Micro Client\r\n\r\n");
	CreateThread(NULL,0,&Run,NULL,0,NULL);
	
	UpnpMonitor = ILibCreateLifeTime(UpnpmicroStackChain);
	UpnpIPAddressLength = ILibGetLocalIPAddressList(&UpnpIPAddressList);
	ILibLifeTime_Add(UpnpMonitor,NULL,4,&UpnpIPAddressMonitor,NULL);
	
	ILibStartChain(UpnpmicroStackChain);
	
	FREE(UpnpIPAddressList);
	return 0;
}
예제 #14
0
int _tmain(int argc, _TCHAR* argv[])
{
	void *ltm;
	char udn[20];
	char friendlyname[100];
	WSADATA wsaData;
	int i;

	_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );


	/* Randomized udn generation */
	srand(GetTickCount());
	for (i=0;i<19;i++)
	{
		udn[i] = (rand() % 25) + 66;
	}
	udn[19] = 0;

	/* generate a friendly name that has the host name in it */
	if (WSAStartup(MAKEWORD(1,1), &wsaData) != 0) {exit(1);}
	memcpy(friendlyname,"Intel Micro AV Renderer (",25);
	gethostname(friendlyname+25,48);
	memcpy(friendlyname+strlen(friendlyname),")/Win32/Emulated Playback\0",26);

	/*
	 *	Set all of the renderer callbacks.
	 *	If the UPnP device has multiple renderers, it will need
	 *	to map function pointer callbacks for each renderer device.
	 */
	MROnVolumeChangeRequest			= &MROnVolumeChangeRequestSink;
	MROnMuteChangeRequest			= &MROnMuteChangeRequestSink;
	MROnMediaChangeRequest			= &MROnMediaChangeRequestSink;
	MROnGetPositionRequest			= &MROnGetPositionRequestSink;
	MROnSeekRequest					= &MROnSeekRequestSink;
	MROnNextPreviousRequest			= &MROnNextPreviousRequestSink;
	MROnStateChangeRequest			= &MROnStateChangeRequestSink;
	MROnPlayModeChangeRequest		= &MROnPlayModeChangeRequestSink;

	/* TODO: Each device must have a unique device identifier (UDN) - The UDN should be generated dynamically*/
	MR_RendererChain = ILibCreateChain();

	MR_UpnpStack = UpnpCreateMicroStack(MR_RendererChain, friendlyname, udn,"000001", 1800, 0);
	MR_ExtendedM3uProcessor = CreatePlaylistParser(MR_RendererChain, 3);

	ltm = ILibCreateLifeTime(MR_RendererChain);
	//ILibAddToChain(MR_RendererChain, ltm);

	MR_MediaRenderer = CreateMediaRenderer(MR_RendererChain, MR_UpnpStack, ltm);
	MR_RendererLogic = RSL_CreateRendererStateLogic
		(
		MR_RendererChain,
		MR_MediaRenderer,
		InstructPlaylistLogic_FindTargetUri,
		InstructCodec_SetupStream,
		InstructCodec_Play,
		InstructCodec_Stop,
		InstructCodec_Pause,
		QueryCodec_IsBusy,
		Validate_MediaUri
		);

	/*
	 *	Initialize codec framework - do this after state machine is initialized.
	 *	Intentionally sleep the processor to allow the codec wrapper thread
	 *	to prime.
	 */
	CodecWrapper_Init(MAX_STREAMS);
	SleepMsTime(100);

	/* Setup a thread to allow user to stop renderer when user hits key */
	CreateThread(NULL,0,&Run,NULL,0,NULL);

	/*
	 *	Initialize the streaming engine to empty or last known stream - 
	 *	do this after streaming framework is set up.
	 */
	RSL_SetMediaUri(MR_RendererLogic, "");

	/*
	 *	Set up the app to periodically monitor the available list
	 *	of IP addresses.
	 */
	#ifdef _WINSOCK1
	UpnpMonitor = ILibCreateLifeTime(MR_RendererChain);
	UpnpIPAddressLength = ILibGetLocalIPAddressList(&UpnpIPAddressList);
	ILibLifeTime_Add(UpnpMonitor,NULL,4,&UpnpIPAddressMonitor,NULL);
	#endif
	#ifdef _WINSOCK2
	UpnpMonitorSocket = socket(AF_INET,SOCK_DGRAM,0);
	WSAIoctl(UpnpMonitorSocket,SIO_ADDRESS_LIST_CHANGE,NULL,0,NULL,0,&UpnpMonitorSocketReserved,&UpnpMonitorSocketStateObject,&UpnpIPAddressMonitor);
	#endif

	/* Start the renderer thread chain */
	printf("Intel MicroStack 1.0 - Micro Media Renderer\r\n\r\n");
	ILibStartChain(MR_RendererChain);
	
	/* be sure to free the address list */
	FREE(UpnpIPAddressList);

	/* clean up wsastartup */
	WSACleanup();

	return 0;
}
예제 #15
0
void* ILibCreateSSDPClientModule(void *chain, char* DeviceURN, int DeviceURNLength, void (*CallbackPtr)(void *sender, char* UDN, int Alive, char* LocationURL, int Timeout, void *user),void *user)
{
	int i;
	struct sockaddr_in addr;
	struct sockaddr_in dest_addr;
	struct SSDPClientModule *RetVal = (struct SSDPClientModule*)MALLOC(sizeof(struct SSDPClientModule));
	int ra = 1;
	struct ip_mreq mreq;
	char* buffer;
	int bufferlength;
	char* _DeviceURN;
	struct in_addr interface_addr;
	unsigned char TTL = 4;
	
	memset((char *)&addr, 0, sizeof(addr));
	memset((char *)&interface_addr, 0, sizeof(interface_addr));
	memset((char *)&(addr), 0, sizeof(dest_addr));
	
	dest_addr.sin_family = AF_INET;
	dest_addr.sin_addr.s_addr = inet_addr(UPNP_GROUP);
	dest_addr.sin_port = htons(UPNP_PORT);
	
	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = htonl(INADDR_ANY);
	addr.sin_port = htons(UPNP_PORT);	
	
	RetVal->Destroy = &ILibSSDPClientModule_Destroy;
	RetVal->PreSelect = &ILibSSDPClientModule_PreSelect;
	RetVal->PostSelect = &ILibSSDPClientModule_PostSelect;
	
	RetVal->Reserved = user;
	RetVal->Terminate = 0;
	RetVal->FunctionCallback = CallbackPtr;
	RetVal->DeviceURN = (char*)MALLOC(DeviceURNLength+1);
	memcpy(RetVal->DeviceURN,DeviceURN,DeviceURNLength);
	RetVal->DeviceURN[DeviceURNLength] = '\0';
	RetVal->DeviceURNLength = DeviceURNLength;
	
	RetVal->NumIPAddress = ILibGetLocalIPAddressList(&(RetVal->IPAddress));
	RetVal->SSDPListenSocket = socket(AF_INET, SOCK_DGRAM, 0);
	ILibGetDGramSocket(htonl(INADDR_ANY), &(RetVal->MSEARCH_Response_Socket));
	
	if (setsockopt(RetVal->MSEARCH_Response_Socket, IPPROTO_IP, IP_MULTICAST_TTL,(char*)&TTL, sizeof(TTL)) < 0)
	{
		/* Ignore this case */
	}
	if (setsockopt(RetVal->SSDPListenSocket, SOL_SOCKET, SO_REUSEADDR,(char*)&ra, sizeof(ra)) < 0)
	{
		DEBUGSTATEMENT(printf("Setting SockOpt SO_REUSEADDR failed\r\n"));
		exit(1);
	}
	if (bind(RetVal->SSDPListenSocket, (struct sockaddr *) &(addr), sizeof(addr)) < 0)
	{
		printf("SSDPListenSocket bind");
		exit(1);
	}
	
	for(i=0;i<RetVal->NumIPAddress;++i)
	{
		mreq.imr_multiaddr.s_addr = inet_addr(UPNP_GROUP);
		mreq.imr_interface.s_addr = RetVal->IPAddress[i];
		if (setsockopt(RetVal->SSDPListenSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP,(char*)&mreq, sizeof(mreq)) < 0)
		{
			printf("SSDPListenSocket setsockopt mreq");
			exit(1);
		}
		
	}
	
	ILibAddToChain(chain,RetVal);
	_DeviceURN = (char*)MALLOC(DeviceURNLength+1);
	memcpy(_DeviceURN,DeviceURN,DeviceURNLength);
	_DeviceURN[DeviceURNLength] = '\0';
	buffer = (char*)MALLOC(105+DeviceURNLength);
	bufferlength = sprintf(buffer,"M-SEARCH * HTTP/1.1\r\nMX: 3\r\nST: %s\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\n\r\n",_DeviceURN);
	
	for(i=0;i<RetVal->NumIPAddress;++i)
	{
		interface_addr.s_addr = RetVal->IPAddress[i];
		/*  This is commented out, because setting MULTICAST_IF does not work on PPC2002 because of bug in kernal */
		//if (setsockopt(RetVal->MSEARCH_Response_Socket, IPPROTO_IP, IP_MULTICAST_IF,(char*)&interface_addr, sizeof(interface_addr)) == 0)
		//{
			sendto(RetVal->MSEARCH_Response_Socket, buffer, bufferlength, 0, (struct sockaddr *) &dest_addr, sizeof(dest_addr));
			//}
	}
	
	FREE(_DeviceURN);
	FREE(buffer);
	return(RetVal);
}
예제 #16
0
int main(void)
{
	void *tempLTM;
	char udn[20];
	char friendlyname[100];
	int i;

	/* Randomized udn generation */
	srand((unsigned int)time(NULL));
	for (i=0;i<19;i++)
	{
		udn[i] = (rand() % 25) + 66;
	}
	udn[19] = 0;

	memcpy(friendlyname,"Intel Micro AV Renderer (",25);
	gethostname(friendlyname+25,48);
	memcpy(friendlyname+strlen(friendlyname),")/Posix/Emulated Playback\0",26);

	printf("Intel MicroStack 1.0 - Sample Renderer\r\n\r\n");
	
	/*
	 *	Set all of the renderer callbacks.
	 *	If the UPnP device has multiple renderers, it will need
	 *	to map function pointer callbacks for each renderer device.
	 */
	MROnVolumeChangeRequest			= &MROnVolumeChangeRequestSink;
	MROnMuteChangeRequest			= &MROnMuteChangeRequestSink;
	MROnMediaChangeRequest			= &MROnMediaChangeRequestSink;
	MROnGetPositionRequest			= &MROnGetPositionRequestSink;
	MROnSeekRequest					= &MROnSeekRequestSink;
	MROnNextPreviousRequest			= &MROnNextPreviousRequestSink;
	MROnStateChangeRequest			= &MROnStateChangeRequestSink;
	MROnPlayModeChangeRequest		= &MROnPlayModeChangeRequestSink;

	/* TODO: Each device must have a unique device identifier (UDN) - The UDN should be generated dynamically*/
	MR_RendererChain = ILibCreateChain();
	MR_ExtendedM3uProcessor = CreatePlaylistParser(MR_RendererChain, 3);

	/* for some silly reason, I need to create the lifetime, create stack, and add lifetime */
	tempLTM = ILibCreateLifeTime(MR_RendererChain);
	MR_UpnpStack = UpnpCreateMicroStack(MR_RendererChain, friendlyname, udn,"000001", 1800, 0);
	MR_MediaRenderer = CreateMediaRenderer(MR_RendererChain, MR_UpnpStack, tempLTM);
	//ILibAddToChain(MR_RendererChain, tempLTM);

	MR_RendererLogic = RSL_CreateRendererStateLogic
		(
		MR_RendererChain,
		MR_MediaRenderer,
		InstructPlaylistLogic_FindTargetUri,
		InstructCodec_SetupStream,
		InstructCodec_Play,
		InstructCodec_Stop,
		InstructCodec_Pause,
		QueryCodec_IsBusy,
		Validate_MediaUri
		);

	/*
	 *	Initialize codec framework - do this after state machine is initialized.
	 *	Intentionally sleep the processor to allow the codec wrapper thread
	 *	to prime.
	 */
	CodecWrapper_Init(MAX_STREAMS);
	SleepMsTime(100);

	/*
	 *	Initialize the streaming engine to empty or last known stream - 
	 *	do this after streaming framework is set up.
	 */
	RSL_SetMediaUri(MR_RendererLogic, "");

	/*
	 *	Set up the solution to periodically monitor 
	 *	the platform's current list of IP addresses.
	 *	This will allow the upnp layers to appropriately
	 *	react to IP address changes.
	 */
	UpnpMonitor = ILibCreateLifeTime(MR_RendererChain);
	UpnpIPAddressLength = ILibGetLocalIPAddressList(&UpnpIPAddressList);
	ILibLifeTime_Add(UpnpMonitor,NULL,4,&UpnpIPAddressMonitor,NULL);

	/* start UPnP - blocking call*/
	signal(SIGINT,BreakSink);
	ILibStartChain(MR_RendererChain);

	CodecWrapper_UnInit();
	
	/* be sure to free the address list */
	FREE(UpnpIPAddressList);

	return 0;
}
예제 #17
0
int main(void)
{
	char udn[20];
	int i;
	char friendlyname[100];

	#ifdef WIN32
	WSADATA wsaData;
	#endif

	_CrtSetDbgFlag (
		_CRTDBG_ALLOC_MEM_DF       | 
		_CRTDBG_DELAY_FREE_MEM_DF  |
		_CRTDBG_LEAK_CHECK_DF      
		//_CRTDBG_CHECK_ALWAYS_DF
		);

	/* Randomized udn generation */
	#ifdef WIN32
	srand(GetTickCount());
	#endif

	#ifdef _POSIX
	srand((unsigned int)time(NULL));
	#endif

	for (i=0;i<19;i++)
	{
		udn[i] = (rand() % 25) + 66;
	}
	udn[19] = 0;

	/* generate a friendly name that has the host name in it */
	#ifdef WIN32
	if (WSAStartup(MAKEWORD(1,1), &wsaData) != 0) {exit(1);}
	#endif
	memcpy(friendlyname,"Intel MicroSTB (",16);
	gethostname(friendlyname+16,75);
	#ifdef WIN32
	memcpy(friendlyname+strlen(friendlyname),")/Win32\0",8);
	#endif
	#ifdef _POSIX
	memcpy(friendlyname+strlen(friendlyname),")/Posix\0",8);
	#endif

	/* Setup the callbacks */
	RemoteIOConnectionChanged = &XrtVideo_ConnectionChangedSink;
	RemoteIOReset = &XrtVideo_ResetSink;
	RemoteIOCommand = &XrtVideo_CommandSink;
	
	/* Setup the Remote IO Global Values */
	RemoteIO_Application		= "XRT20:Sample Client";
	RemoteIO_MaxCommandSize		= 65000;			// Set the maximum command size, keep this at 64k
	RemoteIO_DisplayEncoding	= RemoteIO_JPEG;	// Set the image format, see (enum RemoteIOImageFormat) for complete list.
	RemoteIO_DisplayWidth		= 640;				// Set the display width
	RemoteIO_DisplayHeight		= 480;				// Set the display height
	RemoteIO_DeviceInformation	= "";				// Set propriatary information about the device

	/*
	 *	Set of commands that can be sent back to the host PC. These can be used even
	 *	if remoting is not connected. For a device with an IR remote, only SendKeyPress is used.	
	 */
	/*
	RemoteIO_SendCommand(unsigned short command, char* data, int datalength);
	RemoteIO_SendKeyPress(int key);
	RemoteIO_SendKeyUp(int key);
	RemoteIO_SendKeyDown(int key);
	RemoteIO_SendMouseUp(int X,int Y,int Button);
	RemoteIO_SendMouseDown(int X,int Y,int Button);
	RemoteIO_SendMouseMove(int X,int Y);
	*/

	/* renderer callbacks. */
	MROnVolumeChangeRequest			= &MROnVolumeChangeRequestSink;
	MROnMuteChangeRequest			= &MROnMuteChangeRequestSink;
	MROnMediaChangeRequest			= &MROnMediaChangeRequestSink;
	MROnGetPositionRequest			= &MROnGetPositionRequestSink;
	MROnSeekRequest					= &MROnSeekRequestSink;
	MROnNextPreviousRequest			= &MROnNextPreviousRequestSink;
	MROnStateChangeRequest			= &MROnStateChangeRequestSink;
	MROnPlayModeChangeRequest		= &MROnPlayModeChangeRequestSink;



	printf("Intel MicroSTB Sample Client\r\n");

	StbChain = ILibCreateChain();
	StbLTM = ILibCreateLifeTime(StbChain);

	#ifdef _DEBUG
	printf("StbLTM=%p\r\n", StbLTM);
	#endif

	// Create the stack for the Media Server, Media Renderer, and RIOClient
	StbStack = UpnpCreateMicroStack(StbChain,friendlyname, udn, "0000001", 1600, 0);


	InitMms(StbChain, StbStack, ".\\");

	//ILibAddToChain(StbChain, StbLTM); /* seems to resolve dealyed event delivery */

    MR_ExtendedM3uProcessor = CreatePlaylistParser(StbChain, 3);
	MR_MediaRenderer = CreateMediaRenderer(StbChain, StbStack, StbLTM);
	MR_RendererLogic = RSL_CreateRendererStateLogic
		(
		StbChain,
		MR_MediaRenderer,
		InstructPlaylistLogic_FindTargetUri,
		InstructCodec_SetupStream,
		InstructCodec_Play,
		InstructCodec_Stop,
		InstructCodec_Pause,
		QueryCodec_IsBusy,
		Validate_MediaUri
		);


	/* Create the RemoteIO client */
	CreateRemoteIO(StbChain, StbStack);

	/* initialize emulated rendering module */
	CodecWrapper_Init(MAX_STREAMS);

	STBS_Init(StbChain);

	/*
	 *	Set up the app to periodically monitor the available list
	 *	of IP addresses.
	 */
	sem_init(&UpnpIPAddressListLock, 0, 1);

	#ifdef _POSIX
	UpnpMonitor = ILibCreateLifeTime(StbChain);
	UpnpIPAddressListLength = ILibGetLocalIPAddressList(&UpnpIPAddressList);
	ILibLifeTime_Add(UpnpMonitor,NULL,4,&UpnpIPAddressMonitor,NULL);
	#endif
	#ifdef _WINSOCK1
	UpnpMonitor = ILibCreateLifeTime(StbChain);
	UpnpIPAddressListLength = ILibGetLocalIPAddressList(&UpnpIPAddressList);
	ILibLifeTime_Add(UpnpMonitor,NULL,4,&UpnpIPAddressMonitor,NULL);
	#endif
	#ifdef _WINSOCK2
	UpnpMonitorSocket = socket(AF_INET,SOCK_DGRAM,0);
	WSAIoctl(UpnpMonitorSocket,SIO_ADDRESS_LIST_CHANGE,NULL,0,NULL,0,&UpnpMonitorSocketReserved,&UpnpMonitorSocketStateObject,&UpnpIPAddressMonitor);
	#endif

	// for the media server
	UpdateIPAddresses(UpnpIPAddressList, UpnpIPAddressListLength);

	/* start UPnP - blocking call*/
	#ifdef _POSIX
	signal(SIGINT,BreakSink);
	#endif

	#ifdef WIN32
	/* Setup a thread to allow user to stop renderer when user hits key */
	CreateThread(NULL,0,&Run,NULL,0,NULL);
	#endif

	ILibStartChain(StbChain); 	

	StopMms();
	
	STBS_Uninit();

	/* be sure to FREE the address list */
	sem_destroy(&UpnpIPAddressListLock);
	FREE(UpnpIPAddressList);
	UpnpIPAddressList = NULL;
	
	/* clean up wsastartup */
	#ifdef WIN32
	WSACleanup();
	#endif

	return 0;
}