2017-04-05 03:46:16 +02:00
|
|
|
/*
|
|
|
|
Copyright 2016-2017 Daniil Gentili
|
|
|
|
(https://daniil.it)
|
|
|
|
This file is part of php-libtgvoip.
|
2017-07-06 18:12:49 +02:00
|
|
|
php-libtgvoip is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
2017-04-05 03:46:16 +02:00
|
|
|
The PWRTelegram API is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
See the GNU Affero General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along with php-libtgvoip.
|
|
|
|
If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
2017-07-01 15:12:52 +02:00
|
|
|
#include "main.h"
|
2017-07-10 12:30:13 +02:00
|
|
|
#include "audio/AudioInputModule.h"
|
|
|
|
#include "audio/AudioOutputModule.h"
|
2017-07-01 19:40:28 +02:00
|
|
|
#include <string.h>
|
|
|
|
#include <wchar.h>
|
|
|
|
#include <map>
|
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
2017-07-11 21:11:23 +02:00
|
|
|
#include <queue>
|
2017-07-01 19:40:28 +02:00
|
|
|
|
|
|
|
#include "libtgvoip/VoIPServerConfig.h"
|
2017-07-06 18:12:49 +02:00
|
|
|
#include "libtgvoip/threading.h"
|
|
|
|
#include "libtgvoip/logging.h"
|
2017-07-01 19:40:28 +02:00
|
|
|
|
2017-06-11 18:13:25 +02:00
|
|
|
using namespace tgvoip;
|
2017-06-22 14:48:52 +02:00
|
|
|
using namespace tgvoip::audio;
|
2017-07-05 23:24:07 +02:00
|
|
|
using namespace std;
|
2017-04-05 03:46:16 +02:00
|
|
|
|
2017-07-06 18:12:49 +02:00
|
|
|
void VoIP::__construct()
|
|
|
|
{
|
2017-07-09 21:12:01 +02:00
|
|
|
/*
|
|
|
|
PHPthis = (Php::Object)this;
|
2017-07-05 23:24:07 +02:00
|
|
|
madeline = params[0];
|
2017-07-06 18:12:49 +02:00
|
|
|
current_call = params[1];*/
|
2017-07-10 12:30:13 +02:00
|
|
|
in=NULL;
|
|
|
|
out=NULL;
|
2017-07-01 19:40:28 +02:00
|
|
|
inst = new VoIPController();
|
2017-07-04 03:04:22 +02:00
|
|
|
|
2017-07-09 21:12:01 +02:00
|
|
|
inst->implData = (void *) this;
|
2017-07-14 21:42:40 +02:00
|
|
|
inst->SetStateCallback([](VoIPController *controller, int state) {
|
2017-07-09 21:12:01 +02:00
|
|
|
((VoIP *)controller->implData)->state = state;
|
2017-07-14 21:42:40 +02:00
|
|
|
if (state == STATE_FAILED) {
|
|
|
|
((VoIP *)controller->implData)->__destruct();
|
|
|
|
}
|
2017-07-01 15:12:52 +02:00
|
|
|
});
|
|
|
|
}
|
2017-07-13 18:03:33 +02:00
|
|
|
void VoIP::__destruct()
|
|
|
|
{
|
2017-07-14 21:42:40 +02:00
|
|
|
destroyed = true;
|
2017-07-13 18:03:33 +02:00
|
|
|
delete inst;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-07-01 15:12:52 +02:00
|
|
|
void VoIP::start()
|
|
|
|
{
|
|
|
|
inst->Start();
|
|
|
|
}
|
|
|
|
void VoIP::connect()
|
|
|
|
{
|
|
|
|
inst->Connect();
|
|
|
|
}
|
2017-07-14 21:42:40 +02:00
|
|
|
|
|
|
|
void VoIP::setConfig(Php::Parameters ¶ms)
|
2017-07-01 15:12:52 +02:00
|
|
|
{
|
2017-07-14 21:42:40 +02:00
|
|
|
configuration = params[0];
|
|
|
|
this->parseConfig();
|
|
|
|
}
|
|
|
|
void VoIP::parseConfig() {
|
|
|
|
voip_config_t cfg;
|
|
|
|
cfg.recv_timeout = configuration["config"]["recv_timeout"];
|
|
|
|
cfg.init_timeout = configuration["config"]["init_timeout"];
|
|
|
|
cfg.data_saving = configuration["config"]["data_saving"];
|
|
|
|
cfg.enableAEC = configuration["config"]["enable_AEC"];
|
|
|
|
cfg.enableNS = configuration["config"]["enable_NS"];
|
|
|
|
cfg.enableAGC = configuration["config"]["enable_AGC"];
|
|
|
|
if (configuration["config"].contains("log_file_path"))
|
|
|
|
{
|
|
|
|
strncpy(cfg.logFilePath, configuration["config"]["log_file_path"], sizeof(cfg.logFilePath));
|
|
|
|
cfg.logFilePath[sizeof(cfg.logFilePath) - 1] = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
memset(cfg.logFilePath, 0, sizeof(cfg.logFilePath));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (configuration["config"].contains("stats_dump_file_path"))
|
|
|
|
{
|
|
|
|
strncpy(cfg.statsDumpFilePath, configuration["config"]["stats_dump_file_path"], sizeof(cfg.statsDumpFilePath));
|
|
|
|
cfg.statsDumpFilePath[sizeof(cfg.statsDumpFilePath) - 1] = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
memset(cfg.statsDumpFilePath, 0, sizeof(cfg.statsDumpFilePath));
|
|
|
|
}
|
|
|
|
inst->SetConfig(&cfg);
|
|
|
|
ServerConfig::GetSharedInstance()->Update(configuration["shared_config"]);
|
|
|
|
|
2017-07-13 18:03:33 +02:00
|
|
|
char *key = (char *) malloc(256);
|
2017-07-14 21:42:40 +02:00
|
|
|
memcpy(key, configuration["auth_key"], 256);
|
|
|
|
inst->SetEncryptionKey(key, (bool) configuration["outgoing"]);
|
2017-07-13 18:03:33 +02:00
|
|
|
free(key);
|
2017-04-05 03:46:16 +02:00
|
|
|
|
2017-07-14 21:42:40 +02:00
|
|
|
vector<Endpoint> eps;
|
|
|
|
for (int i = 0; i < configuration["endpoints"].size(); i++)
|
2017-07-01 15:12:52 +02:00
|
|
|
{
|
2017-07-14 21:42:40 +02:00
|
|
|
string ip = configuration["endpoints"][i]["ip"];
|
|
|
|
string ipv6 = configuration["endpoints"][i]["ipv6"];
|
|
|
|
string peer_tag = configuration["endpoints"][i]["peer_tag"];
|
2017-04-05 03:46:16 +02:00
|
|
|
|
2017-07-14 21:42:40 +02:00
|
|
|
IPv4Address v4addr(ip);
|
|
|
|
IPv6Address v6addr("::0");
|
2017-07-13 18:03:33 +02:00
|
|
|
unsigned char *pTag = (unsigned char *) malloc(16);
|
2017-04-05 03:46:16 +02:00
|
|
|
|
2017-07-01 15:12:52 +02:00
|
|
|
if (ipv6 != "")
|
|
|
|
{
|
|
|
|
v6addr = IPv6Address(ipv6);
|
2017-04-05 03:46:16 +02:00
|
|
|
}
|
2017-06-11 18:13:25 +02:00
|
|
|
|
2017-07-01 15:12:52 +02:00
|
|
|
if (peer_tag != "")
|
|
|
|
{
|
|
|
|
memcpy(pTag, peer_tag.c_str(), 16);
|
2017-06-11 18:13:25 +02:00
|
|
|
}
|
2017-04-05 03:46:16 +02:00
|
|
|
|
2017-07-14 21:42:40 +02:00
|
|
|
eps.push_back(Endpoint(configuration["endpoints"][i]["id"], (int32_t)configuration["endpoints"][i]["port"], v4addr, v6addr, EP_TYPE_UDP_RELAY, pTag));
|
2017-07-13 18:03:33 +02:00
|
|
|
free(pTag);
|
2017-04-05 03:46:16 +02:00
|
|
|
}
|
2017-07-14 21:42:40 +02:00
|
|
|
|
|
|
|
inst->SetRemoteEndpoints(eps, configuration["allow_p2p"]);
|
|
|
|
inst->SetNetworkType(configuration["network_type"]);
|
2017-04-05 03:46:16 +02:00
|
|
|
|
2017-07-01 15:12:52 +02:00
|
|
|
}
|
2017-07-11 21:11:23 +02:00
|
|
|
|
2017-07-13 18:03:33 +02:00
|
|
|
Php::Value VoIP::setOutputFile(Php::Parameters ¶ms) {
|
|
|
|
return out->setOutputFile(params[0]);
|
2017-07-11 21:11:23 +02:00
|
|
|
}
|
2017-07-13 18:03:33 +02:00
|
|
|
Php::Value VoIP::unsetOutputFile() {
|
|
|
|
return out->unsetOutputFile();
|
2017-07-11 21:11:23 +02:00
|
|
|
}
|
2017-07-13 18:03:33 +02:00
|
|
|
Php::Value VoIP::play(Php::Parameters ¶ms) {
|
|
|
|
if (in->play(params[0])) {
|
|
|
|
return this;
|
2017-07-11 21:11:23 +02:00
|
|
|
}
|
2017-07-13 18:03:33 +02:00
|
|
|
return false;
|
2017-07-11 21:11:23 +02:00
|
|
|
}
|
2017-07-13 18:03:33 +02:00
|
|
|
Php::Value VoIP::playOnHold(Php::Parameters ¶ms) {
|
|
|
|
return in->playOnHold(params);
|
2017-07-11 21:11:23 +02:00
|
|
|
}
|
|
|
|
|
2017-07-01 15:12:52 +02:00
|
|
|
void VoIP::setMicMute(Php::Parameters ¶ms)
|
|
|
|
{
|
|
|
|
inst->SetMicMute(params[0]);
|
|
|
|
}
|
2017-07-05 23:24:07 +02:00
|
|
|
// int protocol, string address, uint16_t port, string username, string password
|
2017-07-03 16:58:30 +02:00
|
|
|
void VoIP::setProxy(Php::Parameters ¶ms)
|
|
|
|
{
|
|
|
|
inst->SetProxy(params[0], params[1], (int32_t) params[2], params[3], params[4]);
|
|
|
|
}
|
2017-07-01 15:12:52 +02:00
|
|
|
void VoIP::debugCtl(Php::Parameters ¶ms)
|
|
|
|
{
|
|
|
|
inst->DebugCtl(params[0], params[1]);
|
|
|
|
}
|
|
|
|
|
2017-07-14 21:42:40 +02:00
|
|
|
Php::Value VoIP::getDebugLog()
|
|
|
|
{
|
|
|
|
return inst->GetDebugLog();
|
|
|
|
}
|
|
|
|
|
2017-07-01 15:12:52 +02:00
|
|
|
Php::Value VoIP::getVersion()
|
|
|
|
{
|
|
|
|
return VoIPController::GetVersion();
|
|
|
|
}
|
|
|
|
|
|
|
|
Php::Value VoIP::getPreferredRelayID()
|
|
|
|
{
|
|
|
|
return inst->GetPreferredRelayID();
|
|
|
|
}
|
|
|
|
|
|
|
|
Php::Value VoIP::getLastError()
|
|
|
|
{
|
|
|
|
return inst->GetLastError();
|
|
|
|
}
|
2017-07-14 21:42:40 +02:00
|
|
|
Php::Value VoIP::getDebugString()
|
|
|
|
{
|
|
|
|
char *buf = (char *) malloc(10240);
|
|
|
|
inst->GetDebugString(buf, 10240);
|
|
|
|
Php::Value returnvalue = buf;
|
|
|
|
free(buf);
|
|
|
|
return returnvalue;
|
|
|
|
}
|
2017-07-01 15:12:52 +02:00
|
|
|
Php::Value VoIP::getStats()
|
|
|
|
{
|
|
|
|
voip_stats_t _stats;
|
|
|
|
inst->GetStats(&_stats);
|
2017-07-09 21:12:01 +02:00
|
|
|
Php::Value stats;
|
2017-07-01 15:12:52 +02:00
|
|
|
stats["bytesSentWifi"] = (int64_t)_stats.bytesSentWifi;
|
|
|
|
stats["bytesSentMobile"] = (int64_t)_stats.bytesSentMobile;
|
|
|
|
stats["bytesRecvdWifi"] = (int64_t)_stats.bytesRecvdWifi;
|
|
|
|
stats["bytesRecvdMobile"] = (int64_t)_stats.bytesRecvdMobile;
|
|
|
|
return stats;
|
|
|
|
}
|
2017-06-17 17:24:34 +02:00
|
|
|
|
2017-04-05 03:46:16 +02:00
|
|
|
|
2017-07-09 21:12:01 +02:00
|
|
|
void VoIP::setOutputLevel(Php::Parameters ¶ms) {
|
2017-07-11 21:11:23 +02:00
|
|
|
out->outputLevel = (double) params[0];
|
2017-07-01 15:12:52 +02:00
|
|
|
}
|
2017-04-05 03:46:16 +02:00
|
|
|
|
2017-07-10 00:06:50 +02:00
|
|
|
Php::Value VoIP::getState()
|
|
|
|
{
|
|
|
|
return state;
|
|
|
|
}
|
|
|
|
|
2017-07-14 21:42:40 +02:00
|
|
|
Php::Value VoIP::isDestroyed()
|
|
|
|
{
|
|
|
|
return destroyed;
|
|
|
|
}
|
|
|
|
|
2017-07-13 18:54:59 +02:00
|
|
|
Php::Value VoIP::isPlaying()
|
|
|
|
{
|
|
|
|
return playing;
|
|
|
|
}
|
|
|
|
|
2017-07-10 00:06:50 +02:00
|
|
|
Php::Value VoIP::getOutputState()
|
|
|
|
{
|
2017-07-13 18:03:33 +02:00
|
|
|
return outputState;
|
2017-07-10 00:06:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
Php::Value VoIP::getInputState()
|
|
|
|
{
|
2017-07-13 18:03:33 +02:00
|
|
|
return inputState;
|
2017-07-10 00:06:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
Php::Value VoIP::getOutputParams()
|
|
|
|
{
|
|
|
|
Php::Value params;
|
2017-07-11 21:11:23 +02:00
|
|
|
params["bitsPerSample"] = out->outputBitsPerSample;
|
|
|
|
params["sampleRate"] = out->outputSampleRate;
|
|
|
|
params["channels"] = out->outputChannels;
|
|
|
|
params["samplePeriod"] = out->outputSamplePeriod;
|
|
|
|
params["writePeriod"] = out->outputWritePeriod;
|
|
|
|
params["sampleNumber"] = out->outputSampleNumber;
|
|
|
|
params["samplesSize"] = out->outputSamplesSize;
|
|
|
|
params["level"] = out->outputLevel;
|
2017-07-10 00:06:50 +02:00
|
|
|
|
|
|
|
return params;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Php::Value VoIP::getInputParams()
|
|
|
|
{
|
|
|
|
Php::Value params;
|
2017-07-11 21:11:23 +02:00
|
|
|
params["bitsPerSample"] = in->inputBitsPerSample;
|
|
|
|
params["sampleRate"] = in->inputSampleRate;
|
|
|
|
params["channels"] = in->inputChannels;
|
|
|
|
params["samplePeriod"] = in->inputSamplePeriod;
|
|
|
|
params["writePeriod"] = in->inputWritePeriod;
|
|
|
|
params["sampleNumber"] = in->inputSampleNumber;
|
|
|
|
params["samplesSize"] = in->inputSamplesSize;
|
2017-07-10 00:06:50 +02:00
|
|
|
|
|
|
|
return params;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-04-05 03:46:16 +02:00
|
|
|
extern "C" {
|
|
|
|
|
2017-07-01 15:12:52 +02:00
|
|
|
/**
|
2017-04-05 03:46:16 +02:00
|
|
|
* Function that is called by PHP right after the PHP process
|
|
|
|
* has started, and that returns an address of an internal PHP
|
|
|
|
* strucure with all the details and features of your extension
|
|
|
|
*
|
|
|
|
* @return void* a pointer to an address that is understood by PHP
|
|
|
|
*/
|
2017-07-01 15:12:52 +02:00
|
|
|
PHPCPP_EXPORT void *get_module()
|
|
|
|
{
|
|
|
|
// static(!) Php::Extension object that should stay in memory
|
|
|
|
// for the entire duration of the process (that's why it's static)
|
|
|
|
static Php::Extension extension("php-libtgvoip", "1.0");
|
|
|
|
|
|
|
|
// description of the class so that PHP knows which methods are accessible
|
|
|
|
Php::Class<VoIP> voip("VoIP");
|
2017-07-01 19:40:28 +02:00
|
|
|
|
2017-07-05 23:24:07 +02:00
|
|
|
/*
|
2017-07-01 19:40:28 +02:00
|
|
|
voip.method("setState", {
|
|
|
|
Php::ByVal("state", Php::Type::Numeric),
|
|
|
|
});
|
|
|
|
|
|
|
|
voip.method("startOutput");
|
|
|
|
voip.method("stopOutput");
|
|
|
|
voip.method("stopInput");
|
|
|
|
voip.method("getOutputLevel");
|
2017-07-05 23:24:07 +02:00
|
|
|
*/
|
2017-07-01 19:40:28 +02:00
|
|
|
|
2017-07-10 00:06:50 +02:00
|
|
|
|
|
|
|
voip.method<&VoIP::getState>("getState", Php::Public | Php::Final);
|
2017-07-13 18:54:59 +02:00
|
|
|
voip.method<&VoIP::isPlaying>("isPlaying", Php::Public | Php::Final);
|
2017-07-14 21:42:40 +02:00
|
|
|
voip.method<&VoIP::isDestroyed>("isDestroyed", Php::Public | Php::Final);
|
2017-07-10 00:06:50 +02:00
|
|
|
voip.method<&VoIP::getOutputState>("getOutputState", Php::Public | Php::Final);
|
|
|
|
voip.method<&VoIP::getInputState>("getInputState", Php::Public | Php::Final);
|
|
|
|
voip.method<&VoIP::getOutputParams>("getOutputParams", Php::Public | Php::Final);
|
|
|
|
voip.method<&VoIP::getInputParams>("getInputParams", Php::Public | Php::Final);
|
|
|
|
|
2017-07-05 23:24:07 +02:00
|
|
|
voip.method<&VoIP::__destruct>("__destruct", Php::Public | Php::Final);
|
2017-07-06 18:12:49 +02:00
|
|
|
voip.method<&VoIP::__construct>("__construct", Php::Public | Php::Final);
|
2017-07-09 21:12:01 +02:00
|
|
|
voip.method<&VoIP::setEncryptionKey>("setOutputLevel", Php::Public | Php::Final, {
|
|
|
|
Php::ByVal("level", Php::Type::Float),
|
|
|
|
});
|
2017-07-01 19:40:28 +02:00
|
|
|
voip.method<&VoIP::setMicMute>("setMicMute", Php::Public | Php::Final, {
|
|
|
|
Php::ByVal("type", Php::Type::Bool),
|
|
|
|
});
|
|
|
|
voip.method<&VoIP::debugCtl>("debugCtl", Php::Public | Php::Final, {
|
|
|
|
Php::ByVal("request", Php::Type::Numeric), Php::ByVal("param", Php::Type::Numeric),
|
|
|
|
});
|
|
|
|
voip.method<&VoIP::setConfig>("setConfig", Php::Public | Php::Final, {
|
2017-07-14 21:42:40 +02:00
|
|
|
Php::ByVal("config", Php::Type::Array),
|
2017-07-01 19:40:28 +02:00
|
|
|
});
|
2017-07-03 16:58:30 +02:00
|
|
|
voip.method<&VoIP::setProxy>("setProxy", Php::Public | Php::Final, {
|
2017-07-05 23:24:07 +02:00
|
|
|
// int protocol, string address, uint16_t port, string username, string password
|
2017-07-03 16:58:30 +02:00
|
|
|
Php::ByVal("protocol", Php::Type::Numeric), Php::ByVal("address", Php::Type::String), Php::ByVal("port", Php::Type::Numeric), Php::ByVal("username", Php::Type::String), Php::ByVal("password", Php::Type::String),
|
|
|
|
});
|
2017-07-01 19:40:28 +02:00
|
|
|
voip.method<&VoIP::getDebugLog>("getDebugLog", Php::Public | Php::Final);
|
|
|
|
voip.method<&VoIP::getLastError>("getLastError", Php::Public | Php::Final);
|
|
|
|
voip.method<&VoIP::getPreferredRelayID>("getPreferredRelayID", Php::Public | Php::Final);
|
|
|
|
voip.method<&VoIP::getVersion>("getVersion", Php::Public | Php::Final);
|
|
|
|
voip.method<&VoIP::getDebugString>("getDebugString", Php::Public | Php::Final);
|
|
|
|
voip.method<&VoIP::getStats>("getStats", Php::Public | Php::Final);
|
|
|
|
voip.method<&VoIP::start>("start", Php::Public | Php::Final);
|
|
|
|
voip.method<&VoIP::connect>("connect", Php::Public | Php::Final);
|
2017-07-13 18:03:33 +02:00
|
|
|
|
2017-07-11 21:11:23 +02:00
|
|
|
voip.method<&VoIP::play>("then", Php::Public | Php::Final, {Php::ByVal("file", Php::Type::String)});
|
|
|
|
voip.method<&VoIP::play>("play", Php::Public | Php::Final, {Php::ByVal("file", Php::Type::String)});
|
2017-07-13 18:03:33 +02:00
|
|
|
voip.method<&VoIP::playOnHold>("playOnHold", Php::Public | Php::Final, {Php::ByVal("files", Php::Type::Array)});
|
|
|
|
|
2017-07-11 21:11:23 +02:00
|
|
|
voip.method<&VoIP::setOutputFile>("setOutputFile", Php::Public | Php::Final, {Php::ByVal("file", Php::Type::String)});
|
|
|
|
voip.method<&VoIP::unsetOutputFile>("unsetOutputFile", Php::Public | Php::Final);
|
2017-07-01 15:12:52 +02:00
|
|
|
|
2017-07-09 21:18:06 +02:00
|
|
|
voip.constant("STATE_CREATED", STATE_CREATED);
|
2017-07-03 16:58:30 +02:00
|
|
|
voip.constant("STATE_WAIT_INIT", STATE_WAIT_INIT);
|
|
|
|
voip.constant("STATE_WAIT_INIT_ACK", STATE_WAIT_INIT_ACK);
|
|
|
|
voip.constant("STATE_ESTABLISHED", STATE_ESTABLISHED);
|
|
|
|
voip.constant("STATE_FAILED", STATE_FAILED);
|
|
|
|
voip.constant("STATE_RECONNECTING", STATE_RECONNECTING);
|
|
|
|
|
|
|
|
voip.constant("TGVOIP_ERROR_UNKNOWN", TGVOIP_ERROR_UNKNOWN);
|
|
|
|
voip.constant("TGVOIP_ERROR_INCOMPATIBLE", TGVOIP_ERROR_INCOMPATIBLE);
|
|
|
|
voip.constant("TGVOIP_ERROR_TIMEOUT", TGVOIP_ERROR_TIMEOUT);
|
|
|
|
voip.constant("TGVOIP_ERROR_AUDIO_IO", TGVOIP_ERROR_AUDIO_IO);
|
|
|
|
|
|
|
|
voip.constant("NET_TYPE_UNKNOWN", NET_TYPE_UNKNOWN);
|
|
|
|
voip.constant("NET_TYPE_GPRS", NET_TYPE_GPRS);
|
|
|
|
voip.constant("NET_TYPE_EDGE", NET_TYPE_EDGE);
|
|
|
|
voip.constant("NET_TYPE_3G", NET_TYPE_3G);
|
|
|
|
voip.constant("NET_TYPE_HSPA", NET_TYPE_HSPA);
|
|
|
|
voip.constant("NET_TYPE_LTE", NET_TYPE_LTE);
|
|
|
|
voip.constant("NET_TYPE_WIFI", NET_TYPE_WIFI);
|
|
|
|
voip.constant("NET_TYPE_ETHERNET", NET_TYPE_ETHERNET);
|
|
|
|
voip.constant("NET_TYPE_OTHER_HIGH_SPEED", NET_TYPE_OTHER_HIGH_SPEED);
|
|
|
|
voip.constant("NET_TYPE_OTHER_LOW_SPEED", NET_TYPE_OTHER_LOW_SPEED);
|
|
|
|
voip.constant("NET_TYPE_DIALUP", NET_TYPE_DIALUP);
|
|
|
|
voip.constant("NET_TYPE_OTHER_MOBILE", NET_TYPE_OTHER_MOBILE);
|
|
|
|
|
|
|
|
voip.constant("DATA_SAVING_NEVER", DATA_SAVING_NEVER);
|
|
|
|
voip.constant("DATA_SAVING_MOBILE", DATA_SAVING_MOBILE);
|
|
|
|
voip.constant("DATA_SAVING_ALWAYS", DATA_SAVING_ALWAYS);
|
|
|
|
|
|
|
|
voip.constant("PROXY_NONE", PROXY_NONE);
|
|
|
|
voip.constant("PROXY_SOCKS5", PROXY_SOCKS5);
|
|
|
|
|
2017-07-10 00:06:50 +02:00
|
|
|
voip.constant("AUDIO_STATE_NONE", AUDIO_STATE_NONE);
|
|
|
|
voip.constant("AUDIO_STATE_CREATED", AUDIO_STATE_CREATED);
|
|
|
|
voip.constant("AUDIO_STATE_CONFIGURED", AUDIO_STATE_CONFIGURED);
|
|
|
|
voip.constant("AUDIO_STATE_RUNNING", AUDIO_STATE_RUNNING);
|
|
|
|
|
2017-07-01 15:12:52 +02:00
|
|
|
Php::Namespace danog("danog");
|
|
|
|
Php::Namespace MadelineProto("MadelineProto");
|
2017-07-01 19:40:28 +02:00
|
|
|
|
2017-07-14 21:42:40 +02:00
|
|
|
MadelineProto.add(move(voip));
|
|
|
|
danog.add(move(MadelineProto));
|
|
|
|
extension.add(move(danog));
|
2017-07-01 15:12:52 +02:00
|
|
|
|
|
|
|
return extension;
|
|
|
|
}
|
2017-04-05 03:46:16 +02:00
|
|
|
}
|