| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | #pragma once#include <stdint.h>#include <memory>#include "Crypto.h"#include "LoginBlob.h"#include "MercurySession.h"#include "TimeProvider.h"#include "protobuf/authentication.pb.h"  // for AuthenticationType_AUTHE...#include "protobuf/metadata.pb.h"#ifdef BELL_ONLY_CJSON#include "cJSON.h"#else#include "nlohmann/detail/json_pointer.hpp"  // for json_pointer<>::string_t#include "nlohmann/json.hpp"      // for basic_json<>::object_t, basic_json#include "nlohmann/json_fwd.hpp"  // for json#endifnamespace cspot {struct Context {  struct ConfigState {    // Setup default bitrate to 160    AudioFormat audioFormat = AudioFormat::AudioFormat_OGG_VORBIS_160;    std::string deviceId;    std::string deviceName;    std::vector<uint8_t> authData;    int volume;    std::string username;    std::string countryCode;  };  ConfigState config;  std::shared_ptr<TimeProvider> timeProvider;  std::shared_ptr<cspot::MercurySession> session;  std::string getCredentialsJson() {#ifdef BELL_ONLY_CJSON    cJSON* json_obj = cJSON_CreateObject();    cJSON_AddStringToObject(json_obj, "authData",                            Crypto::base64Encode(config.authData).c_str());    cJSON_AddNumberToObject(        json_obj, "authType",        AuthenticationType_AUTHENTICATION_STORED_SPOTIFY_CREDENTIALS);    cJSON_AddStringToObject(json_obj, "username", config.username.c_str());    char* str = cJSON_PrintUnformatted(json_obj);    cJSON_Delete(json_obj);    std::string json_objStr(str);    free(str);    return json_objStr;#else    nlohmann::json obj;    obj["authData"] = Crypto::base64Encode(config.authData);    obj["authType"] =        AuthenticationType_AUTHENTICATION_STORED_SPOTIFY_CREDENTIALS;    obj["username"] = config.username;    return obj.dump();#endif  }  static std::shared_ptr<Context> createFromBlob(      std::shared_ptr<LoginBlob> blob) {    auto ctx = std::make_shared<Context>();    ctx->timeProvider = std::make_shared<TimeProvider>();    ctx->session = std::make_shared<MercurySession>(ctx->timeProvider);    ctx->config.deviceId = blob->getDeviceId();    ctx->config.deviceName = blob->getDeviceName();    ctx->config.authData = blob->authData;    ctx->config.volume = 0;    ctx->config.username = blob->getUserName();    return ctx;  }};}  // namespace cspot
 |