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