wbt_status wbt_bmtp2_on_pub(wbt_event_t *ev) { wbt_bmtp2_t *bmtp = ev->data; stream_id = 0; wbt_memset(&wbt_mq_parsed_msg, 0, sizeof(wbt_mq_parsed_msg)); if( wbt_bmtp2_param_parser(ev, wbt_bmtp2_on_pub_parser) != WBT_OK ) { if( stream_id ) { return wbt_bmtp2_send_puback(ev, stream_id, RET_INVALID_MESSAGE); } else { return WBT_OK; } } if( !wbt_mq_parsed_msg.consumer_id || !wbt_mq_parsed_msg.type || ( wbt_mq_parsed_msg.type != MSG_ACK && !bmtp->payload_length ) ) { if( stream_id ) { return wbt_bmtp2_send_puback(ev, stream_id, RET_INVALID_MESSAGE); } else { return WBT_OK; } } if( bmtp->role == BMTP_SERVER || bmtp->role == BMTP_SERVER_REPL ) { if( wbt_conf.master_host.len > 0 ) { // slave 模式下不可写消息 if( stream_id ) { return wbt_bmtp2_send_puback(ev, stream_id, RET_READ_ONLY_SLAVE); } else { return WBT_OK; } } wbt_mq_parsed_msg.msg_id = 0; } else if( bmtp->role == BMTP_CLIENT ) { if( wbt_mq_parsed_msg.msg_id == 0 ) { if( stream_id ) { return wbt_bmtp2_send_puback(ev, stream_id, RET_INVALID_MESSAGE); } else { return WBT_OK; } } wbt_mq_parsed_msg.create = 0; } wbt_mq_parsed_msg.data_len = bmtp->payload_length; wbt_mq_parsed_msg.data = wbt_strdup(bmtp->payload, bmtp->payload_length); wbt_status ret; if( wbt_mq_parsed_msg.is_lastwill ) { ret = wbt_mq_set_last_will(ev, &wbt_mq_parsed_msg); } else { ret = wbt_mq_push(ev, &wbt_mq_parsed_msg); } // wbt_mq_push 以及 wbt_mq_set_last_will 操作可能会失败,所以在这里释放一次 // 以免内存泄漏。 // 如果 data 被使用了,上述方法会将 data 置为 NULL 以防止数据被释放 wbt_free(wbt_mq_parsed_msg.data); wbt_mq_parsed_msg.data = NULL; if( stream_id != 0 ) { if( ret != WBT_OK ) { // TODO 需要返回更详细的错误原因 return wbt_bmtp2_send_puback(ev, stream_id, RET_PERMISSION_DENIED); } else { return wbt_bmtp2_send_puback(ev, stream_id, RET_OK); } } return WBT_OK; }
wbt_rbtree_node_t * wbt_rbtree_insert(wbt_rbtree_t *rbt, wbt_str_t *key) { wbt_rbtree_node_t *tmp_node, *tail_node; wbt_mem_t buf; wbt_str_t tmp_str; int ret; /* 创建一个新的节点 */ wbt_malloc(&buf, sizeof(wbt_rbtree_node_t)); wbt_memset(&buf, 0); tmp_node = (wbt_rbtree_node_t *)buf.ptr; wbt_malloc(&tmp_node->key, key->len+1); wbt_memcpy(&tmp_node->key, (wbt_mem_t *)key, key->len); *((char *)tmp_node->key.ptr+key->len) = '\0'; tmp_node->left = tmp_node->right = wbt_rbtree_node_nil; tmp_node->parent = wbt_rbtree_node_nil; tmp_node->color = WBT_RBT_COLOR_RED; if( rbt->root == wbt_rbtree_node_nil ) { rbt->root = tmp_node; } else { tail_node = rbt->root; while(1) { tmp_str.len = tail_node->key.len-1; tmp_str.str = tail_node->key.ptr; ret = wbt_strcmp2(key, &tmp_str); if( ret == 0 ) { /* 键值已经存在 */ return NULL; } else if( ret > 0 ) { if( tail_node->right != wbt_rbtree_node_nil ) { tail_node = tail_node->right; } else { /* 找到了插入位置 */ tail_node->right = tmp_node; tmp_node->parent = tail_node; break; } } else { if( tail_node->left != wbt_rbtree_node_nil ) { tail_node = tail_node->left; } else { /* 找到了插入位置 */ tail_node->left = tmp_node; tmp_node->parent = tail_node; break; } } } } /* 插入节点后需要调整 */ wbt_rbtree_insert_fixup( rbt, tmp_node ); rbt->size ++; wbt_log_debug("rbtree insert"); return tmp_node; }