Annotation of OpenXM/src/cfep/MyDecoder.m, Revision 1.1
1.1 ! takayama 1: //
! 2: // MyDecoder.m
! 3: // cfep
! 4: //
! 5: // Created by Nobuki Takayama on 06/01/29.
! 6: // Copyright 2006 OpenXM.org. All rights reserved.
! 7: //
! 8:
! 9: #import "MyDecoder.h"
! 10:
! 11:
! 12: @implementation MyDecoder
! 13: -(void) dealloc {
! 14: if (data) {[data autorelease]; data=nil;}
! 15: [super dealloc];
! 16: }
! 17:
! 18: -(NSString *)myDecoder: (int) c from: (id) myDocument {
! 19: Byte b[1];
! 20: NSString *s;
! 21: // NSLog(@"state=%d\n",state);
! 22: @synchronized(self) {
! 23: switch(state) {
! 24: case 0:
! 25: if (c == OX_PACKET_START) {state = 1; channel=0;}
! 26: break;
! 27: case 1:
! 28: if (c == OX_DATA_CMO_DATA_START) {
! 29: size = 0; state = 2;
! 30: }else if ((c < '0') || (c > '9')) {
! 31: [self reportError: @"myDecoder: invalid channel.\n" to: myDocument];
! 32: [self reset]; return nil;
! 33: } else { channel = channel*10+c-'0'; }
! 34: break;
! 35: case 2:
! 36: if (c == OX_DATA_CMO_DATA_END_SIZE) {
! 37: state = 3;
! 38: if (size > MYDECODER_MAX) {
! 39: [self reportError: @"myDecoder: too big size.\n" to: myDocument];
! 40: [self reset];
! 41: return nil;
! 42: }
! 43: data = [NSMutableData dataWithCapacity: (size+1)]; [data retain];
! 44: }else if ((c < '0') || (c > '9')) {
! 45: [self reportError: @"myDecoder: invalid size.\n" to: myDocument];
! 46: [self reset]; return nil;
! 47: } else { size = size*10+c-'0'; }
! 48: break;
! 49: case 3:
! 50: if (size <= 0) {
! 51: state = 4;
! 52: if (c != OX_DATA_CMO_DATA_END) {
! 53: [self reportError: @"myDecoder: unexpected end of ox_data_cmo_data.\n" to: myDocument];
! 54: [self reset];
! 55: return nil;
! 56: }
! 57: } else {
! 58: b[0] = c;
! 59: [data appendBytes: b length: 1];
! 60: size--;
! 61: }
! 62: break;
! 63: case 4:
! 64: if (c != OX_PACKET_END) {
! 65: [self reportError: @"myDecoder: unexpected end of ox_packet.\n" to: myDocument];
! 66: [self reset];
! 67: return nil;
! 68: }else{
! 69: b[0] = 0; [data appendBytes: b length: 1];
! 70: s = [NSString stringWithCString: [data bytes] encoding: NSUTF8StringEncoding];
! 71: [self reset];
! 72: return s;
! 73: }
! 74: break;
! 75: default:
! 76: [self reportError: @"myDecoder: unknown state.\n" to: myDocument]; [self reset];
! 77: break;
! 78: }
! 79: }
! 80: return nil;
! 81: }
! 82:
! 83: -(int) getChannel {
! 84: return channel;
! 85: }
! 86:
! 87: -(void) reset {
! 88: @synchronized(self) {
! 89: state = 0;
! 90: // NSLog(@"data retainCount=%d\n",[data retainCount]); // --> 2.
! 91: if (data) { [data autorelease]; data=nil;}
! 92: }
! 93: }
! 94:
! 95: -(void) reportError: (NSString *) msg to: (id) myDocument {
! 96: [myDocument outputErrorString: msg];
! 97: NSLog(@"data=%@",data);
! 98: }
! 99:
! 100:
! 101: @end
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>