DataRetriever.cpp 4.81 KB
#include "DataRetriever.h"

#include <fstream>
#include <cstdlib>

#include "../Common/Toolbox.h"

using namespace std;
using namespace TREPS::Common;

namespace TREPS
{
	namespace DataRetriever
	{
		DataRetrieverClass::DataRetrieverClass(void): app(NULL), errorMsg("")
		{
			 this->app = ApplicationClass::getInstance();
		}

		bool DataRetrieverClass::copyLocalFile(const char *file_path, const char *dest_dir, const char *dest_name, bool checkSize)
		{
			this->errorMsg = "";

			if (checkSize)
			{
				//test the file size
				int fileSize = getFileSize(file_path);

				if (fileSize < 0)
				{
					this->errorMsg = "Cannot get file size";
					LOG4CXX_ERROR(this->app->getLog()->getPtr(), this->errorMsg);
					return false;
				}

				if (fileSize > this->app->getConf()->getMaxSourceFileSize())
				{
					this->errorMsg = "File too large (limitation to ";
					this->errorMsg += intToStr(this->app->getConf()->getMaxSourceFileSize());
					this->errorMsg += " octets)";
					LOG4CXX_ERROR(this->app->getLog()->getPtr(),this->errorMsg);
					return false;
                         	}
			}

			LOG4CXX_INFO(this->app->getLog()->getPtr(),"Try to copy local file " << file_path << " to dir " << dest_dir);
			
			//copy the file
			ifstream source(file_path, ios::binary);
			
			if (!source.good())
			{
				this->errorMsg = "Error to load source file";
				LOG4CXX_ERROR(this->app->getLog()->getPtr(), this->errorMsg);
				return false;
			}
		
			string destPath = getPathCorrection(dest_dir);
			
			destPath += dest_name;
		
			ofstream dest(destPath.c_str(), ios::binary);

			dest << source.rdbuf();

			source.close();
			dest.close();
			
			return true;
		}
		
		bool DataRetrieverClass::copyWebFile(const char *file_url, const char *dest_dir, const char *dest_name, bool checkSize)
		{
			this->errorMsg = "";

			//use the call of wget system command to copy a web file
			string cmd = "wget ";
		
			string proxyUser = this->app->getConf()->getProxyUsername();
			string proxyPwd  = this->app->getConf()->getProxyPassword();
		
			if (proxyUser.compare("") != 0)
			{
				cmd += "--proxy-user=";
				cmd += proxyUser;
				cmd += " ";
			}
			
			if (proxyPwd.compare("") != 0)
			{
				cmd += "--proxy-password=";
				cmd += proxyPwd;
				cmd += " ";
			}

			if (checkSize)
			{
				//test file size
				string cmd_size = cmd;
				cmd_size += "--spider \"";
				cmd_size += file_url;

				//for english server
				string cmd_size_english = cmd_size;
				cmd_size_english += "\" 2>&1 | grep Length | awk '{print $2}'";

				//for french server
				string cmd_size_french = cmd_size;
				cmd_size_french += "\" 2>&1 | grep Longueur | awk '{print $2}'";

				string output;
				//run command for french server
				int status = executeSystemCommand(cmd_size_french.c_str(), output);

				if (status != 0)
				{
					this->errorMsg = "Cannot retrieve web file";
					LOG4CXX_ERROR(this->app->getLog()->getPtr(),this->errorMsg);
					return false;
				}

				if (output.compare("") == 0)
				{
					//if no output, try to run english command
					status = executeSystemCommand(cmd_size_english.c_str(), output);

					if (status != 0)
					{
						this->errorMsg = "Cannot retrieve web file";
						LOG4CXX_ERROR(this->app->getLog()->getPtr(),this->errorMsg);
						return false;
					}

					if (output.compare("") == 0)
					{
						this->errorMsg = "Cannot retrieve web file";
						LOG4CXX_ERROR(this->app->getLog()->getPtr(),this->errorMsg);
						return false;
					}
				}

				long int fileSize = atol(output.c_str());

				if (fileSize <= 0)
				{
					this->errorMsg = "Internal error to get the file size.";
					LOG4CXX_ERROR(this->app->getLog()->getPtr(),this->errorMsg);
					return false;
				}

				if (fileSize > this->app->getConf()->getMaxSourceFileSize())
				{
					this->errorMsg = "File too large (limitation to ";
					this->errorMsg += intToStr(this->app->getConf()->getMaxSourceFileSize());
					this->errorMsg += " octets)";
					LOG4CXX_ERROR(this->app->getLog()->getPtr(),this->errorMsg);
					return false;
				}
			}

			//copy the file
			string destPath = getPathCorrection(dest_dir);
			
			destPath += dest_name;
	
			cmd += "-O ";
			cmd += destPath;
	
			cmd += " \"";
			cmd += file_url;
			cmd += "\"";

			string output;
			int status = executeSystemCommand(cmd.c_str(),output);

			if (status != 0)
			{
				this->errorMsg  = "Cannot copy web file ";
				this->errorMsg += file_url;
				this->errorMsg += " - System command error : ";
				this->errorMsg += intToStr(status);
				LOG4CXX_ERROR(this->app->getLog()->getPtr(),this->errorMsg);
				return false;
			}

			return true;
		}

		string DataRetrieverClass::getErrorMsg(void)
		{
			return this->errorMsg;
		}
	}
}