AccountWindow::StringListOption::StringListOption(PurpleAccount *account_, PurpleAccountOption *option_) : account(account_), option(option_) { g_assert(account); g_assert(option); setText(purple_account_option_get_text(option)); const char *def = purple_account_get_string(account, purple_account_option_get_setting(option), purple_account_option_get_default_list_value(option)); for (GList *l = purple_account_option_get_list(option); l; l = l->next) if (l->data) { PurpleKeyValuePair *kvp = reinterpret_cast<PurpleKeyValuePair*>( l->data); addOptionPtr(kvp->key, kvp->value); if (kvp->value && def && !strcmp(def, reinterpret_cast<const char*>(kvp->value))) setSelectedByDataPtr(kvp->value); } signal_selection_changed.connect(sigc::mem_fun(this, &StringListOption::onSelectionChanged)); }
static VALUE protocol_get_default_options(VALUE self) { PurplePlugin *protocol; PurplePluginProtocolInfo *prpl_info; PurpleAccountOption *opt; GList *opts; const char *str_val; VALUE h = rb_hash_new(), key, val; Data_Get_Struct(self, PurplePlugin, protocol); prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(protocol); opts = prpl_info->protocol_options; for (; opts; opts = opts->next) { opt = (PurpleAccountOption *)opts->data; key = rb_str_new2(opt->pref_name); switch (opt->type) { case PURPLE_PREF_BOOLEAN: val = purple_account_option_get_default_bool(opt) ? Qtrue : Qfalse; break; case PURPLE_PREF_INT: val = INT2FIX(purple_account_option_get_default_int(opt)); break; case PURPLE_PREF_STRING: str_val = purple_account_option_get_default_string(opt); val = str_val == NULL ? rb_str_new2("") : rb_str_new2(str_val); break; case PURPLE_PREF_STRING_LIST: str_val = rb_str_new2(purple_account_option_get_default_list_value(opt)); val = str_val == NULL ? rb_str_new2("") : rb_str_new2(str_val); break; default: key = Qnil; } if (key != Qnil) rb_hash_aset(h, key, val); } return h; }
static void purple_init( account_t *acc ) { PurplePlugin *prpl = purple_plugins_find_with_id( (char*) acc->prpl->data ); PurplePluginProtocolInfo *pi = prpl->info->extra_info; PurpleAccount *pa; GList *i, *st; set_t *s; char help_title[64]; GString *help; static gboolean dir_fixed = FALSE; /* Layer violation coming up: Making an exception for libpurple here. Dig in the IRC state a bit to get a username. Ideally we should check if s/he identified but this info doesn't seem *that* important. It's just that fecking libpurple can't *not* store this shit. Remember that libpurple is not really meant to be used on public servers anyway! */ if( !dir_fixed ) { irc_t *irc = acc->bee->ui_data; char *dir; dir = g_strdup_printf( "%s/purple/%s", global.conf->configdir, irc->user->nick ); purple_util_set_user_dir( dir ); g_free( dir ); purple_blist_load(); purple_prefs_load(); dir_fixed = TRUE; } help = g_string_new( "" ); g_string_printf( help, "BitlBee libpurple module %s (%s).\n\nSupported settings:", (char*) acc->prpl->name, prpl->info->name ); if( pi->user_splits ) { GList *l; g_string_append_printf( help, "\n* username: Username" ); for( l = pi->user_splits; l; l = l->next ) g_string_append_printf( help, "%c%s", purple_account_user_split_get_separator( l->data ), purple_account_user_split_get_text( l->data ) ); } /* Convert all protocol_options into per-account setting variables. */ for( i = pi->protocol_options; i; i = i->next ) { PurpleAccountOption *o = i->data; const char *name; char *def = NULL; set_eval eval = NULL; void *eval_data = NULL; GList *io = NULL; GSList *opts = NULL; name = purple_account_option_get_setting( o ); switch( purple_account_option_get_type( o ) ) { case PURPLE_PREF_STRING: def = g_strdup( purple_account_option_get_default_string( o ) ); g_string_append_printf( help, "\n* %s (%s), %s, default: %s", name, purple_account_option_get_text( o ), "string", def ); break; case PURPLE_PREF_INT: def = g_strdup_printf( "%d", purple_account_option_get_default_int( o ) ); eval = set_eval_int; g_string_append_printf( help, "\n* %s (%s), %s, default: %s", name, purple_account_option_get_text( o ), "integer", def ); break; case PURPLE_PREF_BOOLEAN: if( purple_account_option_get_default_bool( o ) ) def = g_strdup( "true" ); else def = g_strdup( "false" ); eval = set_eval_bool; g_string_append_printf( help, "\n* %s (%s), %s, default: %s", name, purple_account_option_get_text( o ), "boolean", def ); break; case PURPLE_PREF_STRING_LIST: def = g_strdup( purple_account_option_get_default_list_value( o ) ); g_string_append_printf( help, "\n* %s (%s), %s, default: %s", name, purple_account_option_get_text( o ), "list", def ); g_string_append( help, "\n Possible values: " ); for( io = purple_account_option_get_list( o ); io; io = io->next ) { PurpleKeyValuePair *kv = io->data; opts = g_slist_append( opts, kv->value ); /* TODO: kv->value is not a char*, WTF? */ if( strcmp( kv->value, kv->key ) != 0 ) g_string_append_printf( help, "%s (%s), ", (char*) kv->value, kv->key ); else g_string_append_printf( help, "%s, ", (char*) kv->value ); } g_string_truncate( help, help->len - 2 ); eval = set_eval_list; eval_data = opts; break; default: /** No way to talk to the user right now, invent one when this becomes important. irc_rootmsg( acc->irc, "Setting with unknown type: %s (%d) Expect stuff to break..\n", name, purple_account_option_get_type( o ) ); */ g_string_append_printf( help, "\n* [%s] UNSUPPORTED (type %d)", name, purple_account_option_get_type( o ) ); name = NULL; } if( name != NULL ) { s = set_add( &acc->set, name, def, eval, acc ); s->flags |= ACC_SET_OFFLINE_ONLY; s->eval_data = eval_data; g_free( def ); } } g_snprintf( help_title, sizeof( help_title ), "purple %s", (char*) acc->prpl->name ); help_add_mem( &global.help, help_title, help->str ); g_string_free( help, TRUE ); s = set_add( &acc->set, "display_name", NULL, set_eval_display_name, acc ); s->flags |= ACC_SET_ONLINE_ONLY; if( pi->options & OPT_PROTO_MAIL_CHECK ) { s = set_add( &acc->set, "mail_notifications", "false", set_eval_bool, acc ); s->flags |= ACC_SET_OFFLINE_ONLY; } if( strcmp( prpl->info->name, "Gadu-Gadu" ) == 0 ) s = set_add( &acc->set, "gg_sync_contacts", "true", set_eval_bool, acc ); /* Go through all away states to figure out if away/status messages are possible. */ pa = purple_account_new( acc->user, (char*) acc->prpl->data ); for( st = purple_account_get_status_types( pa ); st; st = st->next ) { PurpleStatusPrimitive prim = purple_status_type_get_primitive( st->data ); if( prim == PURPLE_STATUS_AVAILABLE ) { if( purple_status_type_get_attr( st->data, "message" ) ) acc->flags |= ACC_FLAG_STATUS_MESSAGE; } else if( prim != PURPLE_STATUS_OFFLINE ) { if( purple_status_type_get_attr( st->data, "message" ) ) acc->flags |= ACC_FLAG_AWAY_MESSAGE; } } purple_accounts_remove( pa ); }
MojObject getProtocolOptions(MojString prpl) { MojObject result; PurplePluginProtocolInfo* info = getProtocolInfo(prpl.data()); for(GList* l = info->protocol_options; l != NULL; l = l->next) { PurpleAccountOption* option = (PurpleAccountOption*)l->data; MojObject node; MojObject choices; node.putString("text", purple_account_option_get_text(option)); switch(purple_account_option_get_type(option)) { case PURPLE_PREF_BOOLEAN: node.putString("type", "bool"); node.putBool("default_value", purple_account_option_get_default_bool(option) ); break; case PURPLE_PREF_INT: node.putString("type", "int"); node.putInt("default_value", purple_account_option_get_default_int(option) ); break; case PURPLE_PREF_STRING: node.putString("type", "string"); { const char* def = purple_account_option_get_default_string(option); node.putString("default_value", def ? def : ""); } break; case PURPLE_PREF_STRING_LIST: node.putString("type", "list"); { MojObject choices; for (GList* list = purple_account_option_get_list(option); list != NULL; list = list->next) { PurpleKeyValuePair* kvp = (PurpleKeyValuePair*)list->data; // XXX: Dangerous! if (kvp->key && kvp->value) choices.putString((const char*)kvp->value, (const char*)kvp->key); } node.put("choices", choices); const char* def = purple_account_option_get_default_list_value(option); node.putString("default_value", def ? def : ""); } break; default: continue; }; result.put(purple_account_option_get_setting(option), node); } return result; }