Ignore:
Timestamp:
Mar 11, 2016 4:17:32 AM (8 years ago)
Author:
nanang
Message:

Re #1900:

  • Works on UWP socket & ioqueue.
  • Media transport UDP: cancel any pending send on detach, otherwise there is possibility that send buffer is already freed by application (stream) when the send op starts.
  • Ioqueue common abs: rename 'generic' as it seems to be a keyword in C++/CX, fixed #if/#endif possition in ioqueue_init_key().
  • pjsua GUI app: fixed thread registration status check.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/uwp/pjlib/src/pj/sock_uwp.h

    r5254 r5256  
    1919#pragma once 
    2020 
     21 
     22#include <pj/assert.h> 
     23#include <pj/sock.h> 
     24#include <pj/string.h> 
     25#include <pj/unicode.h> 
     26 
     27 
    2128enum { 
    2229    READ_TIMEOUT        = 60 * 1000, 
     
    3744ref class PjUwpSocketDatagramRecvHelper; 
    3845ref class PjUwpSocketListenerHelper; 
     46class PjUwpSocket; 
     47 
     48 
     49typedef struct PjUwpSocketCallback 
     50{ 
     51    void (*on_read)(PjUwpSocket *s, int bytes_read); 
     52    void (*on_write)(PjUwpSocket *s, int bytes_sent); 
     53    void (*on_accept)(PjUwpSocket *s); 
     54    void (*on_connect)(PjUwpSocket *s, pj_status_t status); 
     55} PjUwpSocketCallback; 
     56 
    3957 
    4058/* 
     
    4563public: 
    4664    PjUwpSocket(int af_, int type_, int proto_); 
     65    virtual ~PjUwpSocket(); 
     66    pj_status_t InitSocket(enum PjUwpSocketType sock_type_); 
     67    void DeinitSocket(); 
     68 
     69    void* GetUserData() { return user_data; } 
     70    void SetNonBlocking(const PjUwpSocketCallback *cb_, void *user_data_) 
     71    { 
     72        is_blocking = PJ_FALSE; 
     73        cb=*cb_; 
     74        user_data = user_data_; 
     75    } 
     76 
     77    enum PjUwpSocketType GetType() { return sock_type; } 
     78    enum PjUwpSocketState GetState() { return sock_state; } 
     79 
     80    pj_sockaddr* GetLocalAddr() { return &local_addr; } 
     81    pj_sockaddr* GetRemoteAddr() { return &remote_addr; } 
     82 
     83 
     84    pj_status_t Bind(const pj_sockaddr_t *addr = NULL); 
     85    pj_status_t Send(const void *buf, pj_ssize_t *len); 
     86    pj_status_t SendTo(const void *buf, pj_ssize_t *len, const pj_sockaddr_t *to); 
     87    pj_status_t Recv(void *buf, pj_ssize_t *len); 
     88    pj_status_t RecvFrom(void *buf, pj_ssize_t *len, pj_sockaddr_t *from); 
     89    pj_status_t Connect(const pj_sockaddr_t *addr); 
     90    pj_status_t Listen(); 
     91    pj_status_t Accept(PjUwpSocket **new_sock); 
     92 
     93    void (*on_read)(PjUwpSocket *s, int bytes_read); 
     94    void (*on_write)(PjUwpSocket *s, int bytes_sent); 
     95    void (*on_accept)(PjUwpSocket *s, pj_status_t status); 
     96    void (*on_connect)(PjUwpSocket *s, pj_status_t status); 
     97 
     98private: 
    4799    PjUwpSocket* CreateAcceptSocket(Windows::Networking::Sockets::StreamSocket^ stream_sock_); 
    48     virtual ~PjUwpSocket(); 
    49  
    50     pj_status_t InitSocket(enum PjUwpSocketType sock_type_); 
    51  
    52 public: 
     100    pj_status_t SendImp(const void *buf, pj_ssize_t *len); 
     101    int ConsumeReadBuffer(void *buf, int max_len); 
     102 
    53103    int af; 
    54104    int type; 
     
    57107    pj_sockaddr remote_addr; 
    58108    pj_bool_t is_blocking; 
     109    pj_bool_t has_pending_bind; 
     110    pj_bool_t has_pending_send; 
     111    pj_bool_t has_pending_recv; 
    59112    void *user_data; 
     113    PjUwpSocketCallback cb; 
    60114 
    61115    enum PjUwpSocketType sock_type; 
     
    66120     
    67121    /* Helper objects */ 
    68     PjUwpSocketDatagramRecvHelper^ datagram_recv_helper; 
     122    PjUwpSocketDatagramRecvHelper^ dgram_recv_helper; 
    69123    PjUwpSocketListenerHelper^ listener_helper; 
    70124 
     
    72126    Windows::Storage::Streams::DataWriter^ socket_writer; 
    73127    Windows::Storage::Streams::IBuffer^ send_buffer; 
    74     pj_bool_t is_busy_sending; 
    75  
    76     void *read_userdata; 
    77     void *write_userdata; 
    78     void *accept_userdata; 
    79  
    80     void (*on_read)(PjUwpSocket *s, int bytes_read); 
    81     void (*on_write)(PjUwpSocket *s, int bytes_sent); 
    82     void (*on_accept)(PjUwpSocket *s, pj_status_t status); 
    83     void (*on_connect)(PjUwpSocket *s, pj_status_t status); 
     128 
     129    friend PjUwpSocketDatagramRecvHelper; 
     130    friend PjUwpSocketListenerHelper; 
    84131}; 
    85132 
     
    93140                                         pj_sockaddr_t *sockaddr) 
    94141{ 
     142#if 0 
    95143    char tmp_str_buf[PJ_INET6_ADDRSTRLEN+1]; 
    96144    pj_assert(wcslen(waddr) < sizeof(tmp_str_buf)); 
     
    102150 
    103151    return PJ_SUCCESS; 
     152#endif 
     153    char tmp_str_buf[PJ_INET6_ADDRSTRLEN+1]; 
     154    pj_assert(wcslen(waddr) < sizeof(tmp_str_buf)); 
     155    pj_unicode_to_ansi(waddr, wcslen(waddr), tmp_str_buf, sizeof(tmp_str_buf)); 
     156    pj_str_t remote_host; 
     157    pj_strset(&remote_host, tmp_str_buf, pj_ansi_strlen(tmp_str_buf)); 
     158    pj_sockaddr *addr = (pj_sockaddr*)sockaddr; 
     159    pj_bool_t got_addr = PJ_FALSE; 
     160 
     161    if (pj_inet_pton(PJ_AF_INET, &remote_host, &addr->ipv4.sin_addr) 
     162        == PJ_SUCCESS) 
     163    { 
     164        addr->addr.sa_family = PJ_AF_INET; 
     165        got_addr = PJ_TRUE; 
     166    } else if (pj_inet_pton(PJ_AF_INET6, &remote_host, &addr->ipv6.sin6_addr) 
     167        == PJ_SUCCESS) 
     168    { 
     169        addr->addr.sa_family = PJ_AF_INET6; 
     170        got_addr = PJ_TRUE; 
     171    } 
     172    if (!got_addr) 
     173        return PJ_EINVAL; 
     174 
     175    pj_sockaddr_set_port(addr, (pj_uint16_t)_wtoi(wport)); 
     176    return PJ_SUCCESS; 
    104177} 
    105178 
Note: See TracChangeset for help on using the changeset viewer.