// -------------------- This Function sends the requested file to the client and checks if the dependencies need to be sent-------------------- void Server::sendServerFiles(HttpMessage msg) { SocketSystem ss; SocketConnecter si; std::string cPort = msg.findValue("From-Port"); int ClientPort = Converter<int>::toValue(cPort); while (!si.connect("localhost", ClientPort)) { ::Sleep(100); } // Searches for the revlevant folder and then sends the file Sender send; std::string DepsFlag = msg.findValue("ExtractWithDepsFlag"); std::string fileToSend = msg.findValue("file"); std::string path; std::vector<std::string> dirs = FileSystem::Directory::getDirectories("./ServerDrive", fileToSend+"*"); if (dirs.size() == 0) Show::write("No such file present in the repository => " + fileToSend + "\n"); if (dirs.size() == 1) { std::vector<std::string> files = FileSystem::Directory::getFiles("./ServerDrive/" + dirs[0], fileToSend + "*"); Show::write("\n Sending File :: " + files[0] + " to Client @: " + cPort); send.sendFile("./ServerDrive/" + dirs[0] + "/" + files[0], si, getServerPort(), ClientPort); path = "./ServerDrive/" + dirs[0] + "/"; if (DepsFlag == "Yes") sendFileDependencies(msg, path,si); } if (dirs.size() > 1) { std::string latest_dir = getLatestDir(dirs,fileToSend); std::vector<std::string> files = FileSystem::Directory::getFiles("./ServerDrive/" + latest_dir, fileToSend + "*"); Show::write("\n Sending File :: " + files[0] + " to Client @: " + cPort); send.sendFile("./ServerDrive/" + latest_dir + "/" + files[0], si , getServerPort(), ClientPort); path = "./ServerDrive/" + latest_dir + "/"; if (DepsFlag == "Yes") sendFileDependencies(msg, path,si); } msg = makeMessage(1, "quit", "toAddr:localhost:"+cPort); send.sendMessage(msg, si); }
// -------------------- This Function sends the Dependent files to the client-------------------- void Server::sendFileDependencies(HttpMessage msg, std::string path, Socket & socket) { std::string cPort = msg.findValue("From-Port"); int ClientPort = Converter<int>::toValue(cPort); std::string requestedFile = msg.findValue("file"); Sender send; std::vector<std::string> depFile = FileSystem::Directory::getFiles(path, "*.xml"); std::string src = path + depFile[0]; XmlParser parser(src); XmlDocument* pDoc = parser.buildDocument(); std::vector<std::string> depFileNames; std::vector<sPtr> found = pDoc->element("Dependencies").descendents().select(); // Read the dependencies xml if (found.size() > 0) { for (auto pElem : found) { if (pElem->value() != "dep") depFileNames.push_back(pElem->value()); } } for (std::string f : depFileNames) { // Sending each of the dependency file if exists std::string fileToSend = Utilities::StringHelper::trim(f); std::vector<std::string> dirs = FileSystem::Directory::getDirectories("./ServerDrive/", fileToSend +"*"); if (dirs.size() == 0) Show::write("No such file present in the repository => " + fileToSend + "\n"); if (dirs.size() > 0) { std::string latest_dir = getLatestDir(dirs, fileToSend); std::vector<std::string> files = FileSystem::Directory::getFiles("./ServerDrive/" + latest_dir, fileToSend + "*"); Show::write("\nSending Dependency File of "+ requestedFile+ " => " + files[0] + " to client @: "+cPort); send.sendFile("./ServerDrive/" + latest_dir + "/" + files[0], socket , getServerPort(), ClientPort); path = "./ServerDrive/" + latest_dir + "/"; } } msg = makeMessage(1, "quit", "toAddr:localhost:"+cPort); send.sendMessage(msg, socket); }