extern int tracker_send_report(t_addrlist const * laddrs) { t_addr const * addrl; t_elem const * currl; t_addr const * addrt; t_elem const * currt; t_trackpacket packet; struct utsname utsbuf; struct sockaddr_in tempaddr; t_laddr_info * laddr_info; char tempa[64]; char tempb[64]; if (addrlist_get_length(track_servers)>0) { std::memset(&packet,0,sizeof(packet)); bn_short_nset(&packet.packet_version,(unsigned short)TRACK_VERSION); /* packet.port is set below */ bn_int_nset(&packet.flags, 0); std::strncpy((char *)packet.server_location, prefs_get_location(), sizeof(packet.server_location)); bn_byte_set(&packet.server_location[sizeof(packet.server_location)-1],'\0'); std::strncpy((char *)packet.software, PVPGN_SOFTWARE, sizeof(packet.software)); bn_byte_set(&packet.software[sizeof(packet.software)-1],'\0'); std::strncpy((char *)packet.version, PVPGN_VERSION, sizeof(packet.version)); bn_byte_set(&packet.version[sizeof(packet.version)-1],'\0'); std::strncpy((char *)packet.server_desc, prefs_get_description(), sizeof(packet.server_desc)); bn_byte_set(&packet.server_desc[sizeof(packet.server_desc)-1],'\0'); std::strncpy((char *)packet.server_url, prefs_get_url(), sizeof(packet.server_url)); bn_byte_set(&packet.server_url[sizeof(packet.server_url)-1],'\0'); std::strncpy((char *)packet.contact_name, prefs_get_contact_name(), sizeof(packet.contact_name)); bn_byte_set(&packet.contact_name[sizeof(packet.contact_name)-1],'\0'); std::strncpy((char *)packet.contact_email, prefs_get_contact_email(), sizeof(packet.contact_email)); bn_byte_set(&packet.contact_email[sizeof(packet.contact_email)-1],'\0'); bn_int_nset(&packet.users,connlist_login_get_length()); bn_int_nset(&packet.channels,channellist_get_length()); bn_int_nset(&packet.games,gamelist_get_length()); bn_int_nset(&packet.uptime,server_get_uptime()); bn_int_nset(&packet.total_logins,connlist_total_logins()); bn_int_nset(&packet.total_games,gamelist_total_games()); if (uname(&utsbuf)<0) { eventlog(eventlog_level_warn,__FUNCTION__,"could not get platform info (uname: %s)",pstrerror(errno)); std::strncpy((char *)packet.platform,"",sizeof(packet.platform)); } else { std::strncpy((char *)packet.platform, utsbuf.sysname, sizeof(packet.platform)); bn_byte_set(&packet.platform[sizeof(packet.platform)-1],'\0'); } LIST_TRAVERSE_CONST(laddrs,currl) { addrl = (t_addr*)elem_get_data(currl); if (!(laddr_info = (t_laddr_info*)addr_get_data(addrl).p)) { eventlog(eventlog_level_error,__FUNCTION__,"address data is NULL"); continue; } if (laddr_info->type!=laddr_type_bnet) continue; /* don't report IRC, telnet, and other non-game ports */ bn_short_nset(&packet.port,addr_get_port(addrl)); LIST_TRAVERSE_CONST(track_servers,currt) { addrt = (t_addr*)elem_get_data(currt); std::memset(&tempaddr,0,sizeof(tempaddr)); tempaddr.sin_family = PSOCK_AF_INET; tempaddr.sin_port = htons(addr_get_port(addrt)); tempaddr.sin_addr.s_addr = htonl(addr_get_ip(addrt)); if (!addr_get_addr_str(addrl,tempa,sizeof(tempa))) std::strcpy(tempa,"x.x.x.x:x"); if (!addr_get_addr_str(addrt,tempb,sizeof(tempb))) std::strcpy(tempa,"x.x.x.x:x"); /* eventlog(eventlog_level_debug,__FUNCTION__,"sending tracking info from %s to %s",tempa,tempb); */ if (psock_sendto(laddr_info->usocket,&packet,sizeof(packet),0,(struct sockaddr *)&tempaddr,(psock_t_socklen)sizeof(tempaddr))<0) eventlog(eventlog_level_warn,__FUNCTION__,"could not send tracking information from %s to %s (psock_sendto: %s)",tempa,tempb,pstrerror(errno)); }
/* Add a single preference to the QVBoxLayout of a preference page */ static guint pref_show(pref_t *pref, gpointer layout_ptr) { QVBoxLayout *vb = static_cast<QVBoxLayout *>(layout_ptr); if (!pref || !vb) return 0; // Convert the pref description from plain text to rich text. QString description = html_escape(prefs_get_description(pref)); description.replace('\n', "<br>"); QString tooltip = QString("<span>%1</span>").arg(description); switch (prefs_get_type(pref)) { case PREF_UINT: case PREF_DECODE_AS_UINT: { QHBoxLayout *hb = new QHBoxLayout(); QLabel *label = new QLabel(prefs_get_title(pref)); label->setToolTip(tooltip); hb->addWidget(label); QLineEdit *uint_le = new QLineEdit(); uint_le->setToolTip(tooltip); uint_le->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(pref)); uint_le->setMinimumWidth(uint_le->fontMetrics().height() * 8); hb->addWidget(uint_le); hb->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum)); vb->addLayout(hb); break; } case PREF_BOOL: { QCheckBox *bool_cb = new QCheckBox(title_to_shortcut(prefs_get_title(pref))); bool_cb->setToolTip(tooltip); bool_cb->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(pref)); vb->addWidget(bool_cb); break; } case PREF_ENUM: { const enum_val_t *ev; if (prefs_get_enumvals(pref) == NULL) return 0; if (prefs_get_enum_radiobuttons(pref)) { QLabel *label = new QLabel(prefs_get_title(pref)); label->setToolTip(tooltip); vb->addWidget(label); QButtonGroup *enum_bg = new QButtonGroup(vb); for (ev = prefs_get_enumvals(pref); ev && ev->description; ev++) { QRadioButton *enum_rb = new QRadioButton(title_to_shortcut(ev->description)); enum_rb->setToolTip(tooltip); QStyleOption style_opt; enum_rb->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(pref)); enum_rb->setStyleSheet(QString( "QRadioButton {" " margin-left: %1px;" "}" ) .arg(enum_rb->style()->subElementRect(QStyle::SE_CheckBoxContents, &style_opt).left())); enum_bg->addButton(enum_rb, ev->value); vb->addWidget(enum_rb); } } else { QHBoxLayout *hb = new QHBoxLayout(); QComboBox *enum_cb = new QComboBox(); enum_cb->setToolTip(tooltip); enum_cb->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(pref)); for (ev = prefs_get_enumvals(pref); ev && ev->description; ev++) { enum_cb->addItem(ev->description, QVariant(ev->value)); } hb->addWidget(new QLabel(prefs_get_title(pref))); hb->addWidget(enum_cb); hb->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum)); vb->addLayout(hb); } break; } case PREF_STRING: { QHBoxLayout *hb = new QHBoxLayout(); QLabel *label = new QLabel(prefs_get_title(pref)); label->setToolTip(tooltip); hb->addWidget(label); QLineEdit *string_le = new QLineEdit(); string_le->setToolTip(tooltip); string_le->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(pref)); string_le->setMinimumWidth(string_le->fontMetrics().height() * 20); hb->addWidget(string_le); hb->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum)); vb->addLayout(hb); break; } case PREF_DECODE_AS_RANGE: case PREF_RANGE: { QHBoxLayout *hb = new QHBoxLayout(); QLabel *label = new QLabel(prefs_get_title(pref)); label->setToolTip(tooltip); hb->addWidget(label); SyntaxLineEdit *range_se = new SyntaxLineEdit(); range_se->setToolTip(tooltip); range_se->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(pref)); range_se->setMinimumWidth(range_se->fontMetrics().height() * 20); hb->addWidget(range_se); hb->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum)); vb->addLayout(hb); break; } case PREF_STATIC_TEXT: { QLabel *label = new QLabel(prefs_get_title(pref)); label->setToolTip(tooltip); label->setWordWrap(true); vb->addWidget(label); break; } case PREF_UAT: { QHBoxLayout *hb = new QHBoxLayout(); QLabel *label = new QLabel(prefs_get_title(pref)); label->setToolTip(tooltip); hb->addWidget(label); QPushButton *uat_pb = new QPushButton(QObject::tr("Edit" UTF8_HORIZONTAL_ELLIPSIS)); uat_pb->setToolTip(tooltip); uat_pb->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(pref)); hb->addWidget(uat_pb); hb->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum)); vb->addLayout(hb); break; } case PREF_SAVE_FILENAME: case PREF_OPEN_FILENAME: case PREF_DIRNAME: { QLabel *label = new QLabel(prefs_get_title(pref)); label->setToolTip(tooltip); vb->addWidget(label); QHBoxLayout *hb = new QHBoxLayout(); QLineEdit *path_le = new QLineEdit(); path_le->setToolTip(tooltip); QStyleOption style_opt; path_le->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(pref)); path_le->setMinimumWidth(path_le->fontMetrics().height() * 20); path_le->setStyleSheet(QString( "QLineEdit {" " margin-left: %1px;" "}" ) .arg(path_le->style()->subElementRect(QStyle::SE_CheckBoxContents, &style_opt).left())); hb->addWidget(path_le); QPushButton *path_pb = new QPushButton(QObject::tr("Browse" UTF8_HORIZONTAL_ELLIPSIS)); path_pb->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(pref)); hb->addWidget(path_pb); hb->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum)); vb->addLayout(hb); break; } case PREF_COLOR: { // XXX - Not needed yet. When it is needed we can add a label + QFrame which pops up a // color picker similar to the Font and Colors prefs. break; } default: break; } return 0; }