summaryrefslogtreecommitdiffstats
path: root/src/polyp
diff options
context:
space:
mode:
authorPierre Ossman <ossman@cendio.se>2006-03-02 21:56:15 +0000
committerPierre Ossman <ossman@cendio.se>2006-03-02 21:56:15 +0000
commitbc97b29447bf5c9932ceccb665fa57dd7f654b36 (patch)
treef190713863f976e8e05cb9ee2b41cbaa8b433e71 /src/polyp
parentfbaaf5acb7b391c605585971dac2b417b55f1100 (diff)
Negotiate protocol version between server and client. Will allow smoother
protocol modifications in the future. git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@621 fefdeb5f-60dc-0310-8127-8f9354f1896f
Diffstat (limited to 'src/polyp')
-rw-r--r--src/polyp/context.c25
-rw-r--r--src/polyp/context.h6
-rw-r--r--src/polyp/def.h1
-rw-r--r--src/polyp/error.c1
-rw-r--r--src/polyp/internal.h1
-rw-r--r--src/polyp/version.h.in4
6 files changed, 38 insertions, 0 deletions
diff --git a/src/polyp/context.c b/src/polyp/context.c
index 59079cb0..845e88d9 100644
--- a/src/polyp/context.c
+++ b/src/polyp/context.c
@@ -354,6 +354,19 @@ static void setup_complete_callback(pa_pdispatch *pd, uint32_t command, uint32_t
switch(c->state) {
case PA_CONTEXT_AUTHORIZING: {
pa_tagstruct *reply;
+
+ if (pa_tagstruct_getu32(t, &c->version) < 0 ||
+ !pa_tagstruct_eof(t)) {
+ pa_context_fail(c, PA_ERR_PROTOCOL);
+ goto finish;
+ }
+
+ /* Minimum supported version */
+ if (c->version < 8) {
+ pa_context_fail(c, PA_ERR_VERSION);
+ goto finish;
+ }
+
reply = pa_tagstruct_command(c, PA_COMMAND_SET_CLIENT_NAME, &tag);
pa_tagstruct_puts(reply, c->name);
pa_pstream_send_tagstruct(c->pstream, reply);
@@ -400,6 +413,7 @@ static void setup_context(pa_context *c, pa_iochannel *io) {
}
t = pa_tagstruct_command(c, PA_COMMAND_AUTH, &tag);
+ pa_tagstruct_putu32(t, PA_PROTOCOL_VERSION);
pa_tagstruct_put_arbitrary(t, c->conf->cookie, sizeof(c->conf->cookie));
pa_pstream_send_tagstruct_with_creds(c->pstream, t, 1);
pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, setup_complete_callback, c);
@@ -936,6 +950,17 @@ const char* pa_context_get_server(pa_context *c) {
return c->server;
}
+uint32_t pa_context_get_protocol_version(pa_context *c) {
+ return PA_PROTOCOL_VERSION;
+}
+
+uint32_t pa_context_get_server_protocol_version(pa_context *c) {
+ assert(c);
+ assert(c->ref >= 1);
+
+ return c->version;
+}
+
pa_tagstruct *pa_tagstruct_command(pa_context *c, uint32_t command, uint32_t *tag) {
pa_tagstruct *t;
diff --git a/src/polyp/context.h b/src/polyp/context.h
index 73bcb698..89febe92 100644
--- a/src/polyp/context.h
+++ b/src/polyp/context.h
@@ -115,6 +115,12 @@ pa_operation* pa_context_set_name(pa_context *c, const char *name, pa_context_su
/** Return the server name this context is connected to. \since 0.7 */
const char* pa_context_get_server(pa_context *c);
+/** Return the protocol version of the library. \since 0.8 */
+uint32_t pa_context_get_protocol_version(pa_context *c);
+
+/** Return the protocol version of the connected server. \since 0.8 */
+uint32_t pa_context_get_server_protocol_version(pa_context *c);
+
PA_C_DECL_END
#endif
diff --git a/src/polyp/def.h b/src/polyp/def.h
index 426a0c9b..98420bc0 100644
--- a/src/polyp/def.h
+++ b/src/polyp/def.h
@@ -125,6 +125,7 @@ enum {
PA_ERR_MODINITFAILED, /**< Module initialization failed */
PA_ERR_BADSTATE, /**< Bad state */
PA_ERR_NODATA, /**< No data */
+ PA_ERR_VERSION, /**< Incompatible protocol version \since 0.8 */
PA_ERR_MAX /**< Not really an error but the first invalid error code */
};
diff --git a/src/polyp/error.c b/src/polyp/error.c
index eff37cc8..3f3e637f 100644
--- a/src/polyp/error.c
+++ b/src/polyp/error.c
@@ -48,6 +48,7 @@ static const char* const errortab[PA_ERR_MAX] = {
[PA_ERR_MODINITFAILED] = "Module initalization failed",
[PA_ERR_BADSTATE] = "Bad state",
[PA_ERR_NODATA] = "No data",
+ [PA_ERR_VERSION] = "Incompatible protocol version",
};
const char*pa_strerror(int error) {
diff --git a/src/polyp/internal.h b/src/polyp/internal.h
index 1443f7a8..82d8f7ce 100644
--- a/src/polyp/internal.h
+++ b/src/polyp/internal.h
@@ -57,6 +57,7 @@ struct pa_context {
PA_LLIST_HEAD(pa_stream, streams);
PA_LLIST_HEAD(pa_operation, operations);
+ uint32_t version;
uint32_t ctag;
uint32_t csyncid;
uint32_t error;
diff --git a/src/polyp/version.h.in b/src/polyp/version.h.in
index 67b7495b..de7b9c1c 100644
--- a/src/polyp/version.h.in
+++ b/src/polyp/version.h.in
@@ -44,6 +44,10 @@ const char* pa_get_library_version(void);
* PA_API_VERSION undefined. */
#define PA_API_VERSION @PA_API_VERSION@
+/** The current protocol version. Version 8 relates to polypaudio 0.8.
+ * \since 0.8 */
+#define PA_PROTOCOL_VERSION @PA_PROTOCOL_VERSION@
+
PA_C_DECL_END
#endif