]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
step towards building on windows again.
authorMichael Jerris <mike@jerris.com>
Fri, 18 May 2007 05:33:19 +0000 (05:33 +0000)
committerMichael Jerris <mike@jerris.com>
Fri, 18 May 2007 05:33:19 +0000 (05:33 +0000)
git-svn-id: http://svn.openzap.org/svn/openzap/trunk@27 a93c3328-9c30-0410-af19-c9cd2b2d52af

libs/freetdm/openzap.vcproj
libs/freetdm/src/include/openzap.h
libs/freetdm/src/include/zap_wanpipe_windows.h [new file with mode: 0644]
libs/freetdm/src/zap_wanpipe.c

index 2cae0acfcedd2ef5e02379c301cf0177a22ac0c8..bdcaead1226d8d85693cf45f61152ba466700edf 100644 (file)
@@ -20,7 +20,7 @@
                        OutputDirectory="$(SolutionDir)$(ConfigurationName)"\r
                        IntermediateDirectory="$(ConfigurationName)"\r
                        ConfigurationType="4"\r
-                       CharacterSet="1"\r
+                       CharacterSet="2"\r
                        >\r
                        <Tool\r
                                Name="VCPreBuildEventTool"\r
@@ -87,7 +87,7 @@
                        OutputDirectory="$(SolutionDir)$(ConfigurationName)"\r
                        IntermediateDirectory="$(ConfigurationName)"\r
                        ConfigurationType="4"\r
-                       CharacterSet="1"\r
+                       CharacterSet="2"\r
                        WholeProgramOptimization="1"\r
                        >\r
                        <Tool\r
                        <File\r
                                RelativePath=".\src\zap_skel.c"\r
                                >\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       ExcludedFromBuild="true"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       ExcludedFromBuild="true"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                       />\r
+                               </FileConfiguration>\r
                        </File>\r
                        <File\r
                                RelativePath=".\src\zap_wanpipe.c"\r
                        <File\r
                                RelativePath=".\src\zap_zt.c"\r
                                >\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       ExcludedFromBuild="true"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       ExcludedFromBuild="true"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                       />\r
+                               </FileConfiguration>\r
                        </File>\r
                </Filter>\r
                <Filter\r
                                RelativePath=".\src\include\zap_wanpipe.h"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath=".\src\include\zap_wanpipe_windows.h"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath=".\src\include\zap_zt.h"\r
                                >\r
index 5626df6adc0fc53e857bbb50e3945ab604f7b3fa..4ee1e3a6fe2e6c2c014ac08d66a29fde41c509e1 100644 (file)
 
 #define _XOPEN_SOURCE 500
 
+#ifndef HAVE_STRINGS_H
+#define HAVE_STRINGS_H 1
+#endif
+#ifndef HAVE_SYS_SOCKET_H
+#define HAVE_SYS_SOCKET_H 1
+#endif
+
+#ifndef __WINDOWS__
+#if defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32)
+#define __WINDOWS__
+#endif
+#endif
+
 #ifdef _MSC_VER
 #if (_MSC_VER >= 1400)                 /* VC8+ */
 #ifndef _CRT_SECURE_NO_DEPRECATE
 #ifndef snprintf
 #define snprintf _snprintf
 #endif
+#undef HAVE_STRINGS_H
+#undef HAVE_SYS_SOCKET_H
+/* disable warning for zero length array in a struct */
+/* this will cause errors on c99 and ansi compliant compilers and will need to be fixed in the wanpipe header files */
+#pragma warning(disable:4706)
 #endif
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#ifndef _MSC_VER
+#ifdef HAVE_STRINGS_H
 #include <strings.h>
 #endif
 #include <assert.h>
diff --git a/libs/freetdm/src/include/zap_wanpipe_windows.h b/libs/freetdm/src/include/zap_wanpipe_windows.h
new file mode 100644 (file)
index 0000000..d5773da
--- /dev/null
@@ -0,0 +1,363 @@
+/*****************************************************************************\r
+ * win_api_common.h    Windows Sangoma API Code Library\r
+ *\r
+ * Author(s):  David Rokhvarg <davidr@sangoma.com>\r
+ *\r
+ * Copyright:  (c) 1984-2006 Sangoma Technologies Inc.\r
+ *\r
+ * ============================================================================\r
+ */\r
+\r
+#ifndef _WIN_API_COMMON_H\r
+#define _WIN_API_COMMON_H\r
+\r
+#define DEV_NAME_LEN   100
+char device_name[DEV_NAME_LEN];
+
+/* IOCTL management structures and variables*/
+wan_udp_hdr_t  wan_udp;
+
+static wan_cmd_api_t api_cmd;
+static api_tx_hdr_t *tx_hdr = (api_tx_hdr_t *)api_cmd.data;\r
+\r
+/* keeps the LAST (and single) event received */\r
+static wp_tdm_api_rx_hdr_t last_tdm_api_event_buffer;\r
+\r
+static \r
+int \r
+tdmv_api_ioctl(\r
+       HANDLE fd, \r
+       wanpipe_tdm_api_cmd_t *tdm_api_cmd\r
+       )\r
+{\r
+       DWORD                   ln;\r
+    unsigned char      id = 0;\r
+       int                             err = 0;\r
+\r
+       wan_udp.wan_udphdr_request_reply = 0x01;\r
+       wan_udp.wan_udphdr_id                    = id;\r
+       wan_udp.wan_udphdr_return_code   = WAN_UDP_TIMEOUT_CMD;\r
+\r
+       wan_udp.wan_udphdr_command      = WAN_TDMV_API_IOCTL;\r
+       wan_udp.wan_udphdr_data_len     = sizeof(wanpipe_tdm_api_cmd_t);\r
+\r
+       //copy data from caller's buffer to driver's buffer\r
+       memcpy( wan_udp.wan_udphdr_data, \r
+                       (void*)tdm_api_cmd,\r
+                       sizeof(wanpipe_tdm_api_cmd_t));\r
+\r
+       if(DeviceIoControl(\r
+                       fd,\r
+                       IoctlManagementCommand,\r
+                       (LPVOID)&wan_udp,\r
+                       sizeof(wan_udp_hdr_t),\r
+                       (LPVOID)&wan_udp,\r
+                       sizeof(wan_udp_hdr_t),\r
+                       (LPDWORD)(&ln),\r
+                       (LPOVERLAPPED)NULL\r
+                       ) == FALSE){\r
+               //actual ioctl failed\r
+               err = 1;\r
+               return err;\r
+       }else{\r
+               err = 0;\r
+       }\r
+\r
+       if(wan_udp.wan_udphdr_return_code != WAN_CMD_OK){\r
+               //ioctl ok, but command failed\r
+               return 2;\r
+       }\r
+\r
+       //copy data from driver's buffer to caller's buffer\r
+       memcpy( (void*)tdm_api_cmd,\r
+                       wan_udp.wan_udphdr_data, \r
+                       sizeof(wanpipe_tdm_api_cmd_t));\r
+       return 0;\r
+}\r
+\r
+static \r
+int \r
+wanpipe_api_ioctl(\r
+       HANDLE fd,\r
+       wan_cmd_api_t *api_cmd\r
+       )\r
+{\r
+       DWORD                   ln;\r
+    unsigned char      id = 0;\r
+       int                             err = 0;\r
+\r
+       wan_udp.wan_udphdr_request_reply = 0x01;\r
+       wan_udp.wan_udphdr_id                    = id;\r
+       wan_udp.wan_udphdr_return_code   = WAN_UDP_TIMEOUT_CMD;\r
+\r
+       wan_udp.wan_udphdr_command      = SIOC_WANPIPE_API;\r
+       wan_udp.wan_udphdr_data_len     = sizeof(wan_cmd_api_t);\r
+\r
+       //copy data from caller's buffer to driver's buffer\r
+       memcpy( wan_udp.wan_udphdr_data, \r
+                       (void*)api_cmd,\r
+                       sizeof(wan_cmd_api_t));\r
+\r
+       if(DeviceIoControl(\r
+                       fd,\r
+                       IoctlManagementCommand,\r
+                       (LPVOID)&wan_udp,\r
+                       sizeof(wan_udp_hdr_t),\r
+                       (LPVOID)&wan_udp,\r
+                       sizeof(wan_udp_hdr_t),\r
+                       (LPDWORD)(&ln),\r
+                       (LPOVERLAPPED)NULL\r
+                       ) == FALSE){\r
+               err = 1;\r
+               return err;\r
+       }else{\r
+               err = 0;\r
+       }\r
+\r
+       if(wan_udp.wan_udphdr_return_code != WAN_CMD_OK){\r
+               return 2;\r
+       }\r
+\r
+       //copy data from driver's buffer to caller's buffer\r
+       memcpy( (void*)api_cmd,\r
+                       wan_udp.wan_udphdr_data, \r
+                       sizeof(wan_cmd_api_t));\r
+       return 0;\r
+}\r
+\r
+// Blocking read command. If used after DoApiPollCommand(),\r
+// it will return immediatly, without blocking.\r
+static \r
+USHORT \r
+DoReadCommand(\r
+       HANDLE drv, \r
+       RX_DATA_STRUCT * pRx\r
+       )\r
+{\r
+       DWORD ln;\r
+\r
+       if (DeviceIoControl(\r
+                       drv,\r
+                       IoctlReadCommand,\r
+                       (LPVOID)NULL,\r
+                       0L,\r
+                       (LPVOID)pRx,\r
+                       sizeof(RX_DATA_STRUCT),\r
+                       (LPDWORD)(&ln),\r
+                       (LPOVERLAPPED)NULL\r
+                       ) == FALSE){\r
+               //check messages log\r
+               return 1;\r
+       }else{\r
+               return 0;\r
+       }\r
+}\r
+\r
+// Blocking write command. If used after DoApiPollCommand(),\r
+// it will return immediatly, without blocking.\r
+static\r
+UCHAR \r
+DoWriteCommand(\r
+       HANDLE drv, \r
+       TX_DATA_STRUCT * pTx\r
+       )\r
+{\r
+       DWORD ln;\r
+\r
+       if(DeviceIoControl(\r
+                       drv,\r
+                       IoctlWriteCommand,\r
+                       (LPVOID)pTx,\r
+                       (ULONG)sizeof(TX_DATA_STRUCT),\r
+                       (LPVOID)pTx,\r
+                       sizeof(TX_DATA_STRUCT),\r
+                       (LPDWORD)(&ln),\r
+                       (LPOVERLAPPED)NULL\r
+                       ) == FALSE){\r
+               return 1;\r
+       }else{\r
+               return 0;\r
+       }\r
+}\r
+\r
+// Blocking API Poll command.\r
+static\r
+USHORT \r
+DoApiPollCommand(\r
+       HANDLE drv, \r
+       API_POLL_STRUCT *api_poll_ptr\r
+       )\r
+{\r
+       DWORD ln;\r
+\r
+       if (DeviceIoControl(\r
+                       drv,\r
+                       IoctlApiPoll,\r
+                       (LPVOID)NULL,\r
+                       0L,\r
+                       (LPVOID)api_poll_ptr,\r
+                       sizeof(API_POLL_STRUCT),\r
+                       (LPDWORD)(&ln),\r
+                       (LPOVERLAPPED)NULL\r
+                                               ) == FALSE){\r
+               return 1;\r
+       }else{\r
+               return 0;\r
+       }\r
+}\r
+\r
+static\r
+int \r
+DoManagementCommand(\r
+       HANDLE drv, \r
+       wan_udp_hdr_t* wan_udp\r
+       )\r
+{\r
+       DWORD ln;\r
+    static unsigned char id = 0;\r
+\r
+       wan_udp->wan_udphdr_request_reply = 0x01;\r
+       wan_udp->wan_udphdr_id = id++;\r
+       wan_udp->wan_udphdr_return_code = WAN_UDP_TIMEOUT_CMD;\r
+\r
+       if(DeviceIoControl(\r
+                       drv,\r
+                       IoctlManagementCommand,\r
+                       (LPVOID)wan_udp,\r
+                       sizeof(wan_udp_hdr_t),\r
+                       (LPVOID)wan_udp,\r
+                       sizeof(wan_udp_hdr_t),\r
+                       (LPDWORD)(&ln),\r
+                       (LPOVERLAPPED)NULL\r
+                                               ) == FALSE){\r
+               return 1;\r
+       }else{\r
+               return 0;\r
+       }\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////\r
+//\r
+//structures and definitions used for queueing data\r
+//\r
+typedef struct\r
+{\r
+       void*                           previous;\r
+       TX_RX_DATA_STRUCT       tx_rx_data;\r
+}api_queue_element_t;\r
+\r
+#define API_Q_MUTEX_TIMEOUT    1000//1 second\r
+#define API_Q_MAX_SIZE         100//optimal length. for short data may need longer queue\r
+\r
+enum API_Q_STATUS{\r
+       API_Q_SUCCESS=0,\r
+       API_Q_GEN_FAILURE,\r
+       API_Q_MEM_ALLOC_FAILURE,\r
+       API_Q_FULL,\r
+       API_Q_EMPTY\r
+};\r
+\r
+typedef struct\r
+{\r
+       //number of nodes in the list\r
+       USHORT size;\r
+       //insert at tail\r
+       api_queue_element_t * tail;\r
+       //remove from head\r
+       api_queue_element_t * head;\r
+       //mutex for synchronizing access to the queue\r
+       HANDLE api_queue_mutex;\r
+}api_queue_t;\r
+\r
+\r
+static __inline int api_enqueue(       api_queue_t* api_queue, \r
+                                                                       unsigned char * buffer,\r
+                                                                       unsigned short length)\r
+{\r
+       api_queue_element_t *element;\r
+       DWORD                           mresult;\r
+\r
+       mresult = WaitForSingleObject(api_queue->api_queue_mutex, API_Q_MUTEX_TIMEOUT);\r
+       if (mresult != WAIT_OBJECT_0) {\r
+               return API_Q_GEN_FAILURE;\r
+       }\r
+\r
+       if(api_queue->size == API_Q_MAX_SIZE){\r
+               ReleaseMutex(api_queue->api_queue_mutex);\r
+               return API_Q_FULL;\r
+       }\r
+\r
+       element = malloc(sizeof(api_queue_element_t));\r
+       if(element == NULL){\r
+               ReleaseMutex(api_queue->api_queue_mutex);\r
+               return API_Q_MEM_ALLOC_FAILURE;\r
+       }\r
+\r
+       //now copy everything in to the element\r
+       memcpy(element->tx_rx_data.data, buffer, length);\r
+       \r
+       element->tx_rx_data.api_header.data_length = length;\r
+       element->tx_rx_data.api_header.operation_status = SANG_STATUS_TX_TIMEOUT;\r
+\r
+       //insert element at the tail of the queue\r
+       element->previous = NULL;\r
+\r
+       if(api_queue->size == 0){\r
+               //special case of a previously empty queue\r
+               api_queue->head = element;\r
+               api_queue->tail = element;\r
+       }else{\r
+               api_queue->tail->previous = element;\r
+               api_queue->tail = element;\r
+       }\r
+       api_queue->size++;\r
+       ReleaseMutex(api_queue->api_queue_mutex);\r
+       return API_Q_SUCCESS;\r
+}\r
+\r
+static __inline int api_dequeue(       api_queue_t* api_queue,\r
+                                                                                       TX_RX_DATA_STRUCT* destination)\r
+{\r
+       api_queue_element_t *element;\r
+       DWORD                           mresult;\r
+\r
+       mresult = WaitForSingleObject(api_queue->api_queue_mutex, API_Q_MUTEX_TIMEOUT);\r
+       if (mresult != WAIT_OBJECT_0) {\r
+               return API_Q_GEN_FAILURE;\r
+       }\r
+\r
+       if(api_queue->size == 0){\r
+               //tx queue is empty\r
+               ReleaseMutex(api_queue->api_queue_mutex);\r
+               return API_Q_EMPTY;\r
+       }\r
+\r
+       //remove from the head of the queue\r
+       element = api_queue->head;\r
+       api_queue->head = element->previous;\r
+\r
+       //now copy everything in to the user buffer\r
+       memcpy(destination, &element->tx_rx_data, sizeof(TX_DATA_STRUCT));\r
+\r
+       free(element);\r
+       api_queue->size--;\r
+       if(api_queue->size == 0){\r
+               api_queue->head = NULL;\r
+               api_queue->tail = NULL;\r
+       }\r
+       ReleaseMutex(api_queue->api_queue_mutex);\r
+       return API_Q_SUCCESS;\r
+}\r
+\r
+//remove all elements from the queue\r
+static __inline void empty_api_queue(api_queue_t* api_queue)\r
+{\r
+       TX_DATA_STRUCT tx_rx_data;\r
+\r
+       while(api_dequeue(api_queue, &tx_rx_data) == 0){\r
+               ;\r
+       }\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////\r
+#endif /* _WIN_API_COMMON_H */\r
index 53ce0cc9d08a4375761c633920352bc48eb6ec09..55c037d25a7c4b531c01eed90452c86da07407f7 100644 (file)
 
 #define WANPIPE_TDM_API 1
 
-#ifndef __WINDOWS__
-#if defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32)
-#define __WINDOWS__
-#endif
-#endif
-
 #include "openzap.h"
 #include "zap_wanpipe.h"
 
 #pragma warning(disable:4200 4201 4214)
 #endif
 #include <windows.h>
-#include <winioctl.h>
-#include <conio.h>
-#include <stddef.h>
-typedef unsigned __int16 u_int16_t;
-typedef unsigned __int32 u_int32_t;
+#define FNAME_LEN      50
+#define WP_INVALID_SOCKET INVALID_HANDLE_VALUE
+#else
+#define WP_INVALID_SOCKET -1
 #endif
 
 #include <wanpipe_defines.h>
 #include <wanpipe_cfg.h>
 #include <wanpipe_tdm_api.h>
+#include <sdla_te1_pmc.h>
 #ifdef __WINDOWS__
 #include <sang_status_defines.h>
 #include <sang_api.h>
 #endif
-#include <sdla_te1_pmc.h>
-#include <sdla_te1.h>
-#include <sdla_56k.h>
-#include <sdla_remora.h>
-#include <sdla_te3.h>  
-#include <sdla_front_end.h>
 #include <sdla_aft_te1.h>
+
+#ifdef HAVE_SYS_SOCKET_H
 #include <sys/socket.h>
+#endif
+
+#if defined(__WINDOWS__)
+#include <zap_wanpipe_windows.h>
+#endif
+
 
 static zap_software_interface_t wanpipe_interface;
 
@@ -96,6 +92,10 @@ static zap_socket_t wp_open_device(int span, int chan)
 
        fd = open(fname, O_RDWR);
 
+       if (fd < 0) {
+               fd = WP_INVALID_SOCKET;
+       }
+
        return fd;  
 #endif
 }            
@@ -106,11 +106,11 @@ static unsigned wp_open_range(zap_span_t *span, unsigned spanno, unsigned start,
 
        for(x = start; x < end; x++) {
                zap_channel_t *chan;
-               zap_socket_t sockfd = -1;
+               zap_socket_t sockfd = WP_INVALID_SOCKET;
                
                sockfd = wp_open_device(spanno, x);
                
-               if (sockfd > -1 && zap_span_add_channel(span, sockfd, type, &chan) == ZAP_SUCCESS) {
+               if (sockfd != WP_INVALID_SOCKET && zap_span_add_channel(span, sockfd, type, &chan) == ZAP_SUCCESS) {
                        zap_log(ZAP_LOG_INFO, "configuring device s%dc%d as OpenZAP device %d:%d fd:%d\n", spanno, x, chan->span_id, chan->chan_id, sockfd);
                        configured++;
                } else {
@@ -129,7 +129,6 @@ static unsigned wp_configure_channel(zap_config_t *cfg, const char *str, zap_spa
        int channo;
        int spanno;
        int top = 0;
-       int x;
        unsigned configured = 0;
 
        assert(str != NULL);
@@ -380,6 +379,8 @@ static ZINT_WAIT_FUNCTION(wanpipe_wait)
 
 }
 
+#ifndef __WINDOWS__
+
 static ZINT_READ_FUNCTION(wanpipe_read_unix)
 {
        int rx_len = 0;
@@ -416,17 +417,6 @@ static ZINT_READ_FUNCTION(wanpipe_read_unix)
        return ZAP_SUCCESS;
 }
 
-static ZINT_READ_FUNCTION(wanpipe_read)
-{
-       ZINT_READ_MUZZLE;
-       
-#ifndef WIN32
-       return wanpipe_read_unix(zchan, data, datalen);
-#endif
-       
-       return ZAP_FAIL;
-}
-
 static ZINT_WRITE_FUNCTION(wanpipe_write_unix)
 {
        int bsent;
@@ -455,6 +445,19 @@ static ZINT_WRITE_FUNCTION(wanpipe_write_unix)
 
 }
 
+#endif
+
+static ZINT_READ_FUNCTION(wanpipe_read)
+{
+       ZINT_READ_MUZZLE;
+       
+#ifndef WIN32
+       return wanpipe_read_unix(zchan, data, datalen);
+#endif
+       
+       return ZAP_FAIL;
+}
+
 static ZINT_WRITE_FUNCTION(wanpipe_write)
 {
        ZINT_WRITE_MUZZLE;