extern c_bool
__$(uniquetypename)__copyIn(
    c_base base,
    struct $(scopedtypename) *from,
    struct _$(uniquetypename) *to);

extern void
__$(uniquetypename)__copyOut(
    void *_from,
    void *_to);

// DDS $(scopedtypename) TypeSupportFactory Object Body

$(DLL_IMPORTEXPORT) DDS::DataWriter_ptr 
$(scopedtypename)TypeSupportFactory::create_datawriter (gapi_dataWriter handle)
{
    return new $(scopedtypename)DataWriter_impl(handle);
}

$(DLL_IMPORTEXPORT) DDS::DataReader_ptr 
$(scopedtypename)TypeSupportFactory::create_datareader (gapi_dataReader handle)
{
    return new $(scopedtypename)DataReader_impl (handle);
}

// DDS $(scopedtypename) TypeSupport Object Body

$(DLL_IMPORTEXPORT) $(scopedtypename)TypeSupport::$(typename)TypeSupport(void) :
    TypeSupport_impl(
        __$(uniquetypename)__name(),
        __$(uniquetypename)__keys(),
        $(scopedtypename)TypeSupport::metaDescriptor,
        (gapi_copyIn) __$(uniquetypename)__copyIn,
        (gapi_copyOut) __$(uniquetypename)__copyOut,
        (gapi_readerCopy) DDS::ccpp_DataReaderCopy<$(scopedtypename)Seq, $(scopedtypename)>,
        new  $(scopedtypename)TypeSupportFactory())
{
    // Parent constructor takes care of everything.
}

$(DLL_IMPORTEXPORT) $(scopedtypename)TypeSupport::~$(typename)TypeSupport(void)
{
    // Parent destructor takes care of everything.
}

$(DLL_IMPORTEXPORT) DDS::ReturnCode_t
$(scopedtypename)TypeSupport::register_type(
    DDS::DomainParticipant_ptr domain,
    const char * type_name) THROW_ORB_EXCEPTIONS
{
    return TypeSupport_impl::register_type(domain, type_name);
}

$(DLL_IMPORTEXPORT) char *
$(scopedtypename)TypeSupport::get_type_name() THROW_ORB_EXCEPTIONS
{
    return TypeSupport_impl::get_type_name();
}

// DDS $(scopedtypename) DataWriter_impl Object Body

$(DLL_IMPORTEXPORT) $(scopedtypename)DataWriter_impl::$(typename)DataWriter_impl (
    gapi_dataWriter handle
) : DDS::DataWriter_impl(handle)
{
    // Parent constructor takes care of everything.
}

$(DLL_IMPORTEXPORT) $(scopedtypename)DataWriter_impl::~$(typename)DataWriter_impl(void)
{
    // Parent destructor takes care of everything.
}

$(DLL_IMPORTEXPORT) DDS::InstanceHandle_t
$(scopedtypename)DataWriter_impl::register_instance(
    const $(scopedtypename) & instance_data) THROW_ORB_EXCEPTIONS
{
    return DataWriter_impl::register_instance(&instance_data);
}

$(DLL_IMPORTEXPORT) DDS::InstanceHandle_t 
$(scopedtypename)DataWriter_impl::register_instance_w_timestamp(
    const $(typename) & instance_data,
    const DDS::Time_t & source_timestamp) THROW_ORB_EXCEPTIONS
{
    return DataWriter_impl::register_instance_w_timestamp(&instance_data, source_timestamp);
}

$(DLL_IMPORTEXPORT) DDS::ReturnCode_t
$(scopedtypename)DataWriter_impl::unregister_instance(
    const $(scopedtypename) & instance_data,
    DDS::InstanceHandle_t handle) THROW_ORB_EXCEPTIONS
{
    return DataWriter_impl::unregister_instance(&instance_data, handle);
}

$(DLL_IMPORTEXPORT) DDS::ReturnCode_t 
$(scopedtypename)DataWriter_impl::unregister_instance_w_timestamp(
    const $(typename) & instance_data,
    DDS::InstanceHandle_t handle,
    const DDS::Time_t & source_timestamp) THROW_ORB_EXCEPTIONS
{
    return DataWriter_impl::unregister_instance_w_timestamp(&instance_data, handle, source_timestamp);
}

$(DLL_IMPORTEXPORT) DDS::ReturnCode_t
$(scopedtypename)DataWriter_impl::write(
    const $(scopedtypename) & instance_data,
    DDS::InstanceHandle_t handle) THROW_ORB_EXCEPTIONS
{
    return DataWriter_impl::write(&instance_data, handle);
}

$(DLL_IMPORTEXPORT) DDS::ReturnCode_t
$(scopedtypename)DataWriter_impl::write_w_timestamp(
    const $(typename) & instance_data,
    DDS::InstanceHandle_t handle,
    const DDS::Time_t & source_timestamp) THROW_ORB_EXCEPTIONS
{
    return DataWriter_impl::write_w_timestamp(&instance_data, handle, source_timestamp);
}

$(DLL_IMPORTEXPORT) DDS::ReturnCode_t
$(scopedtypename)DataWriter_impl::dispose(
    const $(scopedtypename) & instance_data,
    DDS::InstanceHandle_t handle) THROW_ORB_EXCEPTIONS
{
    return DataWriter_impl::dispose(&instance_data, handle);
}

$(DLL_IMPORTEXPORT) DDS::ReturnCode_t 
$(scopedtypename)DataWriter_impl::dispose_w_timestamp(
    const $(typename) & instance_data,
    DDS::InstanceHandle_t handle,
    const DDS::Time_t & source_timestamp) THROW_ORB_EXCEPTIONS
{
    return DataWriter_impl::dispose_w_timestamp(&instance_data, handle, source_timestamp);
}

$(DLL_IMPORTEXPORT) DDS::ReturnCode_t
$(scopedtypename)DataWriter_impl::writedispose(
    const $(scopedtypename) & instance_data,
    DDS::InstanceHandle_t handle) THROW_ORB_EXCEPTIONS
{
    return DataWriter_impl::writedispose(&instance_data, handle);
}

$(DLL_IMPORTEXPORT) DDS::ReturnCode_t
$(scopedtypename)DataWriter_impl::writedispose_w_timestamp(
    const $(typename) & instance_data,
    DDS::InstanceHandle_t handle,
    const DDS::Time_t & source_timestamp) THROW_ORB_EXCEPTIONS
{
    return DataWriter_impl::writedispose_w_timestamp(&instance_data, handle, source_timestamp);
}

$(DLL_IMPORTEXPORT) DDS::ReturnCode_t 
$(scopedtypename)DataWriter_impl::get_key_value(
    $(typename) & key_holder,
    DDS::InstanceHandle_t handle) THROW_ORB_EXCEPTIONS
{
    return DataWriter_impl::get_key_value(&key_holder, handle);
}

$(DLL_IMPORTEXPORT) DDS::InstanceHandle_t 
$(scopedtypename)DataWriter_impl::lookup_instance(
	const $(scopedtypename) & instance_data) THROW_ORB_EXCEPTIONS
{
    return DataWriter_impl::lookup_instance(&instance_data);
}

// DDS $(scopedtypename) DataReader_impl Object Body

$(DLL_IMPORTEXPORT) $(scopedtypename)DataReader_impl::$(typename)DataReader_impl (
    gapi_dataReader handle
) : DDS::DataReader_impl(handle)
{
    // Parent constructor takes care of everything.
}

$(DLL_IMPORTEXPORT) $(scopedtypename)DataReader_impl::~$(typename)DataReader_impl(void)
{
    // Parent destructor takes care of everything.
}


$(DLL_IMPORTEXPORT) DDS::ReturnCode_t
$(scopedtypename)DataReader_impl::read(
    $(scopedtypename)Seq & received_data,
    DDS::SampleInfoSeq & info_seq,
    CORBA::Long max_samples,
    DDS::SampleStateMask sample_states,
    DDS::ViewStateMask view_states,
    DDS::InstanceStateMask instance_states) THROW_ORB_EXCEPTIONS
{
    DDS::ReturnCode_t status;
    
    status = check_preconditions(received_data, info_seq, max_samples);
    if ( status == DDS::RETCODE_OK ) {
        status = DataReader_impl::read(&received_data, info_seq, max_samples, sample_states, view_states, instance_states);
    }
    return status;
}

$(DLL_IMPORTEXPORT) DDS::ReturnCode_t
$(scopedtypename)DataReader_impl::take(
    $(scopedtypename)Seq & received_data,
    DDS::SampleInfoSeq & info_seq,
    CORBA::Long max_samples,
    DDS::SampleStateMask sample_states,
    DDS::ViewStateMask view_states,
    DDS::InstanceStateMask instance_states) THROW_ORB_EXCEPTIONS
{
    DDS::ReturnCode_t status;
    
    status = check_preconditions(received_data, info_seq, max_samples);
    if ( status == DDS::RETCODE_OK ) {
        status = DataReader_impl::take(&received_data, info_seq, max_samples, sample_states, view_states, instance_states);
    }
    return status;
}

$(DLL_IMPORTEXPORT) DDS::ReturnCode_t
$(scopedtypename)DataReader_impl::read_w_condition(
    $(scopedtypename)Seq & received_data,
    DDS::SampleInfoSeq & info_seq,
    CORBA::Long max_samples,
    DDS::ReadCondition_ptr a_condition) THROW_ORB_EXCEPTIONS
{
    DDS::ReturnCode_t status;
    
    status = check_preconditions(received_data, info_seq, max_samples);
    if ( status == DDS::RETCODE_OK ) {
        status = DataReader_impl::read_w_condition(&received_data, info_seq, max_samples, a_condition);
    }
    return status;
}

$(DLL_IMPORTEXPORT) DDS::ReturnCode_t
$(scopedtypename)DataReader_impl::take_w_condition(
    $(scopedtypename)Seq & received_data,
    DDS::SampleInfoSeq & info_seq,
    CORBA::Long max_samples,
    DDS::ReadCondition_ptr a_condition) THROW_ORB_EXCEPTIONS
{
    DDS::ReturnCode_t status;
    
    status = check_preconditions(received_data, info_seq, max_samples);
    if ( status == DDS::RETCODE_OK ) {
        status = DataReader_impl::take_w_condition(&received_data, info_seq, max_samples, a_condition);
    }
    return status;
}


$(DLL_IMPORTEXPORT) DDS::ReturnCode_t 
$(scopedtypename)DataReader_impl::read_next_sample(
    $(scopedtypename) & received_data,
    DDS::SampleInfo & sample_info) THROW_ORB_EXCEPTIONS
{
    return DataReader_impl::read_next_sample(&received_data, sample_info);
}


$(DLL_IMPORTEXPORT) DDS::ReturnCode_t 
$(scopedtypename)DataReader_impl::take_next_sample(
    $(scopedtypename) & received_data,
    DDS::SampleInfo & sample_info) THROW_ORB_EXCEPTIONS
{
    return DataReader_impl::take_next_sample(&received_data, sample_info);
}


$(DLL_IMPORTEXPORT) DDS::ReturnCode_t
$(scopedtypename)DataReader_impl::read_instance(
    $(scopedtypename)Seq & received_data,
    DDS::SampleInfoSeq & info_seq,
    CORBA::Long max_samples,
    DDS::InstanceHandle_t a_handle,
    DDS::SampleStateMask sample_states,
    DDS::ViewStateMask view_states,
    DDS::InstanceStateMask instance_states) THROW_ORB_EXCEPTIONS
{
    DDS::ReturnCode_t status;
    
    status = check_preconditions(received_data, info_seq, max_samples);
    if ( status == DDS::RETCODE_OK ) {
        status = DataReader_impl::read_instance(&received_data, info_seq, max_samples, a_handle, sample_states, view_states, instance_states);
    }
    return status;
}

$(DLL_IMPORTEXPORT) DDS::ReturnCode_t
$(scopedtypename)DataReader_impl::take_instance(
    $(scopedtypename)Seq & received_data,
    DDS::SampleInfoSeq & info_seq,
    CORBA::Long max_samples,
    DDS::InstanceHandle_t a_handle,
    DDS::SampleStateMask sample_states,
    DDS::ViewStateMask view_states,
    DDS::InstanceStateMask instance_states) THROW_ORB_EXCEPTIONS
{
    DDS::ReturnCode_t status;
    
    status = check_preconditions(received_data, info_seq, max_samples);
    if ( status == DDS::RETCODE_OK ) {
        status = DataReader_impl::take_instance(&received_data, info_seq, max_samples, a_handle, sample_states, view_states, instance_states);
    }
    return status;
}

$(DLL_IMPORTEXPORT) DDS::ReturnCode_t
$(scopedtypename)DataReader_impl::read_next_instance(
    $(scopedtypename)Seq & received_data,
    DDS::SampleInfoSeq & info_seq,
    CORBA::Long max_samples,
    DDS::InstanceHandle_t a_handle,
    DDS::SampleStateMask sample_states,
    DDS::ViewStateMask view_states,
    DDS::InstanceStateMask instance_states) THROW_ORB_EXCEPTIONS
{
    DDS::ReturnCode_t status;
    
    status = check_preconditions(received_data, info_seq, max_samples);
    if ( status == DDS::RETCODE_OK ) {
        status = DataReader_impl::read_next_instance(&received_data, info_seq, max_samples, a_handle, sample_states, view_states, instance_states);
    }
    return status;
}

$(DLL_IMPORTEXPORT) DDS::ReturnCode_t
$(scopedtypename)DataReader_impl::take_next_instance(
    $(scopedtypename)Seq & received_data,
    DDS::SampleInfoSeq & info_seq,
    CORBA::Long max_samples,
    DDS::InstanceHandle_t a_handle,
    DDS::SampleStateMask sample_states,
    DDS::ViewStateMask view_states,
    DDS::InstanceStateMask instance_states) THROW_ORB_EXCEPTIONS
{
    DDS::ReturnCode_t status;
    
    status = check_preconditions(received_data, info_seq, max_samples);
    if ( status == DDS::RETCODE_OK ) {
        status = DataReader_impl::take_next_instance(&received_data, info_seq, max_samples, a_handle, sample_states, view_states, instance_states);
    }
    return status;
}


$(DLL_IMPORTEXPORT) DDS::ReturnCode_t 
$(scopedtypename)DataReader_impl::read_next_instance_w_condition(
    $(scopedtypename)Seq & received_data,
    DDS::SampleInfoSeq & info_seq,
    CORBA::Long max_samples,
    DDS::InstanceHandle_t a_handle,
    DDS::ReadCondition_ptr a_condition) THROW_ORB_EXCEPTIONS
{
    DDS::ReturnCode_t status;
    
    status = check_preconditions(received_data, info_seq, max_samples);
    if ( status == DDS::RETCODE_OK ) {
        status = DataReader_impl::read_next_instance_w_condition(&received_data, info_seq, max_samples, a_handle, a_condition);
    }
    return status;
}


$(DLL_IMPORTEXPORT) DDS::ReturnCode_t 
$(scopedtypename)DataReader_impl::take_next_instance_w_condition(
    $(scopedtypename)Seq & received_data,
    DDS::SampleInfoSeq & info_seq,
    CORBA::Long max_samples,
    DDS::InstanceHandle_t a_handle,
    DDS::ReadCondition_ptr a_condition) THROW_ORB_EXCEPTIONS
{
    DDS::ReturnCode_t status;
    
    status = check_preconditions(received_data, info_seq, max_samples);
    if ( status == DDS::RETCODE_OK ) {
        status = DataReader_impl::take_next_instance_w_condition(&received_data, info_seq, max_samples, a_handle, a_condition);
    }
    return status;
}


$(DLL_IMPORTEXPORT) DDS::ReturnCode_t
$(scopedtypename)DataReader_impl::return_loan(
    $(scopedtypename)Seq & received_data,
    DDS::SampleInfoSeq & info_seq) THROW_ORB_EXCEPTIONS
{
    DDS::ReturnCode_t status = DDS::RETCODE_OK;

    if ( received_data.length() > 0 ) {
        if (received_data.length() == info_seq.length() && 
            received_data.release() == info_seq.release() ) {
            if (!received_data.release()) {
                status = DataReader_impl::return_loan( received_data.get_buffer(),
                                                       info_seq.get_buffer() );

                if ( status == DDS::RETCODE_OK ) {
                    if ( !received_data.release() ) {
                        $(scopedtypename)Seq::freebuf( received_data.get_buffer(false) );
                        received_data.replace(0, 0, NULL, false);
                        DDS::SampleInfoSeq::freebuf( info_seq.get_buffer(false) );
                        info_seq.replace(0, 0, NULL, false);
                    }
                } else if ( status == DDS::RETCODE_NO_DATA ) {
                    if ( received_data.release() ) {
                        status = DDS::RETCODE_OK;
                    } else {
                        status = DDS::RETCODE_PRECONDITION_NOT_MET;
                    }
                }
            }
        } else {
            status = DDS::RETCODE_PRECONDITION_NOT_MET;
        }
    }
    return status;
}


$(DLL_IMPORTEXPORT) DDS::ReturnCode_t 
$(scopedtypename)DataReader_impl::get_key_value(
    $(scopedtypename) & key_holder,
    DDS::InstanceHandle_t handle) THROW_ORB_EXCEPTIONS
{
    return DataReader_impl::get_key_value(&key_holder, handle);
}

$(DLL_IMPORTEXPORT) DDS::InstanceHandle_t 
$(scopedtypename)DataReader_impl::lookup_instance(
    const $(scopedtypename) & instance) THROW_ORB_EXCEPTIONS
{
    return DataReader_impl::lookup_instance(&instance);
}

$(DLL_IMPORTEXPORT) DDS::ReturnCode_t 
$(scopedtypename)DataReader_impl::check_preconditions(
    $(scopedtypename)Seq & received_data,
    DDS::SampleInfoSeq & info_seq,
    CORBA::Long max_samples)
{
    DDS::ReturnCode_t status = DDS::RETCODE_PRECONDITION_NOT_MET;
    
    if ( received_data.length() == info_seq.length() &&
         received_data.maximum() == info_seq.maximum() &&
         received_data.release() == info_seq.release() ) {
        if ( received_data.maximum() == 0 || received_data.release() ) {
            if (received_data.maximum() == 0 ||
				max_samples <= static_cast<CORBA::Long>(received_data.maximum()) ||
				max_samples == DDS::LENGTH_UNLIMITED ) {
                status = DDS::RETCODE_OK;
            }
        }
    }
    return status;
}
