/** @brief True if RTP play is enabled */
int rtp_is_running;
+/** @brief Server version */
+const char *server_version;
+
+/** @brief Parsed server version */
+long server_version_bytes;
+
static void check_rtp_address(const char *event,
void *eventdata,
void *callbackdata);
rights_lookup_in_flight = 0;
}
+static void check_rights(void) {
+ if(!rights_lookup_in_flight) {
+ rights_lookup_in_flight = 1;
+ disorder_eclient_userinfo(client,
+ userinfo_rights_completed,
+ config->username, "rights",
+ 0);
+ }
+}
+
/** @brief Called occasionally */
static gboolean periodic_slow(gpointer attribute((unused)) data) {
D(("periodic_slow"));
}
}
/* Periodically check what our rights are */
- if(!rights_lookup_in_flight) {
- rights_lookup_in_flight = 1;
- disorder_eclient_userinfo(client,
- userinfo_rights_completed,
- config->username, "rights",
- 0);
- }
+ int recheck_rights = 1;
+ if(server_version_bytes >= 0x04010000)
+ /* Server versions after 4.1 will send updates */
+ recheck_rights = 0;
+ if((server_version_bytes & 0xFF) == 0x01)
+ /* Development servers might do regardless of their version number */
+ recheck_rights = 0;
+ if(recheck_rights)
+ check_rights();
return TRUE;
}
exit(0);
}
+static void version_completed(void attribute((unused)) *v,
+ const char attribute((unused)) *err,
+ const char *version) {
+ long major, minor, patch, dev;
+
+ if(!version) {
+ server_version = 0;
+ server_version_bytes = 0;
+ return;
+ }
+ server_version = version;
+ server_version_bytes = 0;
+ major = strtol(version, (char **)&version, 10);
+ if(*version != '.')
+ return;
+ ++version;
+ minor = strtol(version, (char **)&version, 10);
+ if(*version == '.') {
+ ++version;
+ patch = strtol(version, (char **)&version, 10);
+ } else
+ patch = 0;
+ if(*version) {
+ if(*version == '+') {
+ dev = 1;
+ ++version;
+ }
+ if(*version)
+ dev = 2;
+ } else
+ dev = 0;
+ server_version_bytes = (major << 24) + (minor << 16) + (patch << 8) + dev;
+}
+
void logged_in(void) {
/* reset the clients */
disorder_eclient_close(client);
/* Force the periodic checks */
periodic_slow(0);
periodic_fast(0);
+ /* Recheck server version */
+ disorder_eclient_version(client, version_completed, 0);
}
int main(int argc, char **argv) {
disorder_eclient_log(logclient, &log_callbacks, 0);
/* Initiate all the checks */
periodic_fast(0);
+ disorder_eclient_version(client, version_completed, 0);
event_register("log-connected", check_rtp_address, 0);
suppress_actions = 0;
/* If no password is set yet pop up a login box */
static void log_state(void *v, unsigned long state);
static void log_volume(void *v, int l, int r);
static void log_rescanned(void *v);
+static void log_rights_changed(void *v, rights_type r);
/** @brief Callbacks for server state monitoring */
const disorder_eclient_log_callbacks log_callbacks = {
.scratched = log_scratched,
.state = log_state,
.volume = log_volume,
- .rescanned = log_rescanned
+ .rescanned = log_rescanned,
+ .rights_changed = log_rights_changed
};
/** @brief Update everything */
event_raise("rescan-complete", 0);
}
+/** @brief Called when our rights change */
+static void log_rights_changed(void attribute((unused)) *v,
+ rights_type new_rights) {
+ ++suppress_actions;
+ last_rights = new_rights;
+ event_raise("rights-changed", 0);
+ --suppress_actions;
+}
+
/*
Local Variables:
c-basic-offset:2