/*获取一个邮箱物理通道buff*/
MAILBOX_EXTERN long mailbox_request_buff(unsigned long mailcode,  struct mb_buff** mb_buf)
{
    struct mb        *mailbox     = MAILBOX_NULL;
    unsigned long     ret_val       = MAILBOX_OK;
    struct mb_buff ** mbuf  = (struct mb_buff **)mb_buf;

    mailbox     = mailbox_get_mb();
    *mbuf = MAILBOX_NULL;
    if (MAILBOX_NULL == mailbox){
        return mailbox_logerro_p1(MAILBOX_ERR_GUT_INPUT_PARAMETER, mailcode);
    }

    /*检查是否为发送通道*/
    if (mailbox->local_id != mailbox_get_src_id(mailcode)){
        return mailbox_logerro_p1(MAILBOX_ERR_GUT_INVALID_SRC_CPU, mailcode);
    }

    /*获得此邮件邮箱通道的操作句柄: open mail*/
    ret_val = mailbox_request_channel(mailbox, mbuf, mailcode);
    if (MAILBOX_OK == ret_val){
        (*mbuf)->mb = mailbox;
        ret_val = mailbox_init_usr_queue(*mbuf);
        if (MAILBOX_OK == ret_val) {
            return  MAILBOX_OK;
        } else {
            mailbox_release_channel(mailbox, *mbuf);
            *mbuf = MAILBOX_NULL;
            return ret_val;
        }
    } else {
        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);
}