--- a/libpurple/purpleprotocol.c Mon Oct 31 22:50:20 2022 -0500 +++ b/libpurple/purpleprotocol.c Mon Oct 31 22:52:24 2022 -0500 @@ -165,6 +165,23 @@ } /****************************************************************************** + * PurpleProtocol Implementation + *****************************************************************************/ +static PurpleConnection * +purple_protocol_default_create_connection(PurpleProtocol *protocol, + PurpleAccount *account, + const char *password, + G_GNUC_UNUSED GError **error) +{ + return g_object_new( + PURPLE_TYPE_CONNECTION, + "protocol", protocol, + "account", account, + "password", password, + NULL); +} + +/****************************************************************************** * GObject Implementation *****************************************************************************/ static void @@ -286,6 +303,8 @@ obj_class->set_property = purple_protocol_set_property; obj_class->finalize = purple_protocol_finalize; + klass->create_connection = purple_protocol_default_create_connection; + /** * PurpleProtocol::id: * @@ -548,6 +567,30 @@ } } + +PurpleConnection * +purple_protocol_create_connection(PurpleProtocol *protocol, + PurpleAccount *account, + const char *password, + GError **error) +{ + PurpleProtocolClass *klass = NULL; + + g_return_val_if_fail(PURPLE_IS_PROTOCOL(protocol), NULL); + g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL); + + klass = PURPLE_PROTOCOL_GET_CLASS(protocol); + if(klass != NULL && klass->create_connection != NULL) { + return klass->create_connection(protocol, account, password, error); + } + + g_set_error(error, PURPLE_CONNECTION_ERROR, 0, + "Protocol %s did not implement create_connection", + purple_protocol_get_name(protocol)); + + return NULL; +} + GList * purple_protocol_get_status_types(PurpleProtocol *protocol, PurpleAccount *account)