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

static int ipmsg_proc_send_msg ( const udp_con_t *  con,
const msg_data_t *  msg 
) [static]

IPMSG_SENDMSGパケットを処理する.

Parameters:
[in] con UDPコネクション情報
[in] flags パケット送信フラグ
Return values:
0 正常終了
-EINVAL 引数異常
-ENOMEM メモリ不足
Note:

Definition at line 1936 of file protocol.c.

References ipmsg_convert_string_internal(), ipmsg_send_absence_msg(), and ipmsg_send_recv_msg().

Referenced by ipmsg_dispatch_message().

                                                                 {
      gchar *internal_message = NULL;
      const gchar     *ipaddr = NULL;
      int         local_flags = 0;
      int                  rc = 0;

      /*
       * 文字列変換のためにピアのIPアドレスを取得する.
       */
      ipaddr = udp_get_peeraddr(con);
      if (ipaddr == NULL) {
            rc = -EINVAL;
            goto error_out;
      }

      /*
       * 文字列を内部形式に変換する.
       */
      rc = ipmsg_convert_string_internal(ipaddr, msg->message, 
          (const gchar **)&internal_message);
      if (rc != 0) {
            ipmsg_err_dialog(_("Can not convert message from %s into ineternal representation"), ipaddr);
            goto error_out;
      }

      dbg_out("message:\n%s\n", internal_message);

      /*
       * ログを取らないように要求している場合を除いてログを設定する.
       * 鍵付き封書のログ処理抑制は, ログ処理機構で実施
       * (IPMSGのプロトコル上の仕様ではないため).
       */
      if ( !(msg->command_opts & IPMSG_NOLOGOPT) )
            logfile_recv_log(ipaddr, msg->command_opts, internal_message);


      /*
       * 返信抑制フラグが付いている場合は, 返信に関わる処理を実施しない.
       */
      if ( msg->command_opts & IPMSG_NO_REPLY_OPTS )
            goto show_receive_win;

      /*
       * 送受信確認チェックが付いているメッセージの場合, 
       * 受信確認パケットを送信する.
       */
      if ( msg->command_opts & IPMSG_SENDCHECKOPT )
            ipmsg_send_recv_msg(con, msg);

      /*
       * 不在の場合は, 不在通知を実施する.
       * 
       */
      if ( hostinfo_is_ipmsg_absent() ) {

            local_flags = hostinfo_get_normal_send_flags();

            if (hostinfo_refer_ipmsg_default_secret())
                  local_flags |= IPMSG_SECRETOPT;

            ipmsg_send_absence_msg(con, local_flags);
      }

show_receive_win:
      /*
       * 受信ウィンドウを生成する.
       */
      if (hostinfo_refer_ipmsg_default_popup()) 
            store_message_window(msg, ipaddr);
      else
            recv_message_window(msg, ipaddr);

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

free_internal_message_out:
      if (internal_message != NULL)
            g_free(internal_message);

error_out:
      return rc;
}


Generated by  Doxygen 1.6.0   Back to index