402 lines
16 KiB
C
402 lines
16 KiB
C
![]() |
#include "ec20ftp.h"
|
|||
|
#include <stdlib.h>
|
|||
|
#include "syslib.h" //#define STR2(R) STR1(R)
|
|||
|
|
|||
|
/********************************************************************************
|
|||
|
* @file ec20ftp.c
|
|||
|
* @author <EFBFBD><EFBFBD><EFBFBD>վű<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˾ Mr.Wang
|
|||
|
* @version V1.0.0
|
|||
|
* @date 11-Dec-2018
|
|||
|
* @brief <EFBFBD>ṩQuectelģ<EFBFBD><EFBFBD>EC20<EFBFBD><EFBFBD><EFBFBD><EFBFBD>FTPӲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
******************************************************************************
|
|||
|
* @attention
|
|||
|
* Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>
|
|||
|
* contextID:<EFBFBD><EFBFBD>·ID
|
|||
|
* EC20ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>·ID<EFBFBD><EFBFBD>Χ1~16<EFBFBD><EFBFBD>ÿһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>·ID<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ƹ涨<EFBFBD><EFBFBD>FTPЭ<EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>·ID<EFBFBD><EFBFBD><EFBFBD><EFBFBD>contextID=3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ftp<EFBFBD><EFBFBD>·<EFBFBD><EFBFBD>
|
|||
|
*******************************************************************************/
|
|||
|
|
|||
|
/*****************************************
|
|||
|
*<EFBFBD>ڲ<EFBFBD>ʹ<EFBFBD>õij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
****************************************/
|
|||
|
uint8_t ftpLocalIp[MAX_IP_LEN] ; //FTP<54><50>·<EFBFBD><C2B7><EFBFBD><EFBFBD>IPP
|
|||
|
#define FTP_CMDPACK_LEN 256 //FTP<54><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
/********************************************************
|
|||
|
ec20ģ<EFBFBD><EFBFBD>FTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATָ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*********************************************************/
|
|||
|
enum eFtpCmdNum
|
|||
|
{
|
|||
|
SETCONTEXTID =0, SETACCOUNT =1, SETFILETYPE =2, SETTRANSMODE =3, SETRSTIMEOUT =4,
|
|||
|
FTPLOGIN =5, GETLOGINSTATE =6, SETDIRECTORY =7, GETDIRECTORY =8, LISTFILENAME =9,
|
|||
|
GETFILESIZE =10, DOWNFILE =11, GETHASDOWNSIZE =12, RENAMEFILE =13, FTPLOGOUT = 14
|
|||
|
} ;//ö<><C3B6>ec20ģ<30><C4A3>FTP<54><50><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ö<EFBFBD><C3B6>
|
|||
|
|
|||
|
volatile EC20_CMD_DATA_s sFtpCmd[15]=
|
|||
|
{
|
|||
|
// cmdNum cmdStr, timeout(100ms), trueStr, trueOffset falseStr revResult rtyNum
|
|||
|
{SETCONTEXTID, "AT+QFTPCFG=\"contextid\",%d\r\n", 10, "OK", -1, "ERROR", TIMEOUT, 2 }, //<2F>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>150S
|
|||
|
{SETACCOUNT, "AT+QFTPCFG=\"account\",\"%s\",\"%s\"\r\n",10, "OK" , -1, "ERROR", TIMEOUT, 2 }, //<2F>˻<EFBFBD><CBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{SETFILETYPE, "AT+QFTPCFG=\"filetype\",%d\r\n" , 10, "OK" , -1, "ERROR", TIMEOUT, 2 }, //<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{SETTRANSMODE, "AT+QFTPCFG=\"transmode\",%d\r\n" , 10, "OK" , -1, "ERROR", TIMEOUT, 2 }, //<2F><><EFBFBD><EFBFBD>ģʽ
|
|||
|
{SETRSTIMEOUT, "AT+QFTPCFG=\"rsptimeout\",%d\r\n" , 10, "OK" , -1, "ERROR", TIMEOUT, 2 }, //<2F><><EFBFBD>س<EFBFBD>ʱʱ<CAB1><CAB1>
|
|||
|
|
|||
|
{FTPLOGIN, "AT+QFTPOPEN=\"%s\",%d\r\n", (20*10), "OK", -1, "ERROR", TIMEOUT, 2 }, //FTP<54><50>¼
|
|||
|
{GETLOGINSTATE, "AT+QFTPSTAT\r\n", 10, "+QFTPSTAT: 0", -1, "ERROR", TIMEOUT, 2 }, //<2F><>0<EFBFBD><30>Opening 1<><31>idle 2<><32>Transferring 3<><33>Closing 4<><34>Closed<65><64>
|
|||
|
{SETDIRECTORY, "AT+QFTPCWD=\"%s\"\r\n" , 10, "+QFTPCWD: 0,0", -1, "ERROR", TIMEOUT, 2 }, //ftpĿ¼·<C2BC><C2B7>
|
|||
|
{GETDIRECTORY, "AT+QFTPPWD\r\n" , 10, "+QFTPPWD: 0", -1, "ERROR", TIMEOUT, 2 }, //<2F><><EFBFBD><EFBFBD>ģʽ
|
|||
|
{LISTFILENAME, "AT+QFTPNLST=\"%s\"\r\n" , 10, "+QFTPNLST: 0", -1, "ERROR", TIMEOUT, 2 }, //ftpĿ¼·<C2BC><C2B7> <20>г<EFBFBD>FTPĿ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
{GETFILESIZE, "AT+QFTPSIZE=\"%s\"\r\n" , 10, "+QFTPSIZE: 0", -1, "ERROR", TIMEOUT, 2 }, //<2F>ļ<EFBFBD><C4BC><EFBFBD> <20><>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>С<EFBFBD><D0A1>+QFTPSIZE: 0,36048
|
|||
|
{DOWNFILE, "AT+QFTPGET=\"%s\",\"COM:\",%d,%d\r\n" , 40, "\r\nOK\r\n\r\n+QFTPGET: 0", -1, "ERROR", TIMEOUT, 1 }, //<2F>ļ<EFBFBD><C4BC><EFBFBD>+<2B><>ʼƫ<CABC><C6AB><EFBFBD><EFBFBD>+<2B><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
|||
|
{GETHASDOWNSIZE, "AT+QFTPLEN\r\n" , 10, "+OK", -1, "ERROR", TIMEOUT, 2 }, //ftpĿ¼·<C2BC><C2B7> <20>г<EFBFBD>FTPĿ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{RENAMEFILE, "AT+QFTPRENAME=\"%s\",\"%s\"\r\n" , 20, "+QFTPRENAME: 0", -1, "ERROR", TIMEOUT, 2 }, //<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>+<2B><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
|||
|
{FTPLOGOUT, "AT+QFTPCLOSE\r\n", (2*10), "+QFTPCLOSE", -1, "ERROR", TIMEOUT, 2 }, //FTP<54>˳<EFBFBD><CBB3><EFBFBD>¼
|
|||
|
} ; //EC20ģ<30><C4A3>module<6C><65><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>EC20_CMD_DATA_s<5F>ṹ<EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>
|
|||
|
|
|||
|
/**************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> static const char *FtpCmdNumToString(enum eFtpCmdNum result)
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ٳ<EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>롣
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> eFtpCmdNum<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ö<EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ϊö<EFBFBD>ٵij<EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
**************************************************************************************************/
|
|||
|
static inline const char *FtpCmdNumToString(enum eFtpCmdNum result)
|
|||
|
{
|
|||
|
switch (result)
|
|||
|
{
|
|||
|
ENUM_CHIP_TYPE_CASE(SETCONTEXTID)
|
|||
|
ENUM_CHIP_TYPE_CASE(SETACCOUNT)
|
|||
|
ENUM_CHIP_TYPE_CASE(SETFILETYPE)
|
|||
|
ENUM_CHIP_TYPE_CASE(SETTRANSMODE)
|
|||
|
ENUM_CHIP_TYPE_CASE(SETRSTIMEOUT)
|
|||
|
|
|||
|
ENUM_CHIP_TYPE_CASE(FTPLOGIN)
|
|||
|
ENUM_CHIP_TYPE_CASE(GETLOGINSTATE)
|
|||
|
ENUM_CHIP_TYPE_CASE(SETDIRECTORY)
|
|||
|
ENUM_CHIP_TYPE_CASE(GETDIRECTORY)
|
|||
|
ENUM_CHIP_TYPE_CASE(LISTFILENAME)
|
|||
|
|
|||
|
ENUM_CHIP_TYPE_CASE(GETFILESIZE)
|
|||
|
ENUM_CHIP_TYPE_CASE(DOWNFILE)
|
|||
|
ENUM_CHIP_TYPE_CASE(GETHASDOWNSIZE)
|
|||
|
ENUM_CHIP_TYPE_CASE(RENAMEFILE)
|
|||
|
|
|||
|
ENUM_CHIP_TYPE_CASE(FTPLOGOUT)
|
|||
|
}
|
|||
|
return "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
|||
|
}
|
|||
|
|
|||
|
/**************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult Ftp_Config( void )
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>FTP<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 *psFtp FtpP_s<EFBFBD>ṹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 runResult RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
**************************************************************************************************/
|
|||
|
RunResult Ftp_Config( FtpP_s *psFtp )
|
|||
|
{
|
|||
|
RunResult runResult = TIMEOUT ;
|
|||
|
runResult = EC20_SendFtpCmd(SETCONTEXTID, NULL, psFtp->contextId ) ;
|
|||
|
if( runResult != RUNOK )
|
|||
|
return runResult ;
|
|||
|
runResult = EC20_SendFtpCmd(SETACCOUNT, NULL, psFtp->userName, psFtp->password ) ;
|
|||
|
AppLogPrintf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>FTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Username:%s, Password:%s .", psFtp->userName, psFtp->password ) ;
|
|||
|
if( runResult != RUNOK )
|
|||
|
return runResult ;
|
|||
|
EC20_SendFtpCmd(SETFILETYPE, NULL, psFtp->eFiletype ) ;
|
|||
|
EC20_SendFtpCmd(SETTRANSMODE, NULL, psFtp->eTransmode ) ;
|
|||
|
EC20_SendFtpCmd(SETRSTIMEOUT, NULL, psFtp->rsptimeout ) ;
|
|||
|
return runResult ;
|
|||
|
}
|
|||
|
|
|||
|
/**************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult Ftp_PDP_Init( FtpP_s *psFtp )
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>FTP<EFBFBD><EFBFBD>·
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 runResult RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
**************************************************************************************************/
|
|||
|
RunResult Ftp_PDP_Init( FtpP_s *psFtp )
|
|||
|
{
|
|||
|
RunResult runResult = TIMEOUT ;
|
|||
|
uint8_t *ftpLocalIp = portMalloc(MAX_IP_LEN) ;
|
|||
|
runResult = Query_Context( psFtp->contextId, ftpLocalIp ) ; //<2F><>ѯpsFtp->contextId<49>Ƿ<C7B7>
|
|||
|
if( RUNOK == runResult ) /*psFtp->contextId<49>Ѽ<EFBFBD><D1BC><EFBFBD>*/ //ȥ<><C8A5><EFBFBD><EFBFBD>-><3E>ٴμ<D9B4><CEBC><EFBFBD>
|
|||
|
{
|
|||
|
// runResult = Deact_Context(HTTP_CONTEXTID) ;
|
|||
|
// if( RUNOK != runResult ) /*HTTP_CONTEXTIDȥ<44><C8A5><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>*/ //ֱ<>ӷ<EFBFBD><D3B7>ش<EFBFBD><D8B4><EFBFBD>
|
|||
|
// {
|
|||
|
// return RUNERR ;
|
|||
|
// }
|
|||
|
return RUNOK ;
|
|||
|
}
|
|||
|
runResult = ActivePDP(psFtp->contextId, ftpLocalIp) ;
|
|||
|
if( RUNOK == runResult )
|
|||
|
{
|
|||
|
AppLogPrintf("FTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD>%s", ftpLocalIp) ;
|
|||
|
}
|
|||
|
portFree(ftpLocalIp) ;
|
|||
|
return(runResult) ;
|
|||
|
}
|
|||
|
|
|||
|
/**************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> Ftp_Login( FtpP_s *psFtp )
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>¼FTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 *psFtp FtpP_s<EFBFBD>ṹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 runResult RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
**************************************************************************************************/
|
|||
|
RunResult Ftp_Login(FtpP_s *psFtp)
|
|||
|
{
|
|||
|
RunResult runResult = TIMEOUT ;
|
|||
|
runResult = EC20_SendFtpCmd(FTPLOGIN, NULL, psFtp->ftpServerIP, psFtp->ftpServerPort ) ;
|
|||
|
if( runResult != RUNOK )
|
|||
|
return runResult ;
|
|||
|
|
|||
|
int checkCsTimes = 10 ; //10*2S<32>ȴ<EFBFBD>FTP<54><50><EFBFBD><EFBFBD>idle״̬
|
|||
|
while( checkCsTimes-- )
|
|||
|
{
|
|||
|
Wait_For_Nms(2000) ;
|
|||
|
runResult = EC20_SendFtpCmd(GETLOGINSTATE, NULL ) ;
|
|||
|
if( RUNOK == runResult )
|
|||
|
{
|
|||
|
if( (sFtpCmd[GETLOGINSTATE].trueOffset > 0)&&
|
|||
|
(ec20AtBuf[sFtpCmd[GETLOGINSTATE].trueOffset+13] == 0x31))
|
|||
|
{
|
|||
|
runResult =RUNOK ;
|
|||
|
break;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
runResult =RUNERR ;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return (runResult) ;
|
|||
|
}
|
|||
|
|
|||
|
/**************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> Ftp_Logout( FtpP_s *psFtp )
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>dz<EFBFBD>FTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 *psFtp FtpP_s<EFBFBD>ṹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 runResult RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
**************************************************************************************************/
|
|||
|
RunResult Ftp_Logout(FtpP_s *psFtp)
|
|||
|
{
|
|||
|
RunResult runResult = TIMEOUT ;
|
|||
|
runResult = EC20_SendFtpCmd(FTPLOGOUT, NULL ) ;
|
|||
|
return runResult ;
|
|||
|
}
|
|||
|
|
|||
|
/**************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> Ftp_Set_Dir( FtpP_s *psFtp )
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ftp<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 *psFtp FtpP_s<EFBFBD>ṹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 runResult RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
**************************************************************************************************/
|
|||
|
RunResult Ftp_Set_Dir( FtpP_s *psFtp )
|
|||
|
{
|
|||
|
RunResult runResult = TIMEOUT ;
|
|||
|
runResult = EC20_SendFtpCmd(SETDIRECTORY, NULL, psFtp->ftpDirectory ) ; //<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>Ŀ¼
|
|||
|
if( runResult != RUNOK )
|
|||
|
return runResult ;
|
|||
|
|
|||
|
runResult = EC20_SendFtpCmd(GETDIRECTORY, NULL ) ;
|
|||
|
if( RUNOK == runResult )
|
|||
|
{
|
|||
|
if( (sFtpCmd[GETDIRECTORY].trueOffset > 0)&&
|
|||
|
(kmp(ec20AtBuf, (const char*)psFtp->ftpDirectory) > 0)) //ȷ<>ϲ<EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>Ŀ¼Ϊ<C2BC>û<EFBFBD><C3BB><EFBFBD><EFBFBD>õ<EFBFBD>Ŀ¼
|
|||
|
{
|
|||
|
runResult =RUNOK ;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
runResult =RUNERR ;
|
|||
|
}
|
|||
|
}
|
|||
|
return (runResult) ;
|
|||
|
}
|
|||
|
|
|||
|
/**************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult Ftp_Find_File( uint8_t *dir, uint8_t *fileName )
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>dirĿ¼<EFBFBD>в<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪfileName<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 *dir <EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>Ŀ¼
|
|||
|
* @param2 *fileName <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 RUNOK <EFBFBD><EFBFBD>Ŀ¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD>ļ<EFBFBD>
|
|||
|
* @param2 RUNTIMEOUT <EFBFBD><EFBFBD>Ŀ¼<EFBFBD>в<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD>ļ<EFBFBD>
|
|||
|
* @param3 RUNERR <EFBFBD>г<EFBFBD>dirĿ¼<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* ˵ <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ec20AtBuf[EC20_ATBUF_LEN] 256<EFBFBD>ֽڣ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>dir<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(EC20_ATBUF_LEN-50)ʱҲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܡ<EFBFBD>
|
|||
|
**************************************************************************************************/
|
|||
|
RunResult Ftp_Find_File( uint8_t *dir, uint8_t *fileName )
|
|||
|
{
|
|||
|
if( RUNOK != EC20_SendFtpCmd(LISTFILENAME, NULL, dir ))
|
|||
|
return RUNERR ;
|
|||
|
if( kmp(ec20AtBuf, (const char*)fileName) > 0 )
|
|||
|
return RUNOK ;
|
|||
|
else
|
|||
|
return TIMEOUT ;
|
|||
|
}
|
|||
|
|
|||
|
/**************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> u32 Ftp_Get_FileSize( uint8_t *fileName )
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ѯ*fileName <EFBFBD>ļ<EFBFBD><EFBFBD>Ĵ<EFBFBD>С
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 *fileName <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ѯ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 u32 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>bytes<EFBFBD><EFBFBD>
|
|||
|
**************************************************************************************************/
|
|||
|
u32 Ftp_Get_FileSize( uint8_t *fileName )
|
|||
|
{
|
|||
|
RunResult runResult = TIMEOUT ;
|
|||
|
u32 fileSize = 0 ;
|
|||
|
uint8_t fileSizeBuf[7] = {0} ;
|
|||
|
runResult = EC20_SendFtpCmd(GETFILESIZE, NULL, fileName ) ; //<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>Ŀ¼
|
|||
|
if( runResult != RUNOK )
|
|||
|
return 0 ;
|
|||
|
|
|||
|
CopyValues(fileSizeBuf, (uint8_t*)&ec20AtBuf[ sFtpCmd[GETFILESIZE].trueOffset+13], 0x0D, 6) ;
|
|||
|
fileSize = atoi((const char*)fileSizeBuf) ;
|
|||
|
return (fileSize) ;
|
|||
|
}
|
|||
|
|
|||
|
/**************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult Ftp_File_Rename( uint8_t *oldName, uint8_t *newName )
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 *oldName <EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param2 *newName <EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 runResult RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
**************************************************************************************************/
|
|||
|
RunResult Ftp_File_Rename( uint8_t *oldName, uint8_t *newName )
|
|||
|
{
|
|||
|
RunResult runResult = TIMEOUT ;
|
|||
|
runResult = EC20_SendFtpCmd(RENAMEFILE, NULL, oldName, newName ) ; //
|
|||
|
return (runResult) ;
|
|||
|
}
|
|||
|
|
|||
|
/**************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> int Ftp_Down_File( uint8_t *fileName, uint32_t startPos, uint16_t transLen)
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪfileName<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>startPosλ<EFBFBD>ÿ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>transLen<EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 *fileName <EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param2 startPos <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>λ<EFBFBD><EFBFBD>
|
|||
|
* @param3 transLen <EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 headPos <EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"CONNECT"<EFBFBD><EFBFBD>ec20FtpBuf<EFBFBD>ڵ<EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD>ַ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>-1
|
|||
|
* ע <EFBFBD>⣺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ʱ<EFBFBD><EFBFBD>EC20<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>л<EFBFBD><EFBFBD><EFBFBD>FTP_MODE,<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢<EFBFBD><EFBFBD>ec20FtpBuf<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* ec20FtpBuf<EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>鷽<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>CONNECT<EFBFBD><EFBFBD>+QFTPGET: 0,2048֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD>CONNECT 0x0D 0x0A <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0x0D 0x0A OK 0x0D 0x0A 0x0D 0x0A +QFTPGET: 0,2048<EFBFBD><EFBFBD>
|
|||
|
**************************************************************************************************/
|
|||
|
int Ftp_Down_File( uint8_t *fileName, uint32_t startPos, uint16_t transLen)
|
|||
|
{
|
|||
|
int headPos = -1 ;
|
|||
|
uint8_t revTimes = 0 ;
|
|||
|
ftpDataMode = true ; //EC20<32><30><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>ģʽ<C4A3>л<EFBFBD><D0BB><EFBFBD>FTPģʽ
|
|||
|
Ec20FtpBufReset() ; //FTP<54><50><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
|
|||
|
UARTx_SendString(EC20_UART, (uint8_t *)sFtpCmd[DOWNFILE].cmdStr, fileName, startPos, transLen ) ;
|
|||
|
while( revTimes++ < sFtpCmd[DOWNFILE].timeout )
|
|||
|
{
|
|||
|
Wait_For_Nms(100) ;
|
|||
|
headPos = kmp(ec20FtpBuf, "CONNECT")+9 ; //<2F><><EFBFBD>ص<EFBFBD><D8B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ݿ<EFBFBD>ʼ<EFBFBD>ĵط<C4B5><D8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ݿ<EFBFBD>ʼ<EFBFBD><CABC> <20><>ec20FtpBuf<75>е<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
|
|||
|
sFtpCmd[DOWNFILE].trueOffset = kmp(&ec20FtpBuf[transLen+headPos], sFtpCmd[DOWNFILE].trueStr) ; //+QFTPGET: 0,2048<34><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ݽ<EFBFBD>β<EFBFBD><CEB2> <20><>ec20FtpBuf<75>е<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
|
|||
|
if( sFtpCmd[DOWNFILE].trueOffset == 0)
|
|||
|
{
|
|||
|
if( headPos >= 0 ) //CONNECT<43><54>+QFTPGET: 0,2048֮<38><D6AE><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD> <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
break ;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
headPos = -1 ;
|
|||
|
break ;
|
|||
|
}
|
|||
|
}
|
|||
|
else if( kmp(ec20FtpBuf, sFtpCmd[DOWNFILE].falseStr) >= 0)
|
|||
|
{
|
|||
|
headPos = -1 ;
|
|||
|
break ;
|
|||
|
}
|
|||
|
}
|
|||
|
ftpDataMode = false ; //EC20<32><30><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>ģʽ<C4A3>г<EFBFBD>FTPģʽ
|
|||
|
return (headPos) ;
|
|||
|
}
|
|||
|
|
|||
|
/**************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult EC20_SendFtpCmd( uint8_t cmdNum, char *format,... )
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> MCU<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EC20<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Tcp<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 cmdNum EC20_CMD_DATA_s<EFBFBD><EFBFBD>cmdNum<EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param2 char *format,... <EFBFBD>ɱ<EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param1 status RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
**************************************************************************************************/
|
|||
|
RunResult EC20_SendFtpCmd( uint8_t cmdNum, char *format,... )
|
|||
|
{
|
|||
|
uint8_t revTimes = 0 ;
|
|||
|
RunResult status = TIMEOUT ;
|
|||
|
uint8_t retryTimes = sFtpCmd[cmdNum].rtyNum ;
|
|||
|
char *cmdPack = NULL ;
|
|||
|
format = sFtpCmd[cmdNum].cmdStr ;
|
|||
|
cmdPack = portMalloc(FTP_CMDPACK_LEN*sizeof(uint8_t)) ;
|
|||
|
if( cmdPack == NULL )
|
|||
|
{
|
|||
|
ErrorLogPrintf("EC20 FtpCmdPack <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>!") ;
|
|||
|
portFree(cmdPack) ;
|
|||
|
return RUNERR ;
|
|||
|
}
|
|||
|
va_list ap;
|
|||
|
va_start (ap, format);
|
|||
|
int outLen = vsnprintf(cmdPack, FTP_CMDPACK_LEN, (const char*)format, ap); //vsprintf (temp, cmd, ap); //<2F><><EFBFBD><EFBFBD>Ϊֹ<CEAA><D6B9><EFBFBD><EFBFBD><EFBFBD>еIJ<D0B5><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ܵ<EFBFBD>temp<6D><70>
|
|||
|
if((outLen<=0)||( outLen > FTP_CMDPACK_LEN))
|
|||
|
{
|
|||
|
ErrorLogPrintf("FTP cmdPack <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>--<2D><><EFBFBD><EFBFBD>FTP_CMDPACK_LEN<45><4E>ֵ<EFBFBD><D6B5>") ;
|
|||
|
status = RUNERR ;
|
|||
|
goto tcpCmdOut ;
|
|||
|
}
|
|||
|
while(retryTimes--)
|
|||
|
{
|
|||
|
Ec20AtBufReset() ;
|
|||
|
revTimes = 0 ;
|
|||
|
UARTx_SendData(EC20_UART, cmdPack, outLen ) ; //DMA<4D><41><EFBFBD><EFBFBD>
|
|||
|
while( revTimes++ < sFtpCmd[cmdNum].timeout )
|
|||
|
{
|
|||
|
Wait_For_Nms(100) ;
|
|||
|
sFtpCmd[cmdNum].trueOffset = kmp(ec20AtBuf, sFtpCmd[cmdNum].trueStr) ;
|
|||
|
if( sFtpCmd[cmdNum].trueOffset >= 0)
|
|||
|
{
|
|||
|
status = RUNOK ;
|
|||
|
goto tcpCmdOut ;
|
|||
|
}
|
|||
|
else if( kmp(ec20AtBuf, sFtpCmd[cmdNum].falseStr) >= 0)
|
|||
|
{
|
|||
|
status = RUNERR ;
|
|||
|
goto tcpCmdOut ;
|
|||
|
}
|
|||
|
}
|
|||
|
Wait_For_Nms( 1000 ) ;
|
|||
|
}
|
|||
|
tcpCmdOut:portFree(cmdPack) ;
|
|||
|
va_end(ap) ;
|
|||
|
DebugLogPrintf("%s %s\r\n[%s]", FtpCmdNumToString((enum eFtpCmdNum)cmdNum), RunResultToString(status), ec20AtBuf ) ;
|
|||
|
return (status) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|