diff options
author | Janos Kovacs <janos.f.kovacs@nokia.com> | 2010-01-14 00:09:18 +0200 |
---|---|---|
committer | Janos Kovacs <janos.f.kovacs@nokia.com> | 2010-01-14 00:09:18 +0200 |
commit | 173e3c88d8a1537f2a8f206477ebde1c0b6a0e36 (patch) | |
tree | 1c8dd9e20d99d7372b0e2dc3beb4898d59820241 /src | |
parent | c12c6cc33e520fe1e233dfe1cc0ec21913b58b06 (diff) |
support for 'audio' message (for classification rules of PA audio streams)
Diffstat (limited to 'src')
-rw-r--r-- | src/dbus-msg.c | 64 | ||||
-rw-r--r-- | src/dbus-proto.c | 3 | ||||
-rw-r--r-- | src/dbus-proto.h | 1 | ||||
-rw-r--r-- | src/res-conn.c | 2 | ||||
-rw-r--r-- | src/res-msg.c | 62 | ||||
-rw-r--r-- | src/res-msg.h | 27 | ||||
-rw-r--r-- | src/res-set.h | 2 |
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, ¬ify->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; |