Skip to content

Commit 4a8efef

Browse files
committed
update to 10.8.1 (4404)
1 parent 5dd6491 commit 4a8efef

File tree

219 files changed

+11595
-1793
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

219 files changed

+11595
-1793
lines changed

TMessagesProj/config/release/AndroidManifest_standalone.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020

2121
<permission android:name="${applicationId}.permission.MAPS_RECEIVE" android:protectionLevel="signature"/>
2222

23+
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
24+
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
25+
<uses-permission android:name="android.permission.SEND_SMS" />
26+
2327
<application
2428
android:icon="@mipmap/ic_launcher_sa"
2529
android:roundIcon="@mipmap/ic_launcher_sa"
@@ -135,6 +139,12 @@
135139
</intent-filter>
136140
</receiver>
137141

142+
<receiver
143+
android:name="org.telegram.messenger.SMSResultService"
144+
android:exported="false">
145+
</receiver>
146+
147+
138148
<service
139149
tools:replace="android:enabled"
140150
android:name="com.google.android.gms.measurement.AppMeasurementService"

TMessagesProj/jni/audio.c

Lines changed: 168 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,19 @@ typedef struct {
5252
int copy_comments;
5353
} oe_enc_opt;
5454

55+
typedef struct {
56+
ogg_int32_t _packetId;
57+
opus_int64 bytes_written;
58+
opus_int64 pages_out;
59+
opus_int64 total_samples;
60+
ogg_int64_t enc_granulepos;
61+
int size_segments;
62+
int last_segments;
63+
ogg_int64_t last_granulepos;
64+
opus_int32 min_bytes;
65+
int max_frame_bytes;
66+
} resume_data;
67+
5568
static int write_uint32(Packet *p, ogg_uint32_t val) {
5669
if (p->pos > p->maxlen - 4) {
5770
return 0;
@@ -233,6 +246,7 @@ ogg_int32_t _packetId;
233246
OpusEncoder *_encoder = 0;
234247
uint8_t *_packet = 0;
235248
ogg_stream_state os;
249+
const char *_filePath;
236250
FILE *_fileOs = 0;
237251
oe_enc_opt inopt;
238252
OpusHeader header;
@@ -277,6 +291,10 @@ void cleanupRecorder() {
277291
size_segments = 0;
278292
last_segments = 0;
279293
last_granulepos = 0;
294+
if (_filePath) {
295+
free(_filePath);
296+
_filePath = 0;
297+
}
280298
memset(&os, 0, sizeof(ogg_stream_state));
281299
memset(&inopt, 0, sizeof(oe_enc_opt));
282300
memset(&header, 0, sizeof(OpusHeader));
@@ -294,7 +312,11 @@ int initRecorder(const char *path, opus_int32 sampleRate) {
294312
LOGE("path is null");
295313
return 0;
296314
}
297-
315+
316+
int length = strlen(path);
317+
_filePath = (char*) malloc(length + 1);
318+
strcpy(_filePath, path);
319+
298320
_fileOs = fopen(path, "w");
299321
if (!_fileOs) {
300322
LOGE("error cannot open file: %s", path);
@@ -416,6 +438,134 @@ int initRecorder(const char *path, opus_int32 sampleRate) {
416438

417439
return 1;
418440
}
441+
442+
void saveResumeData() {
443+
if (_filePath == NULL) {
444+
return;
445+
}
446+
const char* ext = ".resume";
447+
char* _resumeFilePath = (char*) malloc(strlen(_filePath) + strlen(ext) + 1);
448+
strcpy(_resumeFilePath, _filePath);
449+
strcat(_resumeFilePath, ext);
450+
451+
FILE* resumeFile = fopen(_resumeFilePath, "wb");
452+
if (!resumeFile) {
453+
LOGE("error cannot open resume file to write: %s", _resumeFilePath);
454+
free(_resumeFilePath);
455+
return;
456+
}
457+
resume_data data;
458+
data._packetId = _packetId;
459+
data.bytes_written = bytes_written;
460+
data.pages_out = pages_out;
461+
data.total_samples = total_samples;
462+
data.enc_granulepos = enc_granulepos;
463+
data.size_segments = size_segments;
464+
data.last_segments = last_segments;
465+
data.last_granulepos = last_granulepos;
466+
data.min_bytes = min_bytes;
467+
data.max_frame_bytes = max_frame_bytes;
468+
469+
if (fwrite(&data, sizeof(resume_data), 1, resumeFile) != 1) {
470+
LOGE("error writing resume data to file: %s", _resumeFilePath);
471+
}
472+
fclose(resumeFile);
473+
474+
free(_resumeFilePath);
475+
}
476+
477+
resume_data readResumeData(const char* filePath) {
478+
479+
const char* ext = ".resume";
480+
char* _resumeFilePath = (char*) malloc(strlen(filePath) + strlen(ext) + 1);
481+
strcpy(_resumeFilePath, filePath);
482+
strcat(_resumeFilePath, ext);
483+
484+
resume_data data;
485+
486+
FILE* resumeFile = fopen(_resumeFilePath, "rb");
487+
if (!resumeFile) {
488+
LOGE("error cannot open resume file to read: %s", _resumeFilePath);
489+
memset(&data, 0, sizeof(resume_data));
490+
return data;
491+
}
492+
493+
if (fread(&data, sizeof(resume_data), 1, resumeFile) != 1) {
494+
LOGE("error cannot read resume file: %s", _resumeFilePath);
495+
memset(&data, 0, sizeof(resume_data));
496+
}
497+
498+
fclose(resumeFile);
499+
free(_resumeFilePath);
500+
501+
return data;
502+
}
503+
504+
int resumeRecorder(const char *path, opus_int32 sampleRate) {
505+
cleanupRecorder();
506+
507+
coding_rate = sampleRate;
508+
rate = sampleRate;
509+
510+
if (!path) {
511+
LOGE("path is null");
512+
return 0;
513+
}
514+
515+
int length = strlen(path);
516+
_filePath = (char*) malloc(length + 1);
517+
strcpy(_filePath, path);
518+
519+
resume_data resumeData = readResumeData(path);
520+
_packetId = resumeData._packetId;
521+
bytes_written = resumeData.bytes_written;
522+
pages_out = resumeData.pages_out;
523+
total_samples = resumeData.total_samples;
524+
enc_granulepos = resumeData.enc_granulepos;
525+
size_segments = resumeData.size_segments;
526+
last_segments = resumeData.last_segments;
527+
last_granulepos = resumeData.last_granulepos;
528+
min_bytes = resumeData.min_bytes;
529+
max_frame_bytes = resumeData.max_frame_bytes;
530+
531+
_fileOs = fopen(path, "a");
532+
if (!_fileOs) {
533+
LOGE("error cannot open resume file: %s", path);
534+
return 0;
535+
}
536+
537+
int result = OPUS_OK;
538+
_encoder = opus_encoder_create(coding_rate, 1, OPUS_APPLICATION_VOIP, &result);
539+
if (result != OPUS_OK) {
540+
LOGE("Error cannot create encoder: %s", opus_strerror(result));
541+
return 0;
542+
}
543+
544+
_packet = malloc(max_frame_bytes);
545+
546+
result = opus_encoder_ctl(_encoder, OPUS_SET_BITRATE(bitrate));
547+
//result = opus_encoder_ctl(_encoder, OPUS_SET_COMPLEXITY(10));
548+
if (result != OPUS_OK) {
549+
LOGE("Error OPUS_SET_BITRATE returned: %s", opus_strerror(result));
550+
return 0;
551+
}
552+
553+
#ifdef OPUS_SET_LSB_DEPTH
554+
result = opus_encoder_ctl(_encoder, OPUS_SET_LSB_DEPTH(MAX(8, MIN(24, 16))));
555+
if (result != OPUS_OK) {
556+
LOGE("Warning OPUS_SET_LSB_DEPTH returned: %s", opus_strerror(result));
557+
}
558+
#endif
559+
560+
if (ogg_stream_init(&os, rand()) == -1) {
561+
LOGE("Error: stream init failed");
562+
return 0;
563+
}
564+
565+
return 1;
566+
}
567+
568+
419569
int writeFrame(uint8_t *framePcmBytes, uint32_t frameByteCount) {
420570
size_t cur_frame_size = frame_size;
421571
_packetId++;
@@ -433,7 +583,7 @@ int writeFrame(uint8_t *framePcmBytes, uint32_t frameByteCount) {
433583
if (nb_samples != 0) {
434584
uint8_t *paddedFrameBytes = framePcmBytes;
435585
int freePaddedFrameBytes = 0;
436-
586+
437587
if (nb_samples < cur_frame_size) {
438588
paddedFrameBytes = malloc(cur_frame_size * 2);
439589
freePaddedFrameBytes = 1;
@@ -503,6 +653,18 @@ JNIEXPORT jint Java_org_telegram_messenger_MediaController_startRecord(JNIEnv *e
503653
const char *pathStr = (*env)->GetStringUTFChars(env, path, 0);
504654

505655
int32_t result = initRecorder(pathStr, sampleRate);
656+
657+
if (pathStr != 0) {
658+
(*env)->ReleaseStringUTFChars(env, path, pathStr);
659+
}
660+
661+
return result;
662+
}
663+
664+
JNIEXPORT jint Java_org_telegram_messenger_MediaController_resumeRecord(JNIEnv *env, jclass class, jstring path, jint sampleRate) {
665+
const char *pathStr = (*env)->GetStringUTFChars(env, path, 0);
666+
667+
int32_t result = resumeRecorder(pathStr, sampleRate);
506668

507669
if (pathStr != 0) {
508670
(*env)->ReleaseStringUTFChars(env, path, pathStr);
@@ -516,7 +678,10 @@ JNIEXPORT jint Java_org_telegram_messenger_MediaController_writeFrame(JNIEnv *en
516678
return writeFrame((uint8_t *) frameBytes, (uint32_t) len);
517679
}
518680

519-
JNIEXPORT void Java_org_telegram_messenger_MediaController_stopRecord(JNIEnv *env, jclass class) {
681+
JNIEXPORT void Java_org_telegram_messenger_MediaController_stopRecord(JNIEnv *env, jclass class, jboolean allowResuming) {
682+
if (allowResuming && _filePath != NULL) {
683+
saveResumeData();
684+
}
520685
cleanupRecorder();
521686
}
522687

TMessagesProj/jni/opus/src/opus_encoder.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@
4747
#include "tuning_parameters.h"
4848
#ifdef FIXED_POINT
4949
#include "fixed/structs_FIX.h"
50+
#include "c_utils.h"
51+
5052
#else
5153
#include "float/structs_FLP.h"
5254
#endif

TMessagesProj/jni/tgnet/Connection.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ void Connection::onReceivedData(NativeByteBuffer *buffer) {
114114
parseLaterBuffer = buffer->hasRemaining() ? buffer : nullptr;
115115
buffer = restOfTheData;
116116
} else {
117-
if (LOGS_ENABLED) DEBUG_D("connection(%p, account%u, dc%u, type %d) received packet size less(%u) then message size(%u)", this, currentDatacenter->instanceNum, currentDatacenter->getDatacenterId(), connectionType, restOfTheData->position(), lastPacketLength);
117+
// if (LOGS_ENABLED) DEBUG_D("connection(%p, account%u, dc%u, type %d) received packet size less(%u) then message size(%u)", this, currentDatacenter->instanceNum, currentDatacenter->getDatacenterId(), connectionType, restOfTheData->position(), lastPacketLength);
118118
return;
119119
}
120120
}

TMessagesProj/jni/tgnet/ConnectionSocket.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,12 @@ void ConnectionSocket::onEvent(uint32_t events) {
655655
while (true) {
656656
buffer->rewind();
657657
readCount = recv(socketFd, buffer->bytes(), READ_BUFFER_SIZE, 0);
658+
int err = errno;
659+
// if (LOGS_ENABLED) DEBUG_D("connection(%p) recv resulted with %d, errno=%d", this, readCount, err);
658660
if (readCount < 0) {
661+
if (err == EAGAIN) {
662+
break;
663+
}
659664
closeSocket(1, -1);
660665
if (LOGS_ENABLED) DEBUG_E("connection(%p) recv failed", this);
661666
return;
@@ -850,10 +855,12 @@ void ConnectionSocket::onEvent(uint32_t events) {
850855
onReceivedData(buffer);
851856
}
852857
}
853-
}
854-
if (readCount != READ_BUFFER_SIZE) {
858+
} else if (readCount == 0) {
855859
break;
856860
}
861+
// if (readCount != READ_BUFFER_SIZE) {
862+
// break;
863+
// }
857864
}
858865
}
859866
}

TMessagesProj/jni/tgnet/ConnectionsManager.cpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -970,11 +970,13 @@ void ConnectionsManager::onConnectionDataReceived(Connection *connection, Native
970970
sendMessagesToConnectionWithConfirmation(messages, connection, false);
971971
}
972972
} else {
973+
if (LOGS_ENABLED) DEBUG_D("connection(%p, account%u, dc%u, type %d) received unparsed packet on 0x%" PRIx64, connection, instanceNum, datacenter->getDatacenterId(), connection->getConnectionType(), messageId);
973974
if (delegate != nullptr) {
974975
delegate->onUnparsedMessageReceived(messageId, data, connection->getConnectionType(), instanceNum);
975976
}
976977
}
977978
} else {
979+
if (LOGS_ENABLED) DEBUG_D("connection(%p, account%u, dc%u, type %d) received unprocessed packet on 0x%" PRIx64, connection, instanceNum, datacenter->getDatacenterId(), connection->getConnectionType(), messageId);
978980
std::vector<std::unique_ptr<NetworkMessage>> messages;
979981
sendMessagesToConnectionWithConfirmation(messages, connection, false);
980982
}
@@ -1052,6 +1054,9 @@ TLObject *ConnectionsManager::TLdeserialize(TLObject *request, uint32_t bytes, N
10521054
}
10531055
}
10541056
} else {
1057+
if (constructor == 0x96a18d5) {
1058+
if (LOGS_ENABLED) DEBUG_D("not found file 0x%x", constructor);
1059+
}
10551060
if (LOGS_ENABLED) DEBUG_D("not found request to parse constructor 0x%x", constructor);
10561061
}
10571062
}
@@ -1621,6 +1626,7 @@ void ConnectionsManager::processServerResponse(TLObject *message, int64_t messag
16211626
processServerResponse(object, messageId, messageSeqNo, messageSalt, connection, innerMsgId, containerMessageId);
16221627
delete object;
16231628
} else {
1629+
if (LOGS_ENABLED) DEBUG_D("connection(%p, account%u, dc%u, type %d) received unparsed from gzip object on %0x" PRIx64, connection, instanceNum, datacenter->getDatacenterId(), connection->getConnectionType(), messageId);
16241630
if (delegate != nullptr) {
16251631
delegate->onUnparsedMessageReceived(messageId, data, connection->getConnectionType(), instanceNum);
16261632
}
@@ -1969,7 +1975,7 @@ bool ConnectionsManager::cancelRequestInternal(int32_t token, int64_t messageId,
19691975
Request *request = iter->get();
19701976
if ((token != 0 && request->requestToken == token) || (messageId != 0 && request->respondsToMessageId(messageId))) {
19711977
request->cancelled = true;
1972-
if (LOGS_ENABLED) DEBUG_D("cancelled queued rpc request %p - %s", request->rawRequest, typeid(*request->rawRequest).name());
1978+
if (LOGS_ENABLED) DEBUG_D("cancelled queued rpc request %p - %s of messageId 0x%" PRIx64, request->rawRequest, typeid(*request->rawRequest).name(), request->messageId);
19731979
requestsQueue.erase(iter);
19741980
if (removeFromClass) {
19751981
removeRequestFromGuid(token);
@@ -1982,7 +1988,7 @@ bool ConnectionsManager::cancelRequestInternal(int32_t token, int64_t messageId,
19821988
Request *request = iter->get();
19831989
if ((token != 0 && request->requestToken == token) || (messageId != 0 && request->respondsToMessageId(messageId))) {
19841990
request->cancelled = true;
1985-
if (LOGS_ENABLED) DEBUG_D("cancelled waiting login rpc request %p - %s", request->rawRequest, typeid(*request->rawRequest).name());
1991+
if (LOGS_ENABLED) DEBUG_D("cancelled waiting login rpc request %p - %s", request->rawRequest, typeid(*request->rawRequest).name());
19861992
waitingLoginRequests.erase(iter);
19871993
if (removeFromClass) {
19881994
removeRequestFromGuid(token);
@@ -2000,7 +2006,7 @@ bool ConnectionsManager::cancelRequestInternal(int32_t token, int64_t messageId,
20002006
sendRequest(dropAnswer, nullptr, nullptr, RequestFlagEnableUnauthorized | RequestFlagWithoutLogin | RequestFlagFailOnServerErrors | RequestFlagIsCancel, request->datacenterId, request->connectionType, true);
20012007
}
20022008
request->cancelled = true;
2003-
if (LOGS_ENABLED) DEBUG_D("cancelled running rpc request %p - %s", request->rawRequest, typeid(*request->rawRequest).name());
2009+
if (LOGS_ENABLED) DEBUG_D("cancelled running rpc request %p - %s, of messageId 0x%" PRIx64, request->rawRequest, typeid(*request->rawRequest).name(), request->messageId);
20042010
runningRequests.erase(iter);
20052011
if (removeFromClass) {
20062012
removeRequestFromGuid(token);
@@ -2352,12 +2358,13 @@ void ConnectionsManager::processRequestQueue(uint32_t connectionTypes, uint32_t
23522358
forceThisRequest = false;
23532359
}
23542360

2355-
if (forceThisRequest || (abs(currentTime - request->startTime) > maxTimeout &&
2356-
(currentTime >= request->minStartTime ||
2357-
(request->failedByFloodWait != 0 && (request->minStartTime - currentTime) > request->failedByFloodWait) ||
2358-
(request->failedByFloodWait == 0 && abs(currentTime - request->minStartTime) >= 60))
2359-
)
2360-
) {
2361+
if (forceThisRequest || (
2362+
abs(currentTime - request->startTime) > maxTimeout && (
2363+
currentTime >= request->minStartTime ||
2364+
(request->failedByFloodWait != 0 && (request->minStartTime - currentTime) > request->failedByFloodWait) ||
2365+
(request->failedByFloodWait == 0 && abs(currentTime - request->minStartTime) >= 60)
2366+
)
2367+
)) {
23612368
if (!forceThisRequest && request->connectionToken > 0) {
23622369
if ((request->connectionType & ConnectionTypeGeneric || request->connectionType & ConnectionTypeTemp) && request->connectionToken == connection->getConnectionToken()) {
23632370
if (LOGS_ENABLED) DEBUG_D("request token is valid, not retrying %s (%p)", typeInfo.name(), request->rawRequest);

TMessagesProj/jni/tgnet/ConnectionsManager.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,6 @@ class ConnectionsManager {
259259
friend class Config;
260260
friend class FileLog;
261261
friend class Handshake;
262-
263262
};
264263

265264
#ifdef ANDROID

0 commit comments

Comments
 (0)