[Gd-chatter] r10864 - in trunk/libraries: id3v2 id3v2/id3v2-test packetizer registry/generic
mb at gwydiondylan.org
mb at gwydiondylan.org
Mon Aug 28 19:24:16 CEST 2006
Author: mb
Date: Mon Aug 28 19:24:11 2006
New Revision: 10864
Added:
trunk/libraries/id3v2/
trunk/libraries/id3v2/id3v2-reader.dylan (contents, props changed)
trunk/libraries/id3v2/id3v2-test/
trunk/libraries/id3v2/id3v2-test/id3v2-test.dylan (contents, props changed)
trunk/libraries/id3v2/id3v2-test/id3v2-test.hdp (contents, props changed)
trunk/libraries/id3v2/id3v2-test/library.dylan (contents, props changed)
trunk/libraries/id3v2/id3v2.dylan (contents, props changed)
trunk/libraries/id3v2/id3v2.hdp (contents, props changed)
trunk/libraries/id3v2/library.dylan (contents, props changed)
trunk/libraries/registry/generic/id3v2 (contents, props changed)
trunk/libraries/registry/generic/id3v2-test (contents, props changed)
Modified:
trunk/libraries/packetizer/module.dylan
trunk/libraries/packetizer/packetizer.dylan
Log:
Bug: 7299
preliminary id3v2 definitions for the packetizer framework
Added: trunk/libraries/id3v2/id3v2-reader.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/id3v2/id3v2-reader.dylan Mon Aug 28 19:24:11 2006
@@ -0,0 +1,15 @@
+module: id3v2
+Author: Andreas Bogk, Hannes Mehnert, mb
+Copyright: (C) 2005, 2006, All rights reserved. Free for non-commercial use.
+
+define class <id3v2-reader> (<single-push-output-node>)
+ slot file-stream :: <stream>, required-init-keyword: stream:;
+end;
+
+define method toplevel (reader :: <id3v2-reader>)
+ //let file = as(<byte-vector>, stream-contents(reader.file-stream));
+ let tag-data = read-to(reader.file-stream, as(<character>, #xff), test: \==);
+ let id3v2-container = make(unparsed-class(<id3v2-tag>), packet: as(<byte-vector>, tag-data));
+ format-out("%s\n", as(<string>, id3v2-container));
+ format-out("repeated fields: %d\n", id3v2-container.id3v2-frame.size);
+end;
\ No newline at end of file
Added: trunk/libraries/id3v2/id3v2-test/id3v2-test.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/id3v2/id3v2-test/id3v2-test.dylan Mon Aug 28 19:24:11 2006
@@ -0,0 +1,12 @@
+module: id3v2-test
+Author: Andreas Bogk, Hannes Mehnert
+Copyright: (C) 2005, 2006, All rights reserved. Free for non-commercial use.
+
+define function main()
+ let input-stream = make(<file-stream>, locator: "test.mp3", direction: #"input");
+ let id3v2-reader = make(<id3v2-reader>, stream: input-stream);
+ toplevel(id3v2-reader);
+end;
+
+main();
+
Added: trunk/libraries/id3v2/id3v2-test/id3v2-test.hdp
==============================================================================
--- (empty file)
+++ trunk/libraries/id3v2/id3v2-test/id3v2-test.hdp Mon Aug 28 19:24:11 2006
@@ -0,0 +1,3 @@
+library: id3v2-test
+files: library
+ id3v2-test
Added: trunk/libraries/id3v2/id3v2-test/library.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/id3v2/id3v2-test/library.dylan Mon Aug 28 19:24:11 2006
@@ -0,0 +1,27 @@
+module: dylan-user
+Author: Andreas Bogk, Hannes Mehnert
+Copyright: (C) 2005, 2006, All rights reserved. Free for non-commercial use.
+
+define library id3v2-test
+ use common-dylan;
+ use io;
+ use parse-arguments;
+ use flow;
+ use network-flow;
+ use system;
+ use interfaces;
+ use id3v2;
+end;
+
+define module id3v2-test
+ use common-dylan;
+ use streams;
+ use format-out;
+ use standard-io;
+ use file-system;
+ use flow;
+ use network-flow;
+ use parse-arguments;
+ use interfaces;
+ use id3v2;
+end;
Added: trunk/libraries/id3v2/id3v2.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/id3v2/id3v2.dylan Mon Aug 28 19:24:11 2006
@@ -0,0 +1,115 @@
+module: id3v2
+Author: Andreas Bogk, Hannes Mehnert, mb
+Copyright: (C) 2005, 2006, All rights reserved. Free for non-commercial use.
+
+define class <4byte-7bit-big-endian-unsigned-integer> (<fixed-size-translated-leaf-frame>)
+end;
+
+define inline method high-level-type
+ (low-level-type == <4byte-7bit-big-endian-unsigned-integer>)
+ => (res :: <type>)
+ limited(<integer>, min: 0, max: 2 ^ 28);
+end;
+
+define inline method field-size (field == <4byte-7bit-big-endian-unsigned-integer>)
+ => (length :: <integer>)
+ 4 * 8;
+end;
+
+define method parse-frame
+ (frame-type == <4byte-7bit-big-endian-unsigned-integer>, packet :: <byte-sequence>,
+ #key start :: <integer> = 0)
+ => (value :: <integer>, next-unparsed :: <integer>)
+ byte-aligned(start);
+ let byte-start = byte-offset(start);
+ if (packet.size < byte-start + 4)
+ signal(make(<malformed-packet-error>))
+ else
+ let result = 0;
+ for (i from byte-start below byte-start + 4)
+ result := packet[i] + ash(result, 7)
+ end;
+ values(result, start + 8 * 4);
+ end;
+end;
+
+define class <id3v2-string> (<container-frame>)
+end;
+
+define class <id3v2-string-cache> (<id3v2-string>, <container-frame-cache>)
+end;
+
+define class <unparsed-id3v2-string> (<id3v2-string>, <unparsed-container-frame>)
+end;
+
+define class <decoded-id3v2-string> (<id3v2-string>, <decoded-container-frame>)
+end;
+
+define protocol id3v2-string-with-type (id3v2-string)
+ field string-type :: <unsigned-byte>;
+end;
+
+define protocol ascii-string-with-type (id3v2-string-with-type)
+ field string-data :: <externally-delimited-string>;
+end;
+
+define protocol ascii-string (id3v2-string)
+ field string-data :: <externally-delimited-string>;
+end;
+
+define method parse-frame
+ (frame-type == <id3v2-string>, packet :: <byte-sequence>, #key start :: <integer> = 0)
+ => (value :: <id3v2-string>, next-unparsed :: false-or(<integer>))
+ let type-code = if (packet.size == 0) #x10 else packet[0] end if;
+ let string-type = select (type-code)
+ #x00 => <ascii-string-with-type>;
+ otherwise <ascii-string>;
+ end select;
+ parse-frame(string-type, packet, start: start);
+end;
+
+define protocol id3v2-flags (container-frame)
+ field unsynchronisation :: <1bit-unsigned-integer>;
+ field extended-header :: <1bit-unsigned-integer>;
+ field experimental-indicator :: <1bit-unsigned-integer>;
+ field footer-present :: <1bit-unsigned-integer>;
+ field dummy :: <4bit-unsigned-integer>; // must be zero
+end;
+
+define protocol id3v2-frame (container-frame)
+ field frame-id :: <externally-delimited-string>, static-length: 8 * 4;
+ field id3v2-frame-size :: <4byte-7bit-big-endian-unsigned-integer>,
+ fixup: byte-offset(frame-size(frame.id3v2-data));
+ field flags :: <2byte-big-endian-unsigned-integer>;
+ field id3v2-data :: <id3v2-string>, length: frame.id3v2-frame-size * 8;
+ /* field string-type :: <unsigned-byte>;
+ field id3v2-data :: <externally-delimited-string>,
+ length: if (frame.id3v2-frame-size > 0)
+ (frame.id3v2-frame-size - 1) * 8;
+ else
+ 0;
+ end if; */
+end;
+
+define protocol id3v2-header (container-frame)
+ field identifier :: <externally-delimited-string>,
+ static-length: 8 * 3;
+ field major-version :: <unsigned-byte>;
+ field revision :: <unsigned-byte>;
+ field flags :: <id3v2-flags>;
+ field tag-size :: <4byte-7bit-big-endian-unsigned-integer>;
+end;
+
+define protocol id3v2-tag (header-frame)
+ field id3v2-header :: <id3v2-header>;
+ repeated field id3v2-frame :: <id3v2-frame>,
+ reached-end?:
+ method (frame :: <id3v2-frame>)
+ if (frame.frame-id.data[0] == #x00)
+ #t;
+ else
+ #f;
+ end if;
+ end method;
+ //field payload :: <raw-frame>, start: frame.id3v2-header.tag-size * 8;
+end;
Added: trunk/libraries/id3v2/id3v2.hdp
==============================================================================
--- (empty file)
+++ trunk/libraries/id3v2/id3v2.hdp Mon Aug 28 19:24:11 2006
@@ -0,0 +1,11 @@
+comment: This file is generated, please don't edit
+format-version: 2
+library: id3v2
+files: library
+ id3v2
+ id3v2-reader
+major-version: 1
+minor-version: 0
+library-pack: 0
+compilation-mode: loose
+comment: additional keywords
Added: trunk/libraries/id3v2/library.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/id3v2/library.dylan Mon Aug 28 19:24:11 2006
@@ -0,0 +1,32 @@
+module: dylan-user
+Author: Andreas Bogk, Hannes Mehnert
+Copyright: (C) 2005, 2006, All rights reserved. Free for non-commercial use.
+
+define library id3v2
+ use common-dylan;
+ use io;
+ use parse-arguments;
+ use flow;
+ use network-flow;
+ use system;
+ use interfaces;
+ use packetizer;
+
+ export id3v2;
+end;
+
+define module id3v2
+ use common-dylan;
+ use streams;
+ use format;
+ use format-out;
+ use standard-io;
+ use file-system;
+ use flow;
+ use network-flow;
+ use parse-arguments;
+ use interfaces;
+ use packetizer;
+
+ export <id3v2-reader>, <id3v2-tag>;
+end;
Modified: trunk/libraries/packetizer/module.dylan
==============================================================================
--- trunk/libraries/packetizer/module.dylan (original)
+++ trunk/libraries/packetizer/module.dylan Mon Aug 28 19:24:11 2006
@@ -33,6 +33,8 @@
total-length, concrete-frame-fields,
<repeated-field>, <malformed-packet-error>;
+ export byte-aligned, high-level-type;
+
export <pcap-file>, <pcap-file-header>, <pcap-packet>, header, packets,
$DLT-EN10MB, $DLT-PRISM-HEADER, make-unix-time, decode-unix-time, timestamp;
@@ -42,9 +44,14 @@
export $broken-ipv4, hexdump;
- export <unsigned-byte>, <3byte-big-endian-unsigned-integer>,
+ export <unsigned-byte>,
+ <3byte-big-endian-unsigned-integer>,
+ <2byte-big-endian-unsigned-integer>,
<3byte-little-endian-unsigned-integer>,
- <externally-delimited-string>;
+ <externally-delimited-string>, <1bit-unsigned-integer>,
+ <4bit-unsigned-integer>;
+
+ export <fixed-size-translated-leaf-frame>, <byte-sequence>;
export <integer-or-unknown>, $unknown-at-compile-time;
Modified: trunk/libraries/packetizer/packetizer.dylan
==============================================================================
--- trunk/libraries/packetizer/packetizer.dylan (original)
+++ trunk/libraries/packetizer/packetizer.dylan Mon Aug 28 19:24:11 2006
@@ -139,7 +139,7 @@
define abstract class <frame> (<object>)
end;
-define generic parse-frame
+define open generic parse-frame
(frame-type :: subclass (<frame>),
packet :: <sequence>,
#rest rest, #key, #all-keys);
@@ -182,8 +182,8 @@
write(stream, as(<string>, frame))
end;
-define generic high-level-type (low-level-type :: subclass(<frame>)) => (res :: <type>);
-define sealed domain high-level-type (subclass(<frame>));
+define open generic high-level-type (low-level-type :: subclass(<frame>)) => (res :: <type>);
+//define high-level-type (subclass(<frame>));
define inline method high-level-type (object :: subclass(<frame>)) => (res :: <type>)
object
@@ -264,7 +264,7 @@
(<leaf-frame>, <variable-size-untranslated-frame>)
end;
-define abstract class <fixed-size-translated-leaf-frame>
+define open abstract class <fixed-size-translated-leaf-frame>
(<leaf-frame>, <fixed-size-frame>, <translated-frame>)
end;
Added: trunk/libraries/registry/generic/id3v2
==============================================================================
--- (empty file)
+++ trunk/libraries/registry/generic/id3v2 Mon Aug 28 19:24:11 2006
@@ -0,0 +1 @@
+abstract://dylan/id3v2/id3v2.hdp
Added: trunk/libraries/registry/generic/id3v2-test
==============================================================================
--- (empty file)
+++ trunk/libraries/registry/generic/id3v2-test Mon Aug 28 19:24:11 2006
@@ -0,0 +1 @@
+abstract://dylan/id3v2/id3v2-test/id3v2-test.hdp
More information about the chatter
mailing list