Logo Search packages:      
Sourcecode: libjorbis-java version File versions  Download package

Page.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);
  }
  */
}

Generated by  Doxygen 1.6.0   Back to index