- if (file_id < 0) {
- sys_error (ERR_WARNING, "Tried to write header with file closed");
- return (false);
- }
-
- lseek (file_id, 0, SEEK_SET);
- write_nint16 (&headersize, file_id);
- write_nint16 (&signature, file_id);
- write_nint16 (&num_labels, file_id);
- write_nint16 (&mPixelType, file_id);
- write_nint16 (&mPixelSize, file_id);
- write_nint32 (&mNX, file_id);
- write_nint32 (&mNY, file_id);
- write_nint16 (&axis_increment_known, file_id);
- write_nfloat64 (&mIncX, file_id);
- write_nfloat64 (&mIncY, file_id);
- write_nint16 (&axis_extent_known, file_id);
- write_nfloat64 (&mMinX, file_id);
- write_nfloat64 (&mMaxX, file_id);
- write_nfloat64 (&mMinY, file_id);
- write_nfloat64 (&mMaxY, file_id);
- write_nfloat64 (&mOffsetPV, file_id);
- write_nfloat64 (&mScalePV, file_id);
-
- headersize = lseek (file_id, 0, SEEK_CUR);
- lseek (file_id, 0, SEEK_SET);
- write_nint16 (&headersize, file_id);
-
- return (true);
-}
-
-template<class T>
-bool
-Array2dFile<T>::arrayDataWrite (void)
-{
- if (file_id < 0) {
- sys_error (ERR_WARNING, "Tried to arrayDataWrite with file_id < 0");
- return (false);
- }
-
- T** da = array.getArray();
- if (! da)
- return (false);
-
- lseek (file_id, headersize, SEEK_SET);
- for (unsigned int ix = 0; ix < mNX; ix++)
- for (unsigned int iy = 0; iy < mNY; iy++) {
- T value = da[ix][iy];
- ConvertReverseNetworkOrder (&value, sizeof(T));
- write (file_id, &value, mPixelSize);
- }
-
- return (true);
-}
-
-template<class T>
-bool
-Array2dFile<T>::arrayDataRead (void)
-{
- if (file_id < 0) {
- sys_error (ERR_WARNING, "Tried to arrayDataRead with file_id < 0");
- return (false);
- }
-
- T** da = array.getArray();
- if (! da)
- return (false);
-
- lseek (file_id, headersize, SEEK_SET);
- T pixelBuffer;
- for (int ix = 0; ix < mNX; ix++)
- for (unsigned int iy = 0; iy < mNY; iy++) {
- read (file_id, &pixelBuffer, mPixelSize);
- ConvertReverseNetworkOrder (&pixelBuffer, sizeof(T));
- da[ix][iy] = pixelBuffer;
- }
-
- return (true);
-}
-
-template<class T>
-bool
-Array2dFile<T>::labelSeek (unsigned int label_num)
-{
- if (label_num > num_labels) {
- sys_error (ERR_WARNING, "label_num %d > num_labels %d [labelSeek]");
- return (false);
- }
-
- if (array.getArray() == NULL) { // Could not have written data if array not allocated
- sys_error (ERR_WARNING, "array == NULL [labelSeek]");
- return (false);
- }
-
- off_t pos = headersize + array.sizeofArray();
- if (lseek (file_id, pos, SEEK_SET) != pos) {
- sys_error (ERR_WARNING, "Can't seek to end of data array");
- return (false);
- }
-
- for (int i = 0; i < label_num; i++)
- {
- pos += 22; // Skip to string length
- if (lseek (file_id, pos, SEEK_SET) != pos) {
- sys_error (ERR_WARNING, "Can't seek to string length");
- return (false);
- }
- kuint16 strlength;
- read_nint16 (&strlength, file_id);
- pos += 2 + strlength; // Skip label string length + data
- if (lseek (file_id, pos, SEEK_SET) != pos) {
- sys_error (ERR_WARNING, "Can't seek past label string");
- return (false);
- }
- }
-
- return (true);
-}
-
-template<class T>
-bool
-Array2dFile<T>::labelRead (Array2dFileLabel& label, unsigned int label_num)
-{
- if (label_num >= num_labels) {
- sys_error (ERR_WARNING, "Trying to read past number of labels [labelRead]");
- return (false);
- }
-
- if (! labelSeek (label_num)) {
- sys_error (ERR_WARNING, "Error calling labelSeek");
- return (false);
- }
-
- read_nint16 (&label.label_type, file_id);
- read_nint16 (&label.year, file_id);
- read_nint16 (&label.month, file_id);
- read_nint16 (&label.day, file_id);
- read_nint16 (&label.hour, file_id);
- read_nint16 (&label.minute, file_id);
- read_nint16 (&label.second, file_id);
- read_nfloat64 (&label.calc_time, file_id);
-
- kuint16 strlength;
- read_nint16 (&strlength, file_id);
- char *str = new char [strlength+1];
- read (file_id, str, strlength);
- label.label_str = str;
-
- return (true);
-}
-
-
-template<class T>
-void
-Array2dFile<T>::labelAdd (const char* const lstr, double calc_time=0.)
-{
- labelAdd (Array2dFileLabel::L_HISTORY, lstr, calc_time);
-}
-
-template<class T>
-void
-Array2dFile<T>::labelAdd (int type, const char* const lstr, double calc_time=0.)
-{
- Array2dFileLabel label (type, lstr, calc_time);
-
- labelAdd (label);
-}
-
-template<class T>
-void
-Array2dFile<T>::labelAdd (const Array2dFileLabel& label)
-{
- labelSeek (num_labels);
-
- write_nint16 (&label.label_type, file_id);
- write_nint16 (&label.year, file_id);
- write_nint16 (&label.month, file_id);
- write_nint16 (&label.day, file_id);
- write_nint16 (&label.hour, file_id);
- write_nint16 (&label.minute, file_id);
- write_nint16 (&label.second, file_id);
- write_nfloat64 (&label.calc_time, file_id);
- kuint16 strlength = label.label_str.length();
- write_nint16 (&strlength, file_id);
- write (file_id, static_cast<const void*>(label.label_str.c_str()), strlength);
-
- num_labels++;
-
- headerWrite();
- fsync(file_id);
-}
-
-template<class T>
-void
-Array2dFile<T>::labelsCopy (Array2dFile& copyFile, const char* const idStr)
-{
- string id = idStr;
- for (int i = 0; i < copyFile.getNumLabels(); i++) {
- Array2dFileLabel l;
- copyFile.labelRead (l, i);
- string lstr = l.getLabelString();
- lstr = idStr + lstr;
- l.setLabelString (lstr);
- labelAdd (l);
- }
-}
-
-template<class T>
-void
-Array2dFile<T>::arrayDataClear (void)
-{
- T** v = array.getArray();
- if (v) {
- for (unsigned int ix = 0; ix < mNX; ix++)
- for (unsigned int iy = 0; iy < mNY; iy++)
- v[ix][iy] = 0;
- }
-}