37 client = ga_client_new(GaClientFlags(0));
39 if (!ga_client_start(client, &error)) {
41 _(
"Avahi system error"),
42 Glib::ustring::compose(
43 _(
"%1\n\nuse command line arguments --rpchost and/or" 44 " --rpcport to connect directly"), error->message));
46 browser = ga_service_browser_new(
"_guitarix._tcp");
47 ga_service_browser_attach(browser, client, &error);
48 g_signal_connect(browser,
"new-service", G_CALLBACK(new_service),
this);
49 g_signal_connect(browser,
"removed-service", G_CALLBACK(removed_service),
this);
50 g_signal_connect(browser,
"cache-exhausted", G_CALLBACK(cache_exhausted),
this);
55 g_object_unref(resolver);
58 g_object_unref(browser);
61 g_object_unref(client);
71 AvahiAddress a = AvahiAddress();
72 uint16_t p = uint16_t();
73 if (resolver && ga_service_resolver_get_address(resolver, &a, &p)) {
74 char buf[AVAHI_ADDRESS_STR_MAX];
75 address = avahi_address_snprint(buf, AVAHI_ADDRESS_STR_MAX, &a);
85 for (std::map<Glib::ustring,int>::iterator i = service_names.begin(); i != service_names.end(); ++i) {
86 r.push_back(i->first);
91 AvahiProtocol protocol = AVAHI_PROTO_UNSPEC;
92 AvahiIfIndex
interface = AVAHI_IF_UNSPEC;
94 for (std::list<Entry>::iterator i = services.begin(); i != services.end(); ++i) {
95 if (i->name != name) {
98 if (i->protocol < protocol) {
101 if (i->interface < interface) {
110 resolver = ga_service_resolver_new(
111 e->interface, e->protocol, e->name.c_str(), e->type.c_str(), e->domain.c_str(), e->protocol, GA_LOOKUP_NO_FLAGS);
112 g_signal_connect(resolver,
"found", G_CALLBACK(on_found),
this);
113 g_signal_connect(resolver,
"failure", G_CALLBACK(on_failure),
this);
115 ga_service_resolver_attach(resolver, client, &error);
120 void AvahiBrowser::new_service(
121 GaServiceBrowser *browser, AvahiIfIndex interface, AvahiProtocol protocol,
122 const char *name,
const char *type,
const char *domain, AvahiLookupResultFlags flags,
void *data) {
124 self.services.push_back(
Entry(interface,protocol,name,type,domain,flags));
125 if (
self.service_names.find(name) ==
self.service_names.end()) {
126 self.service_names[name] = 1;
127 if (
self.cache_done) {
131 self.service_names[name] += 1;
136 void AvahiBrowser::removed_service(
137 GaServiceBrowser *browser, AvahiIfIndex interface, AvahiProtocol protocol,
138 const char *name,
const char *type,
const char *domain, AvahiLookupResultFlags flags,
void *data) {
140 Entry e(interface,protocol,name,type,domain,flags);
141 for (std::list<Entry>::iterator i =
self.services.begin(); i !=
self.services.end(); ++i) {
143 self.services.erase(i);
144 self.service_names[name] -= 1;
145 if (
self.service_names[name] <= 0) {
146 self.service_names.erase(name);
147 if (
self.cache_done) {
157 void AvahiBrowser::cache_exhausted(GaServiceBrowser *browser,
void *data) {
159 self.cache_done =
true;
164 void AvahiBrowser::on_found(
165 GaServiceResolver *resolver, AvahiIfIndex interface, AvahiProtocol protocol,
166 const char *name,
const char *type,
const char *domain,
const char *host_name,
167 const AvahiAddress * a, uint16_t port, AvahiStringList * txt,
168 AvahiLookupResultFlags flags,
void *data) {
170 self.found_name = name;
171 self.found_host = host_name;
176 void AvahiBrowser::on_failure(GaServiceResolver *resolver, GError *error,
void *data) {
190 Glib::RefPtr<gx_gui::GxBuilder> bld = gx_gui::GxBuilder::create_from_file(
192 bld->get_toplevel(
"SelectInstance", win);
193 win->signal_response().connect(sigc::mem_fun(
this, &SelectInstance::on_response));
194 bld->get_widget(
"treeview", view);
195 view->signal_row_activated().connect(
196 sigc::mem_fun(
this,&SelectInstance::on_row));
199 view->set_model(Gtk::ListStore::create(cols));
200 view->get_selection()->set_mode(Gtk::SELECTION_BROWSE);
201 view->get_selection()->signal_changed().connect(
202 sigc::mem_fun(
this, &SelectInstance::on_selection_changed));
203 av.
signal_changed().connect(sigc::mem_fun(
this, &SelectInstance::on_avahi_changed));
211 void SelectInstance::on_selection_changed() {
212 win->get_widget_for_response(1)->set_sensitive(view->get_selection()->get_selected());
215 void SelectInstance::on_avahi_changed() {
216 std::vector<Glib::ustring> r;
218 if (!win->is_visible()) {
228 Glib::RefPtr<Gtk::ListStore> ls = Glib::RefPtr<Gtk::ListStore>::cast_dynamic(view->get_model());
229 Gtk::TreeIter s = view->get_selection()->get_selected();
232 old = s->get_value(cols.name);
235 for (std::vector<Glib::ustring>::iterator i = r.begin(); i != r.end(); ++i) {
236 Gtk::TreeIter j = ls->append();
237 j->set_value(cols.name, *i);
242 view->get_selection()->select(j);
247 void SelectInstance::on_row(
const Gtk::TreePath& path, Gtk::TreeViewColumn* column) {
251 void SelectInstance::on_response(
int response_id) {
252 if (response_id == 1) {
253 Gtk::TreeIter i = view->get_selection()->get_selected();
AvahiLookupResultFlags flags
void gx_print_fatal(const char *, const std::string &)
SelectInstance(gx_system::CmdlineOptions &options, Gtk::Window *splash)
bool invoke_resolver(const Glib::ustring &name)
bool get_address_port(Glib::ustring &address, int &port, Glib::ustring &name, Glib::ustring &host)
sigc::signal< void > & signal_changed()
std::string get_builder_filepath(const std::string &basename) const
void get_service_names(std::vector< Glib::ustring > &r)