rockbox/songdbj/com/jcraft/jogg/Page.java
Michiel Van Der Kolk 9fee0ec4ca Songdb java version, source. only 1.5 compatible
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7101 a1c6a512-1295-4272-9138-f99709370657
2005-07-11 15:42:37 +00:00

973 lines
27 KiB
Java

/* -*-mode:java; c-basic-offset:2; -*- */
/* JOrbis
* Copyright (C) 2000 ymnk, JCraft,Inc.
*
* Written by: 2000 ymnk<ymnk@jcraft.com>
*
* Many thanks to
* Monty <monty@xiph.org> and
* The XIPHOPHORUS Company http://www.xiph.org/ .
* JOrbis has been based on their awesome works, Vorbis codec.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public License
* as published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package com.jcraft.jogg;
public class Page{
private static int[] crc_lookup=new int[256];
static {
for(int i=0; i<crc_lookup.length; i++){
crc_lookup[i]=crc_entry(i);
}
}
private static int crc_entry(int index){
int r=index<<24;
for(int i=0; i<8; i++){
if((r& 0x80000000)!=0){
r=(r << 1)^0x04c11db7; /* The same as the ethernet generator
polynomial, although we use an
unreflected alg and an init/final
of 0, not 0xffffffff */
}
else{
r<<=1;
}
}
return(r&0xffffffff);
}
public byte[] header_base;
public int header;
public int header_len;
public byte[] body_base;
public int body;
public int body_len;
int version(){
return header_base[header+4]&0xff;
}
int continued(){
return (header_base[header+5]&0x01);
}
public int bos(){
return (header_base[header+5]&0x02);
}
public int eos(){
return (header_base[header+5]&0x04);
}
public long granulepos(){
long foo=header_base[header+13]&0xff;
foo=(foo<<8)|(header_base[header+12]&0xff);
foo=(foo<<8)|(header_base[header+11]&0xff);
foo=(foo<<8)|(header_base[header+10]&0xff);
foo=(foo<<8)|(header_base[header+9]&0xff);
foo=(foo<<8)|(header_base[header+8]&0xff);
foo=(foo<<8)|(header_base[header+7]&0xff);
foo=(foo<<8)|(header_base[header+6]&0xff);
return(foo);
}
public int serialno(){
return (header_base[header+14]&0xff)|
((header_base[header+15]&0xff)<<8)|
((header_base[header+16]&0xff)<<16)|
((header_base[header+17]&0xff)<<24);
}
int pageno(){
return (header_base[header+18]&0xff)|
((header_base[header+19]&0xff)<<8)|
((header_base[header+20]&0xff)<<16)|
((header_base[header+21]&0xff)<<24);
}
void checksum(){
int crc_reg=0;
// for(int i=0;i<header_len;i++){
// System.err.println("chksum: "+Integer.toHexString(header_base[header+i]&0xff));
// }
for(int i=0;i<header_len;i++){
crc_reg=(crc_reg<<8)^crc_lookup[((crc_reg>>>24)&0xff)^(header_base[header+i]&0xff)];
}
for(int i=0;i<body_len;i++){
crc_reg=(crc_reg<<8)^crc_lookup[((crc_reg>>>24)&0xff)^(body_base[body+i]&0xff)];
}
header_base[header+22]=(byte)crc_reg/*&0xff*/;
header_base[header+23]=(byte)(crc_reg>>>8)/*&0xff*/;
header_base[header+24]=(byte)(crc_reg>>>16)/*&0xff*/;
header_base[header+25]=(byte)(crc_reg>>>24)/*&0xff*/;
}
public Page copy(){
return copy(new Page());
}
public Page copy(Page p){
byte[] tmp=new byte[header_len];
System.arraycopy(header_base, header, tmp, 0, header_len);
p.header_len=header_len;
p.header_base=tmp;
p.header=0;
tmp=new byte[body_len];
System.arraycopy(body_base, body, tmp, 0, body_len);
p.body_len=body_len;
p.body_base=tmp;
p.body=0;
return p;
}
/*
// TEST
static StreamState os_en, os_de;
static SyncState oy;
void check_page(byte[] data_base, int data, int[] _header){
// Test data
for(int j=0;j<body_len;j++)
if(body_base[body+j]!=data_base[data+j]){
System.err.println("body data mismatch at pos "+j+": "+data_base[data+j]+"!="+body_base[body+j]+"!\n");
System.exit(1);
}
// Test header
for(int j=0;j<header_len;j++){
if((header_base[header+j]&0xff)!=_header[j]){
System.err.println("header content mismatch at pos "+j);
for(int jj=0;jj<_header[26]+27;jj++)
System.err.print(" ("+jj+")"+Integer.toHexString(_header[jj])+":"+Integer.toHexString(header_base[header+jj]));
System.err.println("");
System.exit(1);
}
}
if(header_len!=_header[26]+27){
System.err.print("header length incorrect! ("+header_len+"!="+(_header[26]+27)+")");
System.exit(1);
}
}
void print_header(){
System.err.println("\nHEADER:");
System.err.println(" capture: "+
(header_base[header+0]&0xff)+" "+
(header_base[header+1]&0xff)+" "+
(header_base[header+2]&0xff)+" "+
(header_base[header+3]&0xff)+" "+
" version: "+(header_base[header+4]&0xff)+" flags: "+
(header_base[header+5]&0xff));
System.err.println(" pcmpos: "+
(((header_base[header+9]&0xff)<<24)|
((header_base[header+8]&0xff)<<16)|
((header_base[header+7]&0xff)<<8)|
((header_base[header+6]&0xff)))+
" serialno: "+
(((header_base[header+17]&0xff)<<24)|
((header_base[header+16]&0xff)<<16)|
((header_base[header+15]&0xff)<<8)|
((header_base[header+14]&0xff)))+
" pageno: "+
(((header_base[header+21]&0xff)<<24)|
((header_base[header+20]&0xff)<<16)|
((header_base[header+19]&0xff)<<8)|
((header_base[header+18]&0xff))));
System.err.println(" checksum: "+
(header_base[header+22]&0xff)+":"+
(header_base[header+23]&0xff)+":"+
(header_base[header+24]&0xff)+":"+
(header_base[header+25]&0xff)+"\n segments: "+
(header_base[header+26]&0xff)+" (");
for(int j=27;j<header_len;j++){
System.err.println((header_base[header+j]&0xff)+" ");
}
System.err.println(")\n");
}
void copy_page(){
byte[] tmp=new byte[header_len];
System.arraycopy(header_base, header, tmp, 0, header_len);
header_base=tmp;
header=0;
tmp=new byte[body_len];
System.arraycopy(body_base, body, tmp, 0, body_len);
body_base=tmp;
body=0;
}
static void test_pack(int[] pl, int[][] headers){
byte[] data=new byte[1024*1024]; // for scripted test cases only
int inptr=0;
int outptr=0;
int deptr=0;
int depacket=0;
int pcm_pos=7;
int packets,pageno=0,pageout=0;
int eosflag=0;
int bosflag=0;
os_en.reset();
os_de.reset();
oy.reset();
for(packets=0;;packets++){
if(pl[packets]==-1)break;
}
for(int i=0;i<packets;i++){
// construct a test packet
Packet op=new Packet();
int len=pl[i];
op.packet_base=data;
op.packet=inptr;
op.bytes=len;
op.e_o_s=(pl[i+1]<0?1:0);
op.granulepos=pcm_pos;
pcm_pos+=1024;
for(int j=0;j<len;j++){
data[inptr++]=(byte)(i+j);
}
// submit the test packet
os_en.packetin(op);
// retrieve any finished pages
{
Page og=new Page();
while(os_en.pageout(og)!=0){
// We have a page. Check it carefully
//System.err.print(pageno+", ");
if(headers[pageno]==null){
System.err.println("coded too many pages!");
System.exit(1);
}
og.check_page(data, outptr, headers[pageno]);
outptr+=og.body_len;
pageno++;
//System.err.println("1# pageno="+pageno+", pageout="+pageout);
// have a complete page; submit it to sync/decode
{
Page og_de=new Page();
Packet op_de=new Packet();
int index=oy.buffer(og.header_len+og.body_len);
byte[] buf=oy.data;
System.arraycopy(og.header_base, og.header, buf, index, og.header_len);
System.arraycopy(og.body_base, og.body, buf, index+og.header_len, og.body_len);
oy.wrote(og.header_len+og.body_len);
//System.err.println("2# pageno="+pageno+", pageout="+pageout);
while(oy.pageout(og_de)>0){
// got a page. Happy happy. Verify that it's good.
og_de.check_page(data, deptr, headers[pageout]);
deptr+=og_de.body_len;
pageout++;
// submit it to deconstitution
os_de.pagein(og_de);
// packets out?
while(os_de.packetout(op_de)>0){
// verify the packet!
// check data
boolean check=false;
for(int ii=0; ii<op_de.bytes; ii++){
if(data[depacket+ii]!=op_de.packet_base[op_de.packet+ii]){
check=true;
break;
}
}
if(check){
System.err.println("packet data mismatch in decode! pos="+
depacket);
System.exit(1);
}
// check bos flag
if(bosflag==0 && op_de.b_o_s==0){
System.err.println("b_o_s flag not set on packet!");
System.exit(1);
}
if(bosflag!=0 && op_de.b_o_s!=0){
System.err.println("b_o_s flag incorrectly set on packet!");
System.exit(1);
}
bosflag=1;
depacket+=op_de.bytes;
// check eos flag
if(eosflag!=0){
System.err.println("Multiple decoded packets with eos flag!");
System.exit(1);
}
if(op_de.e_o_s!=0)eosflag=1;
// check pcmpos flag
if(op_de.granulepos!=-1){
System.err.print(" pcm:"+op_de.granulepos+" ");
}
}
}
}
}
}
}
//free(data);
if(headers[pageno]!=null){
System.err.println("did not write last page!");
System.exit(1);
}
if(headers[pageout]!=null){
System.err.println("did not decode last page!");
System.exit(1);
}
if(inptr!=outptr){
System.err.println("encoded page data incomplete!");
System.exit(1);
}
if(inptr!=deptr){
System.err.println("decoded page data incomplete!");
System.exit(1);
}
if(inptr!=depacket){
System.err.println("decoded packet data incomplete!");
System.exit(1);
}
if(eosflag==0){
System.err.println("Never got a packet with EOS set!");
}
System.err.println("ok.");
}
static void error(){
System.err.println("error!");
System.exit(1);
}
public static void main(String[] arg){
os_en=new StreamState(0x04030201);
os_de=new StreamState(0x04030201);
oy=new SyncState();
// Exercise each code path in the framing code. Also verify that
// the checksums are working.
{
// 17 only
int[] packets={17, -1};
int[] head1={0x4f,0x67,0x67,0x53,0,0x06,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,0,0,0,0,
0x15,0xed,0xec,0x91,
1,
17};
int[][] headret={head1, null};
System.err.print("testing single page encoding... ");
test_pack(packets,headret);
}
{
// 17, 254, 255, 256, 500, 510, 600 byte, pad
int[] packets={17, 254, 255, 256, 500, 510, 600, -1};
int[] head1={0x4f,0x67,0x67,0x53,0,0x02,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,0,0,0,0,
0x59,0x10,0x6c,0x2c,
1,
17};
int[] head2={0x4f,0x67,0x67,0x53,0,0x04,
0x07,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,1,0,0,0,
0x89,0x33,0x85,0xce,
13,
254,255,0,255,1,255,245,255,255,0,
255,255,90};
int[][] headret={head1,head2,null};
System.err.print("testing basic page encoding... ");
test_pack(packets,headret);
}
{
// nil packets; beginning,middle,end
int[] packets={0,17, 254, 255, 0, 256, 0, 500, 510, 600, 0, -1};
int[] head1={0x4f,0x67,0x67,0x53,0,0x02,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,0,0,0,0,
0xff,0x7b,0x23,0x17,
1,
0};
int[] head2={0x4f,0x67,0x67,0x53,0,0x04,
0x07,0x28,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,1,0,0,0,
0x5c,0x3f,0x66,0xcb,
17,
17,254,255,0,0,255,1,0,255,245,255,255,0,
255,255,90,0};
int[][] headret={head1,head2,null};
System.err.print("testing basic nil packets... ");
test_pack(packets,headret);
}
{
// large initial packet
int[] packets={4345,259,255,-1};
int[] head1={0x4f,0x67,0x67,0x53,0,0x02,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,0,0,0,0,
0x01,0x27,0x31,0xaa,
18,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,10};
int[] head2={0x4f,0x67,0x67,0x53,0,0x04,
0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,1,0,0,0,
0x7f,0x4e,0x8a,0xd2,
4,
255,4,255,0};
int[][] headret={head1,head2,null};
System.err.print("testing initial-packet lacing > 4k... ");
test_pack(packets,headret);
}
{
// continuing packet test
int[] packets={0,4345,259,255,-1};
int[] head1={0x4f,0x67,0x67,0x53,0,0x02,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,0,0,0,0,
0xff,0x7b,0x23,0x17,
1,
0};
int[] head2={0x4f,0x67,0x67,0x53,0,0x00,
0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,1,0,0,0,
0x34,0x24,0xd5,0x29,
17,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255};
int[] head3={0x4f,0x67,0x67,0x53,0,0x05,
0x07,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,2,0,0,0,
0xc8,0xc3,0xcb,0xed,
5,
10,255,4,255,0};
int[][] headret={head1,head2,head3,null};
System.err.print("testing single packet page span... ");
test_pack(packets,headret);
}
// page with the 255 segment limit
{
int[] packets={0,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,50,-1};
int[] head1={0x4f,0x67,0x67,0x53,0,0x02,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,0,0,0,0,
0xff,0x7b,0x23,0x17,
1,
0};
int[] head2={0x4f,0x67,0x67,0x53,0,0x00,
0x07,0xfc,0x03,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,1,0,0,0,
0xed,0x2a,0x2e,0xa7,
255,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10};
int[] head3={0x4f,0x67,0x67,0x53,0,0x04,
0x07,0x00,0x04,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,2,0,0,0,
0x6c,0x3b,0x82,0x3d,
1,
50};
int[][] headret={head1,head2,head3,null};
System.err.print("testing max packet segments... ");
test_pack(packets,headret);
}
{
// packet that overspans over an entire page
int[] packets={0,100,9000,259,255,-1};
int[] head1={0x4f,0x67,0x67,0x53,0,0x02,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,0,0,0,0,
0xff,0x7b,0x23,0x17,
1,
0};
int[] head2={0x4f,0x67,0x67,0x53,0,0x00,
0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,1,0,0,0,
0x3c,0xd9,0x4d,0x3f,
17,
100,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255};
int[] head3={0x4f,0x67,0x67,0x53,0,0x01,
0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,2,0,0,0,
0xbd,0xd5,0xb5,0x8b,
17,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255};
int[] head4={0x4f,0x67,0x67,0x53,0,0x05,
0x07,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,3,0,0,0,
0xef,0xdd,0x88,0xde,
7,
255,255,75,255,4,255,0};
int[][] headret={head1,head2,head3,head4,null};
System.err.print("testing very large packets... ");
test_pack(packets,headret);
}
{
// term only page. why not?
int[] packets={0,100,4080,-1};
int[] head1={0x4f,0x67,0x67,0x53,0,0x02,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,0,0,0,0,
0xff,0x7b,0x23,0x17,
1,
0};
int[] head2={0x4f,0x67,0x67,0x53,0,0x00,
0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,1,0,0,0,
0x3c,0xd9,0x4d,0x3f,
17,
100,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255};
int[] head3={0x4f,0x67,0x67,0x53,0,0x05,
0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,2,0,0,0,
0xd4,0xe0,0x60,0xe5,
1,0};
int[][] headret={head1,head2,head3,null};
System.err.print("testing zero data page (1 nil packet)... ");
test_pack(packets,headret);
}
{
// build a bunch of pages for testing
byte[] data=new byte[1024*1024];
int[] pl={0,100,4079,2956,2057,76,34,912,0,234,1000,1000,1000,300,-1};
int inptr=0;
Page[] og=new Page[5];
for(int i=0; i<5; i++){
og[i]=new Page();
}
os_en.reset();
for(int i=0;pl[i]!=-1;i++){
Packet op=new Packet();
int len=pl[i];
op.packet_base=data;
op.packet=inptr;
op.bytes=len;
op.e_o_s=(pl[i+1]<0?1:0);
op.granulepos=(i+1)*1000;
for(int j=0;j<len;j++)data[inptr++]=(byte)(i+j);
os_en.packetin(op);
}
// free(data);
// retrieve finished pages
for(int i=0;i<5;i++){
if(os_en.pageout(og[i])==0){
System.err.print("Too few pages output building sync tests!\n");
System.exit(1);
}
og[i].copy_page();
}
// Test lost pages on pagein/packetout: no rollback
{
Page temp=new Page();
Packet test=new Packet();
System.err.print("Testing loss of pages... ");
oy.reset();
os_de.reset();
for(int i=0;i<5;i++){
int index=oy.buffer(og[i].header_len);
System.arraycopy(og[i].header_base, og[i].header,
oy.data, index, og[i].header_len);
oy.wrote(og[i].header_len);
index=oy.buffer(og[i].body_len);
System.arraycopy(og[i].body_base, og[i].body,
oy.data, index, og[i].body_len);
oy.wrote(og[i].body_len);
}
oy.pageout(temp);
os_de.pagein(temp);
oy.pageout(temp);
os_de.pagein(temp);
oy.pageout(temp);
// skip
oy.pageout(temp);
os_de.pagein(temp);
// do we get the expected results/packets?
if(os_de.packetout(test)!=1)error();
test.checkpacket(0,0,0);
if(os_de.packetout(test)!=1)error();
test.checkpacket(100,1,-1);
if(os_de.packetout(test)!=1)error();
test.checkpacket(4079,2,3000);
if(os_de.packetout(test)!=-1){
System.err.println("Error: loss of page did not return error");
System.exit(1);
}
if(os_de.packetout(test)!=1)error();
test.checkpacket(76,5,-1);
if(os_de.packetout(test)!=1)error();
test.checkpacket(34,6,-1);
System.err.println("ok.");
}
// Test lost pages on pagein/packetout: rollback with continuation
{
Page temp=new Page();
Packet test=new Packet();
System.err.print("Testing loss of pages (rollback required)... ");
oy.reset();
os_de.reset();
for(int i=0;i<5;i++){
int index=oy.buffer(og[i].header_len);
System.arraycopy(og[i].header_base, og[i].header,
oy.data, index, og[i].header_len);
oy.wrote(og[i].header_len);
index=oy.buffer(og[i].body_len);
System.arraycopy(og[i].body_base, og[i].body,
oy.data, index, og[i].body_len);
oy.wrote(og[i].body_len);
}
oy.pageout(temp);
os_de.pagein(temp);
oy.pageout(temp);
os_de.pagein(temp);
oy.pageout(temp);
os_de.pagein(temp);
oy.pageout(temp);
// skip
oy.pageout(temp);
os_de.pagein(temp);
// do we get the expected results/packets?
if(os_de.packetout(test)!=1)error();
test.checkpacket(0,0,0);
if(os_de.packetout(test)!=1)error();
test.checkpacket(100,1,-1);
if(os_de.packetout(test)!=1)error();
test.checkpacket(4079,2,3000);
if(os_de.packetout(test)!=1)error();
test.checkpacket(2956,3,4000);
if(os_de.packetout(test)!=-1){
System.err.println("Error: loss of page did not return error");
System.exit(1);
}
if(os_de.packetout(test)!=1)error();
test.checkpacket(300,13,14000);
System.err.println("ok.");
}
// the rest only test sync
{
Page og_de=new Page();
// Test fractional page inputs: incomplete capture
System.err.print("Testing sync on partial inputs... ");
oy.reset();
int index=oy.buffer(og[1].header_len);
System.arraycopy(og[1].header_base, og[1].header,
oy.data, index, 3);
oy.wrote(3);
if(oy.pageout(og_de)>0)error();
// Test fractional page inputs: incomplete fixed header
index=oy.buffer(og[1].header_len);
System.arraycopy(og[1].header_base, og[1].header+3,
oy.data, index, 20);
oy.wrote(20);
if(oy.pageout(og_de)>0)error();
// Test fractional page inputs: incomplete header
index=oy.buffer(og[1].header_len);
System.arraycopy(og[1].header_base, og[1].header+23,
oy.data, index, 5);
oy.wrote(5);
if(oy.pageout(og_de)>0)error();
// Test fractional page inputs: incomplete body
index=oy.buffer(og[1].header_len);
System.arraycopy(og[1].header_base, og[1].header+28,
oy.data, index, og[1].header_len-28);
oy.wrote(og[1].header_len-28);
if(oy.pageout(og_de)>0)error();
index=oy.buffer(og[1].body_len);
System.arraycopy(og[1].body_base, og[1].body,
oy.data, index, 1000);
oy.wrote(1000);
if(oy.pageout(og_de)>0)error();
index=oy.buffer(og[1].body_len);
System.arraycopy(og[1].body_base, og[1].body+1000,
oy.data, index, og[1].body_len-1000);
oy.wrote(og[1].body_len-1000);
if(oy.pageout(og_de)<=0)error();
System.err.println("ok.");
}
// Test fractional page inputs: page + incomplete capture
{
Page og_de=new Page();
System.err.print("Testing sync on 1+partial inputs... ");
oy.reset();
int index=oy.buffer(og[1].header_len);
System.arraycopy(og[1].header_base, og[1].header,
oy.data, index, og[1].header_len);
oy.wrote(og[1].header_len);
index=oy.buffer(og[1].body_len);
System.arraycopy(og[1].body_base, og[1].body,
oy.data, index, og[1].body_len);
oy.wrote(og[1].body_len);
index=oy.buffer(og[1].header_len);
System.arraycopy(og[1].header_base, og[1].header,
oy.data, index, 20);
oy.wrote(20);
if(oy.pageout(og_de)<=0)error();
if(oy.pageout(og_de)>0)error();
index=oy.buffer(og[1].header_len);
System.arraycopy(og[1].header_base, og[1].header+20,
oy.data, index, og[1].header_len-20);
oy.wrote(og[1].header_len-20);
index=oy.buffer(og[1].body_len);
System.arraycopy(og[1].body_base, og[1].body,
oy.data, index, og[1].body_len);
oy.wrote(og[1].body_len);
if(oy.pageout(og_de)<=0)error();
System.err.println("ok.");
}
// // // // // // // // //
// Test recapture: garbage + page
{
Page og_de=new Page();
System.err.print("Testing search for capture... ");
oy.reset();
// 'garbage'
int index=oy.buffer(og[1].body_len);
System.arraycopy(og[1].body_base, og[1].body,
oy.data, index, og[1].body_len);
oy.wrote(og[1].body_len);
index=oy.buffer(og[1].header_len);
System.arraycopy(og[1].header_base, og[1].header,
oy.data, index, og[1].header_len);
oy.wrote(og[1].header_len);
index=oy.buffer(og[1].body_len);
System.arraycopy(og[1].body_base, og[1].body,
oy.data, index, og[1].body_len);
oy.wrote(og[1].body_len);
index=oy.buffer(og[2].header_len);
System.arraycopy(og[2].header_base, og[2].header,
oy.data, index, 20);
oy.wrote(20);
if(oy.pageout(og_de)>0)error();
if(oy.pageout(og_de)<=0)error();
if(oy.pageout(og_de)>0)error();
index=oy.buffer(og[2].header_len);
System.arraycopy(og[2].header_base, og[2].header+20,
oy.data, index, og[2].header_len-20);
oy.wrote(og[2].header_len-20);
index=oy.buffer(og[2].body_len);
System.arraycopy(og[2].body_base, og[2].body,
oy.data, index, og[2].body_len);
oy.wrote(og[2].body_len);
if(oy.pageout(og_de)<=0)error();
System.err.println("ok.");
}
// Test recapture: page + garbage + page
{
Page og_de=new Page();
System.err.print("Testing recapture... ");
oy.reset();
int index=oy.buffer(og[1].header_len);
System.arraycopy(og[1].header_base, og[1].header,
oy.data, index, og[1].header_len);
oy.wrote(og[1].header_len);
index=oy.buffer(og[1].body_len);
System.arraycopy(og[1].body_base, og[1].body,
oy.data, index, og[1].body_len);
oy.wrote(og[1].body_len);
index=oy.buffer(og[2].header_len);
System.arraycopy(og[2].header_base, og[2].header,
oy.data, index, og[2].header_len);
oy.wrote(og[2].header_len);
index=oy.buffer(og[2].header_len);
System.arraycopy(og[2].header_base, og[2].header,
oy.data, index, og[2].header_len);
oy.wrote(og[2].header_len);
if(oy.pageout(og_de)<=0)error();
index=oy.buffer(og[2].body_len);
System.arraycopy(og[2].body_base, og[2].body,
oy.data, index, og[2].body_len-5);
oy.wrote(og[2].body_len-5);
index=oy.buffer(og[3].header_len);
System.arraycopy(og[3].header_base, og[3].header,
oy.data, index, og[3].header_len);
oy.wrote(og[3].header_len);
index=oy.buffer(og[3].body_len);
System.arraycopy(og[3].body_base, og[3].body,
oy.data, index, og[3].body_len);
oy.wrote(og[3].body_len);
if(oy.pageout(og_de)>0)error();
if(oy.pageout(og_de)<=0)error();
System.err.println("ok.");
}
}
//return(0);
}
*/
}