diff --git a/navcat.cc b/navcat.cc index 1bca914..06c0d01 100644 --- a/navcat.cc +++ b/navcat.cc @@ -98,14 +98,14 @@ static size_t writen2(int fd, const void *buf, size_t count) void sendProtobuf(string_view dir, time_t startTime, time_t stopTime=0) { - pair start = {startTime, 0}; + pair start(startTime, 0); // so we have a ton of files, and internally these are not ordered map fpos; - vector nmms; + vector > rnmms; for(;;) { auto srcs = getSources(dir); - nmms.clear(); + rnmms.clear(); for(const auto& src: srcs) { string fname = getPath(dir, start.first, src); FILE* fp = fopen(fname.c_str(), "r"); @@ -118,36 +118,35 @@ void sendProtobuf(string_view dir, time_t startTime, time_t stopTime=0) continue; } cerr <<"Seeked to position "<= start) { - nmms.push_back(nmm); + if(make_pair(ts.tv_sec + 5, ts.tv_nsec) >= start) { + rnmms.push_back({ts, msg}); } ++looked; } - cerr<<"Harvested "< stopTime) + for(const auto& nmm: rnmms) { + if(nmm.first.tv_sec > stopTime) break; - std::string out; - nmm.SerializeToString(&out); std::string buf="bert"; - uint16_t len = htons(out.size()); + uint16_t len = htons(nmm.second.size()); buf.append((char*)(&len), 2); - buf+=out; + buf += nmm.second; //fwrite(buf.c_str(), 1, buf.size(), stdout); writen2(1, buf.c_str(), buf.size()); } diff --git a/storage.cc b/storage.cc index 4e09333..2e2fec2 100644 --- a/storage.cc +++ b/storage.cc @@ -78,3 +78,27 @@ bool getNMM(FILE* fp, NavMonMessage& nmm, uint32_t& offset) offset += 4 + 2 + len; return true; } + + +bool getRawNMM(FILE* fp, timespec& t, string& raw, uint32_t& offset) +{ + char bert[4]; + if(fread(bert, 1, 4, fp) != 4 || bert[0]!='b' || bert[1]!='e' || bert[2] !='r' || bert[3]!='t') { + return false; + } + + uint16_t len; + if(fread(&len, 1, 2, fp) != 2) + return false; + len = htons(len); + char buffer[len]; + if(fread(buffer, 1, len, fp) != len) + return false; + NavMonMessage nmm; + raw.assign(buffer, len); + nmm.ParseFromString(raw); + t.tv_sec = nmm.localutcseconds(); + t.tv_nsec = nmm.localutcnanoseconds(); + offset += 4 + 2 + len; + return true; +} diff --git a/storage.hh b/storage.hh index 680cec4..88bca9d 100644 --- a/storage.hh +++ b/storage.hh @@ -8,3 +8,4 @@ std::vector getPathComponents(std::string_view root, time_t s, uint std::string getPath(std::string_view root, time_t s, uint64_t sourceid, bool create=false); bool getNMM(int fd, NavMonMessage& nmm, uint32_t& offset); bool getNMM(FILE* fp, NavMonMessage& nmm, uint32_t& offset); +bool getRawNMM(FILE* fp, timespec& t, std::string& raw, uint32_t& offset);