/*****************************************************************************
 函 数 名  : mailbox_read_channel
 接口类型  : 对内接口
 功能描述  : 邮箱共享内存通道接受到新数据的处理回调函数.
 输入参数  : unsigned long channel_id -- 邮箱通道号
 输出参数  : 无
 返 回 值  : 无
 调用函数  : mailbox_receive_all_mails()
 被调函数  :

 修改历史      :
  1.日    期   : 2012年9月24日
    作    者   : 莫南 00176101
    修改内容   : 新生成函数

*****************************************************************************/
MAILBOX_LOCAL long mailbox_read_channel(unsigned long channel_id)
{
    struct mb_buff      *mbuf  = MAILBOX_NULL;     /*邮箱操作句柄*/
    struct mb           *mb    = MAILBOX_NULL;
    unsigned long       ret_val      = MAILBOX_OK;

    mb = mailbox_get_mb();

    if (MAILBOX_NULL == mb) {
        return (unsigned long)MAILBOX_ERRO;
    }

    /*判断方向是否正确,是否为接收通道*/
    if (mb->local_id != mailbox_get_dst_id(channel_id)) {
        return mailbox_logerro_p1(MAILBOX_ERR_GUT_INVALID_TARGET_CPU, channel_id);
    }

    /*打开此邮箱通道*/
    ret_val = mailbox_request_channel(mb, &mbuf, channel_id);
    if (MAILBOX_OK != ret_val) {
        return ret_val;
    }

    /*接收此邮箱通道的所有邮件*/
    ret_val = mailbox_receive_all_mails(mbuf);

    mailbox_flush_buff(mbuf); /*把邮箱通道操作符的信息写回邮箱头。*/

    /*接收完成,关闭邮箱*/
    if (MAILBOX_OK != mailbox_release_channel(mb, mbuf)) {
        return mailbox_logerro_p1(MAILBOX_ERR_GUT_RELEASE_CHANNEL, channel_id);
    }

    return ret_val;
}
/*封信,准备发送*/
MAILBOX_EXTERN int mailbox_sealup_buff(struct mb_buff * mb_buf , unsigned int usr_size)
{

    struct mb_mail        mail = {0};
    struct mb_queue      *m_queue   = MAILBOX_NULL;
    unsigned int         time_stamp;
    unsigned long         mail_addr;

    m_queue = &mb_buf->mail_queue;

    /*判断是否超过单次发送最大大小*/
    if (usr_size > (mb_buf->config->single_max - sizeof(struct mb_mail) )){
        return (int) mailbox_logerro_p2(MAILBOX_ERR_GUT_WRITE_EXCEED_MAX_SIZE,
            usr_size ,mb_buf->mailcode);
    } else {
    }

    time_stamp = (unsigned int)mailbox_get_timestamp();
    /*填充消息头*/
    mail.ulPartition   =  MAILBOX_MSGHEAD_NUMBER;
    mail.ulWriteSlice  =  time_stamp;
    mail.ulReadSlice   =  0;
    mail.ulPriority    =  0;/*此属性和OM核对已废弃,不使用*/
    mail.ulSeqNum      =  mb_buf->seq_num;
    mail.ulMsgLength   =  usr_size ;
    mail.ulMailCode    =  mb_buf->mailcode;

    if (MAILBOX_SEQNUM_START == mb_buf->seq_num) {
        (void)mailbox_logerro_p1(MAILBOX_INFO_SEND_FIRST_MAIL, mb_buf->mailcode);
    }

    mb_buf->seq_num++;

    /*向邮箱队列中写入邮件头,并更新队列状态记录临时结构体*/
    mail_addr = m_queue->front;
    (void)mailbox_queue_write(m_queue, (char*)(&mail), sizeof(struct mb_mail));

    /*更新邮箱环形缓存信息*/
    m_queue->front = mailbox_align_size(mb_buf->usr_queue.front, MAILBOX_ALIGN);

    (void)mailbox_flush_buff(mb_buf); /*把邮箱通道操作符的信息写回邮箱头。*/

#ifdef MAILBOX_OPEN_MNTN
    mailbox_record_send(&(mb_buf->mntn), mb_buf->mailcode, time_stamp, mail_addr);
#endif

    /*准备下一封邮件写入*/
    return mailbox_init_usr_queue(mb_buf);
}