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; }
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; }
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; }
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; }
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; }
/* * Assumes caller has locked msl->Lock. */ void MSL_Helper_UpdateModerated_ContainerUpdateID(struct MSL_MediaServerObject *msl) { /* don't bother updating if there's nothing to report */ if (msl->ContainerUpdateID == NULL) return; if (msl->ModerationFlag == 0) { msl->ModerationFlag = 1; MSL_Helper_UpdateImmediate_ContainerUpdateID(msl); ILibLifeTime_Add(msl->LifeTimeMonitor,msl,1,MSL_Helper_ModerationSink_ContainerUpdateID, NULL); } }
// Called by the UPnP Remote I/O Microstack // Implements the RegisterChannel call, lets the CP un-register a RIO channel. void UpnpRemoteIOClient_ChannelManager_UnregisterChannel(void* upnptoken,char* PeerConnection) { // Scan the channel list for an existing channel struct RemoteIOChannel* channelprevious = NULL; struct RemoteIOChannel* channelindex = RIO->ChannelList; printf("UnRegisterChannel: %s\r\n",PeerConnection); if (PeerConnection == NULL) { if (upnptoken != NULL) UpnpResponse_Error(upnptoken,800,"Invalid PeerConnection URI"); return; } sem_wait(&RemoteIOLock); while (channelindex != NULL) { // Look for a match if (strcmp(channelindex->uri,PeerConnection) == 0) break; channelprevious = channelindex; channelindex = channelindex->next; } // Delete the channel from the list, and free the channel struct if (channelindex != NULL) { ILibLifeTime_Remove(RIO->RIOLifeTime,channelindex); if (channelprevious == NULL) { RIO->ChannelList = channelindex->next; } else { channelprevious->next = channelindex->next; } free(channelindex->name); free(channelindex->uri); free(channelindex); // Set the channels to be evented if (RIO->EventModerationSet == 0) { ILibLifeTime_Add(RIO->RIOLifeTime,NULL,2,&RemoteIO_EventChannelList, NULL); RIO->EventModerationSet = 1; } } if (upnptoken != NULL) UpnpResponse_RemoteIOClient_ChannelManager_UnregisterChannel(upnptoken); sem_post(&RemoteIOLock); }
void ILibMiniWebServerModule_PostSelect(void *WebServerModule, int slct, fd_set *readset, fd_set *writeset, fd_set *errorset) { unsigned long flags=0; int i; struct MiniWebServerObject *module = (struct MiniWebServerObject*)WebServerModule; struct sockaddr_in addr; int addrlen = sizeof(struct sockaddr_in); /* Select Connected Sockets*/ for(i=0;i<module->MaxConnections;++i) { if(module->Readers[i].ClientSocket!=0xFFFFFFFF) { if(FD_ISSET(module->Readers[i].ClientSocket,errorset)!=0) { module->Readers[i].ClientSocket = 0xFFFFFFFF; module->Readers[i].BodySize = 0; //ToDo: cleanup } if(FD_ISSET(module->Readers[i].ClientSocket,readset)!=0) { ILibMiniWebServerProcessSocket(&(module->Readers[i])); } if(module->Readers[i].ClientSocket==~0 || module->Readers[i].Body!=NULL) { ILibLifeTime_Remove(module->TimerObject,&(module->Readers[i])); } } } /* Select Listen Socket */ if(FD_ISSET(module->ListenSocket,readset)!=0) { for(i=0;i<module->MaxConnections;++i) { if(module->Readers[i].ClientSocket==0xFFFFFFFF) { module->Readers[i].ClientSocket = accept(module->ListenSocket,(struct sockaddr*)&addr,&addrlen); ioctlsocket(module->Readers[i].ClientSocket,FIONBIO,&flags); ILibLifeTime_Add(module->TimerObject,&(module->Readers[i]),3,&ILibMWS_TimerSink,NULL); module->Readers[i].HeaderIndex = 0; module->Readers[i].Body_BeginPointer = 0; module->Readers[i].Body_EndPointer = 0; module->Readers[i].Body_MallocSize = 0; module->Readers[i].Body_Read = 0; break; } } } }
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; }
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; }
// Called by the UPnP Remote I/O Microstack // Implements the RegisterChannel call, lets the CP clear all registered RIO channels. // Usualy, RIO Servers should check to see if their own channels are in the registration // list. If not, they re-register. In practice, this call will cause all servers to immidiatly // re-register all channels. void UpnpRemoteIOClient_ChannelManager_ClearAllChannels(void* upnptoken) { // Scan the channel list and delete struct RemoteIOChannel* channelnext; struct RemoteIOChannel* channelindex = RIO->ChannelList; RIO->ChannelList = NULL; sem_wait(&RemoteIOLock); // No channels to clean, respond and exit if (channelindex == NULL) { UpnpResponse_RemoteIOClient_ChannelManager_ClearAllChannels(upnptoken); sem_post(&RemoteIOLock); return; } // Clear all of the channels one by one. while (channelindex != NULL) { channelnext = channelindex->next; free(channelindex->name); free(channelindex->uri); free(channelindex); channelindex = channelnext; } if(upnptoken) { UpnpResponse_RemoteIOClient_ChannelManager_ClearAllChannels(upnptoken); // Set the channels to be evented if (RIO->EventModerationSet == 0) { ILibLifeTime_Add(RIO->RIOLifeTime,NULL,2,&RemoteIO_EventChannelList, NULL); RIO->EventModerationSet = 1; } } sem_post(&RemoteIOLock); }
void ILibWebServer_OnConnect(void *AsyncServerSocketModule, void *ConnectionToken,void **user) { struct ILibWebServer_StateModule *wsm = (struct ILibWebServer_StateModule*)ILibAsyncServerSocket_GetTag(AsyncServerSocketModule); struct ILibWebServer_Session *ws = (struct ILibWebServer_Session*)MALLOC(sizeof(struct ILibWebServer_Session)); memset(ws,0,sizeof(struct ILibWebServer_Session)); ws->Parent = wsm; ws->Reserved1 = AsyncServerSocketModule; ws->Reserved2 = ConnectionToken; ws->Reserved3 = ILibCreateWebClientEx(&ILibWebServer_OnResponse,ConnectionToken,wsm,ws); ws->User = wsm->User; *user = ws; ILibLifeTime_Add(wsm->LifeTime,ws,HTTP_SESSION_IDLE_TIMEOUT,&ILibWebServer_IdleSink,NULL); if(wsm->OnSession!=NULL) { wsm->OnSession(ws,wsm->User); } }
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); }
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; }
/* * 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); }
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; }
// Called by the UPnP Remote I/O Microstack // Implements the RegisterChannel call, lets the CP register a new RIO channels for a // certain amont of time. The CP must re-register the channel from time-to-time to // prevent the channel from expiring. void UpnpRemoteIOClient_ChannelManager_RegisterChannel(void* upnptoken,char* Name,char* PeerConnection,int Timeout) { // Scan the channel list for an existing channel struct RemoteIOChannel* channelindex = RIO->ChannelList; struct RemoteIOChannel* newchannel; printf("RegisterChannel[%s] (%d): %s\r\n",PeerConnection,Timeout,Name); if (PeerConnection == NULL) { if (upnptoken != NULL) UpnpResponse_Error(upnptoken,800,"Invalid PeerConnection URI"); return; } sem_wait(&RemoteIOLock); while (channelindex != NULL) { // Look for a match if (strcmp(channelindex->uri,PeerConnection) == 0) break; channelindex = channelindex->next; } if (channelindex != NULL) { // Update the expiration time ILibLifeTime_Remove(RIO->RIOLifeTime,channelindex); #ifdef _WIN32_WCE channelindex->expiration = (GetTickCount() / 1000) + Timeout; ILibLifeTime_Add(RIO->RIOLifeTime,channelindex,Timeout,&RemoteIO_ChannelExpireSink, NULL); #elif WIN32 channelindex->expiration = (GetTickCount() / 1000) + Timeout; ILibLifeTime_Add(RIO->RIOLifeTime,channelindex,Timeout,&RemoteIO_ChannelExpireSink, NULL); #elif _POSIX gettimeofday(&(channelindex->expiration),NULL); (channelindex->expiration).tv_sec += (int)Timeout; ILibLifeTime_Add(RIO->RIOLifeTime,channelindex,Timeout,&RemoteIO_ChannelExpireSink, NULL); #endif } else { // Add a new channel to the channel list newchannel = (struct RemoteIOChannel*)malloc(sizeof(struct RemoteIOChannel)); newchannel->name = (char*)malloc(strlen(Name)+1); strcpy(newchannel->name,Name); newchannel->uri = (char*)malloc(strlen(PeerConnection)+1); strcpy(newchannel->uri,PeerConnection); #ifdef _WIN32_WCE newchannel->expiration = (GetTickCount() / 1000) + Timeout; ILibLifeTime_Add(RIO->RIOLifeTime,newchannel,Timeout,&RemoteIO_ChannelExpireSink, NULL); #elif WIN32 newchannel->expiration = (GetTickCount() / 1000) + Timeout; ILibLifeTime_Add(RIO->RIOLifeTime,newchannel,Timeout,&RemoteIO_ChannelExpireSink, NULL); #elif _POSIX gettimeofday(&(newchannel->expiration),NULL); (newchannel->expiration).tv_sec += (int)Timeout; ILibLifeTime_Add(RIO->RIOLifeTime,newchannel,Timeout,&RemoteIO_ChannelExpireSink, NULL); #endif newchannel->next = RIO->ChannelList; RIO->ChannelList = newchannel; // Set the channels to be evented if (RIO->EventModerationSet == 0) { ILibLifeTime_Add(RIO->RIOLifeTime,NULL,2,&RemoteIO_EventChannelList, NULL); RIO->EventModerationSet = 1; } } UpnpResponse_RemoteIOClient_ChannelManager_RegisterChannel(upnptoken); sem_post(&RemoteIOLock); }
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; }
int ILibWebServer_RequestAnswered(struct ILibWebServer_Session *session) { struct packetheader *hdr = ILibWebClient_GetHeaderFromDataObject(session->Reserved3); struct packetheader_field_node *f; int PersistentConnection = 0; session->Reserved7 = NULL; if(session->Reserved8!=0) { return(0); } else { session->Reserved8 = 1; f = hdr->FirstField; } if(session->Reserved6==0) { if(hdr->VersionLength==3 && memcmp(hdr->Version,"1.0",3)==0) { // HTTP 1.0 , Check for Keep-Alive token while(f!=NULL) { if(f->FieldLength==9 && strncasecmp(f->Field,"CONNECTION",9)==0) { if(f->FieldDataLength==10 && strncasecmp(f->FieldData,"KEEP-ALIVE",10)==0) { PersistentConnection = 1; break; } } f = f->NextField; } } else { // HTTP 1.1+ , Check for CLOSE token PersistentConnection = 1; while(f!=NULL) { if(f->FieldLength==9 && strncasecmp(f->Field,"CONNECTION",9)==0) { if(f->FieldDataLength==5 && strncasecmp(f->FieldData,"CLOSE",5)==0) { PersistentConnection = 0; break; } } f = f->NextField; } } } if(PersistentConnection==0) { ILibAsyncServerSocket_Disconnect(session->Reserved1,session->Reserved2); } else { // Add timeout to close socket ILibLifeTime_Add(((struct ILibWebServer_StateModule*)session->Parent)->LifeTime,session,HTTP_SESSION_IDLE_TIMEOUT,&ILibWebServer_IdleSink,NULL); ILibWebClient_FinishedResponse_Server(session->Reserved3); ILibWebClient_Resume(session->Reserved3); } return(PersistentConnection==0?ILibWebServer_SEND_RESULTED_IN_DISCONNECT: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; }