summaryrefslogtreecommitdiffstats
path: root/PICA_client.c
diff options
context:
space:
mode:
authorAnton <anton@picapica.im>2025-04-11 18:43:41 +0400
committerAnton <anton@picapica.im>2025-04-11 18:43:41 +0400
commit804a917df338d7e8403c729885d60195dfb65c5d (patch)
treeeb7734d82c56300a4d1b1dc9e95382919dfd089a /PICA_client.c
parentbac29a930f2cd5825f6edb400d87eea2171b0cc1 (diff)
downloadpica-pica-804a917df338d7e8403c729885d60195dfb65c5d.tar.gz
pica-pica-804a917df338d7e8403c729885d60195dfb65c5d.zip
pica-client: call related protocol message handlers, work in progress
Diffstat (limited to 'PICA_client.c')
-rw-r--r--PICA_client.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/PICA_client.c b/PICA_client.c
index 14d2082..4f814db 100644
--- a/PICA_client.c
+++ b/PICA_client.c
@@ -3403,6 +3403,85 @@ int PICA_send_file_fragment(struct PICA_c2c *chn)
return PICA_OK;
}
+
+int PICA_start_call(struct PICA_c2c *chn)
+{
+ struct PICA_proto_msg *mp;
+
+ if (chn->call_state != PICA_CALL_STATE_IDLE)
+ return PICA_ERRCALLINPROGRESS;
+
+ if ((mp = c2c_writebuf_push(chn, PICA_PROTO_CALLREQ, PICA_PROTO_CALLREQ_SIZE)))
+ {
+ RAND_pseudo_bytes(mp->tail, 2);
+ }
+ else
+ {
+ return PICA_ERRNOMEM;
+ }
+
+ return PICA_OK;
+}
+
+int PICA_pickup_call(struct PICA_c2c *chn)
+{
+ struct PICA_proto_msg *mp;
+
+ if (chn->call_state != PICA_CALL_STATE_INCOMINGCALL)
+ return PICA_ERRCALLNOTINPROGRESS;
+
+ if ((mp = c2c_writebuf_push(chn, PICA_PROTO_CALLANS, PICA_PROTO_CALLANS_SIZE)))
+ {
+ RAND_pseudo_bytes(mp->tail, 2);
+ }
+ else
+ {
+ return PICA_ERRNOMEM;
+ }
+
+ return PICA_OK;
+}
+
+int PICA_reject_call(struct PICA_c2c *chn)
+{
+ struct PICA_proto_msg *mp;
+
+ if (chn->call_state != PICA_CALL_STATE_INCOMINGCALL)
+ return PICA_ERRCALLNOTINPROGRESS;
+
+ if ((mp = c2c_writebuf_push(chn, PICA_PROTO_CALLREJ, PICA_PROTO_CALLREJ_SIZE)))
+ {
+ RAND_pseudo_bytes(mp->tail, 2);
+ }
+ else
+ {
+ return PICA_ERRNOMEM;
+ }
+
+ return PICA_OK;
+}
+
+int PICA_hangup_call(struct PICA_c2c *chn)
+{
+ struct PICA_proto_msg *mp;
+
+ if (chn->call_state != PICA_CALL_STATE_ACTIVE)
+ return PICA_ERRCALLNOTINPROGRESS;
+
+ if ((mp = c2c_writebuf_push(chn, PICA_PROTO_CALLFIN, PICA_PROTO_CALLFIN_SIZE)))
+ {
+ RAND_pseudo_bytes(mp->tail, 2);
+ }
+ else
+ {
+ return PICA_ERRNOMEM;
+ }
+
+ // release call resources??
+ // handle incoming last stream packets?
+ return PICA_OK;
+}
+
void PICA_close_directc2c(struct PICA_directc2c *d)
{
PICA_TRACEFUNC