Extract an interface class? Rename to BinaryReader base and make the dtor protected to avoid deleting using base-class pointer? Same for BinaryWriter.
Read the body bytes and write them in q QIODevice, or better create a Body class and write data into it. That would be better to support multipart bodies. For example when reading multipart/ranges from a file for download. Alternatively, we might use a different reader for handling multipart messages.
implement ChunkBodyReader
implement DeflateBodyReader
implement BodyReaderChain
implement UnknownBodyReader
implement ChunkBodyWriter
implement DeflateBodyWriter
implement BodyWriterChain
test assignement
test other specializations
Test willEmit()
test at least two of the body encodings
What is with const pointer to the host class and with const functions? It is now solved ugly by adding a new ctor to ExpectedFunction.
An unknown extension will have data and dataSize fields.
test abort() while inside the read notification
NodeInfo is copied a lot. Make it a class and use ref-counting.
The same as above is two hostnames get resolved to the same IP
There is lots of code duplication! Remove it, maybe using templates.
Use EMA for Daily Uptimes: An exponential moving average (EMA) is actually a specific type of weighted moving average. It uses a constant (a smoothing factor) between 0 and 1 in the following manner: the current closing price (C) multiplied by the smoothing constant (S) added to the product of the previous day's exponential moving average value (PEMA) and 1 minus the smoothing factor, or: Today's EMA = S*C + (1 - S)*PEMA
Maybe implement the direct ping/pong as over the filter mechanism?
Schedule the table updates so that they possibly do not overlap in time.
Implement the query hits data extension.
Substitute Result::fileName with QFileInfo. It provides functions to get the extension, path, etc.
Add setter functions.
Forbid changing the result entries. Payload would need to be invalidated.
only called by the ctor - use ctor initializer lists instead?
only called by the ctor - use ctor initializer lists instead?
try to delay acceptConnection() and see what happens
u/d speeds, snubbed flags
VendorCode_
Maybe move all such global constants in a Settings class and make it possible to be changed without rebuilding the complete source.
No Calitko abstractions (classes) for a search and search result developed yet. Maybe the best would be to use XML! We could decide on that after work on the Services::Searching is started.
Try using Doxygen's grouping functionality to group RequestHeader and ResponseHeader into "Handshaking Presentation Layer" group for example. Then add a reference to this group in the picture above.
Does SlotAllocator fit nice here? Maybe it, together with Bootstrapping::ConnectionKeeper should either be moved in a separate package directly in Gnutella.
Create a new sub-package DynamicSearching and move the classes Gnutella::Searching::DynamicSearcher and Gnutella::Searching::DynamicSearch to the new sub-package.
Implement flow control in PacketSession.
The searching-related extensions are not fully implemented and tested yet (XML metadata, EQHD).
DynamicSearch and DynamicSearcher should be moved to PacketProcessing::DynamicSearching.
Find and add the links to the specs about metadata searching in Gnutella.