Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
mpd
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Иван Мажукин
mpd
Commits
85074f5a
Commit
85074f5a
authored
Jan 10, 2013
by
Max Kellermann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
icy_metadata: convert to C++
parent
12a8ed39
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
85 additions
and
113 deletions
+85
-113
Makefile.am
Makefile.am
+1
-2
IcyMetaDataParser.cxx
src/IcyMetaDataParser.cxx
+42
-51
IcyMetaDataParser.hxx
src/IcyMetaDataParser.hxx
+31
-47
CurlInputPlugin.cxx
src/input/CurlInputPlugin.cxx
+11
-13
No files found.
Makefile.am
View file @
85074f5a
...
@@ -88,7 +88,6 @@ mpd_headers = \
...
@@ -88,7 +88,6 @@ mpd_headers = \
src/despotify_utils.h
\
src/despotify_utils.h
\
src/text_input_stream.h
\
src/text_input_stream.h
\
src/icy_server.h
\
src/icy_server.h
\
src/icy_metadata.h
\
src/server_socket.h
\
src/server_socket.h
\
src/ls.h
\
src/ls.h
\
src/mixer_api.h
\
src/mixer_api.h
\
...
@@ -733,7 +732,7 @@ INPUT_LIBS = \
...
@@ -733,7 +732,7 @@ INPUT_LIBS = \
if
ENABLE_CURL
if
ENABLE_CURL
libinput_a_SOURCES
+=
\
libinput_a_SOURCES
+=
\
src/input/CurlInputPlugin.cxx src/input/CurlInputPlugin.hxx
\
src/input/CurlInputPlugin.cxx src/input/CurlInputPlugin.hxx
\
src/
icy_metadata.c
src/
IcyMetaDataParser.cxx src/IcyMetaDataParser.hxx
endif
endif
if
ENABLE_SOUP
if
ENABLE_SOUP
...
...
src/
icy_metadata.c
→
src/
IcyMetaDataParser.cxx
View file @
85074f5a
/*
/*
* Copyright (C) 2003-201
1
The Music Player Daemon Project
* Copyright (C) 2003-201
3
The Music Player Daemon Project
* http://www.musicpd.org
* http://www.musicpd.org
*
*
* This program is free software; you can redistribute it and/or modify
* This program is free software; you can redistribute it and/or modify
...
@@ -18,7 +18,7 @@
...
@@ -18,7 +18,7 @@
*/
*/
#include "config.h"
#include "config.h"
#include "
icy_metadata.h
"
#include "
IcyMetaDataParser.hxx
"
#include "tag.h"
#include "tag.h"
#include <glib.h>
#include <glib.h>
...
@@ -30,46 +30,37 @@
...
@@ -30,46 +30,37 @@
#define G_LOG_DOMAIN "icy_metadata"
#define G_LOG_DOMAIN "icy_metadata"
void
void
icy_deinit
(
struct
icy_metadata
*
im
)
IcyMetaDataParser
::
Reset
(
)
{
{
if
(
!
icy_defined
(
im
))
if
(
!
IsDefined
(
))
return
;
return
;
if
(
im
->
data_rest
==
0
&&
im
->
meta_size
>
0
)
if
(
data_rest
==
0
&&
meta_size
>
0
)
g_free
(
im
->
meta_data
);
g_free
(
meta_data
);
if
(
im
->
tag
!=
NULL
)
if
(
tag
!=
nullptr
)
tag_free
(
im
->
tag
);
tag_free
(
tag
);
}
void
icy_reset
(
struct
icy_metadata
*
im
)
{
if
(
!
icy_defined
(
im
))
return
;
icy_deinit
(
im
);
im
->
data_rest
=
im
->
data_size
;
data_rest
=
data_size
;
im
->
meta_size
=
0
;
meta_size
=
0
;
}
}
size_t
size_t
icy_data
(
struct
icy_metadata
*
im
,
size_t
length
)
IcyMetaDataParser
::
Data
(
size_t
length
)
{
{
assert
(
length
>
0
);
assert
(
length
>
0
);
if
(
!
icy_defined
(
im
))
if
(
!
IsDefined
(
))
return
length
;
return
length
;
if
(
im
->
data_rest
==
0
)
if
(
data_rest
==
0
)
return
0
;
return
0
;
if
(
length
>=
im
->
data_rest
)
{
if
(
length
>=
data_rest
)
{
length
=
im
->
data_rest
;
length
=
data_rest
;
im
->
data_rest
=
0
;
data_rest
=
0
;
}
else
}
else
im
->
data_rest
-=
length
;
data_rest
-=
length
;
return
length
;
return
length
;
}
}
...
@@ -94,7 +85,7 @@ icy_parse_tag_item(struct tag *tag, const char *item)
...
@@ -94,7 +85,7 @@ icy_parse_tag_item(struct tag *tag, const char *item)
{
{
gchar
**
p
=
g_strsplit
(
item
,
"="
,
0
);
gchar
**
p
=
g_strsplit
(
item
,
"="
,
0
);
if
(
p
[
0
]
!=
NULL
&&
p
[
1
]
!=
NULL
)
{
if
(
p
[
0
]
!=
nullptr
&&
p
[
1
]
!=
nullptr
)
{
if
(
strcmp
(
p
[
0
],
"StreamTitle"
)
==
0
)
if
(
strcmp
(
p
[
0
],
"StreamTitle"
)
==
0
)
icy_add_item
(
tag
,
TAG_TITLE
,
p
[
1
]);
icy_add_item
(
tag
,
TAG_TITLE
,
p
[
1
]);
else
else
...
@@ -110,7 +101,7 @@ icy_parse_tag(const char *p)
...
@@ -110,7 +101,7 @@ icy_parse_tag(const char *p)
struct
tag
*
tag
=
tag_new
();
struct
tag
*
tag
=
tag_new
();
gchar
**
items
=
g_strsplit
(
p
,
";"
,
0
);
gchar
**
items
=
g_strsplit
(
p
,
";"
,
0
);
for
(
unsigned
i
=
0
;
items
[
i
]
!=
NULL
;
++
i
)
for
(
unsigned
i
=
0
;
items
[
i
]
!=
nullptr
;
++
i
)
icy_parse_tag_item
(
tag
,
items
[
i
]);
icy_parse_tag_item
(
tag
,
items
[
i
]);
g_strfreev
(
items
);
g_strfreev
(
items
);
...
@@ -119,21 +110,21 @@ icy_parse_tag(const char *p)
...
@@ -119,21 +110,21 @@ icy_parse_tag(const char *p)
}
}
size_t
size_t
icy_meta
(
struct
icy_metadata
*
im
,
const
void
*
data
,
size_t
length
)
IcyMetaDataParser
::
Meta
(
const
void
*
data
,
size_t
length
)
{
{
const
unsigned
char
*
p
=
data
;
const
unsigned
char
*
p
=
(
const
unsigned
char
*
)
data
;
assert
(
icy_defined
(
im
));
assert
(
IsDefined
(
));
assert
(
im
->
data_rest
==
0
);
assert
(
data_rest
==
0
);
assert
(
length
>
0
);
assert
(
length
>
0
);
if
(
im
->
meta_size
==
0
)
{
if
(
meta_size
==
0
)
{
/* read meta_size from the first byte of a meta
/* read meta_size from the first byte of a meta
block */
block */
im
->
meta_size
=
*
p
++
*
16
;
meta_size
=
*
p
++
*
16
;
if
(
im
->
meta_size
==
0
)
{
if
(
meta_size
==
0
)
{
/* special case: no metadata */
/* special case: no metadata */
im
->
data_rest
=
im
->
data_size
;
data_rest
=
data_size
;
return
1
;
return
1
;
}
}
...
@@ -143,39 +134,39 @@ icy_meta(struct icy_metadata *im, const void *data, size_t length)
...
@@ -143,39 +134,39 @@ icy_meta(struct icy_metadata *im, const void *data, size_t length)
/* initialize metadata reader, allocate enough
/* initialize metadata reader, allocate enough
memory (+1 for the null terminator) */
memory (+1 for the null terminator) */
im
->
meta_position
=
0
;
meta_position
=
0
;
im
->
meta_data
=
g_malloc
(
im
->
meta_size
+
1
);
meta_data
=
(
char
*
)
g_malloc
(
meta_size
+
1
);
}
}
assert
(
im
->
meta_position
<
im
->
meta_size
);
assert
(
meta_position
<
meta_size
);
if
(
length
>
im
->
meta_size
-
im
->
meta_position
)
if
(
length
>
meta_size
-
meta_position
)
length
=
im
->
meta_size
-
im
->
meta_position
;
length
=
meta_size
-
meta_position
;
memcpy
(
im
->
meta_data
+
im
->
meta_position
,
p
,
length
);
memcpy
(
meta_data
+
meta_position
,
p
,
length
);
im
->
meta_position
+=
length
;
meta_position
+=
length
;
if
(
p
!=
data
)
if
(
p
!=
data
)
/* re-add the first byte (which contained meta_size) */
/* re-add the first byte (which contained meta_size) */
++
length
;
++
length
;
if
(
im
->
meta_position
==
im
->
meta_size
)
{
if
(
meta_position
==
meta_size
)
{
/* null-terminate the string */
/* null-terminate the string */
im
->
meta_data
[
im
->
meta_size
]
=
0
;
meta_data
[
meta_size
]
=
0
;
/* parse */
/* parse */
if
(
im
->
tag
!=
NULL
)
if
(
tag
!=
nullptr
)
tag_free
(
im
->
tag
);
tag_free
(
tag
);
im
->
tag
=
icy_parse_tag
(
im
->
meta_data
);
tag
=
icy_parse_tag
(
meta_data
);
g_free
(
im
->
meta_data
);
g_free
(
meta_data
);
/* change back to normal data mode */
/* change back to normal data mode */
im
->
meta_size
=
0
;
meta_size
=
0
;
im
->
data_rest
=
im
->
data_size
;
data_rest
=
data_size
;
}
}
return
length
;
return
length
;
...
...
src/
icy_metadata.h
→
src/
IcyMetaDataParser.hxx
View file @
85074f5a
/*
/*
* Copyright (C) 2003-201
1
The Music Player Daemon Project
* Copyright (C) 2003-201
3
The Music Player Daemon Project
* http://www.musicpd.org
* http://www.musicpd.org
*
*
* This program is free software; you can redistribute it and/or modify
* This program is free software; you can redistribute it and/or modify
...
@@ -17,83 +17,67 @@
...
@@ -17,83 +17,67 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
*/
#ifndef
ICY_METADATA_H
#ifndef
MPD_ICY_META_DATA_PARSER_HXX
#define
ICY_METADATA_H
#define
MPD_ICY_META_DATA_PARSER_HXX
#include <stdbool.h>
#include <stddef.h>
#include <stddef.h>
struct
icy_metadata
{
class
IcyMetaDataParser
{
size_t
data_size
,
data_rest
;
size_t
data_size
,
data_rest
;
size_t
meta_size
,
meta_position
;
size_t
meta_size
,
meta_position
;
char
*
meta_data
;
char
*
meta_data
;
struct
tag
*
tag
;
struct
tag
*
tag
;
};
/**
public
:
* Initialize a disabled icy_metadata object.
IcyMetaDataParser
()
:
data_size
(
0
)
{}
*/
~
IcyMetaDataParser
()
{
static
inline
void
Reset
();
icy_clear
(
struct
icy_metadata
*
im
)
}
{
im
->
data_size
=
0
;
}
/**
/**
* Initialize an enabled icy_metadata object with the specified
* Initialize an enabled icy_metadata object with the specified
* data_size (from the icy-metaint HTTP response header).
* data_size (from the icy-metaint HTTP response header).
*/
*/
static
inline
void
void
Start
(
size_t
_data_size
)
{
icy_start
(
struct
icy_metadata
*
im
,
size_t
data_size
)
data_size
=
data_rest
=
_data_size
;
{
meta_size
=
0
;
im
->
data_size
=
im
->
data_rest
=
data_size
;
tag
=
nullptr
;
im
->
meta_size
=
0
;
}
im
->
tag
=
NULL
;
}
/**
/**
* Resets the icy_metadata. Call this after rewinding the stream.
* Resets the icy_metadata. Call this after rewinding the stream.
*/
*/
void
void
Reset
();
icy_reset
(
struct
icy_metadata
*
im
);
void
/**
icy_deinit
(
struct
icy_metadata
*
im
);
/**
* Checks whether the icy_metadata object is enabled.
* Checks whether the icy_metadata object is enabled.
*/
*/
static
inline
bool
bool
IsDefined
()
const
{
icy_defined
(
const
struct
icy_metadata
*
im
)
return
data_size
>
0
;
{
}
return
im
->
data_size
>
0
;
}
/**
/**
* Evaluates data. Returns the number of bytes of normal data which
* Evaluates data. Returns the number of bytes of normal data which
* can be read by the caller, but not more than "length". If the
* can be read by the caller, but not more than "length". If the
* return value is smaller than "length", the caller should invoke
* return value is smaller than "length", the caller should invoke
* icy_meta().
* icy_meta().
*/
*/
size_t
size_t
Data
(
size_t
length
);
icy_data
(
struct
icy_metadata
*
im
,
size_t
length
);
/**
/**
* Reads metadata from the stream. Returns the number of bytes
* Reads metadata from the stream. Returns the number of bytes
* consumed. If the return value is smaller than "length", the caller
* consumed. If the return value is smaller than "length", the caller
* should invoke icy_data().
* should invoke icy_data().
*/
*/
size_t
size_t
Meta
(
const
void
*
data
,
size_t
length
);
icy_meta
(
struct
icy_metadata
*
im
,
const
void
*
data
,
size_t
length
);
static
inline
struct
tag
*
struct
tag
*
ReadTag
()
{
icy_tag
(
struct
icy_metadata
*
im
)
struct
tag
*
result
=
tag
;
{
tag
=
nullptr
;
struct
tag
*
tag
=
im
->
tag
;
return
result
;
im
->
tag
=
NULL
;
}
return
tag
;
};
}
#endif
#endif
src/input/CurlInputPlugin.cxx
View file @
85074f5a
...
@@ -22,10 +22,10 @@
...
@@ -22,10 +22,10 @@
#include "input_plugin.h"
#include "input_plugin.h"
#include "conf.h"
#include "conf.h"
#include "tag.h"
#include "tag.h"
#include "IcyMetaDataParser.hxx"
extern
"C"
{
extern
"C"
{
#include "input_internal.h"
#include "input_internal.h"
#include "icy_metadata.h"
}
}
#include "IOThread.hxx"
#include "IOThread.hxx"
...
@@ -106,7 +106,7 @@ struct input_curl {
...
@@ -106,7 +106,7 @@ struct input_curl {
char
error
[
CURL_ERROR_SIZE
];
char
error
[
CURL_ERROR_SIZE
];
/** parser for icy-metadata */
/** parser for icy-metadata */
struct
icy_metadata
icy_metadata
;
IcyMetaDataParser
icy
;
/** the stream name from the icy-name response header */
/** the stream name from the icy-name response header */
char
*
meta_name
;
char
*
meta_name
;
...
@@ -125,7 +125,6 @@ struct input_curl {
...
@@ -125,7 +125,6 @@ struct input_curl {
tag
(
nullptr
),
tag
(
nullptr
),
postponed_error
(
nullptr
)
{
postponed_error
(
nullptr
)
{
input_stream_init
(
&
base
,
&
input_plugin_curl
,
url
,
mutex
,
cond
);
input_stream_init
(
&
base
,
&
input_plugin_curl
,
url
,
mutex
,
cond
);
icy_clear
(
&
icy_metadata
);
}
}
~
input_curl
();
~
input_curl
();
...
@@ -811,7 +810,7 @@ consume_buffer(struct buffer *buffer, size_t length)
...
@@ -811,7 +810,7 @@ consume_buffer(struct buffer *buffer, size_t length)
}
}
static
size_t
static
size_t
read_from_buffer
(
struct
icy_metadata
*
icy_metadata
,
GQueue
*
buffers
,
read_from_buffer
(
IcyMetaDataParser
&
icy
,
GQueue
*
buffers
,
void
*
dest0
,
size_t
length
)
void
*
dest0
,
size_t
length
)
{
{
struct
buffer
*
buffer
=
(
struct
buffer
*
)
g_queue_pop_head
(
buffers
);
struct
buffer
*
buffer
=
(
struct
buffer
*
)
g_queue_pop_head
(
buffers
);
...
@@ -827,7 +826,7 @@ read_from_buffer(struct icy_metadata *icy_metadata, GQueue *buffers,
...
@@ -827,7 +826,7 @@ read_from_buffer(struct icy_metadata *icy_metadata, GQueue *buffers,
while
(
true
)
{
while
(
true
)
{
size_t
chunk
;
size_t
chunk
;
chunk
=
icy
_data
(
icy_metadata
,
length
);
chunk
=
icy
.
Data
(
length
);
if
(
chunk
>
0
)
{
if
(
chunk
>
0
)
{
memcpy
(
dest
,
buffer
->
data
+
buffer
->
consumed
,
memcpy
(
dest
,
buffer
->
data
+
buffer
->
consumed
,
chunk
);
chunk
);
...
@@ -843,8 +842,7 @@ read_from_buffer(struct icy_metadata *icy_metadata, GQueue *buffers,
...
@@ -843,8 +842,7 @@ read_from_buffer(struct icy_metadata *icy_metadata, GQueue *buffers,
assert
(
buffer
!=
NULL
);
assert
(
buffer
!=
NULL
);
}
}
chunk
=
icy_meta
(
icy_metadata
,
buffer
->
data
+
buffer
->
consumed
,
chunk
=
icy
.
Meta
(
buffer
->
data
+
buffer
->
consumed
,
length
);
length
);
if
(
chunk
>
0
)
{
if
(
chunk
>
0
)
{
buffer
=
consume_buffer
(
buffer
,
chunk
);
buffer
=
consume_buffer
(
buffer
,
chunk
);
...
@@ -866,7 +864,7 @@ read_from_buffer(struct icy_metadata *icy_metadata, GQueue *buffers,
...
@@ -866,7 +864,7 @@ read_from_buffer(struct icy_metadata *icy_metadata, GQueue *buffers,
static
void
static
void
copy_icy_tag
(
struct
input_curl
*
c
)
copy_icy_tag
(
struct
input_curl
*
c
)
{
{
struct
tag
*
tag
=
icy_tag
(
&
c
->
icy_metadata
);
struct
tag
*
tag
=
c
->
icy
.
ReadTag
(
);
if
(
tag
==
NULL
)
if
(
tag
==
NULL
)
return
;
return
;
...
@@ -908,7 +906,7 @@ input_curl_read(struct input_stream *is, void *ptr, size_t size,
...
@@ -908,7 +906,7 @@ input_curl_read(struct input_stream *is, void *ptr, size_t size,
/* send buffer contents */
/* send buffer contents */
while
(
size
>
0
&&
!
g_queue_is_empty
(
c
->
buffers
))
{
while
(
size
>
0
&&
!
g_queue_is_empty
(
c
->
buffers
))
{
size_t
copy
=
read_from_buffer
(
&
c
->
icy_metadata
,
c
->
buffers
,
size_t
copy
=
read_from_buffer
(
c
->
icy
,
c
->
buffers
,
dest
+
nbytes
,
size
);
dest
+
nbytes
,
size
);
nbytes
+=
copy
;
nbytes
+=
copy
;
...
@@ -916,7 +914,7 @@ input_curl_read(struct input_stream *is, void *ptr, size_t size,
...
@@ -916,7 +914,7 @@ input_curl_read(struct input_stream *is, void *ptr, size_t size,
}
}
}
while
(
nbytes
==
0
);
}
while
(
nbytes
==
0
);
if
(
icy_defined
(
&
c
->
icy_metadata
))
if
(
c
->
icy
.
IsDefined
(
))
copy_icy_tag
(
c
);
copy_icy_tag
(
c
);
is
->
offset
+=
(
goffset
)
nbytes
;
is
->
offset
+=
(
goffset
)
nbytes
;
...
@@ -979,7 +977,7 @@ input_curl_headerfunction(void *ptr, size_t size, size_t nmemb, void *stream)
...
@@ -979,7 +977,7 @@ input_curl_headerfunction(void *ptr, size_t size, size_t nmemb, void *stream)
if
(
g_ascii_strcasecmp
(
name
,
"accept-ranges"
)
==
0
)
{
if
(
g_ascii_strcasecmp
(
name
,
"accept-ranges"
)
==
0
)
{
/* a stream with icy-metadata is not seekable */
/* a stream with icy-metadata is not seekable */
if
(
!
icy_defined
(
&
c
->
icy_metadata
))
if
(
!
c
->
icy
.
IsDefined
(
))
c
->
base
.
seekable
=
true
;
c
->
base
.
seekable
=
true
;
}
else
if
(
g_ascii_strcasecmp
(
name
,
"content-length"
)
==
0
)
{
}
else
if
(
g_ascii_strcasecmp
(
name
,
"content-length"
)
==
0
)
{
char
buffer
[
64
];
char
buffer
[
64
];
...
@@ -1010,7 +1008,7 @@ input_curl_headerfunction(void *ptr, size_t size, size_t nmemb, void *stream)
...
@@ -1010,7 +1008,7 @@ input_curl_headerfunction(void *ptr, size_t size, size_t nmemb, void *stream)
size_t
icy_metaint
;
size_t
icy_metaint
;
if
((
size_t
)(
end
-
header
)
>=
sizeof
(
buffer
)
||
if
((
size_t
)(
end
-
header
)
>=
sizeof
(
buffer
)
||
icy_defined
(
&
c
->
icy_metadata
))
c
->
icy
.
IsDefined
(
))
return
size
;
return
size
;
memcpy
(
buffer
,
value
,
end
-
value
);
memcpy
(
buffer
,
value
,
end
-
value
);
...
@@ -1020,7 +1018,7 @@ input_curl_headerfunction(void *ptr, size_t size, size_t nmemb, void *stream)
...
@@ -1020,7 +1018,7 @@ input_curl_headerfunction(void *ptr, size_t size, size_t nmemb, void *stream)
g_debug
(
"icy-metaint=%zu"
,
icy_metaint
);
g_debug
(
"icy-metaint=%zu"
,
icy_metaint
);
if
(
icy_metaint
>
0
)
{
if
(
icy_metaint
>
0
)
{
icy_start
(
&
c
->
icy_metadata
,
icy_metaint
);
c
->
icy
.
Start
(
icy_metaint
);
/* a stream with icy-metadata is not
/* a stream with icy-metadata is not
seekable */
seekable */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment