// MARK: Dispatcher uint16_t att_handle_request(att_connection_t * att_connection, uint8_t * request_buffer, uint16_t request_len, uint8_t * response_buffer){ uint16_t response_len = 0; uint16_t response_buffer_size = att_connection->mtu; switch (request_buffer[0]){ case ATT_EXCHANGE_MTU_REQUEST: response_len = handle_exchange_mtu_request(att_connection, request_buffer, request_len, response_buffer); break; case ATT_FIND_INFORMATION_REQUEST: response_len = handle_find_information_request(att_connection, request_buffer, request_len,response_buffer, response_buffer_size); break; case ATT_FIND_BY_TYPE_VALUE_REQUEST: response_len = handle_find_by_type_value_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size); break; case ATT_READ_BY_TYPE_REQUEST: response_len = handle_read_by_type_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size); break; case ATT_READ_REQUEST: response_len = handle_read_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size); break; case ATT_READ_BLOB_REQUEST: response_len = handle_read_blob_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size); break; case ATT_READ_MULTIPLE_REQUEST: response_len = handle_read_multiple_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size); break; case ATT_READ_BY_GROUP_TYPE_REQUEST: response_len = handle_read_by_group_type_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size); break; case ATT_WRITE_REQUEST: response_len = handle_write_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size); break; case ATT_PREPARE_WRITE_REQUEST: response_len = handle_prepare_write_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size); break; case ATT_EXECUTE_WRITE_REQUEST: response_len = handle_execute_write_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size); break; case ATT_WRITE_COMMAND: handle_write_command(att_connection, request_buffer, request_len, response_buffer, response_buffer_size); break; case ATT_SIGNED_WRITE_COMMAND: log_info("handle_signed_write_command preprocessed by att_server.c"); break; default: log_info("Unhandled ATT Command: %02X, DATA: ", request_buffer[0]); hexdump(&request_buffer[9], request_len-9); break; } return response_len; }
/** * This is the will be the entry point to your text editor. */ int main(int argc, char *argv[]) { // Checking to see if the editor is being used correctly. if (argc != 2) { print_usage_error(); return 1; } // Setting up a docment based on the file named 'filename'. char *filename = get_filename(argc, argv); Document *document = Document_create_from_file(filename); // Buffer for the command and length of said buffer char *command = NULL; size_t len = 0; // This while loop will keep reading from stdin one line at a time // until the user enters 'q' (the quit command). int done = 0; while (!done) { getline(&command, &len, stdin); int command_type; // remove newline from the command char *nl = strchr(command, '\n'); if (nl) *nl = 0; int stringlen = strlen(command); // if 'q' or 's' is first character only 'q' or 's' is allowed as valid // command if ((command[0] == 'q' || command[0] == 's') && stringlen != 1) { command_type = -1; } else { command_type = command[0]; } switch (command_type) { case 'p': handle_display_command(document, command); break; case 'w': handle_write_command(document, command); break; case 'a': handle_append_command(document, command); break; case 'd': handle_delete_command(document, command); break; case '/': handle_search_command(document, command); break; case 's': if (strlen(command) == 1) { handle_save_command(document, filename); } else { invalid_command(command); } break; case 'q': done = 1; Document_destroy(document); break; default: invalid_command(command); break; } } // Need to free the buffer that we created. if (command) { free(command); } }