BamInterface.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "BamInterface.h"
00019 #include "CharBuffer.h"
00020
00021 BamInterface::BamInterface()
00022 {
00023 }
00024
00025
00026 BamInterface::~BamInterface()
00027 {
00028 }
00029
00030
00031
00032 SamStatus::Status BamInterface::readHeader(IFILE filePtr, SamFileHeader& header)
00033 {
00034 if(filePtr == NULL)
00035 {
00036
00037 return(SamStatus::FAIL_ORDER);
00038 }
00039
00040
00041 header.resetHeader();
00042
00043 SamStatus::Status status = header.setHeaderFromBamFile(filePtr);
00044 if(status != SamStatus::SUCCESS)
00045 {
00046 return(status);
00047 }
00048
00049 int referenceCount;
00050
00051 ifread(filePtr, &referenceCount, sizeof(int));
00052
00053
00054
00055 CharBuffer refName;
00056
00057
00058 for (int i = 0; i < referenceCount; i++)
00059 {
00060 int nameLength;
00061
00062 ifread(filePtr, &nameLength, sizeof(int));
00063
00064
00065 refName.readFromFile(filePtr, nameLength);
00066
00067
00068 int32_t refLen;
00069 ifread(filePtr, &refLen, sizeof(int));
00070
00071 header.addReferenceInfo(refName.c_str(), refLen);
00072 }
00073
00074
00075 return(SamStatus::SUCCESS);
00076 }
00077
00078
00079 SamStatus::Status BamInterface::writeHeader(IFILE filePtr,
00080 SamFileHeader& header)
00081 {
00082 if((filePtr == NULL) || (filePtr->isOpen() == false))
00083 {
00084
00085 return(SamStatus::FAIL_ORDER);
00086 }
00087
00088 char magic[4];
00089 magic[0] = 'B';
00090 magic[1] = 'A';
00091 magic[2] = 'M';
00092 magic[3] = 1;
00093
00094
00095 ifwrite(filePtr, magic, 4);
00096
00097
00098
00099
00100
00101 std::string headerString = "";
00102 header.getHeaderString(headerString);
00103
00104 int32_t headerLen = headerString.length();
00105 int numWrite = 0;
00106
00107
00108 numWrite = ifwrite(filePtr, &headerLen, sizeof(int32_t));
00109 if(numWrite != sizeof(int32_t))
00110 {
00111 return(SamStatus::FAIL_IO);
00112 }
00113
00114
00115 numWrite = ifwrite(filePtr, headerString.c_str(), headerLen);
00116 if(numWrite != headerLen)
00117 {
00118 return(SamStatus::FAIL_IO);
00119 }
00120
00121
00122
00123 const SamReferenceInfo* refInfo = header.getReferenceInfo();
00124 if(refInfo == NULL)
00125 {
00126
00127 return(SamStatus::INVALID);
00128 }
00129
00130
00131 int32_t numSeq = refInfo->getNumEntries();
00132
00133
00134
00135 if(numSeq == 0)
00136 {
00137 header.generateReferenceInfo();
00138 numSeq = refInfo->getNumEntries();
00139 }
00140 ifwrite(filePtr, &numSeq, sizeof(int32_t));
00141
00142
00143 for (int i = 0; i < numSeq; i++)
00144 {
00145 const char* refName = refInfo->getReferenceName(i);
00146
00147 int32_t nameLength = strlen(refName) + 1;
00148
00149 ifwrite(filePtr, &nameLength, sizeof(int32_t));
00150
00151
00152 ifwrite(filePtr, refName, nameLength);
00153
00154 int32_t refLen = refInfo->getReferenceLength(i);
00155 ifwrite(filePtr, &refLen, sizeof(int32_t));
00156 }
00157
00158 return(SamStatus::SUCCESS);
00159 }
00160
00161
00162 void BamInterface::readRecord(IFILE filePtr, SamFileHeader& header,
00163 SamRecord& record,
00164 SamStatus& samStatus)
00165 {
00166
00167
00168
00169 record.resetRecord();
00170
00171 if(record.setBufferFromFile(filePtr, header) != SamStatus::SUCCESS)
00172 {
00173
00174 samStatus.addError(record.getStatus());
00175 }
00176 }
00177
00178 SamStatus::Status BamInterface::writeRecord(IFILE filePtr,
00179 SamFileHeader& header,
00180 SamRecord& record)
00181 {
00182
00183 return(record.writeRecordBuffer(filePtr));
00184 }
00185
00186