3 This file is part of DIG Library.
4 DIG Library is a free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published
6 by the Free Software Foundation; either version 2 of the License,
7 or (at your option) any later version.
8 DIG Library is distributed in the hope that it will be useful, but
9 WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 General Public License for more details.
12 You should have received a copy of the GNU General Public License
13 along with Foobar; if not, write to the Free Software Foundation,
14 Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 // DIGFile.h,v 1.4 2007/06/07 20:48:35 jklukowska Exp
21 //defines added to enable large file support
22 //jklukowska, 06/07/2007
23 #ifndef _LARGEFILE_SOURCE
24 #define _LARGEFILE_SOURCE /* enable large file support */
26 #ifndef _FILE_OFFSET_BITS
27 #define _FILE_OFFSET_BITS 64 /* enable large file support */
34 #include <xercesc/dom/DOM.hpp>
35 #include <xercesc/parsers/XercesDOMParser.hpp>
36 #include <xercesc/util/PlatformUtils.hpp>
39 #include <DIGFile/DIG.h>
40 //#include "DOMTreeErrorReporter.h"
41 #include <DIGFile/DOMTreeErrorReporter.h>
43 #include <xercesc/framework/MemBufInputSource.hpp>
50 #define DIGEndianSize 2
51 extern const char* DIGEndianStr[DIGEndianSize];
59 #define DIGValueTypeSize 2
60 extern const char* DIGValueTypeStr[DIGValueTypeSize];
75 #define DIGDataTypeSize 9
76 extern const char* DIGDataTypeStr[DIGDataTypeSize];
84 #define DIGDataFormatSize 2
85 extern const char* DIGDataFormatStr[DIGDataFormatSize];
100 #define DIGGridSize 9
101 extern const char* DIGGridStr[DIGGridSize];
109 #define DIGBasisSize 2
110 extern const char* DIGBasisStr[DIGBasisSize];
124 #define DIGUnitSize 8
125 extern const char* DIGUnitStr[DIGUnitSize];
128 struct DIGDimensions {
140 ///////////////////////////////////////////////////////////////////////////////
141 // DIGFile array set header
142 ///////////////////////////////////////////////////////////////////////////////
144 class DIGFileMainHeader
149 unsigned int Channels;
150 //unsigned int NoOfArrays;
151 //unsigned int NoOfSets;
153 DIGValueType ValueType;
154 DIGDataType DataType;
155 DIGDataFormat DataFormat;
160 DIGDimensions Dimensions;
161 DIGSampling SamplingX;
162 DIGSampling SamplingY;
163 DIGSampling SamplingZ;
173 //Endian = DIGEndian_LITTLE;
174 ValueType = DIGValueType_REAL;
175 DataType = DIGDataType_DOUBLE;
176 DataFormat = DIGDataFormat_ASCII;
178 Basis = DIGBasis_VORONOI;
179 Unit = DIGUnit_UNSPECIFIED;
197 unsigned int pChannels,
198 //unsigned int pArrays,
199 //unsigned int pSets,
201 DIGValueType pValueType,
202 DIGDataType pDataType,
203 DIGDataFormat pDataFormat,
211 const char* pComment,
212 const char* pOtherUnit
217 Channels = pChannels;
218 //NoOfArrays = pArrays;
221 ValueType = pValueType;
222 DataType = pDataType;
223 DataFormat = pDataFormat;
227 OtherUnit.Set(pOtherUnit);
232 Comment.Set(pComment);
236 ///////////////////////////////////////////////////////////////////////////////
237 // DIGFile array set header
238 ///////////////////////////////////////////////////////////////////////////////
240 class DIGFileArraySetHeader
246 DIGString Parameters;
249 DIGFileArraySetHeader() {};
250 DIGFileArraySetHeader(const char* pType, const char* pTitle, const char* pParameters, const char* pComments = NULL)
254 Parameters.Set(pParameters);
255 Comment.Set(pComments);
259 ///////////////////////////////////////////////////////////////////////////////
260 // DIGFile array header
261 ///////////////////////////////////////////////////////////////////////////////
263 class DIGFileArrayHeader {
269 DIGFileArrayHeader() {};
270 DIGFileArrayHeader(unsigned int pEnumNo, const char* pComment) {
272 Comment.Set(pComment);
282 ListElement* NextListElement;
284 inline ListElement(void* It)
287 NextListElement = NULL;
305 inline unsigned int getLength() {
309 inline void Append(ListElement* LElement) {
310 ListElement** ListElementPtr = &Head;
311 while((*ListElementPtr) != NULL) {
312 ListElementPtr = &((*ListElementPtr)->NextListElement);
314 *ListElementPtr = LElement;
318 inline int getListElement(ListElement** ListElementPtr, unsigned int index) {
320 *ListElementPtr = Head;
321 if((*ListElementPtr) == NULL) {
322 return -1; // error empty list
325 for(unsigned int i = 0; i < index; i++) {
326 *ListElementPtr = (*ListElementPtr)->NextListElement;
327 if((*ListElementPtr) == NULL) {
334 inline int removeListElement(ListElement** ListElementPtr, unsigned int index) {
336 *ListElementPtr = Head;
337 if((*ListElementPtr) == NULL) {
338 return -1; // error empty list
341 // first element of the list
342 ListElement** prevPtr = &Head;
344 for(unsigned int i = 0; i < index; i++) {
346 prevPtr = &((*ListElementPtr)->NextListElement);
347 *ListElementPtr = (*ListElementPtr)->NextListElement;
348 if((*ListElementPtr) == NULL) {
353 *prevPtr = (*ListElementPtr)->NextListElement;
354 (*ListElementPtr)->NextListElement = NULL;
360 class PointerList: private List
371 inline unsigned int getLength() {
375 inline void Append(void* Pointer) {
376 ListElement* LI = new ListElement(Pointer);
380 inline int getListElement(void** Pointer, unsigned int index) {
383 if(List::getListElement(&LI, index) != 0) {
390 inline int removeListElement(void** Pointer, unsigned int index) {
394 if(List::removeListElement(&LI, index) != 0) {
408 PointerList ArrayHeaderList; // list of array heders in the set
411 unsigned int FirstArrayOffset; // offset of first array in the set
412 DIGFileArraySetHeader* ArraySetHeader;
415 inline unsigned int getLength() {
416 return ArrayHeaderList.getLength();
419 inline void Append(DIGFileArrayHeader* ArrayHeader) {
420 ArrayHeaderList.Append(ArrayHeader);
423 inline int getArrayHeader(DIGFileArrayHeader** ArrayHeader, unsigned int index) {
424 return ArrayHeaderList.getListElement((void**) ArrayHeader, index);
427 inline int removeArrayHeader(DIGFileArrayHeader** ArrayHeader, unsigned int index) {
428 return ArrayHeaderList.removeListElement((void**) ArrayHeader, index);
431 inline int Release() {
432 DIGFileArrayHeader* ArrayHeader;
434 int Lenght = getLength();
435 for(int i = 0; i < Lenght; i++) {
436 // remove first item from the list
437 if(removeArrayHeader(&ArrayHeader, 0) != 0) {
453 inline unsigned int getLength() {
454 return ASList.getLength();
457 inline void Append(ArraySet* ASet) {
461 inline int getArraySet(ArraySet** ASet, unsigned int index) {
462 return ASList.getListElement((void**) ASet, index);
465 inline int removeArraySet(ArraySet** ASet, unsigned int index) {
466 return ASList.removeListElement((void**) ASet, index);
469 inline int Release() {
472 int Lenght = getLength();
473 for(int i = 0; i < Lenght; i++) {
474 // remove first item from the list
475 if(removeArraySet(&ASet, 0) != 0) {
489 DIGString SchemaName; // XML schema name
490 DIGFileMainHeader MainHeader; // main header
492 unsigned int NoOfSets;
493 unsigned int NoOfArrays;
494 DIGEndian Endian; // File Endian
500 bool MainHeaderWritten;
503 ArraySetList ArraySets; // array sets list
505 unsigned int NoOfArrayItems; // number of items in array
506 unsigned int ArrayBufferSize; // array buffer size
508 // Curent Array Set Variables
509 ArraySet* CurrenArraySet;
511 // Cureny Array Variables
512 DIGFileArrayHeader* CurrentArrayHeader;
513 int CurrenArrayIndex; // index of curent array
516 // XML Parsing and Writing
519 //int ArrayCounter; // arrays counter
523 XercesDOMParser* parser;
524 DOMTreeErrorReporter* errReporter;
526 DOMImplementation* impl;
528 DOMDocument* Document;
529 DOMElement* RootElement;
530 DOMElement* MainHeaderElement;
531 DOMElement* ApplicationHeaderElement;
532 DOMElement* ArraySetHeaderElement; // active array set header
533 DOMElement* ArrayHeaderElement; // active array header
535 DOMNodeList* ArraySetHeaderList;
536 DOMNodeList* ArrayHeaderList;
540 static bool XMLStringsInitialized;
543 static const XMLCh* RootXMLStr;
545 static const XMLCh* MainHeaderXMLStr;
547 static const XMLCh* TitleXMLStr;
548 static const XMLCh* TypeXMLStr;
549 static const XMLCh* ChannelsXMLStr;
550 static const XMLCh* NumberOfArraysXMLStr;
551 static const XMLCh* NumberOfArraySetsXMLStr;
552 static const XMLCh* EndianXMLStr;
553 static const XMLCh* ValueTypeXMLStr;
554 static const XMLCh* DataTypeXMLStr;
555 static const XMLCh* DataFormatXMLStr;
556 static const XMLCh* GridTypeXMLStr;
557 static const XMLCh* BasisFunctionXMLStr;
558 static const XMLCh* UnitXMLStr;
559 static const XMLCh* OtherUnitXMLStr;
560 static const XMLCh* CommentsXMLStr;
561 static const XMLCh* DimensionsXMLStr;
563 static const XMLCh* DimmensionXXMLStr;
564 static const XMLCh* DimmensionYXMLStr;
565 static const XMLCh* DimmensionZXMLStr;
567 static const XMLCh* SamplingRateXXMLStr;
568 static const XMLCh* SamplingRateYXMLStr;
569 static const XMLCh* SamplingRateZXMLStr;
571 static const XMLCh* ArraySetHeaderXMLStr;
573 //static const XMLCh* TypeXMLStr;
574 //static const XMLCh* TitleXMLStr;
575 static const XMLCh* ParametersXMLStr;
577 static const XMLCh* ArrayHeaderXMLStr;
578 static const XMLCh* EnumerationNumberXMLStr;
582 virtual ~DIGFile() { };
584 int Open(const char* FileName);
586 const char* pFileName,
590 unsigned int pChannels,
592 DIGValueType pValueType,
593 DIGDataType pDataType,
594 DIGDataFormat pDataFormat,
598 const DIGDimensions* pDimensions,
599 const DIGSampling* pSamplingX,
600 const DIGSampling* pSamplingY,
601 const DIGSampling* pSamplingZ,
602 const char* pComment,
603 const char* pOtherUnit
608 int GetArrayBufferSize(unsigned int* pArrayBufferSize);
609 int GetArrayNoOfItems(unsigned int* pArrayNoOfItems);
610 int GetNoOfArraySets(unsigned int* pNoOfArraySets);
611 int GetNoOfArrays(unsigned int* pNoOfArrays);
614 int SetComment(const char* pComment);
615 int SetTitle(const char* pTitle);
617 int GetTitle(const char** pTitle);
618 int GetType(const char** pType);
619 int GetChannels(unsigned int* pChannels);
620 int GetEndian(DIGEndian* pEndian);
621 int GetValueType(DIGValueType* pValueType);
622 int GetDataType(DIGDataType* pDataType);
623 int GetDataFormat(DIGDataFormat* pDataFormat);
624 int GetGrid(DIGGrid* pGrid);
625 int GetBasis(DIGBasis* pBasis);
626 int GetUnit(DIGUnit* pUnit);
627 int GetOtherUnit(const char** pOtherUnit);
628 int GetDimensions(const DIGDimensions** pDimensions);
629 int GetSamplingX(const DIGSampling** pSampling);
630 int GetSamplingY(const DIGSampling** pSampling);
631 int GetSamplingZ(const DIGSampling** pSampling);
632 int GetComment(const char** pComment);
635 //int AppendArraySet(DIGFileArraySetHeader* SetHeader);
639 const char* pParameters,
640 const char* pComments
643 //int AppendArray(DIGFileArrayHeader* ArrayHeader, void* Buffer);
645 unsigned int pEnumerationNumber,
646 const char* pComment,
650 //int GetArraySetHeader(DIGFileArraySetHeader** SetHeader);
651 int GetArraySetType(const char** pType);
652 int GetArraySetTitle(const char** pTitle);
653 int GetArraySetParameters(const char** pParameters);
654 int GetArraySetComment(const char** pComments);
656 //int GetArrayHeader(DIGFileArrayHeader** ArrayHeader);
657 int GetArrayEnumNo(unsigned int* pEnumNo);
658 int GetArrayComment(const char** pComment);
661 int SelectArraySet(unsigned int pNo);
662 int SelectArray(unsigned int pNo);
664 int GetArrayData(void* pArrayData);
668 unsigned int ComputeArrayNoOfItems();
669 unsigned int ComputeArrayBufferSize();
671 int SymbolToCode(char* Symbol, const char** SymbolTable, int NumberOfSymbols);
673 int WriteArrayData(FILE* f, const void* ArrayData);
675 int FindSrting(char* String, FILE* File);
676 int GetXMLHeader(char** XMLBuff);
679 int WriteXMLHeader();
680 void CreateRootElement();
681 virtual int CreateApplicationHeader();
682 int CreateMainHeader(DIGFileMainHeader* header);
683 int AppendArraySetHeader(DIGFileArraySetHeader* SetHeader);
684 int AppendArrayHeader(DIGFileArrayHeader* ArrayHeader);
688 int InitParser2(const MemBufInputSource& memBufIS);
690 int GetIntAttributeValue(DOMElement* Element, const XMLCh* AttributeName, int* value);
691 int GetUintAttributeValue(DOMElement* Element, const XMLCh* AttributeName, unsigned int* value);
692 int GetDoubleAttributeValue(DOMElement* Element, const XMLCh* AttributeName, double* value);
693 int GetTxtAttributeValue(DOMElement* Element, const XMLCh* AttributeName, char** Text);
694 int GetElementText(DOMElement* Element, char** Text);
696 int GetMainHeader(DIGFileMainHeader* MainHeader);
697 virtual int ParseApplicationHeader();
698 int GetArraySetHeader(DIGFileArraySetHeader* ArraySetHeader, unsigned int index);
699 int GetArrayHeader(DIGFileArrayHeader* ArrayHeader, unsigned int index);
701 int ParseXML(const char* MemBuf);
703 int CreateMainHeader();