Logo Search packages:      
Sourcecode: g2ipmsg version File versions  Download package

static int ipmsg_send_entry_packets ( const udp_con_t *  con,
const char *  ipaddr,
const int  flags 
) [static]

IPMSGのエントリ系パケットを送出する.

Parameters:
[in] con UDPコネクション情報
[in] ipaddr 送出先IPアドレス(NULLの場合は, ブロードキャスト)
[in] flags パケット送信フラグ
Return values:
0 正常終了
-EINVAL 引数異常
-ENOMEM メモリ不足
Note:
エントリ系ブロードキャストパケットの形式は, 以下のとおり
IPMSG_BR_ENTRY パケット形式
  • メッセージ部: ニックネーム (通常時) ニックネーム<空白>'['不在種別']' (不在モード時)
  • 拡張部 : グループ名

IPMSG_ANSENTRY パケット形式

  • メッセージ部: ニックネーム (通常時) ニックネーム<空白>'['不在種別']' (不在モード時)
  • 拡張部 : グループ名

IPMSG_BR_EXIT パケット形式

  • メッセージ部: ニックネーム (通常時)
  • 拡張部 : グループ名

IPMSG_BR_ABSENCE パケット形式

  • メッセージ部: ニックネーム (通常時) ニックネーム<空白>'['不在種別']' (不在モード時)
  • 拡張部 : グループ名

Definition at line 1081 of file protocol.c.

References IPMSG_PROTOCOL_BR_ABSENT_FMT, IPMSG_PROTOCOL_BR_ABSENT_FMT_LEN, IPMSG_PROTOCOL_BR_ENTRY_FMT, IPMSG_PROTOCOL_ENTRY_PKT_ADDR, ipmsg_protocol_flags_get_command, IPMSG_PROTOCOL_PKTNUM_AUTO, and ipmsg_send_packet().

Referenced by ipmsg_send_ans_entry_common(), ipmsg_send_br_absence(), ipmsg_send_br_entry(), and ipmsg_send_br_exit().

                     {
      int                         rc = 0;
      size_t                     len = 0;
      size_t            msg_part_len = 0;
      ipmsg_send_flags_t local_flags = 0;
      int                  abs_index = 0;
      char             *absent_title = NULL;
      char                  *message = NULL;
      char                *extension = NULL;

      if (con == NULL) {
            rc = -EINVAL;
            goto error_out;
      }

      /*
       * 送信フラグ作成
       */
      local_flags  = flags;

      /*
       * 自発的IPMSG_ANSENTRYパケット以外は, デフォルトのフラグを設定
       */
      if ( !( (local_flags & IPMSG_ANSENTRY) && 
            (local_flags & hostinfo_get_normal_entry_flags()) ) )
            local_flags |= hostinfo_get_normal_entry_flags();

      dbg_out("Entry Type Flag :%x\n", local_flags);

      /*
       * IPMSG_BR_EXITは, 不在通知不要.
       */
      if ( ipmsg_protocol_flags_get_command(flags) == IPMSG_BR_EXIT )
            goto  create_message;

      /*
       * 不在処理拡張
       */
      if  (hostinfo_is_ipmsg_absent()) {
            rc = hostinfo_get_absent_id(&abs_index);
            if (rc == 0) {
                  hostinfo_get_absent_title(abs_index, 
                      (const char **)&absent_title);
            }
      }

create_message:   
      /*
       * メッセージ部
       */
      msg_part_len = 
            (strlen(hostinfo_refer_nick_name())) + /* ニックネーム */
            ((absent_title != NULL) ? 
                (strlen(absent_title) + 
                  IPMSG_PROTOCOL_BR_ABSENT_FMT_LEN)  : 
                (0) ) + 1; /* +1 は, ヌルターミネート */

      message = g_malloc(msg_part_len);
      if (message == NULL) {
            rc = -ENOMEM;
            goto error_out;
      }

      if (absent_title != NULL) 
            snprintf(message, msg_part_len, 
                IPMSG_PROTOCOL_BR_ABSENT_FMT,
                hostinfo_refer_nick_name(), (absent_title));
      else
            snprintf(message, msg_part_len, 
                IPMSG_PROTOCOL_BR_ENTRY_FMT, 
                hostinfo_refer_nick_name());

      message[msg_part_len - 1] = '\0';


      /*
       * 拡張部
       */
      extension = g_strdup(hostinfo_refer_group_name());
      if (extension == NULL) {
            rc = -ENOMEM;
            goto free_message_out;
      }

      /*
       * パケット送信
       */
      rc = ipmsg_send_packet(con, IPMSG_PROTOCOL_ENTRY_PKT_ADDR, 
          IPMSG_PROTOCOL_PKTNUM_AUTO, local_flags, message, extension);
      if (rc != 0) {
            goto free_extension_out;
      }

      rc = 0; /* 正常終了 */

free_extension_out:
      if (extension != NULL)
            g_free(extension);

free_message_out:
      if (message != NULL)
            g_free(message);

error_out:
      return rc;
}


Generated by  Doxygen 1.6.0   Back to index