Michal Labedzki | 27 Jun 2012 15:27
Favicon
Gravatar

[PATCH v2 01/14] AVRCP: Update constants

Change all specification constants to enum type.
Also add constants for addressed player feature.
---
 audio/avrcp.c |  151 ++++++++++++++++++++++++++++++++-------------------------
 audio/avrcp.h |  107 ++++++++++++++++++++++------------------
 audio/media.c |    2 +-
 3 files changed, 146 insertions(+), 114 deletions(-)

diff --git a/audio/avrcp.c b/audio/avrcp.c
index 89ee112..da102b2 100644
--- a/audio/avrcp.c
+++ b/audio/avrcp.c
 <at>  <at>  -58,56 +58,73  <at>  <at> 
 #include "sdpd.h"
 #include "dbus-common.h"

-/* Company IDs for vendor dependent commands */
-#define IEEEID_BTSIG		0x001958
-
-/* Error codes for metadata transfer */
-#define E_INVALID_COMMAND	0x00
-#define E_INVALID_PARAM		0x01
-#define E_PARAM_NOT_FOUND	0x02
-#define E_INTERNAL		0x03
-
-/* Packet types */
-#define AVRCP_PACKET_TYPE_SINGLE	0x00
-#define AVRCP_PACKET_TYPE_START		0x01
-#define AVRCP_PACKET_TYPE_CONTINUING	0x02
-#define AVRCP_PACKET_TYPE_END		0x03
(Continue reading)

Michal Labedzki | 27 Jun 2012 15:27
Favicon
Gravatar

[PATCH v2 02/14] doc: Fix typo

This patch fix simple typo in documentation of API.
---
 doc/adapter-api.txt   |    2 +-
 doc/audio-api.txt     |    2 +-
 doc/device-api.txt    |    2 +-
 doc/media-api.txt     |    2 +-
 doc/proximity-api.txt |    2 +-
 5 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/doc/adapter-api.txt b/doc/adapter-api.txt
index dccb6bf..916e941 100644
--- a/doc/adapter-api.txt
+++ b/doc/adapter-api.txt
 <at>  <at>  -24,7 +24,7  <at>  <at>  Methods		dict GetProperties()
 		void SetProperty(string name, variant value)

 			Changes the value of the specified property. Only
-			properties that are listed a read-write are changeable.
+			properties that are listed as read-write are changeable.
 			On success this will emit a PropertyChanged signal.

 			Possible Errors: org.bluez.Error.InvalidArguments
diff --git a/doc/audio-api.txt b/doc/audio-api.txt
index 02291fd..9b1737d 100644
--- a/doc/audio-api.txt
+++ b/doc/audio-api.txt
 <at>  <at>  -122,7 +122,7  <at>  <at>  Methods		void Connect()
 		void SetProperty(string name, variant value)

 			Changes the value of the specified property. Only
(Continue reading)

Michal Labedzki | 27 Jun 2012 15:27
Favicon
Gravatar

[PATCH v2 03/14] media: Rename set_property to set_player_property

This is to avoid conflicts with DBus interface convention
used in BlueZ.
---
 audio/media.c |    6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/audio/media.c b/audio/media.c
index 4e23273..cc8ac37 100644
--- a/audio/media.c
+++ b/audio/media.c
 <at>  <at>  -1454,7 +1454,7  <at>  <at>  static gboolean set_position(struct media_player *mp, DBusMessageIter *iter)
 	return TRUE;
 }

-static gboolean set_property(struct media_player *mp, const char *key,
+static gboolean set_player_property(struct media_player *mp, const char *key,
 							DBusMessageIter *entry)
 {
 	DBusMessageIter var;
 <at>  <at>  -1515,7 +1515,7  <at>  <at>  static gboolean property_changed(DBusConnection *connection, DBusMessage *msg,

 	dbus_message_iter_next(&iter);

-	set_property(mp, property, &iter);
+	set_player_property(mp, property, &iter);

 	return TRUE;
 }
 <at>  <at>  -1747,7 +1747,7  <at>  <at>  static gboolean parse_player_properties(struct media_player *mp,
 		dbus_message_iter_get_basic(&entry, &key);
(Continue reading)

Michal Labedzki | 27 Jun 2012 15:27
Favicon
Gravatar

[PATCH v2 04/14] AVRCP: Use name "addressed" instead of "active"

AVRCP 1.4 named currently controlled player as "addressed", so use
this name instead of "active". In future there where be more "browsing"
player that will be active, but not addressed.
---
 audio/avrcp.c |   12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/audio/avrcp.c b/audio/avrcp.c
index da102b2..adcf30d 100644
--- a/audio/avrcp.c
+++ b/audio/avrcp.c
 <at>  <at>  -163,7 +163,7  <at>  <at>  struct avrcp_server {
 	uint32_t tg_record_id;
 	uint32_t ct_record_id;
 	GSList *players;
-	struct avrcp_player *active_player;
+	struct avrcp_player *addressed_player;
 };

 struct pending_pdu {
 <at>  <at>  -1217,7 +1217,7  <at>  <at>  static void state_changed(struct audio_device *dev, avctp_state_t old_state,
 	if (!server)
 		return;

-	player = server->active_player;
+	player = server->addressed_player;
 	if (!player)
 		return;

 <at>  <at>  -1410,7 +1410,7  <at>  <at>  struct avrcp_player *avrcp_register_player(const bdaddr_t *src,
(Continue reading)

Michal Labedzki | 27 Jun 2012 15:27
Favicon
Gravatar

[PATCH v2 05/14] AVRCP: Convert spaces to tabs

Fix coding style issue.
---
 audio/avrcp.c |   16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/audio/avrcp.c b/audio/avrcp.c
index adcf30d..64f6086 100644
--- a/audio/avrcp.c
+++ b/audio/avrcp.c
 <at>  <at>  -1134,17 +1134,17  <at>  <at>  err_metadata:

 size_t avrcp_handle_vendor_reject(uint8_t *code, uint8_t *operands)
 {
-    struct avrcp_header *pdu = (void *) operands;
-    uint32_t company_id = get_company_id(pdu->company_id);
+	struct avrcp_header *pdu = (void *) operands;
+	uint32_t company_id = get_company_id(pdu->company_id);

-    *code = AVC_CTYPE_REJECTED;
-    pdu->params_len = htons(1);
-    pdu->params[0] = STATUS_INTERNAL_ERROR;
+	*code = AVC_CTYPE_REJECTED;
+	pdu->params_len = htons(1);
+	pdu->params[0] = STATUS_INTERNAL_ERROR;

-    DBG("rejecting AVRCP PDU 0x%02X, company 0x%06X len 0x%04X",
-            pdu->pdu_id, company_id, pdu->params_len);
+	DBG("rejecting AVRCP PDU 0x%02X, company 0x%06X len 0x%04X",
+		pdu->pdu_id, company_id, pdu->params_len);

(Continue reading)

Michal Labedzki | 27 Jun 2012 15:27
Favicon
Gravatar

[PATCH v2 06/14] AVRCP: Keep AVRCP version of connected device in session

This can be used to improve compatibility between
AVRCP 1.3 vs AVRCP 1.4 devices and implementation in stack.
---
 audio/avrcp.c |   42 ++++++++++++++++++++++++++++++++----------
 1 file changed, 32 insertions(+), 10 deletions(-)

diff --git a/audio/avrcp.c b/audio/avrcp.c
index 64f6086..4e3b641 100644
--- a/audio/avrcp.c
+++ b/audio/avrcp.c
 <at>  <at>  -158,12 +158,18  <at>  <at>  struct avrcp_header {
 #define AVRCP_MTU	(AVC_MTU - AVC_HEADER_LENGTH)
 #define AVRCP_PDU_MTU	(AVRCP_MTU - AVRCP_HEADER_LENGTH)

+struct avrcp_session {
+	uint16_t version_tg;
+	uint16_t version_ct;
+};
+
 struct avrcp_server {
 	bdaddr_t src;
 	uint32_t tg_record_id;
 	uint32_t ct_record_id;
 	GSList *players;
 	struct avrcp_player *addressed_player;
+	struct avrcp_session session;
 };

 struct pending_pdu {
 <at>  <at>  -1209,7 +1215,7  <at>  <at>  static void state_changed(struct audio_device *dev, avctp_state_t old_state,
(Continue reading)

Michal Labedzki | 27 Jun 2012 15:27
Favicon
Gravatar

[PATCH v2 07/14] AVRCP: Move profile specific fields from players

Transactions, events and fragmentation are not specified to
every player. Those fields are specific to profile, so
move them to new AVRCP session structure.
---
 audio/avrcp.c |   83 ++++++++++++++++++++++++++++++++-------------------------
 audio/avrcp.h |    5 +++-
 audio/media.c |   10 +++----
 3 files changed, 56 insertions(+), 42 deletions(-)

diff --git a/audio/avrcp.c b/audio/avrcp.c
index 4e3b641..430f216 100644
--- a/audio/avrcp.c
+++ b/audio/avrcp.c
 <at>  <at>  -159,8 +159,12  <at>  <at>  struct avrcp_header {
 #define AVRCP_PDU_MTU	(AVRCP_MTU - AVRCP_HEADER_LENGTH)

 struct avrcp_session {
+	struct avctp *avctp_session;
 	uint16_t version_tg;
 	uint16_t version_ct;
+	uint16_t registered_events;
+	uint8_t transaction[16];
+	struct pending_pdu *pending_pdu;
 };

 struct avrcp_server {
 <at>  <at>  -180,14 +184,8  <at>  <at>  struct pending_pdu {

 struct avrcp_player {
 	struct avrcp_server *server;
(Continue reading)

Michal Labedzki | 27 Jun 2012 15:27
Favicon
Gravatar

[PATCH v2 08/14] AVRCP: Register AVRCP before MEDIA interface

Register AVRCP before MEDIA interface to avoid searching for or
accessing non-existent AVRCP server.
---
 audio/manager.c |    6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/audio/manager.c b/audio/manager.c
index d442d1d..076346a 100644
--- a/audio/manager.c
+++ b/audio/manager.c
 <at>  <at>  -1238,6 +1238,9  <at>  <at>  proceed:
 	if (enabled.socket)
 		unix_init();

+	if (enabled.control)
+		btd_register_adapter_driver(&avrcp_server_driver);
+
 	if (enabled.media)
 		btd_register_adapter_driver(&media_server_driver);

 <at>  <at>  -1250,9 +1253,6  <at>  <at>  proceed:
 	if (enabled.source || enabled.sink)
 		btd_register_adapter_driver(&a2dp_server_driver);

-	if (enabled.control)
-		btd_register_adapter_driver(&avrcp_server_driver);
-
 	btd_register_device_driver(&audio_driver);

 	*enable_sco = (enabled.gateway || enabled.headset);
(Continue reading)

Michal Labedzki | 27 Jun 2012 15:27
Favicon
Gravatar

[PATCH v2 09/14] AVRCP: Implement notification AVAILABLE_PLAYERS_CHANGED

Notify remote controller about change in available players
when player is being registered or unregistered.
---
 audio/avrcp.c |    5 ++++-
 audio/media.c |    3 +++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/audio/avrcp.c b/audio/avrcp.c
index 430f216..d011b2e 100644
--- a/audio/avrcp.c
+++ b/audio/avrcp.c
 <at>  <at>  -429,6 +429,7  <at>  <at>  int avrcp_event(struct avrcp_session *session, uint8_t id, void *data)
 		break;
 	case AVRCP_EVENT_TRACK_REACHED_END:
 	case AVRCP_EVENT_TRACK_REACHED_START:
+	case AVRCP_EVENT_AVAILABLE_PLAYERS_CHANGED:
 		size = 1;
 		break;
 	default:
 <at>  <at>  -600,11 +601,12  <at>  <at>  static uint8_t avrcp_handle_get_capabilities(struct avrcp_player *player,

 		return AVC_CTYPE_STABLE;
 	case CAP_EVENTS_SUPPORTED:
-		pdu->params[1] = 4;
+		pdu->params[1] = 5;
 		pdu->params[2] = AVRCP_EVENT_PLAYBACK_STATUS_CHANGED;
 		pdu->params[3] = AVRCP_EVENT_TRACK_CHANGED;
 		pdu->params[4] = AVRCP_EVENT_TRACK_REACHED_START;
 		pdu->params[5] = AVRCP_EVENT_TRACK_REACHED_END;
+		pdu->params[6] = AVRCP_EVENT_AVAILABLE_PLAYERS_CHANGED;
(Continue reading)

Michal Labedzki | 27 Jun 2012 15:27
Favicon
Gravatar

[PATCH v2 10/14] media: Add support for changing addressed player

There is possibility to register more than one player. This patch
allows to change currently selected player to one the list of
previously registered players. If there are no any registered players
add Dummy Player for compatibility with AVRCP 1.3 device or
AVRCP 1.4 without MultiplePlayer feature.
---
 audio/media.c |  109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 107 insertions(+), 2 deletions(-)

diff --git a/audio/media.c b/audio/media.c
index f3cca25..ce5822a 100644
--- a/audio/media.c
+++ b/audio/media.c
 <at>  <at>  -54,6 +54,8  <at>  <at> 
 #define MEDIA_ENDPOINT_INTERFACE "org.bluez.MediaEndpoint"
 #define MEDIA_PLAYER_INTERFACE "org.bluez.MediaPlayer"

+#define DUMMY_PLAYER "/dummy"
+
 #define REQUEST_TIMEOUT (3 * 1000)		/* 3 seconds */

 struct media_adapter {
 <at>  <at>  -62,6 +64,7  <at>  <at>  struct media_adapter {
 	DBusConnection		*conn;		/* Adapter connection */
 	GSList			*endpoints;	/* Endpoints list */
 	GSList			*players;	/* Players list */
+	struct media_player	*addressed;	/* Addressed Player */
 };

 struct endpoint_request {
(Continue reading)

Michal Labedzki | 27 Jun 2012 15:27
Favicon
Gravatar

[PATCH v2 11/14] AVRCP: Implement setting AddressedPlayer with notifications completion

For AVRCP 1.4 complete notifications according to the specification
by rejecting all registered notifications with coresponding
transaction id.

For AVRCP 1.3 complete events by reusing already registered events.
This allows to change media player and notify remote controller
about metadata changed.
---
 audio/avrcp.c |   99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 audio/avrcp.h |    1 +
 audio/media.c |    5 +++
 3 files changed, 105 insertions(+)

diff --git a/audio/avrcp.c b/audio/avrcp.c
index d011b2e..baf9de5 100644
--- a/audio/avrcp.c
+++ b/audio/avrcp.c
 <at>  <at>  -58,6 +58,8  <at>  <at> 
 #include "sdpd.h"
 #include "dbus-common.h"

+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+
 #define AVRCP_REGISTER_NOTIFICATION_PARAM_LENGTH 5

 enum company_id {
 <at>  <at>  -191,6 +193,21  <at>  <at>  struct avrcp_player {
 	GDestroyNotify destroy;
 };

(Continue reading)

Michal Labedzki | 27 Jun 2012 15:27
Favicon
Gravatar

[PATCH v2 12/14] AVRCP: Use NoAvailablePlayers status code for AVRCP 1.4 devices

DummyPlayer indicate there is no available players. For AVRCP 1.4
devices use NoAvailblePlayers status code, on the other side, for
AVRCP 1.3 devices use InternalError.
---
 audio/avrcp.c |   57 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
 audio/avrcp.h |    1 +
 audio/media.c |   13 ++++++++++++-
 3 files changed, 66 insertions(+), 5 deletions(-)

diff --git a/audio/avrcp.c b/audio/avrcp.c
index baf9de5..a725142 100644
--- a/audio/avrcp.c
+++ b/audio/avrcp.c
 <at>  <at>  -1159,6 +1159,41  <at>  <at>  err_metadata:
 	return AVRCP_HEADER_LENGTH + 1;
 }

+static size_t handle_dummy_player(struct avctp *session, uint8_t transaction,
+					uint8_t *code, uint8_t *subunit,
+					uint8_t *operands, size_t operand_count,
+					void *user_data)
+{
+	struct avrcp_player *player = user_data;
+	struct avrcp_header *pdu = (void *) operands;
+	uint32_t company_id = get_company_id(pdu->company_id);
+
+	if (player->server->session.version_ct < AVRCP_VERSION_1_4)
+		goto ignoring;
+
+	if (pdu->pdu_id == AVRCP_GET_CAPABILITIES ||
(Continue reading)

Michal Labedzki | 27 Jun 2012 15:27
Favicon
Gravatar

[PATCH v2 13/14] AVRCP: Implement notification ADDRESSED_PLAYER_CHANGED

It is triggered by local change of addressed player on TG while
unregistering currently addressed player.
---
 audio/avrcp.c |   35 ++++++++++++++++++++++++++++++++++-
 audio/avrcp.h |    2 ++
 audio/media.c |   19 ++++++++++++++++++-
 3 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/audio/avrcp.c b/audio/avrcp.c
index a725142..7b2d6e0 100644
--- a/audio/avrcp.c
+++ b/audio/avrcp.c
 <at>  <at>  -208,6 +208,11  <at>  <at>  static const uint8_t events_to_complete[] = {
 	AVRCP_EVENT_NOW_PLAYING_CONTENT_CHANGED
 };

+struct addressed_param {
+	uint16_t player_id;
+	uint16_t uid_counter;
+} __attribute__ ((packed));
+
 static GSList *servers = NULL;
 static unsigned int avctp_id = 0;

 <at>  <at>  -444,6 +449,14  <at>  <at>  int avrcp_event(struct avrcp_session *session, uint8_t id, void *data)
 		memcpy(&pdu->params[1], data, sizeof(uint64_t));

 		break;
+	case AVRCP_EVENT_ADDRESSED_PLAYER_CHANGED:
+		size = 5;
(Continue reading)

Michal Labedzki | 27 Jun 2012 15:27
Favicon
Gravatar

[PATCH v2 14/14] AVRCP: Handle SetAddressedPlayer command from remote controller

Set player selected by controller as addressed player.
---
 audio/avrcp.c |   33 +++++++++++++++++++++++++++++++++
 audio/avrcp.h |    1 +
 audio/media.c |   19 ++++++++++++++++++-
 3 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/audio/avrcp.c b/audio/avrcp.c
index 7b2d6e0..9a1c8e1 100644
--- a/audio/avrcp.c
+++ b/audio/avrcp.c
 <at>  <at>  -1088,6 +1088,37  <at>  <at>  err:
 	return AVC_CTYPE_REJECTED;
 }

+static uint8_t avrcp_handle_set_addressed_player(struct avrcp_player *player,
+							struct avrcp_header *pdu,
+							uint8_t transaction)
+{
+	uint16_t len = ntohs(pdu->params_len);
+	uint16_t player_id;
+
+	if (len != sizeof(player_id)) {
+		pdu->params[0] = STATUS_INVALID_PARAMETER;
+		return AVC_CTYPE_REJECTED;
+	}
+
+	player_id = bt_get_be16(pdu->params);
+
+	DBG("Remote controller set addressed player id=%u", player_id);
(Continue reading)

Luiz Augusto von Dentz | 27 Jun 2012 15:32
Picon

Re: [PATCH v2 01/14] AVRCP: Update constants

Hi Michal,

On Wed, Jun 27, 2012 at 4:27 PM, Michal Labedzki
<michal.labedzki@...> wrote:
> Change all specification constants to enum type.
> Also add constants for addressed player feature.
> ---
>  audio/avrcp.c |  151 ++++++++++++++++++++++++++++++++-------------------------
>  audio/avrcp.h |  107 ++++++++++++++++++++++------------------
>  audio/media.c |    2 +-
>  3 files changed, 146 insertions(+), 114 deletions(-)
>
> diff --git a/audio/avrcp.c b/audio/avrcp.c
> index 89ee112..da102b2 100644
> --- a/audio/avrcp.c
> +++ b/audio/avrcp.c
>  <at>  <at>  -58,56 +58,73  <at>  <at> 
>  #include "sdpd.h"
>  #include "dbus-common.h"
>
> -/* Company IDs for vendor dependent commands */
> -#define IEEEID_BTSIG           0x001958
> -
> -/* Error codes for metadata transfer */
> -#define E_INVALID_COMMAND      0x00
> -#define E_INVALID_PARAM                0x01
> -#define E_PARAM_NOT_FOUND      0x02
> -#define E_INTERNAL             0x03
> -
> -/* Packet types */
(Continue reading)

Michal.Labedzki | 27 Jun 2012 16:25
Favicon

RE: [PATCH v2 01/14] AVRCP: Update constants

Hi Luiz,

> Haven't I nak the changes to enum before? What have you changed in v2?
>
>--
> Luiz Augusto von Dentz

No. According to Lucas I removed unused constants.
What wrong with enum? Look into sap.h, vhci.h, reporter.h, parser.h, cups.h and... avrcp.c ("enum
battery_status" is here)

I have idea to make enum new convention in BlueZ. See sap.h - it looks very clearly for me. Pros for used enum is
that enum can be thread as group of constants, mostly constants defined in specification. But "magic
constants" should stay define - mostly defined by developer. 
Disadvantage for "define" is that as you can see in BlueZ AVRCP - you must use additional comment to describe
group of constants.

Luiz, why "nak"? Could you present your point of view?

Regards / Pozdrawiam
-------------------------------------------------------------------------------------------------------------
Michał Łabędzki
ASCII: Michal Labedzki
e-mail: michal.labedzki@...
office communicator: michal.labedzki@...
location: Poland, Wrocław, Legnicka 55F
room: 315
phone: +48 717 740 340
---
Tieto Corporation / Tieto Poland
(Continue reading)

Lucas De Marchi | 27 Jun 2012 18:22

Re: [PATCH v2 01/14] AVRCP: Update constants

Hi Michal,

On Wed, Jun 27, 2012 at 11:25 AM,  <Michal.Labedzki@...> wrote:
> Hi Luiz,
>
>
>> Haven't I nak the changes to enum before? What have you changed in v2?
>>
>>--
>> Luiz Augusto von Dentz
>
> No. According to Lucas I removed unused constants.
> What wrong with enum? Look into sap.h, vhci.h, reporter.h, parser.h, cups.h and... avrcp.c ("enum
battery_status" is here)

I strongly NACKed this before. Not only because of the unused constants.

>
> I have idea to make enum new convention in BlueZ. See sap.h - it looks very clearly for me. Pros for used enum
is that enum can be thread as group of constants, mostly constants defined in specification. But "magic
constants" should stay define - mostly defined by developer.
> Disadvantage for "define" is that as you can see in BlueZ AVRCP - you must use additional comment to
describe group of constants.

I don't see any advantage in being able to group them. You still have
to define the name by prefixing it with the namespace. If it was
already enum, fine - changing for the sake of change only is not good.

>
> Luiz, why "nak"? Could you present your point of view?
(Continue reading)

Luiz Augusto von Dentz | 28 Jun 2012 12:10
Picon

Re: [PATCH v2 01/14] AVRCP: Update constants

Hi Lucas,

On Wed, Jun 27, 2012 at 7:22 PM, Lucas De Marchi
<lucas.demarchi@...> wrote:
>> No. According to Lucas I removed unused constants.
>> What wrong with enum? Look into sap.h, vhci.h, reporter.h, parser.h, cups.h and... avrcp.c ("enum
battery_status" is here)
>
> I strongly NACKed this before. Not only because of the unused constants.
>
>>
>> I have idea to make enum new convention in BlueZ. See sap.h - it looks very clearly for me. Pros for used enum
is that enum can be thread as group of constants, mostly constants defined in specification. But "magic
constants" should stay define - mostly defined by developer.
>> Disadvantage for "define" is that as you can see in BlueZ AVRCP - you must use additional comment to
describe group of constants.
>
> I don't see any advantage in being able to group them. You still have
> to define the name by prefixing it with the namespace. If it was
> already enum, fine - changing for the sake of change only is not good.
>
>>
>> Luiz, why "nak"? Could you present your point of view?
>
> IMO this change doesn't give us anything

Exactly, enum gives us nothing, no type checking or anything, so why bother.

 <at> Michal: As for the rest of the patches, I will apply the typo and
code style fixes that are straightforward, the rest will probably need
(Continue reading)


Gmane