int ILibWebServer_RegisterVirtualDirectory(void *WebServerToken, char *vd, int vdLength, ILibWebServer_VirtualDirectory OnVirtualDirectory, void *user) { struct ILibWebServer_VirDir_Data *data; struct ILibWebServer_StateModule *s = (struct ILibWebServer_StateModule*)WebServerToken; if(s->VirtualDirectoryTable==NULL) { s->VirtualDirectoryTable = ILibInitHashTree(); } if(ILibHasEntry(s->VirtualDirectoryTable,vd,vdLength)!=0) { return(1); } else { data = (struct ILibWebServer_VirDir_Data*)malloc(sizeof(struct ILibWebServer_VirDir_Data)); data->callback = (void*)OnVirtualDirectory; data->user = user; ILibAddEntry(s->VirtualDirectoryTable,vd,vdLength,data); } return(0); }
struct DLNAProtocolInfo *DLNAProtocolInfo_Parse(char *protocolInfo, int protocolInfoLength) { struct parser_result *pr,*pr2,*pr3,*pr4; struct parser_result_field *prf,*prf2; char *temp; long flags; int tempInt; struct DLNAProtocolInfo *RetVal = (struct DLNAProtocolInfo*)malloc(sizeof(struct DLNAProtocolInfo)); memset(RetVal,0,sizeof(struct DLNAProtocolInfo)); RetVal->NameValueTable = ILibInitHashTree_CaseInSensitive(); RetVal->DLNA_Major_Version = 1; RetVal->Protocol = DLNAProtocolInfo_ProtocolType_UNKNOWN; pr = ILibParseString(protocolInfo,0,protocolInfoLength,":",1); if(pr->NumResults==4 || pr->NumResults==1) { if(pr->NumResults==4) { if(pr->FirstResult->datalength==8 && memcmp(pr->FirstResult->data,"http-get",8)==0) { RetVal->Protocol = DLNAProtocolInfo_ProtocolType_HTTP; } else if(pr->FirstResult->datalength==19 && memcmp(pr->FirstResult->data,"playsingle-http-get",19)==0) { RetVal->Protocol = DLNAProtocolInfo_ProtocolType_HTTP; RetVal->IsPlaySingleUri = 1; } else if(pr->FirstResult->datalength==12 && memcmp(pr->FirstResult->data,"rtsp-rtp-udp",12)==0) { RetVal->Protocol = DLNAProtocolInfo_ProtocolType_RTP; } else if(pr->FirstResult->datalength==23 && memcmp(pr->FirstResult->data,"playsingle-rtsp-rtp-udp",23)==0) { RetVal->Protocol = DLNAProtocolInfo_ProtocolType_RTP; RetVal->IsPlaySingleUri = 1; } else if(pr->FirstResult->datalength==1 && memcmp(pr->FirstResult->data,"*",1)==0) { RetVal->Protocol = DLNAProtocolInfo_ProtocolType_ANY; } RetVal->MimeType = (char*)malloc(pr->FirstResult->NextResult->NextResult->datalength+1); memcpy(RetVal->MimeType,pr->FirstResult->NextResult->NextResult->data,pr->FirstResult->NextResult->NextResult->datalength); RetVal->MimeType[pr->FirstResult->NextResult->NextResult->datalength]=0; } pr2 = ILibParseString(pr->LastResult->data,0,pr->LastResult->datalength,";",1); prf = pr2->FirstResult; while(prf!=NULL) { pr3 = ILibParseString(prf->data,0,prf->datalength,"=",1); ILibAddEntry(RetVal->NameValueTable,pr3->FirstResult->data,pr3->FirstResult->datalength,ILibString_Copy(pr3->LastResult->data,pr3->LastResult->datalength)); if(pr3->FirstResult->datalength==11 && memcmp(pr3->FirstResult->data,"DLNA.ORG_PN",11)==0) { // // Profile // temp = (char*)malloc(pr3->LastResult->datalength+1); memcpy(temp,pr3->LastResult->data,pr3->LastResult->datalength); temp[pr3->LastResult->datalength]=0; RetVal->Profile = temp; } if(pr3->FirstResult->datalength==11 && memcmp(pr3->FirstResult->data,"DLNA.ORG_OP",11)==0) { // // OP Code // flags = DLNA_StringToLong(2,pr3->LastResult->data,pr3->LastResult->datalength); if(RetVal->Protocol == DLNAProtocolInfo_ProtocolType_HTTP) { RetVal->SupportsTimeBasedSeek = DLNA_Bits(&flags)->Bit1; RetVal->SupportsByteBasedSeek = DLNA_Bits(&flags)->Bit0; } else if(RetVal->Protocol == DLNAProtocolInfo_ProtocolType_RTP) { RetVal->SupportsTimeBasedSeek = DLNA_Bits(&flags)->Bit0; } } if(pr3->FirstResult->datalength==11 && memcmp(pr3->FirstResult->data,"DLNA.ORG_PS",11)==0) { // // Supported Play Speeds // pr4 = ILibParseString(pr3->LastResult->data,0,pr3->LastResult->datalength,",",1); RetVal->SupportedPlaySpeedsLength = pr4->NumResults; RetVal->SupportedPlaySpeeds = (char**)malloc(RetVal->SupportedPlaySpeedsLength*sizeof(char*)); tempInt = 0; prf2 = pr4->FirstResult; while(prf2!=NULL) { RetVal->SupportedPlaySpeeds[tempInt] = (char*)malloc(2+prf2->datalength); memcpy(RetVal->SupportedPlaySpeeds[tempInt],prf2->data,prf2->datalength); RetVal->SupportedPlaySpeeds[tempInt][prf2->datalength]=0; ++tempInt; prf2 = prf2->NextResult; } ILibDestructParserResults(pr4); } if(pr3->FirstResult->datalength==11 && memcmp(pr3->FirstResult->data,"DLNA.ORG_CI",11)==0) { // // Conversion Indication // RetVal->IsConvertedContent = (int)DLNA_StringToLong(2,pr3->LastResult->data,pr3->LastResult->datalength); } if(pr3->FirstResult->datalength==14 && memcmp(pr3->FirstResult->data,"DLNA.ORG_FLAGS",14)==0) { // // Primary Flags (8 digits) // flags = DLNA_StringToLong(16,pr3->LastResult->data,pr3->LastResult->datalength<8?pr3->LastResult->datalength:8); if(DLNA_Bits(&flags)->Bit20) { RetVal->DLNA_Major_Version = 1; RetVal->DLNA_Minor_Version = 5; } if(RetVal->DLNA_Major_Version==1 && RetVal->DLNA_Minor_Version>=5) { RetVal->SenderPaced = DLNA_Bits(&flags)->Bit31; RetVal->LimitedOperations_TimeBasedSeek = DLNA_Bits(&flags)->Bit30; RetVal->LimitedOperations_ByteBasedSeek = DLNA_Bits(&flags)->Bit29; RetVal->DLNAPlayContainer = DLNA_Bits(&flags)->Bit28; RetVal->S0_Increasing = DLNA_Bits(&flags)->Bit27; RetVal->SN_Increasing = DLNA_Bits(&flags)->Bit26; RetVal->RTSP_Pause = DLNA_Bits(&flags)->Bit25; RetVal->TM_S = DLNA_Bits(&flags)->Bit24; RetVal->TM_I = DLNA_Bits(&flags)->Bit23; RetVal->TM_B = DLNA_Bits(&flags)->Bit22; } RetVal->HTTP_Stalling = DLNA_Bits(&flags)->Bit21; } if(pr3->FirstResult->datalength==14 && memcmp(pr3->FirstResult->data,"DLNA.ORG_MAXSP",14)==0) { pr4 = ILibParseString(pr3->LastResult->data,0,pr3->LastResult->datalength,".",1); RetVal->MaxSpeed_Major = (int)DLNA_StringToLong(10,pr4->FirstResult->data,pr4->FirstResult->datalength); if(pr4->NumResults==2) { RetVal->MaxSpeed_Minor = (int)DLNA_StringToLong(10,pr4->LastResult->data,pr4->LastResult->datalength); } ILibDestructParserResults(pr4); } ILibDestructParserResults(pr3); prf = prf->NextResult; } ILibDestructParserResults(pr2); } ILibDestructParserResults(pr); return(RetVal); }