static void infinoted_plugin_manager_walk_directory( InfinotedPluginManager* manager, const InfBrowserIter* iter, InfinotedPluginInstance* instance, InfinotedPluginManagerWalkDirectoryFunc func) { /* This function walks the whole directory tree recursively and * registers running sessions with the given plugin instance. */ InfBrowser* browser; InfBrowserIter child; InfSessionProxy* proxy; browser = INF_BROWSER(manager->directory); if(inf_browser_is_subdirectory(browser, iter) == TRUE) { if(inf_browser_get_explored(browser, iter) == TRUE) { child = *iter; inf_browser_get_child(browser, &child); do { infinoted_plugin_manager_walk_directory(manager, &child, instance, func); } while(inf_browser_get_next(browser, &child)); } } else { proxy = inf_browser_get_session(browser, iter); if(proxy != NULL) { func(manager, instance, iter, proxy); } } }
void Gobby::BrowserContextCommands::on_rename(InfBrowser* browser, InfBrowserIter iter) { bool directory = inf_browser_is_subdirectory(browser, &iter); m_watch.reset(new NodeWatch(browser, &iter)); m_watch->signal_node_removed().connect(sigc::mem_fun( *this, &BrowserContextCommands::on_dialog_node_removed)); std::auto_ptr<EntryDialog> entry_dialog( new EntryDialog( m_parent, directory ? _("Choose a name for the directory") : _("Choose a name for the document"), directory ? _("_Directory Name:") : _("_Document Name:"))); entry_dialog->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); entry_dialog->add_button(_("_Rename"), Gtk::RESPONSE_ACCEPT) ->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::EDIT, Gtk::ICON_SIZE_BUTTON))); entry_dialog->set_text(inf_browser_get_node_name(browser, &iter)); entry_dialog->signal_response().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_rename_response), browser, iter)); m_dialog = entry_dialog; m_dialog->present(); }
static void infinoted_plugin_dbus_explore_node(InfinotedPluginDbus* plugin, InfinotedPluginDbusInvocation* invocation, InfBrowser* browser, const InfBrowserIter* iter) { InfBrowserIter child_iter; GVariantBuilder builder; child_iter = *iter; g_variant_builder_init(&builder, G_VARIANT_TYPE("a(ss)")); if(inf_browser_get_child(browser, &child_iter)) { do { if(inf_browser_is_subdirectory(browser, &child_iter)) { g_variant_builder_add( &builder, "(ss)", inf_browser_get_node_name(browser, &child_iter), "InfSubdirectory" ); } else { g_variant_builder_add( &builder, "(ss)", inf_browser_get_node_name(browser, &child_iter), inf_browser_get_node_type(browser, &child_iter) ); } } while(inf_browser_get_next(browser, &child_iter)); } g_dbus_method_invocation_return_value( invocation->invocation, g_variant_new("(@a(ss))", g_variant_builder_end(&builder)) ); infinoted_plugin_dbus_invocation_free(invocation->plugin, invocation); }
gint compare_func(GtkTreeModel* model, GtkTreeIter* first, GtkTreeIter* second, gpointer user_data) { gint result; InfBrowser* br_one; InfBrowser* br_two; InfBrowserIter* bri_one; InfBrowserIter* bri_two; GtkTreeIter parent; result = 0; if(gtk_tree_model_iter_parent(model, &parent, first)) { g_assert(gtk_tree_model_iter_parent(model, &parent, second)); gtk_tree_model_get( model, first, INF_GTK_BROWSER_MODEL_COL_BROWSER, &br_one, INF_GTK_BROWSER_MODEL_COL_NODE, &bri_one, -1); gtk_tree_model_get( model, second, INF_GTK_BROWSER_MODEL_COL_BROWSER, &br_two, INF_GTK_BROWSER_MODEL_COL_NODE, &bri_two, -1); if(inf_browser_is_subdirectory(br_one, bri_one) && !inf_browser_is_subdirectory(br_two, bri_two)) { result = -1; } else if(!inf_browser_is_subdirectory(br_one, bri_one) && inf_browser_is_subdirectory(br_two, bri_two)) { result = 1; } g_object_unref(br_one); g_object_unref(br_two); inf_browser_iter_free(bri_one); inf_browser_iter_free(bri_two); } if(!result) { gchar* name_one; gchar* name_two; gtk_tree_model_get( model, first, INF_GTK_BROWSER_MODEL_COL_NAME, &name_one, -1); gtk_tree_model_get( model, second, INF_GTK_BROWSER_MODEL_COL_NAME, &name_two, -1); gchar* one = g_utf8_casefold(name_one, -1); gchar* two = g_utf8_casefold(name_two, -1); result = g_utf8_collate(one, two); g_free(name_one); g_free(name_two); g_free(one); g_free(two); } return result; }
static void infinoted_plugin_document_stream_navigate_func(InfBrowser* browser, const InfBrowserIter* iter, const GError* error, gpointer user_data) { InfinotedPluginDocumentStreamStream* stream; InfSessionProxy* proxy; InfRequest* request; stream = (InfinotedPluginDocumentStreamStream*)user_data; stream->navigate_handle = NULL; if(error != NULL) { infinoted_plugin_document_stream_send_error(stream, error->message); } else { if(inf_browser_is_subdirectory(browser, iter) || (strcmp(inf_browser_get_node_type(browser, iter), "InfText") != 0 && strcmp(inf_browser_get_node_type(browser, iter), "InfChat") != 0)) { infinoted_plugin_document_stream_send_error( stream, _("Not a text or chat node") ); } else { stream->iter = *iter; proxy = inf_browser_get_session(browser, iter); if(proxy != NULL) { infinoted_plugin_document_stream_subscribe_done(stream, proxy); } else { request = inf_browser_get_pending_request( browser, iter, "subscribe-session" ); if(request != NULL) { g_signal_connect( G_OBJECT(browser), "finished", G_CALLBACK(infinoted_plugin_document_stream_subscribe_func), stream ); } else { request = inf_browser_subscribe( browser, iter, infinoted_plugin_document_stream_subscribe_func, stream ); } stream->subscribe_request = request; } } } }
bool BrowserIter::isDirectory() { if( m_infBrowser ) return inf_browser_is_subdirectory( INF_BROWSER(m_infBrowser), &m_infBrowserIter ) != 0; return 0; }
void Gobby::BrowserContextCommands::on_populate_popup(Gtk::Menu* menu) { // TODO: Can this happen? Should we close the old popup here? g_assert(m_popup_menu == NULL); // Cancel previous attempts m_watch.reset(NULL); m_dialog.reset(NULL); InfBrowser* browser; InfBrowserIter iter; if(!m_browser.get_selected(&browser, &iter)) return; InfBrowserStatus browser_status; g_object_get(G_OBJECT(browser), "status", &browser_status, NULL); if(browser_status != INF_BROWSER_OPEN) return; InfBrowserIter dummy_iter = iter; bool is_subdirectory = inf_browser_is_subdirectory(browser, &iter); bool is_toplevel = !inf_browser_get_parent(browser, &dummy_iter); // Watch the node, and close the popup menu when the node // it refers to is removed. m_watch.reset(new NodeWatch(browser, &iter)); m_watch->signal_node_removed().connect(sigc::mem_fun( *this, &BrowserContextCommands::on_menu_node_removed)); menu->signal_deactivate().connect(sigc::mem_fun( *this, &BrowserContextCommands::on_menu_deactivate)); // Add "Disconnect" menu option if the connection // item has been clicked at if(is_toplevel && INFC_IS_BROWSER(browser)) { Gtk::ImageMenuItem* disconnect_item = Gtk::manage( new Gtk::ImageMenuItem(_("_Disconnect from Server"), true)); disconnect_item->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::DISCONNECT, Gtk::ICON_SIZE_MENU))); disconnect_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_disconnect), INFC_BROWSER(browser))); disconnect_item->show(); menu->append(*disconnect_item); // Separator Gtk::SeparatorMenuItem* sep_item = Gtk::manage(new Gtk::SeparatorMenuItem); sep_item->show(); menu->append(*sep_item); } // Create Document Gtk::ImageMenuItem* new_document_item = Gtk::manage( new Gtk::ImageMenuItem(_("Create Do_cument..."), true)); new_document_item->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::NEW, Gtk::ICON_SIZE_MENU))); new_document_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_new), browser, iter, false)); new_document_item->set_sensitive(is_subdirectory); new_document_item->show(); menu->append(*new_document_item); // Create Directory // Check whether we have the folder-new icon, fall back to // Stock::DIRECTORY otherwise Glib::RefPtr<Gdk::Screen> screen = menu->get_screen(); Glib::RefPtr<Gtk::IconTheme> icon_theme( Gtk::IconTheme::get_for_screen(screen)); Gtk::Image* new_directory_image = Gtk::manage(new Gtk::Image); if(icon_theme->lookup_icon("folder-new", Gtk::ICON_SIZE_MENU, Gtk::ICON_LOOKUP_USE_BUILTIN)) { new_directory_image->set_from_icon_name( "folder-new", Gtk::ICON_SIZE_MENU); } else { new_directory_image->set( Gtk::Stock::DIRECTORY, Gtk::ICON_SIZE_MENU); } Gtk::ImageMenuItem* new_directory_item = Gtk::manage( new Gtk::ImageMenuItem(_("Create Di_rectory..."), true)); new_directory_item->set_image(*new_directory_image); new_directory_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_new), browser, iter, true)); new_directory_item->set_sensitive(is_subdirectory); new_directory_item->show(); menu->append(*new_directory_item); // Open Document Gtk::ImageMenuItem* open_document_item = Gtk::manage( new Gtk::ImageMenuItem(_("_Open Document..."), true)); open_document_item->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::OPEN, Gtk::ICON_SIZE_MENU))); open_document_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_open), browser, iter)); open_document_item->set_sensitive(is_subdirectory); open_document_item->show(); menu->append(*open_document_item); // Separator Gtk::SeparatorMenuItem* sep_item = Gtk::manage(new Gtk::SeparatorMenuItem); sep_item->show(); menu->append(*sep_item); // Permissions Gtk::ImageMenuItem* permissions_item = Gtk::manage( new Gtk::ImageMenuItem(_("_Permissions..."), true)); permissions_item->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::PROPERTIES, Gtk::ICON_SIZE_MENU))); permissions_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_permissions), browser, iter)); permissions_item->show(); menu->append(*permissions_item); // Rename Gtk::ImageMenuItem* rename_item = Gtk::manage( new Gtk::ImageMenuItem(_("Re_name"), true)); rename_item->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::EDIT, Gtk::ICON_SIZE_MENU))); rename_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_rename), browser, iter)); rename_item->set_sensitive(!is_toplevel); rename_item->show(); menu->append(*rename_item); // Delete Gtk::ImageMenuItem* delete_item = Gtk::manage( new Gtk::ImageMenuItem(_("D_elete"), true)); delete_item->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::DELETE, Gtk::ICON_SIZE_MENU))); delete_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_delete), browser, iter)); delete_item->set_sensitive(!is_toplevel); delete_item->show(); menu->append(*delete_item); m_popup_menu = menu; menu->signal_selection_done().connect( sigc::mem_fun( *this, &BrowserContextCommands::on_popdown)); }
void Gobby::BrowserContextCommands::on_populate_popup(Gtk::Menu* menu) { // TODO: Can this happen? Should we close the old popup here? g_assert(m_popup_menu == NULL); // Cancel previous attempts m_watch.reset(NULL); m_dialog.reset(NULL); InfBrowser* browser; InfBrowserIter iter; if(!m_browser.get_selected_browser(&browser)) return; if(!m_browser.get_selected_iter(browser, &iter)) { InfBrowserStatus browser_status; g_object_get(G_OBJECT(browser), "status", &browser_status, NULL); if(browser_status == INF_BROWSER_CLOSED) { Gtk::ImageMenuItem *remove_item = Gtk::manage( new Gtk::ImageMenuItem(_("_Remove"), true)); remove_item->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::CLOSE, Gtk::ICON_SIZE_MENU))); remove_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_remove), browser)); remove_item->show(); menu->append(*remove_item); } return; } InfBrowserIter dummy_iter = iter; bool is_subdirectory = inf_browser_is_subdirectory(browser, &iter); bool is_toplevel = !inf_browser_get_parent(browser, &dummy_iter); // Watch the node, and close the popup menu when the node // it refers to is removed. m_watch.reset(new NodeWatch(browser, &iter)); m_watch->signal_node_removed().connect(sigc::mem_fun( *this, &BrowserContextCommands::on_menu_node_removed)); menu->signal_deactivate().connect(sigc::mem_fun( *this, &BrowserContextCommands::on_menu_deactivate)); bool have_toplevel_entries = false; // Add "Disconnect" menu option if the connection // item has been clicked at if(is_toplevel && INFC_IS_BROWSER(browser)) { Gtk::ImageMenuItem* disconnect_item = Gtk::manage( new Gtk::ImageMenuItem( _("_Disconnect from Server"), true)); disconnect_item->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::DISCONNECT, Gtk::ICON_SIZE_MENU))); disconnect_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_disconnect), INFC_BROWSER(browser))); disconnect_item->show(); menu->append(*disconnect_item); have_toplevel_entries = true; } // Add create account option if the connection item has been clicked at if(is_toplevel) { const InfAclAccount* account = inf_browser_get_acl_local_account(browser); const InfAclAccountId acc_id = (account != NULL) ? account->id : 0; InfAclMask mask; inf_acl_mask_set1(&mask, INF_ACL_CAN_CREATE_ACCOUNT); inf_browser_check_acl(browser, &iter, acc_id, &mask, &mask); if(inf_acl_mask_has(&mask, INF_ACL_CAN_CREATE_ACCOUNT)) { Gtk::Image* image = Gtk::manage(new Gtk::Image); image->set_from_icon_name("application-certificate", Gtk::ICON_SIZE_MENU); Gtk::ImageMenuItem* item = Gtk::manage(new Gtk::ImageMenuItem( _("Create _Account..."), true)); item->set_image(*image); item->signal_activate().connect(sigc::bind( sigc::mem_fun( *this, &BrowserContextCommands:: on_create_account), browser)); item->show(); menu->append(*item); have_toplevel_entries = true; } } // Separator, if we have entries dedicated to the browser itself if(have_toplevel_entries) { Gtk::SeparatorMenuItem* sep_item = Gtk::manage(new Gtk::SeparatorMenuItem); sep_item->show(); menu->append(*sep_item); } // Create Document Gtk::ImageMenuItem* new_document_item = Gtk::manage( new Gtk::ImageMenuItem(_("Create Do_cument..."), true)); new_document_item->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::NEW, Gtk::ICON_SIZE_MENU))); new_document_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_new), browser, iter, false)); new_document_item->set_sensitive(is_subdirectory); new_document_item->show(); menu->append(*new_document_item); // Create Directory // Check whether we have the folder-new icon, fall back to // Stock::DIRECTORY otherwise Glib::RefPtr<Gdk::Screen> screen = menu->get_screen(); Glib::RefPtr<Gtk::IconTheme> icon_theme( Gtk::IconTheme::get_for_screen(screen)); Gtk::Image* new_directory_image = Gtk::manage(new Gtk::Image); if(icon_theme->lookup_icon("folder-new", Gtk::ICON_SIZE_MENU, Gtk::ICON_LOOKUP_USE_BUILTIN)) { new_directory_image->set_from_icon_name( "folder-new", Gtk::ICON_SIZE_MENU); } else { new_directory_image->set( Gtk::Stock::DIRECTORY, Gtk::ICON_SIZE_MENU); } Gtk::ImageMenuItem* new_directory_item = Gtk::manage( new Gtk::ImageMenuItem(_("Create Di_rectory..."), true)); new_directory_item->set_image(*new_directory_image); new_directory_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_new), browser, iter, true)); new_directory_item->set_sensitive(is_subdirectory); new_directory_item->show(); menu->append(*new_directory_item); // Open Document Gtk::ImageMenuItem* open_document_item = Gtk::manage( new Gtk::ImageMenuItem(_("_Open Document..."), true)); open_document_item->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::OPEN, Gtk::ICON_SIZE_MENU))); open_document_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_open), browser, iter)); open_document_item->set_sensitive(is_subdirectory); open_document_item->show(); menu->append(*open_document_item); // Separator Gtk::SeparatorMenuItem* sep_item = Gtk::manage(new Gtk::SeparatorMenuItem); sep_item->show(); menu->append(*sep_item); // Permissions Gtk::ImageMenuItem* permissions_item = Gtk::manage( new Gtk::ImageMenuItem(_("_Permissions..."), true)); permissions_item->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::PROPERTIES, Gtk::ICON_SIZE_MENU))); permissions_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_permissions), browser, iter)); permissions_item->show(); menu->append(*permissions_item); // Delete Gtk::ImageMenuItem* delete_item = Gtk::manage( new Gtk::ImageMenuItem(_("D_elete"), true)); delete_item->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::DELETE, Gtk::ICON_SIZE_MENU))); delete_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_delete), browser, iter)); delete_item->set_sensitive(!is_toplevel); delete_item->show(); menu->append(*delete_item); m_popup_menu = menu; menu->signal_selection_done().connect( sigc::mem_fun( *this, &BrowserContextCommands::on_popdown)); }