Skip to content

Instantly share code, notes, and snippets.

@mkroman
Created November 17, 2011 01:42
Show Gist options
  • Select an option

  • Save mkroman/1372117 to your computer and use it in GitHub Desktop.

Select an option

Save mkroman/1372117 to your computer and use it in GitHub Desktop.

Revisions

  1. mkroman created this gist Nov 17, 2011.
    153 changes: 153 additions & 0 deletions Network.cpp
    Original 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
    243 changes: 243 additions & 0 deletions uncrustify.cfg
    Original 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