[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