www.pudn.com > Net_apps.rar > HttpSolRequest.c


//************************************************************* 
// Copyright 2003 Service & Quality Technology CO., LTD. 
// ALL RIGHTS RESERVED. 
// This software is provided under license and contains proprietary 
// and confidential material which is the property of SQ tech. 
// 
// FileName     : HttpSolRequest.c 
// Description  : Http gengral api 
// Reversion    : 0.1 ,Date : 2004/03/18 ,Author  : gofly 
//                Comment : first implementation 
// 
//************************************************************* 
#include "opt.h" 
#if HTTP_OPEN 
#include "..\include\L3\net_apps\httpd\api\HttpSolRequest.h" 
#include "..\include\L0\video\detection.h" 
#include "..\include\L2\system\update.h" 
#include "..\include\L2\system\motor.h" 
 
INT8U Sd_trigger_Hotkey=0; 
//*********************************************** 
// HttpRecvComplete(void *data) 
// Description  :  determine that recv data complete 
// Parameters   : 
// Returns      :  recv over||recv midway return HTTP_R_OK 
//                 deny order             return HTTP_R_ERR 
//*********************************************** 
 
INT8U HttpRecvComplete(void *data, INT8U index) 
{ 
    INT8U RecvCompleteFlag   =    0; 
    THttpCtrlBlack *ptHCB    =    data ; 
    *(ptHCB->SockRecvBuf[index] + ptHCB->RecvLen[index])  = '\x00'; 
 
//===========================================================================// 
//    FILE_TYPE_FWUD 
//===========================================================================// 
	if(ptHCB->FileType[index]	 ==  FILE_TYPE_FWUD) 
   { 
         return HttpSolReguest((void*)data, index); 
 
   } 
//===========================================================================// 
//          check recvlen 
//===========================================================================// 
    if( ptHCB->RecvLen[index] + 10  > HTTP_MAX_RECV_BUFF ) //10 = cushioning effect 
    { 
       return HTTP_R_ERR;// to bring about recv destory 
    } 
//===========================================================================// 
//          fist data != 'G' 'P' 's'    GET POST sq610-type 
//===========================================================================// 
    if(*ptHCB->SockRecvBuf[index] != 'G' && *ptHCB->SockRecvBuf[index] != 'P' 
    && *ptHCB->SockRecvBuf[index] != 's') 
    { 
       return HTTP_R_ERR;// to bring about recv destory 
    } 
 
//===========================================================================// 
//    GET 
//===========================================================================// 
    if(*ptHCB->SockRecvBuf[index] == 'G' && 
        strstr((char*)ptHCB->SockRecvBuf[index],(const char*)"\x0d\x0a\x0d\x0a")) 
    { 
       RecvCompleteFlag  = 1;   // to bring sol request 
    } 
 
//===========================================================================// 
//    POST     ******request packet must less 1460  and can't division ****** 
//===========================================================================// 
    if(*ptHCB->SockRecvBuf[index] == 'P' ) 
    { 
        if(!strstr((char*)ptHCB->SockRecvBuf[index],(const char*)"\x0d\x0a\x0d\x0a")) 
            return HTTP_R_ERR; 
        RecvCompleteFlag  = 1;   // to bring sol request 
 
        if(RecvCompleteFlag && !strncmp((const char*)ptHCB->SockRecvBuf[index],"POST /Reboot.html ",18)) 
        { 
           if(!strstr(strstr((char*)ptHCB->SockRecvBuf[index],(const char*)"\x0d\x0a\x0d\x0a")+4,(const char*)"\x0d\x0a\x0d\x0a")) 
              RecvCompleteFlag  = 0; 
        } 
    } 
//===========================================================================// 
//    sq610-type   first head packet size == 32 
//===========================================================================// 
    if(*ptHCB->SockRecvBuf[index] == 's' ) 
    { 
        if(ptHCB->RecvLen[index] >= 12 || strstr((char*)ptHCB->SockRecvBuf[index],(const char*)"\x0d\x0a\x0d\x0a")) 
        { 
            RecvCompleteFlag  = 1;   // to bring sol request 
        } 
    } 
 
 
    if(RecvCompleteFlag) 
    { 
         
        return HttpSolReguest((void*)data, index); //recv over 
    } 
 
    return HTTP_R_OK;//recv midway 
}; 
//*********************************************** 
// HttpSolReguest(void *data) 
// Description  : 
// Parameters   : 
// Returns      :  success             return HTTP_R_OK 
//                 destory             return HTTP_R_ERR 
//*********************************************** 
INT8U HttpSolReguest(void *data, INT8U index) 
{ 
    THttpCtrlBlack  *ptHCB          =    data ; 
    S_firware_head  *firware_head; 
    static  INT32U   Recv_Len_FWUD = 0; 
    INT8U           *pFWUDStart; 
    INT32U           i,j; 
    INT8U            A8Utemp[256]; 
    INT8U            Msg[256]; 
 
//===========================================================================// 
//    FILE_TYPE_FWUD 
//===========================================================================// 
	if(ptHCB->FileType[index]	 ==  FILE_TYPE_FWUD) 
   { 
         goto  SQ610_FWUD; 
 
   } 
//===========================================================================// 
//      check      GET POST sq610-type 
//===========================================================================// 
    if(strncmp((const char*)ptHCB->SockRecvBuf[index],"GET",3) 
        &&strncmp((const char*)ptHCB->SockRecvBuf[index],"POST",4) 
        &&strncmp((const char*)ptHCB->SockRecvBuf[index],"sq610",5) ) 
    { 
        return HTTP_R_ERR; 
    } 
//===========================================================================// 
//   sol UID   // by cookie || name passwd 
//===========================================================================// 
    //  HttpCheckPassport return ROOT USER ;default =>OTHER+1 
    ptHCB->UID[index]  =   HttpCheckPassport((INT8U*)ptHCB->SockRecvBuf[index]); 
 
    sprintf(Msg, "HTTP getpassport by name  UID %d PID %d\n", ptHCB->UID[index],ptHCB->PID[index]); 
 
 
 
    if( ptHCB->UID[index] == OTHER+1 && 
        SearchPost((const INT8U*)ptHCB->SockRecvBuf[index],(const INT8U*)"webcamPWD=",A8Utemp,sizeof(A8Utemp)) 
        == HTTP_R_OK) 
    { 
       ptHCB->UID[index]  =   HttpCheckCookie(A8Utemp); 
       sprintf(Msg, "HTTP getpassport by cookie UID %d PID %d\n", ptHCB->UID[index],ptHCB->PID[index]); 
    } 
 
    if(ptHCB->UID[index] == OTHER+1) 
    { 
        ptHCB->UID[index] = OTHER; 
    } 
    else 
    { 
        SHOW_EX1(HTTP_DEBUG, Msg); 
    } 
 
 
//===========================================================================// 
//          sq610-type 
//===========================================================================// 
//////------------------------ recv forever ----------------////////// 
 
/* 
if(!strncmp((const char*)ptHCB->SockRecvBuf[index],"sq610-test-r",12)) 
{ 
        INT16U test = 0x1111; 
        //INT16U test = 0x6464; 
        test = *((INT16U *)IoPPPOE("PPPOE_SESSIONID",0,IOR,ROOT)); 
        IoPPPOE("PPPOE_SESSIONID",&test,IOW,ROOT); 
        return HTTP_R_OK; 
}*/ 
 
if(!strncmp((const char*)ptHCB->SockRecvBuf[index],"sq610-NULL",10)) 
{ 
 
   ptHCB->RecvLen[index] =   10; 
 
   return HTTP_R_OK; 
} 
 
    if(!strncmp((const char*)ptHCB->SockRecvBuf[index],"sq610-md-trigger",16)) 
    { 
 
        if (!Sd_trigger_Hotkey && (*IoMDTrigger("Motion_Det_TRIGGER_SD_CARD",NULL,0,0)=='c') ) 
        { 
            Sd_trigger_Hotkey = 1; 
        } 
        return HTTP_R_ERR; 
    } 
 
if(!strncmp((const char*)ptHCB->SockRecvBuf[index],"sq610-md-sensitivity",20)) 
{ 
    INT8U *sendbuf,s[3]; 
    sendbuf = ptHCB->SockRecvBuf[index]; 
    memcpy(s,sendbuf+20,2); 
    detection_ctrl.md_level[0] = atoi(s); 
    memcpy(s,sendbuf+22,2); 
    detection_ctrl.md_level[1] = atoi(s); 
    m[11] =*pSavePcTrigger; 
    IoEventTrigger(0,0,IOW,ROOT); 
    //IoEventTrigger("MotionDet2Sensitive",0,IOW,ROOT); 
    IoEventTrigger(0,0,IOINIT,ROOT); 
    return HTTP_R_ERR; 
} 
//////------------------------ motion det ------------------////////// 
if(!strncmp((const char*)ptHCB->SockRecvBuf[index],"sq610-md",8))//motion track 
{ 
   motion_det_set(  atoi((const char*)ptHCB->SockRecvBuf[index] + 9), 
                    atoi((const char*)ptHCB->SockRecvBuf[index] + 14), 
                    atoi((const char*)ptHCB->SockRecvBuf[index] + 19), 
                    atoi((const char*)ptHCB->SockRecvBuf[index] + 24), 
                    atoi((const char*)ptHCB->SockRecvBuf[index] + 29), 
                    atoi((const char*)ptHCB->SockRecvBuf[index] + 34) 
 
                    ) ; 
 
   return HTTP_R_ERR; 
} 
//////------------------------ motion track ------------------////////// 
if(!strncmp((const char*)ptHCB->SockRecvBuf[index],"sq610-mt",8))//motion track 
{ 
        INT16S MovX; 
        INT16S MovY; 
        INT16S Speed; 
 
 
        MovX    =   atoi(ptHCB->SockRecvBuf[index]+11); 
        MovY    =   atoi(ptHCB->SockRecvBuf[index]+16); 
        Speed   =   atoi(ptHCB->SockRecvBuf[index]+21); 
        #if 1 
        motor_move_angle(((INT16S)0 - MovX), MovY, Speed); 
 
        #else 
        printf("%d %d \n",MovX,MovY); 
        #endif 
 
        ptHCB->RecvLen[index]  =   0; 
        sprintf(ptHCB->SockSendBuf[index], "sq610-mt ACK\x00"); 
        ptHCB->File[index]        =  ptHCB->SockSendBuf[index]; 
        ptHCB->TotalLen[index]    =  strlen((const char*)ptHCB->SockSendBuf[index]); 
        ptHCB->FileType[index]	  =  FILE_TYPE_MT; 
        ptHCB->Stat[index]        =  HTTP_RECV; 
//        ptHCB->Stat[index]        =  HTTP_SEND; 
        return HTTP_R_OK; 
     //return HTTP_R_ERR; 
} 
//add by jgy  10/18/05 
if(!strncmp((const char *)ptHCB->SockRecvBuf[index], "POST /Restore.htm", 17)) 
{//恢复出厂设置 
    eprom_24c08_define(); 
} 
//jgy++ 
 
//////------------------------ fwud ------------------////////// 
SQ610_FWUD: 
    //----- do   something 
 
 
    #if 1 
    if(ptHCB->FileType[index]	 ==  FILE_TYPE_FWUD || 
    	!strncmp((const char*)ptHCB->SockRecvBuf[index],"POST /Reboot.html",17)) 
    { 
        if(!strncmp((const char*)ptHCB->SockRecvBuf[index],"POST /Reboot.html",17)) 
        {   //首次接收升级数据包 
            firware_packet_success(0, IOW); 
            pFWUDStart    =   strstr(strstr((char*)ptHCB->SockRecvBuf[index],(const char*)"\x0d\x0a\x0d\x0a")+4 
            ,(const char*)"\x0d\x0a\x0d\x0a") + 4; 
            Recv_Len_FWUD   = ptHCB->RecvLen[index] - (pFWUDStart - ptHCB->SockRecvBuf[index]); 
            memcpy((char huge*)get_update_addr(),pFWUDStart, Recv_Len_FWUD); 
        }  //更新的软件数据被复制到软件升级缓冲区里 
        else 
        { 
 
           //后续接收到的升级数据包 
           xmemcpy((char huge*)get_update_addr() + Recv_Len_FWUD , 
                ptHCB->SockRecvBuf[index] , 
 
                ((Recv_Len_FWUD + ptHCB->RecvLen[index]) > FWLENTH) ? 
                   FWLENTH - Recv_Len_FWUD 
                 : ptHCB->RecvLen[index] 
 
                ); 
 
           Recv_Len_FWUD +=  ptHCB->RecvLen[index]; 
 
 
        } 
           if(Recv_Len_FWUD >= FWLENTH) 
           {    //升级数据包接收完毕 
                firware_packet_success(1, IOW); 
                /* 
                sprintf(ptHCB->SockSendBuf[index], "%s UID %d PID%d\n\x00" 
                , "sq610-fwud", ptHCB->UID[index], ptHCB->PID[index]); 
                ptHCB->File[index]        =  ptHCB->SockSendBuf[index]; 
                ptHCB->TotalLen[index]    =  strlen((const char*)ptHCB->SockSendBuf[index]); 
                ptHCB->FileType[index]	  =  FILE_TYPE_STAIC_HTML; 
                ptHCB->Stat[index]        =  HTTP_SEND; 
                return HTTP_R_OK; 
                */ 
                sprintf(ptHCB->SockRecvBuf[index],"POST /Reboot.html "); 
 
           } 
           else 
           { 
                ptHCB->RecvLen[index]     =  0; 
                ptHCB->File[index]        =  ptHCB->SockSendBuf[index]; 
                ptHCB->TotalLen[index]    =  0; 
                ptHCB->FileType[index]	  =  FILE_TYPE_FWUD; 
                ptHCB->Stat[index]        =  HTTP_RECV; 
                return HTTP_R_OK; 
           } 
    } 
 
 
    #else 
    if(ptHCB->FileType[index]	 ==  FILE_TYPE_FWUD || 
    	!strncmp((const char*)ptHCB->SockRecvBuf[index],"sq610-fwud",10)) 
    { 
    if(!strncmp((const char*)ptHCB->SockRecvBuf[index],"sq610-fwud",10)) 
        { 
            firware_packet_success(0, IOW); 
            Recv_Len_FWUD   =   ptHCB->RecvLen[index] - sizeof(S_firware_head); 
            memcpy((char huge*)get_update_addr(), 
                ptHCB->SockRecvBuf[index] + sizeof(S_firware_head), 
                Recv_Len_FWUD); 
        } 
        else 
        { 
 
            xmemcpy((char huge*)get_update_addr() + Recv_Len_FWUD , 
                ptHCB->SockRecvBuf[index] , 
                ptHCB->RecvLen[index]); 
 
           Recv_Len_FWUD +=  ptHCB->RecvLen[index]; 
 
           if(Recv_Len_FWUD >= FWLENTH) 
           { 
               firware_packet_success(1, IOW); 
                sprintf(ptHCB->SockSendBuf[index], "%s UID %d PID%d\n\x00" 
                    , "sq610-fwud", ptHCB->UID[index], ptHCB->PID[index]); 
                ptHCB->File[index]        =  ptHCB->SockSendBuf[index]; 
                ptHCB->TotalLen[index]    =  strlen((const char*)ptHCB->SockSendBuf[index]); 
                ptHCB->FileType[index]	  =  FILE_TYPE_STAIC_HTML; 
                ptHCB->Stat[index]        =  HTTP_SEND; 
                return HTTP_R_OK; 
           } 
 
 
        } 
        ptHCB->RecvLen[index]     =  0; 
        ptHCB->File[index]        =  ptHCB->SockSendBuf[index]; 
        ptHCB->TotalLen[index]    =  0; 
        ptHCB->FileType[index]	  =  FILE_TYPE_FWUD; 
        ptHCB->Stat[index]        =  HTTP_SEND; 
        return HTTP_R_OK; 
         } 
    #endif 
 
 
 
 
 
//===========================================================================// 
//  GET & post request 
//===========================================================================// 
    ptHCB->Order[index]   =   (INT8U*)strchr((char*)ptHCB->SockRecvBuf[index] ,0x2f); 
 
 
 
    if(ptHCB->Order[index] == NULL) 
    { 
        return HTTP_R_ERR;// to bring about recv destory 
    } 
 
    if((char*)ptHCB->SockRecvBuf[index][0] == 'P') 
    { 
 
 
        HttpSolPost(ptHCB->SockRecvBuf[index], ptHCB->UID[index], NULL); 
 
    } 
 
    return HttpOpenFile((void*)data, index); 
 
 
    return HTTP_R_OK; 
} 
#endif /*HTTP_OPEN*/