Пример #1
0
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);
}
Пример #2
0
/**
 * \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;
}
Пример #3
0
/**
 * \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;
}