aboutsummaryrefslogtreecommitdiffstats
path: root/apps/app_url.c
blob: 6cae9eb9b6fc757082370b0aa67c4d81ba96604d (plain)
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
/*
 * Asterisk -- A telephony toolkit for Linux.
 *
 * App to transmit a URL
 * 
 * Copyright (C) 1999, Mark Spencer
 *
 * Mark Spencer <markster@linux-support.net>
 *
 * This program is free software, distributed under the terms of
 * the GNU General Public License
 */
 
#include <asterisk/lock.h>
#include <asterisk/file.h>
#include <asterisk/logger.h>
#include <asterisk/channel.h>
#include <asterisk/pbx.h>
#include <asterisk/module.h>
#include <asterisk/translate.h>
#include <asterisk/image.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>

static char *tdesc = "Send URL Applications";

static char *app = "SendURL";

static char *synopsis = "Send a URL";

static char *descrip = 
"  SendURL(URL[|option]): Requests client go to URL.  If the client\n"
"does not support html transport, and  there  exists  a  step  with\n"
"priority  n + 101,  then  execution  will  continue  at that step.\n"
"Otherwise, execution will continue at  the  next  priority  level.\n"
"SendURL only returns 0  if  the  URL  was  sent  correctly  or  if\n"
"the channel  does  not  support HTML transport,  and -1 otherwise.\n"
"If the option 'wait' is  specified,  execution  will  wait  for an\n"
"acknowledgement that  the  URL  has  been loaded before continuing\n"
"and will return -1 if the peer is unable to load the URL\n";

STANDARD_LOCAL_USER;

LOCAL_USER_DECL;

static int sendurl_exec(struct ast_channel *chan, void *data)
{
	int res = 0;
	struct localuser *u;
	char tmp[256];
	char *options;
	int option_wait=0;
	struct ast_frame *f;
	char *stringp=NULL;
	if (!data || !strlen((char *)data)) {
		ast_log(LOG_WARNING, "SendURL requires an argument (URL)\n");
		return -1;
	}
	strncpy(tmp, (char *)data, sizeof(tmp)-1);
	stringp=tmp;
	strsep(&stringp, "|");
	options = strsep(&stringp, "|");
	if (options && !strcasecmp(options, "wait"))
		option_wait = 1;
	LOCAL_USER_ADD(u);
	if (!ast_channel_supports_html(chan)) {
		/* Does not support transport */
		if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->callerid))
			chan->priority += 100;
		LOCAL_USER_REMOVE(u);
		return 0;
	}
	res = ast_channel_sendurl(chan, tmp);
	if (res > -1) {
		if (option_wait) {
			for(;;) {
				/* Wait for an event */
				res = ast_waitfor(chan, -1);
				if (res < 0) 
					break;
				f = ast_read(chan);
				if (!f) {
					res = -1;
					break;
				}
				if (f->frametype == AST_FRAME_HTML) {
					switch(f->subclass) {
					case AST_HTML_LDCOMPLETE:
						res = 0;
						ast_frfree(f);
						goto out;
						break;
					case AST_HTML_NOSUPPORT:
						/* Does not support transport */
						if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->callerid))
							chan->priority += 100;
						res = 0;
						goto out;
						break;
					default:
						ast_log(LOG_WARNING, "Don't know what to do with HTML subclass %d\n", f->subclass);
					};
				}
				ast_frfree(f);
			}
		}
	}
out:	
	LOCAL_USER_REMOVE(u);
	return res;
}

int unload_module(void)
{
	STANDARD_HANGUP_LOCALUSERS;
	return ast_unregister_application(app);
}

int load_module(void)
{
	return ast_register_application(app, sendurl_exec, synopsis, descrip);
}

char *description(void)
{
	return tdesc;
}

int usecount(void)
{
	int res;
	STANDARD_USECOUNT(res);
	return res;
}

char *key()
{
	return ASTERISK_GPL_KEY;
}