- Add new property file (pjproject-vs14-api-def.props) to define the API used
- Add ioqueue specific to uwp using winRT networking API
- Add uwp GUI sample APP using Voip architecture
- Add async activation for wasapi dev



git-svn-id: https://svn.pjsip.org/repos/pjproject/branches/projects/uwp@5254 74dad513-b988-da41-8d7b-12977e46ad98
This commit is contained in:
Riza Sulistyo 2016-03-07 23:15:34 +00:00
parent 88945cd7ba
commit 4660ce3230
59 changed files with 51146 additions and 15119 deletions

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets">
</ImportGroup>
<PropertyGroup>
<!--
- Set the API Family here:
* WinDesktop (Desktop)
* UWP (UWP)
* WinPhone8 (Windows Phone 8)
-->
<API_Family>UWP</API_Family>
</PropertyGroup>
</Project>

View File

@ -1,16 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets">
</ImportGroup>
<PropertyGroup>
<!--
- Set the API Family here:
* WinDesktop (Desktop)
* UWP (UWP)
* WinPhone8 (Windows Phone 8)
-->
<API_Family>UWP</API_Family>
</PropertyGroup>
<Import Project="pjproject-vs14-api-def.props" />
</ImportGroup>
<Choose>
<When Condition="'$(Platform)'=='ARM' ">
<PropertyGroup>

View File

@ -0,0 +1,448 @@
/* $Id$ */
/*
* Copyright (C) 2016 Teluu Inc. (http://www.teluu.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
#include <pj/ioqueue.h>
#include <pj/assert.h>
#include <pj/errno.h>
#include <pj/list.h>
#include <pj/lock.h>
#include <pj/pool.h>
#include <pj/string.h>
#include <pj/ioqueue.h>
#include <pj/os.h>
#include <pj/lock.h>
#include <pj/log.h>
#include <pj/list.h>
#include <pj/pool.h>
#include <pj/string.h>
#include <pj/assert.h>
#include <pj/sock.h>
#include <pj/compat/socket.h>
#include <pj/sock_select.h>
#include <pj/sock_qos.h>
#include <pj/errno.h>
#include <pj/rand.h>
*/
#include <pj/ioqueue.h>
#include <pj/sock.h>
#include <pj/addr_resolv.h>
#include <pj/assert.h>
#include <pj/errno.h>
#include <pj/lock.h>
#include <pj/math.h>
#include <pj/os.h>
#include <pj/pool.h>
#include <pj/string.h>
#include <pj/unicode.h>
#include <pj/compat/socket.h>
#include <ppltasks.h>
#include <string>
#include "sock_uwp.h"
/*
* IO Queue structure.
*/
struct pj_ioqueue_t
{
int dummy;
};
/*
* IO Queue key structure.
*/
struct pj_ioqueue_key_t
{
pj_sock_t sock;
void *user_data;
pj_ioqueue_callback cb;
};
static void on_read(PjUwpSocket *s, int bytes_read)
{
pj_ioqueue_key_t *key = (pj_ioqueue_key_t*)s->user_data;
if (key->cb.on_read_complete) {
(*key->cb.on_read_complete)(key, (pj_ioqueue_op_key_t*)s->read_userdata, bytes_read);
}
s->read_userdata = NULL;
}
static void on_write(PjUwpSocket *s, int bytes_sent)
{
pj_ioqueue_key_t *key = (pj_ioqueue_key_t*)s->user_data;
if (key->cb.on_write_complete) {
(*key->cb.on_write_complete)(key, (pj_ioqueue_op_key_t*)s->write_userdata, bytes_sent);
}
s->write_userdata = NULL;
}
static void on_accept(PjUwpSocket *s, pj_status_t status)
{
pj_ioqueue_key_t *key = (pj_ioqueue_key_t*)s->user_data;
if (key->cb.on_accept_complete) {
if (status == PJ_SUCCESS) {
pj_sock_t new_sock;
pj_sockaddr addr;
int addrlen;
status = pj_sock_accept(key->sock, &new_sock, &addr, &addrlen);
(*key->cb.on_accept_complete)(key, (pj_ioqueue_op_key_t*)s->accept_userdata, new_sock, status);
} else {
(*key->cb.on_accept_complete)(key, (pj_ioqueue_op_key_t*)s->accept_userdata, NULL, status);
}
}
s->accept_userdata = NULL;
}
static void on_connect(PjUwpSocket *s, pj_status_t status)
{
pj_ioqueue_key_t *key = (pj_ioqueue_key_t*)s->user_data;
if (key->cb.on_connect_complete) {
(*key->cb.on_connect_complete)(key, status);
}
}
/*
* Return the name of the ioqueue implementation.
*/
PJ_DEF(const char*) pj_ioqueue_name(void)
{
return "ioqueue-uwp";
}
/*
* Create a new I/O Queue framework.
*/
PJ_DEF(pj_status_t) pj_ioqueue_create( pj_pool_t *pool,
pj_size_t max_fd,
pj_ioqueue_t **p_ioqueue)
{
pj_ioqueue_t *ioq;
PJ_UNUSED_ARG(max_fd);
ioq = PJ_POOL_ZALLOC_T(pool, pj_ioqueue_t);
*p_ioqueue = ioq;
return PJ_SUCCESS;
}
/*
* Destroy the I/O queue.
*/
PJ_DEF(pj_status_t) pj_ioqueue_destroy( pj_ioqueue_t *ioq )
{
PJ_UNUSED_ARG(ioq);
return PJ_SUCCESS;
}
/*
* Set the lock object to be used by the I/O Queue.
*/
PJ_DEF(pj_status_t) pj_ioqueue_set_lock( pj_ioqueue_t *ioq,
pj_lock_t *lock,
pj_bool_t auto_delete )
{
/* Don't really need lock for now */
PJ_UNUSED_ARG(ioq);
if (auto_delete) {
pj_lock_destroy(lock);
}
return PJ_SUCCESS;
}
PJ_DEF(pj_status_t) pj_ioqueue_set_default_concurrency(pj_ioqueue_t *ioqueue,
pj_bool_t allow)
{
/* Not supported, just return PJ_SUCCESS silently */
PJ_UNUSED_ARG(ioqueue);
PJ_UNUSED_ARG(allow);
return PJ_SUCCESS;
}
/*
* Register a socket to the I/O queue framework.
*/
PJ_DEF(pj_status_t) pj_ioqueue_register_sock( pj_pool_t *pool,
pj_ioqueue_t *ioq,
pj_sock_t sock,
void *user_data,
const pj_ioqueue_callback *cb,
pj_ioqueue_key_t **p_key )
{
PJ_UNUSED_ARG(ioq);
pj_ioqueue_key_t *key;
key = PJ_POOL_ZALLOC_T(pool, pj_ioqueue_key_t);
key->sock = sock;
key->user_data = user_data;
pj_memcpy(&key->cb, cb, sizeof(pj_ioqueue_callback));
PjUwpSocket *s = (PjUwpSocket*)sock;
s->is_blocking = PJ_FALSE;
s->user_data = key;
s->on_read = &on_read;
s->on_write = &on_write;
s->on_accept = &on_accept;
s->on_connect = &on_connect;
*p_key = key;
return PJ_SUCCESS;
}
PJ_DEF(pj_status_t) pj_ioqueue_register_sock2(pj_pool_t *pool,
pj_ioqueue_t *ioqueue,
pj_sock_t sock,
pj_grp_lock_t *grp_lock,
void *user_data,
const pj_ioqueue_callback *cb,
pj_ioqueue_key_t **p_key)
{
PJ_UNUSED_ARG(grp_lock);
return pj_ioqueue_register_sock(pool, ioqueue, sock, user_data, cb, p_key);
}
/*
* Unregister from the I/O Queue framework.
*/
PJ_DEF(pj_status_t) pj_ioqueue_unregister( pj_ioqueue_key_t *key )
{
if (key == NULL || key->sock == NULL)
return PJ_SUCCESS;
if (key->sock)
pj_sock_close(key->sock);
key->sock = NULL;
return PJ_SUCCESS;
}
/*
* Get user data associated with an ioqueue key.
*/
PJ_DEF(void*) pj_ioqueue_get_user_data( pj_ioqueue_key_t *key )
{
return key->user_data;
}
/*
* Set or change the user data to be associated with the file descriptor or
* handle or socket descriptor.
*/
PJ_DEF(pj_status_t) pj_ioqueue_set_user_data( pj_ioqueue_key_t *key,
void *user_data,
void **old_data)
{
if (old_data)
*old_data = key->user_data;
key->user_data= user_data;
return PJ_SUCCESS;
}
/*
* Initialize operation key.
*/
PJ_DEF(void) pj_ioqueue_op_key_init( pj_ioqueue_op_key_t *op_key,
pj_size_t size )
{
pj_bzero(op_key, size);
}
/*
* Check if operation is pending on the specified operation key.
*/
PJ_DEF(pj_bool_t) pj_ioqueue_is_pending( pj_ioqueue_key_t *key,
pj_ioqueue_op_key_t *op_key )
{
PJ_UNUSED_ARG(key);
PJ_UNUSED_ARG(op_key);
return PJ_FALSE;
}
/*
* Post completion status to the specified operation key and call the
* appropriate callback.
*/
PJ_DEF(pj_status_t) pj_ioqueue_post_completion( pj_ioqueue_key_t *key,
pj_ioqueue_op_key_t *op_key,
pj_ssize_t bytes_status )
{
PJ_UNUSED_ARG(key);
PJ_UNUSED_ARG(op_key);
PJ_UNUSED_ARG(bytes_status);
return PJ_ENOTSUP;
}
#if defined(PJ_HAS_TCP) && PJ_HAS_TCP != 0
/**
* Instruct I/O Queue to accept incoming connection on the specified
* listening socket.
*/
PJ_DEF(pj_status_t) pj_ioqueue_accept( pj_ioqueue_key_t *key,
pj_ioqueue_op_key_t *op_key,
pj_sock_t *new_sock,
pj_sockaddr_t *local,
pj_sockaddr_t *remote,
int *addrlen )
{
PJ_UNUSED_ARG(new_sock);
PJ_UNUSED_ARG(local);
PJ_UNUSED_ARG(remote);
PJ_UNUSED_ARG(addrlen);
PjUwpSocket *s = (PjUwpSocket*)key->sock;
s->accept_userdata = op_key;
return pj_sock_listen(key->sock, 0);
}
/*
* Initiate non-blocking socket connect.
*/
PJ_DEF(pj_status_t) pj_ioqueue_connect( pj_ioqueue_key_t *key,
const pj_sockaddr_t *addr,
int addrlen )
{
return pj_sock_connect(key->sock, addr, addrlen);
}
#endif /* PJ_HAS_TCP */
/*
* Poll the I/O Queue for completed events.
*/
PJ_DEF(int) pj_ioqueue_poll( pj_ioqueue_t *ioq,
const pj_time_val *timeout)
{
/* Polling is not necessary on uwp, since all async activities
* are registered to active scheduler.
*/
PJ_UNUSED_ARG(ioq);
PJ_UNUSED_ARG(timeout);
return 0;
}
/*
* Instruct the I/O Queue to read from the specified handle.
*/
PJ_DEF(pj_status_t) pj_ioqueue_recv( pj_ioqueue_key_t *key,
pj_ioqueue_op_key_t *op_key,
void *buffer,
pj_ssize_t *length,
pj_uint32_t flags )
{
PjUwpSocket *s = (PjUwpSocket*)key->sock;
s->read_userdata = op_key;
return pj_sock_recv(key->sock, buffer, length, flags);
}
/*
* This function behaves similarly as #pj_ioqueue_recv(), except that it is
* normally called for socket, and the remote address will also be returned
* along with the data.
*/
PJ_DEF(pj_status_t) pj_ioqueue_recvfrom( pj_ioqueue_key_t *key,
pj_ioqueue_op_key_t *op_key,
void *buffer,
pj_ssize_t *length,
pj_uint32_t flags,
pj_sockaddr_t *addr,
int *addrlen)
{
PjUwpSocket *s = (PjUwpSocket*)key->sock;
s->read_userdata = op_key;
return pj_sock_recvfrom(key->sock, buffer, length, flags, addr, addrlen);
}
/*
* Instruct the I/O Queue to write to the handle.
*/
PJ_DEF(pj_status_t) pj_ioqueue_send( pj_ioqueue_key_t *key,
pj_ioqueue_op_key_t *op_key,
const void *data,
pj_ssize_t *length,
pj_uint32_t flags )
{
PjUwpSocket *s = (PjUwpSocket*)key->sock;
s->write_userdata = op_key;
return pj_sock_send(key->sock, data, length, flags);
}
/*
* Instruct the I/O Queue to write to the handle.
*/
PJ_DEF(pj_status_t) pj_ioqueue_sendto( pj_ioqueue_key_t *key,
pj_ioqueue_op_key_t *op_key,
const void *data,
pj_ssize_t *length,
pj_uint32_t flags,
const pj_sockaddr_t *addr,
int addrlen)
{
PjUwpSocket *s = (PjUwpSocket*)key->sock;
s->write_userdata = op_key;
return pj_sock_sendto(key->sock, data, length, flags, addr, addrlen);
}
PJ_DEF(pj_status_t) pj_ioqueue_set_concurrency(pj_ioqueue_key_t *key,
pj_bool_t allow)
{
/* Not supported, just return PJ_SUCCESS silently */
PJ_UNUSED_ARG(key);
PJ_UNUSED_ARG(allow);
return PJ_SUCCESS;
}
PJ_DEF(pj_status_t) pj_ioqueue_lock_key(pj_ioqueue_key_t *key)
{
/* Not supported, just return PJ_SUCCESS silently */
PJ_UNUSED_ARG(key);
return PJ_SUCCESS;
}
PJ_DEF(pj_status_t) pj_ioqueue_unlock_key(pj_ioqueue_key_t *key)
{
/* Not supported, just return PJ_SUCCESS silently */
PJ_UNUSED_ARG(key);
return PJ_SUCCESS;
}

1476
pjlib/src/pj/sock_uwp.cpp Normal file

File diff suppressed because it is too large Load Diff

238
pjlib/src/pj/sock_uwp.h Normal file
View File

@ -0,0 +1,238 @@
/* $Id$ */
/*
* Copyright (C) 2016 Teluu Inc. (http://www.teluu.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#pragma once
enum {
READ_TIMEOUT = 60 * 1000,
WRITE_TIMEOUT = 60 * 1000,
SEND_BUFFER_SIZE = 128 * 1024,
};
enum PjUwpSocketType {
SOCKTYPE_UNKNOWN, SOCKTYPE_LISTENER,
SOCKTYPE_STREAM, SOCKTYPE_DATAGRAM
};
enum PjUwpSocketState {
SOCKSTATE_NULL, SOCKSTATE_INITIALIZED, SOCKSTATE_CONNECTING,
SOCKSTATE_CONNECTED, SOCKSTATE_DISCONNECTED, SOCKSTATE_ERROR
};
ref class PjUwpSocketDatagramRecvHelper;
ref class PjUwpSocketListenerHelper;
/*
* UWP Socket Wrapper.
*/
class PjUwpSocket
{
public:
PjUwpSocket(int af_, int type_, int proto_);
PjUwpSocket* CreateAcceptSocket(Windows::Networking::Sockets::StreamSocket^ stream_sock_);
virtual ~PjUwpSocket();
pj_status_t InitSocket(enum PjUwpSocketType sock_type_);
public:
int af;
int type;
int proto;
pj_sockaddr local_addr;
pj_sockaddr remote_addr;
pj_bool_t is_blocking;
void *user_data;
enum PjUwpSocketType sock_type;
enum PjUwpSocketState sock_state;
Windows::Networking::Sockets::DatagramSocket^ datagram_sock;
Windows::Networking::Sockets::StreamSocket^ stream_sock;
Windows::Networking::Sockets::StreamSocketListener^ listener_sock;
/* Helper objects */
PjUwpSocketDatagramRecvHelper^ datagram_recv_helper;
PjUwpSocketListenerHelper^ listener_helper;
Windows::Storage::Streams::DataReader^ socket_reader;
Windows::Storage::Streams::DataWriter^ socket_writer;
Windows::Storage::Streams::IBuffer^ send_buffer;
pj_bool_t is_busy_sending;
void *read_userdata;
void *write_userdata;
void *accept_userdata;
void (*on_read)(PjUwpSocket *s, int bytes_read);
void (*on_write)(PjUwpSocket *s, int bytes_sent);
void (*on_accept)(PjUwpSocket *s, pj_status_t status);
void (*on_connect)(PjUwpSocket *s, pj_status_t status);
};
//////////////////////////////////
// Misc
inline pj_status_t wstr_addr_to_sockaddr(const wchar_t *waddr,
const wchar_t *wport,
pj_sockaddr_t *sockaddr)
{
char tmp_str_buf[PJ_INET6_ADDRSTRLEN+1];
pj_assert(wcslen(waddr) < sizeof(tmp_str_buf));
pj_unicode_to_ansi(waddr, wcslen(waddr), tmp_str_buf, sizeof(tmp_str_buf));
pj_str_t remote_host;
pj_strset(&remote_host, tmp_str_buf, pj_ansi_strlen(tmp_str_buf));
pj_sockaddr_parse(pj_AF_UNSPEC(), 0, &remote_host, (pj_sockaddr*)sockaddr);
pj_sockaddr_set_port((pj_sockaddr*)sockaddr, (pj_uint16_t)_wtoi(wport));
return PJ_SUCCESS;
}
inline pj_status_t sockaddr_to_hostname_port(const pj_sockaddr_t *sockaddr,
Windows::Networking::HostName ^&hostname,
int *port)
{
char tmp[PJ_INET6_ADDRSTRLEN];
wchar_t wtmp[PJ_INET6_ADDRSTRLEN];
pj_sockaddr_print(sockaddr, tmp, PJ_INET6_ADDRSTRLEN, 0);
pj_ansi_to_unicode(tmp, pj_ansi_strlen(tmp), wtmp,
PJ_INET6_ADDRSTRLEN);
hostname = ref new Windows::Networking::HostName(ref new Platform::String(wtmp));
*port = pj_sockaddr_get_port(sockaddr);
return PJ_SUCCESS;
}
/* Buffer helper */
#include <Robuffer.h>
#include <wrl/client.h>
inline Microsoft::WRL::ComPtr<Windows::Storage::Streams::IBufferByteAccess> GetBufferByteAccess(Windows::Storage::Streams::IBuffer^ buffer)
{
auto pUnk = reinterpret_cast<IUnknown*>(buffer);
Microsoft::WRL::ComPtr<Windows::Storage::Streams::IBufferByteAccess> comBuff;
pUnk->QueryInterface(__uuidof(Windows::Storage::Streams::IBufferByteAccess), (void**)comBuff.ReleaseAndGetAddressOf());
return comBuff;
}
inline void GetRawBufferFromIBuffer(Windows::Storage::Streams::IBuffer^ buffer, unsigned char** pbuffer)
{
Platform::Object^ obj = buffer;
Microsoft::WRL::ComPtr<IInspectable> insp(reinterpret_cast<IInspectable*>(obj));
Microsoft::WRL::ComPtr<Windows::Storage::Streams::IBufferByteAccess> bufferByteAccess;
insp.As(&bufferByteAccess);
bufferByteAccess->Buffer(pbuffer);
}
inline void CopyToIBuffer(unsigned char* buffSource, unsigned int copyByteCount, Windows::Storage::Streams::IBuffer^ buffer, unsigned int writeStartPos = 0)
{
auto bufferLen = buffer->Capacity;
assert(copyByteCount <= bufferLen);
unsigned char* pBuffer;
GetRawBufferFromIBuffer(buffer, &pBuffer);
memcpy(pBuffer + writeStartPos, buffSource, copyByteCount);
}
inline void CopyFromIBuffer(unsigned char* buffDestination, unsigned int copyByteCount, Windows::Storage::Streams::IBuffer^ buffer, unsigned int readStartPos = 0)
{
assert(copyByteCount <= buffer->Capacity);
unsigned char* pBuffer;
GetRawBufferFromIBuffer(buffer, &pBuffer);
memcpy(buffDestination, pBuffer + readStartPos, copyByteCount);
}
/* PPL helper */
#include <ppltasks.h>
#include <agents.h>
// Creates a task that completes after the specified delay, in ms.
inline concurrency::task<void> complete_after(unsigned int timeout)
{
// A task completion event that is set when a timer fires.
concurrency::task_completion_event<void> tce;
// Create a non-repeating timer.
auto fire_once = new concurrency::timer<int>(timeout, 0, nullptr, false);
// Create a call object that sets the completion event after the timer fires.
auto callback = new concurrency::call<int>([tce](int)
{
tce.set();
});
// Connect the timer to the callback and start the timer.
fire_once->link_target(callback);
fire_once->start();
// Create a task that completes after the completion event is set.
concurrency::task<void> event_set(tce);
// Create a continuation task that cleans up resources and
// and return that continuation task.
return event_set.then([callback, fire_once]()
{
delete callback;
delete fire_once;
});
}
// Cancels the provided task after the specifed delay, if the task
// did not complete.
template<typename T>
inline concurrency::task<T> cancel_after_timeout(concurrency::task<T> t, concurrency::cancellation_token_source cts, unsigned int timeout)
{
// Create a task that returns true after the specified task completes.
concurrency::task<bool> success_task = t.then([](T)
{
return true;
});
// Create a task that returns false after the specified timeout.
concurrency::task<bool> failure_task = complete_after(timeout).then([]
{
return false;
});
// Create a continuation task that cancels the overall task
// if the timeout task finishes first.
return (failure_task || success_task).then([t, cts](bool success)
{
if (!success)
{
// Set the cancellation token. The task that is passed as the
// t parameter should respond to the cancellation and stop
// as soon as it can.
cts.cancel();
}
// Return the original task.
return t;
});
}

View File

@ -26,6 +26,7 @@
#include <Avrt.h>
#include <windows.h>
#include <audioclient.h>
#include <Processthreadsapi.h>
#if defined(PJ_WIN32_UWP) && PJ_WIN32_UWP
#define USE_ASYNC_ACTIVATE 1;
@ -37,7 +38,7 @@
#include <ppltasks.h>
using namespace Windows::Media::Devices;
using namespace Microsoft::WRL;
using namespace concurrency;
using namespace concurrency;
#else
#include <phoneaudioclient.h>
#using <Windows.winmd>
@ -106,8 +107,7 @@ struct wasapi_stream
pjmedia_format_id fmt_id; /* Frame format */
unsigned bytes_per_sample;
/* Playback */
LPCWSTR pb_id; /* playback Id */
/* Playback */
pjmedia_aud_play_cb pb_cb; /* Playback callback */
IAudioClient2 *default_pb_dev; /* Default playback dev */
IAudioRenderClient *pb_client; /* Playback client */
@ -117,10 +117,12 @@ struct wasapi_stream
pj_timestamp pb_timestamp;
#if defined(USE_ASYNC_ACTIVATE)
ComPtr<AudioActivator> pb_aud_act;
Platform::String^ pb_id;
#else
LPCWSTR pb_id;
#endif
/* Capture */
LPCWSTR cap_id; /* Capture Id */
/* Capture */
pjmedia_aud_rec_cb cap_cb; /* Capture callback */
IAudioClient2 *default_cap_dev; /* Default capture dev */
IAudioCaptureClient *cap_client; /* Capture client */
@ -132,6 +134,9 @@ struct wasapi_stream
pj_timestamp cap_timestamp;
#if defined(USE_ASYNC_ACTIVATE)
ComPtr<AudioActivator> cap_aud_act;
Platform::String^ cap_id;
#else
LPCWSTR cap_id;
#endif
};
@ -250,25 +255,6 @@ static int PJ_THREAD_FUNC wasapi_dev_thread(void *arg)
if (strm->param.dir & PJMEDIA_DIR_CAPTURE)
events[eventCount++] = strm->cap_event;
/* Raise self priority. We don't want the audio to be distorted by
* system activity.
*/
#if defined(PJ_WIN32_WINCE) && PJ_WIN32_WINCE != 0
if (strm->param.dir & PJMEDIA_DIR_PLAYBACK)
CeSetThreadPriority(GetCurrentThread(), 153);
else
CeSetThreadPriority(GetCurrentThread(), 247);
#else
//SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
#endif
/* Raise thread priority */
// mmcs_handle = AvSetMmThreadCharacteristicsW(L"Audio",
// &mmcss_task_index);
// if (!mmcs_handle) {
//PJ_LOG(4,(THIS_FILE, "Unable to enable MMCS on wasapi stream thread"));
// }
/*
* Loop while not signalled to quit, wait for event objects to be
* signalled by Wasapi capture and play buffer.
@ -335,6 +321,7 @@ static int PJ_THREAD_FUNC wasapi_dev_thread(void *arg)
hr = strm->pb_client->GetBuffer(frame_to_render, &cur_pb_buf);
if (FAILED(hr)) {
PJ_LOG(4, (THIS_FILE, "Error getting wasapi buffer"));
continue;
}
@ -352,6 +339,7 @@ static int PJ_THREAD_FUNC wasapi_dev_thread(void *arg)
/* Write to the device. */
hr = strm->pb_client->ReleaseBuffer(frame_to_render, 0);
if (FAILED(hr)) {
PJ_LOG(4, (THIS_FILE, "Error releasing wasapi buffer"));
continue;
}
@ -362,8 +350,10 @@ static int PJ_THREAD_FUNC wasapi_dev_thread(void *arg)
pj_uint32_t packet_size = 0;
hr = strm->cap_client->GetNextPacketSize(&packet_size);
if (FAILED(hr))
if (FAILED(hr)) {
PJ_LOG(4, (THIS_FILE, "Error getting next packet size"));
continue;
}
while (packet_size) {
@ -379,6 +369,8 @@ static int PJ_THREAD_FUNC wasapi_dev_thread(void *arg)
NULL);
if (FAILED(hr) || (next_frame_size == 0)) {
PJ_LOG(4, (THIS_FILE, "Error getting next buffer, \
next frame size : %d", next_frame_size));
packet_size = 0;
continue;
}
@ -479,14 +471,14 @@ static int PJ_THREAD_FUNC wasapi_dev_thread(void *arg)
hr = strm->cap_client->ReleaseBuffer(next_frame_size);
hr = strm->cap_client->GetNextPacketSize(&packet_size);
if (FAILED(hr))
if (FAILED(hr)) {
PJ_LOG(4, (THIS_FILE, "Error getting next packet size"));
packet_size = 0;
}
}
}
}
//AvRevertMmThreadCharacteristics(mmcs_handle);
PJ_LOG(5,(THIS_FILE, "WASAPI: thread stopping.."));
return 0;
}
@ -498,7 +490,7 @@ static pj_status_t activate_capture_dev(struct wasapi_stream *ws)
#if defined(USE_ASYNC_ACTIVATE)
ComPtr<IActivateAudioInterfaceAsyncOperation> async_op;
ws->cap_id = MediaDevice::GetDefaultAudioCaptureId(
AudioDeviceRole::Communications)->Data();
AudioDeviceRole::Communications);
#else
ws->cap_id = GetDefaultAudioCaptureId(AudioDeviceRole::Communications);
#endif
@ -509,22 +501,33 @@ static pj_status_t activate_capture_dev(struct wasapi_stream *ws)
}
#if defined(USE_ASYNC_ACTIVATE)
ws->cap_aud_act = Make<AudioActivator>();
if (ws->cap_aud_act == NULL) {
PJ_LOG(4, (THIS_FILE, "Error activating capture device"));
return PJMEDIA_EAUD_SYSERR;
}
hr = ActivateAudioInterfaceAsync(ws->cap_id, __uuidof(IAudioClient2),
hr = ActivateAudioInterfaceAsync(ws->cap_id->Data(),
__uuidof(IAudioClient2),
NULL, ws->cap_aud_act.Get(),
&async_op);
//pj_thread_sleep(100);
auto task_completed = create_task(ws->cap_aud_act->task_completed);
task_completed.wait();
task_completed.wait();
ws->default_cap_dev = task_completed.get().Get();
#else
hr = ActivateAudioInterface(ws->cap_id, __uuidof(IAudioClient2),
(void**)&ws->default_cap_dev);
#endif
AudioClientProperties properties = {};
if (SUCCEEDED(hr))
{
properties.cbSize = sizeof AudioClientProperties;
properties.eCategory = AudioCategory_Communications;
hr = ws->default_cap_dev->SetClientProperties(&properties);
}
return FAILED(hr) ? PJMEDIA_EAUD_SYSERR : PJ_SUCCESS;
}
@ -633,7 +636,7 @@ static pj_status_t activate_playback_dev(struct wasapi_stream *ws)
ComPtr<IActivateAudioInterfaceAsyncOperation> async_op;
ws->pb_id = MediaDevice::GetDefaultAudioRenderId(
AudioDeviceRole::Communications)->Data();
AudioDeviceRole::Communications);
#else
ws->pb_id = GetDefaultAudioRenderId(AudioDeviceRole::Communications);
#endif
@ -649,10 +652,12 @@ static pj_status_t activate_playback_dev(struct wasapi_stream *ws)
PJ_LOG(4, (THIS_FILE, "Error activating playback device"));
return PJMEDIA_EAUD_SYSERR;
}
hr = ActivateAudioInterfaceAsync(ws->pb_id, __uuidof(IAudioClient2),
hr = ActivateAudioInterfaceAsync(ws->pb_id->Data(),
__uuidof(IAudioClient2),
NULL, ws->pb_aud_act.Get(),
&async_op);
//pj_thread_sleep(100);
auto task_completed = create_task(ws->pb_aud_act->task_completed);
task_completed.wait();
ws->default_pb_dev = task_completed.get().Get();
@ -660,6 +665,14 @@ static pj_status_t activate_playback_dev(struct wasapi_stream *ws)
hr = ActivateAudioInterface(ws->pb_id, __uuidof(IAudioClient2),
(void**)&ws->default_pb_dev);
#endif
AudioClientProperties properties = {};
if (SUCCEEDED(hr))
{
properties.cbSize = sizeof AudioClientProperties;
properties.eCategory = AudioCategory_Communications;
hr = ws->default_pb_dev->SetClientProperties(&properties);
}
return FAILED(hr) ? PJMEDIA_EAUD_SYSERR : PJ_SUCCESS;
}
@ -1024,31 +1037,6 @@ static pj_status_t wasapi_factory_create_stream(pjmedia_aud_dev_factory *f,
}
}
/* Apply the remaining settings */
/* Set the output volume */
// if (param->flags & PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING) {
// status = wasapi_stream_set_cap(&strm->base,
// PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING,
// &param->output_vol);
//if (status != PJ_SUCCESS) {
// PJ_LOG(4, (THIS_FILE, "Error setting output volume:%d", status));
//}
// }
// /* Set the audio routing ONLY if app explicitly asks one */
// if ((param->dir & PJMEDIA_DIR_PLAYBACK) &&
//(param->flags & PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE))
// {
//PJ_TODO(CREATE_STREAM_WITH_AUDIO_ROUTE);
////status = wasapi_stream_set_cap(&strm->base,
//// PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE,
//// &param->output_route);
////if (status != PJ_SUCCESS) {
//// PJ_LOG(4, (THIS_FILE, "Error setting output route,status: %d",
//// status));
////}
// }
strm->quit_event = CreateEventEx(NULL, NULL, CREATE_EVENT_MANUAL_RESET,
EVENT_ALL_ACCESS);
if (!strm->quit_event)
@ -1127,41 +1115,6 @@ static pj_status_t wasapi_stream_set_cap(pjmedia_aud_stream *s,
PJ_ASSERT_RETURN(s && pval, PJ_EINVAL);
// if (cap==PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE &&
// (strm->param.dir & PJMEDIA_DIR_PLAYBACK))
// {
//pjmedia_aud_dev_route route;
//AudioRoutingEndpoint endpoint;
//AudioRoutingManager ^routing_mgr = AudioRoutingManager::GetDefault();
//PJ_ASSERT_RETURN(pval, PJ_EINVAL);
// route = *((pjmedia_aud_dev_route*)pval);
// /* Use the initialization function which lazy-inits the
// * handle for routing
// */
//switch (route) {
// case PJMEDIA_AUD_DEV_ROUTE_DEFAULT :
// endpoint = AudioRoutingEndpoint::Default;
// break;
// case PJMEDIA_AUD_DEV_ROUTE_LOUDSPEAKER :
// endpoint = AudioRoutingEndpoint::Speakerphone;
// break;
// case PJMEDIA_AUD_DEV_ROUTE_EARPIECE :
// endpoint = AudioRoutingEndpoint::Earpiece;
// break;
// case PJMEDIA_AUD_DEV_ROUTE_BLUETOOTH :
// endpoint = AudioRoutingEndpoint::Bluetooth;
// break;
// default:
// endpoint = AudioRoutingEndpoint::Default;
//}
//routing_mgr->SetAudioEndpoint(endpoint);
//
//return PJ_SUCCESS;
// }
return PJMEDIA_EAUD_INVCAP;
}
@ -1295,13 +1248,6 @@ static pj_status_t wasapi_stream_destroy(pjmedia_aud_stream *strm)
ws->pb_volume = NULL;
}
if (ws->cap_id) {
CoTaskMemFree((LPVOID)ws->cap_id);
}
if (ws->pb_id) {
CoTaskMemFree((LPVOID)ws->pb_id);
}
#if defined(USE_ASYNC_ACTIVATE)
/* Release audio activator */
@ -1312,6 +1258,22 @@ static pj_status_t wasapi_stream_destroy(pjmedia_aud_stream *strm)
if (ws->pb_aud_act) {
ws->pb_aud_act = nullptr;
}
if (ws->cap_id) {
ws->cap_id = nullptr;
}
if (ws->pb_id) {
ws->pb_id = nullptr;
}
#else
if (ws->cap_id) {
CoTaskMemFree((LPVOID)ws->cap_id);
}
if (ws->pb_id) {
CoTaskMemFree((LPVOID)ws->pb_id);
}
#endif
pj_pool_release(ws->pool);

View File

@ -5,6 +5,7 @@ VisualStudioVersion = 14.0.23107.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{1DFF1CF3-DBD7-4DA4-A36D-663D695EB678}"
ProjectSection(SolutionItems) = preProject
build\vs\pjproject-vs14-api-def.props = build\vs\pjproject-vs14-api-def.props
build\vs\pjproject-vs14-arm-common-defaults.props = build\vs\pjproject-vs14-arm-common-defaults.props
build\vs\pjproject-vs14-arm-release-defaults.props = build\vs\pjproject-vs14-arm-release-defaults.props
build\vs\pjproject-vs14-common-config.props = build\vs\pjproject-vs14-common-config.props
@ -97,6 +98,34 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pjsua_cli_wp8_comp", "pjsip
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pjsua_winrt", "pjsua_winrt", "{54F6163A-66C6-4F09-844D-CC61DE8EE376}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "winrt sample", "winrt sample", "{78DA8BE5-2D77-49D6-8CA4-7847B65DBE84}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "uwp foreground", "uwp foreground", "{452C38CE-6463-4963-A113-658B6BD91D15}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "wp8", "wp8", "{DE5C2BE2-873A-4B85-8EBE-8AEA4C80212F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Agents", "pjsip-apps\src\pjsua\winrt\gui\wp8\Agents\Agents.csproj", "{820034C1-645D-4340-8813-D980C1EF77DE}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BackEnd", "pjsip-apps\src\pjsua\winrt\gui\wp8\BackEnd\BackEnd.vcxproj", "{C8D75245-FFCF-4932-A228-C9CC8BB60B03}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BackEndProxyStub", "pjsip-apps\src\pjsua\winrt\gui\wp8\BackEndProxyStub\BackEndProxyStub.vcxproj", "{BBABEEA1-494C-4618-96E3-399873A5558B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UI", "pjsip-apps\src\pjsua\winrt\gui\wp8\UI\UI.csproj", "{3085ACA0-00DA-45BF-9110-A3684B56EBBA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UI", "pjsip-apps\src\pjsua\winrt\gui\uwp foreground\UI\UI.csproj", "{D51DC5BE-5822-4B94-891C-E1B1B7892939}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BackEnd", "pjsip-apps\src\pjsua\winrt\gui\uwp foreground\BackEnd\BackEnd.vcxproj", "{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "uwp", "uwp", "{87D83489-039E-4123-BE01-CB62EE932A29}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Voip", "pjsip-apps\src\pjsua\winrt\gui\uwp\Voip\Voip.csproj", "{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VoipBackEnd", "pjsip-apps\src\pjsua\winrt\gui\uwp\VoipBackEnd\VoipBackEnd.vcxproj", "{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VoipHost", "pjsip-apps\src\pjsua\winrt\gui\uwp\VoipHost\VoipHost.vcxproj", "{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VoipTasks", "pjsip-apps\src\pjsua\winrt\gui\uwp\VoipTasks\VoipTasks.csproj", "{9FDF5E33-D15D-409F-876E-4E77727936B9}"
EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
pjsip-apps\src\pjsua\winrt\cli\comp\pjsua_cli_shared_comp.vcxitems*{207e7bd4-7b11-4a40-ba3a-cc627762a7b6}*SharedItemsImports = 4
@ -1639,6 +1668,556 @@ Global
{E75EFD41-C7F5-44C8-8FF1-A310D920989D}.Release-Static|Win32.Build.0 = Release|Win32
{E75EFD41-C7F5-44C8-8FF1-A310D920989D}.Release-Static|x64.ActiveCfg = Release|ARM
{E75EFD41-C7F5-44C8-8FF1-A310D920989D}.Release-Static|x64.Build.0 = Release|ARM
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug|ARM.ActiveCfg = Debug|ARM
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug|ARM.Build.0 = Debug|ARM
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug|Win32.ActiveCfg = Debug|Win32
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug|Win32.Build.0 = Debug|Win32
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug|x64.ActiveCfg = Debug|x64
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug|x64.Build.0 = Debug|x64
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug-Dynamic|Any CPU.ActiveCfg = Debug|Any CPU
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug-Dynamic|Any CPU.Build.0 = Debug|Any CPU
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug-Dynamic|ARM.ActiveCfg = Debug|ARM
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug-Dynamic|ARM.Build.0 = Debug|ARM
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug-Dynamic|Win32.ActiveCfg = Debug|Win32
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug-Dynamic|Win32.Build.0 = Debug|Win32
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug-Dynamic|x64.ActiveCfg = Debug|x64
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug-Dynamic|x64.Build.0 = Debug|x64
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug-Static|Any CPU.ActiveCfg = Debug|Any CPU
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug-Static|Any CPU.Build.0 = Debug|Any CPU
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug-Static|ARM.ActiveCfg = Debug|ARM
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug-Static|ARM.Build.0 = Debug|ARM
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug-Static|Win32.ActiveCfg = Debug|Win32
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug-Static|Win32.Build.0 = Debug|Win32
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug-Static|x64.ActiveCfg = Debug|x64
{820034C1-645D-4340-8813-D980C1EF77DE}.Debug-Static|x64.Build.0 = Debug|x64
{820034C1-645D-4340-8813-D980C1EF77DE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{820034C1-645D-4340-8813-D980C1EF77DE}.Release|Any CPU.Build.0 = Release|Any CPU
{820034C1-645D-4340-8813-D980C1EF77DE}.Release|ARM.ActiveCfg = Release|ARM
{820034C1-645D-4340-8813-D980C1EF77DE}.Release|ARM.Build.0 = Release|ARM
{820034C1-645D-4340-8813-D980C1EF77DE}.Release|Win32.ActiveCfg = Release|Win32
{820034C1-645D-4340-8813-D980C1EF77DE}.Release|Win32.Build.0 = Release|Win32
{820034C1-645D-4340-8813-D980C1EF77DE}.Release|x64.ActiveCfg = Release|x64
{820034C1-645D-4340-8813-D980C1EF77DE}.Release|x64.Build.0 = Release|x64
{820034C1-645D-4340-8813-D980C1EF77DE}.Release-Dynamic|Any CPU.ActiveCfg = Release|Any CPU
{820034C1-645D-4340-8813-D980C1EF77DE}.Release-Dynamic|Any CPU.Build.0 = Release|Any CPU
{820034C1-645D-4340-8813-D980C1EF77DE}.Release-Dynamic|ARM.ActiveCfg = Release|ARM
{820034C1-645D-4340-8813-D980C1EF77DE}.Release-Dynamic|ARM.Build.0 = Release|ARM
{820034C1-645D-4340-8813-D980C1EF77DE}.Release-Dynamic|Win32.ActiveCfg = Release|Win32
{820034C1-645D-4340-8813-D980C1EF77DE}.Release-Dynamic|Win32.Build.0 = Release|Win32
{820034C1-645D-4340-8813-D980C1EF77DE}.Release-Dynamic|x64.ActiveCfg = Release|x64
{820034C1-645D-4340-8813-D980C1EF77DE}.Release-Dynamic|x64.Build.0 = Release|x64
{820034C1-645D-4340-8813-D980C1EF77DE}.Release-Static|Any CPU.ActiveCfg = Release|Any CPU
{820034C1-645D-4340-8813-D980C1EF77DE}.Release-Static|Any CPU.Build.0 = Release|Any CPU
{820034C1-645D-4340-8813-D980C1EF77DE}.Release-Static|ARM.ActiveCfg = Release|ARM
{820034C1-645D-4340-8813-D980C1EF77DE}.Release-Static|ARM.Build.0 = Release|ARM
{820034C1-645D-4340-8813-D980C1EF77DE}.Release-Static|Win32.ActiveCfg = Release|Win32
{820034C1-645D-4340-8813-D980C1EF77DE}.Release-Static|Win32.Build.0 = Release|Win32
{820034C1-645D-4340-8813-D980C1EF77DE}.Release-Static|x64.ActiveCfg = Release|x64
{820034C1-645D-4340-8813-D980C1EF77DE}.Release-Static|x64.Build.0 = Release|x64
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug|Any CPU.ActiveCfg = Debug|Win32
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug|ARM.ActiveCfg = Debug|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug|ARM.Build.0 = Debug|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug|Win32.ActiveCfg = Debug|Win32
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug|Win32.Build.0 = Debug|Win32
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug|x64.ActiveCfg = Debug|Win32
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug-Dynamic|Any CPU.ActiveCfg = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug-Dynamic|Any CPU.Build.0 = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug-Dynamic|ARM.ActiveCfg = Debug|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug-Dynamic|ARM.Build.0 = Debug|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug-Dynamic|Win32.ActiveCfg = Debug|Win32
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug-Dynamic|Win32.Build.0 = Debug|Win32
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug-Dynamic|x64.ActiveCfg = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug-Dynamic|x64.Build.0 = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug-Static|Any CPU.ActiveCfg = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug-Static|Any CPU.Build.0 = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug-Static|ARM.ActiveCfg = Debug|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug-Static|ARM.Build.0 = Debug|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug-Static|Win32.ActiveCfg = Debug|Win32
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug-Static|Win32.Build.0 = Debug|Win32
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug-Static|x64.ActiveCfg = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Debug-Static|x64.Build.0 = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release|Any CPU.ActiveCfg = Release|Win32
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release|ARM.ActiveCfg = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release|ARM.Build.0 = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release|Win32.ActiveCfg = Release|Win32
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release|Win32.Build.0 = Release|Win32
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release|x64.ActiveCfg = Release|Win32
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release-Dynamic|Any CPU.ActiveCfg = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release-Dynamic|Any CPU.Build.0 = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release-Dynamic|ARM.ActiveCfg = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release-Dynamic|ARM.Build.0 = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release-Dynamic|Win32.ActiveCfg = Release|Win32
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release-Dynamic|Win32.Build.0 = Release|Win32
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release-Dynamic|x64.ActiveCfg = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release-Dynamic|x64.Build.0 = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release-Static|Any CPU.ActiveCfg = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release-Static|Any CPU.Build.0 = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release-Static|ARM.ActiveCfg = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release-Static|ARM.Build.0 = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release-Static|Win32.ActiveCfg = Release|Win32
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release-Static|Win32.Build.0 = Release|Win32
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release-Static|x64.ActiveCfg = Release|ARM
{C8D75245-FFCF-4932-A228-C9CC8BB60B03}.Release-Static|x64.Build.0 = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug|Any CPU.ActiveCfg = Debug|Win32
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug|ARM.ActiveCfg = Debug|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug|ARM.Build.0 = Debug|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug|Win32.ActiveCfg = Debug|Win32
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug|Win32.Build.0 = Debug|Win32
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug|x64.ActiveCfg = Debug|Win32
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug-Dynamic|Any CPU.ActiveCfg = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug-Dynamic|Any CPU.Build.0 = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug-Dynamic|ARM.ActiveCfg = Debug|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug-Dynamic|ARM.Build.0 = Debug|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug-Dynamic|Win32.ActiveCfg = Debug|Win32
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug-Dynamic|Win32.Build.0 = Debug|Win32
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug-Dynamic|x64.ActiveCfg = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug-Dynamic|x64.Build.0 = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug-Static|Any CPU.ActiveCfg = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug-Static|Any CPU.Build.0 = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug-Static|ARM.ActiveCfg = Debug|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug-Static|ARM.Build.0 = Debug|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug-Static|Win32.ActiveCfg = Debug|Win32
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug-Static|Win32.Build.0 = Debug|Win32
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug-Static|x64.ActiveCfg = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Debug-Static|x64.Build.0 = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release|Any CPU.ActiveCfg = Release|Win32
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release|ARM.ActiveCfg = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release|ARM.Build.0 = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release|Win32.ActiveCfg = Release|Win32
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release|Win32.Build.0 = Release|Win32
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release|x64.ActiveCfg = Release|Win32
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release-Dynamic|Any CPU.ActiveCfg = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release-Dynamic|Any CPU.Build.0 = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release-Dynamic|ARM.ActiveCfg = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release-Dynamic|ARM.Build.0 = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release-Dynamic|Win32.ActiveCfg = Release|Win32
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release-Dynamic|Win32.Build.0 = Release|Win32
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release-Dynamic|x64.ActiveCfg = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release-Dynamic|x64.Build.0 = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release-Static|Any CPU.ActiveCfg = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release-Static|Any CPU.Build.0 = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release-Static|ARM.ActiveCfg = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release-Static|ARM.Build.0 = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release-Static|Win32.ActiveCfg = Release|Win32
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release-Static|Win32.Build.0 = Release|Win32
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release-Static|x64.ActiveCfg = Release|ARM
{BBABEEA1-494C-4618-96E3-399873A5558B}.Release-Static|x64.Build.0 = Release|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug|ARM.ActiveCfg = Debug|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug|ARM.Build.0 = Debug|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug|ARM.Deploy.0 = Debug|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug|Win32.ActiveCfg = Debug|Win32
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug|Win32.Build.0 = Debug|Win32
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug|Win32.Deploy.0 = Debug|Win32
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug|x64.ActiveCfg = Debug|x64
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug|x64.Build.0 = Debug|x64
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug|x64.Deploy.0 = Debug|x64
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Dynamic|Any CPU.ActiveCfg = Debug|Any CPU
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Dynamic|Any CPU.Build.0 = Debug|Any CPU
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Dynamic|Any CPU.Deploy.0 = Debug|Any CPU
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Dynamic|ARM.ActiveCfg = Debug|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Dynamic|ARM.Build.0 = Debug|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Dynamic|ARM.Deploy.0 = Debug|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Dynamic|Win32.ActiveCfg = Debug|Win32
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Dynamic|Win32.Build.0 = Debug|Win32
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Dynamic|Win32.Deploy.0 = Debug|Win32
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Dynamic|x64.ActiveCfg = Debug|x64
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Dynamic|x64.Build.0 = Debug|x64
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Dynamic|x64.Deploy.0 = Debug|x64
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Static|Any CPU.ActiveCfg = Debug|Any CPU
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Static|Any CPU.Build.0 = Debug|Any CPU
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Static|Any CPU.Deploy.0 = Debug|Any CPU
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Static|ARM.ActiveCfg = Debug|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Static|ARM.Build.0 = Debug|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Static|ARM.Deploy.0 = Debug|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Static|Win32.ActiveCfg = Debug|Win32
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Static|Win32.Build.0 = Debug|Win32
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Static|Win32.Deploy.0 = Debug|Win32
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Static|x64.ActiveCfg = Debug|x64
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Static|x64.Build.0 = Debug|x64
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Debug-Static|x64.Deploy.0 = Debug|x64
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release|Any CPU.Build.0 = Release|Any CPU
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release|Any CPU.Deploy.0 = Release|Any CPU
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release|ARM.ActiveCfg = Release|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release|ARM.Build.0 = Release|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release|ARM.Deploy.0 = Release|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release|Win32.ActiveCfg = Release|Win32
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release|Win32.Build.0 = Release|Win32
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release|Win32.Deploy.0 = Release|Win32
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release|x64.ActiveCfg = Release|x64
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release|x64.Build.0 = Release|x64
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release|x64.Deploy.0 = Release|x64
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Dynamic|Any CPU.ActiveCfg = Release|Any CPU
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Dynamic|Any CPU.Build.0 = Release|Any CPU
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Dynamic|Any CPU.Deploy.0 = Release|Any CPU
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Dynamic|ARM.ActiveCfg = Release|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Dynamic|ARM.Build.0 = Release|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Dynamic|ARM.Deploy.0 = Release|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Dynamic|Win32.ActiveCfg = Release|Win32
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Dynamic|Win32.Build.0 = Release|Win32
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Dynamic|Win32.Deploy.0 = Release|Win32
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Dynamic|x64.ActiveCfg = Release|x64
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Dynamic|x64.Build.0 = Release|x64
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Dynamic|x64.Deploy.0 = Release|x64
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Static|Any CPU.ActiveCfg = Release|Any CPU
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Static|Any CPU.Build.0 = Release|Any CPU
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Static|Any CPU.Deploy.0 = Release|Any CPU
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Static|ARM.ActiveCfg = Release|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Static|ARM.Build.0 = Release|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Static|ARM.Deploy.0 = Release|ARM
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Static|Win32.ActiveCfg = Release|Win32
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Static|Win32.Build.0 = Release|Win32
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Static|Win32.Deploy.0 = Release|Win32
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Static|x64.ActiveCfg = Release|x64
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Static|x64.Build.0 = Release|x64
{3085ACA0-00DA-45BF-9110-A3684B56EBBA}.Release-Static|x64.Deploy.0 = Release|x64
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug|Any CPU.ActiveCfg = Debug|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug|ARM.ActiveCfg = Debug|ARM
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug|ARM.Build.0 = Debug|ARM
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug|ARM.Deploy.0 = Debug|ARM
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug|Win32.ActiveCfg = Debug|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug|Win32.Build.0 = Debug|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug|Win32.Deploy.0 = Debug|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug|x64.ActiveCfg = Debug|x64
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug|x64.Build.0 = Debug|x64
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug|x64.Deploy.0 = Debug|x64
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Dynamic|Any CPU.ActiveCfg = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Dynamic|Any CPU.Build.0 = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Dynamic|Any CPU.Deploy.0 = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Dynamic|ARM.ActiveCfg = Debug|ARM
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Dynamic|ARM.Build.0 = Debug|ARM
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Dynamic|ARM.Deploy.0 = Debug|ARM
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Dynamic|Win32.ActiveCfg = Debug|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Dynamic|Win32.Build.0 = Debug|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Dynamic|Win32.Deploy.0 = Debug|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Dynamic|x64.ActiveCfg = Debug|x64
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Dynamic|x64.Build.0 = Debug|x64
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Dynamic|x64.Deploy.0 = Debug|x64
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Static|Any CPU.ActiveCfg = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Static|Any CPU.Build.0 = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Static|Any CPU.Deploy.0 = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Static|ARM.ActiveCfg = Debug|ARM
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Static|ARM.Build.0 = Debug|ARM
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Static|ARM.Deploy.0 = Debug|ARM
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Static|Win32.ActiveCfg = Debug|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Static|Win32.Build.0 = Debug|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Static|Win32.Deploy.0 = Debug|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Static|x64.ActiveCfg = Debug|x64
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Static|x64.Build.0 = Debug|x64
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Debug-Static|x64.Deploy.0 = Debug|x64
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release|Any CPU.ActiveCfg = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release|ARM.ActiveCfg = Release|ARM
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release|ARM.Build.0 = Release|ARM
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release|ARM.Deploy.0 = Release|ARM
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release|Win32.ActiveCfg = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release|Win32.Build.0 = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release|Win32.Deploy.0 = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release|x64.ActiveCfg = Release|x64
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release|x64.Build.0 = Release|x64
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release|x64.Deploy.0 = Release|x64
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Dynamic|Any CPU.ActiveCfg = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Dynamic|Any CPU.Build.0 = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Dynamic|Any CPU.Deploy.0 = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Dynamic|ARM.ActiveCfg = Release|ARM
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Dynamic|ARM.Build.0 = Release|ARM
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Dynamic|ARM.Deploy.0 = Release|ARM
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Dynamic|Win32.ActiveCfg = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Dynamic|Win32.Build.0 = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Dynamic|Win32.Deploy.0 = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Dynamic|x64.ActiveCfg = Release|x64
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Dynamic|x64.Build.0 = Release|x64
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Dynamic|x64.Deploy.0 = Release|x64
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Static|Any CPU.ActiveCfg = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Static|Any CPU.Build.0 = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Static|Any CPU.Deploy.0 = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Static|ARM.ActiveCfg = Release|ARM
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Static|ARM.Build.0 = Release|ARM
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Static|ARM.Deploy.0 = Release|ARM
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Static|Win32.ActiveCfg = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Static|Win32.Build.0 = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Static|Win32.Deploy.0 = Release|x86
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Static|x64.ActiveCfg = Release|x64
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Static|x64.Build.0 = Release|x64
{D51DC5BE-5822-4B94-891C-E1B1B7892939}.Release-Static|x64.Deploy.0 = Release|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug|Any CPU.ActiveCfg = Debug|Win32
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug|ARM.ActiveCfg = Debug|ARM
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug|ARM.Build.0 = Debug|ARM
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug|Win32.ActiveCfg = Debug|Win32
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug|Win32.Build.0 = Debug|Win32
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug|x64.ActiveCfg = Debug|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug|x64.Build.0 = Debug|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug-Dynamic|Any CPU.ActiveCfg = Release|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug-Dynamic|Any CPU.Build.0 = Release|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug-Dynamic|ARM.ActiveCfg = Debug|ARM
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug-Dynamic|ARM.Build.0 = Debug|ARM
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug-Dynamic|Win32.ActiveCfg = Debug|Win32
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug-Dynamic|Win32.Build.0 = Debug|Win32
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug-Dynamic|x64.ActiveCfg = Debug|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug-Dynamic|x64.Build.0 = Debug|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug-Static|Any CPU.ActiveCfg = Release|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug-Static|Any CPU.Build.0 = Release|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug-Static|ARM.ActiveCfg = Debug|ARM
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug-Static|ARM.Build.0 = Debug|ARM
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug-Static|Win32.ActiveCfg = Debug|Win32
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug-Static|Win32.Build.0 = Debug|Win32
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug-Static|x64.ActiveCfg = Debug|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Debug-Static|x64.Build.0 = Debug|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release|Any CPU.ActiveCfg = Release|Win32
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release|ARM.ActiveCfg = Release|ARM
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release|ARM.Build.0 = Release|ARM
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release|Win32.ActiveCfg = Release|Win32
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release|Win32.Build.0 = Release|Win32
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release|x64.ActiveCfg = Release|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release|x64.Build.0 = Release|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release-Dynamic|Any CPU.ActiveCfg = Release|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release-Dynamic|Any CPU.Build.0 = Release|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release-Dynamic|ARM.ActiveCfg = Release|ARM
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release-Dynamic|ARM.Build.0 = Release|ARM
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release-Dynamic|Win32.ActiveCfg = Release|Win32
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release-Dynamic|Win32.Build.0 = Release|Win32
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release-Dynamic|x64.ActiveCfg = Release|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release-Dynamic|x64.Build.0 = Release|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release-Static|Any CPU.ActiveCfg = Release|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release-Static|Any CPU.Build.0 = Release|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release-Static|ARM.ActiveCfg = Release|ARM
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release-Static|ARM.Build.0 = Release|ARM
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release-Static|Win32.ActiveCfg = Release|Win32
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release-Static|Win32.Build.0 = Release|Win32
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release-Static|x64.ActiveCfg = Release|x64
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A}.Release-Static|x64.Build.0 = Release|x64
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug|Any CPU.ActiveCfg = Debug|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug|ARM.ActiveCfg = Debug|ARM
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug|ARM.Build.0 = Debug|ARM
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug|ARM.Deploy.0 = Debug|ARM
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug|Win32.ActiveCfg = Debug|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug|Win32.Build.0 = Debug|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug|Win32.Deploy.0 = Debug|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug|x64.ActiveCfg = Debug|x64
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug|x64.Build.0 = Debug|x64
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug|x64.Deploy.0 = Debug|x64
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Dynamic|Any CPU.ActiveCfg = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Dynamic|Any CPU.Build.0 = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Dynamic|Any CPU.Deploy.0 = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Dynamic|ARM.ActiveCfg = Debug|ARM
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Dynamic|ARM.Build.0 = Debug|ARM
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Dynamic|ARM.Deploy.0 = Debug|ARM
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Dynamic|Win32.ActiveCfg = Debug|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Dynamic|Win32.Build.0 = Debug|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Dynamic|Win32.Deploy.0 = Debug|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Dynamic|x64.ActiveCfg = Debug|x64
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Dynamic|x64.Build.0 = Debug|x64
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Dynamic|x64.Deploy.0 = Debug|x64
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Static|Any CPU.ActiveCfg = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Static|Any CPU.Build.0 = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Static|Any CPU.Deploy.0 = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Static|ARM.ActiveCfg = Debug|ARM
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Static|ARM.Build.0 = Debug|ARM
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Static|ARM.Deploy.0 = Debug|ARM
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Static|Win32.ActiveCfg = Debug|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Static|Win32.Build.0 = Debug|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Static|Win32.Deploy.0 = Debug|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Static|x64.ActiveCfg = Debug|x64
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Static|x64.Build.0 = Debug|x64
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Debug-Static|x64.Deploy.0 = Debug|x64
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release|Any CPU.ActiveCfg = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release|ARM.ActiveCfg = Release|ARM
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release|ARM.Build.0 = Release|ARM
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release|ARM.Deploy.0 = Release|ARM
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release|Win32.ActiveCfg = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release|Win32.Build.0 = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release|Win32.Deploy.0 = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release|x64.ActiveCfg = Release|x64
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release|x64.Build.0 = Release|x64
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release|x64.Deploy.0 = Release|x64
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Dynamic|Any CPU.ActiveCfg = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Dynamic|Any CPU.Build.0 = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Dynamic|Any CPU.Deploy.0 = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Dynamic|ARM.ActiveCfg = Release|ARM
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Dynamic|ARM.Build.0 = Release|ARM
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Dynamic|ARM.Deploy.0 = Release|ARM
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Dynamic|Win32.ActiveCfg = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Dynamic|Win32.Build.0 = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Dynamic|Win32.Deploy.0 = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Dynamic|x64.ActiveCfg = Release|x64
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Dynamic|x64.Build.0 = Release|x64
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Dynamic|x64.Deploy.0 = Release|x64
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Static|Any CPU.ActiveCfg = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Static|Any CPU.Build.0 = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Static|Any CPU.Deploy.0 = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Static|ARM.ActiveCfg = Release|ARM
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Static|ARM.Build.0 = Release|ARM
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Static|ARM.Deploy.0 = Release|ARM
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Static|Win32.ActiveCfg = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Static|Win32.Build.0 = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Static|Win32.Deploy.0 = Release|x86
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Static|x64.ActiveCfg = Release|x64
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Static|x64.Build.0 = Release|x64
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}.Release-Static|x64.Deploy.0 = Release|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug|Any CPU.ActiveCfg = Debug|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug|ARM.ActiveCfg = Debug|ARM
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug|ARM.Build.0 = Debug|ARM
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug|Win32.ActiveCfg = Debug|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug|Win32.Build.0 = Debug|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug|x64.ActiveCfg = Debug|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug|x64.Build.0 = Debug|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug-Dynamic|Any CPU.ActiveCfg = Release|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug-Dynamic|Any CPU.Build.0 = Release|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug-Dynamic|ARM.ActiveCfg = Debug|ARM
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug-Dynamic|ARM.Build.0 = Debug|ARM
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug-Dynamic|Win32.ActiveCfg = Debug|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug-Dynamic|Win32.Build.0 = Debug|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug-Dynamic|x64.ActiveCfg = Debug|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug-Dynamic|x64.Build.0 = Debug|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug-Static|Any CPU.ActiveCfg = Release|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug-Static|Any CPU.Build.0 = Release|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug-Static|ARM.ActiveCfg = Debug|ARM
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug-Static|ARM.Build.0 = Debug|ARM
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug-Static|Win32.ActiveCfg = Debug|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug-Static|Win32.Build.0 = Debug|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug-Static|x64.ActiveCfg = Debug|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug-Static|x64.Build.0 = Debug|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release|Any CPU.ActiveCfg = Release|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release|ARM.ActiveCfg = Release|ARM
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release|ARM.Build.0 = Release|ARM
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release|Win32.ActiveCfg = Release|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release|Win32.Build.0 = Release|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release|x64.ActiveCfg = Release|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release|x64.Build.0 = Release|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release-Dynamic|Any CPU.ActiveCfg = Release|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release-Dynamic|Any CPU.Build.0 = Release|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release-Dynamic|ARM.ActiveCfg = Release|ARM
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release-Dynamic|ARM.Build.0 = Release|ARM
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release-Dynamic|Win32.ActiveCfg = Release|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release-Dynamic|Win32.Build.0 = Release|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release-Dynamic|x64.ActiveCfg = Release|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release-Dynamic|x64.Build.0 = Release|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release-Static|Any CPU.ActiveCfg = Release|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release-Static|Any CPU.Build.0 = Release|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release-Static|ARM.ActiveCfg = Release|ARM
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release-Static|ARM.Build.0 = Release|ARM
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release-Static|Win32.ActiveCfg = Release|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release-Static|Win32.Build.0 = Release|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release-Static|x64.ActiveCfg = Release|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release-Static|x64.Build.0 = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug|Any CPU.ActiveCfg = Debug|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug|ARM.ActiveCfg = Debug|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug|ARM.Build.0 = Debug|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug|Win32.ActiveCfg = Debug|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug|Win32.Build.0 = Debug|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug|x64.ActiveCfg = Debug|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug|x64.Build.0 = Debug|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug|x64.Deploy.0 = Debug|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Dynamic|Any CPU.ActiveCfg = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Dynamic|Any CPU.Build.0 = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Dynamic|Any CPU.Deploy.0 = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Dynamic|ARM.ActiveCfg = Debug|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Dynamic|ARM.Build.0 = Debug|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Dynamic|ARM.Deploy.0 = Debug|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Dynamic|Win32.ActiveCfg = Debug|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Dynamic|Win32.Build.0 = Debug|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Dynamic|Win32.Deploy.0 = Debug|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Dynamic|x64.ActiveCfg = Debug|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Dynamic|x64.Build.0 = Debug|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Dynamic|x64.Deploy.0 = Debug|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Static|Any CPU.ActiveCfg = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Static|Any CPU.Build.0 = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Static|Any CPU.Deploy.0 = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Static|ARM.ActiveCfg = Debug|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Static|ARM.Build.0 = Debug|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Static|ARM.Deploy.0 = Debug|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Static|Win32.ActiveCfg = Debug|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Static|Win32.Build.0 = Debug|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Static|Win32.Deploy.0 = Debug|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Static|x64.ActiveCfg = Debug|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Static|x64.Build.0 = Debug|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug-Static|x64.Deploy.0 = Debug|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release|Any CPU.ActiveCfg = Release|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release|ARM.ActiveCfg = Release|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release|ARM.Build.0 = Release|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release|ARM.Deploy.0 = Release|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release|Win32.ActiveCfg = Release|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release|Win32.Build.0 = Release|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release|Win32.Deploy.0 = Release|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release|x64.ActiveCfg = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release|x64.Build.0 = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release|x64.Deploy.0 = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Dynamic|Any CPU.ActiveCfg = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Dynamic|Any CPU.Build.0 = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Dynamic|Any CPU.Deploy.0 = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Dynamic|ARM.ActiveCfg = Release|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Dynamic|ARM.Build.0 = Release|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Dynamic|ARM.Deploy.0 = Release|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Dynamic|Win32.ActiveCfg = Release|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Dynamic|Win32.Build.0 = Release|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Dynamic|Win32.Deploy.0 = Release|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Dynamic|x64.ActiveCfg = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Dynamic|x64.Build.0 = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Dynamic|x64.Deploy.0 = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Static|Any CPU.ActiveCfg = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Static|Any CPU.Build.0 = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Static|Any CPU.Deploy.0 = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Static|ARM.ActiveCfg = Release|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Static|ARM.Build.0 = Release|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Static|ARM.Deploy.0 = Release|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Static|Win32.ActiveCfg = Release|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Static|Win32.Build.0 = Release|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Static|Win32.Deploy.0 = Release|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Static|x64.ActiveCfg = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Static|x64.Build.0 = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release-Static|x64.Deploy.0 = Release|x64
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug|ARM.ActiveCfg = Debug|ARM
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug|ARM.Build.0 = Debug|ARM
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug|Win32.ActiveCfg = Debug|x86
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug|Win32.Build.0 = Debug|x86
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug|x64.ActiveCfg = Debug|x64
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug|x64.Build.0 = Debug|x64
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug-Dynamic|Any CPU.ActiveCfg = Debug|Any CPU
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug-Dynamic|Any CPU.Build.0 = Debug|Any CPU
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug-Dynamic|ARM.ActiveCfg = Debug|ARM
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug-Dynamic|ARM.Build.0 = Debug|ARM
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug-Dynamic|Win32.ActiveCfg = Debug|x86
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug-Dynamic|Win32.Build.0 = Debug|x86
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug-Dynamic|x64.ActiveCfg = Debug|x64
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug-Dynamic|x64.Build.0 = Debug|x64
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug-Static|Any CPU.ActiveCfg = Debug|Any CPU
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug-Static|Any CPU.Build.0 = Debug|Any CPU
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug-Static|ARM.ActiveCfg = Debug|ARM
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug-Static|ARM.Build.0 = Debug|ARM
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug-Static|Win32.ActiveCfg = Debug|x86
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug-Static|Win32.Build.0 = Debug|x86
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug-Static|x64.ActiveCfg = Debug|x64
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug-Static|x64.Build.0 = Debug|x64
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release|Any CPU.Build.0 = Release|Any CPU
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release|ARM.ActiveCfg = Release|ARM
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release|ARM.Build.0 = Release|ARM
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release|Win32.ActiveCfg = Release|x86
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release|Win32.Build.0 = Release|x86
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release|x64.ActiveCfg = Release|x64
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release|x64.Build.0 = Release|x64
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release-Dynamic|Any CPU.ActiveCfg = Release|Any CPU
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release-Dynamic|Any CPU.Build.0 = Release|Any CPU
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release-Dynamic|ARM.ActiveCfg = Release|ARM
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release-Dynamic|ARM.Build.0 = Release|ARM
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release-Dynamic|Win32.ActiveCfg = Release|x86
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release-Dynamic|Win32.Build.0 = Release|x86
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release-Dynamic|x64.ActiveCfg = Release|x64
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release-Dynamic|x64.Build.0 = Release|x64
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release-Static|Any CPU.ActiveCfg = Release|Any CPU
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release-Static|Any CPU.Build.0 = Release|Any CPU
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release-Static|ARM.ActiveCfg = Release|ARM
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release-Static|ARM.Build.0 = Release|ARM
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release-Static|Win32.ActiveCfg = Release|x86
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release-Static|Win32.Build.0 = Release|x86
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release-Static|x64.ActiveCfg = Release|x64
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release-Static|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -1649,5 +2228,18 @@ Global
{45D41ACC-2C3C-43D2-BC10-02AA73FFC7C7} = {54F6163A-66C6-4F09-844D-CC61DE8EE376}
{207E7BD4-7B11-4A40-BA3A-CC627762A7B6} = {54F6163A-66C6-4F09-844D-CC61DE8EE376}
{E75EFD41-C7F5-44C8-8FF1-A310D920989D} = {54F6163A-66C6-4F09-844D-CC61DE8EE376}
{452C38CE-6463-4963-A113-658B6BD91D15} = {78DA8BE5-2D77-49D6-8CA4-7847B65DBE84}
{DE5C2BE2-873A-4B85-8EBE-8AEA4C80212F} = {78DA8BE5-2D77-49D6-8CA4-7847B65DBE84}
{820034C1-645D-4340-8813-D980C1EF77DE} = {DE5C2BE2-873A-4B85-8EBE-8AEA4C80212F}
{C8D75245-FFCF-4932-A228-C9CC8BB60B03} = {DE5C2BE2-873A-4B85-8EBE-8AEA4C80212F}
{BBABEEA1-494C-4618-96E3-399873A5558B} = {DE5C2BE2-873A-4B85-8EBE-8AEA4C80212F}
{3085ACA0-00DA-45BF-9110-A3684B56EBBA} = {DE5C2BE2-873A-4B85-8EBE-8AEA4C80212F}
{D51DC5BE-5822-4B94-891C-E1B1B7892939} = {452C38CE-6463-4963-A113-658B6BD91D15}
{9C5609A2-32A2-483F-81EC-DAC2ED96BF6A} = {452C38CE-6463-4963-A113-658B6BD91D15}
{87D83489-039E-4123-BE01-CB62EE932A29} = {78DA8BE5-2D77-49D6-8CA4-7847B65DBE84}
{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9} = {87D83489-039E-4123-BE01-CB62EE932A29}
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65} = {87D83489-039E-4123-BE01-CB62EE932A29}
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6} = {87D83489-039E-4123-BE01-CB62EE932A29}
{9FDF5E33-D15D-409F-876E-4E77727936B9} = {87D83489-039E-4123-BE01-CB62EE932A29}
EndGlobalSection
EndGlobal

View File

@ -78,7 +78,7 @@
<Import Project="..\..\build\vs\pjproject-vs14-common-config.props" />
<PropertyGroup Label="Globals">
<ProjectGuid>{23D7679C-764C-4E02-8B29-BB882CEEEFE2}</ProjectGuid>
<RootNamespace>libpjproject</RootNamespace>
<RootNamespace>libpjproject</RootNamespace>
<!-- Specific UWP property -->
<DefaultLanguage>en-US</DefaultLanguage>
<AppContainerApplication Condition="'$(API_Family)'=='UWP'">true</AppContainerApplication>
@ -199,7 +199,8 @@
<!-- Override the PlatformToolset -->
<PropertyGroup>
<PlatformToolset>$(BuildToolset)</PlatformToolset>
<CharacterSet Condition="'$(API_Family)'!='WinDesktop'"></CharacterSet>
<CharacterSet Condition="'$(API_Family)'!='WinDesktop'">
</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@ -322,6 +323,7 @@
<PreprocessorDefinitions>_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderOutputFile>
</PrecompiledHeaderOutputFile>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
<ProjectReference>
<LinkLibraryDependencies>true</LinkLibraryDependencies>

View File

@ -78,14 +78,14 @@
<Import Project="..\..\build\vs\pjproject-vs14-common-config.props" />
<PropertyGroup Label="Globals">
<ProjectGuid>{8310649E-A25E-4AF0-91E8-9E3CC659BB89}</ProjectGuid>
<RootNamespace>pjsua</RootNamespace>
<RootNamespace>pjsua</RootNamespace>
<!-- Specific UWP property -->
<DefaultLanguage>en-US</DefaultLanguage>
<AppContainerApplication Condition="'$(API_Family)'=='UWP'">true</AppContainerApplication>
<ApplicationType Condition="'$(API_Family)'=='UWP'">Windows Store</ApplicationType>
<WindowsTargetPlatformVersion Condition="'$(API_Family)'=='UWP'">$(PlatformVersion)</WindowsTargetPlatformVersion>
<WindowsTargetPlatformMinVersion Condition="'$(API_Family)'=='UWP'">$(PlatformVersion)</WindowsTargetPlatformMinVersion>
<ApplicationTypeRevision Condition="'$(API_Family)'=='UWP'">$(AppTypeRev)</ApplicationTypeRevision>
<ApplicationTypeRevision Condition="'$(API_Family)'=='UWP'">$(AppTypeRev)</ApplicationTypeRevision>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release-Static|Win32'" Label="Configuration">
@ -199,7 +199,8 @@
<!-- Override the PlatformToolset -->
<PropertyGroup>
<PlatformToolset>$(BuildToolset)</PlatformToolset>
<CharacterSet Condition="'$(API_Family)'!='WinDesktop'"></CharacterSet>
<CharacterSet Condition="'$(API_Family)'!='WinDesktop'">
</CharacterSet>
<ConfigurationType Condition="'$(API_Family)'=='WinDesktop'">Application</ConfigurationType>
<ConfigurationType Condition="'$(API_Family)'=='UWP' Or '$(API_Family)'=='WinPhone8'">StaticLibrary</ConfigurationType>
</PropertyGroup>
@ -303,9 +304,9 @@
<!-- Compile and link option definition -->
<ItemDefinitionGroup>
<ClCompile>
<RuntimeLibrary Condition="'$(API_Family)'=='UWP'">MultiThreadedDebugDLL</RuntimeLibrary>
<RuntimeLibrary Condition="'$(API_Family)'=='UWP'">MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
</ItemDefinitionGroup>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>../../pjsip/include;../../pjlib/include;../../pjlib-util/include;../../pjmedia/include;../../pjnath/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
@ -566,6 +567,7 @@
<ItemGroup>
<ClInclude Include="..\src\pjsua\pjsua_app.h" />
<ClInclude Include="..\src\pjsua\pjsua_app_common.h" />
<ClInclude Include="..\src\pjsua\pjsua_app_config.h" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="libpjproject.vcxproj">

View File

@ -44,5 +44,8 @@
<ClInclude Include="..\src\pjsua\pjsua_app_common.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\pjsua\pjsua_app_config.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -80,6 +80,7 @@
<WholeProgramOptimization>true</WholeProgramOptimization>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<!-- Import common config -->
<Import Project="..\..\..\..\..\..\build\vs\pjproject-vs14-common-config.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">

View File

@ -1,157 +1,160 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="CheckAPI" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!--Check for API_Family-->
<PropertyGroup>
<PROJ_Target>UWP</PROJ_Target>
</PropertyGroup>
<Import Project="..\..\..\..\..\..\build\vs\pjproject-vs14-common-config.props" />
<Import Project="..\..\..\..\..\..\build\vs\pjproject-vs14-common-targets.targets" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == 'Win32' ">x86</Platform>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProjectGuid>{D26DD1D3-C631-4A56-BBE5-D42F1ACFD53A}</ProjectGuid>
<OutputType>AppContainerExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>PjsuaCLI.UI</RootNamespace>
<AssemblyName>pjsua_cli_uwp</AssemblyName>
<DefaultLanguage>en-US</DefaultLanguage>
<TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
<TargetPlatformVersion>10.0.10240.0</TargetPlatformVersion>
<TargetPlatformMinVersion>10.0.10240.0</TargetPlatformMinVersion>
<MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>
<EnableDotNetNativeCompatibleProfile>true</EnableDotNetNativeCompatibleProfile>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<!--<PackageCertificateKeyFile>pjsua_cli_uwp_TemporaryKey.pfx</PackageCertificateKeyFile>-->
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\ARM\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>ARM</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'">
<OutputPath>bin\ARM\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>ARM</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86' OR '$(Configuration)|$(Platform)' == 'Debug|Win32'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86' OR '$(Configuration)|$(Platform)' == 'Release|Win32'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<ItemGroup>
<!-- A reference to the entire .Net Framework and Windows SDK are automatically included -->
<Content Include="ApplicationInsights.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<None Include="project.json" />
</ItemGroup>
<ItemGroup>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
</Compile>
<Compile Include="MainPage.xaml.cs">
<DependentUpon>MainPage.xaml</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<AppxManifest Include="Package.appxmanifest">
<SubType>Designer</SubType>
</AppxManifest>
</ItemGroup>
<ItemGroup>
<Content Include="Assets\teluu-logo.png" />
<Content Include="Properties\Default.rd.xml" />
<Content Include="Assets\LockScreenLogo.scale-200.png" />
<Content Include="Assets\SplashScreen.scale-200.png" />
<Content Include="Assets\Square150x150Logo.scale-200.png" />
<Content Include="Assets\Square44x44Logo.scale-200.png" />
<Content Include="Assets\Square44x44Logo.targetsize-24_altform-unplated.png" />
<Content Include="Assets\StoreLogo.png" />
<Content Include="Assets\Wide310x150Logo.scale-200.png" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Page Include="MainPage.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\comp\pjsua_cli_uwp_comp.vcxproj">
<Project>{207e7bd4-7b11-4a40-ba3a-cc627762a7b6}</Project>
<Name>pjsua_cli_uwp_comp</Name>
</ProjectReference>
</ItemGroup>
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' ">
<VisualStudioVersion>14.0</VisualStudioVersion>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="CheckAPI" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!--Check for API_Family-->
<PropertyGroup>
<PROJ_Target>UWP</PROJ_Target>
</PropertyGroup>
<Import Project="..\..\..\..\..\..\build\vs\pjproject-vs14-common-config.props" />
<Import Project="..\..\..\..\..\..\build\vs\pjproject-vs14-common-targets.targets" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == 'Win32' ">x86</Platform>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProjectGuid>{D26DD1D3-C631-4A56-BBE5-D42F1ACFD53A}</ProjectGuid>
<OutputType>AppContainerExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>PjsuaCLI.UI</RootNamespace>
<AssemblyName>pjsua_cli_uwp</AssemblyName>
<DefaultLanguage>en-US</DefaultLanguage>
<TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
<TargetPlatformVersion>10.0.10240.0</TargetPlatformVersion>
<TargetPlatformMinVersion>10.0.10240.0</TargetPlatformMinVersion>
<MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>
<EnableDotNetNativeCompatibleProfile>true</EnableDotNetNativeCompatibleProfile>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<!--<PackageCertificateKeyFile>pjsua_cli_uwp_TemporaryKey.pfx</PackageCertificateKeyFile>-->
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\ARM\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>ARM</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'">
<OutputPath>bin\ARM\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>ARM</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86' OR '$(Configuration)|$(Platform)' == 'Debug|Win32'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86' OR '$(Configuration)|$(Platform)' == 'Release|Win32'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<ItemGroup>
<!-- A reference to the entire .Net Framework and Windows SDK are automatically included -->
<Content Include="ApplicationInsights.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<None Include="project.json" />
</ItemGroup>
<ItemGroup>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
</Compile>
<Compile Include="MainPage.xaml.cs">
<DependentUpon>MainPage.xaml</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<AppxManifest Include="Package.appxmanifest">
<SubType>Designer</SubType>
</AppxManifest>
</ItemGroup>
<ItemGroup>
<Content Include="Assets\teluu-logo.png" />
<Content Include="Properties\Default.rd.xml" />
<Content Include="Assets\LockScreenLogo.scale-200.png" />
<Content Include="Assets\SplashScreen.scale-200.png" />
<Content Include="Assets\Square150x150Logo.scale-200.png" />
<Content Include="Assets\Square44x44Logo.scale-200.png" />
<Content Include="Assets\Square44x44Logo.targetsize-24_altform-unplated.png" />
<Content Include="Assets\StoreLogo.png" />
<Content Include="Assets\Wide310x150Logo.scale-200.png" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Page Include="MainPage.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\comp\pjsua_cli_uwp_comp.vcxproj">
<Project>{207e7bd4-7b11-4a40-ba3a-cc627762a7b6}</Project>
<Name>pjsua_cli_uwp_comp</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<WCFMetadata Include="Service References\" />
</ItemGroup>
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' ">
<VisualStudioVersion>14.0</VisualStudioVersion>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,94 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.23107.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Voip", "Voip\Voip.csproj", "{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VoipHost", "VoipHost\VoipHost.vcxproj", "{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VoipTasks", "VoipTasks\VoipTasks.csproj", "{9FDF5E33-D15D-409F-876E-4E77727936B9}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VoipBackEnd", "VoipBackEnd\VoipBackEnd.vcxproj", "{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|ARM = Debug|ARM
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|ARM = Release|ARM
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Debug|Any CPU.ActiveCfg = Debug|x86
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Debug|ARM.ActiveCfg = Debug|ARM
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Debug|ARM.Build.0 = Debug|ARM
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Debug|ARM.Deploy.0 = Debug|ARM
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Debug|x64.ActiveCfg = Debug|x64
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Debug|x64.Build.0 = Debug|x64
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Debug|x64.Deploy.0 = Debug|x64
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Debug|x86.ActiveCfg = Debug|x86
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Debug|x86.Build.0 = Debug|x86
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Debug|x86.Deploy.0 = Debug|x86
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Release|Any CPU.ActiveCfg = Release|x86
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Release|ARM.ActiveCfg = Release|ARM
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Release|ARM.Build.0 = Release|ARM
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Release|ARM.Deploy.0 = Release|ARM
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Release|x64.ActiveCfg = Release|x64
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Release|x64.Build.0 = Release|x64
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Release|x64.Deploy.0 = Release|x64
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Release|x86.ActiveCfg = Release|x86
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Release|x86.Build.0 = Release|x86
{DFD0DAC2-D55D-4CC2-AC95-DD36C6539585}.Release|x86.Deploy.0 = Release|x86
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug|Any CPU.ActiveCfg = Debug|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug|ARM.ActiveCfg = Debug|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug|ARM.Build.0 = Debug|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug|x64.ActiveCfg = Debug|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug|x64.Build.0 = Debug|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug|x86.ActiveCfg = Debug|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Debug|x86.Build.0 = Debug|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release|Any CPU.ActiveCfg = Release|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release|ARM.ActiveCfg = Release|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release|ARM.Build.0 = Release|ARM
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release|x64.ActiveCfg = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release|x64.Build.0 = Release|x64
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release|x86.ActiveCfg = Release|Win32
{016D497F-0EE0-449E-89F5-BD63F7F9A8A6}.Release|x86.Build.0 = Release|Win32
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug|ARM.ActiveCfg = Debug|ARM
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug|ARM.Build.0 = Debug|ARM
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug|x64.ActiveCfg = Debug|x64
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug|x64.Build.0 = Debug|x64
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug|x86.ActiveCfg = Debug|x86
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Debug|x86.Build.0 = Debug|x86
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release|Any CPU.Build.0 = Release|Any CPU
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release|ARM.ActiveCfg = Release|ARM
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release|ARM.Build.0 = Release|ARM
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release|x64.ActiveCfg = Release|x64
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release|x64.Build.0 = Release|x64
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release|x86.ActiveCfg = Release|x86
{9FDF5E33-D15D-409F-876E-4E77727936B9}.Release|x86.Build.0 = Release|x86
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug|Any CPU.ActiveCfg = Debug|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug|ARM.ActiveCfg = Debug|ARM
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug|ARM.Build.0 = Debug|ARM
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug|x64.ActiveCfg = Debug|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug|x64.Build.0 = Debug|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug|x86.ActiveCfg = Debug|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Debug|x86.Build.0 = Debug|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release|Any CPU.ActiveCfg = Release|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release|ARM.ActiveCfg = Release|ARM
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release|ARM.Build.0 = Release|ARM
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release|x64.ActiveCfg = Release|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release|x64.Build.0 = Release|x64
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release|x86.ActiveCfg = Release|Win32
{FC9CBB95-624C-4CE8-86A8-3AB5A415AA65}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,8 @@
<Application
x:Class="VoipUI.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:VoipUI"
RequestedTheme="Light">
</Application>

View File

@ -0,0 +1,139 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using VoipTasks.BackgroundOperations;
using VoipUI.Helpers;
using System.Diagnostics;
namespace VoipUI
{
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
sealed partial class App : Application
{
/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
public App()
{
Microsoft.ApplicationInsights.WindowsAppInitializer.InitializeAsync(
Microsoft.ApplicationInsights.WindowsCollectors.Metadata |
Microsoft.ApplicationInsights.WindowsCollectors.Session);
this.InitializeComponent();
this.Suspending += OnSuspending;
}
/// <summary>
/// Invoked when the application is launched normally by the end user. Other entry points
/// will be used such as when the application is launched to open a specific file.
/// </summary>
/// <param name="e">Details about the launch request and process.</param>
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
#if DEBUG
if (System.Diagnostics.Debugger.IsAttached)
{
this.DebugSettings.EnableFrameRateCounter = true;
}
#endif
Frame rootFrame = Window.Current.Content as Frame;
// Do not repeat app initialization when the Window already has content,
// just ensure that the window is active
if (rootFrame == null)
{
// Create a Frame to act as the navigation context and navigate to the first page
rootFrame = new Frame();
rootFrame.NavigationFailed += OnNavigationFailed;
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
//TODO: Load state from previously suspended application
}
// Place the frame in the current Window
Window.Current.Content = rootFrame;
}
if (rootFrame.Content == null)
{
// When the navigation stack isn't restored navigate to the first page,
// configuring the new page by passing required information as a navigation
// parameter
rootFrame.Navigate(typeof(MainPage), e.Arguments);
}
/* Start service. */
StartServiceAsync();
// Ensure the current window is active
Window.Current.Activate();
}
private async void GetAccountInfoAsync()
{
try
{
OperationResult result = await EndpointHelper.GetAccountInfo();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
private async void StartServiceAsync()
{
try
{
OperationResult result = await EndpointHelper.StartServiceAsync();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
/// <summary>
/// Invoked when Navigation to a certain page fails
/// </summary>
/// <param name="sender">The Frame which failed navigation</param>
/// <param name="e">Details about the navigation failure</param>
void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
{
throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
}
/// <summary>
/// Invoked when application execution is being suspended. Application state is saved
/// without knowing whether the application will be terminated or resumed with the contents
/// of memory still intact.
/// </summary>
/// <param name="sender">The source of the suspend request.</param>
/// <param name="e">Details about the suspend request.</param>
private void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
//TODO: Save application state and stop any background activity
deferral.Complete();
}
}
}

View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights xmlns = "http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
</ApplicationInsights>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -0,0 +1,218 @@
//*********************************************************
//
// Copyright (c) Microsoft. All rights reserved.
// This code is licensed under the MIT License (MIT).
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
//
//*********************************************************
using System;
using System.Threading.Tasks;
using VoipTasks.BackgroundOperations;
using Windows.ApplicationModel.AppService;
using Windows.Foundation.Collections;
using Windows.ApplicationModel.Core;
using Windows.UI.Core;
namespace VoipUI.Helpers
{
class AppServiceHelper
{
~AppServiceHelper()
{
if (_appConnection != null)
{
_appConnection.Dispose();
_appConnection = null;
}
}
public async Task<ValueSet> SendMessageAsync(ValueSet message)
{
ValueSet returnValue = null;
AppServiceConnection appConnection = await GetAppConnectionAsync();
if (appConnection != null)
{
AppServiceResponse response = await appConnection.SendMessageAsync(message);
if (response.Status == AppServiceResponseStatus.Success)
{
if (response.Message.Keys.Contains(BackgroundOperation.Result))
{
returnValue = response.Message;
}
}
}
return returnValue;
}
public async void SendMessage(ValueSet message)
{
AppServiceConnection appConnection = await GetAppConnectionAsync();
if (appConnection != null)
{
await appConnection.SendMessageAsync(message);
}
}
private async Task<AppServiceConnection> GetAppConnectionAsync()
{
AppServiceConnection appConnection = _appConnection;
if (appConnection == null)
{
appConnection = new AppServiceConnection();
appConnection.ServiceClosed += AppConnection_ServiceClosed;
appConnection.AppServiceName = BackgroundOperation.AppServiceName;
appConnection.PackageFamilyName = Windows.ApplicationModel.Package.Current.Id.FamilyName;
AppServiceConnectionStatus status = await appConnection.OpenAsync();
if (status == AppServiceConnectionStatus.Success)
{
_appConnection = appConnection;
_appConnection.RequestReceived += Connection_RequestReceived;
}
}
return appConnection;
}
private void AppConnection_ServiceClosed(AppServiceConnection sender, AppServiceClosedEventArgs args)
{
_appConnection = null;
}
private async void Connection_RequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
var deferral = args.GetDeferral();
var response = new ValueSet();
//bool stop = false;
try
{
var request = args.Request;
var message = request.Message;
if (message.ContainsKey(ForegroundOperation.NewForegroundRequest))
{
switch ((ForegroundReguest)message[ForegroundOperation.NewForegroundRequest])
{
case ForegroundReguest.UpdateCallState:
AppRequest = args.Request;
Request = ForegroundReguest.UpdateCallState;
AppRequestDeferal = deferral;
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
MainPage.Current.UpdateCallState(message[UpdateCallStateArguments.CallState.ToString()] as String);
});
break;
case ForegroundReguest.UpdateRegState:
AppRequest = args.Request;
Request = ForegroundReguest.UpdateRegState;
AppRequestDeferal = deferral;
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
MainPage.Current.UpdateRegState(message[UpdateRegStateArguments.RegState.ToString()] as String);
});
break;
case ForegroundReguest.UpdateAcccountInfo:
AppRequest = args.Request;
Request = ForegroundReguest.UpdateAcccountInfo;
AppRequestDeferal = deferral;
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
MainPage.Current.UpdateAccountInfo(message[UpdateAccountInfoArguments.id.ToString()] as String,
message[UpdateAccountInfoArguments.registrar.ToString()] as String,
message[UpdateAccountInfoArguments.proxy.ToString()] as String,
message[UpdateAccountInfoArguments.username.ToString()] as String,
message[UpdateAccountInfoArguments.password.ToString()] as String);
});
break;
default:
break;
}
}
}
finally
{
}
}
public static AppServiceRequest AppRequest
{
set
{
lock (_lock)
{
_appRequest = value;
}
}
get
{
lock (_lock)
{
return _appRequest;
}
}
}
public static AppServiceDeferral AppRequestDeferal
{
set
{
lock (_lock)
{
_appDeferral = value;
}
}
get
{
lock (_lock)
{
return _appDeferral;
}
}
}
public static ForegroundReguest Request
{
set
{
lock (_lock)
{
_request = value;
}
}
get
{
lock (_lock)
{
return _request;
}
}
}
private AppServiceConnection _appConnection = null;
private static AppServiceRequest _appRequest = null;
private static AppServiceDeferral _appDeferral = null;
private static ForegroundReguest _request = ForegroundReguest.InValid;
private static Object _lock = new Object();
}
}

View File

@ -0,0 +1,99 @@
/* $Id*/
/*
* Copyright (C) 2016 Teluu Inc. (http://www.teluu.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
using System;
using System.Threading.Tasks;
using VoipTasks.BackgroundOperations;
using Windows.Foundation.Collections;
using Windows.Foundation.Metadata;
using VoipBackEnd;
namespace VoipUI.Helpers
{
static class EndpointHelper
{
public static async Task<OperationResult> StartServiceAsync()
{
if (!ApiInformation.IsApiContractPresent("Windows.ApplicationModel.Calls.CallsVoipContract", 1))
{
return OperationResult.Failed;
}
AppServiceHelper appServiceHelper = new AppServiceHelper();
ValueSet message = new ValueSet();
message[BackgroundOperation.NewBackgroundRequest] = (int)BackgroundRequest.StartService;
ValueSet response = await appServiceHelper.SendMessageAsync(message);
if (response != null)
{
return ((OperationResult)(response[BackgroundOperation.Result]));
}
return OperationResult.Failed;
}
public static async Task<OperationResult> GetAccountInfo()
{
if (!ApiInformation.IsApiContractPresent("Windows.ApplicationModel.Calls.CallsVoipContract", 1))
{
return OperationResult.Failed;
}
AppServiceHelper appServiceHelper = new AppServiceHelper();
ValueSet message = new ValueSet();
message[BackgroundOperation.NewBackgroundRequest] = (int)BackgroundRequest.GetAccountInfo;
ValueSet response = await appServiceHelper.SendMessageAsync(message);
if (response != null)
{
return ((OperationResult)(response[BackgroundOperation.Result]));
}
return OperationResult.Failed;
}
public static async Task<OperationResult> ModifyAccount(String id, String registrar, String proxy, String username, String password)
{
if (!ApiInformation.IsApiContractPresent("Windows.ApplicationModel.Calls.CallsVoipContract", 1))
{
return OperationResult.Failed;
}
AppServiceHelper appServiceHelper = new AppServiceHelper();
ValueSet message = new ValueSet();
message[ModifyAccountArguments.id.ToString()] = id;
message[ModifyAccountArguments.registrar.ToString()] = registrar;
message[ModifyAccountArguments.proxy.ToString()] = proxy;
message[ModifyAccountArguments.username.ToString()] = username;
message[ModifyAccountArguments.password.ToString()] = password;
message[BackgroundOperation.NewBackgroundRequest] = (int)BackgroundRequest.ModifyAccount;
ValueSet response = await appServiceHelper.SendMessageAsync(message);
if (response != null)
{
return ((OperationResult)(response[BackgroundOperation.Result]));
}
return OperationResult.Failed;
}
}
}

View File

@ -0,0 +1,56 @@
//*********************************************************
//
// Copyright (c) Microsoft. All rights reserved.
// This code is licensed under the MIT License (MIT).
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
//
//*********************************************************
using System;
using System.Threading.Tasks;
using VoipTasks.BackgroundOperations;
using Windows.Foundation.Collections;
using Windows.Foundation.Metadata;
namespace VoipUI.Helpers
{
static class VoipCallHelper
{
public static async Task<OperationResult> NewOutgoingCallAsync(String dstURI)
{
if (!ApiInformation.IsApiContractPresent("Windows.ApplicationModel.Calls.CallsVoipContract", 1))
{
return OperationResult.Failed;
}
AppServiceHelper appServiceHelper = new AppServiceHelper();
ValueSet message = new ValueSet();
message[NewCallArguments.DstURI.ToString()] = dstURI;
message[BackgroundOperation.NewBackgroundRequest] = (int)BackgroundRequest.NewOutgoingCall;
ValueSet response = await appServiceHelper.SendMessageAsync(message);
if (response != null)
{
return ((OperationResult)(response[BackgroundOperation.Result]));
}
return OperationResult.Failed;
}
public static OperationResult EndCallAsync()
{
AppServiceHelper appServiceHelper = new AppServiceHelper();
ValueSet message = new ValueSet();
message[BackgroundOperation.NewBackgroundRequest] = (int)BackgroundRequest.EndCall;
appServiceHelper.SendMessage(message);
return OperationResult.Succeeded;
}
}
}

View File

@ -0,0 +1,136 @@
<Page
x:Class="VoipUI.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:VoipUI"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
<TextBlock FontSize="12" Text="Pjsua Sample App" Margin="5"/>
<TextBox x:Name="txt_CallerName" Text="Test Account" Margin="5"/>
<TextBox x:Name="txt_CallerNumber" Text="sip:192.168.0.103:6000" Margin="5"/>
</StackPanel>
<StackPanel Grid.Row="1">
<Grid HorizontalAlignment="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="165"/>
<ColumnDefinition Width="165"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Button x:Name="btn_NewOutgoingCall"
Grid.Column="0" Grid.Row="0"
Content="Make Call"
HorizontalAlignment="Left" VerticalAlignment="Top"
Width="150" Height="40"
Margin="5"
Click="btn_NewOutgoingCall_Click"/>
<Button x:Name="btn_EndCall" Grid.Column="1" Grid.Row="0" Content="End Call"
HorizontalAlignment="Left" VerticalAlignment="Top"
Width="150" Height="40"
Margin="5" Click="btn_EndCall_Click"/>
<TextBlock x:Name="label1" Grid.Column="0" Grid.Row="1"
HorizontalAlignment="Left" VerticalAlignment="Center"
Width="150" Height="40"
Text="User Id"
Margin="10,5,5,5"/>
<TextBox x:Name="txt_UserId" Grid.Column="1" Grid.Row="1"
HorizontalAlignment="Right" VerticalAlignment="Center"
Width="150" Height="40"
Margin="5" IsEnabled="True"/>
<TextBlock x:Name="label2" Grid.Column="0" Grid.Row="2"
HorizontalAlignment="Left" VerticalAlignment="Center"
Width="150" Height="40"
Text="Registrar"
Margin="10,5,5,5"/>
<TextBox x:Name="txt_Registrar" Grid.Column="1" Grid.Row="2"
HorizontalAlignment="Right" VerticalAlignment="Center"
Width="150" Height="40"
Margin="5" IsEnabled="True"/>
<TextBlock x:Name="label3" Grid.Column="0" Grid.Row="3"
HorizontalAlignment="Left" VerticalAlignment="Center"
Width="150" Height="40"
Text="Proxy"
Margin="10,5,5,5"/>
<TextBox x:Name="txt_Proxy" Grid.Column="1" Grid.Row="3"
HorizontalAlignment="Right" VerticalAlignment="Center"
Width="150" Height="40"
Margin="5" IsEnabled="True"/>
<TextBlock x:Name="label4" Grid.Column="0" Grid.Row="4"
HorizontalAlignment="Left" VerticalAlignment="Center"
Width="150" Height="40"
Text="User Name"
Margin="10,5,5,5"/>
<TextBox x:Name="txt_RegUserName" Grid.Column="1" Grid.Row="4"
HorizontalAlignment="Right" VerticalAlignment="Center"
Width="150" Height="40"
Margin="5" IsEnabled="True"/>
<TextBlock x:Name="label5" Grid.Column="0" Grid.Row="5"
HorizontalAlignment="Left" VerticalAlignment="Center"
Width="150" Height="40"
Text="Password"
Margin="10,5,5,5"/>
<TextBox x:Name="txt_Password" Grid.Column="1" Grid.Row="5"
HorizontalAlignment="Right" VerticalAlignment="Center"
Width="150" Height="40"
Margin="5" IsEnabled="True"/>
<Button x:Name="btn_GetAccountInfo" Grid.Column="0" Grid.Row="6" Content="Get Account Info"
HorizontalAlignment="Left" VerticalAlignment="Top"
Width="150" Height="40"
Margin="5" Click="btn_GetAccountInfo_Click"/>
<Button x:Name="btn_ModifyAccount" Grid.Column="1" Grid.Row="6" Content="Modify Account"
HorizontalAlignment="Left" VerticalAlignment="Top"
Width="150" Height="40"
Margin="5" Click="btn_ModifyAccount_Click"/>
<TextBlock x:Name="txt_RegState" Grid.Column="0" Grid.Row="7"
Text="Reg: Not Registered"
Margin="15,20,5,15"
VerticalAlignment="Bottom"
HorizontalAlignment="Center"
TextWrapping="WrapWholeWords"/>
<TextBlock x:Name="txt_CallStatus" Grid.Column="1" Grid.Row="7"
Text="Disconnected"
Margin="15,20,5,15"
VerticalAlignment="Bottom"
HorizontalAlignment="Center"
TextWrapping="WrapWholeWords"/>
</Grid>
</StackPanel>
</Grid>
</Page>

View File

@ -0,0 +1,136 @@
//*********************************************************
//
// Copyright (c) Microsoft. All rights reserved.
// This code is licensed under the MIT License (MIT).
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
//
//*********************************************************
using System;
using VoipUI.Helpers;
using VoipTasks.BackgroundOperations;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using System.Diagnostics;
using VoipBackEnd;
using System.Threading;
using Windows.ApplicationModel.AppService;
using Windows.UI.Xaml.Navigation;
namespace VoipUI
{
public sealed partial class MainPage : Page
{
//App developer should include the logic to prevent the user from being
//able to call the Start Call async method multiple times. This is out
//of the scope of this sample.
private int MethodCallUnexpectedTime = -2147483634;
public static string callerName, callerNumber;
public static MainPage Current;
public MainPage()
{
this.InitializeComponent();
Current = this;
}
private async void GetAccountInfoAsync()
{
try
{
OperationResult result = await EndpointHelper.GetAccountInfo();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
private async void ModifyAccountAsync()
{
try
{
OperationResult result = await EndpointHelper.ModifyAccount(
txt_UserId.Text,
txt_Registrar.Text,
txt_Proxy.Text,
txt_RegUserName.Text,
txt_Password.Text);
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
private async void NewOutgoingCallAsync()
{
try
{
OperationResult result = await VoipCallHelper.NewOutgoingCallAsync(txt_CallerNumber.Text);
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
private void EndCall()
{
try
{
OperationResult result = VoipCallHelper.EndCallAsync();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
txt_CallStatus.Text = "Disconnected";
}
public void UpdateAccountInfo(String id, String registrar, String proxy,
String username, String password)
{
txt_UserId.Text = id;
txt_Registrar.Text = registrar;
txt_Proxy.Text = proxy;
txt_RegUserName.Text = username;
txt_Password.Text = password;
}
private void btn_NewOutgoingCall_Click(object sender, RoutedEventArgs e)
{
NewOutgoingCallAsync();
}
private void btn_EndCall_Click(object sender, RoutedEventArgs e)
{
EndCall();
}
public void UpdateCallState(String state)
{
txt_CallStatus.Text = state;
}
public void UpdateRegState(String state)
{
txt_RegState.Text = "Reg:" + state;
}
private void btn_GetAccountInfo_Click(object sender, RoutedEventArgs e)
{
GetAccountInfoAsync();
}
private void btn_ModifyAccount_Click(object sender, RoutedEventArgs e)
{
ModifyAccountAsync();
}
}
}

View File

@ -0,0 +1,29 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Voip")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Voip")]
[assembly: AssemblyCopyright("Copyright © 2016")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: ComVisible(false)]

View File

@ -0,0 +1,31 @@
<!--
This file contains Runtime Directives used by .NET Native. The defaults here are suitable for most
developers. However, you can modify these parameters to modify the behavior of the .NET Native
optimizer.
Runtime Directives are documented at http://go.microsoft.com/fwlink/?LinkID=391919
To fully enable reflection for App1.MyClass and all of its public/private members
<Type Name="App1.MyClass" Dynamic="Required All"/>
To enable dynamic creation of the specific instantiation of AppClass<T> over System.Int32
<TypeInstantiation Name="App1.AppClass" Arguments="System.Int32" Activate="Required Public" />
Using the Namespace directive to apply reflection policy to all the types in a particular namespace
<Namespace Name="DataClasses.ViewModels" Seralize="All" />
-->
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<!--
An Assembly element with Name="*Application*" applies to all assemblies in
the application package. The asterisks are not wildcards.
-->
<Assembly Name="*Application*" Dynamic="Required All" />
<!-- Add your application specific runtime directives here. -->
</Application>
</Directives>

View File

@ -0,0 +1,161 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProjectGuid>{B11B5672-B1E8-4C77-BDA1-4E6620F96BF9}</ProjectGuid>
<OutputType>AppContainerExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>VoipUI</RootNamespace>
<AssemblyName>Voip</AssemblyName>
<DefaultLanguage>en-US</DefaultLanguage>
<TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
<TargetPlatformVersion>10.0.10586.0</TargetPlatformVersion>
<TargetPlatformMinVersion>10.0.10586.0</TargetPlatformMinVersion>
<MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>
<EnableDotNetNativeCompatibleProfile>true</EnableDotNetNativeCompatibleProfile>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<PackageCertificateKeyFile>Voip_TemporaryKey.pfx</PackageCertificateKeyFile>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\ARM\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>ARM</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'">
<OutputPath>bin\ARM\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>ARM</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<ItemGroup>
<!-- A reference to the entire .Net Framework and Windows SDK are automatically included -->
<Content Include="ApplicationInsights.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<None Include="project.json" />
</ItemGroup>
<ItemGroup>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
</Compile>
<Compile Include="Helpers\AppServiceHelper.cs" />
<Compile Include="Helpers\EndpointHelper.cs" />
<Compile Include="Helpers\VoipCallHelper.cs" />
<Compile Include="MainPage.xaml.cs">
<DependentUpon>MainPage.xaml</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<AppxManifest Include="Package.appxmanifest">
<SubType>Designer</SubType>
</AppxManifest>
<None Include="Voip_TemporaryKey.pfx" />
</ItemGroup>
<ItemGroup>
<Content Include="Properties\Default.rd.xml" />
<Content Include="Assets\LockScreenLogo.scale-200.png" />
<Content Include="Assets\SplashScreen.scale-200.png" />
<Content Include="Assets\Square150x150Logo.scale-200.png" />
<Content Include="Assets\Square44x44Logo.scale-200.png" />
<Content Include="Assets\Square44x44Logo.targetsize-24_altform-unplated.png" />
<Content Include="Assets\StoreLogo.png" />
<Content Include="Assets\Wide310x150Logo.scale-200.png" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Page Include="MainPage.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\VoipBackEnd\VoipBackEnd.vcxproj">
<Project>{fc9cbb95-624c-4ce8-86a8-3ab5a415aa65}</Project>
<Name>VoipBackEnd</Name>
</ProjectReference>
<ProjectReference Include="..\VoipHost\VoipHost.vcxproj">
<Project>{016d497f-0ee0-449e-89f5-bd63f7f9a8a6}</Project>
<Name>VoipHost</Name>
</ProjectReference>
<ProjectReference Include="..\VoipTasks\VoipTasks.csproj">
<Project>{9fdf5e33-d15d-409f-876e-4e77727936b9}</Project>
<Name>VoipTasks</Name>
</ProjectReference>
</ItemGroup>
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' ">
<VisualStudioVersion>14.0</VisualStudioVersion>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" IgnorableNamespaces="uap mp">
<Identity Name="43db1af2-7e7c-499d-8ca6-9f3695ed1ec9" Publisher="CN=Riza" Version="1.0.0.0" />
<mp:PhoneIdentity PhoneProductId="43db1af2-7e7c-499d-8ca6-9f3695ed1ec9" PhonePublisherId="00000000-0000-0000-0000-000000000000" />
<Properties>
<DisplayName>Voip</DisplayName>
<PublisherDisplayName>Riza</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate" />
</Resources>
<Applications>
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="VoipUI.App">
<uap:VisualElements DisplayName="Voip" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="Voip" BackgroundColor="transparent">
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png">
</uap:DefaultTile>
</uap:VisualElements>
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="VoipTasks.CallRtcTask">
<BackgroundTasks ServerName="VoipHost">
<Task Type="systemEvent" />
</BackgroundTasks>
</Extension>
<uap:Extension Category="windows.appService" EntryPoint="VoipTasks.AppService">
<uap:AppService Name="VoipTasks.AppService" ServerName="VoipHost" />
</uap:Extension>
<uap:Extension Category="windows.voipCall">
</uap:Extension>
</Extensions>
</Application>
</Applications>
<Capabilities>
<Capability Name="internetClientServer" />
<Capability Name="privateNetworkClientServer" />
<uap:Capability Name="voipCall" />
<uap:Capability Name="phoneCall" />
<DeviceCapability Name="microphone" />
<DeviceCapability Name="webcam" />
</Capabilities>
<Extensions>
<Extension Category="windows.activatableClass.outOfProcessServer">
<OutOfProcessServer ServerName="VoipHost">
<Path>VoipHost.exe</Path>
<Instancing>singleInstance</Instancing>
<ActivatableClass ActivatableClassId="VoipHost.Dummy" />
</OutOfProcessServer>
</Extension>
</Extensions>
</Package>

View File

@ -0,0 +1,19 @@
{
"dependencies": {
"Microsoft.ApplicationInsights": "1.0.0",
"Microsoft.ApplicationInsights.PersistenceChannel": "1.0.0",
"Microsoft.ApplicationInsights.WindowsApps": "1.0.0",
"Microsoft.NETCore.UniversalWindowsPlatform": "5.0.0"
},
"frameworks": {
"uap10.0": {}
},
"runtimes": {
"win10-arm": {},
"win10-arm-aot": {},
"win10-x86": {},
"win10-x86-aot": {},
"win10-x64": {},
"win10-x64-aot": {}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,18 @@
/*
Copyright (c) 2012 Microsoft Corporation. All rights reserved.
Use of this sample source code is subject to the terms of the Microsoft license
agreement under which you licensed this sample source code and is provided AS-IS.
If you did not accept the terms of the license agreement, you are not authorized
to use this sample source code. For the terms of the license, please see the
license agreement between you and Microsoft.
*/
#include "pch.h"
#include "ApiLock.h"
namespace VoipBackEnd
{
// A mutex used to protect objects accessible from the API surface exposed by this DLL
std::recursive_mutex g_apiLock;
}

View File

@ -0,0 +1,21 @@
/*
Copyright (c) 2012 Microsoft Corporation. All rights reserved.
Use of this sample source code is subject to the terms of the Microsoft license
agreement under which you licensed this sample source code and is provided AS-IS.
If you did not accept the terms of the license agreement, you are not authorized
to use this sample source code. For the terms of the license, please see the
license agreement between you and Microsoft.
To see all Code Samples for Windows Phone, visit http://go.microsoft.com/fwlink/?LinkID=219604
*/
#pragma once
#include <mutex>
namespace VoipBackEnd
{
// A mutex used to protect objects accessible from the API surface exposed by this DLL
extern std::recursive_mutex g_apiLock;
}

View File

@ -0,0 +1,629 @@
/* $Id$ */
/*
* Copyright (C) 2016 Teluu Inc. (http://www.teluu.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "MyApp.h"
#include <memory>
#include <winerror.h>
#include <pplawait.h>
using namespace VoipBackEnd;
using namespace Windows::Storage;
const std::string CONFIG_NAME = "pjsua2.json";
const int SIP_PORT = 5060;
const int LOG_LEVEL = 5;
const std::string THIS_FILE = "MyApp.cpp";
#define GenHresultFromITF(x) (MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, x))
MyAppRT^ MyAppRT::singleton = nullptr;
#define DEFAULT_DESTRUCTOR() \
delete inPtr;
#define CHECK_EXCEPTION(expr) \
do { \
try { \
(expr); \
} catch (pj::Error e) { \
Platform::Exception^ exp = ref new Platform::COMException( \
GenHresultFromITF(e.status)); \
} \
} while (0)
///////////////////////////////////////////////////////////////////////////////
std::string make_string(const std::wstring& wstring)
{
auto wideData = wstring.c_str();
int bufferSize = WideCharToMultiByte(CP_UTF8, 0, wideData,
-1, nullptr, 0, NULL, NULL);
std::unique_ptr<char[]> utf8;
utf8.reset(new char[bufferSize]);
if (WideCharToMultiByte(CP_UTF8, 0, wideData, -1,
utf8.get(), bufferSize, NULL, NULL) == 0)
{
return std::string();
}
return std::string(utf8.get());
}
std::wstring make_wstring(const std::string& string)
{
auto utf8Data = string.c_str();
int bufferSize = MultiByteToWideChar(CP_UTF8, 0, utf8Data, -1, nullptr, 0);
std::unique_ptr<wchar_t[]> wide;
wide.reset(new wchar_t[bufferSize]);
if (MultiByteToWideChar(CP_UTF8, 0, utf8Data, -1,
wide.get(), bufferSize) == 0)
{
return std::wstring();
}
return std::wstring(wide.get());;
}
std::string to_std_str(Platform::String ^in_str)
{
std::wstring wsstr(in_str->Data());
return make_string(wsstr);
}
Platform::String^ to_platform_str(const std::string& in_str)
{
std::wstring wsstr = make_wstring(in_str);
return ref new Platform::String(wsstr.c_str(), wsstr.length());
}
///////////////////////////////////////////////////////////////////////////////
void ImpLogWriter::write(const pj::LogEntry &entry)
{
std::wstring msg = make_wstring(entry.msg) + L"\r\n";
::OutputDebugString(msg.c_str());
}
///////////////////////////////////////////////////////////////////////////////
OnRegStateParamRT::OnRegStateParamRT(const pj::OnRegStateParam& param)
{
inPtr = new pj::OnRegStateParam(param);
}
OnRegStateParamRT::OnRegStateParamRT()
{
inPtr = new pj::OnRegStateParam();
}
OnRegStateParamRT::~OnRegStateParamRT()
{
DEFAULT_DESTRUCTOR();
}
pj_status_t OnRegStateParamRT::status::get()
{
return inPtr->status;
}
unsigned OnRegStateParamRT::code::get()
{
return static_cast<unsigned>(inPtr->code);
}
Platform::String^ OnRegStateParamRT::reason::get()
{
return to_platform_str(inPtr->reason);
}
int OnRegStateParamRT::expiration::get()
{
return inPtr->expiration;
}
///////////////////////////////////////////////////////////////////////////////
void ImpAccount::setCallback(IntAccount^ callback)
{
cb = callback;
}
void ImpAccount::onIncomingCall(pj::OnIncomingCallParam& prm)
{
if (cb) {
if (MyAppRT::Instance->handleIncomingCall(prm.callId)) {
CallInfoRT^ info = MyAppRT::Instance->getCallInfo();
if (info != nullptr)
cb->onIncomingCall(info);
}
}
}
void ImpAccount::onRegState(pj::OnRegStateParam& prm)
{
if (cb)
cb->onRegState(ref new OnRegStateParamRT(prm));
}
///////////////////////////////////////////////////////////////////////////////
CallInfoRT::CallInfoRT(const pj::CallInfo& info)
{
inPtr = new pj::CallInfo(info);
}
Platform::String^ CallInfoRT::localUri::get()
{
return to_platform_str(inPtr->localUri);
}
Platform::String^ CallInfoRT::localContact::get()
{
return to_platform_str(inPtr->localContact);
}
Platform::String^ CallInfoRT::remoteUri::get()
{
return to_platform_str(inPtr->remoteUri);
}
Platform::String^ CallInfoRT::remoteContact::get()
{
return to_platform_str(inPtr->remoteContact);
}
INV_STATE CallInfoRT::state::get()
{
return static_cast<INV_STATE>(inPtr->state);
}
CallInfoRT::~CallInfoRT()
{
DEFAULT_DESTRUCTOR();
}
///////////////////////////////////////////////////////////////////////////////
CallOpParamRT::CallOpParamRT()
{
inPtr = new pj::CallOpParam(true);
}
unsigned CallOpParamRT::statusCode::get()
{
return static_cast<unsigned>(inPtr->statusCode);
}
void CallOpParamRT::statusCode::set(unsigned val)
{
inPtr->statusCode = static_cast<pjsip_status_code>(val);
}
Platform::String^ CallOpParamRT::reason::get()
{
return to_platform_str(inPtr->reason);
}
void CallOpParamRT::reason::set(Platform::String^ val)
{
inPtr->reason = to_std_str(val);
}
pj::CallOpParam* CallOpParamRT::getPtr()
{
return inPtr;
}
CallOpParamRT::~CallOpParamRT()
{
DEFAULT_DESTRUCTOR();
}
///////////////////////////////////////////////////////////////////////////////
ImpCall::ImpCall(pj::Account& account, int call_id) : pj::Call(account,call_id)
{};
void ImpCall::setCallback(IntCall^ callback)
{
cb = callback;
}
void ImpCall::onCallState(pj::OnCallStateParam& prm)
{
if (cb) {
pj::CallInfo info = getInfo();
cb->onCallState(ref new CallInfoRT(info));
}
};
void ImpCall::onCallMediaState(pj::OnCallMediaStateParam& prm)
{
pj::CallInfo info;
try {
info = getInfo();
} catch (pj::Error& e) {
MyAppRT::Instance->writeLog(2, to_platform_str(e.info()));
return;
}
for (unsigned i = 0; i < info.media.size(); i++) {
pj::CallMediaInfo med_info = info.media[i];
if ((med_info.type == PJMEDIA_TYPE_AUDIO) &&
((med_info.status == PJSUA_CALL_MEDIA_ACTIVE) ||
(med_info.status == PJSUA_CALL_MEDIA_REMOTE_HOLD))
)
{
pj::Media* m = getMedia(i);
pj::AudioMedia *am = pj::AudioMedia::typecastFromMedia(m);
pj::AudDevManager& aud_mgr =
pj::Endpoint::instance().audDevManager();
try {
aud_mgr.getCaptureDevMedia().startTransmit(*am);
am->startTransmit(aud_mgr.getPlaybackDevMedia());
} catch (pj::Error& e) {
MyAppRT::Instance->writeLog(2, to_platform_str(e.info()));
continue;
}
}
}
};
///////////////////////////////////////////////////////////////////////////////
AccountInfo::AccountInfo(pj::AccountConfig* accConfig) : cfg(accConfig)
{}
Platform::String^ AccountInfo::id::get() {
return to_platform_str(cfg->idUri);
}
Platform::String^ AccountInfo::registrar::get() {
return to_platform_str(cfg->regConfig.registrarUri);
}
Platform::String^ AccountInfo::proxy::get() {
if (!cfg->sipConfig.proxies.empty()) {
return to_platform_str(cfg->sipConfig.proxies[0]);
} else {
return ref new Platform::String(L"");
}
}
Platform::String^ AccountInfo::username::get() {
if (!cfg->sipConfig.authCreds.empty()) {
pj::AuthCredInfo& info = cfg->sipConfig.authCreds[0];
return to_platform_str(info.username);
} else {
return ref new Platform::String(L"");
}
}
Platform::String^ AccountInfo::password::get() {
if (!cfg->sipConfig.authCreds.empty()) {
pj::AuthCredInfo& info = cfg->sipConfig.authCreds[0];
return to_platform_str(info.data);
} else {
return ref new Platform::String(L"");
}
}
///////////////////////////////////////////////////////////////////////////////
MyAppRT::MyAppRT()
{
logWriter = new ImpLogWriter();
StorageFolder^ localFolder = ApplicationData::Current->LocalFolder;
appDir = to_std_str(localFolder->Path);
}
MyAppRT::~MyAppRT()
{
delete logWriter;
if (account)
delete account;
if (epConfig)
delete epConfig;
if (accConfig)
delete accConfig;
if (sipTpConfig)
delete sipTpConfig;
}
void MyAppRT::loadConfig()
{
pj::JsonDocument* json = new pj::JsonDocument();
std::string configPath = appDir + "/" + CONFIG_NAME;
try {
/* Load file */
json->loadFile(configPath);
pj::ContainerNode root = json->getRootContainer();
/* Read endpoint config */
epConfig->readObject(root);
/* Read transport config */
pj::ContainerNode tp_node = root.readContainer("SipTransport");
sipTpConfig->readObject(tp_node);
/* Read account configs */
pj::ContainerNode acc_node = root.readContainer("Account");
accConfig->readObject(acc_node);
} catch (pj::Error) {
ep.utilLogWrite(2, "loadConfig", "Failed loading config");
sipTpConfig->port = SIP_PORT;
}
delete json;
}
void MyAppRT::saveConfig()
{
pj::JsonDocument* json = new pj::JsonDocument();
std::string configPath = appDir + "/" + CONFIG_NAME;
try {
/* Write endpoint config */
json->writeObject(*epConfig);
/* Write transport config */
pj::ContainerNode tp_node = json->writeNewContainer("SipTransport");
sipTpConfig->writeObject(tp_node);
/* Write account configs */
pj::ContainerNode acc_node = json->writeNewContainer("Account");
accConfig->writeObject(acc_node);
/* Save file */
json->saveFile(configPath);
} catch (pj::Error) {
ep.utilLogWrite(2, "saveConfig", "Failed saving config");
sipTpConfig->port = SIP_PORT;
}
delete json;
}
MyAppRT^ MyAppRT::Instance::get()
{
if (MyAppRT::singleton == nullptr)
{
if (MyAppRT::singleton == nullptr)
{
MyAppRT::singleton = ref new MyAppRT();
}
}
return MyAppRT::singleton;
}
void MyAppRT::init(IntAccount^ iAcc, IntCall^ iCall)
{
/* Create endpoint */
try {
ep.libCreate();
} catch (pj::Error e) {
return;
}
intAcc = iAcc;
intCall = iCall;
epConfig = new pj::EpConfig;
accConfig = new pj::AccountConfig;
sipTpConfig = new pj::TransportConfig;
/* Load config */
loadConfig();
/* Override log level setting */
epConfig->logConfig.level = LOG_LEVEL;
epConfig->logConfig.consoleLevel = LOG_LEVEL;
/* Set log config. */
pj::LogConfig *log_cfg = &epConfig->logConfig;
log_cfg->writer = logWriter;
log_cfg->decor = log_cfg->decor &
~(::pj_log_decoration::PJ_LOG_HAS_CR |
::pj_log_decoration::PJ_LOG_HAS_NEWLINE);
/* Set ua config. */
pj::UaConfig* ua_cfg = &epConfig->uaConfig;
ua_cfg->userAgent = "Pjsua2 WinRT " + ep.libVersion().full;
ua_cfg->mainThreadOnly = false;
/* Init endpoint */
try
{
ep.libInit(*epConfig);
} catch (pj::Error& e)
{
ep.utilLogWrite(2,THIS_FILE,e.info());
return;
}
/* Create transports. */
try {
ep.transportCreate(::pjsip_transport_type_e::PJSIP_TRANSPORT_TCP,
*sipTpConfig);
} catch (pj::Error& e) {
ep.utilLogWrite(2,THIS_FILE,e.info());
}
try {
ep.transportCreate(::pjsip_transport_type_e::PJSIP_TRANSPORT_UDP,
*sipTpConfig);
} catch (pj::Error& e) {
ep.utilLogWrite(2,THIS_FILE,e.info());
}
/* Create accounts. */
account = new ImpAccount();
if (accConfig->idUri.length() == 0) {
accConfig->idUri = "sip:localhost";
} else {
ua_cfg->stunServer.push_back("stun.pjsip.org");
}
//accConfig->natConfig.iceEnabled = true;
account->create(*accConfig);
account->setCallback(iAcc);
/* Start. */
try {
ep.libStart();
} catch (pj::Error& e) {
ep.utilLogWrite(2,THIS_FILE,e.info());
return;
}
}
void MyAppRT::deInit()
{
saveConfig();
try {
ep.libDestroy();
} catch (pj::Error) {}
}
void MyAppRT::writeLog(int level, Platform::String^ message)
{
ep.utilLogWrite(level, "MyAppRT", to_std_str(message));
}
void MyAppRT::hangupCall()
{
if (activeCall) {
if (!isThreadRegistered())
{
registerThread("hangupCall");
}
delete activeCall;
activeCall = NULL;
}
};
void MyAppRT::answerCall(CallOpParamRT^ prm)
{
if (!isThreadRegistered())
{
registerThread("answerCall");
}
CHECK_EXCEPTION(activeCall->answer(*prm->getPtr()));
};
void MyAppRT::makeCall(Platform::String^ dst_uri)
{
if (!isThreadRegistered())
{
registerThread("makeCall");
}
CallOpParamRT^ param = ref new CallOpParamRT;
activeCall = new ImpCall(*account, -1);
activeCall->setCallback(intCall);
CHECK_EXCEPTION(activeCall->makeCall(to_std_str(dst_uri),*param->getPtr()));
};
CallInfoRT^ MyAppRT::getCallInfo()
{
if (activeCall) {
pj::CallInfo info = activeCall->getInfo();
return ref new CallInfoRT(info);
}
return nullptr;
}
pj_bool_t MyAppRT::handleIncomingCall(int callId)
{
if (activeCall) {
return PJ_FALSE;
}
activeCall = new ImpCall(*account, callId);
activeCall->setCallback(intCall);
return PJ_TRUE;
}
void MyAppRT::registerThread(Platform::String^ name)
{
CHECK_EXCEPTION(ep.libRegisterThread(to_std_str(name)));
}
bool MyAppRT::isThreadRegistered()
{
return ep.libIsThreadRegistered();
}
AccountInfo^ MyAppRT::getAccountInfo()
{
return ref new AccountInfo(accConfig);
}
void MyAppRT::modifyAccount(Platform::String^ id,
Platform::String^ registrar,
Platform::String^ proxy,
Platform::String^ username,
Platform::String^ password)
{
if (id->IsEmpty()) {
accConfig->idUri = "sip:localhost";
accConfig->regConfig.registrarUri = "";
accConfig->sipConfig.authCreds.clear();
accConfig->sipConfig.proxies.clear();
} else {
pj::AuthCredInfo info = pj::AuthCredInfo("Digest", "*",
to_std_str(username), 0,
to_std_str(password));
accConfig->idUri = to_std_str(id);
accConfig->regConfig.registrarUri = to_std_str(registrar);
accConfig->sipConfig.authCreds.clear();
accConfig->sipConfig.authCreds.push_back(info);
accConfig->sipConfig.proxies.clear();
accConfig->sipConfig.proxies.push_back(to_std_str(proxy));
}
if (!isThreadRegistered())
{
registerThread("registerAccount");
}
account->modify(*accConfig);
/* Save config. */
saveConfig();
}

View File

@ -0,0 +1,271 @@
/* $Id*/
/*
* Copyright (C) 2016 Teluu Inc. (http://www.teluu.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#pragma once
#include <pjsua2.hpp>
#include <collection.h>
namespace VoipBackEnd
{
typedef int TransportId;
typedef Platform::Collections::Vector<Platform::String^> StringVector;
typedef Windows::Foundation::Collections::IVector<Platform::String^>
IStringVector;
typedef public enum class INV_STATE
{
PJSIP_INV_STATE_NULL, /**< Before INVITE is sent or received */
PJSIP_INV_STATE_CALLING, /**< After INVITE is sent */
PJSIP_INV_STATE_INCOMING, /**< After INVITE is received. */
PJSIP_INV_STATE_EARLY, /**< After response with To tag. */
PJSIP_INV_STATE_CONNECTING, /**< After 2xx is sent/received. */
PJSIP_INV_STATE_CONFIRMED, /**< After ACK is sent/received. */
PJSIP_INV_STATE_DISCONNECTED, /**< Session is terminated. */
} INV_STATE;
class ImpLogWriter : public pj::LogWriter
{
public:
virtual void write(const pj::LogEntry &entry);
};
/* Account related data type. */
public ref struct OnRegStateParamRT sealed
{
OnRegStateParamRT();
property pj_status_t status
{
pj_status_t get();
};
property unsigned code
{
unsigned get();
};
property Platform::String^ reason
{
Platform::String^ get();
};
property int expiration
{
int get();
};
internal:
OnRegStateParamRT(const pj::OnRegStateParam& param);
private:
pj::OnRegStateParam* inPtr;
~OnRegStateParamRT();
};
public ref struct CallInfoRT sealed
{
property Platform::String^ localUri
{
Platform::String^ get();
}
property Platform::String^ localContact
{
Platform::String^ get();
}
property Platform::String^ remoteUri
{
Platform::String^ get();
}
property Platform::String^ remoteContact
{
Platform::String^ get();
}
property INV_STATE state
{
INV_STATE get();
};
internal:
CallInfoRT(const pj::CallInfo& info);
private:
pj::CallInfo* inPtr;
~CallInfoRT();
};
public interface class IntAccount
{
public:
virtual void onRegState(OnRegStateParamRT^ prm);
virtual void onIncomingCall(CallInfoRT^ info);
};
class ImpAccount : public pj::Account
{
public:
void setCallback(IntAccount^ callback);
virtual void onIncomingCall(pj::OnIncomingCallParam& prm);
virtual void onRegState(pj::OnRegStateParam& prm);
~ImpAccount() {};
private:
IntAccount^ cb;
};
/* Call related data type. */
public ref class CallOpParamRT sealed
{
public:
CallOpParamRT();
property unsigned statusCode
{
unsigned get();
void set(unsigned val);
}
property Platform::String^ reason {
Platform::String^ get();
void set(Platform::String^ val);
}
internal:
pj::CallOpParam* getPtr();
private:
pj::CallOpParam* inPtr;
~CallOpParamRT();
};
public interface class IntCall
{
public:
virtual void onCallState(CallInfoRT^ info);
};
class ImpCall : public pj::Call
{
public:
ImpCall(pj::Account& account, int call_id);
virtual ~ImpCall() {};
void setCallback(IntCall^ callback);
virtual void onCallState(pj::OnCallStateParam& prm);
virtual void onCallMediaState(pj::OnCallMediaStateParam& prm);
private:
IntCall^ cb;
};
public ref class AccountInfo sealed
{
public:
property Platform::String^ id {
Platform::String^ get();
}
property Platform::String^ registrar {
Platform::String^ get();
}
property Platform::String^ proxy {
Platform::String^ get();
}
property Platform::String^ username {
Platform::String^ get();
}
property Platform::String^ password {
Platform::String^ get();
}
internal:
AccountInfo(pj::AccountConfig* accConfig);
private:
pj::AccountConfig* cfg;
};
/* App class. */
public ref class MyAppRT sealed
{
public:
static property MyAppRT^ Instance {
MyAppRT^ get();
}
void init(IntAccount^ iAcc, IntCall^ iCall);
void deInit();
/* Util */
void writeLog(int level, Platform::String^ message);
/* Call handling. */
void hangupCall();
void answerCall(CallOpParamRT^ prm);
void makeCall(Platform::String^ dst_uri);
CallInfoRT^ getCallInfo();
/* Thread handling. */
void registerThread(Platform::String^ name);
bool isThreadRegistered();
/* Account handling. */
AccountInfo^ getAccountInfo();
void modifyAccount(Platform::String^ id, Platform::String^ registrar,
Platform::String^ proxy, Platform::String^ username,
Platform::String^ password);
internal:
pj_bool_t handleIncomingCall(int callId);
private:
MyAppRT();
~MyAppRT();
void loadConfig();
void saveConfig();
static MyAppRT^ singleton;
ImpLogWriter* logWriter;
pj::Endpoint ep;
/* Configs */
pj::EpConfig* epConfig;
pj::AccountConfig* accConfig;
pj::TransportConfig* sipTpConfig;
std::string appDir;
ImpAccount* account;
ImpCall* activeCall;
IntAccount^ intAcc;
IntCall^ intCall;
};
}

View File

@ -0,0 +1,266 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM">
<Configuration>Debug</Configuration>
<Platform>ARM</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM">
<Configuration>Release</Configuration>
<Platform>ARM</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup Condition="'$(API_Family)'=='UWP'">
<ProjectReference Include="..\..\..\..\..\..\build\libpjproject.vcxproj">
<Project>{23d7679c-764c-4e02-8b29-bb882ceeefe2}</Project>
</ProjectReference>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{fc9cbb95-624c-4ce8-86a8-3ab5a415aa65}</ProjectGuid>
<Keyword>WindowsRuntimeComponent</Keyword>
<ProjectName>VoipBackEnd</ProjectName>
<RootNamespace>VoipBackEnd</RootNamespace>
<DefaultLanguage>en-US</DefaultLanguage>
<MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>
<AppContainerApplication>true</AppContainerApplication>
<ApplicationType>Windows Store</ApplicationType>
<WindowsTargetPlatformVersion>10.0.10586.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformMinVersion>10.0.10240.0</WindowsTargetPlatformMinVersion>
<ApplicationTypeRevision>10.0</ApplicationTypeRevision>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<!-- Import common config -->
<Import Project="..\..\..\..\..\..\..\build\vs\pjproject-vs14-common-config.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
<Import Project="..\..\..\..\..\..\..\build\vs\pjproject-vs14-arm-common-defaults.props" />
<Import Project="..\..\..\..\..\..\..\build\vs\pjproject-vs14-debug-static-defaults.props" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="..\..\..\..\..\..\..\build\vs\pjproject-vs14-win32-common-defaults.props" />
<Import Project="..\..\..\..\..\..\..\build\vs\pjproject-vs14-debug-static-defaults.props" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
<Import Project="..\..\..\..\..\..\..\build\vs\pjproject-vs14-arm-common-defaults.props" />
<Import Project="..\..\..\..\..\..\..\build\vs\pjproject-vs14-release-dynamic-defaults.props" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="..\..\..\..\..\..\..\build\vs\pjproject-vs14-win32-common-defaults.props" />
<Import Project="..\..\..\..\..\..\..\build\vs\pjproject-vs14-release-dynamic-defaults.props" />
</ImportGroup>
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PreprocessorDefinitions>_WINRT_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<CompileAsWinRT>true</CompileAsWinRT>
<AdditionalIncludeDirectories>..\..\..\..\..\..\..\pjsip\include;..\..\..\..\..\..\..\pjlib\include;..\..\..\..\..\..\..\pjlib-util\include;..\..\..\..\..\..\..\pjmedia\include;..\..\..\..\..\..\..\pjnath\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PreprocessorDefinitions>_WINRT_DLL;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
<AdditionalIncludeDirectories>..\..\..\..\..\..\..\pjsip\include;..\..\..\..\..\..\..\pjlib\include;..\..\..\..\..\..\..\pjlib-util\include;..\..\..\..\..\..\..\pjmedia\include;..\..\..\..\..\..\..\pjnath\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PreprocessorDefinitions>_WINRT_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<CompileAsWinRT>true</CompileAsWinRT>
<AdditionalIncludeDirectories>..\..\..\..\..\..\..\pjsip\include;..\..\..\..\..\..\..\pjlib\include;..\..\..\..\..\..\..\pjlib-util\include;..\..\..\..\..\..\..\pjmedia\include;..\..\..\..\..\..\..\pjnath\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PreprocessorDefinitions>_WINRT_DLL;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
<AdditionalIncludeDirectories>..\..\..\..\..\..\..\pjsip\include;..\..\..\..\..\..\..\pjlib\include;..\..\..\..\..\..\..\pjlib-util\include;..\..\..\..\..\..\..\pjmedia\include;..\..\..\..\..\..\..\pjnath\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PreprocessorDefinitions>_WINRT_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
<AdditionalIncludeDirectories>..\..\..\..\..\..\..\pjsip\include;..\..\..\..\..\..\..\pjlib\include;..\..\..\..\..\..\..\pjlib-util\include;..\..\..\..\..\..\..\pjmedia\include;..\..\..\..\..\..\..\pjnath\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PreprocessorDefinitions>_WINRT_DLL;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
<AdditionalIncludeDirectories>..\..\..\..\..\..\..\pjsip\include;..\..\..\..\..\..\..\pjlib\include;..\..\..\..\..\..\..\pjlib-util\include;..\..\..\..\..\..\..\pjmedia\include;..\..\..\..\..\..\..\pjnath\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemGroup Condition="'$(API_Family)'=='UWP'">
<ClInclude Include="ApiLock.h" />
<ClInclude Include="pch.h" />
</ItemGroup>
<ItemGroup Condition="'$(API_Family)'=='UWP'">
<ClCompile Include="ApiLock.cpp" />
<ClCompile Include="pch.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClCompile Include="MyApp.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="MyApp.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Resources">
<UniqueIdentifier>d25e3c8e-e29b-40f8-88c6-2cb35dbe70d2</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tga;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="pch.cpp" />
<ClCompile Include="ApiLock.cpp" />
<ClCompile Include="MyApp.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="pch.h" />
<ClInclude Include="ApiLock.h" />
<ClInclude Include="MyApp.h" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,11 @@
//*********************************************************
//
// Copyright (c) Microsoft. All rights reserved.
// This code is licensed under the MIT License (MIT).
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
//
//*********************************************************
#include "pch.h"

View File

@ -0,0 +1,14 @@
//*********************************************************
//
// Copyright (c) Microsoft. All rights reserved.
// This code is licensed under the MIT License (MIT).
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
//
//*********************************************************
#pragma once
#include <collection.h>
#include <ppltasks.h>

View File

@ -0,0 +1,55 @@
//*********************************************************
//
// Copyright (c) Microsoft. All rights reserved.
// This code is licensed under the MIT License (MIT).
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
//
//*********************************************************
#include <wrl\module.h>
#include <roapi.h>
#include <Windows.ApplicationModel.Core.h>
using namespace ABI::Windows::ApplicationModel::Core;
using namespace Microsoft::WRL;
class ExeServerGetActivationFactory : public RuntimeClass<
ABI::Windows::Foundation::IGetActivationFactory,
FtmBase>
{
public:
IFACEMETHODIMP GetActivationFactory(_In_ HSTRING activatableClassId, _COM_Outptr_ IInspectable **factory)
{
*factory = nullptr;
ComPtr<IActivationFactory> activationFactory;
auto &module = Microsoft::WRL::Module<Microsoft::WRL::InProc>::GetModule();
HRESULT hr = module.GetActivationFactory(activatableClassId, &activationFactory);
if (SUCCEEDED(hr))
{
*factory = activationFactory.Detach();
}
return hr;
}
};
int CALLBACK WinMain(_In_ HINSTANCE, _In_ HINSTANCE, _In_ LPSTR, _In_ int)
{
HRESULT hr = Windows::Foundation::Initialize(RO_INIT_MULTITHREADED);
if (SUCCEEDED(hr))
{
// Scoping for smart pointers
{
ComPtr<ICoreApplication> spApplicationFactory;
hr = Windows::Foundation::GetActivationFactory(Wrappers::HStringReference(RuntimeClass_Windows_ApplicationModel_Core_CoreApplication).Get(), &spApplicationFactory);
if (SUCCEEDED(hr))
{
ComPtr<ABI::Windows::Foundation::IGetActivationFactory> spGetActivationFactory = Make<ExeServerGetActivationFactory>();
spApplicationFactory->RunWithActivationFactories(spGetActivationFactory.Get());
}
}
Windows::Foundation::Uninitialize();
}
}

View File

@ -0,0 +1,245 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM">
<Configuration>Debug</Configuration>
<Platform>ARM</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM">
<Configuration>Release</Configuration>
<Platform>ARM</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup Condition="'$(API_Family)'=='UWP'">
<ClCompile Include="VoipHost.cpp" />
</ItemGroup>
<ItemGroup>
<AppxManifest Include="..\voip\package.appxmanifest">
<SubType>Designer</SubType>
</AppxManifest>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{016d497f-0ee0-449e-89f5-bd63f7f9a8a6}</ProjectGuid>
<Keyword>WindowsRuntimeComponent</Keyword>
<ProjectName>VoipHost</ProjectName>
<RootNamespace>VoipHost</RootNamespace>
<DefaultLanguage>en-US</DefaultLanguage>
<MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>
<AppContainerApplication>true</AppContainerApplication>
<ApplicationType>Windows Store</ApplicationType>
<WindowsTargetPlatformVersion>10.0.10586.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformMinVersion>10.0.10240.0</WindowsTargetPlatformMinVersion>
<ApplicationTypeRevision>10.0</ApplicationTypeRevision>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<!-- Import common config -->
<Import Project="..\..\..\..\..\..\..\build\vs\pjproject-vs14-common-config.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
<Import Project="..\..\..\..\..\..\..\build\vs\pjproject-vs14-arm-common-defaults.props" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="..\..\..\..\..\..\..\build\vs\pjproject-vs14-win32-common-defaults.props" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
<Import Project="..\..\..\..\..\..\..\build\vs\pjproject-vs14-arm-common-defaults.props" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="..\..\..\..\..\..\..\build\vs\pjproject-vs14-win32-common-defaults.props" />
</ImportGroup>
<PropertyGroup>
<TargetName>$(ProjectName)</TargetName>
<IntDir>.\output\$(ProjectName)\</IntDir>
<OutDir>..\bin\</OutDir>
</PropertyGroup>
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PreprocessorDefinitions>_WINRT_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<CompileAsWinRT>true</CompileAsWinRT>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
<OutputFile>..\bin\$(ProjectName)$(TargetExt)</OutputFile>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PreprocessorDefinitions>_WINRT_DLL;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PreprocessorDefinitions>_WINRT_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<CompileAsWinRT>true</CompileAsWinRT>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
<OutputFile>..\bin\$(ProjectName)$(TargetExt)</OutputFile>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PreprocessorDefinitions>_WINRT_DLL;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PreprocessorDefinitions>_WINRT_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PreprocessorDefinitions>_WINRT_DLL;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>28204</DisableSpecificWarnings>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Resources">
<UniqueIdentifier>bfd33be3-f275-42ab-98e7-d1430685d099</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tga;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="VoipHost.cpp" />
</ItemGroup>
<ItemGroup>
<AppxManifest Include="..\voip\package.appxmanifest" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,152 @@
//*********************************************************
//
// Copyright (c) Microsoft. All rights reserved.
// This code is licensed under the MIT License (MIT).
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
//
//*********************************************************
using System;
using VoipTasks.BackgroundOperations;
using VoipTasks.Helpers;
using Windows.ApplicationModel.AppService;
using Windows.ApplicationModel.Background;
using Windows.ApplicationModel.Calls;
using Windows.Foundation.Collections;
using VoipBackEnd;
namespace VoipTasks
{
public sealed class AppService : IBackgroundTask
{
AppServiceConnection _connection;
BackgroundTaskDeferral _deferral;
public void Run(IBackgroundTaskInstance taskInstance)
{
AppServiceTriggerDetails triggerDetail = taskInstance.TriggerDetails as AppServiceTriggerDetails;
_deferral = taskInstance.GetDeferral();
// Register for Task Cancel callback
taskInstance.Canceled += TaskInstance_Canceled;
AppServiceConnection connection = triggerDetail.AppServiceConnection;
_connection = connection;
connection.RequestReceived += Connection_RequestReceived;
Current.AppConnection = connection;
}
private async void Connection_RequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
var deferral = args.GetDeferral();
var response = new ValueSet();
bool stop = false;
try
{
var request = args.Request;
var message = request.Message;
if (message.ContainsKey(BackgroundOperation.NewBackgroundRequest))
{
switch ((BackgroundRequest)message[BackgroundOperation.NewBackgroundRequest])
{
case BackgroundRequest.NewOutgoingCall:
Current.AppRequest = args.Request;
Current.Request = BackgroundRequest.NewOutgoingCall;
Current.AppRequestDeferal = deferral;
await Current.RequestNewCallAsync(message[NewCallArguments.DstURI.ToString()] as String);
break;
case BackgroundRequest.EndCall:
Current.AppRequest = args.Request;
Current.Request = BackgroundRequest.EndCall;
Current.AppRequestDeferal = deferral;
Current.EndCallAsync();
break;
case BackgroundRequest.StartService:
Current.AppRequest = args.Request;
Current.Request = BackgroundRequest.StartService;
Current.AppRequestDeferal = deferral;
Current.StartService();
break;
case BackgroundRequest.StopService:
Current.AppRequest = args.Request;
Current.Request = BackgroundRequest.StopService;
Current.AppRequestDeferal = deferral;
Current.StopService();
break;
case BackgroundRequest.GetAccountInfo:
Current.AppRequest = args.Request;
Current.Request = BackgroundRequest.GetAccountInfo;
Current.AppRequestDeferal = deferral;
Current.GetAccountInfo();
break;
case BackgroundRequest.ModifyAccount:
Current.AppRequest = args.Request;
Current.Request = BackgroundRequest.ModifyAccount;
Current.AppRequestDeferal = deferral;
Current.ModifyAccount(message[ModifyAccountArguments.id.ToString()] as String,
message[ModifyAccountArguments.registrar.ToString()] as String,
message[ModifyAccountArguments.proxy.ToString()] as String,
message[ModifyAccountArguments.username.ToString()] as String,
message[ModifyAccountArguments.password.ToString()] as String);
break;
default:
stop = true;
break;
}
}
}
finally
{
if (stop)
{
_deferral.Complete();
}
}
}
private void TaskInstance_Canceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
{
if (_deferral != null)
{
_deferral.Complete();
}
}
private static void Call_ResumeRequested(VoipPhoneCall sender, CallStateChangeEventArgs args)
{
sender.NotifyCallActive();
}
private static void Call_RejectRequested(VoipPhoneCall sender, CallRejectEventArgs args)
{
sender.NotifyCallEnded();
}
private static void Call_HoldRequested(VoipPhoneCall sender, CallStateChangeEventArgs args)
{
sender.NotifyCallHeld();
}
private static void Call_EndRequested(VoipPhoneCall sender, CallStateChangeEventArgs args)
{
sender.NotifyCallEnded();
}
private static void Call_AnswerRequested(VoipPhoneCall sender, CallAnswerEventArgs args)
{
sender.NotifyCallActive();
}
}
}

View File

@ -0,0 +1,112 @@
//*********************************************************
//
// Copyright (c) Microsoft. All rights reserved.
// This code is licensed under the MIT License (MIT).
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
//
//*********************************************************
using System;
namespace VoipTasks.BackgroundOperations
{
public enum BackgroundRequest
{
NewOutgoingCall,
EndCall,
GetCallDuration,
StartVideo,
EndVideo,
//Account request
GetAccountInfo,
ModifyAccount,
//Endpoint request
StartService,
StopService,
// Always keep this as the last option
InValid
}
public enum ForegroundReguest
{
UpdateCallState,
UpdateAcccountInfo,
UpdateRegState,
InValid
}
public enum NewCallArguments
{
DstURI
}
public enum ModifyAccountArguments
{
id,
registrar,
proxy,
username,
password
}
public enum UpdateCallStateArguments
{
CallState
}
public enum UpdateRegStateArguments
{
RegState
}
public enum UpdateAccountInfoArguments
{
id,
registrar,
proxy,
username,
password
}
public enum OperationResult
{
Succeeded,
Failed
}
public static class BackgroundOperation
{
public static String AppServiceName
{
get { return _appServiceName; }
}
public static String NewBackgroundRequest
{
get { return _newBackgroundRequest; }
}
public static String Result
{
get { return _result; }
}
const String _appServiceName = "VoipTasks.AppService";
const String _newBackgroundRequest = "NewBackgroundRequest";
const String _result = "Result";
}
public static class ForegroundOperation
{
public static String NewForegroundRequest
{
get { return _newForegroundRequest; }
}
const String _newForegroundRequest = "NewForegroundRequest";
}
}

View File

@ -0,0 +1,39 @@
//*********************************************************
//
// Copyright (c) Microsoft. All rights reserved.
// This code is licensed under the MIT License (MIT).
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
//
//*********************************************************
using VoipTasks.Helpers;
using Windows.ApplicationModel.Background;
namespace VoipTasks
{
public sealed class CallRtcTask : IBackgroundTask
{
BackgroundTaskDeferral _deferral;
public void Run(IBackgroundTaskInstance taskInstance)
{
_deferral = taskInstance.GetDeferral();
Current.RTCTaskDeferral = _deferral;
// Register for Task Cancel callback
taskInstance.Canceled += TaskInstance_Canceled;
}
private void TaskInstance_Canceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
{
if (_deferral != null)
{
_deferral.Complete();
}
Current.RTCTaskDeferral = null;
}
}
}

View File

@ -0,0 +1,377 @@
//*********************************************************
//
// Copyright (c) Microsoft. All rights reserved.
// This code is licensed under the MIT License (MIT).
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
//
//*********************************************************
using System;
using System.Threading.Tasks;
using System.Diagnostics;
using VoipTasks.BackgroundOperations;
using Windows.ApplicationModel.AppService;
using Windows.ApplicationModel.Background;
using Windows.ApplicationModel.Calls;
using Windows.Foundation.Collections;
using VoipBackEnd;
namespace VoipTasks.Helpers
{
static class Current
{
public static String RtcCallTaskName
{
get { return _rtcCallTaskName; }
}
public static AppServiceRequest AppRequest
{
set
{
lock (_lock)
{
_appRequest = value;
}
}
get
{
lock (_lock)
{
return _appRequest;
}
}
}
public static AppServiceDeferral AppRequestDeferal
{
set
{
lock (_lock)
{
_appDeferral = value;
}
}
get
{
lock (_lock)
{
return _appDeferral;
}
}
}
public static BackgroundTaskDeferral RTCTaskDeferral
{
set
{
lock (_lock)
{
_rtcTaskDeferral = value;
}
}
get
{
lock (_lock)
{
return _rtcTaskDeferral;
}
}
}
public static VoipPhoneCall VoipCall
{
set
{
lock (_lock)
{
_voipCall = value;
}
}
get
{
lock (_lock)
{
return _voipCall;
}
}
}
public static BackgroundRequest Request
{
set
{
lock (_lock)
{
_request = value;
}
}
get
{
lock (_lock)
{
return _request;
}
}
}
public static AppServiceConnection AppConnection
{
set
{
lock (_lock)
{
_connection = value;
}
}
get
{
lock (_lock)
{
return _connection;
}
}
}
public static MyAppRT MyApp
{
get
{
lock (_lock)
{
return _myApp;
}
}
}
public static async void SendResponse(ValueSet response)
{
AppServiceRequest request = AppRequest;
AppServiceDeferral deferal = AppRequestDeferal;
try
{
if (request != null)
{
await request.SendResponseAsync(response);
}
}
finally
{
if (deferal != null)
{
deferal.Complete();
deferal = null;
}
AppRequest = null;
}
}
public static async Task<ValueSet> SendMessageAsync(ValueSet message)
{
ValueSet returnValue = null;
if (_connection != null)
{
AppServiceResponse response = await _connection.SendMessageAsync(message);
if (response.Status == AppServiceResponseStatus.Success)
{
if (response.Message.Keys.Contains(BackgroundOperation.Result))
{
returnValue = response.Message;
}
}
}
return returnValue;
}
public static async void EndCallAsync()
{
AppServiceRequest request = AppRequest;
AppServiceDeferral deferal = AppRequestDeferal;
try
{
EndCall();
if (request != null)
{
ValueSet response = new ValueSet();
response[BackgroundOperation.Result] = (int)OperationResult.Succeeded;
await request.SendResponseAsync(response);
}
if (deferal != null)
{
deferal.Complete();
}
}
finally
{
AppRequest = null;
AppRequestDeferal = null;
}
}
public static void EndCall()
{
VoipPhoneCall call = VoipCall;
BackgroundTaskDeferral deferral = RTCTaskDeferral;
if (_voipCall == null) {
return;
}
try
{
_myApp.hangupCall();
}
catch (Exception e)
{
_myApp.writeLog(2, e.Message);
}
try
{
if (call != null)
{
call.NotifyCallEnded();
}
}
catch
{
}
try
{
if (deferral != null)
{
deferral.Complete();
}
}
catch
{
}
finally
{
VoipCall = null;
RTCTaskDeferral = null;
}
}
public static async Task<VoipPhoneCallResourceReservationStatus> RequestNewCallAsync(string dstURI)
{
VccCallHelper vccCallHelper;
VoipPhoneCallResourceReservationStatus status = VoipPhoneCallResourceReservationStatus.ResourcesNotAvailable;
lock (_lock)
{
vccCallHelper = _vccCallHelper;
}
if (vccCallHelper != null)
{
status = await vccCallHelper.RequestNewCallAsync(dstURI);
}
return status;
}
public static void RequestNewIncomingCall(string context, string contactName, string serviceName)
{
VccCallHelper vccCallHelper;
lock (_lock)
{
vccCallHelper = _vccCallHelper;
}
if (vccCallHelper != null)
{
vccCallHelper.NewIncomingCall(context, contactName, serviceName);
}
}
public static void StartService()
{
if (_started)
return;
_myApp.init(_epHelper, _epHelper);
_started = true;
}
public static void StopService()
{
if (!_started)
return;
_myApp.deInit();
_started = false;
}
public static void ModifyAccount(String id, String registrar,
String proxy, String username,
String password)
{
try
{
MyAppRT.Instance.modifyAccount(id, registrar, proxy, username, password);
}
catch (Exception e)
{
MyAppRT.Instance.writeLog(2, e.Message);
}
}
async public static void GetAccountInfo()
{
if (!_started)
return;
AccountInfo accInfo = MyAppRT.Instance.getAccountInfo();
ValueSet message = new ValueSet();
message[UpdateAccountInfoArguments.id.ToString()] = accInfo.id;
message[UpdateAccountInfoArguments.registrar.ToString()] = accInfo.registrar;
message[UpdateAccountInfoArguments.proxy.ToString()] = accInfo.proxy;
message[UpdateAccountInfoArguments.username.ToString()] = accInfo.username;
message[UpdateAccountInfoArguments.password.ToString()] = accInfo.password;
message[ForegroundOperation.NewForegroundRequest] = (int)ForegroundReguest.UpdateAcccountInfo;
ValueSet response = await Current.SendMessageAsync(message);
}
private const String _rtcCallTaskName = "VoipTasks.CallRtcTask";
private static BackgroundRequest _request = BackgroundRequest.InValid;
private static Object _lock = new Object();
private static AppServiceRequest _appRequest = null;
private static AppServiceDeferral _appDeferral = null;
private static VoipPhoneCall _voipCall = null;
private static VccCallHelper _vccCallHelper = new VccCallHelper();
private static BackgroundTaskDeferral _rtcTaskDeferral = null;
/* Pjsua data */
private static MyAppRT _myApp = MyAppRT.Instance;
private static bool _started = false;
private static EndpointHelper _epHelper = new EndpointHelper();
private static AppServiceConnection _connection = null;
}
}

View File

@ -0,0 +1,94 @@
/* $Id*/
/*
* Copyright (C) 2016 Teluu Inc. (http://www.teluu.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using VoipTasks.BackgroundOperations;
using Windows.ApplicationModel.Calls;
using Windows.Foundation.Collections;
using VoipBackEnd;
namespace VoipTasks.Helpers
{
class EndpointHelper : IntAccount, IntCall
{
private async void sendCallState(String state)
{
ValueSet message = new ValueSet();
message[UpdateCallStateArguments.CallState.ToString()] = state;
message[ForegroundOperation.NewForegroundRequest] = (int)ForegroundReguest.UpdateCallState;
ValueSet response = await Current.SendMessageAsync(message);
}
private async void sendRegState(String state)
{
ValueSet message = new ValueSet();
message[UpdateRegStateArguments.RegState.ToString()] = state;
message[ForegroundOperation.NewForegroundRequest] = (int)ForegroundReguest.UpdateRegState;
ValueSet response = await Current.SendMessageAsync(message);
}
/* Implement IntAccount. */
public void onIncomingCall(CallInfoRT info)
{
if (Current.VoipCall != null)
{
/* Only one active call */
return;
}
Current.RequestNewIncomingCall(info.remoteContact,
info.remoteUri,
"Pjsua");
}
public void onRegState(OnRegStateParamRT prm)
{
sendRegState(prm.reason);
}
/* Implement IntCall. */
public void onCallState(CallInfoRT info)
{
switch (info.state) {
case INV_STATE.PJSIP_INV_STATE_CALLING:
sendCallState("Calling");
break;
case INV_STATE.PJSIP_INV_STATE_INCOMING:
sendCallState("Incoming");
break;
case INV_STATE.PJSIP_INV_STATE_CONNECTING:
sendCallState("Connecting");
break;
case INV_STATE.PJSIP_INV_STATE_CONFIRMED:
sendCallState("Connected");
break;
case INV_STATE.PJSIP_INV_STATE_DISCONNECTED:
sendCallState("Disconnected");
Current.EndCall();
break;
}
}
}
}

View File

@ -0,0 +1,164 @@
//*********************************************************
//
// Copyright (c) Microsoft. All rights reserved.
// This code is licensed under the MIT License (MIT).
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
//
//*********************************************************
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using VoipTasks.BackgroundOperations;
using Windows.ApplicationModel.Calls;
using Windows.Foundation.Collections;
using Windows.Foundation.Metadata;
using VoipBackEnd;
namespace VoipTasks.Helpers
{
class VccCallHelper
{
private int RTcTaskAlreadyRuningErrorCode = -2147024713;
public async Task<VoipPhoneCallResourceReservationStatus> RequestNewCallAsync(string dstURI)
{
VoipPhoneCallResourceReservationStatus status = VoipPhoneCallResourceReservationStatus.ResourcesNotAvailable;
status = await LaunchRTCTaskAsync();
if (status == VoipPhoneCallResourceReservationStatus.Success)
{
NewOutgoingCall(dstURI);
}
Current.Request = BackgroundRequest.InValid;
return status;
}
private async Task<VoipPhoneCallResourceReservationStatus> LaunchRTCTaskAsync()
{
// End current call before starting another call, there should be only one RTC task active at a time.
// Duplicate calls to launch RTC task will result in HR ERROR_ALREADY_EXSIST
// <TODO> For multiple calls against single rtc task add logic to verify that the rtc is not completed,
// and then Skip launching new rtc task
Current.EndCall();
VoipCallCoordinator vCC = VoipCallCoordinator.GetDefault();
VoipPhoneCallResourceReservationStatus status = VoipPhoneCallResourceReservationStatus.ResourcesNotAvailable;
try
{
status = await vCC.ReserveCallResourcesAsync(Current.RtcCallTaskName);
}
catch (Exception ex)
{
if (ex.HResult == RTcTaskAlreadyRuningErrorCode )
{
Debug.WriteLine("RTC Task Already running");
}
}
return status;
}
internal void NewOutgoingCall(string dstURI)
{
bool status = false;
try
{
VoipCallCoordinator vCC = VoipCallCoordinator.GetDefault();
VoipPhoneCall call = vCC.RequestNewOutgoingCall( "Pjsua Test Call ", dstURI, "", VoipPhoneCallMedia.Audio);
if (call != null)
{
call.EndRequested += Call_EndRequested;
call.RejectRequested += Call_RejectRequested;
call.NotifyCallActive();
Current.VoipCall = call;
MyAppRT.Instance.makeCall(dstURI);
status = true;
}
}
catch (Exception e)
{
Debug.WriteLine(e.ToString());
}
ValueSet response = new ValueSet();
response[BackgroundOperation.Result] = status ? (int)OperationResult.Succeeded : (int)OperationResult.Failed;
Current.SendResponse(response);
}
internal void NewIncomingCall(string context, string contactName, string serviceName)
{
try
{
VoipCallCoordinator vCC = VoipCallCoordinator.GetDefault();
VoipPhoneCall call = vCC.RequestNewIncomingCall(
"Hello",
contactName,
context,
new Uri("file://c:/data/test/bin/FakeVoipAppLight.png"),
serviceName,
new Uri("file://c:/data/test/bin/FakeVoipAppLight.png"),
"",
new Uri("file://c:/data/test/bin/FakeVoipAppRingtone.wma"),
VoipPhoneCallMedia.Audio,
new TimeSpan(0, 1, 20));
if (call != null)
{
call.AnswerRequested += Call_AnswerRequested;
call.EndRequested += Call_EndRequested;
call.RejectRequested += Call_RejectRequested;
Current.VoipCall = call;
}
}
catch (Exception e)
{
Debug.WriteLine(e.ToString());
}
}
private void Call_RejectRequested(VoipPhoneCall sender, CallRejectEventArgs args)
{
Current.EndCall();
}
private void Call_EndRequested(VoipPhoneCall sender, CallStateChangeEventArgs args)
{
Current.EndCall();
}
private void Call_AnswerRequested(VoipPhoneCall sender, CallAnswerEventArgs args)
{
CallOpParamRT param = new CallOpParamRT();
param.statusCode = 200;
param.reason = "OK";
try
{
Current.MyApp.answerCall(param);
}
catch (Exception ex)
{
Current.MyApp.writeLog(2, ex.Message);
}
Current.VoipCall = sender;
try
{
Current.VoipCall.NotifyCallActive();
}
catch (Exception ex)
{
Current.MyApp.writeLog(2, ex.Message);
}
}
}
}

View File

@ -0,0 +1,29 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("VoIPTasks")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft Corporation")]
[assembly: AssemblyProduct("VoIPTasks")]
[assembly: AssemblyCopyright("Copyright © 2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: ComVisible(false)]

View File

@ -0,0 +1,147 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{9FDF5E33-D15D-409F-876E-4E77727936B9}</ProjectGuid>
<OutputType>winmdobj</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>VoipTasks</RootNamespace>
<AssemblyName>VoipTasks</AssemblyName>
<DefaultLanguage>en-US</DefaultLanguage>
<TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
<TargetPlatformVersion>10.0.10586.0</TargetPlatformVersion>
<TargetPlatformMinVersion>10.0.10240.0</TargetPlatformMinVersion>
<MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<AllowCrossPlatformRetargeting>false</AllowCrossPlatformRetargeting>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM'">
<PlatformTarget>ARM</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\ARM\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>ARM</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'">
<PlatformTarget>ARM</PlatformTarget>
<OutputPath>bin\ARM\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>ARM</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<PlatformTarget>x64</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<PlatformTarget>x64</PlatformTarget>
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<PlatformTarget>x86</PlatformTarget>
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<!-- A reference to the entire .Net Framework and Windows SDK are automatically included -->
<None Include="project.json" />
</ItemGroup>
<ItemGroup>
<Compile Include="AppService.cs" />
<Compile Include="BackgroundOperations\BackgroundOperations.cs" />
<Compile Include="CallRtcTask.cs" />
<Compile Include="Helpers\Current.cs" />
<Compile Include="Helpers\VccCallHelper.cs" />
<Compile Include="Helpers\EndpointHelper.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<SDKReference Include="WindowsMobile, Version=10.0.10240.0">
<Name>Windows Mobile Extensions for the UWP</Name>
</SDKReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\VoipBackEnd\VoipBackEnd.vcxproj">
<Project>{fc9cbb95-624c-4ce8-86a8-3ab5a415aa65}</Project>
<Name>VoipBackEnd</Name>
</ProjectReference>
</ItemGroup>
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' ">
<VisualStudioVersion>14.0</VisualStudioVersion>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@ -0,0 +1,16 @@
{
"dependencies": {
"Microsoft.NETCore.UniversalWindowsPlatform": "5.0.0"
},
"frameworks": {
"uap10.0": {}
},
"runtimes": {
"win10-arm": {},
"win10-arm-aot": {},
"win10-x86": {},
"win10-x86-aot": {},
"win10-x64": {},
"win10-x64-aot": {}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -78,14 +78,14 @@
<Import Project="..\..\build\vs\pjproject-vs14-common-config.props" />
<PropertyGroup Label="Globals">
<ProjectGuid>{B82CDD25-6903-430E-BD38-D8129A2015C1}</ProjectGuid>
<RootNamespace>pjsua2_lib</RootNamespace>
<RootNamespace>pjsua2_lib</RootNamespace>
<!-- Specific UWP property -->
<DefaultLanguage>en-US</DefaultLanguage>
<AppContainerApplication Condition="'$(API_Family)'=='UWP'">true</AppContainerApplication>
<ApplicationType Condition="'$(API_Family)'=='UWP'">Windows Store</ApplicationType>
<WindowsTargetPlatformVersion Condition="'$(API_Family)'=='UWP'">$(PlatformVersion)</WindowsTargetPlatformVersion>
<WindowsTargetPlatformMinVersion Condition="'$(API_Family)'=='UWP'">$(PlatformVersion)</WindowsTargetPlatformMinVersion>
<ApplicationTypeRevision Condition="'$(API_Family)'=='UWP'">$(AppTypeRev)</ApplicationTypeRevision>
<ApplicationTypeRevision Condition="'$(API_Family)'=='UWP'">$(AppTypeRev)</ApplicationTypeRevision>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release-Static|Win32'" Label="Configuration">
@ -199,7 +199,8 @@
<!-- Override the PlatformToolset -->
<PropertyGroup>
<PlatformToolset>$(BuildToolset)</PlatformToolset>
<CharacterSet Condition="'$(API_Family)'!='WinDesktop'"></CharacterSet>
<CharacterSet Condition="'$(API_Family)'!='WinDesktop'">
</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@ -321,6 +322,7 @@
<PreprocessorDefinitions>_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderOutputFile>
</PrecompiledHeaderOutputFile>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
<Lib>
<OutputFile>..\lib\pjsua2-lib-$(TargetCPU)-$(Platform)-vc$(VSVer)-$(Configuration).lib</OutputFile>

View File

@ -2191,7 +2191,7 @@ static void on_tsx_state_uas( pjsip_evsub *sub, pjsip_transaction *tsx,
should_terminate_sub = PJ_TRUE;
} else {
pjsip_retry_after_hdr *retry_after;
pjsip_rx_data *rdata = event->body.tsx_state.src.rdata;;
pjsip_rx_data *rdata = event->body.tsx_state.src.rdata;
pjsip_msg *msg = rdata->msg_info.msg;
retry_after = (pjsip_retry_after_hdr*)