int32_t vrs_send_layer_destroy(const uint8_t session_id, const uint8_t prio, const uint32_t node_id, const uint16_t layer_id) { struct Generic_Cmd *layer_destroy_cmd = v_layer_destroy_create(node_id, layer_id); return vc_send_command(session_id, prio, layer_destroy_cmd); }
/** * \brief This function send command layer_destroy to all followers of this * layer (all subscribers to parent node of this layer) * * When this layer has any child layer, then verse server will automatically * and recursively sends layer_destroy to all child layers of this layer. * * \param[in] *node The pointer at verse node * \param[in] *layer The pointer at verse layer */ int vs_layer_send_destroy(struct VSNode *node, struct VSLayer *layer) { struct VSLayer *child_layer; struct Generic_Cmd *layer_destroy_cmd; struct VSEntityFollower *layer_follower; int ret = 0; /* Send layer destroy to all child layers */ child_layer = layer->child_layers.first; while(child_layer != NULL) { child_layer->state = ENTITY_DELETING; vs_layer_send_destroy(node, child_layer); child_layer = child_layer->next; } layer_follower = layer->layer_folls.first; while(layer_follower != NULL) { if(layer_follower->state == ENTITY_CREATED) { /* Create TagGroup_Destroy command */ layer_destroy_cmd = v_layer_destroy_create(node->id, layer->id); /* Put this command to the outgoing queue */ if( layer_destroy_cmd != NULL && (v_out_queue_push_tail(layer_follower->node_sub->session->out_queue, layer_follower->node_sub->prio, layer_destroy_cmd) == 1)) { layer_follower->state = ENTITY_DELETING; ret = 1; } else { v_print_log(VRS_PRINT_DEBUG_MSG, "Layer_Destroy (node_id: %d, layer_id: %d) wasn't added to the queue\n", node->id, layer->id); } } else { v_print_log(VRS_PRINT_DEBUG_MSG, "node_id: %d, layer_id: %d, layer is not in CREATED state (current state: %d)\n", node->id, layer->id, layer_follower->state); } layer_follower = layer_follower->next; } return ret; }
/** * \brief This function is called, when client acknowledge receiving of * layer_create command */ int vs_handle_layer_create_ack(struct VS_CTX *vs_ctx, struct VSession *vsession, struct Generic_Cmd *cmd) { struct VSNode *node; struct VSLayer *layer; struct VSEntityFollower *layer_foll; struct Layer_Create_Ack_Cmd *layer_create_cmd_ack = (struct Layer_Create_Ack_Cmd*)cmd; int all_created = 1; /* Try to find node */ if((node = vs_node_find(vs_ctx, layer_create_cmd_ack->node_id)) == NULL) { v_print_log(VRS_PRINT_DEBUG_MSG, "%s() node (id: %d) not found\n", __FUNCTION__, layer_create_cmd_ack->node_id); return 0; } /* Try to find layer */ if( (layer = vs_layer_find(node, layer_create_cmd_ack->layer_id)) == NULL) { v_print_log(VRS_PRINT_DEBUG_MSG, "%s() layer (id: %d) in node (id: %d) not found\n", __FUNCTION__, layer_create_cmd_ack->layer_id, layer_create_cmd_ack->node_id); return 0; } for(layer_foll = layer->layer_folls.first; layer_foll != NULL; layer_foll = layer_foll->next) { if(layer_foll->node_sub->session->session_id == vsession->session_id) { /* Switch from state CREATING to state CREATED */ if(layer_foll->state == ENTITY_CREATING) { layer_foll->state = ENTITY_CREATED; } /* If the layer is in the state DELETING, then it is possible * now to sent layer_destroy command to the client, because * the client knows about this layer now */ if(layer->state == ENTITY_DELETING) { struct Generic_Cmd *layer_destroy_cmd = v_layer_destroy_create(node->id, layer->id); /* Push this command to the outgoing queue */ if ( layer_destroy_cmd!= NULL && v_out_queue_push_tail(layer_foll->node_sub->session->out_queue, layer_foll->node_sub->prio, layer_destroy_cmd) == 1) { layer_foll->state = ENTITY_DELETING; } else { v_print_log(VRS_PRINT_DEBUG_MSG, "layer_destroy (node_id: %d, layer_id: %d) wasn't added to the queue\n", node->id, layer->id); } } else { if(layer_foll->state != ENTITY_CREATED) { all_created = 0; } } } } if(all_created == 1) { layer->state = ENTITY_CREATED; } return 0; }