Advertisement
SlavikMIPT

Untitled

Nov 14th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.38 KB | None | 0 0
  1. #include "Core.hpp"
  2. namespace App
  3. {
  4. string Core::_relayAddressPortStr = "None";
  5. string Core::_peerTagStr = "None";
  6. string Core::_encryptionKeyStr = "None";
  7. string Core::_audioDeviceSource = "None";
  8. string Core::_audioDeviceSink = "None";
  9. string Core::_configJsonPath = "None";
  10. string Core::_peerRoleStr = "None";
  11. VoIPController *Core::_pVoipController = nullptr;
  12. Core::Core()
  13. {
  14.  
  15. }
  16. Core::~Core()
  17. {
  18. }
  19. string Core::getInputParsedArg(po::variables_map &vm, const char *key){
  20.         if (vm.count(key) == 1) {
  21.             return vm[key].as<string>();
  22.         }
  23.         else{
  24.             throw std::invalid_argument(key);
  25.         }
  26. }
  27.  
  28. int Core::parseProgramOptions(int ac, char* av[])
  29. {
  30. // -k encryption_key_hex -i /path/to/sound_A.ogg -o /path/to/sound_output_B.ogg -c config.json -r caller
  31.     try {
  32.         po::options_description desc("Allowed options");
  33.         desc.add_options()
  34.             ("address", po::value<string>(), "reflector:port")
  35.             ("tag", po::value<string>(), "caller/callee tag_hex")
  36.             ("key,k", po::value<string>(), "encryption key_hex")
  37.             ("input,i", po::value<string>(), "input audio device (source) ex: callmic")
  38.             ("output,o", po::value<string>(), "output audio device (sink) ex: callout")
  39.             ("config,c", po::value<string>(), "config.json")
  40.             ("role,r", po::value<string>(), "caller/callee")
  41.         ;
  42.         po::positional_options_description p;
  43.         p.add("address", 1);
  44.         p.add("tag", 1);
  45.  
  46.         po::variables_map vm;
  47.         po::store(po::command_line_parser(ac, av).options(desc).positional(p).run(), vm);
  48.         po::notify(vm);
  49.  
  50.         //TODO: use validation wrapper
  51.         _relayAddressPortStr = getInputParsedArg(vm,"address");
  52.         _peerTagStr = getInputParsedArg(vm,"tag");
  53.         _encryptionKeyStr = getInputParsedArg(vm,"key");
  54.         _audioDeviceSource = getInputParsedArg(vm,"input");
  55.         _audioDeviceSink = getInputParsedArg(vm,"output");    
  56.         _configJsonPath = getInputParsedArg(vm,"config");  
  57.         _peerRoleStr = getInputParsedArg(vm,"role");
  58.         if((_peerRoleStr != "callee") && (_peerRoleStr != "caller"))
  59.         {
  60.             throw invalid_argument("Incorrect peer role, expected \"callee\" or \"caller\"");
  61.         }
  62.         cout << "parsed args:\n"
  63.         << _relayAddressPortStr << endl
  64.         << _peerTagStr << endl
  65.         << _encryptionKeyStr << endl
  66.         << _audioDeviceSource << endl
  67.         << _audioDeviceSink << endl
  68.         << _configJsonPath << endl
  69.         << _peerRoleStr << endl;
  70.     }
  71.     catch(exception& e) {
  72.         cerr << "error: " << e.what() << endl;
  73.         return 1;
  74.     }
  75.     catch(...) {
  76.         cerr << "Exception of unknown type!\n";
  77.         return 1;
  78.     }
  79.  
  80.     return 0;
  81. }
  82. void Core::convertHexStringToByteArray(const string str, unsigned char bytearray[])
  83. {
  84.     stringstream converter;
  85.     for (int i = 0; i < str.length(); i += 2)
  86.     {
  87.         converter << std::hex << str.substr(i, 2);
  88.         int byte;
  89.         converter >> byte;
  90.         bytearray[i / 2] = byte & 0xFF;
  91.         converter.str(std::string());
  92.         converter.clear();
  93.     }
  94. }
  95. void Core::updateConfig(const string &data)
  96. {
  97.     ServerConfig::GetSharedInstance()->Update(data);
  98. }
  99. bool Core::getConfigFlag(const string name)
  100. {
  101.     return ServerConfig::GetSharedInstance()->GetBoolean(name, false);
  102. }
  103. Core::State Core::getState(void)
  104. {
  105.     return static_cast<Core::State>(_pVoipController->GetConnectionState());
  106. }
  107. void Core::stopCall(void)
  108. {
  109.     _pVoipController->Stop();
  110. }
  111. string Core::getStatistics(void)
  112. {
  113.     return _pVoipController->GetDebugLog();
  114. }
  115. void Core::startCall(void)
  116. {  
  117.     if(_pVoipController == nullptr)
  118.     {
  119.         _pVoipController = new VoIPController();
  120.     };
  121.     ifstream t(_configJsonPath);
  122.     string jsonString((std::istreambuf_iterator<char>(t)),std::istreambuf_iterator<char>());
  123.     updateConfig(jsonString);
  124.     const bool isUseTCP = getConfigFlag("use_tcp");
  125.     const bool isForceTCP = getConfigFlag("force_tcp");
  126.     const Endpoint::Type endpointType = isUseTCP || isForceTCP ? Endpoint::Type::TCP_RELAY : Endpoint::Type::UDP_RELAY;
  127.     const int32_t CallConnectTimeoutMs = 30000;
  128.     const int32_t CallPacketTimeoutMs = 10000;
  129.     cout << endpointType;
  130.     VoIPController::Config config;
  131.  
  132.     const bool isOutgoing = _peerRoleStr == "caller" ? true : false;
  133.     std::vector<string> resTemp;
  134.     boost::split(resTemp, _relayAddressPortStr, [](char c){return c == ':';});
  135.     std::string relayAddressStr = std::string(resTemp.at(0));
  136.     uint16_t relayPortInt = std::stoi(resTemp.at(1));
  137.  
  138.     IPv4Address relayAddressIPv4(relayAddressStr);
  139.     uint32_t u32Ipv4 = relayAddressIPv4.GetAddress();
  140.     int64_t endpointId = (static_cast<int64_t>(relayPortInt) << 32) | (static_cast<int64_t>(u32Ipv4));
  141.     cout << relayAddressStr << ':' << relayPortInt << endl;
  142.     cout << endpointId << endl;
  143.     IPv6Address relayAddressIPv6("0:0:0:0:0:0");
  144.     unsigned char peerTagByteArray[16], authKeyByteArray[256];
  145.     convertHexStringToByteArray(_peerTagStr, peerTagByteArray);
  146.     convertHexStringToByteArray(_encryptionKeyStr, authKeyByteArray);
  147.     //TODO refactor
  148.     Endpoint endpoint(endpointId, relayPortInt, relayAddressIPv4, relayAddressIPv6, endpointType, peerTagByteArray);
  149.     auto endpoints = vector<Endpoint>();
  150.     endpoints.emplace_back(endpoint);
  151.     _pVoipController->SetRemoteEndpoints(endpoints, false, _pVoipController->GetConnectionMaxLayer());
  152.     config.dataSaving = DATA_SAVING_NEVER;
  153.     config.enableAEC = false;
  154.     config.enableNS = true;
  155.     config.enableAGC = true;
  156.     config.enableVolumeControl = true;
  157.     config.initTimeout = CallConnectTimeoutMs / 1000.0f;
  158.     config.recvTimeout = CallPacketTimeoutMs / 1000.0f;
  159.     auto callbacks = VoIPController::Callbacks();
  160.     _pVoipController->SetConfig(config);
  161.     _pVoipController->SetCurrentAudioOutput(_audioDeviceSink);
  162.     _pVoipController->SetCurrentAudioInput(_audioDeviceSource);
  163.     _pVoipController->SetOutputVolume(100 / 100.0f);
  164.     _pVoipController->SetInputVolume(100 / 100.0f);
  165.     _pVoipController->SetEncryptionKey(reinterpret_cast<char *>(authKeyByteArray), isOutgoing);
  166.     _pVoipController->SetMicMute(false);
  167.     _pVoipController->SetNetworkType(NET_TYPE_UNKNOWN);
  168.     _pVoipController->SetCallbacks(callbacks);
  169.     _pVoipController->Start();
  170.     _pVoipController->Connect();
  171. }
  172. }//namespace App
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement