| | |
| | | #include <syslog.h> |
| | | |
| | | |
| | | #include <libxml/parser.h> |
| | | #include <libxml/tree.h> |
| | | #include <libxml/xpath.h> |
| | | #include <libxml/xpathInternals.h> |
| | | |
| | | int RequestChannel; |
| | | char* gAnalyzerIP; |
| | | char* gUser; |
| | |
| | | #define fileread_buf 128 |
| | | AlarmInfo RealAlarmEvent[16][1000]; |
| | | |
| | | #define DBG_LOG |
| | | //#define DBG_LOG |
| | | #define ZIP_HOME "/tmp" |
| | | |
| | | ///////////////////////////////////////////////// |
| | |
| | | #endif |
| | | RequestMetaFiles(gAnalyzerIP,httpUri,sss,eee); |
| | | write(GSocket,byte_array,strlen(byte_array)); |
| | | |
| | | |
| | | //用以下方法将socket设置为非阻塞方式 |
| | | // int flags = fcntl(GSocket, F_GETFL, 0); |
| | | // fcntl(GSocket, F_SETFL, flags | O_NONBLOCK); |
| | | while(1){ |
| | | memset(buff,0,sizeof(buff)); |
| | | length=read(GSocket,&buff,sizeof(buff)); |
| | | //#test |
| | | { |
| | | length=read(GSocket,&buff,sizeof(buff)); |
| | | |
| | | //#test |
| | | //{ |
| | | // FILE * pFile = fopen ("pro.txt","rb"); |
| | | // length = fread ( buff, 1, sizeof(buff), pFile ); |
| | | // fclose(pFile); |
| | | // bMetadataSaving = 0; |
| | | //} |
| | | |
| | | if(length<=0) |
| | | { |
| | | close(GSocket); |
| | | break; |
| | | syslog(LOG_USER | LOG_INFO, "length<=0"); |
| | | } |
| | | if(memorycmp((unsigned char*)buff,length, "WWW-Authenticate:",17)>0) |
| | | { |
| | | // analyse reception |
| | | MakeAuthorizedPacketSimp111(buff,length,"GET",httpUri,sss,eee); |
| | | write(GSocket,byte_array,strlen(byte_array)); |
| | | continue; |
| | | } |
| | | if(bMetadataSaving==1){ |
| | | memoryband[bandCount] = (unsigned char*)malloc(length); |
| | | memcpy(memoryband[bandCount], buff, length); |
| | | bandsize[bandCount] = length; |
| | | if(bandCount<99) bandCount++; |
| | | int eidx = stringcmp((char*)buff,"</urn:strings></urn:ViqStrings></urn:ViqStringsList>",52); |
| | | if(eidx >=0){ |
| | | bMetadataSaving = 0; |
| | | int SSize=0; |
| | | for (int i=0;i<bandCount;i++) SSize+=bandsize[i]; |
| | | char *tmpp = (char*)malloc(SSize); |
| | | int xx=0; |
| | | for (int i=0;i<bandCount;i++) |
| | | { |
| | | memcpy(&tmpp[xx],memoryband[i],bandsize[i]); |
| | | xx=bandsize[i]; |
| | | free(memoryband[i]); |
| | | } |
| | | memcpy(buff,tmpp,SSize); |
| | | free(tmpp); |
| | | goto lpp123; |
| | | syslog(LOG_USER | LOG_INFO, "**********Special*******************************ZipSerFileNum = %d",ZipSerFileNum); |
| | | } |
| | | |
| | | //FILE * pFile = fopen ("pro.txt","rb"); |
| | | //length = fread ( buff, 1, sizeof(buff), pFile ); |
| | | |
| | | xmlParserCtxtPtr ctxt; |
| | | char chars[5000]; |
| | | xmlDocPtr doc; /* the resulting document tree */ |
| | | int res,totalres=0; |
| | | |
| | | char* pBuff = buff; |
| | | while ((res = read(GSocket,chars,sizeof(chars))) > 0) |
| | | { |
| | | memcpy(pBuff, chars, res); |
| | | pBuff+=res; |
| | | totalres+=res; |
| | | } |
| | | else{ |
| | | int sidx = stringcmp((char*)buff,"<urn:ViqStringsList urn:version=",32); |
| | | if(sidx >=0){ |
| | | bMetadataSaving = 1; |
| | | bandCount = 0; |
| | | memoryband[bandCount] = (unsigned char*)malloc(length-sidx); |
| | | memcpy(memoryband[bandCount], &buff[sidx], length-sidx); |
| | | bandsize[bandCount] = length-sidx; |
| | | if(bandCount<99) bandCount++; |
| | | int eidx = stringcmp((char*)buff,"</urn:strings></urn:ViqStrings></urn:ViqStringsList>",52); |
| | | if(eidx >=0 && sidx<eidx){ |
| | | free(memoryband[0]); |
| | | bandCount = 0; |
| | | bMetadataSaving = 0; |
| | | buff[eidx]=0; //meta buff complete |
| | | int ptr=0; |
| | | ////// analyze buffer |
| | | lpp123: sidx = stringcmp((char*)&buff[ptr],"http://changeit:80/media",24); |
| | | if(sidx >=0){//http://changeit:80/media/metadata/0/2016/8/25/1/2/s_5b4103706a6411e6855e574ec330e01d_20160825_013633_93003.zip |
| | | int zipidx =-1;zipidx = stringcmp((char*)&buff[ptr],".zip",4); |
| | | int seridx =-1;seridx = stringcmp((char*)&buff[ptr],".ser",4); |
| | | int kkk=-1; |
| | | if(zipidx>=0){ |
| | | if(seridx>=0){ |
| | | if(zipidx<seridx) kkk = zipidx; |
| | | else kkk = seridx; |
| | | } |
| | | else kkk = zipidx; |
| | | } |
| | | else{ |
| | | if(seridx>=0) kkk = seridx; |
| | | } |
| | | if(kkk>=0 && kkk>sidx+18) |
| | | { |
| | | //下载metadata |
| | | char pathbuf[250] ; |
| | | strncpy(pathbuf,(char*)&buff[ptr+sidx+18],kkk-sidx-18+4); |
| | | pathbuf[kkk-sidx-18+4]=0; |
| | | syslog(LOG_USER | LOG_INFO, "pathbuf=%s\n", pathbuf); |
| | | int i; |
| | | for (i=0;i<ZipSerFileNum;i++) |
| | | { |
| | | if(strcmp(pathbuf,ZipSerFileName[i])==0) break; |
| | | } |
| | | if(i>=ZipSerFileNum){ |
| | | strcpy(ZipSerFileName[ZipSerFileNum],pathbuf); |
| | | if(ZipSerFileNum<1000-1) ZipSerFileNum++; |
| | | } |
| | | ptr=ptr+kkk+4; |
| | | goto lpp123; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | *pBuff='\0'; |
| | | |
| | | |
| | | //res = fread ( chars, 1, sizeof(chars), pFile ); |
| | | char* urnbegin=strstr(buff, "<urn:"); |
| | | |
| | | //ctxt = xmlCreatePushParserCtxt(NULL, NULL, urnbegin, totalres-(urnbegin-buff), NULL); |
| | | //if (ctxt == NULL) { |
| | | // fprintf(stderr, "Failed to create parser context !\n"); |
| | | //} |
| | | // |
| | | //xmlParseChunk(ctxt, urnbegin, totalres-(urnbegin-buff), 1); |
| | | |
| | | //while ((res = fread ( chars, 1, sizeof(chars), pFile )) > 0) { // fread(chars, 4) |
| | | //while ((res = read(GSocket,chars,sizeof(chars))) > 0) { |
| | | // xmlParseChunk(ctxt, chars, res, 0); |
| | | //} |
| | | |
| | | //doc = ctxt->myDoc; |
| | | doc = xmlParseDoc(urnbegin); |
| | | //res = ctxt->wellFormed; |
| | | //xmlFreeParserCtxt(ctxt); |
| | | |
| | | //if (!res) { |
| | | // fprintf(stderr, "Failed to parse %s\n", "pro.txt"); |
| | | //} |
| | | |
| | | /* Create xpath evaluation context */ |
| | | xmlXPathContextPtr xpathCtx = xmlXPathNewContext(doc); |
| | | if(xpathCtx == NULL) { |
| | | fprintf(stderr,"Error: unable to create new XPath context\n"); |
| | | xmlFreeDoc(doc); |
| | | return(-1); |
| | | } |
| | | }// while end |
| | | |
| | | //xmlNode * root_element = xmlDocGetRootElement(doc); |
| | | //{ |
| | | // xmlNode *cur_node = NULL; |
| | | // |
| | | // for (cur_node = root_element; cur_node; cur_node = cur_node->next) { |
| | | // if (cur_node->type == XML_ELEMENT_NODE) { |
| | | // syslog(LOG_USER | LOG_INFO, "node type: Element, name: %s %s\n", cur_node->ns->prefix,cur_node->ns->href ); |
| | | // } |
| | | // } |
| | | //} |
| | | |
| | | if(xmlXPathRegisterNs(xpathCtx, "urn", "urn:videoiq-com") != 0) { |
| | | fprintf(stderr,"Error: unable to register NS with prefix=\"\" and href=\"\"\n"); |
| | | return(-1); |
| | | } |
| | | |
| | | xmlXPathObjectPtr xpathObj = xmlXPathEvalExpression("//urn:strings", xpathCtx); |
| | | if(xpathObj == NULL) { |
| | | fprintf(stderr,"Error: unable to evaluate xpath expression \"%s\"\n", "urn:strings"); |
| | | xmlXPathFreeContext(xpathCtx); |
| | | xmlFreeDoc(doc); |
| | | return(-1); |
| | | } |
| | | |
| | | ZipSerFileNum=0; |
| | | xmlNodeSetPtr nodes = xpathObj->nodesetval; |
| | | for(int i = 0; i<nodes->nodeNr; i++) |
| | | { |
| | | const char* uri=xmlNodeGetContent(nodes->nodeTab[i]); |
| | | strcpy(ZipSerFileName[ZipSerFileNum], uri+18); |
| | | ZipSerFileNum++; |
| | | syslog(LOG_USER | LOG_INFO, "%s\n", uri+18); |
| | | } |
| | | |
| | | syslog(LOG_USER | LOG_INFO, "ser parse finished\n"); |
| | | |
| | | |
| | | xmlFreeDoc(doc); |
| | | |
| | | |
| | | //fclose(pFile); |
| | | close(GSocket); |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | }//for |
| | | |
| | | //////// get |
| | | #ifdef DBG_LOG |
| | | syslog(LOG_USER | LOG_INFO, "ZipSerFileNum=%d\n", ZipSerFileNum); |
| | | #endif |
| | | |
| | | for(ZipCountidx = 0; ZipCountidx<ZipSerFileNum; ZipCountidx++) |
| | | { |
| | | #ifdef DBG_LOG |
| | | syslog(LOG_USER | LOG_INFO, "ZipSerFileName[%d]=%s\n", ZipCountidx, (char*)ZipSerFileName[ZipCountidx]); |
| | | #endif |
| | | |
| | | if(stringcmp((char*)ZipSerFileName[ZipCountidx],".ser",4)>=0) |
| | | { |