diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ed8b864 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +################################################################################ +# This .gitignore file was automatically created by Microsoft(R) Visual Studio. +################################################################################ + +/.vs +/out +/temp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..297d28b --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,36 @@ +# ITNOA +# CMakeList.txt : CMake project for SipCmd, include source and define +# project specific logic here. +# +cmake_minimum_required (VERSION 3.8) + +project ("SipCmd" VERSION 1.0 LANGUAGES CXX) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") + +set(PTLib_USE_STATIC_LIBS 1) +find_package(PTLib REQUIRED) + +set(OPAL_USE_STATIC_LIBS 1) +find_package(OPAL REQUIRED) + +# Add source to this project's library. +add_library(SipCmdLib "src/commands.cpp" "src/channels.cpp") + +target_include_directories(SipCmdLib PUBLIC ${PTLIB_INCLUDE_DIRS}) +target_link_libraries(SipCmdLib PRIVATE ${PTLIB_LIBRARIES}) + +target_include_directories(SipCmdLib PUBLIC ${OPAL_INCLUDE_DIRS}) +target_link_libraries(SipCmdLib PRIVATE ${OPAL_LIBRARIES}) + +# Add source to this project's executable. +add_executable (SipCmd "src/main.cpp") + +target_link_libraries(SipCmd PRIVATE SipCmdLib) +message(${PTLIB_INCLUDE_DIRS}) + +if (CMAKE_VERSION VERSION_GREATER 3.10) + set_property(TARGET SipCmdLib PROPERTY CXX_STANDARD 14) + set_property(TARGET SipCmd PROPERTY CXX_STANDARD 14) +endif() + +# TODO: Add tests and install targets if needed. diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000..dd02e97 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,108 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "all-base", + "hidden": true, + "toolchainFile": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" + }, + { + "name": "windows-base", + "inherits": "all-base", + "hidden": true, + "generator": "Ninja", + "binaryDir": "${sourceDir}/out/build/${presetName}", + "installDir": "${sourceDir}/out/install/${presetName}", + "cacheVariables": { + "CMAKE_C_COMPILER": "cl.exe", + "CMAKE_CXX_COMPILER": "cl.exe" + }, + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Windows" + } + }, + { + "name": "x64-debug", + "displayName": "x64 Debug", + "inherits": "windows-base", + "architecture": { + "value": "x64", + "strategy": "external" + }, + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + } + }, + { + "name": "x64-release", + "displayName": "x64 Release", + "inherits": "x64-debug", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release" + } + }, + { + "name": "x86-debug", + "displayName": "x86 Debug", + "inherits": "windows-base", + "architecture": { + "value": "x86", + "strategy": "external" + }, + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + } + }, + { + "name": "x86-release", + "displayName": "x86 Release", + "inherits": "x86-debug", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release" + } + }, + { + "name": "linux-debug", + "inherits": "all-base", + "displayName": "Linux Debug", + "generator": "Ninja", + "binaryDir": "${sourceDir}/out/build/${presetName}", + "installDir": "${sourceDir}/out/install/${presetName}", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + }, + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Linux" + }, + "vendor": { + "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": { + "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}" + } + } + }, + { + "name": "macos-debug", + "displayName": "macOS Debug", + "generator": "Ninja", + "binaryDir": "${sourceDir}/out/build/${presetName}", + "installDir": "${sourceDir}/out/install/${presetName}", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + }, + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Darwin" + }, + "vendor": { + "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": { + "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}" + } + } + } + ] +} diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100644 index 0000000..a8d0f6b --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,2 @@ +echo "export VCPKG_ROOT=~/vcpkg" >> ~/.env +source ~/.env \ No newline at end of file diff --git a/cmake/Modules/FindOPAL.cmake b/cmake/Modules/FindOPAL.cmake new file mode 100644 index 0000000..23c3346 --- /dev/null +++ b/cmake/Modules/FindOPAL.cmake @@ -0,0 +1,161 @@ +#------------------------------------------------------------------------------------ +# ITNOA +# +# This file is based on https://github.com/snikulov/cmake-modules +# +# Locate OPAL library (http://www.opalvoip.org/) +# This module defines +# OPAL_FOUND, if false, do not try to link to OPAL +# OPAL_LIBRARIES +# OPAL_INCLUDE_DIRS, where to find opal headers +# +# 2013/03/19 - aagenosov +# Module created +# 2013/03/21 - aagenosov +# Added macro to define version of OPAL +# 2015/08/13 - snikulov +# Added linux support +#------------------------------------------------------------------------------------- + +# get version macro +# first param - path to include +macro(opal_get_version _include_PATH version) + if (EXISTS "${_include_PATH}/opal/buildopts.h") + file(STRINGS "${_include_PATH}/opal/buildopts.h" _VER_STRING_AUX REGEX ".*#define[ ]+OPAL_VERSION[ ]+") + else() + file(STRINGS "${_include_PATH}/opal_config.h" _VER_STRING_AUX REGEX ".*#define[ ]+OPAL_VERSION[ ]+") + endif() + string(REGEX MATCHALL "[0-9]+[.][0-9]+[.][0-9]+" ${version} "${_VER_STRING_AUX}") +endmacro() + +find_package(PTLib REQUIRED) + +include(FindPkgConfig) +PKG_CHECK_MODULES(PC_OPAL "opal") + +find_path(OPAL_INCLUDE_DIRS opal.h + PATHS + ${PC_OPAL_INCLUDE_DIRS} + /usr/local/include + /usr/include + /opt/local/include + /opt/csw/include + /opt/include + $ENV{OPAL_DIR}/include + ${OPAL_DIR}/include + ) + +if(PC_OPAL_FOUND) + + set(OPAL_VERSION ${PC_OPAL_VERSION}) + set(OPAL_INCLUDE_DIRS ${PC_OPAL_INCLUDE_DIRS}) + + find_library(OPAL_LIBRARIES + NAMES ${PC_OPAL_LIBRARIES} + PATH ${PC_OPAL_LIBRARY_DIRS}) + +else() + + if(OPAL_USE_STATIC_LIBS) + set(opal_postfix "${opal_postfix}S") + endif() + + set(OPAL_NAME_RELEASE "opal${opal_postfix}") + set(OPAL_NAME_DEBUG "opal${opal_postfix}D") + set(OPAL64_NAME_RELEASE "opal64${opal_postfix}") + set(OPAL64_NAME_DEBUG "opal64${opal_postfix}D") + + + find_library(OPAL_LIBRARY_RELEASE + NAMES + ${OPAL_NAME_RELEASE} + ${OPAL64_NAME_RELEASE} + PATHS + /usr/local + /usr + /sw + /opt/local + /opt/csw + /opt + $ENV{OPAL_DIR}/lib + ${OPAL_DIR}/lib + NO_DEFAULT_PATH + ) + + find_library(OPAL_LIBRARY_DEBUG + NAMES + ${OPAL_NAME_DEBUG} + ${OPAL64_NAME_DEBUG} + PATHS + /usr/local + /usr + /sw + /opt/local + /opt/csw + /opt + $ENV{OPAL_DIR}/lib + ${OPAL_DIR}/lib + NO_DEFAULT_PATH + ) + + if(OPAL_INCLUDE_DIRS) + opal_get_version(${OPAL_INCLUDE_DIRS} OPAL_VERSION) + endif() + + if(OPAL_LIBRARY_DEBUG AND OPAL_LIBRARY_RELEASE) + set(OPAL_LIBRARIES + debug ${OPAL_LIBRARY_DEBUG} + optimized ${OPAL_LIBRARY_RELEASE} + CACHE STRING "OPAL Libraries") + endif() +endif() + +include(FindPackageHandleStandardArgs) + +# handle the QUIETLY and REQUIRED arguments and set OPAL_FOUND to TRUE if +# all listed variables are TRUE +FIND_PACKAGE_HANDLE_STANDARD_ARGS(OPAL DEFAULT_MSG OPAL_LIBRARIES OPAL_INCLUDE_DIRS) + +MARK_AS_ADVANCED(OPAL_INCLUDE_DIRS OPAL_LIBRARIES + OPAL_LIBRARY_DEBUG OPAL_LIBRARY_RELEASE) + +if(OPAL_FOUND) + message("-- OPAL version is: ${OPAL_VERSION}") + # short hack for install and copy + if(NOT OPAL_USE_STATIC_LIBS AND CMAKE_SYSTEM_NAME STREQUAL "Windows") + find_file(OPAL_DLL_RELEASE + NAMES + ${OPAL_NAME_RELEASE}.dll ${OPAL64_NAME_RELEASE}.dll + PATHS + $ENV{OPAL_DIR}/bin + ${OPAL_DIR}/bin + NO_DEFAULT_PATH + ) + + find_file(OPAL_DLL_DEBUG + NAMES + ${OPAL_NAME_DEBUG}.dll ${OPAL64_NAME_DEBUG}.dll + PATHS + $ENV{OPAL_DIR}/bin + ${OPAL_DIR}/bin + NO_DEFAULT_PATH + ) + get_filename_component(OPAL_RUNTIME_DIR ${OPAL_DLL_DEBUG} PATH) + MARK_AS_ADVANCED(OPAL_DLL_DEBUG OPAL_DLL_RELEASE OPAL_RUNTIME_DIR) + endif() + + if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + set(PATH_TO_OPAL_PLUGINS ${OPAL_RUNTIME_DIR}/plugins) + + if (EXISTS ${PATH_TO_OPAL_PLUGINS} AND IS_DIRECTORY ${PATH_TO_OPAL_PLUGINS}) + file(GLOB _opal_plugins_ "${PATH_TO_OPAL_PLUGINS}/*.dll") + endif() + + set(OPAL_PLUGINS) + foreach(_plugin ${_opal_plugins_}) + list(APPEND OPAL_PLUGINS ${_plugin}) + endforeach() + message("-- OPAL plugins: ${OPAL_PLUGINS}") + MARK_AS_ADVANCED(PATH_TO_OPAL_PLUGINS OPAL_PLUGINS) + endif() +endif() diff --git a/cmake/Modules/FindPTLib.cmake b/cmake/Modules/FindPTLib.cmake new file mode 100644 index 0000000..e0c5727 --- /dev/null +++ b/cmake/Modules/FindPTLib.cmake @@ -0,0 +1,147 @@ +#------------------------------------------------------------------------------------- +# ITNOA +# +# This file is based on https://github.com/snikulov/cmake-modules +# +# Locate PTLib library (http://www.opalvoip.org/) +# This module defines +# PTLIB_FOUND, if false, do not try to link to PTLib +# PTLIB_LIBRARIES +# PTLIB_INCLUDE_DIRS, where to find ptlib headers +# +# 2013/03/19 - aagenosov +# Module created +# 2013/03/21 - aagenosov +# Added macro to define version of PTLib +## 2015/08/13 - snikulov +# Added linux support +#------------------------------------------------------------------------------------- + +# get version macro +# first param - path to include +macro(ptlib_get_version _include_PATH version) + if(EXISTS "${_include_PATH}/ptbuildopts.h") + file(STRINGS "${_include_PATH}/ptbuildopts.h" _VER_STRING_AUX REGEX ".*#define[ ]+PTLIB_VERSION[ ]+") + else() + file(STRINGS "${_include_PATH}/ptlib_config.h" _VER_STRING_AUX REGEX ".*#define[ ]+PTLIB_VERSION[ ]+") + endif() + string(REGEX MATCHALL "[0-9]+[.][0-9]+[.][0-9]+" ${version} "${_VER_STRING_AUX}") +endmacro() + +include(FindPkgConfig) +PKG_CHECK_MODULES(PC_PTLIB "ptlib") + +find_path(PTLIB_INCLUDE_DIRS ptlib.h + PATHS + ${PC_PTLIB_INCLUDE_DIRS} + /usr/local/include + /usr/include + /opt/local/include + /opt/csw/include + /opt/include + $ENV{PTLIB_DIR}/include + ${PTLIB_DIR}/include + ) + +if(PC_PTLIB_FOUND) + + set(PTLIB_VERSION ${PC_PTLIB_VERSION}) + set(PTLIB_INCULDE_DIRS ${PC_PTLIB_INCLUDE_DIRS}) + + find_library(PTLIB_LIBRARIES + NAMES ${PC_PTLIB_LIBRARIES} + PATH ${PC_PTLIB_LIBRARY_DIRS}) + +else() + + if(PTLib_USE_STATIC_LIBS) + set(ptlib_postfix "${ptlib_postfix}S") + endif() + + set(PTLIB_NAME_RELEASE "ptlib${ptlib_postfix}") + set(PTLIB_NAME_DEBUG "ptlib${ptlib_postfix}D") + set(PTLIB64_NAME_RELEASE "ptlib64${ptlib_postfix}") + set(PTLIB64_NAME_DEBUG "ptlib64${ptlib_postfix}D") + + + find_library(PTLIB_LIBRARY_RELEASE + NAMES + ${PTLIB_NAME_RELEASE} + ${PTLIB64_NAME_RELEASE} + PATHS + /usr/local + /usr + /sw + /opt/local + /opt/csw + /opt + $ENV{PTLIB_DIR}/lib + ${PTLIB_DIR}/lib + NO_DEFAULT_PATH + ) + + find_library(PTLIB_LIBRARY_DEBUG + NAMES + ${PTLIB_NAME_DEBUG} + ${PTLIB64_NAME_DEBUG} + PATHS + /usr/local + /usr + /sw + /opt/local + /opt/csw + /opt + $ENV{PTLIB_DIR}/lib + ${PTLIB_DIR}/lib + NO_DEFAULT_PATH + ) + + if(PTLIB_INCLUDE_DIRS) + ptlib_get_version(${PTLIB_INCLUDE_DIRS} PTLIB_VERSION) + endif() + + if(PTLIB_LIBRARY_DEBUG AND PTLIB_LIBRARY_RELEASE) + set(PTLIB_LIBRARIES + debug ${PTLIB_LIBRARY_DEBUG} + optimized ${PTLIB_LIBRARY_RELEASE} + CACHE STRING "PTLib Libraries") + endif() +endif() + +include(FindPackageHandleStandardArgs) + +# handle the QUIETLY and REQUIRED arguments and set PTLIB_FOUND to TRUE if +# all listed variables are TRUE +FIND_PACKAGE_HANDLE_STANDARD_ARGS(PTLib DEFAULT_MSG PTLIB_LIBRARIES PTLIB_INCLUDE_DIRS) + +MARK_AS_ADVANCED(PTLIB_INCLUDE_DIRS PTLIB_LIBRARIES + PTLIB_LIBRARY_DEBUG PTLIB_LIBRARY_RELEASE PTLIB_VERSION) + +if(PTLIB_FOUND) + message("-- PTLib version is: ${PTLIB_VERSION}") + + # if we found the ptlib - and using dll's + # short hack for install and copy + if(NOT PTLib_USE_STATIC_LIBS AND CMAKE_SYSTEM_NAME STREQUAL "Windows") + find_file(PTLIB_DLL_RELEASE + NAMES + ${PTLIB_NAME_RELEASE}.dll ${PTLIB64_NAME_RELEASE}.dll + PATHS + $ENV{PTLIB_DIR}/bin + ${PTLIB_DIR}/bin + NO_DEFAULT_PATH + ) + + find_file(PTLIB_DLL_DEBUG + NAMES + ${PTLIB_NAME_DEBUG}.dll ${PTLIB64_NAME_DEBUG}.dll + PATHS + $ENV{PTLIB_DIR}/bin + ${PTLIB_DIR}/bin + NO_DEFAULT_PATH + ) + get_filename_component(PTLIB_RUNTIME_DIR ${PTLIB_DLL_DEBUG} PATH) + MARK_AS_ADVANCED(PTLIB_DLL_DEBUG PTLIB_DLL_RELEASE) + endif() + +endif() diff --git a/src/commands.cpp b/src/commands.cpp index 0a40a57..7addefd 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -465,7 +465,7 @@ bool Wait::ParseCommand( return false; } - sscanf(*cmds, "%u", &millis); + sscanf(*cmds, "%lu", &millis); *cmds = &((*cmds)[i]); sequence.push_back(this); return true; diff --git a/src/main.cpp b/src/main.cpp index 2b63bce..c8367b1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,6 +20,8 @@ #include #include +#include +#include #include #include "main.h" #include "commands.h" @@ -459,10 +461,8 @@ bool Manager::SendDTMF(const PString &dtmf) // sleep a while std::cout << "sent DTMF: [" << dtmf[i] << "]" << std::endl; - struct timespec tp; - tp.tv_sec = 0; - tp.tv_nsec = 500 * 1000 * 1000; // half a second - nanosleep (&tp, 0); + using namespace std::chrono_literals; + std::this_thread::sleep_for(500ms); } } ok = (i == dtmf.GetSize() - 1 ? true : false); diff --git a/vcpkg.json b/vcpkg.json new file mode 100644 index 0000000..a0ceefc --- /dev/null +++ b/vcpkg.json @@ -0,0 +1,7 @@ +{ + "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json", + "name": "sipcmd", + "version-string": "0.1.0", + "dependencies": [ + ] +} \ No newline at end of file