Пример #1
0
afx_msg LRESULT CBroadGrdDlg::OnUserRecvfrompcie(WPARAM wParam, LPARAM lParam)
{
	if(pcieReceiver->qBuff.empty())
		return 0;
	//WaitForSingleObject(pcieReceiver->queue_Mutex, INFINITE);
	PACKET packet=pcieReceiver->qBuff.front();
	pcieReceiver->qBuff.pop();
	//ReleaseMutex(pcieReceiver->queue_Mutex);
	SoftwareCommendHeadr* header=(SoftwareCommendHeadr*)(packet.buf+1);
	switch(header->function)
	{
	case Func_DeliverConfig:
		{
			Cmd_DeliverConfig* cmd=(Cmd_DeliverConfig*)header;
			recvFile(cmd->frameID,cmd->frameSize,cmd->endFlag,cmd->data);
			return 0;
		}
		break;
	
	default:
		break;
	}
	//caper->sendPacket(0,HWND_Master,(u_char*)lParam,packet.len);
	return 0;
}
Пример #2
0
int main(int argc, char *argv[])
{
        int sockfd;
        int r;
        struct sockaddr_in servaddr;

        sockfd = socket(AF_INET,SOCK_DGRAM,0); /*create a socket*/
	
        /*init servaddr*/
        bzero(&servaddr,sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_port = htons(SERV_PORT);

        //bind address and port to socket*
        if(bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) == -1)
        {
                perror("bind error");
                exit(-1);
        }

        //r = fcntl(sockfd, F_GETFL, 0);
        //fcntl(sockfd, F_SETFL, r & ~O_NONBLOCK);
        
        recvFile(argv[1],sockfd);
        return 0;

}
Пример #3
0
void handleOrder(porder po,char* path,int cfd)
{
//	printf("path:%s\n",path);
	if(ORDER_PWD == po->order)
	{
		data tbuf;
		memset(&tbuf,0,sizeof(tbuf));
		recvN(cfd,(char*)&tbuf.len,sizeof(tbuf.len));
		recvN(cfd,tbuf.buf,tbuf.len);
		printf("%s\n",tbuf.buf);
	}
	else if(ORDER_LS == po->order)
	{
		data tbuf;
		memset(&tbuf,0,sizeof(tbuf));
		recvN(cfd,(char*)&tbuf.len,sizeof(tbuf.len));
		recvN(cfd,tbuf.buf,tbuf.len);
		printf("%-5s%-20s%-10s\n","type","name","size");
		printf("%s\n",tbuf.buf);
	}
	else if(ORDER_CD == po->order)
	{
		data tbuf;
		memset(&tbuf,0,sizeof(tbuf));
		recvN(cfd,(char*)&tbuf.len,sizeof(tbuf.len));
		recvN(cfd,tbuf.buf,tbuf.len);
		printf("%s\n",tbuf.buf);
	}
	else if(ORDER_PUTS == po->order)
	{
		sendFile(cfd,path,po->info);
	}
	else if(ORDER_GETS == po->order)
	{
		recvFile(cfd,path,po->info);
	}
	else if(ORDER_RM == po->order)
	{
		data tbuf;
		memset(&tbuf,0,sizeof(tbuf));
		tbuf.len = strlen(po->info);
		strcpy(tbuf.buf,po->info);
		sendN(cfd,(char*)&tbuf,tbuf.len+sizeof(tbuf.len));
		memset(&tbuf,0,sizeof(tbuf));
		recvN(cfd,(char*)&tbuf.len,sizeof(tbuf.len));
		recvN(cfd,tbuf.buf,tbuf.len);
		printf("%s\n",tbuf.buf);
	}
	else if(ORDER_EXIT == po->order)
	{
		printf("bye bye!\n");
		close(cfd);
		exit(0);
	}
	else
	{
		printf("command not found\n");
	}
}
Пример #4
0
int serverAddToWallet(BIO *conn, int clientid, EVP_PKEY *clientKey, EVP_PKEY *bankKey)  {
	//receive the cloud dollar file
	if(recvFile(conn, TEMP_DOLLAR_FILENAME) == -1) return -1;
	
	//receive the signature
	char signature[BUFFER_SIZE];
	int status = readPacket(conn, signature, sizeof(signature));
	if ( status == -1 ) return -1;
	int sigSize = status;
	
	//verify the cloud dollar is real (signed by the bank and right string)
	int verified = verifyCloudDollar(TEMP_DOLLAR_FILENAME, bankKey); 
	if(verified < 0) {
		printf("\tReceived an INVALID cloud dollar.\n");

		//inform user of probelm
		writeInt(conn, -2);
		return 0;
	}
	else printf("\tRecieved a valid cloud dollar.\n");

	int serial;
	int amount;
	int user;
	status = getDollarData(TEMP_DOLLAR_FILENAME, &serial, &amount, &user);
	
	//verify the user signed the cloud dollar
	verified = verifyFile(TEMP_DOLLAR_FILENAME, (unsigned char*)signature, sigSize, clientKey);
	if(!verified) {
		printf("\tReceived INVALID signature for the cloud dollar.\n");
		//infomr user of promebl
		writeInt(conn, -3);
		return 0;
	}
	else printf("\tReceived a valid signature from %d\n", clientid);

	//all valid, so up their balance
	int balance = getBalance(clientid);
	status = updateBalance(clientid, balance + amount);
	if(status == -1) {
		//inform user
		writeInt(conn, -1);
		return -1;
	}

	//inform user of success
	if(writeInt(conn, amount) == -1) return -1;
	return amount;
}
Пример #5
0
int main(int argc, char *argv[])
{
        int sockfd, connfd;
        int r, len;
		char buf[100];
        struct sockaddr_in servaddr, cliaddr;

        sockfd = socket(AF_INET, SOCK_STREAM, 0); /*create a socket*/
	
        /*init servaddr*/
        bzero(&servaddr,sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_port = htons(SERV_PORT);

        //bind address and port to socket*
        if(bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) == -1)
        {
                perror("bind error");
                exit(-1);
        }

       	if(listen(sockfd, 1024) == -1){
			perror("listen error");
			exit(-1);
		}

		// a easy way to serve the clients
		for(;;){
			len = sizeof(cliaddr);
			connfd = accept(sockfd, (struct sockaddr *)&cliaddr, &len);
			if(connfd == -1){
				perror("listen error.");
				exit(-1);
			}
			printf("Connection from %s, port \n", 
					inet_ntop(AF_INET, &cliaddr.sin_addr, buf, sizeof(buf)),
					ntohs(cliaddr.sin_port));
			recvFile("temp", connfd);
			close(connfd);
		}
        
        return 0;

}
Пример #6
0
void
ProtocolDataTransfer::run()
{
        switch (m_SocketMode)
        {
        case Slave:
                if (accept() == -1)
                {
                        return;
                }
                break;
        case Active:
                if (connectTo() == -1)
                {
                        return;
                }
                break;
        default:
                return;
        }

        switch (m_Protocol)
        {
        case DoSendFile:
                sendFile();
                break;
        case DoRecvFile:
                recvFile();
                break;
        case DoSendDir:
                sendDir();
                break;
        case DoRecvDir:
                recvDir();
                break;
        case DoSendList:
                sendList();
                break;
        case DoRecvList:
                recvList();
                break;
        }
}
Пример #7
0
Файл: main.c Проект: pPolyn/lab3
int main(int argc, char *argv[])
{
    if (argc < 3 || argc > 4) {
        fprintf(stderr,
                "to run server: host port\nto run client: host port filePath\n");
        return 1;
    }
  
    struct sigaction intSignal;
    intSignal.sa_handler = intHandler;
    sigaction(SIGINT, &intSignal, NULL);

    if (argc == 3)
        recvFile(argv[1], atoi(argv[2]));
    else
        sendFile(argv[1], atoi(argv[2]), argv[3]);

    return 0;
}
Пример #8
0
void* waitMain(void* param){
  while(1){
    stdinFlag = MAIN;
    if(callFlag == OFF) printf("1. 電話を掛ける\n");
    printf("2. ファイル送信\n");
    printf("3. ファイル受信\n");
    printf("4. チャット待ち受け(未実装)\n");
     printf("5. チャット接続(未実装)\n");
    if(callFlag == OFF) printf("6. 終了\n");
    if(callFlag == ON) printf("9. 電話を切る\n");
    char c[1];
    scanf("%s", c);
    if(c[0]=='1'){
      pthread_cancel(udpServThread);
      stdinFlag = OTHER;
      startCallPhone();
      break;
    }
    else if(c[0]=='2'){
      sendFile();
    }
    else if(c[0]=='3'){
      recvFile();
    }
    else if(c[0]=='4'){
      startChatServe();
    }
    else if(c[0]=='5'){
      startChatClient();
    }
    else if(c[0]=='6'){
      pthread_cancel(udpServThread);
      break;
    }
    else if(c[0]=='9'){
      callFlag = OFF;
      break;
    }
    else printf("incorrect input %s\n", c);
  }
}
Пример #9
0
int serverUploadFile(BIO *conn, int clientid) {
	//receive the filesize
	int fileSize = readInt(conn);
	if(fileSize == -1) return -1;

	//the upload costs $1 per MEGABYTE
	int cost = fileSize / MEGABYTE;
	if(fileSize % MEGABYTE != 0) ++cost;

	//check user has the balance for a file of this size
	int userBalance = getBalance(clientid);
	int response = 0;
	if(userBalance == -1) response = -1;
	else if(userBalance < cost) response = cost - userBalance;
	else response = 0;

	//inform user of whether we are going ahead or not
	int status = writeInt(conn, response);
	if(response != 0) return response;
	if(status < 0) return status;
	
	char userDirectory[BUFFER_SIZE];
	snprintf(userDirectory, sizeof(userDirectory), "./%s/%d/", SERVER_FILE_FOLDER, clientid);
	if(chdir(userDirectory) != 0) {
		perror("serverUploadFile");
		return -1;
	}


	//receive the file, save it with whatever name the client uses
	status = recvFile(conn, NULL);
	if(chdir("../../") != 0) {
		perror("serverUploadFile");
		return -1;
	}

	//update their balance
	if(updateBalance(clientid, userBalance - cost) == -1) return -1;

	return 1;
}
Пример #10
0
/* Download the file with the given name from the server.  If decrypt is 0
 * then the file will not be decrypted, and will be left in TEMP_ENCRYPTED_FILENAME.
 * If decrypt is not 0 then the file will be decrypted according to the clients
 * records and saved under its original name. */
int clientDownloadFile(BIO *conn, char *filename, int decrypt)  {
	//trigger the server to call serverDownloadFile()
	if(writeInt(conn, DOWNLOAD_FILE_CODE) == -1) return -1;
	
	//send the server the filename we want to download
	if ( writeString(conn, filename) < 1 ) return -1;

	int status = readInt(conn);
	if(status == -1) {
		printf("No such file %s\n", filename);
		return 0;
	}
	
	//receive the encrypted file, save to temporary file
	status = recvFile(conn, TEMP_ENCRYPTED_FILENAME);
	if ( status < 0 ) return -1;
	if ( status == 5 ) return 5;

	//if no decryption requested quit early
	if(!decrypt) return 0; 
	

	//otherwise check our records to decrypt this file
	FILERECORD *r = getRecord(filename);
	if(r == NULL) {
		printf("No record stored for this file, so no decryption performed.\n");
		return -1;
	}
	
	//decrypt the file, and save with it's original name
	status = decryptFile(TEMP_ENCRYPTED_FILENAME, filename, r->key, r->iv);
	if ( status < 0 ) return -1;

	unlink(TEMP_ENCRYPTED_FILENAME);
	printf("Successfully downloaded %s\n", filename);
	
	return 0;
	
}
Пример #11
0
//收到的数据格式为前4个字节表示header的长度,后面是header
//header第0个字节为标志位,第0位为1表示更新lib,第1位为1表示更新app;第2位为reset标志位。
//如果lib标志位为1,接下来四个字节表示lib 文件名的长度,然后是文件名,接着是32字节的md5,然后是lib文件大小,最后是新版本的version code。app相关数据是一样的格式
//接收完头部,然后接收更新的文件,并写到文件中去
//接收完文件,发送一个更新成功与否的响应(但是不关心是否发送成功)
static int recvData(int fd,int* flagPtr)
{
	if(fd == -1)
		return -1;
	int ret;
	int left;
	char* msg = "acceptFile";
	FILE* newVer;
	char updateFlag = 0;
	int lib_head_size,app_head_size;
	lib_head_size = app_head_size = 0;
	int lib_size = 0;
	int app_size = 0;
	int head_len = 0;//表示head的长度
	char header[HEADER_MAX] = {0};//第0个字节第0位为1表示更新lib,第1位为1表示更新app
	//char lib_md5[MD5_MAX] = {0};
	//char app_md5[MD5_MAX] = {0};
	//char lib_name[FILE_NAME_MAX] = {0};
	//char app_name[FILE_NAME_MAX] = {0};
	char* ptr = header;
	ret = recv(fd,&head_len,4,0);
	if(ret <= 0)
	{
		perror("recv head_len");
		return -1;
	}
	printf("recv head len=%d\n",head_len);
	do 
	{
		ret = recv(fd,ptr,head_len,0);
		if(ret <= 0)//等于0的情况是对方主动关闭
		{
			perror("recv header");
			return -1;
		}
		head_len -= ret;
		ptr += ret;
		//send(fd,msg,strlen(msg),0)
	} while (head_len > 0);
	updateFlag = header[0];
	*flagPtr = updateFlag;
	ptr = header+1;
	printf("updateFlag=%d\n",updateFlag);
	if(updateFlag & 0x04)
	{
		char cmd[64] = {0};
		strcpy(cmd,"rm -f /etc/SNIP39/wpa_supplicant.conf /etc/init.d/uid /etc/init.d/hashid");
		system(cmd);
		printf("reset success\n");
	}
	if(updateFlag & 0x01)
	{
		//格式:文件名长度+文件名+md5+文件大小+新版本code
		int lib_file_len = 0;
		memcpy(&lib_file_len,ptr,INT_LEN);
		ptr += INT_LEN;
		//printf("lib_file_name_len=%d,",lib_file_len);
		memcpy(cmdLibHeader.file_name,ptr,lib_file_len);
		cmdLibHeader.file_name[lib_file_len] = '\0';
		//printf("file_name=%s,",cmdLibHeader.file_name);
		ptr += lib_file_len;
		memcpy(cmdLibHeader.md5,ptr,MD5_MAX-1);
		cmdLibHeader.md5[MD5_MAX-1] = '\0';
		//printf("lib_md5=%s,",cmdLibHeader.md5);
		ptr += MD5_MAX-1;
		memcpy(&lib_size,ptr,INT_LEN);
		cmdLibHeader.file_size = lib_size;
		//printf("lib_file_size=%d,",lib_size);
		ptr += INT_LEN;
		memcpy(&cmdLibHeader.version_code,ptr,INT_LEN);
		//printf("lib new code=%d\n",cmdLibHeader.version_code);
		ptr += INT_LEN;
		printf("lib name=%s,size=%dBytes,new version code=%d\n",cmdLibHeader.file_name,lib_size,cmdLibHeader.version_code);
	}
	if(updateFlag & 0x02)
	{
		int app_file_len = 0;
		memcpy(&app_file_len,ptr,INT_LEN);
		ptr += INT_LEN;
		//printf("app_file_name_len=%d,",app_file_len);
		memcpy(cmdAppHeader.file_name,ptr,app_file_len);
		cmdAppHeader.file_name[app_file_len] = '\0';
		//printf("file_name=%s,",cmdAppHeader.file_name);
		ptr += app_file_len;
		memcpy(cmdAppHeader.md5,ptr,MD5_MAX-1);
		cmdAppHeader.md5[MD5_MAX-1] = '\0';
		//printf("app_md5=%s,",cmdAppHeader.md5);
		ptr += MD5_MAX-1;
		memcpy(&app_size,ptr,INT_LEN);
		cmdAppHeader.file_size = app_size;
		//printf("app_file_size=%d,",app_size);
		ptr += INT_LEN;
		memcpy(&cmdAppHeader.version_code,ptr,INT_LEN);
		//printf("app new code=%d\n",cmdAppHeader.version_code);
		printf("app name=%s,size=%dBytes,new version code=%d\n",cmdAppHeader.file_name,app_size,cmdAppHeader.version_code);
	}
	int successFlag = 0;//0表示全部升级成功,否则,哪个标志位为1就表示哪个失败
	if(updateFlag & 0x01)
	{
		ret = recvFile(fd,&cmdLibHeader);
		if(ret != 0)
		{
			successFlag |= 0x01;
			send(fd,&successFlag,INT_LEN,0);//不关心发送是否成功,直接升级
			return -1;
		}
	}
	if(updateFlag & 0x02)
	{
		ret = recvFile(fd,&cmdAppHeader);
		if(ret != 0)
		{
			successFlag |= 0x02;
			send(fd,&successFlag,INT_LEN,0);//不关心发送是否成功,直接升级
			return -1;
		}
	}
	send(fd,&successFlag,INT_LEN,0);//不关心发送是否成功,直接升级
	return 0;
}
Пример #12
0
int main(int argc,char **argv)
{
	double wts, wte, all_s, all_e, calc_total=0, calc_head;;
	wts = get_wall_time();

	ROT::SysInit();

	setParam(argc, argv);
	wte = get_wall_time();
	calc_head = wte - wts;;

	int sock0 = prepSSock();

	while(1){
		CPBWT::Server s;
		std::ifstream ifs;
		std::ofstream ofs;
				
		calc_total = calc_head;
		//		all_s = get_wall_time();
		int sock = acceptSSock(sock0);
		
		std::string file = tmp_dir_path + "c2s_pos";
		recvFile(sock, (char *)file.c_str()); //receive positions from client
		all_s = get_wall_time();
		
		wts = get_wall_time();
		ifs.open(file.c_str(), std::ios::binary);
		int qlen, tmp;
		ifs >> qlen;
		while(1){
			ifs >> tmp;
			if(tmp == -1){
				break;
			}
			s.pos.push_back(tmp);
		}
		ifs.close();
		
		std::cerr<<"read db\n";
		int n=pbwt_n, m=pbwt_m; // DB size 
		s.readPBWT(m,n,infile);
		s.makeLUTable();
		
		file = tmp_dir_path + "param";
		ofs.open(file.c_str(), std::ios::binary);
		//	std::cerr<<s.v_length<<"\n";
		ofs << s.samples  <<"\n";
		ofs << s.v_length <<"\n";
		ofs << s.B0 <<"\n";
		ofs << s.L0 <<"\n";
		ofs << s.L1 <<"\n";
		ofs.close();
		wte = get_wall_time();
		calc_total += wte - wts;
		sendFile(sock, (char *)file.c_str()); //send db parameters to client
		
		std::cerr<<"set db param, pubkey\n";
		file = key_dir_path + "c2s_pubkey";
		recvFile(sock, (char *)file.c_str()); //receive pubkey from client
		s.core = core;
		s.setParam(file);
		
		std::string queryf = tmp_dir_path + "squeryf";
		std::string queryg = tmp_dir_path + "squeryg";
		std::string resultf = tmp_dir_path + "sresultf";
		std::string resultg = tmp_dir_path + "sresultg";
		std::string ismatch = tmp_dir_path + "sismatch";
		
#ifdef DEBUG
		//	std::string q = "1010101010";
		std::string q = "1010101010111111111111111";
		int select = 0;
		int f=select*(s.samples+1),g=(select+1)*(s.samples+1)-1;
		int blk = s.B0*s.L1;
		int zero = '0';
		f += ('1'-zero)*blk; // fix query for debug
		g += ('1'-zero)*blk;
		std::cerr<<"f="<<f<<", g="<<g<<" ,ln="<<g-f<<"\n";
#endif
		for(int i=0;i<qlen;i++){
			wts = get_wall_time();
			std::cerr<<"round: "<<i<<"\n";
			DBG_PRT("update table\n");
			s.updtLUTable();
			
#ifdef DEBUG		
			f=s.retV(f);
			g=s.retV(g);
#endif

			int ranf0, ranf1, rang0, rang1;
#pragma omp parallel
#pragma omp sections
			{
#pragma omp section
				{
					DBG_PRT("get resultf\n");
					ranf0 = rand();
					ranf1 = rand();
					//		ranf0=0; ranf1=0; //for debug
					if(i+1 == qlen){
						ranf0=0; ranf1=0;
					}
				}
#pragma omp section
				{
					DBG_PRT("get resultg\n");
					rang0 = rand();
					rang1 = rand();
					//		rang0=0; rang1=0; //for debug
					if(i+1 == qlen){
						rang0=0; rang1=0;
					}
				}
			}
			wte = get_wall_time();
			calc_total += wte - wts;
			
			DBG_PRT("recv queries\n");
			recvFile(sock, (char *)queryf.c_str()); //receive query f from client
			recvFile(sock, (char *)queryg.c_str()); //receive query g from client
			
			wts = get_wall_time();
			DBG_PRT("f:main server\n");
			s.setPrevFr();
			s.getOrgQuery(queryf, 0);
			s.getResult(queryf, ranf0, ranf1);
			s.storePrevFr();
			s.makeResFile(resultf);
			
			DBG_PRT("g:main server\n");
			s.setPrevGr();
			s.getOrgQuery(queryg, 1);
			s.getResult(queryg, rang0, rang1);
			s.storePrevGr();
			s.makeResFile(resultg);

			if(epsilon==0){
				s.makeIsLongest(ismatch);
			}else{
				s.makeIsELongest(ismatch, epsilon);
			}
			wte = get_wall_time();
			calc_total += wte - wts;
			
			DBG_PRT("send results\n");
			sendFile(sock, (char *)resultf.c_str()); //send result f to client
			sendFile(sock, (char *)resultg.c_str()); //send result g to client
			sendFile(sock, (char *)ismatch.c_str()); //send ismatch to client
			
			for(int j=0;j<s.pos.size();j++){
				s.pos[j]++;
			}
#ifdef DEBUG
			if(i+1 != qlen){
				f += (q[i+1]-zero)*blk;
				g += (q[i+1]-zero)*blk;
				std::cerr<<"k="<<i+1<<", f="<<f<<", g="<<g<<", ln="<<g-f<<"\n";
			}
#endif
		}
		
		closeSock(sock);
		
		all_e = get_wall_time();	 
		//		std::cerr<<"server(Wall): "<<calc_total<<", "<<all_e-all_s<<"\n";
		std::cerr<<"server(Wall): "<<all_e-all_s<<"\n";
	}
	
	return(0);
}  
Пример #13
0
void ClientThread::analizeCommand(QByteArray &bytearray){
    QString userName;
    if (bytearray.contains("USER")) {
        QRegExp rx("^USER\\s(.*)");
        rx.indexIn(bytearray);
        userName = rx.cap(1);
        mUser = User::getUser(userName);
        sendString(FTPProtocol::getInstance()->getResponse(331));
        return;
    }

    if (bytearray.contains("PASS")) {
        QRegExp rx("^PASS\\s(.*)");
        rx.indexIn(bytearray);
        QString pass = rx.cap(1);
        if (mUser.isNull())
        {
            sendString(FTPProtocol::getInstance()->getResponse(503,"PASS send before USER"));
        }
        else
        {
            if (mUser.auth(pass))
            {
                // logged in
                 sendString(FTPProtocol::getInstance()->getResponse(230));
                 setAuthenticated(true);
                 if (ftpFileSystem != NULL)
                    delete ftpFileSystem;
                 ftpFileSystem = new FtpFileSystem(mUser.getFolder(), mUser.getFileAccess());
            }
            else
            {
                // incorrect
                 sendString(FTPProtocol::getInstance()->getResponse(530));
            }
        }
        return;
    }
    if (isAuthenticated())
    {
        // RNFR -> RNTO sequence
        if (mRenameBeginned){
            if (bytearray.contains("RNTO")){
                QRegExp rx("^RNTO\\s(.*)");
                rx.indexIn(fromEncoding(bytearray));
                QString newName = rx.cap(1);
                mRenameBeginned = false;
                if (ftpFileSystem->rename(mRenameOldName, newName))
                    sendString(FTPProtocol::getInstance()->getResponse(250));
                else
                    sendString(FTPProtocol::getInstance()->getResponse(550));
                return;
            }
            sendString(FTPProtocol::getInstance()->getResponse(503));
            return;
        }
        if (bytearray.contains("SYST")){
            QString syst("Windows Type : L8");
            sendString(FTPProtocol::getInstance()->getResponse(215, syst));
            return;
        }
        if (bytearray.contains("FEAT")){
            QString syst("211-Features:\n\rMDTM\n\rREST STREAM\n\rSIZE\n\rMLST type*;size*;modify*;\n\rMLSD\n\rUTF8\n\rCLNT\n\rMFMT\n\r211 End");
            sendString(syst);
            return;
        }
        if (bytearray.contains("HELP")){
            QString syst("HELP OK");
            sendString(FTPProtocol::getInstance()->getResponse(214, syst));
            return;
        }
        if (bytearray.contains("PWD")){
            sendString(FTPProtocol::getInstance()->getResponse(257, toEncoding("\""+ftpFileSystem->getWorkingDirectory()+"\"")));
            return;
        }
        if (bytearray.contains("OPTS")){
            QRegExp rx("^OPTS ([\\w\\s]+)");
            rx.indexIn(bytearray);
            QRegExp rx2("^UTF8 (\\w+)");
            rx2.indexIn(rx.cap(1));
            if (rx2.cap(1) == "ON")
            {
                mIsUTF8 = true;
            }
            if (rx2.cap(1) == "OFF")
            {
                mIsUTF8 = false;
            }
            sendString(FTPProtocol::getInstance()->getResponse(200));
            return;
        }
        if (bytearray.contains("TYPE")){
            // set transfer type
            QRegExp rx("^TYPE (\\w)( (\\w))?");
            rx.indexIn(bytearray);
            qDebug() << "type" << rx.cap(1) << rx.cap(3);
            mType = rx.cap(1);
            sendString(FTPProtocol::getInstance()->getResponse(200));
            return;
            if (mType == "I")
            {
                sendString(FTPProtocol::getInstance()->getResponse(200));
            }
            else
            {
                sendString(FTPProtocol::getInstance()->getResponse(550));
            }
            return;
        }
        if (bytearray.contains("PORT")){
            mIsActiveMode = true;
            QRegExp rx("^PORT (\\d+),(\\d+),(\\d+),(\\d+),(\\d+),(\\d+)");
            rx.indexIn(bytearray);
            int p1,p2;
            QString buf(rx.cap(5));
            bool flag;
            p1 = rx.cap(5).toInt(&flag);
            p2 = rx.cap(6).toInt(&flag);
            QString addr = rx.cap(1)+"."+rx.cap(2)+"."+rx.cap(3)+"."+rx.cap(4);
            active_addr = addr;
            active_port = p1*256+p2;
            sendString(FTPProtocol::getInstance()->getResponse(200, "Port ok"));
            return;
        }

        if (bytearray.contains("LIST")){
            sendString(FTPProtocol::getInstance()->getResponse(150));
            sendList();
            sendString(FTPProtocol::getInstance()->getResponse(226));
            return;
        }
        if (bytearray.contains("QUIT")){
            sendString(FTPProtocol::getInstance()->getResponse(221));
            closeconnection();
            return;
        }
        if (bytearray.contains("CDUP")){
            if (ftpFileSystem->cdUp())
                sendString(FTPProtocol::getInstance()->getResponse(250));
            else
                sendString(FTPProtocol::getInstance()->getResponse(550));
            return;
        }
        if (bytearray.contains("CWD")){
            QRegExp rx("^CWD\\s(.*)");
            rx.indexIn(fromEncoding(bytearray));
            QString subFolder = rx.cap(1);
            if (ftpFileSystem->changeDir(subFolder))
                sendString(FTPProtocol::getInstance()->getResponse(250));
            else
                sendString(FTPProtocol::getInstance()->getResponse(550));
            return;
        }
        if (bytearray.contains("RETR")){
            QRegExp rx("^RETR\\s(.*)");
            rx.indexIn(fromEncoding(bytearray));
            QString filename = rx.cap(1);
            QString fullFileName = ftpFileSystem->getFileRead(filename);
            if (fullFileName != NULL)
            {
                sendString(FTPProtocol::getInstance()->getResponse(150));
                sendFile(fullFileName);
            }
            else
            {
                sendString(FTPProtocol::getInstance()->getResponse(550,"Permission denied"));
            }
            return;
        }
        if (bytearray.contains("STOR")){
            QRegExp rx("^STOR\\s(.*)");
            rx.indexIn(fromEncoding(bytearray));
            QString filename = rx.cap(1);
            QString fullFileName = ftpFileSystem->getFileWrite(filename);
            if (fullFileName != NULL)
            {
                sendString(FTPProtocol::getInstance()->getResponse(150));
                recvFile(fullFileName);
            }
            else
            {
                sendString(FTPProtocol::getInstance()->getResponse(550,"Permission denied"));
            }
            return;
        }
        if (bytearray.contains("RMD")){
            QRegExp rx("^RMD\\s(.*)");
            rx.indexIn(fromEncoding(bytearray));
            QString filename = rx.cap(1);
            if (ftpFileSystem->removeDir(filename))
                sendString(FTPProtocol::getInstance()->getResponse(250));
            else
                sendString(FTPProtocol::getInstance()->getResponse(550));
            return;
        }
        if (bytearray.contains("DELE")){
            QRegExp rx("^DELE\\s(.*)");
            rx.indexIn(fromEncoding(bytearray));
            QString filename = rx.cap(1);
            if (ftpFileSystem->deleteFile(filename))
                sendString(FTPProtocol::getInstance()->getResponse(250));
            else
                sendString(FTPProtocol::getInstance()->getResponse(550));
            return;
        }
        if (bytearray.contains("MKD")){
            QRegExp rx("^MKD\\s(.*)");
            rx.indexIn(fromEncoding(bytearray));
            QString dirName = rx.cap(1);
            if (ftpFileSystem->mkDir(dirName))
                sendString(FTPProtocol::getInstance()->getResponse(250));
            else
                sendString(FTPProtocol::getInstance()->getResponse(550));
            return;
        }
        if (bytearray.contains("PASV")){
            mIsActiveMode = false;
            selectPassivePort();
            return;
        }
        if (bytearray.contains("SIZE")){
            QRegExp rx("^SIZE\\s(.*)");
            rx.indexIn(fromEncoding(bytearray));
            QString fileName = rx.cap(1);
            qint64 size;
            if (ftpFileSystem->getSize(fileName, &size))
            {
                sendString(FTPProtocol::getInstance()->getResponse(250, QString::number(size)));
            }
            else
            {
               sendString(FTPProtocol::getInstance()->getResponse(550));
            }
            return;
        }
        if (bytearray.contains("MDTM")){
            QRegExp rx("^MDTM\\s(.*)");
            rx.indexIn(fromEncoding(bytearray));
            QString fileName = rx.cap(1);
            QString sdate = ftpFileSystem->getLastModified(fileName);
            if (sdate != NULL)
            {
                sendString(FTPProtocol::getInstance()->getResponse(250, sdate));
            }
            else
            {
               sendString(FTPProtocol::getInstance()->getResponse(550));
            }
            return;
        }
        if (bytearray.contains("RNFR")){
            QRegExp rx("^RNFR\\s(.*)");
            rx.indexIn(fromEncoding(bytearray));
            mRenameOldName = rx.cap(1);

            if (ftpFileSystem->exist(mRenameOldName) && ftpFileSystem->isWritable(mRenameOldName))
            {
                sendString(FTPProtocol::getInstance()->getResponse(350));
                mRenameBeginned = true;
            }
            else
                sendString(FTPProtocol::getInstance()->getResponse(550, "Permission denied"));
            return;
        }
    sendString(FTPProtocol::getInstance()->getResponse(500));
    }
    else
        sendString(FTPProtocol::getInstance()->getResponse(530));
}