00001 #include "vuLightfieldFile.h"
00002
00003 vuLightfieldFile::vuLightfieldFile()
00004 {
00005
00006 vuLightfieldFile::vuLightfieldFile("", false);
00007 }
00008
00010 vuLightfieldFile::vuLightfieldFile(const char *fileName, bool isWritingMode)
00011 {
00012 m_Mode = 1;
00013 m_DataSize = 0;
00014 m_DataName = vuString("data");
00015 m_IsWritingMode = isWritingMode;
00016 m_FileName = vuString(fileName);
00017 m_IsHeaderDone = false;
00018 m_FileStream = NULL;
00019 }
00020
00022 vuLightfieldFile::~vuLightfieldFile()
00023 {
00024 CHECKNDELETE(m_FileStream);
00025 }
00026
00028 const char* vuLightfieldFile::getFileName()
00029 {
00030 return m_FileName.c_str();
00031 }
00032
00034 const vuString vuLightfieldFile::getErrorMessage()
00035 {
00036 return m_ErrorMessage;
00037 }
00038
00040 bool vuLightfieldFile::open()
00041 {
00042 if (m_FileStream != NULL)
00043 return _setErrorMessage("FileStream is already open");
00044 else if (m_FileName.isEmpty())
00045 return _setErrorMessage("No file name specified");
00046
00047 if (m_IsWritingMode) {
00048 m_FileStream = new fstream(m_FileName.c_str(), ios::binary | ios::out);
00049 }
00050 else {
00051 m_FileStream = new fstream(m_FileName.c_str(), ios::binary | ios::in);
00052 }
00053
00054 if (!m_FileStream->is_open()) {
00055 m_FileStream->close();
00056 CHECKNDELETE(m_FileStream);
00057 return _setErrorMessage("Could not open file");
00058 }
00059
00060 return true;
00061 }
00062
00064 void vuLightfieldFile::close()
00065 {
00066 if (m_FileStream != NULL) {
00067 m_FileStream->close();
00068 }
00069 }
00070
00072 bool vuLightfieldFile::readHeader()
00073 {
00074 if (!_isReadyForReading())
00075 return false;
00076 else if (m_IsHeaderDone)
00077 return _setErrorMessage("Header is already read");
00078
00079 char str[64];
00080
00081 m_FileStream->getline(str, 32);
00082 if (strcmp(str, "# vu DataFile Version 1.0") != 0)
00083 return _setErrorMessage("No Version 1.0 file");
00084
00085 m_FileStream->getline(str, 32);
00086 if (strcmp(str, "Volume Data") != 0)
00087 return _setErrorMessage("No Volume Data file");
00088
00089 m_FileStream->getline(str, 32);
00090 if (strcmp(str, "BINARY") == 0)
00091 m_Mode = 1;
00092 else
00093 return _setErrorMessage("File is not in binary mode");
00094
00095 m_FileStream->getline(str, 32);
00096 if (strcmp(str, "DATASET LIGHTFIELD") != 0)
00097 return _setErrorMessage("No Lightfield file");
00098
00099 m_FileStream->getline(str, 32);
00100 if (strcmp(str, "UNIMODAL") != 0)
00101 return _setErrorMessage("No Unimodal file");
00102
00103 m_IsHeaderDone = true;
00104 return true;
00105 }
00106
00108 bool vuLightfieldFile::writeHeader()
00109 {
00110 if (!_isReadyForWriting()) return false;
00111 if (m_DataName.isEmpty()) return _setErrorMessage("No data name set");
00112
00113 *m_FileStream << "# vu DataFile Version 1.0" << endl;
00114 *m_FileStream << "Volume Data" << endl;
00115 if (m_Mode == 1)
00116 *m_FileStream << "BINARY" << endl;
00117 else
00118 return _setErrorMessage("Only binary mode is supported");
00119
00120 *m_FileStream << "DATASET LIGHTFIELD" << endl;
00121 *m_FileStream << "UNIMODAL" << endl;
00122
00123 m_IsHeaderDone = true;
00124 return true;
00125 }
00126
00127
00128
00129
00130
00131 bool vuLightfieldFile::_setErrorMessage(const char *msg)
00132 {
00133 m_ErrorMessage = vuString(msg);
00134 return false;
00135 }
00136
00137 bool vuLightfieldFile::_isReadyForReading()
00138 {
00139 if (m_IsWritingMode)
00140 return _setErrorMessage("Is not in reading mode");
00141 else if (m_FileStream == NULL)
00142 return _setErrorMessage("FileStream is not open");
00143 else
00144 return true;
00145 }
00146
00147 bool vuLightfieldFile::_isReadyForWriting()
00148 {
00149 if (!m_IsWritingMode)
00150 return _setErrorMessage("Is not in writing mode");
00151 else if (m_FileStream == NULL)
00152 return _setErrorMessage("FileStream is not open");
00153 else
00154 return true;
00155 }