zhu2688
11/17/2011 - 1:42 AM

Uncrustify configuration inspired by Google's C++ styleguide.

Uncrustify configuration inspired by Google's C++ styleguide.

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
#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