int ILibProcessXMLNodeList(struct ILibXMLNode *nodeList) { int RetVal = 0; struct ILibXMLNode *current = nodeList; struct ILibXMLNode *temp; void *TagStack; ILibCreateStack(&TagStack); while(current!=NULL) { if(current->StartTag!=0) { // Start Tag current->Parent = ILibPeekStack(&TagStack); ILibPushStack(&TagStack,current); } else { // Close Tag temp = (struct ILibXMLNode*)ILibPopStack(&TagStack); if(temp!=NULL) { if(temp->NameLength==current->NameLength && memcmp(temp->Name,current->Name,current->NameLength)==0) { if(current->Next!=NULL) { if(current->Next->StartTag!=0) { temp->Peer = current->Next; } } temp->ClosingTag = current; } else { // Illegal Close Tag Order RetVal = -2; break; } } else { // Illegal Close Tag RetVal = -1; break; } } current = current->Next; } if(TagStack!=NULL) { // Incomplete XML RetVal = -3; } return(RetVal); }
int ILibReadInnerXML(struct ILibXMLNode *node, char **RetVal) { struct ILibXMLNode *x = node; int length = 0; void *TagStack; ILibCreateStack(&TagStack); do { if(x->StartTag!=0) {ILibPushStack(&TagStack,x);} x = x->Next; }while(!(x->StartTag==0 && ILibPopStack(&TagStack)==node && x->NameLength==node->NameLength && memcmp(x->Name,node->Name,node->NameLength)==0)); length = (int)((char*)x->Reserved - (char*)node->Reserved - 1); if(length<0) {length=0;} *RetVal = (char*)node->Reserved; return(length); }
int ILibWrapper_SdpToBlock(char* sdp, int sdpLen, int *isActive, char **username, char **password, char **block) { struct parser_result *pr; struct parser_result_field *f; int ptr; int blockLen; void* candidates = NULL; char* lines; char* dtlshash = NULL; int dtlsHashLen = 0; int candidatecount = 0; int BlockFlags = 0; *isActive = 0; *username = NULL; *password = NULL; ILibCreateStack(&candidates); lines = ILibString_Replace(sdp, sdpLen, "\n", 1, "\r", 1); pr = ILibParseString(lines, 0, sdpLen, "\r", 1); f = pr->FirstResult; while(f!=NULL) { if(f->datalength == 0) { f = f->NextResult; continue; } f->data[f->datalength] = 0; if(strcmp(f->data, "a=setup:passive")==0) { BlockFlags |= ILibWebRTC_SDP_Flags_DTLS_SERVER; } else if(strcmp(f->data, "a=setup:active")==0 || strcmp(f->data, "a=setup:actpass")==0) { *isActive = 1; } if(f->datalength > 12 && strncmp(f->data, "a=ice-ufrag:", 12)==0) {*username = f->data + 12;} if(f->datalength > 10 && strncmp(f->data, "a=ice-pwd:", 10)==0) {*password = f->data + 10;} if(f->datalength > 22 && strncmp(f->data, "a=fingerprint:sha-256 ", 22)==0) { char* tmp = ILibString_Replace(f->data + 22, f->datalength - 22, ":", 1, "", 0); dtlsHashLen = util_hexToBuf(tmp, strlen(tmp), tmp); dtlshash = tmp; } if(f->datalength > 12 && strncmp(f->data, "a=candidate:", 12)==0) { struct parser_result* pr2 = ILibParseString(f->data, 0, f->datalength, " ", 1); if(pr2->FirstResult->NextResult->datalength == 1 && pr2->FirstResult->NextResult->data[0] == '1' && pr2->FirstResult->NextResult->NextResult->datalength == 3 && strncasecmp(pr2->FirstResult->NextResult->NextResult->data, "UDP", 3)==0) //if(pr2->FirstResult->NextResult->NextResult->datalength == 3 && strncasecmp(pr2->FirstResult->NextResult->NextResult->data, "UDP", 3)==0) { char* candidateData; struct parser_result *pr3; char *tmp = pr2->FirstResult->NextResult->NextResult->NextResult->NextResult->NextResult->data; unsigned short port; tmp[pr2->FirstResult->NextResult->NextResult->NextResult->NextResult->NextResult->datalength] = 0; port = atoi(tmp); pr3 = ILibParseString(pr2->FirstResult->NextResult->NextResult->NextResult->NextResult->data, 0, pr2->FirstResult->NextResult->NextResult->NextResult->NextResult->datalength, ".", 1); if (pr3->NumResults == 4) { candidateData = pr3->FirstResult->data; pr3->FirstResult->data[pr3->FirstResult->datalength] = 0; candidateData[0] = (char)atoi(pr3->FirstResult->data); pr3->FirstResult->NextResult->data[pr3->FirstResult->NextResult->datalength] = 0; candidateData[1] = (char)atoi(pr3->FirstResult->NextResult->data); pr3->FirstResult->NextResult->NextResult->data[pr3->FirstResult->NextResult->NextResult->datalength] = 0; candidateData[2] = (char)atoi(pr3->FirstResult->NextResult->NextResult->data); pr3->FirstResult->NextResult->NextResult->NextResult->data[pr3->FirstResult->NextResult->NextResult->NextResult->datalength] = 0; candidateData[3] = (char)atoi(pr3->FirstResult->NextResult->NextResult->NextResult->data); ((unsigned short*)candidateData)[2] = htons(port); candidateData[6] = 0; ILibPushStack(&candidates, candidateData); ++candidatecount; } ILibDestructParserResults(pr3); } ILibDestructParserResults(pr2); } f = f->NextResult; } if (*username == NULL || *password == NULL || dtlshash == NULL || candidatecount == 0) { *block = NULL; return(0); } blockLen = 6 + strlen(*username)+1 + strlen(*password)+1 + dtlsHashLen + 1 + (candidatecount*6)+1; if((*block = (char*)malloc(blockLen))==NULL){ILIBCRITICALEXIT(254);} ptr = 0; ((unsigned short*)*block+ptr)[0] = htons(1); ptr += 2; ((unsigned int*)(*block+ptr))[0] = htonl(BlockFlags); ptr += 4; (*block)[ptr] = (char)strlen(*username); ptr += 1; memcpy(*block+ptr, *username, strlen(*username)); ptr += strlen(*username); (*block)[ptr] = (char)strlen(*password); ptr += 1; memcpy(*block+ptr, *password, strlen(*password)); ptr += strlen(*password); (*block)[ptr] = (char)dtlsHashLen; ptr += 1; memcpy(*block+ptr, dtlshash, dtlsHashLen); ptr += dtlsHashLen; (*block)[ptr] = (char)candidatecount; ptr += 1; while(ILibPeekStack(&candidates)!=NULL) { memcpy(*block+ptr, ILibPopStack(&candidates), 6); ptr += 6; } ILibDestructParserResults(pr); free(lines); if(dtlshash!=NULL) {free(dtlshash);} return(ptr); }