- GNUNET_assert (notify != NULL);
- if ((sock->write_buffer_size < size) && (size < GNUNET_SERVER_MAX_MESSAGE_SIZE))
- {
- temp_size = sock->write_buffer_size + size + 1;
- if (temp_size >= GNUNET_SERVER_MAX_MESSAGE_SIZE)
- temp_size = GNUNET_SERVER_MAX_MESSAGE_SIZE;
-#if REALLOC
- sock->write_buffer = GNUNET_realloc(sock->write_buffer, temp_size);
-#else
- temp_buf = GNUNET_malloc(temp_size);
- memcpy(temp_buf, sock->write_buffer, sock->write_buffer_size);
- GNUNET_free(sock->write_buffer);
- sock->write_buffer = temp_buf;
-#endif
- sock->write_buffer_size = temp_size;
- }
- GNUNET_assert (sock->write_buffer_size >= size);
- GNUNET_assert (sock->write_buffer_off <= sock->write_buffer_size);
- GNUNET_assert (sock->write_buffer_pos <= sock->write_buffer_size);
- GNUNET_assert (sock->write_buffer_pos <= sock->write_buffer_off);
- sock->nth.notify_ready = notify;
- sock->nth.notify_ready_cls = notify_cls;
- sock->nth.sh = sock;
- sock->nth.notify_size = size;
- sock->nth.transmit_timeout = GNUNET_TIME_relative_to_absolute (timeout);
- GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == sock->nth.timeout_task);
- if ((sock->sock == NULL) &&
- (sock->ap_head == NULL) && (sock->dns_active == NULL))
- {
- if (sock->write_task != GNUNET_SCHEDULER_NO_TASK)
- GNUNET_SCHEDULER_cancel (sock->sched,
- sock->write_task);
- sock->write_task = GNUNET_SCHEDULER_add_now (sock->sched,
- &connect_error, sock);
- return &sock->nth;
- }
- if (GNUNET_SCHEDULER_NO_TASK != sock->write_task)
- return &sock->nth;
- if (sock->sock != NULL)
- {
-#if DEBUG_CONNECTION
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Scheduling transmit_ready (%p).\n", sock);
-#endif
- sock->write_task = GNUNET_SCHEDULER_add_write_net (sock->sched,
- GNUNET_TIME_absolute_get_remaining
- (sock->nth.
- transmit_timeout),
- sock->sock,
- &transmit_ready,
- sock);
- }
- else
- {
-#if DEBUG_CONNECTION
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "CCS-Scheduling transmit_ready, adding timeout task (%p).\n",
- sock);
-#endif
- sock->ccs |= COCO_TRANSMIT_READY;
- sock->nth.timeout_task = GNUNET_SCHEDULER_add_delayed (sock->sched,
- timeout,
- &transmit_timeout,
- sock);
- }
- return &sock->nth;
+ }
+ GNUNET_assert (NULL != notify);
+ GNUNET_assert (size < GNUNET_SERVER_MAX_MESSAGE_SIZE);
+ GNUNET_assert (connection->write_buffer_off <= connection->write_buffer_size);
+ GNUNET_assert (connection->write_buffer_pos <= connection->write_buffer_size);
+ GNUNET_assert (connection->write_buffer_pos <= connection->write_buffer_off);
+ connection->nth.notify_ready = notify;
+ connection->nth.notify_ready_cls = notify_cls;
+ connection->nth.connection = connection;
+ connection->nth.notify_size = size;
+ connection->nth.transmit_timeout = GNUNET_TIME_relative_to_absolute (timeout);
+ GNUNET_assert (NULL == connection->nth.timeout_task);
+ if ((NULL == connection->sock) &&
+ (NULL == connection->ap_head) &&
+ (NULL == connection->dns_active) &&
+ (NULL == connection->proxy_handshake))
+ {
+ if (NULL != connection->write_task)
+ GNUNET_SCHEDULER_cancel (connection->write_task);
+ connection->write_task = GNUNET_SCHEDULER_add_now (&connect_error,
+ connection);
+ return &connection->nth;
+ }
+ if (NULL != connection->write_task)
+ return &connection->nth; /* previous transmission still in progress */
+ if (NULL != connection->sock)
+ {
+ /* connected, try to transmit now */
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Scheduling transmission (%p).\n",
+ connection);
+ connection->write_task =
+ GNUNET_SCHEDULER_add_write_net (GNUNET_TIME_absolute_get_remaining
+ (connection->nth.transmit_timeout),
+ connection->sock, &transmit_ready, connection);
+ return &connection->nth;
+ }
+ /* not yet connected, wait for connection */
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Need to wait to schedule transmission for connection, adding timeout task (%p).\n",
+ connection);
+ connection->nth.timeout_task =
+ GNUNET_SCHEDULER_add_delayed (timeout,
+ &transmit_timeout, connection);
+ return &connection->nth;