// save OpenGL info to file long SettingsDialog::onCmdSave(FXObject*, FXSelector, void*) { FXString filename = FXFileDialog::getSaveFilename(this, tr("Save Information"), FXSystem::getHomeDirectory()+PATHSEPSTRING+"opengl.txt", tr("Text Files (*.txt)\nAll Files(*.*)")); if (!filename.empty()) { if (FXStat::exists(filename)) { if (FXMessageBox::question(this, MBOX_YES_NO, tr("Overwrite File?"), tr("File %s already exists.\nWould you like to overwrite this file?"), filename.text()) != MBOX_CLICKED_YES) return 1; } if (!saveInformation(filename)) { FXMessageBox::error(this, MBOX_OK, tr("Write Error"), tr("An error occured trying to write file.")); } } return 1; }
unsigned long readExplicitFile( ifstream& input, unsigned long offset , bool bigEndian , unsigned short target , DicomFileImage& fileInfo ) { unsigned long currentOffset; unsigned long size; unsigned short group; unsigned short element; char type[3]; unsigned short lengthShort; char* value; bool found; try { currentOffset = offset; found = false; type[2] = '\0'; value = NULL; input.seekg(0,ifstream::end); size = input.tellg(); input.seekg(offset,ifstream::beg); while( !input.eof() && ( currentOffset = input.tellg() ) < size ) { input.read((char*)&group,2); // read group code input.read((char*)&element,2); // read element code input.read(type,2); // read value representation input.read((char*)&lengthShort,2); // for "OB","OW",“OF”,“SQ”,“UT”,"UN" unused , else read Value Length // if the transfer syntax is Big Endian perform a byte swap if ( bigEndian ) { group = _byteswap_ushort(group); element = _byteswap_ushort(element); lengthShort = _byteswap_ulong(lengthShort); } if ( group == target && !found ) found = true; else if ( group != target && found ) break; // if the value representation is one of the following if ( strcmp(type,"OB") == 0 || strcmp(type,"OW") == 0 || strcmp(type,"OF") == 0 || strcmp(type,"SQ") == 0 || strcmp(type,"UN") == 0 || strcmp(type,"UT") == 0 ) { int valueSize; // read unlimited text value = readUnlimitedText(input,type,false,bigEndian,&valueSize); saveInformation(group,element,valueSize,value,fileInfo); delete[] value; value = NULL; } else { if ( lengthShort > 0 ) { // read data equal to the defined length value = new char[lengthShort]; input.read(value,lengthShort); saveInformation(group,element,sizeof(unsigned short),value,fileInfo); delete[] value; value = NULL; } } } } catch( exception& e ) { if ( value != NULL ) delete[] value; throw e; } return currentOffset; };
unsigned long readImplicitFile( ifstream& input , unsigned long offset , bool bigEndian , unsigned short target , DicomFileImage& fileInfo ) { unsigned long currentOffset; unsigned long size; unsigned short group; unsigned short element; unsigned int lengthInt; char* value; bool found; try { currentOffset = offset; found = false; value = NULL; input.seekg(0,ifstream::end); size = input.tellg(); input.seekg(offset,ifstream::beg); while( !input.eof() && ( currentOffset = input.tellg() ) < size ) { input.read((char*)&group,2); // read group code input.read((char*)&element,2); // read element code input.read((char*)&lengthInt,4); // read value length // if the transfer syntax is Big Endian perform a byte swap if ( bigEndian ) { group = _byteswap_ushort(group); element = _byteswap_ushort(element); lengthInt = _byteswap_ulong(lengthInt); } // termination condition update if ( group == target && !found ) found = true; else if ( group != target && found ) break; // if the length is undefined if ( lengthInt == 0xFFFFFFFF ) { int valueSize; // read unlimited text value = readUnlimitedText(input,"",true,bigEndian,&valueSize); // update DicomFileImage information saveInformation(group,element,valueSize,value,fileInfo); delete[] value; value = NULL; } else // if the length is defined { if ( lengthInt > 0 ) { // read data of size equal to the defined length value = new char[lengthInt]; input.read(value,lengthInt); saveInformation(group,element,sizeof(unsigned short),value,fileInfo); delete[] value; value = NULL; } } } } catch ( exception &e ) { if ( value != NULL ) delete[] value; throw e; } return currentOffset; };