// process messages, send back a reply when a file successfully received
void FileProcessingCommunicator::processMessages(){
	try{
		while (true){
			Message msg = bq.deQ(); Header hdr = msg.getHdr();
			string addr = hdr.getAddress(), srcAddr = hdr.getSrcAddr(), srcPort = hdr.getSrcPort(), port = hdr.getPort(), cmd = hdr.getCmd(), content = hdr.getAttrib("filename");
			AbstractDispatcher& dispatcher = AbstractDispatcher::getInstance();
			Message msgReply; Header hdrReply;
			hdrReply.setAddr(srcAddr, srcPort);
			hdrReply.setSrcAddr(addr, port);
			if (content == "stop"){
				sout << "\n Stopping file processing communicator \n";
				break;
			}
			if (cmd == "get_file"){//download
				Folder folder; string destDir = folder.getUploadDir(); FileManager mgr;
				std::vector<std::string> files = mgr.searchFiles(destDir, "*.*", false);
				//Send all files in the upload directory
				for (string path : files){
					hdrReply.setTargetCommunicator("CLientEchoCommunicator");
					hdrReply.setCmd("send_file");
					hdrReply.setAttrib("filename", path);
					hdrReply.setAttrib("msg", "download_reply");
					msgReply.setHdr(hdrReply);
					dispatcher.postMessage(msgReply);
				}

			}
			else{//upload
				string src_file = hdr.getAttrib("src_file_path");
				FileInfo fileinfoDest(content); FileInfo fileinfoSrc(src_file); 				//string cmd = hdr.getAttrib("send_file_begin");		
				string printMsg = "\n Received File " + src_file + " of SIZE = " + std::to_string(fileinfoSrc.size()) + " from " + srcAddr + ":" + srcPort + " and saved at " + content + " with SIZE = " + std::to_string(fileinfoDest.size()) + " \n\n";
				sout << printMsg;
				hdrReply.setTargetCommunicator("CLientEchoCommunicator");
				string strMsg = "Response for received file " + Path::getName(src_file);
				hdrReply.setAttrib("msg", strMsg);
				hdrReply.setCmd("echo_msg");
				msgReply.setHdr(hdrReply);
				dispatcher.postMessage(msgReply);

			}
		}
	}catch (exception e){
		sout << e.what();
	}
}
//String processing instance constructor
StringProcessor::StringProcessor(Message msg){
	try{
		request = msg;
		/*Timer timer;
		long long time_stamp = timer.getCurrentTime();
		request.getHdr().setAttrib("start_time", to_string(time_stamp));*/

		Header hdr = msg.getHdr();
		//srchDir = hdr.getAttrib("directory");
		Folder folder;
		srchDir = folder.getUploadDir();
		srchString = hdr.getAttrib("search_string");
		numThreads = atoi(hdr.getAttrib("no_of_threads").c_str());
		if (numThreads == 0){
			numThreads = 1;
		}
		FileManager mgr;
		std::vector<std::string> files = mgr.searchFiles(srchDir, "*.*", false);

		numFiles = 0;
		std::string exclude_exts[] = {  "zip", "exe", "jpg", "jpeg", "png", "JPG", "JPEG", "EXE" };//exclude extendions for string search

		for (auto file : files){
			std::string extension = Path::getExt(file);
			bool isSkip = false;
			for (auto ext : exclude_exts){
				if (ext == extension){
					isSkip = true;
					break;
				}
			}
			if (isSkip){
				continue;
			}
			SearchResult sr(file);
			bqIn.enQ(sr);
			numFiles++;
		}
	}
	catch (exception e){ sout << e.what(); }
}