/** * Connects to the MQTT service. This first establishes an SSL based * socket. Then it sends the initial connection packet with optional * arguments, which correspond to the flags provided. The arguments * must be passed in order: client identifier, will topic, will * message, username, and password (not required). The arguments must * be in a string format. * * @param mqtt The #fb_mqtt. * @param timeout The keep-alive timeout (seconds). * @param flags The #fb_mqtt_connect_flags. * @param cid The client identifier. * @param ... Additional arguments in order, NULL-terminated. **/ void fb_mqtt_connect(fb_mqtt_t *mqtt, guint8 flags, const gchar *cid, ...) { fb_mqtt_msg_t *msg; va_list ap; const gchar *str; g_return_if_fail(mqtt != NULL); if (G_UNLIKELY(fb_mqtt_connected(mqtt, FALSE))) return; /* Facebook always sends a CONNACK, use QoS1 */ flags |= FB_MQTT_CONNECT_FLAG_QOS1; msg = fb_mqtt_msg_new(FB_MQTT_MSG_TYPE_CONNECT, 0); fb_mqtt_msg_write_str(msg, FB_MQTT_NAME); /* Protocol name */ fb_mqtt_msg_write_byte(msg, FB_MQTT_VERS); /* Protocol version */ fb_mqtt_msg_write_byte(msg, flags); /* Flags */ fb_mqtt_msg_write_u16(msg, FB_MQTT_KA); /* Keep alive */ fb_mqtt_msg_write_str(msg, cid); /* Client identifier */ va_start(ap, cid); while ((str = va_arg(ap, const gchar*)) != NULL) fb_mqtt_msg_write_str(msg, str); va_end(ap); fb_mqtt_write(mqtt, msg); fb_mqtt_msg_free(msg); fb_mqtt_timeout(mqtt); }
/** * Opens the connection to the MQTT service. * * @param mqtt The #fb_mqtt. **/ void fb_mqtt_open(fb_mqtt_t *mqtt, const gchar *host, gint port) { g_return_if_fail(mqtt != NULL); fb_mqtt_close(mqtt); mqtt->ssl = ssl_connect((gchar*) host, port, TRUE, fb_mqtt_cb_open, mqtt); if (mqtt->ssl == NULL) { fb_mqtt_cb_open(mqtt, 1, NULL, 0); return; } fb_mqtt_timeout(mqtt); }
/** * Implemented #b_event_handler for sending a PING request. * * @param data The user defined data, which is #fb_mqtt. * @param fd The event file descriptor. * @param cond The #b_input_condition. * * @return FALSE to prevent continued event handling. **/ static gboolean fb_mqtt_cb_ping(gpointer data, gint fd, b_input_condition cond) { fb_mqtt_t *mqtt = data; fb_mqtt_msg_t *msg; msg = fb_mqtt_msg_new(FB_MQTT_MSG_TYPE_PINGREQ, 0); fb_mqtt_write(mqtt, msg); fb_mqtt_msg_free(msg); mqtt->tev = 0; fb_mqtt_timeout(mqtt); return FALSE; }
static gboolean fb_mqtt_cb_ping(gpointer data) { FbMqtt *mqtt = data; FbMqttMessage *msg; FbMqttPrivate *priv = mqtt->priv; msg = fb_mqtt_message_new(FB_MQTT_MESSAGE_TYPE_PINGREQ, 0); fb_mqtt_write(mqtt, msg); g_object_unref(msg); priv->tev = 0; fb_mqtt_timeout(mqtt); return FALSE; }
void fb_mqtt_open(FbMqtt *mqtt, const gchar *host, gint port) { FbMqttPrivate *priv; PurpleAccount *acc; g_return_if_fail(FB_IS_MQTT(mqtt)); priv = mqtt->priv; acc = purple_connection_get_account(priv->gc); fb_mqtt_close(mqtt); priv->gsc = purple_ssl_connect(acc, host, port, fb_mqtt_cb_open, fb_mqtt_cb_open_error, mqtt); if (priv->gsc == NULL) { fb_mqtt_cb_open_error(NULL, 0, mqtt); return; } fb_mqtt_timeout(mqtt); }
void fb_mqtt_connect(FbMqtt *mqtt, guint8 flags, const GByteArray *pload) { FbMqttMessage *msg; g_return_if_fail(!fb_mqtt_connected(mqtt, FALSE)); g_return_if_fail(pload != NULL); /* Facebook always sends a CONNACK, use QoS1 */ flags |= FB_MQTT_CONNECT_FLAG_QOS1; msg = fb_mqtt_message_new(FB_MQTT_MESSAGE_TYPE_CONNECT, 0); fb_mqtt_message_write_str(msg, FB_MQTT_NAME); /* Protocol name */ fb_mqtt_message_write_byte(msg, FB_MQTT_LEVEL); /* Protocol level */ fb_mqtt_message_write_byte(msg, flags); /* Flags */ fb_mqtt_message_write_u16(msg, FB_MQTT_KA); /* Keep alive */ fb_mqtt_message_write(msg, pload->data, pload->len); fb_mqtt_write(mqtt, msg); fb_mqtt_timeout(mqtt); g_object_unref(msg); }