# pragma once
# include <atomic>
# include <functional>
# include <string>
enum class ReplyMsgType {
Info ,
Debug ,
Warning ,
Critical
} ;
typedef std : : function < void ( ReplyMsgType type , const std : : string msg ) > ReplayMessageHandler ;
void installMessageHandler ( ReplayMessageHandler ) ;
void logMessage ( ReplyMsgType type , const char * fmt , . . . ) ;
# define rInfo(fmt, ...) ::logMessage(ReplyMsgType::Info, fmt, ## __VA_ARGS__)
# define rDebug(fmt, ...) ::logMessage(ReplyMsgType::Debug, fmt, ## __VA_ARGS__)
# define rWarning(fmt, ...) ::logMessage(ReplyMsgType::Warning, fmt, ## __VA_ARGS__)
# define rError(fmt, ...) ::logMessage(ReplyMsgType::Critical , fmt, ## __VA_ARGS__)
std : : string sha256 ( const std : : string & str ) ;
void precise_nano_sleep ( long sleep_ns ) ;
std : : string decompressBZ2 ( const std : : string & in , std : : atomic < bool > * abort = nullptr ) ;
std : : string decompressBZ2 ( const std : : byte * in , size_t in_size , std : : atomic < bool > * abort = nullptr ) ;
std : : string getUrlWithoutQuery ( const std : : string & url ) ;
size_t getRemoteFileSize ( const std : : string & url , std : : atomic < bool > * abort = nullptr ) ;
std : : string httpGet ( const std : : string & url , size_t chunk_size = 0 , std : : atomic < bool > * abort = nullptr ) ;
typedef std : : function < void ( uint64_t cur , uint64_t total , bool success ) > DownloadProgressHandler ;
void installDownloadProgressHandler ( DownloadProgressHandler ) ;
bool httpDownload ( const std : : string & url , const std : : string & file , size_t chunk_size = 0 , std : : atomic < bool > * abort = nullptr ) ;
std : : string formattedDataSize ( size_t size ) ;