//  Copyright (c) 2001, Reson, Inc. All Rights Reserved.
//
//  Filename:   EdgeTechMessage.h
//
//  Project:    6046
//
//  Author(s):  W. Arcus
//
//  Purpose:    Provides the edgetech system definitions to interface to the FS-AU sonar
//              and the message handler helper class CEdgeTechMessage.
//
//  Notes:      Nil.
//

#if !defined(AFX_EDGETECHMESSAGE_H__7E09BC72_0D48_4C00_93FA_2810FD7481F8__INCLUDED_)
#define AFX_EDGETECHMESSAGE_H__7E09BC72_0D48_4C00_93FA_2810FD7481F8__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "EdgeTechHeaders.h"

class CEdgeTechMessage
{
public:

    ///////////////
    // Services.

    // Encoding



                        CEdgeTechMessage        (   unsigned short          unMessage       = SONAR_MESSAGE_NONE,
                                                    unsigned char           ucCommand       = SONAR_COMMAND_GET,
                                                    unsigned char           ucSessionID     = 0,
                                                    unsigned char           ucSubSystem     = 0,
                                                    unsigned char           ucChannel       = 0 );

    bool                SetHeader               (   unsigned short          unMessage       = SONAR_MESSAGE_NONE,
                                                    unsigned char           ucCommand       = SONAR_COMMAND_GET,
                                                    unsigned char           ucSessionID     = 0,
                                                    unsigned char           ucSubSystem     = 0,
                                                    unsigned char           ucChannel       = 0 );
 
    bool                SetMessage              (   unsigned short          unMessage        = SONAR_MESSAGE_NONE,
                                                    unsigned char           ucCommand        = SONAR_COMMAND_GET,
                                                    BYTE                   *pbyMessage       = NULL,
                                                    unsigned long           ulBytesInMessage = 0,
                                                    unsigned char           ucSessionID      = 0,
                                                    unsigned char           ucSubSystem      = 0,
                                                    unsigned char           ucChannel        = 0 );

    // Decoding

                        CEdgeTechMessage        (   SonarMessageHeaderType *pHeader );

    bool                SetHeader               (   SonarMessageHeaderType *pHeader );

    // Destruction.

    virtual            ~CEdgeTechMessage        (   void );

    // Copy and assignment.
                                                
                        CEdgeTechMessage        (   const CEdgeTechMessage &rRhs );
    CEdgeTechMessage &  operator =              (   const CEdgeTechMessage &rRhs );

                                               
    static
    unsigned long       HeaderSize              (   void );

    // Conversion operators for the message data itself.

    unsigned long       MessageSize             (   void ) const;
    BYTE *              Message                 (   void ) const;

    unsigned short      SonarMessage            (   void ) const;
    unsigned char       SonarCommand            (   void ) const;
    unsigned char       Subsystem               (   void ) const;

    operator            SonarMessageHeaderType *                ( void ) const;
    operator            SonarMessageStatusType *                ( void ) const;
    operator            TimestampType *                         ( void ) const;
    operator            SonarMessagePingType *                  ( void ) const;
    operator            SonarMessageWindowType *                ( void ) const;
    operator            SonarMessageFishType *                  ( void ) const;
    operator            SegyDataType *                          ( void ) const;
    operator            SidescanHeaderType *                    ( void ) const;
    operator            SonarMessageCouplingParametersType *    ( void ) const;
    operator            char *                                  ( void ) const;
                        
    operator            long                                    ( void ) const;
    operator            unsigned long                           ( void ) const;

private:

    ///////////////
    // Definitions.

    class CBufferManager
    {
    public:

                        CBufferManager  (   void );
                        CBufferManager  (   const CBufferManager   &rRhs );

        virtual        ~CBufferManager  (   void );

        CBufferManager & operator =     (   const CBufferManager   &rRhs );

        bool            SetBuffer       (   BYTE                   *pbyBuffer,
                                            const unsigned long    &rulMaxSize,
                                            const bool             &rbAllocate = false );

        BYTE *          GetMessage      (   void );

        unsigned long   MessageSize     (   void ) const;

    private:

        void            Release         (   void );

        BYTE                   *m_pbyBuffer;
        unsigned long           m_ulBufferSize;
        bool                    m_bIsOwner;
    };

    ///////////////
    // Attributes.

    const unsigned long             m_ulMessageHeaderSize;
    const unsigned long             m_ulMaxMessageLength;

    std::auto_ptr<CBufferManager>   m_pMessageBuffer;

    BYTE *              OptionalData    (   void ) const;

};

#endif // !defined(AFX_EDGETECHMESSAGE_H__7E09BC72_0D48_4C00_93FA_2810FD7481F8__INCLUDED_)
