LCOV - code coverage report
Current view: top level - src/domain/write - edit.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 59.3 % 54 32
Test Date: 2026-04-20 19:54:22 Functions: 100.0 % 2 2

            Line data    Source code
       1              : /* SPDX-License-Identifier: GPL-3.0-or-later */
       2              : /* Copyright 2026 Peter Csaszar */
       3              : 
       4              : /**
       5              :  * @file domain/write/edit.c
       6              :  * @brief messages.editMessage (US-P5-06).
       7              :  */
       8              : 
       9              : #include "domain/write/edit.h"
      10              : 
      11              : #include "tl_serial.h"
      12              : #include "tl_registry.h"
      13              : #include "mtproto_rpc.h"
      14              : #include "logger.h"
      15              : 
      16              : #include <string.h>
      17              : 
      18              : #define CRC_messages_editMessage 0x48f71778u
      19              : 
      20            9 : static int write_input_peer(TlWriter *w, const HistoryPeer *p) {
      21            9 :     switch (p->kind) {
      22            9 :     case HISTORY_PEER_SELF:
      23            9 :         tl_write_uint32(w, TL_inputPeerSelf);
      24            9 :         return 0;
      25            0 :     case HISTORY_PEER_USER:
      26            0 :         tl_write_uint32(w, TL_inputPeerUser);
      27            0 :         tl_write_int64 (w, p->peer_id);
      28            0 :         tl_write_int64 (w, p->access_hash);
      29            0 :         return 0;
      30            0 :     case HISTORY_PEER_CHAT:
      31            0 :         tl_write_uint32(w, TL_inputPeerChat);
      32            0 :         tl_write_int64 (w, p->peer_id);
      33            0 :         return 0;
      34            0 :     case HISTORY_PEER_CHANNEL:
      35            0 :         tl_write_uint32(w, TL_inputPeerChannel);
      36            0 :         tl_write_int64 (w, p->peer_id);
      37            0 :         tl_write_int64 (w, p->access_hash);
      38            0 :         return 0;
      39            0 :     default:
      40            0 :         return -1;
      41              :     }
      42              : }
      43              : 
      44           12 : int domain_edit_message(const ApiConfig *cfg,
      45              :                          MtProtoSession *s, Transport *t,
      46              :                          const HistoryPeer *peer,
      47              :                          int32_t msg_id,
      48              :                          const char *new_text,
      49              :                          RpcError *err) {
      50           12 :     if (!cfg || !s || !t || !peer || !new_text) return -1;
      51           11 :     size_t mlen = strlen(new_text);
      52           11 :     if (mlen == 0 || mlen > 4096) {
      53            1 :         logger_log(LOG_ERROR, "edit: text length %zu out of bounds", mlen);
      54            1 :         return -1;
      55              :     }
      56           10 :     if (msg_id <= 0) return -1;
      57              : 
      58            9 :     TlWriter w; tl_writer_init(&w);
      59            9 :     tl_write_uint32(&w, CRC_messages_editMessage);
      60            9 :     tl_write_uint32(&w, 1u << 11);             /* flags: only message set */
      61            9 :     if (write_input_peer(&w, peer) != 0) {
      62            0 :         tl_writer_free(&w);
      63            0 :         return -1;
      64              :     }
      65            9 :     tl_write_int32 (&w, msg_id);
      66            9 :     tl_write_string(&w, new_text);
      67              : 
      68              :     uint8_t query[8192];
      69            9 :     if (w.len > sizeof(query)) { tl_writer_free(&w); return -1; }
      70            9 :     memcpy(query, w.data, w.len);
      71            9 :     size_t qlen = w.len;
      72            9 :     tl_writer_free(&w);
      73              : 
      74            9 :     uint8_t resp[4096]; size_t resp_len = 0;
      75            9 :     if (api_call(cfg, s, t, query, qlen, resp, sizeof(resp), &resp_len) != 0) {
      76            0 :         logger_log(LOG_ERROR, "edit: api_call failed");
      77            0 :         return -1;
      78              :     }
      79            9 :     if (resp_len < 4) return -1;
      80              : 
      81              :     uint32_t top;
      82            9 :     memcpy(&top, resp, 4);
      83            9 :     if (top == TL_rpc_error) {
      84            6 :         if (err) rpc_parse_error(resp, resp_len, err);
      85            6 :         return -1;
      86              :     }
      87              :     /* Any Updates envelope = success. */
      88            3 :     if (top == TL_updates || top == TL_updatesCombined
      89            1 :         || top == TL_updateShort) {
      90            3 :         return 0;
      91              :     }
      92            0 :     logger_log(LOG_WARN, "edit: unexpected top 0x%08x — assuming success", top);
      93            0 :     return 0;
      94              : }
        

Generated by: LCOV version 2.0-1