fix
[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; /* this is the endpoint, if created by epoint */
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         /* the j_serial is assigned by Join() parent. this is sent as new ref */
47         if (admin_message_from_join(j_remote_id, j_serial, MESSAGE_NEWREF, param)<0)
48                 FATAL("No socket with remote application '%s' found, this shall not happen. because we already created one.\n", j_remote_name);
49 }
50
51
52 /*
53  * join descructor
54  */
55 JoinRemote::~JoinRemote()
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(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)))
100                         FATAL("No memory for Endpoint instance\n");
101                 j_epoint_id = epoint->ep_serial;
102                 if (!(epoint->ep_app = new DEFAULT_ENDPOINT_APP(epoint)))
103                         FATAL("No memory for Endpoint Application instance\n");
104         }
105
106         /* set serial on bchannel message
107          * also ref is given, so we send message with ref */
108         if (message_type == MESSAGE_BCHANNEL)
109         {
110                 message_bchannel_from_join(this, param->bchannel.type, param->bchannel.addr);
111                 return;
112         }
113         
114         /* cannot just forward, because param is not of container "struct message" */
115         message = message_create(j_serial, j_epoint_id, JOIN_TO_EPOINT, message_type);
116         memcpy(&message->param, param, sizeof(message->param));
117         message_put(message);
118
119         if (message_type == MESSAGE_RELEASE)
120         {
121                 delete this;
122                 return;
123         }
124 }
125
126 void message_bchannel_to_join(unsigned long remote_id, unsigned long ref, int type, unsigned long addr)
127 {
128         union parameter param;
129
130         memset(&param, 0, sizeof(union parameter));
131         param.bchannel.type = type;
132         param.bchannel.addr = addr;
133         if (admin_message_from_join(remote_id, ref, MESSAGE_BCHANNEL, &param)<0)
134         {
135                 PERROR("No socket with remote id %d found, this happens, if the socket is closed before all bchannels are imported.\n", remote_id);
136                 return;         
137         }
138 }
139
140
141