137854ecaSFrank Warmerdam // tiff stream interface class implementation
237854ecaSFrank Warmerdam
337854ecaSFrank Warmerdam #include "tiffstream.h"
437854ecaSFrank Warmerdam
537854ecaSFrank Warmerdam const char* TiffStream::m_name = "TiffStream";
637854ecaSFrank Warmerdam
TiffStream()737854ecaSFrank Warmerdam TiffStream::TiffStream()
837854ecaSFrank Warmerdam {
937854ecaSFrank Warmerdam m_tif = NULL;
1037854ecaSFrank Warmerdam
1137854ecaSFrank Warmerdam
1237854ecaSFrank Warmerdam m_inStream = NULL;
1337854ecaSFrank Warmerdam m_outStream = NULL;
1437854ecaSFrank Warmerdam m_ioStream = NULL;
1537854ecaSFrank Warmerdam
1637854ecaSFrank Warmerdam m_streamLength = 0;
1737854ecaSFrank Warmerdam
1837854ecaSFrank Warmerdam m_this = reinterpret_cast<thandle_t>(this);
1937854ecaSFrank Warmerdam };
2037854ecaSFrank Warmerdam
~TiffStream()2137854ecaSFrank Warmerdam TiffStream::~TiffStream()
2237854ecaSFrank Warmerdam {
2337854ecaSFrank Warmerdam if(m_tif != NULL) TIFFClose(m_tif);
2437854ecaSFrank Warmerdam }
2537854ecaSFrank Warmerdam
2637854ecaSFrank Warmerdam TIFF*
makeFileStream(istream * str)2737854ecaSFrank Warmerdam TiffStream::makeFileStream(istream* str)
2837854ecaSFrank Warmerdam {
2937854ecaSFrank Warmerdam m_inStream = str;
3037854ecaSFrank Warmerdam m_outStream = NULL;
3137854ecaSFrank Warmerdam m_ioStream = NULL;
3237854ecaSFrank Warmerdam m_streamLength = getSize(m_this);
3337854ecaSFrank Warmerdam
3437854ecaSFrank Warmerdam m_tif = TIFFClientOpen(m_name,
3537854ecaSFrank Warmerdam "r",
3637854ecaSFrank Warmerdam m_this,
3737854ecaSFrank Warmerdam read,
3837854ecaSFrank Warmerdam write,
3937854ecaSFrank Warmerdam seek,
4037854ecaSFrank Warmerdam close,
4137854ecaSFrank Warmerdam size,
4237854ecaSFrank Warmerdam map,
4337854ecaSFrank Warmerdam unmap);
4437854ecaSFrank Warmerdam return m_tif;
4537854ecaSFrank Warmerdam }
4637854ecaSFrank Warmerdam
4737854ecaSFrank Warmerdam TIFF*
makeFileStream(ostream * str)4837854ecaSFrank Warmerdam TiffStream::makeFileStream(ostream* str)
4937854ecaSFrank Warmerdam {
5037854ecaSFrank Warmerdam m_inStream = NULL;
5137854ecaSFrank Warmerdam m_outStream = str;
5237854ecaSFrank Warmerdam m_ioStream = NULL;
5337854ecaSFrank Warmerdam m_streamLength = getSize(m_this);
5437854ecaSFrank Warmerdam
5537854ecaSFrank Warmerdam m_tif = TIFFClientOpen(m_name,
5637854ecaSFrank Warmerdam "w",
5737854ecaSFrank Warmerdam m_this,
5837854ecaSFrank Warmerdam read,
5937854ecaSFrank Warmerdam write,
6037854ecaSFrank Warmerdam seek,
6137854ecaSFrank Warmerdam close,
6237854ecaSFrank Warmerdam size,
6337854ecaSFrank Warmerdam map,
6437854ecaSFrank Warmerdam unmap);
6537854ecaSFrank Warmerdam return m_tif;
6637854ecaSFrank Warmerdam }
6737854ecaSFrank Warmerdam
6837854ecaSFrank Warmerdam TIFF*
makeFileStream(iostream * str)6937854ecaSFrank Warmerdam TiffStream::makeFileStream(iostream* str)
7037854ecaSFrank Warmerdam {
7137854ecaSFrank Warmerdam m_inStream = NULL;
7237854ecaSFrank Warmerdam m_outStream = NULL;
7337854ecaSFrank Warmerdam m_ioStream = str;
7437854ecaSFrank Warmerdam m_streamLength = getSize(m_this);
7537854ecaSFrank Warmerdam
7637854ecaSFrank Warmerdam m_tif = TIFFClientOpen(m_name,
7737854ecaSFrank Warmerdam "r+w",
7837854ecaSFrank Warmerdam m_this,
7937854ecaSFrank Warmerdam read,
8037854ecaSFrank Warmerdam write,
8137854ecaSFrank Warmerdam seek,
8237854ecaSFrank Warmerdam close,
8337854ecaSFrank Warmerdam size,
8437854ecaSFrank Warmerdam map,
8537854ecaSFrank Warmerdam unmap);
8637854ecaSFrank Warmerdam return m_tif;
8737854ecaSFrank Warmerdam }
8837854ecaSFrank Warmerdam
8937854ecaSFrank Warmerdam tsize_t
read(thandle_t fd,tdata_t buf,tsize_t size)9037854ecaSFrank Warmerdam TiffStream::read(thandle_t fd, tdata_t buf, tsize_t size)
9137854ecaSFrank Warmerdam {
9237854ecaSFrank Warmerdam istream* istr;
9337854ecaSFrank Warmerdam TiffStream* ts = reinterpret_cast<TiffStream*>(fd);
9437854ecaSFrank Warmerdam if(ts->m_inStream != NULL) {
9537854ecaSFrank Warmerdam istr = ts->m_inStream;
9637854ecaSFrank Warmerdam } else if(ts->m_ioStream != NULL) {
9737854ecaSFrank Warmerdam istr = ts->m_ioStream;
9837854ecaSFrank Warmerdam }
9937854ecaSFrank Warmerdam
10037854ecaSFrank Warmerdam int remain = ts->m_streamLength - ts->tell(fd);
10137854ecaSFrank Warmerdam int actual = remain < size ? remain : size;
10237854ecaSFrank Warmerdam istr->read(reinterpret_cast<char*>(buf), actual);
10337854ecaSFrank Warmerdam return istr->gcount();
10437854ecaSFrank Warmerdam }
10537854ecaSFrank Warmerdam
10637854ecaSFrank Warmerdam tsize_t
write(thandle_t fd,tdata_t buf,tsize_t size)10737854ecaSFrank Warmerdam TiffStream::write(thandle_t fd, tdata_t buf, tsize_t size)
10837854ecaSFrank Warmerdam {
10937854ecaSFrank Warmerdam TiffStream* ts = reinterpret_cast<TiffStream*>(fd);
11037854ecaSFrank Warmerdam ostream* ostr;
11137854ecaSFrank Warmerdam if(ts->m_outStream != NULL) {
11237854ecaSFrank Warmerdam ostr = ts->m_outStream;
11337854ecaSFrank Warmerdam } else if(ts->m_ioStream != NULL) {
11437854ecaSFrank Warmerdam ostr = ts->m_ioStream;
11537854ecaSFrank Warmerdam }
11637854ecaSFrank Warmerdam
11737854ecaSFrank Warmerdam streampos start = ostr->tellp();
11837854ecaSFrank Warmerdam ostr->write(reinterpret_cast<const char*>(buf), size);
11937854ecaSFrank Warmerdam return ostr->tellp() - start;
12037854ecaSFrank Warmerdam }
12137854ecaSFrank Warmerdam
12237854ecaSFrank Warmerdam toff_t
seek(thandle_t fd,toff_t offset,int origin)12337854ecaSFrank Warmerdam TiffStream::seek(thandle_t fd, toff_t offset, int origin)
12437854ecaSFrank Warmerdam {
12537854ecaSFrank Warmerdam TiffStream* ts = reinterpret_cast<TiffStream*>(fd);
12637854ecaSFrank Warmerdam if(ts->seekInt(fd, offset, origin) == true) return offset;
12737854ecaSFrank Warmerdam else return -1;
12837854ecaSFrank Warmerdam }
12937854ecaSFrank Warmerdam
13037854ecaSFrank Warmerdam int
close(thandle_t fd)13137854ecaSFrank Warmerdam TiffStream::close(thandle_t fd)
13237854ecaSFrank Warmerdam {
13337854ecaSFrank Warmerdam TiffStream* ts = reinterpret_cast<TiffStream*>(fd);
13437854ecaSFrank Warmerdam if(ts->m_inStream != NULL) {
13537854ecaSFrank Warmerdam ts->m_inStream = NULL;
13637854ecaSFrank Warmerdam return 0;
13737854ecaSFrank Warmerdam } else if(ts->m_outStream != NULL) {
13837854ecaSFrank Warmerdam ts->m_outStream = NULL;
13937854ecaSFrank Warmerdam return 0;
14037854ecaSFrank Warmerdam } else if(ts->m_ioStream != NULL) {
14137854ecaSFrank Warmerdam ts->m_ioStream = NULL;
14237854ecaSFrank Warmerdam return 0;
14337854ecaSFrank Warmerdam }
14437854ecaSFrank Warmerdam return -1;
14537854ecaSFrank Warmerdam }
14637854ecaSFrank Warmerdam
14737854ecaSFrank Warmerdam toff_t
size(thandle_t fd)14837854ecaSFrank Warmerdam TiffStream::size(thandle_t fd)
14937854ecaSFrank Warmerdam {
15037854ecaSFrank Warmerdam TiffStream* ts = reinterpret_cast<TiffStream*>(fd);
15137854ecaSFrank Warmerdam return ts->getSize(fd);
15237854ecaSFrank Warmerdam }
15337854ecaSFrank Warmerdam
15437854ecaSFrank Warmerdam int
map(thandle_t fd,tdata_t * phase,toff_t * psize)15537854ecaSFrank Warmerdam TiffStream::map(thandle_t fd, tdata_t* phase, toff_t* psize)
15637854ecaSFrank Warmerdam {
15737854ecaSFrank Warmerdam return 0;
15837854ecaSFrank Warmerdam }
15937854ecaSFrank Warmerdam
16037854ecaSFrank Warmerdam void
unmap(thandle_t fd,tdata_t base,tsize_t size)16137854ecaSFrank Warmerdam TiffStream::unmap(thandle_t fd, tdata_t base, tsize_t size)
16237854ecaSFrank Warmerdam {
16337854ecaSFrank Warmerdam }
16437854ecaSFrank Warmerdam
16537854ecaSFrank Warmerdam unsigned int
getSize(thandle_t fd)16637854ecaSFrank Warmerdam TiffStream::getSize(thandle_t fd)
16737854ecaSFrank Warmerdam {
16837854ecaSFrank Warmerdam if(!isOpen(fd)) return 0;
16937854ecaSFrank Warmerdam
17037854ecaSFrank Warmerdam unsigned int pos = tell(fd);
17137854ecaSFrank Warmerdam seekInt(fd, 0, end);
17237854ecaSFrank Warmerdam unsigned int size = tell(fd);
17337854ecaSFrank Warmerdam seekInt(fd, pos, beg);
17437854ecaSFrank Warmerdam
17537854ecaSFrank Warmerdam return size;
17637854ecaSFrank Warmerdam }
17737854ecaSFrank Warmerdam
17837854ecaSFrank Warmerdam unsigned int
tell(thandle_t fd)17937854ecaSFrank Warmerdam TiffStream::tell(thandle_t fd)
18037854ecaSFrank Warmerdam {
18137854ecaSFrank Warmerdam TiffStream* ts = reinterpret_cast<TiffStream*>(fd);
18237854ecaSFrank Warmerdam if(ts->m_inStream != NULL) {
18337854ecaSFrank Warmerdam return ts->m_inStream->tellg();
18437854ecaSFrank Warmerdam } else if(ts->m_outStream != NULL) {
18537854ecaSFrank Warmerdam return ts->m_outStream->tellp();
18637854ecaSFrank Warmerdam } else if(ts->m_ioStream != NULL) {
18737854ecaSFrank Warmerdam return ts->m_ioStream->tellg();
18837854ecaSFrank Warmerdam }
18937854ecaSFrank Warmerdam return 0;
19037854ecaSFrank Warmerdam }
19137854ecaSFrank Warmerdam
19237854ecaSFrank Warmerdam bool
seekInt(thandle_t fd,unsigned int offset,int origin)19337854ecaSFrank Warmerdam TiffStream::seekInt(thandle_t fd, unsigned int offset, int origin)
19437854ecaSFrank Warmerdam {
19537854ecaSFrank Warmerdam if(!isOpen(fd)) return false;
19637854ecaSFrank Warmerdam
19737854ecaSFrank Warmerdam ios::seek_dir org;
19837854ecaSFrank Warmerdam switch(origin) {
19937854ecaSFrank Warmerdam case beg:
20037854ecaSFrank Warmerdam org = ios::beg;
20137854ecaSFrank Warmerdam break;
20237854ecaSFrank Warmerdam case cur:
20337854ecaSFrank Warmerdam org = ios::cur;
20437854ecaSFrank Warmerdam break;
20537854ecaSFrank Warmerdam case end:
20637854ecaSFrank Warmerdam org = ios::end;
20737854ecaSFrank Warmerdam break;
20837854ecaSFrank Warmerdam }
20937854ecaSFrank Warmerdam
21037854ecaSFrank Warmerdam TiffStream* ts = reinterpret_cast<TiffStream*>(fd);
21137854ecaSFrank Warmerdam if(ts->m_inStream != NULL) {
21237854ecaSFrank Warmerdam ts->m_inStream->seekg(offset, org);
21337854ecaSFrank Warmerdam return true;
21437854ecaSFrank Warmerdam } else if(ts->m_outStream != NULL) {
21537854ecaSFrank Warmerdam ts->m_outStream->seekp(offset, org);
21637854ecaSFrank Warmerdam return true;
21737854ecaSFrank Warmerdam } else if(ts->m_ioStream != NULL) {
21837854ecaSFrank Warmerdam ts->m_ioStream->seekg(offset, org);
21937854ecaSFrank Warmerdam ts->m_ioStream->seekp(offset, org);
22037854ecaSFrank Warmerdam return true;
22137854ecaSFrank Warmerdam }
22237854ecaSFrank Warmerdam return false;
22337854ecaSFrank Warmerdam }
22437854ecaSFrank Warmerdam
22537854ecaSFrank Warmerdam bool
isOpen(thandle_t fd)22637854ecaSFrank Warmerdam TiffStream::isOpen(thandle_t fd)
22737854ecaSFrank Warmerdam {
22837854ecaSFrank Warmerdam TiffStream* ts = reinterpret_cast<TiffStream*>(fd);
22937854ecaSFrank Warmerdam return (ts->m_inStream != NULL ||
23037854ecaSFrank Warmerdam ts->m_outStream != NULL ||
23137854ecaSFrank Warmerdam ts->m_ioStream != NULL);
232*bfbc7176SBob Friesenhahn }/*
233*bfbc7176SBob Friesenhahn * Local Variables:
234*bfbc7176SBob Friesenhahn * mode: c++
235*bfbc7176SBob Friesenhahn * c-basic-offset: 8
236*bfbc7176SBob Friesenhahn * fill-column: 78
237*bfbc7176SBob Friesenhahn * End:
238*bfbc7176SBob Friesenhahn */
239