/*
 
 ArdOSC 2.1 - OSC Library for Arduino.
 
 -------- Lisence -----------------------------------------------------------
 
 ArdOSC
 
 The MIT License
 
 Copyright (c) 2009 - 2011 recotana( http://recotana.com ) All right reserved
 
 */




#ifndef OSCMessage_h
#define OSCMessage_h


#include "OSCcommon.h"
#include "OSCArg.h"

#define kTagInt32   'i'
#define kTagFloat   'f'
#define kTagString  's'
#define kTagBlob    'b'

#define kTagMidi    'm'
#define kTagRgba    'r'

#define kTagTrue    'T'
#define kTagFalse   'F'

class OSCMessage{
	
private:

	char	   *_oscAddress;	
	uint16_t	_oscAdrSize;
	uint16_t	_oscAdrAlignmentSize;
    
    
	uint16_t	_typeTagAlignmentSize;
    uint16_t	_argsAlignmentSize;
	
	uint16_t	_argsNum;

    OSCArg *    _args[kMaxAugument];

 
    uint16_t getMessageSize(void);
    uint16_t getArgAlignmentSize(uint8_t _index);
  
    int16_t setArgData( char _type , void *_value , uint8_t _byte,  bool _enableAlignment );
    void swap(uint8_t *data1, uint8_t *data2);
//    void get4ByteData(int16_t _index , uint8_t *_data);

public:

	OSCMessage(void);
	OSCMessage(const char *_oscAddr);
    
	~OSCMessage(void);
    

	void flush(void);
		
	int16_t setOSCAddress(const char *_addr);
	char *  getOSCAddress(void);


    int16_t beginMessage( const char *_addr);

    int16_t getArgsNum(void);
    char    getArgTypeTag(int16_t _index);
    
	int16_t addArgInt32(int32_t _value);
    int32_t getArgInt32(int16_t _index);

#ifdef _USE_FLOAT_
    int16_t addArgFloat(float _value);
    float   getArgFloat(int16_t _index);
#endif

#ifdef _USE_STRING_
    int16_t addArgString(const char* _value);
	char* getArgStringData(int16_t _index );	///< get a pointer to the dataof argument [index]. use together with getArgStringSize();
    int16_t getArgString(int16_t _index, char *_rcvstr);
    int16_t getArgStringSize(int16_t _index);

#endif

  	
	friend class OSCServer;
	friend class OSCClient;
	friend class OSCDecoder;
	friend class OSCEncoder;
    friend class Pattern;
	friend class OscMessageSink;
	
};


#endif