Revision
14772
Author
seven
Date
2009-09-05 05:26:02 -0500 (Sat, 05 Sep 2009)

Log Message

Doh

Added Paths

Diff

Added: freeswitch/branches/seven/src/mod/endpoints/mod_skypiax/skypiax_protocol_mac.c (0 => 14772)


--- freeswitch/branches/seven/src/mod/endpoints/mod_skypiax/skypiax_protocol_mac.c	                        (rev 0)
+++ freeswitch/branches/seven/src/mod/endpoints/mod_skypiax/skypiax_protocol_mac.c	2009-09-05 10:26:02 UTC (rev 14772)
@@ -0,0 +1,145 @@
+/* Mac specific functions */  
+
+#define SERVER_PORT 23456 // skypiax proxy
+#define CLIENT_PORT ( (234567 + rand()) % 65536)
+#define BUFFER_SIZE 255  
+#define INVALID_SOCKET -1
+
+extern int proxy_socket;
+
+int proxy_socket_connect() {
+	int client_socket, length = 0;
+	struct sockaddr_in server_addr,client_addr;
+	socklen_t socklen = sizeof(server_addr);
+	char buf[BUFFER_SIZE];
+
+	if ((client_socket = socket(AF_INET,SOCK_STREAM,0)) < 0) {
+		D7("socket error!\n");
+		return INVALID_SOCKET;
+	}
+
+	srand(time(NULL));//initialize random generator
+	bzero(&client_addr,sizeof(client_addr));
+	client_addr.sin_family = AF_INET;
+	client_addr.sin_port = htons(CLIENT_PORT);
+	client_addr.sin_addr.s_addr = htons(INADDR_ANY);
+	bzero(&server_addr,sizeof(server_addr));
+	server_addr.sin_family = AF_INET;
+	inet_aton("127.0.0.1", &server_addr.sin_addr);
+
+	server_addr.sin_port = htons(SERVER_PORT);
+
+	if (bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)) < 0)
+	{
+		D7("bind to port %d failure!\n",CLIENT_PORT);
+		return INVALID_SOCKET;
+	}
+
+	if (connect(client_socket, (struct sockaddr*)&server_addr, socklen) < 0)
+	{
+		printf("can't connect to server \n");
+		return INVALID_SOCKET;
+	}
+
+	length = recv(client_socket, buf, BUFFER_SIZE, 0);
+	if (length < 0)
+	{
+		D7("error recieve data from server!");
+		return INVALID_SOCKET;
+	}
+
+	D7("Read from server: %s \n",buf);
+
+	return client_socket;
+} 
+
+void proxy_socket_disconnect(){ 
+	if (proxy_socket != INVALID_SOCKET) {
+		send(proxy_socket, "/close", 6, 0);
+		close(proxy_socket);
+		proxy_socket = INVALID_SOCKET;
+	}
+}
+
+
+int skypiax_send_message(struct SkypiaxHandles *SkypiaxHandles, const char *message_P)
+{   
+	if (proxy_socket == INVALID_SOCKET ) return 0;
+	return send(proxy_socket, message_P, strlen(message_P) + 1, 0);
+}
+
+int skypiax_signaling_write(private_t * tech_pvt, char *msg_to_skype)
+{
+	struct SkypiaxHandles *SkypiaxHandles;
+
+	DEBUGA_SKYPE("SENDING: |||%s||||\n", SKYPIAX_P_LOG, msg_to_skype);
+
+	SkypiaxHandles = &tech_pvt->SkypiaxHandles;
+
+	if (!skypiax_send_message(SkypiaxHandles, msg_to_skype)) {
+		D7("Sending message failed.\n");
+		return -1;
+	}
+
+	return 0;
+
+}
+
+void *skypiax_do_skypeapi_thread_func(void *obj)
+{
+
+	private_t *tech_pvt = obj;
+
+	struct SkypiaxHandles *SkypiaxHandles; 
+	char buf[512];                     
+
+
+	if (!tech_pvt->tcp_srv_port)
+		tech_pvt->tcp_srv_port = 10160;
+
+	if (!tech_pvt->tcp_cli_port)
+		tech_pvt->tcp_cli_port = 10161;
+
+	if (pipe(tech_pvt->SkypiaxHandles.fdesc)) {
+		fcntl(tech_pvt->SkypiaxHandles.fdesc[0], F_SETFL, O_NONBLOCK);
+		fcntl(tech_pvt->SkypiaxHandles.fdesc[1], F_SETFL, O_NONBLOCK);
+	}
+
+	SkypiaxHandles = &tech_pvt->SkypiaxHandles;            
+
+	running = 0;
+	if ((proxy_socket = proxy_socket_connect() ) != INVALID_SOCKET ) {
+
+		SkypiaxHandles->api_connected = 1;
+		D7("api connected\n");
+		running = 1;  
+	}  
+
+	snprintf(buf, 512, "NAME skypiax");
+
+	if (!skypiax_send_message(SkypiaxHandles, buf)) {
+		ERRORA("Sending message failed\n", SKYPIAX_P_LOG);
+		running = 0;
+		return NULL;
+	}
+
+
+	while (running) {
+		int length = recv(proxy_socket, buf, 128, 0);
+		if (length > 0) {                                         
+			length = length > 127 ? 127 : length;
+			buf[length++] = '\0';
+
+			D7("Read From Proxy: %s\n", buf)
+				write(SkypiaxHandles->fdesc[1], buf, length);
+		} else {
+			D7("=============Socket Broken? %d=============\n", proxy_socket);
+			running = 0;
+			break;
+		}
+
+	}
+	proxy_socket_disconnect();
+	return NULL;
+
+}
\ No newline at end of file