{
SilcNetListener listener = (SilcNetListener)context;
- /* In case of error, the socket has been destroyed already */
+ /* In case of error, the socket has been destroyed already via
+ silc_stream_destroy. */
if (status != SILC_SOCKET_OK)
return;
/* Listen for connection */
void Listen()
{
+ SILC_LOG_DEBUG(("Listen()"));
+
new_conn = new RSocket;
if (!new_conn)
return;
/* Listener callback */
virtual void RunL()
{
+ SILC_LOG_DEBUG(("RunL(), iStatus=%d", iStatus));
+
if (iStatus != KErrNone) {
if (new_conn)
delete new_conn;
return;
}
+ SILC_LOG_DEBUG(("Accept new connection"));
+
/* Set socket options */
new_conn->SetOpt(KSoReuseAddr, KSolInetIp, 1);
SilcNetListener listener;
};
+extern "C" {
+
/* Create TCP listener */
SilcNetListener
if (local_ip_count > 0) {
listener->socks = (SilcSocket *)silc_calloc(local_ip_count,
- sizeof(*listener->socks));
+ sizeof(*listener->socks));
if (!listener->socks) {
callback(SILC_NET_NO_MEMORY, NULL, context);
return NULL;
/* Create the socket */
ret = l->sock.Open(l->ss, KAfInet, KSockStream, KProtocolInetTcp);
if (ret != KErrNone) {
- SILC_LOG_ERROR(("Cannot create socket"));
+ SILC_LOG_ERROR(("Cannot create socket, error %d", ret));
goto err;
}
/* Set the socket options */
ret = l->sock.SetOpt(KSoReuseAddr, KSolInetIp, 1);
if (ret != KErrNone) {
- SILC_LOG_ERROR(("Cannot set socket options"));
+ SILC_LOG_ERROR(("Cannot set socket options, error %d", ret));
goto err;
}
/* Bind the listener socket */
ret = l->sock.Bind(server);
if (ret != KErrNone) {
- SILC_LOG_DEBUG(("Cannot bind socket"));
+ SILC_LOG_DEBUG(("Cannot bind socket, error %d", ret));
goto err;
}
/* Specify that we are listenning */
ret = l->sock.Listen(5);
if (ret != KErrNone) {
- SILC_LOG_ERROR(("Cannot set socket listenning"));
+ SILC_LOG_ERROR(("Cannot set socket listenning, error %d", ret));
goto err;
}
l->Listen();
SILC_LOG_DEBUG(("Closing network listener"));
+ if (!listener)
+ return;
+
for (i = 0; i < listener->socks_count; i++) {
SilcSymbianTCPListener *l = (SilcSymbianTCPListener *)listener->socks[i];
l->sock.CancelAll();
silc_free(listener);
}
+} /* extern "C" */
+
/**************************** TCP/IP connecting *****************************/
static void silc_net_connect_stream(SilcSocketStreamStatus status,
- SilcStream stream, void *context);
+ SilcStream stream, void *context);
/* TCP connecting class */
/* Connect to remote host */
void Connect(TSockAddr &addr)
{
+ SILC_LOG_DEBUG(("Connect()"));
sock->Connect(addr, iStatus);
SetActive();
}
/* Connection callback */
virtual void RunL()
{
+ SILC_LOG_DEBUG(("RunL(), iStatus=%d", iStatus));
+
if (iStatus != KErrNone) {
if (callback)
callback(SILC_NET_ERROR, NULL, context);
return;
}
+ SILC_LOG_DEBUG(("Connected to host %s on %d", remote_ip, port));
+
/* Create stream */
if (callback) {
silc_socket_tcp_stream_create(
delete ss;
sock = NULL;
ss = NULL;
+ delete this;
}
-
- delete this;
}
/* Cancel */
void *context;
};
-/* Stream creation callback */
+extern "C" {
+
+/* TCP stream creation callback */
static void silc_net_connect_stream(SilcSocketStreamStatus status,
SilcStream stream, void *context)
SilcSymbianTCPConnect *conn = (SilcSymbianTCPConnect *)context;
SilcNetStatus net_status = SILC_NET_OK;
+ SILC_LOG_DEBUG(("Socket stream creation status %d", status));
+
if (status != SILC_SOCKET_OK) {
- /* In case of error, the socket has been destroyed already */
+ /* In case of error, the socket has been destroyed already via
+ silc_stream_destroy. */
if (status == SILC_SOCKET_UNKNOWN_IP)
net_status = SILC_NET_UNKNOWN_IP;
else if (status == SILC_SOCKET_UNKNOWN_HOST)
conn->callback = NULL;
conn->op = NULL;
if (conn->sock)
- sock->CancelConnect();
+ conn->sock->CancelConnect();
}
/* Create TCP/IP connection */
}
/* Do host lookup */
- if (!silc_net_is_ip(remote_ip_addr)) {
- if (!silc_net_gethostbyname(remote_ip_addr, FALSE, conn->remote_ip,
- sizeof(conn->remote_ip))) {
- SILC_LOG_ERROR(("Network (%s) unreachable: could not resolve the "
- "host", conn->remote));
- status = SILC_NET_HOST_UNREACHABLE;
- goto err;
- }
- } else {
- strcpy(conn->remote_ip, remote_ip_addr);
+ if (!silc_net_gethostbyname(remote_ip_addr, FALSE, conn->remote_ip,
+ sizeof(conn->remote_ip))) {
+ SILC_LOG_ERROR(("Network (%s) unreachable: could not resolve the "
+ "host", conn->remote));
+ status = SILC_NET_HOST_UNREACHABLE;
+ goto err;
}
/* Create the connection socket */
ret = conn->sock->Open(*conn->ss, KAfInet, KSockStream, KProtocolInetTcp);
if (ret != KErrNone) {
- SILC_LOG_ERROR(("Cannot create socket"));
+ SILC_LOG_ERROR(("Cannot create socket, error %d", ret));
status = SILC_NET_ERROR;
goto err;
}
tmp = (TText *)conn->remote_ip;
ret = remote.Input(tmp);
if (ret != KErrNone) {
- SILC_LOG_ERROR(("Cannot connect (cannot set address)"));
+ SILC_LOG_ERROR(("Cannot connect (cannot set address), error %d", ret));
status = SILC_NET_ERROR;
goto err;
}
SilcBool silc_net_addr2bin(const char *addr, void *bin, SilcUInt32 bin_len)
{
int ret = 0;
-
struct in_addr tmp;
+
ret = inet_aton(addr, &tmp);
if (bin_len < 4)
return FALSE;
s->sock->LocalName(addr);
return (SilcUInt16)addr.Port();
}
+
+} /* extern "C" */
\ No newline at end of file