File: sig_telephone.c

package info (click to toggle)
faumachine 20180503-4
  • links: PTS
  • area: main
  • in suites: bullseye, buster, sid
  • size: 61,272 kB
  • sloc: ansic: 272,290; makefile: 6,199; asm: 4,251; sh: 3,022; perl: 886; xml: 563; pascal: 311; lex: 214; vhdl: 204
file content (143 lines) | stat: -rw-r--r-- 2,356 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
 * Copyright (C) 2004-2009 FAUmachine Team <info@faumachine.org>.
 * This program is free software. You can redistribute it and/or modify it
 * under the terms of the GNU General Public License, either version 2 of
 * the License, or (at your option) any later version. See COPYING.
 */

#include "config.h"

#include <assert.h>
#include <stdio.h>

#include "glue.h"

#include "sig_telephone.h"

void
sig_telephone_send_data(
	const struct sig_telephone* b,
	void *s, 
	uint8_t data
) 
{
	unsigned int nr;

	for (nr = 0; ; nr++) {
		if (nr == b->nmembers) {
			return;
		}
		if (b->member[nr].s == s) {
			continue;
		}
		b->member[nr].f->recv_data(b->member[nr].s, data);
	}
}

void
sig_telephone_send_ctrl(
	const struct sig_telephone *b,
	void *s,
	enum sig_telephone_protocol proto
) 
{
	unsigned int nr;

	for (nr = 0; ; nr++) {
		if (nr == b->nmembers) {
			return;
		}
		if (b->member[nr].s == s) {
			continue;
		}
		b->member[nr].f->recv_ctrl(b->member[nr].s, proto);
	}
}

void
sig_telephone_dial(
	const struct sig_telephone *b,
	void *s,
	uint32_t number
)
{
	unsigned int nr;

	for (nr = 0; ; nr++) {
		if (nr == b->nmembers) {
			return;
		}
		if (b->member[nr].s == s) {
			continue;
		}
		b->member[nr].f->recv_dial(b->member[nr].s, number);
	}
}

void
sig_telephone_connect(
	struct sig_telephone *b,
	void *s,
	const struct sig_telephone_funcs *f
)
{
	assert(b);
	assert(b->type == SIG_GEN_TELEPHONE);
	assert(b->nmembers < sizeof(b->member) / sizeof(b->member[0]));

	b->member[b->nmembers].s = s;
	b->member[b->nmembers].f = f;
	b->nmembers++;
}

struct sig_telephone_merge *
sig_telephone_merge(struct sig_telephone *s0, struct sig_telephone *s1)
{
	fixme();
	return NULL;
}

void
sig_telephone_split(struct sig_telephone_merge *m)
{
	fixme();
}

struct sig_telephone *
sig_telephone_create(const char *name)
{
	struct sig_telephone *b;

	b = shm_alloc(sizeof(*b));
	assert(b);

	b->type = SIG_GEN_TELEPHONE;
	b->nmembers = 0;

	return b;
}

void
sig_telephone_destroy(struct sig_telephone *sig)
{
	assert(sig);
	assert(sig->type == SIG_GEN_TELEPHONE);

	shm_free(sig);
}

void
sig_telephone_suspend(struct sig_telephone *b, FILE *fSig)
{
	size_t size = sizeof(*b);
	
	generic_suspend(b, size, fSig);
}

void
sig_telephone_resume(struct sig_telephone *b, FILE *fSig)
{
	size_t size = sizeof(*b);
	
	generic_resume(b, size, fSig);
}