]> git.donarmstrong.com Git - bamtools.git/blob - src/api/internal/io/BamPipe_p.cpp
d70018955fe45e66c4894874af7a22e1105f563e
[bamtools.git] / src / api / internal / io / BamPipe_p.cpp
1 // ***************************************************************************
2 // BamPipe_p.cpp (c) 2011 Derek Barnett
3 // Marth Lab, Department of Biology, Boston College
4 // ---------------------------------------------------------------------------
5 // Last modified: 25 October 2011 (DB)
6 // ---------------------------------------------------------------------------
7 // Provides BAM pipe-specific IO behavior
8 // ***************************************************************************
9
10 #include "api/internal/io/BamPipe_p.h"
11 using namespace BamTools;
12 using namespace BamTools::Internal;
13
14 #include <cstdio>
15 #include <iostream>
16 using namespace std;
17
18 BamPipe::BamPipe(void) : ILocalIODevice() { }
19
20 BamPipe::~BamPipe(void) { }
21
22 bool BamPipe::IsRandomAccess(void) const {
23     return false;
24 }
25
26 bool BamPipe::Open(const IBamIODevice::OpenMode mode) {
27
28     // make sure we're starting with a fresh pipe
29     Close();
30
31     // open stdin/stdout depending on requested openmode
32     if ( mode == IBamIODevice::ReadOnly )
33         m_stream = freopen(0, "rb", stdin);
34     else if ( mode == IBamIODevice::WriteOnly )
35         m_stream = freopen(0, "wb", stdout);
36     else {
37         const string errorType = string( mode == IBamIODevice::ReadWrite ? "unsupported"
38                                                                          : "unknown" );
39         const string message = errorType + " open mode requested";
40         SetErrorString("BamPipe::Open", message);
41         return false;
42     }
43
44     // check that we obtained a valid FILE*
45     if ( m_stream == 0 ) {
46         const string message_base = string("could not open handle on ");
47         const string message = message_base + ( (mode == IBamIODevice::ReadOnly) ? "stdin"
48                                                                                  : "stdout" );
49         SetErrorString("BamPipe::Open", message);
50         return false;
51     }
52
53     // store current IO mode & return success
54     m_mode = mode;
55     return true;
56 }
57
58 bool BamPipe::Seek(const int64_t&, const int) {
59     SetErrorString("BamPipe::Seek", "random access not allowed in FIFO pipe");
60     return false;
61 }