[BACK]Return to MyDecoder.m CVS log [TXT][DIR] Up to [local] / OpenXM / src / cfep

File: [local] / OpenXM / src / cfep / MyDecoder.m (download)

Revision 1.1.1.1 (vendor branch), Fri Mar 3 23:31:12 2006 UTC (18 years, 2 months ago) by takayama
Branch: TAKAYAMA, MAIN
CVS Tags: R_1_3_1-2, RELEASE_1_3_1_13b, RELEASE_1_2_3_12, RELEASE_0_9, HEAD, DEB_REL_1_2_3-9
Changes since 1.1: +0 -0 lines

The initial release of cfep (cocoa front end view process for OpenXM engines).
It has been built and tested on Mac OS X 10.4 (tigers) and xcode 2.2.
The default engine is risa/asir.

//
//  MyDecoder.m
//  cfep
//
//  Created by Nobuki Takayama on 06/01/29.
//  Copyright 2006 OpenXM.org. All rights reserved.
//

#import "MyDecoder.h"


@implementation MyDecoder
-(void) dealloc {
  if (data) {[data autorelease];  data=nil;}
  [super dealloc];
}

-(NSString *)myDecoder: (int) c from: (id) myDocument {
  Byte b[1];
  NSString *s;
  // NSLog(@"state=%d\n",state);
  @synchronized(self) {
    switch(state) {
	case 0:
	  if (c == OX_PACKET_START)  {state = 1; channel=0;}
	  break;
    case 1:
	  if (c == OX_DATA_CMO_DATA_START) {
	    size = 0; state = 2;
	  }else if ((c < '0') || (c > '9')) { 
	    [self reportError: @"myDecoder: invalid channel.\n" to: myDocument];
		[self reset]; return nil;
	  } else { channel = channel*10+c-'0'; }
	  break;
	case 2:
	  if (c == OX_DATA_CMO_DATA_END_SIZE) {
	    state = 3;  
		if (size > MYDECODER_MAX) { 
		  [self reportError: @"myDecoder: too big size.\n" to: myDocument];
		  [self reset];
		  return nil;
		}  
		data = [NSMutableData dataWithCapacity: (size+1)]; [data retain];
	  }else if ((c < '0') || (c > '9')) { 
	    [self reportError: @"myDecoder: invalid size.\n" to: myDocument];
		[self reset]; return nil;
	  } else { size = size*10+c-'0'; }
	  break;
	case 3:
	  if (size <= 0) { 
	    state = 4;
		if (c != OX_DATA_CMO_DATA_END) {
		  [self reportError: @"myDecoder: unexpected end of ox_data_cmo_data.\n" to: myDocument];
		  [self reset];
		  return nil;
		} 
	  }	else {
        b[0] = c; 
	    [data appendBytes: b length: 1];
	    size--;
	  }	
	  break;
	case 4:
	  if (c != OX_PACKET_END) {
		  [self reportError: @"myDecoder: unexpected end of ox_packet.\n" to: myDocument];
		  [self reset];
		  return nil;
	  }else{
	    b[0] = 0; [data appendBytes: b length: 1];
	    s = [NSString stringWithCString: [data bytes] encoding: NSUTF8StringEncoding];
		[self reset];
		return s;
	  }
	  break;
	default:
	  [self reportError: @"myDecoder: unknown state.\n" to: myDocument]; [self reset]; 
	  break;	  
	}		
  }
  return nil;
}

-(int) getChannel {
  return channel;
}

-(void) reset {
  @synchronized(self) {
	state = 0;
	// NSLog(@"data retainCount=%d\n",[data retainCount]);   // --> 2.
	if (data) { [data autorelease]; data=nil;}
  }
}

-(void) reportError: (NSString *) msg to: (id) myDocument {
   [myDocument outputErrorString: msg];
   NSLog(@"data=%@",data);
}


@end