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*/