aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJanos Kovacs <janos.f.kovacs@nokia.com>2010-01-14 00:09:18 +0200
committerJanos Kovacs <janos.f.kovacs@nokia.com>2010-01-14 00:09:18 +0200
commit173e3c88d8a1537f2a8f206477ebde1c0b6a0e36 (patch)
tree1c8dd9e20d99d7372b0e2dc3beb4898d59820241 /src
parentc12c6cc33e520fe1e233dfe1cc0ec21913b58b06 (diff)
support for 'audio' message (for classification rules of PA audio streams)
Diffstat (limited to 'src')
-rw-r--r--src/dbus-msg.c64
-rw-r--r--src/dbus-proto.c3
-rw-r--r--src/dbus-proto.h1
-rw-r--r--src/res-conn.c2
-rw-r--r--src/res-msg.c62
-rw-r--r--src/res-msg.h27
-rw-r--r--src/res-set.h2
7 files changed, 129 insertions, 32 deletions
diff --git a/src/dbus-msg.c b/src/dbus-msg.c
index 273db63..3cfa657 100644
--- a/src/dbus-msg.c
+++ b/src/dbus-msg.c
@@ -10,13 +10,15 @@ DBusMessage *resmsg_dbus_compose_message(const char *dest,
const char *method,
resmsg_t *resmsg)
{
- static char *empty_str = "";
-
- DBusMessage *dbusmsg = NULL;
- resmsg_record_t *record;
- resmsg_possess_t *possess;
- resmsg_notify_t *notify;
- int success;
+ static char *empty_str = "";
+
+ DBusMessage *dbusmsg = NULL;
+ resmsg_record_t *record;
+ resmsg_possess_t *possess;
+ resmsg_notify_t *notify;
+ resmsg_audio_t *audio;
+ resmsg_property_t *property;
+ int success;
if (!dest || !path || !interface || !method || !resmsg)
goto compose_error;
@@ -70,6 +72,22 @@ DBusMessage *resmsg_dbus_compose_message(const char *dest,
DBUS_TYPE_UINT32, &notify->resrc,
DBUS_TYPE_INVALID);
break;
+
+ case RESMSG_AUDIO:
+ audio = &resmsg->audio;
+ property = &audio->property;
+ success = dbus_message_append_args(dbusmsg,
+ DBUS_TYPE_INT32 , &audio->type,
+ DBUS_TYPE_UINT32, &audio->id,
+ DBUS_TYPE_UINT32, &audio->reqno,
+ DBUS_TYPE_UINT32, &audio->pid,
+ DBUS_TYPE_STRING, property->name ?
+ &property->name : &empty_str,
+ DBUS_TYPE_INT32 , &property->match.method,
+ DBUS_TYPE_STRING, property->match.pattern ?
+ &property->match.pattern : &empty_str,
+ DBUS_TYPE_INVALID);
+ break;
}
if (!success)
@@ -116,13 +134,16 @@ DBusMessage *resmsg_dbus_reply_message(DBusMessage *dbusmsg,resmsg_t *resreply)
resmsg_t *resmsg_dbus_parse_message(DBusMessage *dbusmsg, resmsg_t *resmsg)
{
- int32_t type;
- resmsg_record_t *record;
- resmsg_possess_t *possess;
- resmsg_notify_t *notify;
- resmsg_status_t *status;
- int free_resmsg;
- int success;
+ int32_t type;
+ resmsg_record_t *record;
+ resmsg_possess_t *possess;
+ resmsg_notify_t *notify;
+ resmsg_audio_t *audio;
+ resmsg_status_t *status;
+ resmsg_property_t *property;
+ resmsg_match_t *match;
+ int free_resmsg;
+ int success;
if (dbusmsg == NULL) {
free_resmsg = FALSE;
@@ -204,6 +225,21 @@ resmsg_t *resmsg_dbus_parse_message(DBusMessage *dbusmsg, resmsg_t *resmsg)
DBUS_TYPE_INVALID);
break;
+ case RESMSG_AUDIO:
+ audio = &resmsg->audio;
+ property = &audio->property;
+ match = &property->match;
+ success = dbus_message_get_args(dbusmsg, NULL,
+ DBUS_TYPE_INT32 , &audio->type,
+ DBUS_TYPE_UINT32, &audio->id,
+ DBUS_TYPE_UINT32, &audio->reqno,
+ DBUS_TYPE_UINT32, &audio->pid,
+ DBUS_TYPE_STRING, &property->name,
+ DBUS_TYPE_INT32 , &match->method,
+ DBUS_TYPE_STRING, &match->pattern,
+ DBUS_TYPE_INVALID);
+ break;
+
case RESMSG_STATUS:
status = &resmsg->status;
success = dbus_message_get_args(dbusmsg, NULL,
diff --git a/src/dbus-proto.c b/src/dbus-proto.c
index f3dd6f7..0201a0c 100644
--- a/src/dbus-proto.c
+++ b/src/dbus-proto.c
@@ -666,7 +666,8 @@ static char *method_name(resmsg_type_t msg_type)
[ RESMSG_ACQUIRE ] = RESPROTO_DBUS_ACQUIRE_METHOD,
[ RESMSG_RELEASE ] = RESPROTO_DBUS_RELEASE_METHOD,
[ RESMSG_GRANT ] = RESPROTO_DBUS_GRANT_METHOD,
- [ RESMSG_ADVICE ] = RESPROTO_DBUS_ADVICE_METHOD
+ [ RESMSG_ADVICE ] = RESPROTO_DBUS_ADVICE_METHOD,
+ [ RESMSG_AUDIO ] = RESPROTO_DBUS_AUDIO_METHOD
};
char *retval = NULL;
diff --git a/src/dbus-proto.h b/src/dbus-proto.h
index a466ead..5d45baa 100644
--- a/src/dbus-proto.h
+++ b/src/dbus-proto.h
@@ -27,6 +27,7 @@
#define RESPROTO_DBUS_RELEASE_METHOD "release"
#define RESPROTO_DBUS_GRANT_METHOD "grant"
#define RESPROTO_DBUS_ADVICE_METHOD "advice"
+#define RESPROTO_DBUS_AUDIO_METHOD "audio"
int resproto_dbus_manager_init(resconn_dbus_t *, va_list);
int resproto_dbus_client_init(resconn_dbus_t *, va_list);
diff --git a/src/res-conn.c b/src/res-conn.c
index 15f3a38..8a0aaaa 100644
--- a/src/res-conn.c
+++ b/src/res-conn.c
@@ -21,6 +21,7 @@ static int manager_valid_message[RESMSG_MAX] = {
[RESMSG_RELEASE ] = VALID ,
[RESMSG_GRANT ] = INVALID ,
[RESMSG_ADVICE ] = INVALID ,
+ [RESMSG_AUDIO ] = VALID ,
};
static int client_valid_message[RESMSG_MAX] = {
[RESMSG_REGISTER ] = INVALID ,
@@ -30,6 +31,7 @@ static int client_valid_message[RESMSG_MAX] = {
[RESMSG_RELEASE ] = INVALID ,
[RESMSG_GRANT ] = VALID ,
[RESMSG_ADVICE ] = VALID ,
+ [RESMSG_AUDIO ] = INVALID ,
};
#undef INVALID
diff --git a/src/res-msg.c b/src/res-msg.c
index d4280d2..8fa283e 100644
--- a/src/res-msg.c
+++ b/src/res-msg.c
@@ -29,11 +29,14 @@ EXPORT char *resmsg_dump_message(resmsg_t *resmsg,
char *p;
char r[512];
char m[512];
- resmsg_rset_t *rset;
- resmsg_record_t *record;
- resmsg_possess_t *possess;
- resmsg_notify_t *notify;
- resmsg_status_t *status;
+ resmsg_rset_t *rset;
+ resmsg_record_t *record;
+ resmsg_possess_t *possess;
+ resmsg_notify_t *notify;
+ resmsg_audio_t *audio;
+ resmsg_status_t *status;
+ resmsg_property_t *property;
+ resmsg_match_t *match;
if (!buf || len < 1 || indent < 0)
return "";
@@ -43,9 +46,9 @@ EXPORT char *resmsg_dump_message(resmsg_t *resmsg,
memset(spaces, ' ', sizeof(spaces));
spaces[indent < sizeof(spaces) ? indent : sizeof(spaces)-1] = '\0';
- PRINT("type : %s (%d)", resmsg_type_str(resmsg->type), resmsg->type);
- PRINT("id : %u" , resmsg->any.id);
- PRINT("reqno : %u" , resmsg->any.reqno);
+ PRINT("type : %s (%d)", resmsg_type_str(resmsg->type),resmsg->type);
+ PRINT("id : %u" , resmsg->any.id);
+ PRINT("reqno : %u" , resmsg->any.reqno);
switch (resmsg->type) {
@@ -53,13 +56,13 @@ EXPORT char *resmsg_dump_message(resmsg_t *resmsg,
case RESMSG_UPDATE:
record = &resmsg->record;
rset = &record->rset;
- PRINT("rset.all : %s" , resmsg_res_str(rset->all , r, sizeof(r)));
- PRINT("rset.opt : %s" , resmsg_res_str(rset->opt , r, sizeof(r)));
- PRINT("rset.share: %s" , resmsg_res_str(rset->share, r, sizeof(r)));
- PRINT("rset.mask : %s" , resmsg_res_str(rset->mask , r, sizeof(r)));
- PRINT("class : '%s'", record->class && record->class[0] ?
- record->class : "<unknown>");
- PRINT("mode : %s" , resmsg_mod_str(record->mode, m, sizeof(m)));
+ PRINT("rset.all : %s" , resmsg_res_str(rset->all , r, sizeof(r)));
+ PRINT("rset.opt : %s" , resmsg_res_str(rset->opt , r, sizeof(r)));
+ PRINT("rset.share : %s" , resmsg_res_str(rset->share, r, sizeof(r)));
+ PRINT("rset.mask : %s" , resmsg_res_str(rset->mask , r, sizeof(r)));
+ PRINT("class : '%s'", record->class && record->class[0] ?
+ record->class : "<unknown>");
+ PRINT("mode : %s" , resmsg_mod_str(record->mode, m, sizeof(m)));
break;
case RESMSG_UNREGISTER:
@@ -71,7 +74,19 @@ EXPORT char *resmsg_dump_message(resmsg_t *resmsg,
case RESMSG_GRANT:
case RESMSG_ADVICE:
notify = &resmsg->notify;
- PRINT("resrc : %s", resmsg_res_str(notify->resrc, r, sizeof(r)));
+ PRINT("resrc : %s", resmsg_res_str(notify->resrc, r, sizeof(r)));
+ break;
+
+ case RESMSG_AUDIO:
+ audio = &resmsg->audio;
+ property = &audio->property;
+ match = &property->match;
+ PRINT("pid : %u", audio->pid);
+ PRINT("property :");
+ PRINT(" name : '%s'", property->name);
+ PRINT(" match :");
+ PRINT(" method : %s", resmsg_match_method_str(match->method));
+ PRINT(" pattern: '%s'", match->pattern);
break;
case RESMSG_STATUS:
@@ -105,6 +120,7 @@ EXPORT char *resmsg_type_str(resmsg_type_t type)
case RESMSG_RELEASE: str = "releaase"; break;
case RESMSG_GRANT: str = "grant"; break;
case RESMSG_ADVICE: str = "advice"; break;
+ case RESMSG_AUDIO: str = "audio"; break;
case RESMSG_STATUS: str = "status"; break;
default: str = "<unknown type>"; break;
}
@@ -192,6 +208,20 @@ EXPORT char *resmsg_res_str(uint32_t res, char *buf, int len)
return buf;
}
+EXPORT char *resmsg_match_method_str(resmsg_match_method_t method)
+{
+ char *str;
+
+ switch (method) {
+ case resmsg_method_equals: str = "equals"; break;
+ case resmsg_method_startswith: str = "startswith"; break;
+ case resmsg_method_matches: str = "matches"; break;
+ default: str = "<unknown>"; break;
+ }
+
+ return str;
+}
+
static char *flag_str(uint32_t flag)
{
char *str;
diff --git a/src/res-msg.h b/src/res-msg.h
index e03b50e..8796f4c 100644
--- a/src/res-msg.h
+++ b/src/res-msg.h
@@ -18,7 +18,7 @@ extern "C" {
#define RESMSG_MODE_AUTO_RELEASE RESMSG_BIT(0)
-typedef enum {
+typedef enum resmsg_type_e {
RESMSG_INVALID = -1,
RESMSG_REGISTER,
@@ -28,6 +28,7 @@ typedef enum {
RESMSG_RELEASE,
RESMSG_GRANT,
RESMSG_ADVICE,
+ RESMSG_AUDIO,
RESMSG_MAX,
@@ -42,6 +43,22 @@ typedef struct {
uint32_t mask; /* shereable resource mask (subset of all) */
} resmsg_rset_t;
+typedef enum {
+ resmsg_method_equals = 0,
+ resmsg_method_startswith,
+ resmsg_method_matches
+} resmsg_match_method_t;
+
+typedef struct {
+ resmsg_match_method_t method;
+ char *pattern;
+} resmsg_match_t;
+
+typedef struct {
+ char *name;
+ resmsg_match_t match;
+} resmsg_property_t;
+
#define RESMSG_COMMON \
resmsg_type_t type; /* RESMSG_xxxx */ \
uint32_t id; /* resourse set ID */ \
@@ -68,6 +85,12 @@ typedef struct {
} resmsg_notify_t;
typedef struct {
+ RESMSG_COMMON; /* RESMSG_AUDIO */
+ uint32_t pid; /* PID of the streaming app, if any */
+ resmsg_property_t property; /* audio stream property */
+} resmsg_audio_t;
+
+typedef struct {
RESMSG_COMMON; /* RESMSG_STATUS */
int32_t errcod; /* error code, if any */
const char *errmsg; /* error message, if any */
@@ -80,6 +103,7 @@ typedef union resmsg_u {
resmsg_record_t record;
resmsg_possess_t possess;
resmsg_notify_t notify;
+ resmsg_audio_t audio;
resmsg_status_t status;
} resmsg_t;
@@ -88,6 +112,7 @@ char *resmsg_dump_message(resmsg_t *, int, char *, int);
char *resmsg_type_str(resmsg_type_t);
char *resmsg_res_str(uint32_t, char *, int);
char *resmsg_mod_str(uint32_t, char *, int);
+char *resmsg_match_method_str(resmsg_match_method_t);
#ifdef __cplusplus
diff --git a/src/res-set.h b/src/res-set.h
index 72ba600..9021a4f 100644
--- a/src/res-set.h
+++ b/src/res-set.h
@@ -10,6 +10,7 @@ extern "C" {
union resconn_u;
+union resspec_u;
typedef enum {
RESPROTO_RSET_STATE_CREATED = 0,
@@ -32,6 +33,7 @@ typedef struct resset_s {
uint32_t share;
uint32_t mask;
} flags;
+ union resspec *specs;
void *userdata;
} resset_t;