Example #1
0
static void wr_msg_341(wi_array_t *arguments) {
	wi_date_t		*date;
	wr_chat_t		*chat;
	wr_window_t		*window;
	wr_cid_t		cid;

	cid = wi_string_uint32(WI_ARRAY(arguments, 0));
	chat = wr_chats_chat_with_cid(cid);
	
	if(chat) {
		window = wr_windows_window_with_chat(chat);

		if(window && wr_window_is_chat(window)) {
			wi_release(window->topic.nick);
			window->topic.nick = wi_retain(WI_ARRAY(arguments, 1));
			
			wi_release(window->topic.date);
			date = wi_date_with_rfc3339_string(WI_ARRAY(arguments, 4));
			window->topic.date = wi_retain(wi_date_string_with_format(date, WI_STR("%a %b %e %T %Y")));

			wi_release(window->topic.topic);
			window->topic.topic = wi_retain(WI_ARRAY(arguments, 5));
			
			wr_draw_header();
			wr_print_topic();
		}
	}
}
Example #2
0
static void wd_cmd_icon(wi_array_t *arguments) {
	wd_client_t		*client = wd_client();
	wd_icon_t		icon;

	icon = wi_string_uint32(WI_ARRAY(arguments, 0));

	/* set icon if changed */
	if(client->icon != icon) {
		client->icon = icon;

		if(client->state == WD_CLIENT_STATE_LOGGED_IN) {
			wd_broadcast_lock();
			wd_client_broadcast_status(client);
			wd_broadcast_unlock();
		}
	}

	/* copy custom icon if changed */
	if(wi_array_count(arguments) > 1) {
		wi_release(client->image);
		client->image = wi_retain(WI_ARRAY(arguments, 1));

		if(client->state == WD_CLIENT_STATE_LOGGED_IN) {
			wd_broadcast_lock();
			wd_broadcast(WD_PUBLIC_CID, 340, WI_STR("%u%c%#@"),
						 client->uid,	WD_FIELD_SEPARATOR,
						 client->image);
			wd_broadcast_unlock();
		}
	}
}
Example #3
0
static void wd_cmd_invite(wi_array_t *arguments) {
	wd_client_t		*client = wd_client();
	wd_client_t		*peer;
	wd_chat_t		*chat;
	wd_uid_t		uid;
	wd_cid_t		cid;

	uid = wi_string_uint32(WI_ARRAY(arguments, 0));
	peer = wd_client_with_uid(uid);

	if(!peer) {
		wd_reply(512, WI_STR("Client Not Found"));

		return;
	}

	cid = wi_string_uint32(WI_ARRAY(arguments, 1));
	chat = wd_chat_with_cid(cid);

	if(!chat)
		return;

	if(!wd_chat_contains_client(chat, client))
		return;

	if(wd_chat_contains_client(chat, peer))
		return;

	wd_client_lock_socket(peer);
	wd_sreply(peer->socket, 331, WI_STR("%u%c%u"),
			  cid,		WD_FIELD_SEPARATOR,
			  client->uid);
	wd_client_unlock_socket(peer);
}
Example #4
0
static void wd_cmd_move(wi_array_t *arguments) {
	wd_client_t		*client = wd_client();
	wi_string_t		*frompath, *topath;
	wi_string_t		*properfrompath, *propertopath;
	
	frompath	= WI_ARRAY(arguments, 0);
	topath		= WI_ARRAY(arguments, 1);

	if(!wd_files_path_is_valid(frompath) || !wd_files_path_is_valid(topath)) {
		wd_reply(520, WI_STR("File or Directory Not Found"));

		return;
	}

	if(!client->account->view_dropboxes) {
		if(wd_files_path_is_dropbox(frompath)) {
			wd_reply(520, WI_STR("File or Directory Not Found"));

			return;
		}
	}

	properfrompath	= wi_string_by_normalizing_path(frompath);
	propertopath	= wi_string_by_normalizing_path(topath);

	if(wd_files_move_path(properfrompath, propertopath)) {
		wi_log_ll(WI_STR("%@/%@/%@ moved \"%@\" to \"%@\""),
			client->nick, client->login, client->ip,
			properfrompath, propertopath);
	}
}
Example #5
0
static void wr_msg_307(wi_array_t *arguments) {
	wi_string_t		*message;
	wr_user_t		*killer, *victim;
	wr_uid_t		killer_uid, victim_uid;

	victim_uid = wi_string_uint32(WI_ARRAY(arguments, 0));
	killer_uid = wi_string_uint32(WI_ARRAY(arguments, 1));
	message = WI_ARRAY(arguments, 2);

	victim = wr_chat_user_with_uid(wr_public_chat, victim_uid);
	killer = wr_chat_user_with_uid(wr_public_chat, killer_uid);

	if(killer && victim) {
		if(wi_string_length(message) > 0) {
			wr_wprintf_prefix(wr_console_window, WI_STR("%@ was banned by %@: %@"),
				wr_user_nick(victim), wr_user_nick(killer), message);
		} else {
			wr_wprintf_prefix(wr_console_window, WI_STR("%@ was banned by %@"),
				wr_user_nick(victim), wr_user_nick(killer));
		}
	}

	if(victim) {
		wr_chat_remove_user(wr_public_chat, victim);
		wr_draw_divider();
	}
}
Example #6
0
static void wd_cmd_say(wi_array_t *arguments) {
	wd_client_t		*client = wd_client();
	wi_array_t		*array;
	wi_string_t		*string;
	wd_chat_t		*chat;
	wd_cid_t		cid;
	unsigned int	i, count;

	cid = wi_string_uint32(WI_ARRAY(arguments, 0));
	chat = wd_chat_with_cid(cid);
	
	if(!chat)
		return;

	if(!wd_chat_contains_client(chat, client))
		return;

	array = wi_string_components_separated_by_string(WI_ARRAY(arguments, 1), WI_STR("\n\r"));
	count = wi_array_count(array);
	
	wd_broadcast_lock();
	for(i = 0; i < count; i++) {
		string = WI_ARRAY(array, i);
		
		if(wi_string_length(string) > 0) {
			wd_broadcast(cid, 300, WI_STR("%u%c%u%c%#@"),
						 cid,			WD_FIELD_SEPARATOR,
						 client->uid,	WD_FIELD_SEPARATOR,
						 string);
		}
	}
	wd_broadcast_unlock();
}
Example #7
0
static void wr_msg_411(wi_array_t *arguments) {
	wr_transfer_t		*transfer;
	wi_file_offset_t	free;

	if(wr_ls_state == WR_LS_LISTING) {
		free = wi_string_uint64(WI_ARRAY(arguments, 1));

		wr_printf_prefix(WI_STR("Listing of %@ (%@ available):"), wr_files_ld, wr_files_string_for_size(free));

		if(wi_array_count(wr_files) == 0)
			wr_printf_block(WI_STR("(empty)"));
		else
			wr_print_files();
	}
	else if(wr_ls_state == WR_LS_TRANSFER) {
		transfer = wr_transfers_transfer_with_remote_path(WI_ARRAY(arguments, 0));
		
		if(transfer) {
			if(transfer->type == WR_TRANSFER_DOWNLOAD)
				wr_transfer_download_add_files(transfer, wr_files);
			else
				wr_transfer_upload_remove_files(transfer, wr_files);
				
			transfer->state = WR_TRANSFER_WAITING;
			transfer->listed = true;
			
			wr_transfer_request(transfer);
		}
	}
}
Example #8
0
static void wd_cmd_topic(wi_array_t *arguments) {
	wd_client_t		*client = wd_client();
	wd_chat_t		*chat;
	wd_cid_t		cid;

	cid = wi_string_uint32(WI_ARRAY(arguments, 0));
	chat = wd_chat_with_cid(cid);

	if(!chat)
		return;

	if(cid == WD_PUBLIC_CID) {
		if(!client->account->set_topic) {
			wd_reply(516, WI_STR("Permission Denied"));

			return;
		}
	} else {
		if(!wd_chat_contains_client(chat, client))
			return;
	}

	wd_chat_set_topic(chat, WI_ARRAY(arguments, 1));

	wd_broadcast_lock();
	wd_chat_broadcast_topic(chat);
	wd_broadcast_unlock();
}
Example #9
0
static void wd_cmd_comment(wi_array_t *arguments) {
	wd_client_t		*client = wd_client();
	wi_string_t		*path;

	if(!client->account->alter_files) {
		wd_reply(516, WI_STR("Permission Denied"));
		
		return;
	}
	
	path = WI_ARRAY(arguments, 0);

	if(!wd_files_path_is_valid(path)) {
		wd_reply(520, WI_STR("File or Directory Not Found"));

		return;
	}

	if(!client->account->view_dropboxes) {
		if(wd_files_path_is_dropbox(path)) {
			wd_reply(520, WI_STR("File or Directory Not Found"));

			return;
		}
	}

	wd_files_set_comment(wi_string_by_normalizing_path(path), WI_ARRAY(arguments, 1));
}
Example #10
0
static void wr_command_msg(wi_array_t *arguments) {
	wi_p7_message_t		*message;
	wi_string_t			*nick;
	wr_user_t			*user;
	wr_window_t			*window;

	nick = WI_ARRAY(arguments, 0);
	user = wr_chat_user_with_nick(wr_public_chat, nick);

	if(!user) {
		wr_printf_prefix(WI_STR("msg: %@: Client not found"),
			nick);

		return;
	}
	
	message = wi_p7_message_with_name(WI_STR("wired.message.send_message"), wr_p7_spec);
	wi_p7_message_set_uint32_for_name(message, wr_user_id(user), WI_STR("wired.user.id"));
	wi_p7_message_set_string_for_name(message, WI_ARRAY(arguments, 1), WI_STR("wired.message.message"));
	wr_commands_send_message(message, WI_STR("msg"));
	
	// window = wr_windows_window_with_user(user);
	
	// if(!window) {
	// 	window = wr_window_init_with_user(wr_window_alloc(), user);
	// 	wr_windows_add_window(window);
	// 	wi_release(window);
	// }

	// wr_windows_show_window(window);
	// wr_wprint_say(window, wr_nick, WI_ARRAY(arguments, 1));
}
Example #11
0
static void wr_msg_331(wi_array_t *arguments) {
	wr_window_t	*window;
	wr_chat_t	*chat;
	wr_user_t	*user;
	wr_cid_t	cid;
	wr_uid_t	uid;

	cid = wi_string_uint32(WI_ARRAY(arguments, 0));
	uid = wi_string_uint32(WI_ARRAY(arguments, 1));

	user = wr_chat_user_with_uid(wr_public_chat, uid);

	if(user) {
		wr_send_command(WI_STR("JOIN %u"), cid);
		wr_send_command(WI_STR("WHO %u"), cid);
	
		chat = wr_chat_init_private_chat(wr_chat_alloc());
		wr_chat_set_id(chat, cid);
		wr_chats_add_chat(chat);
		wi_release(chat);

		window = wr_window_init_with_chat(wr_window_alloc(), chat);
		wr_windows_add_window(window);
		wr_windows_show_window(window);
		wi_release(window);
	}
}
Example #12
0
void wr_transfer_upload_remove_files(wr_transfer_t *transfer, wi_array_t *files) {
	wi_enumerator_t		*enumerator;
	wr_file_t			*file;
	wi_uinteger_t		i, count;
	
	count = wi_array_count(transfer->remote_paths);
	enumerator = wi_array_data_enumerator(files);
	
	while((file = wi_enumerator_next_data(enumerator))) {
		for(i = 0; i < count; i++) {
			if(wi_is_equal(wr_file_path(file), WI_ARRAY(transfer->remote_paths, i))) {
				transfer->total_size -= wr_file_size(WI_ARRAY(transfer->files, i));
				
				wi_mutable_array_remove_data_at_index(transfer->remote_paths, i);
				wi_mutable_array_remove_data_at_index(transfer->local_paths, i);
				wi_mutable_array_remove_data_at_index(transfer->files, i);
				
				count--;
				
				break;
			}
		}
	}
	
	wr_transfers_recursive_upload = false;
}
Example #13
0
static void wr_msg_401(wi_array_t *arguments) {
	wr_transfer_t	*transfer;

	transfer = wr_transfers_transfer_with_remote_path(WI_ARRAY(arguments, 0));

	if(transfer) {
		transfer->state = WR_TRANSFER_QUEUED;
		transfer->queue = wi_string_uint32(WI_ARRAY(arguments, 1));
	}
}
Example #14
0
static void wr_msg_400(wi_array_t *arguments) {
	wr_transfer_t		*transfer;

	transfer = wr_transfers_transfer_with_remote_path(WI_ARRAY(arguments, 0));

	if(!transfer)
		return;
	
	wr_transfer_open(transfer, wi_string_uint64(WI_ARRAY(arguments, 1)), WI_ARRAY(arguments, 2));
}
Example #15
0
static wi_boolean_t _wi_config_parse_string(wi_config_t *config, wi_string_t *string, wi_string_t **name, wi_string_t **value) {
	wi_array_t		*array;
	
	array = wi_string_components_separated_by_string(string, WI_STR("="));
	
	if(wi_array_count(array) != 2)
		return false;
	
	*name = wi_string_by_deleting_surrounding_whitespace(WI_ARRAY(array, 0));
	*value = wi_string_by_deleting_surrounding_whitespace(WI_ARRAY(array, 1));
	
	return true;
}
Example #16
0
static void wd_cmd_get(wi_array_t *arguments) {
	wd_client_t			*client = wd_client();
	wi_string_t			*path, *properpath;
	wi_file_offset_t	offset;
	uint32_t			count;

	if(!client->account->download) {
		wd_reply(516, WI_STR("Permission Denied"));
		
		return;
	}
	
	path = WI_ARRAY(arguments, 0);

	if(!wd_files_path_is_valid(path)) {
		wd_reply(520, WI_STR("File or Directory Not Found"));

		return;
	}

	if(!client->account->view_dropboxes) {
		if(wd_files_path_is_dropbox(path)) {
			wd_reply(520, WI_STR("File or Directory Not Found"));

			return;
		}
	}

	count = wd_transfers_count_of_client(client, WD_TRANSFER_DOWNLOAD);
	
	if(count >= wd_settings.clientdownloads) {
		if(count > wd_settings.clientdownloads) {
			wd_reply(523, WI_STR("Queue Limit Exceeded"));

			return;
		} else {
			wi_thread_sleep(0.5);
			
			if(wd_transfers_count_of_client(client, WD_TRANSFER_DOWNLOAD) >= wd_settings.clientdownloads) {
				wd_reply(523, WI_STR("Queue Limit Exceeded"));

				return;
			}
		}
	}
	
	properpath	= wi_string_by_normalizing_path(path);
	offset		= wi_string_uint64(WI_ARRAY(arguments, 1));

	wd_transfers_queue_download(properpath, offset);
}
Example #17
0
static void wr_msg_309(wi_array_t *arguments) {
	wr_user_t	*user;
	wr_uid_t	uid;
	
	uid = wi_string_uint32(WI_ARRAY(arguments, 0));
	user = wr_chat_user_with_uid(wr_public_chat, uid);

	if(user && !wr_is_ignored(wr_user_nick(user))) {
		wr_wprintf_prefix(wr_console_window, WI_STR("Broadcast message from %@:"),
			wr_user_nick(user));
		wr_wprintf_block(wr_console_window, WI_STR("%@"),
			WI_ARRAY(arguments, 1));
	}
}
Example #18
0
static void wr_msg_301(wi_array_t *arguments) {
	wr_chat_t	*chat;
	wr_user_t	*user;
	wr_cid_t	cid;
	wr_uid_t	uid;

	cid = wi_string_uint32(WI_ARRAY(arguments, 0));
	uid = wi_string_uint32(WI_ARRAY(arguments, 1));

	chat = wr_chats_chat_with_cid(cid);
	user = wr_chat_user_with_uid(chat, uid);
	
	if(user && !wr_is_ignored(wr_user_nick(user)))
		wr_wprint_me(wr_windows_window_with_chat(chat), wr_user_nick(user), WI_ARRAY(arguments, 2));
}
Example #19
0
static wi_integer_t wd_transfers_compare_user(wi_runtime_instance_t *instance1, wi_runtime_instance_t *instance2) {
	wd_user_t			*user1 = instance1;
	wd_user_t			*user2 = instance2;
	wd_transfer_t		*transfer1, *transfer2;
	
	transfer1 = WI_ARRAY(wd_user_transfers_queue(user1), 0);
	transfer2 = WI_ARRAY(wd_user_transfers_queue(user2), 0);
	
	if(transfer1->queue_time > transfer2->queue_time)
		return 1;
	else if(transfer2->queue_time > transfer1->queue_time)
		return -1;
	
	return 0;
}
Example #20
0
static wi_integer_t wd_transfers_queue_compare(wi_runtime_instance_t *instance1, wi_runtime_instance_t *instance2) {
	wi_array_t			*queue1 = instance1;
	wi_array_t			*queue2 = instance2;
	wd_transfer_t		*transfer1, *transfer2;
	
	transfer1 = WI_ARRAY(queue1, 0);
	transfer2 = WI_ARRAY(queue2, 0);
	
	if(transfer1->queue_time > transfer2->queue_time)
		return 1;
	else if(transfer2->queue_time > transfer1->queue_time)
		return -1;
	
	return 0;
}
Example #21
0
static void wr_msg_400(wi_array_t *arguments) {
	wi_address_t		*address;
	wr_transfer_t		*transfer;

	transfer = wr_transfers_transfer_with_path(WI_ARRAY(arguments, 0));

	if(!transfer)
		return;
	
	address = wi_copy(wr_address);
	wi_address_set_port(address, wi_address_port(address) + 1);
	
	transfer->state			= WR_TRANSFER_RUNNING;
	transfer->offset		= wi_string_uint64(WI_ARRAY(arguments, 1));
	transfer->transferred	= transfer->offset;
	transfer->key			= wi_retain(WI_ARRAY(arguments, 2));
	transfer->start_time	= wi_time_interval();
	transfer->socket		= wi_socket_init_with_address(wi_socket_alloc(), address, WI_SOCKET_TCP);

	wi_socket_set_interactive(transfer->socket, false);
	
	if(!wi_socket_connect(transfer->socket, wr_socket_context, 15.0)) {
		wr_printf_prefix(WI_STR("Could not connect to %@: %m"), wi_address_string(address));
		
		wr_transfer_stop(transfer);

		goto end;
	}
	
	wi_file_seek(transfer->file, transfer->offset);

	if(transfer->type == WR_TRANSFER_DOWNLOAD) {
		wi_socket_set_direction(transfer->socket, WI_SOCKET_READ);
		wr_runloop_add_socket(transfer->socket, wr_runloop_download_callback);
	} else {
		wi_socket_set_direction(transfer->socket, WI_SOCKET_WRITE);
		wr_runloop_add_socket(transfer->socket, wr_runloop_upload_callback);
	}

	wr_send_command_on_socket(transfer->socket, WI_STR("TRANSFER %#@"), transfer->key);

	wr_printf_prefix(WI_STR("Starting transfer of \"%@\""), transfer->name);
	
	wr_draw_transfers(true);

end:
	wi_release(address);
}
Example #22
0
static void wr_command_icon(wi_array_t *arguments) {
	wi_p7_message_t		*message;
	wi_string_t			*path;
	wi_data_t			*data;

	path = wi_string_by_normalizing_path(WI_ARRAY(arguments, 0));
	data = wi_data_init_with_contents_of_file(wi_data_alloc(), path);
	
	if(data) {
		wi_release(wr_icon_path);
		wr_icon_path = wi_retain(path);
		
		wi_release(wr_icon);
		wr_icon = wi_retain(data);
		
		if(wr_connected) {
			message = wi_p7_message_with_name(WI_STR("wired.user.set_icon"), wr_p7_spec);
			wi_p7_message_set_data_for_name(message, wr_icon, WI_STR("wired.user.icon"));
			wr_commands_send_message(message, WI_STR("icon"));
		}

		wi_release(data);
	} else {
		wr_printf_prefix(WI_STR("icon: %@: %m"), path);
	}
}
Example #23
0
static void wd_cmd_delete(wi_array_t *arguments) {
	wd_client_t		*client = wd_client();
	wi_string_t		*path, *properpath;

	if(!client->account->delete_files) {
		wd_reply(516, WI_STR("Permission Denied"));
		
		return;
	}
	
	path = WI_ARRAY(arguments, 0);

	if(!wd_files_path_is_valid(path)) {
		wd_reply(520, WI_STR("File or Directory Not Found"));

		return;
	}

	if(!client->account->view_dropboxes) {
		if(wd_files_path_is_dropbox(path)) {
			wd_reply(520, WI_STR("File or Directory Not Found"));

			return;
		}
	}

	properpath = wi_string_by_normalizing_path(path);
	
	if(wd_files_delete_path(properpath)) {
		wi_log_ll(WI_STR("%@/%@/%@ deleted \"%@\""),
			client->nick, client->login, client->ip,
			properpath);
	}
}
Example #24
0
static void wd_cmd_createuser(wi_array_t *arguments) {
	wd_client_t			*client = wd_client();
	wd_account_t		*account;

	if(!client->account->create_accounts) {
		wd_reply(516, WI_STR("Permission Denied"));
		
		return;
	}
	
	account = wd_accounts_read_user(WI_ARRAY(arguments, 0));
	
	if(account) {
		wd_reply(514, WI_STR("Account Exists"));
		
		return;
	}
	
	account = wi_autorelease(wd_account_init_user_with_array(wd_account_alloc(), arguments));
	
	if(!wd_accounts_check_privileges(account)) {
		wd_reply(516, WI_STR("Permission Denied"));
		
		return;
	}
	
	if(wd_accounts_create_user(account)) {
		wi_log_ll(WI_STR("%@/%@/%@ created the user \"%@\""),
			client->nick, client->login, client->ip,
			account->name);
	}
}
Example #25
0
static wi_string_t * _wi_array_description(wi_runtime_instance_t *instance) {
	wi_array_t			*array = instance;
	wi_string_t			*string, *description;
	void				*data;
	wi_uinteger_t		i;
	
	string = wi_string_with_format(WI_STR("<%@ %p>{count = %lu, values = (\n"),
		wi_runtime_class_name(array),
		array,
		array->data_count);
	
	for(i = 0; i < array->data_count; i++) {
		data = WI_ARRAY(array, i);
		
		if(array->callbacks.description)
			description = (*array->callbacks.description)(data);
		else
			description = wi_string_with_format(WI_STR("%p"), data);
		
		wi_string_append_format(string, WI_STR("    %lu: %@\n"), i, description);
	}
	
	wi_string_append_string(string, WI_STR(")}"));
	
	return string;
}
Example #26
0
char * wr_readline_nickname_generator(const char *text, int state) {
	static wi_uinteger_t	index;
	wi_array_t				*users;
	wi_string_t				*name;
	char					*cname;
	wr_user_t				*user;
	wi_uinteger_t			count;
	
	if(!wr_window_is_chat(wr_current_window))
		return NULL;
	
	users = wr_chat_users(wr_window_chat(wr_console_window));
	
	if(state == 0)
		index = 0;

	cname = ((*rl_filename_dequoting_function) ((char *) text, 0));
	name = wi_string_with_cstring(cname);
	free(cname);
	
	count = wi_array_count(users);
	
	while(index < count) {
		user = WI_ARRAY(users, index++);
		
		if(wi_string_index_of_string(user->nick, name, WI_STRING_SMART_CASE_INSENSITIVE) == 0)
			return strdup(wi_string_cstring(user->nick));
	}
	
	return NULL;
}
Example #27
0
static wi_array_t * _wi_terminal_buffer_lines_for_string(wi_terminal_buffer_t *buffer, wi_string_t *string) {
	wi_array_t		*array, *linearray;
 	wi_string_t		*string_copy, *line, *subline;
	wi_size_t		size;
	uint32_t		i, count, index;
	
	array		= wi_array_init(wi_array_alloc());
	size		= wi_terminal_size(buffer->terminal);
	linearray	= wi_string_components_separated_by_string(string, WI_STR("\n"));
	count		= wi_array_count(linearray);
	
	for(i = 0; i < count; i++) {
		line = WI_ARRAY(linearray, i);
		
		if(wi_terminal_width_of_string(buffer->terminal, line) < size.width) {
			wi_array_add_data(array, line);
		} else {
			string_copy = wi_copy(line);
			
			do {
				index	= wi_terminal_index_of_string_for_width(buffer->terminal, string_copy, size.width);
				subline	= wi_string_substring_to_index(string_copy, index);

				wi_array_add_data(array, subline);
				wi_string_delete_characters_to_index(string_copy, wi_string_length(subline));
			} while(wi_terminal_width_of_string(buffer->terminal, string_copy) >= size.width);
			
			wi_array_add_data(array, string_copy);
			wi_release(string_copy);
		}
	}
	
	return array;
}
Example #28
0
static void _wi_terminal_buffer_draw_line(wi_terminal_buffer_t *buffer, uint32_t line) {
	wi_point_t		location;
	wi_range_t		scroll;
	uint32_t		i, count;
	
	location = wi_terminal_location(buffer->terminal);
	scroll = wi_terminal_scroll(buffer->terminal);
	count = wi_array_count(buffer->linebuffer);
	
	if(line < scroll.length)
		wi_terminal_move(buffer->terminal, wi_make_point(0, scroll.length - line));
	else
		wi_terminal_move(buffer->terminal, wi_make_point(0, scroll.location));
	
	buffer->line = line;

	for(i = line; i < count && i < line + scroll.length; i++) {
		_wi_terminal_puts(buffer->terminal, WI_STR("\n"));
		_wi_terminal_puts(buffer->terminal, WI_ARRAY(buffer->linebuffer, i));

		buffer->line++;
	}
	
	wi_terminal_move(buffer->terminal, location);
}
Example #29
0
static void wr_command_ignore(wi_array_t *arguments) {
	wi_enumerator_t	*enumerator;
	wi_string_t		*string;
	wr_ignore_t		*ignore;

	if(wi_array_count(arguments) > 0) {
		string = WI_ARRAY(arguments, 0);
		ignore = wr_ignore_init_with_string(wr_ignore_alloc(), string);

		if(ignore) {
			wr_printf_prefix(WI_STR("Ignoring \"%@\""),
				wr_ignore_string(ignore));
			
			wi_mutable_array_add_data(wr_ignores, ignore);
			wi_release(ignore);
		} else {
			wr_printf_prefix(WI_STR("ignore: Could not compile regular expression \"%@\": %m"),
				string);
		}
	} else {
		wr_printf_prefix(WI_STR("Ignores:"));

		if(wi_array_count(wr_ignores) == 0) {
			wr_printf_block(WI_STR("(none)"));
		} else {
			enumerator = wi_array_data_enumerator(wr_ignores);
			
			while((ignore = wi_enumerator_next_data(enumerator)))
				wr_printf_block(WI_STR("%u: %@"), wr_ignore_id(ignore), wr_ignore_string(ignore));
		}
	}
}
Example #30
0
static void wr_command_broadcast(wi_array_t *arguments) {
	wi_p7_message_t		*message;
	
	message = wi_p7_message_with_name(WI_STR("wired.message.send_broadcast"), wr_p7_spec);
	wi_p7_message_set_string_for_name(message, WI_ARRAY(arguments, 0), WI_STR("wired.message.broadcast"));
	wr_commands_send_message(message, WI_STR("broadcast"));
}