00001 #ifndef _WINC_BUFRFILE
00002 #define _WINC_BUFRFILE
00003
00004 #include <WXP/BufrCode.h>
00005 #include <WXP/BufrData.h>
00006 #include <WXP/BufrParam.h>
00007 #include <WXP/File.h>
00008
00009 namespace WXP {
00010 #define DATA_SIZE 10000
00011 class BufrFile {
00012 File file;
00013 bool opened;
00014
00015 int type;
00016 int version;
00017 int size;
00018
00019 int loc;
00020 int data_size;
00021 int data_type;
00022 int data_subtype;
00023 File lfile;
00024 unsigned char data[DATA_SIZE];
00025 unsigned char *data_ptr;
00026
00027 int bpval;
00028
00029 int bpoff;
00030 int data_bits;
00031 long bit_mask;
00032 int temp_data;
00033
00034 int loop_ind;
00035 int beg[20];
00036 int end[20];
00037 int cnt[20];
00038 int num[20];
00039
00040 int twidth;
00041 int tscale;
00042 int tref;
00043
00044 int master_table;
00045
00046 BufrCode *codes;
00047 int code_ind;
00048 int num_codes;
00049 int max_codes;
00050
00051 BufrParam *params;
00052 int param_ind;
00053 int num_params;
00054 int num_subset;
00055
00056 int seq_ind;
00057 int seq_end;
00058
00059 int dind;
00060 int dcode[30];
00061 int dcodei[30];
00062 char dcodes[30][200];
00063
00064 int initClass();
00065 int searchBUFR();
00066 int readData( int bytes );
00067 int readBits( int bpval );
00068 unsigned char getByte( int loc );
00069 int seekData( int val );
00070 int addCode( BufrCode &code );
00071 int resizeCode( int size );
00072 int searchCode( int rmaj, int rmin, BufrCode &code );
00073 int searchCodes( int rmaj, int rmin, int *pcodes );
00074 int searchDataCode( int rmaj, int rmin, int val, char *str );
00075
00076 public:
00077 BufrFile();
00078 ~BufrFile();
00079 int init();
00080 int open( const char *filename );
00081 bool isOpen();
00082 int close();
00083 int readHeader();
00084 int readPDB();
00085 int readData( BufrData &data );
00086 inline int getParamInd(){ return param_ind; };
00087 inline int getLoop(){ return loop_ind; };
00088 inline int getLoopNum(){ return num[loop_ind]; };
00089 inline int getLoopInd(){ return cnt[loop_ind]; };
00090 inline int getLoopBeg(){ return beg[loop_ind]; };
00091 inline int getLoopEnd(){ return end[loop_ind]; };
00092 inline int getNumSubsets(){ return num_subset; };
00093 inline int nextDataset(){ code_ind = 0; return 0; };
00094 int printParams();
00095 int printCodes();
00096 int print();
00097
00098 static int checkType( const char *filename );
00099
00100 enum FileType {
00101 NONE,
00102 WXP,
00103 LDM,
00104 RAW
00105 };
00106 };
00107 }
00108
00109 #endif