00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef FILEIO_H
00019 #define FILEIO_H
00020
00021
00022 #define isType(type, name) (name==TypeTraits::type2label((type)0))
00023
00024 #include <odindata/image.h>
00025 #include <odindata/fileio_opts.h>
00026
00027
00028 #define AUTODETECTSTR "autodetect"
00029 #define AUTOTDATAYPESTR "automatic"
00030
00031
00045 enum dataDim { timeDim=0, sliceDim, phaseDim, readDim };
00046 static const char* dataDimLabel[]={"time","slice","phase","read"};
00047
00048
00052 class FileIO {
00053
00054 public:
00055
00059 typedef STD_map<Protocol, Data<float,4> > ProtocolDataMap;
00060
00067 static int autoread(ProtocolDataMap& pdmap, const STD_string& filename, const FileReadOpts& opts, const Protocol& protocol_template,ProgressMeter *progmeter=0);
00068
00074 static int autowrite(const ProtocolDataMap& pdmap, const STD_string& filename, const FileWriteOpts& opts);
00075
00079 static svector autoformats();
00080
00084 static STD_string autoformats_str(const STD_string& indent="");
00085
00086
00090 static bool get_trace_status() {return do_trace;}
00091
00095 static void set_trace_status(bool stat) {do_trace=stat;}
00096
00097
00098 static const char* get_compName();
00099
00100
00101 private:
00102 static logPriority loglevel() {if(do_trace) return infoLog; else return normalDebug;}
00103 static bool do_trace;
00104
00105 static int read_dir(ProtocolDataMap& pdmap, const STD_string& dirname, const FileReadOpts& opts, const Protocol& protocol_template,ProgressMeter *progmeter=0);
00106
00107 };
00108
00110
00111
00115 class FileFormat {
00116
00117 public:
00118
00122 void register_format();
00123
00127 static STD_string createUniqueName(const Protocol& prot, STD_map<STD_string,unsigned short> &useMap);
00128
00129 protected:
00130 virtual ~FileFormat() {}
00131
00135 static float voxel_extent(const Geometry& geometry, channelNo direction, int size);
00136 static STD_string selectDataType(const Protocol &prot,const FileWriteOpts& opts);
00137
00138 private:
00139
00140
00141 friend class FileIO;
00142
00143 virtual STD_string description() const = 0;
00144
00145 virtual svector suffix() const = 0;
00146
00147 virtual svector dialects() const = 0;
00148
00149 virtual int read(Data<float,4>& data, const STD_string& filename, const FileReadOpts& opts, Protocol& prot);
00150 virtual int read(FileIO::ProtocolDataMap& pdmap, const STD_string& filename, const FileReadOpts& opts, const Protocol& protocol_template);
00151
00152 virtual int write(const Data<float,4>& data, const STD_string& filename, const FileWriteOpts& opts, const Protocol& prot);
00153 virtual int write(const FileIO::ProtocolDataMap& pdmap, const STD_string& filename, const FileWriteOpts& opts);
00154
00155 static STD_map<STD_string,FileFormat*> formats;
00156
00157 static STD_string analyze_suffix(const STD_string& filename);
00158
00159 static FileFormat* get_format(const STD_string& filename, const STD_string& override_suffix);
00160
00161 static svector possible_formats();
00162
00163 static STD_string formats_str(const STD_string& indent);
00164
00165 static void format_error(const STD_string& filename);
00166
00167 };
00168
00169
00170
00177 #endif