FileWriterCDF.hh 7.44 KB
/**
 * FileWriterCDF.hh
 *
 *  Created on: 08 oct. 2014
 *      Author: AKKA
 */

#ifndef FILEWRITERCDF_HH_
#define FILEWRITERCDF_HH_

#include "FileWriter.hh"
#include "ParamMgr.hh"
#include "DataSetMgr.hh"
#include "InstrumentMgr.hh"
#include "MissionMgr.hh"

#include "cdf.h"

#include <map>

#define NB_RECORDS_BUFFER 100000

namespace AMDA
{
	namespace ParamOutputImpl
	{
		namespace Download
		{
			namespace FileWriter
			{

				using namespace AMDA::Info;

				/**
				 * @class FileWriterCDF
				 * @brief Implementation of FileWriter for CDF file format.
				 * @details
				 */
				class FileWriterCDF : public FileWriter
				{
				public:
					/*
					 * structure used to store variable info
					 */
					typedef struct
					{
						long varNum;
						long recNum;
						long type;
						long dim1Size;
						long dim2Size;
						long lastPushRec = 0;
						long bufferNbRec = 0;
						long numBytes = 0;
						void *validMin = NULL;
						void *validMax = NULL;
						std::string format;
						bool isTableParam = false;
						void *buffer = NULL;
					} ParamCDFVar;

					/*
					 * @brief Constructor
					 */
					FileWriterCDF(AMDA::Parameters::ParameterManager &pParameterManager);

					/*
					 * @brief Destructor
					 */
					virtual ~FileWriterCDF(void);

					/*
					 * @overload FileWriter::getExtension - method to get file format extension
					 */
					virtual std::string getExtension(void);

					/*
					 * @overload FileWriter::createNewFile - Create a new CDF file
					 */
					virtual bool createNewFile(std::string filePath, std::string filePrefix="");

					/*
					 * @overload FileWriter::closeFile - Close current opened CDF file
					 */
					virtual void closeFile(void);

					/*
					 * @overload FileWriter::addParameter - Add an output parameter in CDF file
					 */
					virtual bool addParameter(ParamProperties *paramProp, AMDA::Common::ParameterIndexComponentList &indexList,
											  FileDataType type, bool isFirstParam, int dim1Size = 1, int dim2Size = 1, bool isTableParam=false);

					/*
					 * @overload FileWriter::isInfoInSeparateFile - Function use to know if info must be write in a separate file
					 */
					virtual bool isInfoInSeparateFile(bool separateInfoFile, bool onlyOneInterval, OutputStructure outputStructure);

					/*
					 * @overload FileWriter::writeError - Write an error message in the CDF file
					 */
					virtual bool writeError(std::string msg);

					/*
					 * @overload FileWriter::writeAMDAInfo - Write an AMDA info bloc for CDF file
					 */
					virtual bool writeAMDAInfo(std::string version, std::string createdby, std::string acknowledgement);

					/*
					 * @overload FileWriter::writeRequestInfo - Write a request info bloc for CDF file
					 */
					virtual bool writeRequestInfo(std::string structure, std::string timeFormat,
												  int timeResolution, std::string outputParams, std::string ttName);

					/*
					 * @overload FileWriter::writeParamsInfo - Write a parameter info bloc for CDF file
					 */
					virtual bool writeParamsInfo(ParamPropertiesList &paramPropertiesList, OutputStructure outputStructure,
												 std::string currentParamId = "");

					/*
					 * @overload FileWriter::writeIntervalInfo - Write an interval info bloc for CDF file
					 */
					virtual bool writeIntervalInfo(std::string startTime, std::string stopTime, bool isSeveralIntervals);

					/*
					 * @overload FileWriter::writeTimeData - Write a time data in the CDF file
					 */
					virtual bool writeTimeData(std::string paramId, double data, OutputFormatTime timeFormat, bool isFirstParam);

					/*
					 * @overload FileWriter::writeFloatData - Write a float data in the CDF file
					 */
					virtual bool writeFloatData(std::string paramId, int varIndex, float data, bool precision);

					/*
					 * @overload FileWriter::writeShortData - Write a short data in the CDF file
					 */
					virtual bool writeShortData(std::string paramId, int varIndex, short data, bool precision);

					/*
					 * @overload FileWriter::writeIntData - Write a int data in the CDF file
					 */
					virtual bool writeIntData(std::string paramId, int varIndex, int data, bool precision);

					/*
					 * @overload FileWriter::writeDoubleData - Write a double data in the CDF file
					 */
					virtual bool writeDoubleData(std::string paramId, int varIndex, double data, bool precision);

					/*
					 * @overload FileWriter::writeLongDoubleData - Write a long double data in the CDF file
					 */
					virtual bool writeLongDoubleData(std::string paramId, int varIndex, long double data, bool precision);

					/*
					 * @overload FileWriter::writeLogicalData - Write a logical data in the CDF file
					 */
					virtual bool writeLogicalData(std::string paramId, int varIndex, AMDA::Parameters::LogicalData data, bool precision);

					/*
					 * @overload FileWriter::goToNextRecord - Prepare CDF writer to write the next record
					 */
					virtual bool goToNextRecord(std::string paramId, bool isFirstParam);

					/*
					 * @brief Flush data in current opened file
					 */
					virtual bool flushData(std::string paramId, bool isFirstParam);

					/*
					 * @overload FileWriter::finalize - Finalize CDF file write.
					 */
					virtual bool finalize(bool isInfoFile = false);

				protected:
					/*
					 * @brief Write one data in the CDF file
					 */
					bool writeOneData(std::string paramId, int varIndex, void *data);

					/*
					 * @brief Add a parameter in the CDF file
					 */
					bool addCDFParameter(std::string outputId, AMDA::Common::ParameterIndexComponentList &indexList,
										 FileDataType type, int dim1Size, int dim2Size, bool isTableParam);

					/*
					 * @brief Create a variable in the CDF file
					 */
					bool createCDFVar(const char *name, FileDataType type, long varDim1Size, long varDim2Size,
									  ParamCDFVar &cdfVar, bool isConst=false, bool isTableParam =false);

					/*
					 * @brief Add an attribute in the CDF file
					 */
					bool addAttribute(std::string attName, std::string attVal,
									  long scope, long varNum = 0);

					/*
					 * @brief Add an attribute in the CDF file
					 */
					bool addAttribute(std::string attName, double attVal,
									  long scope, long varNum = 0);

					bool addAttribute(std::string attName, void* attBuffer,
												 long scope, long type, long varNum =0);

					/*
					 * @brief Write mission info attributes in the CDF file
					 */
					bool writeMissionInfo(MissionInfoSPtr missionInfo, long varNum);

					/*
					 * @brief Write instrument info attributes in the CDF file
					 */
					bool writeInstrumentInfo(InstrumentInfoSPtr instrumentInfo, long varNum);

					/*
					 * @brief Write dataset info attributes in the CDF file
					 */
					bool writeDatasetInfo(DataSetInfoSPtr datasetInfo, long varNum);

					/*
					 * @brief Write parameter info attributes in the CDF file
					 */
					bool writeParameterInfo(ParamInfoSPtr parameterInfo, long varNum);

					/*
					 * @brief Write parameter table info attributes in the CDF file
					 */
					bool writeTableParamsInfo(std::vector<std::string> tableParams, int level);

					virtual void writeTimeInfo();

					/*
					 * @brief CDF identifier
					 */
					CDFid _cdfid;
					/*
					 * @brief Map of CDF var info
					 */
					std::map<std::string, ParamCDFVar> _cdfVarMap;


					std::string _fileName;
					std::string _filePrefix;

				private:
					

				};

			} /* namespace FileWriter */
		}	  /* namespace Download */
	}		  /* namespace ParamOutputImpl */
} /* namespace AMDA */

#endif /* FILEWRITERCDF_HH_ */