Mercurial > hg > piper-cpp
comparison vamp-client/CapnpRRClient.h @ 146:c4f841ccb208
Allow the completeness checker to report failure (invalid message) as well as incompleteness
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Thu, 19 Jan 2017 09:57:58 +0000 |
parents | 228a66adfb30 |
children | 96488e9e9096 |
comparison
equal
deleted
inserted
replaced
145:228a66adfb30 | 146:c4f841ccb208 |
---|---|
73 // unsigned to avoid undefined behaviour on possible wrap | 73 // unsigned to avoid undefined behaviour on possible wrap |
74 typedef uint32_t ReqId; | 74 typedef uint32_t ReqId; |
75 | 75 |
76 class CompletenessChecker : public MessageCompletenessChecker { | 76 class CompletenessChecker : public MessageCompletenessChecker { |
77 public: | 77 public: |
78 bool isComplete(const std::vector<char> &message) const override { | 78 State check(const std::vector<char> &message) const override { |
79 | |
79 auto karr = toKJArray(message); | 80 auto karr = toKJArray(message); |
80 size_t words = karr.size(); | 81 size_t words = karr.size(); |
81 size_t expected = capnp::expectedSizeInWordsFromPrefix(karr); | 82 size_t expected = capnp::expectedSizeInWordsFromPrefix(karr); |
83 | |
84 // Lacking a way to definitively check whether a message | |
85 // is valid or not, we would still like to trap obvious | |
86 // cases where a programming mistake results in garbage | |
87 // being returned from the server. We impose a limit on | |
88 // message size and, if a prefix is projected to exceed | |
89 // that limit, call it invalid. If an extractor wants to | |
90 // return a feature set greater than a gigaword in size, | |
91 // it'll just have to do it across multiple process calls. | |
92 size_t limit = size_t(1) << 30; | |
93 | |
82 // cerr << "CompletenessChecker: message.size() = " << message.size() | 94 // cerr << "CompletenessChecker: message.size() = " << message.size() |
83 // << ", words = " << words << ", expected = " << expected << endl; | 95 // << ", words = " << words << ", limit = " << limit << ", expected = " << expected << endl; |
96 | |
84 if (words > expected) { | 97 if (words > expected) { |
85 std::cerr << "WARNING: obtained more data than expected (" | 98 std::cerr << "WARNING: obtained more data than expected (" |
86 << words << " " << sizeof(capnp::word) | 99 << words << " " << sizeof(capnp::word) |
87 << "-byte words, expected " | 100 << "-byte words, expected " |
88 << expected << ")" << std::endl; | 101 << expected << ")" << std::endl; |
102 return Complete; | |
103 } else if (words == expected) { | |
104 return Complete; | |
105 } else if (expected > limit) { | |
106 return Invalid; | |
107 } else { | |
108 return Incomplete; | |
89 } | 109 } |
90 return words >= expected; | |
91 } | 110 } |
92 }; | 111 }; |
93 | 112 |
94 public: | 113 public: |
95 CapnpRRClient(SynchronousTransport *transport, //!!! ownership? shared ptr? | 114 CapnpRRClient(SynchronousTransport *transport, //!!! ownership? shared ptr? |