3b7291cf297564f25a91e718cc8e1c76691ee29c
[lcr.git] / joinremote.cpp
1 /*****************************************************************************\
2 **                                                                           **
3 ** Linux Call Router                                                         **
4 **                                                                           **
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg                                              **
7 **                                                                           **
8 ** join functions for remote application                                     **
9 **                                                                           **
10 \*****************************************************************************/ 
11
12 #include <stdio.h>
13 #include <string.h>
14 #include <stdlib.h>
15 //#include <unistd.h>
16 //#include <poll.h>
17 //#include <sys/types.h>
18 //#include <sys/stat.h>
19 //#include <fcntl.h>
20 #include "main.h"
21 //#define __u8 unsigned char
22 //#define __u16 unsigned short
23 //#define __u32 unsigned long
24 //#include "linux/isdnif.h"
25
26
27 /*
28  * constructor for a new join 
29  * the join will have a relation to the calling endpoint
30  */
31 JoinRemote::JoinRemote(unsigned long serial, char *remote_name, int remote_id) : Join()
32 {
33         PDEBUG(DEBUG_JOIN, "Constructor(new join)");
34         union parameter *param;
35
36         SCPY(j_remote_name, remote_name);
37         j_remote_id = remote_id;
38         j_type = JOIN_TYPE_REMOTE;
39
40         j_epoint_id = serial;
41         if (j_epoint_id)
42                 PDEBUG(DEBUG_JOIN, "New remote join connected to endpoint id %lu and application %s\n", j_epoint_id, remote_name);
43
44         /* send new ref to remote socket */
45         memset(&param, 0, sizeof(param));
46         if (admin_message_from_join(j_remote_id, j_serial, MESSAGE_NEWREF, param)<0)
47                 FATAL("No socket with remote application '%s' found, this shall not happen. because we already created one.\n", j_remote_name);
48 }
49
50
51 /*
52  * join descructor
53  */
54 JoinRemote::~JoinRemote()
55 {
56
57 }
58
59
60 /* join process is called from the main loop
61  * it processes the current calling state.
62  * returns 0 if join nothing was done
63  */
64 int JoinRemote::handler(void)
65 {
66         return(0);
67 }
68
69
70 void JoinRemote::message_epoint(unsigned long epoint_id, int message_type, union parameter *param)
71 {
72         /* if endpoint has just been removed, but still a message in the que */
73         if (epoint_id != j_epoint_id)
74                 return;
75         
76         /* look for Remote's interface */
77         if (admin_message_from_join(j_remote_id, j_serial, message_type, param)<0)
78         {
79                 PERROR("No socket with remote application '%s' found, this shall not happen. Closing socket shall cause release of all joins.\n", j_remote_name);
80                 return;         
81         }
82
83         if (message_type == MESSAGE_RELEASE)
84         {
85                 delete this;
86                 return;
87         }
88 }
89
90 void JoinRemote::message_remote(unsigned long ref, int message_type, union parameter *param)
91 {
92         struct message *message;
93
94         /* create relation if no relation exists */
95         if (!j_epoint_id)
96         {
97                 class Endpoint          *epoint;
98
99                 if (!(epoint = new Endpoint(0, j_serial, ref)))
100                         FATAL("No memory for Endpoint instance\n");
101                 if (!(epoint->ep_app = new DEFAULT_ENDPOINT_APP(epoint)))
102                         FATAL("No memory for Endpoint Application instance\n");
103         }
104
105         message = message_create(j_serial, j_epoint_id, JOIN_TO_EPOINT, message_type);
106         memcpy(&message->param, param, sizeof(message->param));
107         message_put(message);
108
109         if (message_type == MESSAGE_RELEASE)
110         {
111                 delete this;
112                 return;
113         }
114 }
115
116
117