+
+ return ret;
+}
+
+typedef struct {
+ SilcMessagePayload payload;
+ SilcChannelID *channel_id;
+ SilcChannelPrivateKey key;
+} *SilcChannelClientResolve;
+
+static void silc_client_channel_message_cb(SilcClient client,
+ SilcClientConnection conn,
+ SilcClientEntry *clients,
+ SilcUInt32 clients_count,
+ void *context)
+{
+ SilcChannelClientResolve res = (SilcChannelClientResolve)context;
+
+ if (clients_count == 1) {
+ SilcChannelEntry channel;
+ unsigned char *message;
+ SilcUInt32 message_len;
+
+ channel = silc_client_get_channel_by_id(client, conn, res->channel_id);
+ if (!channel)
+ goto out;
+
+ /* If this client is not on channel, add it there since it clearly
+ is there. */
+ if (!silc_client_on_channel(channel, clients[0])) {
+ SilcChannelUser chu = silc_calloc(1, sizeof(*chu));
+ chu->client = clients[0];
+ chu->channel = channel;
+ silc_hash_table_add(channel->user_list, clients[0], chu);
+ silc_hash_table_add(clients[0]->channels, channel, chu);
+ }
+
+ message = silc_message_get_data(res->payload, &message_len);
+
+ /* Pass the message to application */
+ client->internal->ops->channel_message(
+ client, conn, clients[0], channel, res->payload,
+ res->key, silc_message_get_flags(res->payload),
+ message, message_len);
+ }
+
+ out:
+ silc_message_payload_free(res->payload);
+ silc_free(res->channel_id);
+ silc_free(res);