Created
November 17, 2011 01:42
-
-
Save mkroman/1372117 to your computer and use it in GitHub Desktop.
Revisions
-
mkroman created this gist
Nov 17, 2011 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,153 @@ #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <unistd.h> #include <string.h> #include <iostream> #include <stdarg.h> #include <stdio.h> #include "Network.hpp" #include "Channel.hpp" #include "Command.hpp" using namespace std; namespace perlite { // Destroy every channel joined on this network and close the socket connection. Network::~Network() { // Iterate over every channel instance and wipe it from memory. for (Channel *channel : m_channels) delete channel; if (m_socket) ::close(m_socket); } // Establish a basic blocking IPv4 TCP connection. // Returns true on success, otherwise false. bool Network::connect(const string& host, int port) { m_host = host; m_port = port; struct hostent *remote_host; struct sockaddr_in remote_addr; m_socket = ::socket(AF_INET, SOCK_STREAM, 0); memset(&remote_addr, 0, sizeof(struct sockaddr_in)); if (m_socket == -1) { cerr << "::socket() failed" << endl; return false; } remote_host = ::gethostbyname(host.c_str()); if (!remote_host) { cerr << "::gethostbyname() failed" << endl; return false; } remote_addr.sin_family = AF_INET; remote_addr.sin_port = htons(port); memcpy(&remote_addr.sin_addr, remote_host->h_addr, remote_host->h_length); if (::connect(m_socket, (struct sockaddr *)&remote_addr, sizeof(struct sockaddr)) == -1) { cerr << "::connect() failed" << endl; return false; } return true; } size_t Network::readLine(string& destination) { char buffer[kMinBufferSize], tmp; size_t size = 0, read = 0, i = 0; for (i = 0; i < sizeof(buffer); i++) { read = ::recv(m_socket, &tmp, sizeof(char), 0); if ((int)read == -1) break; if (tmp == '\r') continue; else if (tmp == '\n') break; buffer[i] = tmp; size += read; } buffer[size] = '\0'; destination = string(buffer); return size; } size_t Network::sendCommand(const string& format, ...) { va_list vargs; char buffer[kMinBufferSize]; size_t result = 0, length = 0; va_start(vargs, format); if (vsprintf(buffer, format.c_str(), vargs) < 0) return -1; va_end(vargs); length = strlen(buffer); if (!strstr(buffer, "\r\n")) { strcpy(&buffer[length], "\r\n"); length += 2; } result = sendData(buffer, length); return result; } size_t Network::sendData(const char *data, size_t length) { int size = 0; size = ::send(m_socket, data, length, 0); return size; } void Network::disconnect() { ::close(m_socket); m_socket = 0; } User * Network::getUserByNick(const string& nick) { for (User *user : m_users) { if (user->getNick() == nick) return user; } return 0; } Channel * Network::getChannelByName(const string& name) { for (Channel *channel : m_channels) { if (channel->getName() == name) return channel; } return 0; } void Network::delUser(User *user) { UserTable::iterator it; for (it = m_users.begin(); it < m_users.end(); it++) { if (*it == user) { m_users.erase(it); delete user; } } } void Network::delChannel(Channel *channel) { ChannelTable::iterator it; for (it = m_channels.begin(); it < m_channels.end(); it++) { if (*it == channel) { m_channels.erase(it); delete channel; } } } } // namespace perlite This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,243 @@ indent_align_string=true indent_braces=false indent_braces_no_func=false indent_brace_parent=false indent_namespace=false indent_extern=false indent_class=true indent_class_colon=true indent_else_if=false indent_func_call_param=false indent_func_def_param=false indent_func_proto_param=false indent_func_class_param=false indent_func_ctor_var_param=false indent_template_param=false indent_func_param_double=false indent_relative_single_line_comments=false indent_col1_comment=true indent_access_spec_body=false indent_paren_nl=false indent_comma_paren=false indent_bool_paren=false indent_square_nl=false indent_preserve_sql=false indent_align_assign=true sp_balance_nested_parens=false align_keep_tabs=false align_with_tabs=false align_on_tabstop=false align_number_left=true align_func_params=true align_same_func_call_params=true align_var_def_colon=true align_var_def_attribute=true align_var_def_inline=true align_right_cmt_mix=false align_on_operator=true align_mix_var_proto=false align_single_line_func=true align_single_line_brace=true align_nl_cont=true align_left_shift=true nl_collapse_empty_body=true nl_assign_leave_one_liners=false nl_class_leave_one_liners=false nl_enum_leave_one_liners=false nl_getset_leave_one_liners=false nl_func_leave_one_liners=false nl_if_leave_one_liners=false nl_multi_line_cond=false nl_multi_line_define=false nl_before_case=true nl_after_case=false nl_after_return=true nl_after_semicolon=false nl_after_brace_open=false nl_after_brace_open_cmt=false nl_after_vbrace_open=false nl_after_brace_close=false nl_define_macro=true nl_squeeze_ifdef=false nl_ds_struct_enum_cmt=true nl_ds_struct_enum_close_brace=true nl_create_if_one_liner=true nl_create_for_one_liner=true nl_create_while_one_liner=true ls_for_split_full=false ls_func_split_full=true nl_after_multiline_comment=true eat_blanks_after_open_brace=true eat_blanks_before_close_brace=true mod_pawn_semicolon=false mod_full_paren_if_bool=true mod_remove_extra_semicolon=true mod_sort_import=false mod_sort_using=false mod_sort_include=false mod_move_case_break=true mod_remove_empty_return=true cmt_indent_multi=true cmt_c_group=false cmt_c_nl_start=false cmt_c_nl_end=false cmt_cpp_group=false cmt_cpp_nl_start=false cmt_cpp_nl_end=false cmt_cpp_to_c=false cmt_star_cont=false cmt_multi_check_last=true cmt_insert_before_preproc=false pp_indent_at_level=false pp_region_indent_code=false pp_if_indent_code=false pp_define_at_level=false indent_columns=2 align_var_def_span=1 align_var_def_star_style=2 align_var_def_amp_style=2 align_var_def_thresh=3 align_var_def_gap=1 align_assign_span=1 align_enum_equ_span=1 align_var_struct_span=1 align_struct_init_span=1 align_typedef_span=1 align_typedef_star_style=2 align_typedef_amp_style=2 align_right_cmt_span=4 align_right_cmt_at_col=1 align_func_proto_span=3 nl_end_of_file_min=1 nl_func_var_def_blk=1 code_width=82 nl_max=3 nl_after_func_proto=0 nl_after_func_body=2 nl_after_func_body_one_liner=2 nl_before_block_comment=2 nl_before_c_comment=2 nl_before_cpp_comment=2 nl_before_access_spec=2 nl_after_access_spec=2 nl_comment_func_def=1 nl_after_try_catch_finally=1 mod_full_brace_nl=1 mod_add_long_ifdef_endif_comment=1 mod_add_long_ifdef_else_comment=1 cmt_width=80 newlines=auto indent_with_tabs=0 sp_arith=add sp_assign=add sp_enum_assign=add sp_pp_concat=add sp_pp_stringify=add sp_bool=add sp_compare=add sp_inside_paren=remove sp_paren_paren=remove sp_paren_brace=add sp_before_ptr_star=add sp_before_unnamed_ptr_star=add sp_between_ptr_star=remove sp_after_ptr_star=remove sp_after_ptr_star_func=add sp_before_ptr_star_func=remove sp_before_byref=remove sp_before_unnamed_byref=remove sp_after_byref=add sp_after_byref_func=add sp_before_byref_func=remove sp_after_type=add sp_before_angle=remove sp_inside_angle=remove sp_after_angle=remove sp_angle_paren=remove sp_angle_word=remove sp_before_sparen=add sp_inside_sparen=remove sp_sparen_brace=add sp_special_semi=remove sp_before_semi=remove sp_before_semi_for=remove sp_before_semi_for_empty=remove sp_after_semi_for_empty=remove sp_before_square=remove sp_before_squares=remove sp_inside_square=remove sp_after_comma=add sp_before_comma=remove sp_after_class_colon=add sp_before_class_colon=add sp_before_case_colon=remove sp_after_operator=remove sp_after_operator_sym=remove sp_after_cast=remove sp_inside_paren_cast=remove sp_cpp_cast_paren=remove sp_sizeof_paren=remove sp_inside_braces_enum=add sp_inside_braces_struct=add sp_inside_braces=add sp_inside_braces_empty=remove sp_type_func=add sp_func_proto_paren=remove sp_func_def_paren=remove sp_inside_fparens=remove sp_inside_fparen=remove sp_square_fparen=remove sp_fparen_brace=add sp_func_call_paren=remove sp_func_call_user_paren=remove sp_func_class_paren=remove sp_return_paren=add sp_attribute_paren=remove sp_defined_paren=remove sp_throw_paren=remove sp_macro=add sp_macro_func=remove sp_else_brace=add sp_brace_else=add sp_brace_typedef=add sp_catch_brace=add sp_brace_catch=add sp_finally_brace=add sp_brace_finally=add sp_try_brace=add sp_getset_brace=add sp_before_dc=remove sp_after_dc=remove sp_not=remove sp_inv=remove sp_addr=remove sp_member=remove sp_deref=remove sp_sign=remove sp_incdec=remove sp_before_nl_cont=remove sp_after_oc_scope=remove sp_after_oc_colon=remove sp_before_oc_colon=remove sp_after_send_oc_colon=add sp_before_send_oc_colon=remove sp_after_oc_type=remove sp_cond_colon=add sp_cond_question=add sp_cmt_cpp_start=add nl_end_of_file=add nl_namespace_brace=remove nl_class_brace=remove nl_class_init_args=add nl_func_decl_args=add nl_before_if=add nl_before_for=add nl_before_while=add nl_before_switch=add nl_before_do=add mod_full_brace_do=remove mod_full_brace_for=remove mod_full_brace_if=remove mod_full_brace_while=remove mod_paren_on_return=remove pp_space=add