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

static int build_ipmsg_packet ( const char *  ipaddr,
const pktno_t  pkt_arg,
const ipmsg_send_flags_t  flags,
const char *  message,
const char *  extension,
char **  external,
size_t *  len_p,
pktno_t pkt_ret 
) [static]

IPMSGのメッセージパケットを生成し, 送信先のコードセットに変換する

Parameters:
[in] ipaddr 送信先IPアドレス(送信先コードセット判定に使用) (NULLの場合は, ブロードキャスト用として 扱い, デフォルトコードセットを使用する).
[in] pkt_arg パケット番号(0の場合は, 自動生成する)
[in] flags 送信フラグ
[in] message メッセージ部に格納する文字列を設定する.
[in] extension 拡張部に格納する文字列を設定する.
[out] external 外部形式のパケット文字列を指すためのポインタのアドレス
[out] len_p 送信パケット長(ヌルターミネート含む)返却先アドレス
[out] pkt_ret 割り当てたパケット番号の返却先アドレス IPMSG_PROTOCOL_MSG_NONEED_PKTNOが指定された場合は, パケット番号の返却を実施しない
Return values:
0 正常終了
-EINVAL 引数異常
Attention:
内部リンケージ

Definition at line 64 of file protocol.c.

References IPMSG_BUFSIZ, ipmsg_convert_string_external(), ipmsg_get_pkt_no(), IPMSG_PROTOCOL_ALLMSG_PACKET_FMT, IPMSG_PROTOCOL_COMMON_MSG_FMT, IPMSG_PROTOCOL_MSG_EXT_DELIM, IPMSG_PROTOCOL_MSG_EXT_DELIM_SYM, IPMSG_PROTOCOL_MSG_NONEED_PKTNO, IPMSG_PROTOCOL_PKTNUM_AUTO, and pkt_no.

Referenced by ipmsg_construct_getfile_message(), and ipmsg_send_packet().

                                 {
      int                      rc = 0;
      pktno_t              pkt_no = 0;
      size_t                  len = 0;
      gchar     *converted_common = NULL;
      gchar    *converted_message = NULL;
      gchar  *converted_extension = NULL;
      gchar *converted_all_packet = NULL;
      gchar               *common = NULL;

      if ( (ipaddr == NULL)  || (external == NULL) || 
          (*external != NULL) || (len_p == NULL) ) {
            rc = -EINVAL;
      }

      /*
       * パケット番号獲得
       */
      if (pkt_arg == IPMSG_PROTOCOL_PKTNUM_AUTO)
            pkt_no = ipmsg_get_pkt_no();
      else
            pkt_no = pkt_arg;

      common = g_malloc(IPMSG_BUFSIZ);
      if (common == NULL)
        goto error_out;
      
        
      /* 
       * 共通部分生成
       */
      snprintf(common, IPMSG_BUFSIZ, IPMSG_PROTOCOL_COMMON_MSG_FMT, 
          pkt_no, hostinfo_refer_user_name(), 
          hostinfo_refer_host_name(), flags);

      /*
       * 外部形式に変換
       */

      len = 0; /* 出力長を初期化  */


      /* 共通部分 */
      rc = ipmsg_convert_string_external(ipaddr, common, 
          (const char **)&converted_common);
      if (rc != 0) {
            ipmsg_err_dialog("%s:%s\n", 
                _("Can not convert common into external representation"), 
                common);
            goto free_common_out;
      } else {
            /*
             * 末尾のヌルターミネートを含めて送信するため1加える
             */
            len += (strlen(converted_common) + 1);
      }

      /* メッセージ本体  */
      if (message != NULL) {
            rc = ipmsg_convert_string_external(ipaddr, message, 
                (const char **)&converted_message);
            if (rc != 0) {
                  ipmsg_err_dialog("%s\n", 
                      _("Can not convert message into external representation"));
                  goto free_converted_common;
            } else {
                  /*
                   * 末尾のヌルターミネートを含めて送信するため1加える
                   */
                  len += (strlen(converted_message) + 1);
            }
      }

      /* 拡張部  */
      if (extension != NULL) {
            rc = ipmsg_convert_string_external(ipaddr, extension, 
                (const char **)&converted_extension);
            if (rc != 0) {
                  ipmsg_err_dialog("%s:%s\n", 
                      _("Can not convert extension into external representation"), 
                      extension);
                  goto free_converted_message;
            } else {
                  /*
                   * 末尾のヌルターミネートを含めて送信するため1加える
                   */
                  len += (strlen(converted_extension) + 1);
            }
      }

      /*
       * パケットを組み立てる
       */
      converted_all_packet = g_malloc(len);
      if (converted_all_packet == NULL) {
            rc = -ENOMEM;
            goto free_converted_extension;
      }

      memset(converted_all_packet, 0, len);
      snprintf(converted_all_packet, len, IPMSG_PROTOCOL_ALLMSG_PACKET_FMT,
          converted_common, 
          (converted_message != NULL) ? (converted_message) : (""),
          IPMSG_PROTOCOL_MSG_EXT_DELIM,
          (converted_extension != NULL) ? (converted_extension) : (""));

      dbg_out("New packet:" IPMSG_PROTOCOL_ALLMSG_PACKET_FMT,
          common, message, IPMSG_PROTOCOL_MSG_EXT_DELIM_SYM, extension);

      /*
       * 返却
       */
      *external = converted_all_packet;
      *len_p = len;
      if (pkt_ret != IPMSG_PROTOCOL_MSG_NONEED_PKTNO) 
            *pkt_ret = pkt_no;

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

free_converted_extension:
      if (converted_extension != NULL)
            g_free(converted_extension);

free_converted_message:
      if (converted_message != NULL)
            g_free(converted_message);

free_converted_common:
      if (converted_common != NULL)
            g_free(converted_common);
  
free_common_out:
      if (common != NULL)
            g_free(common);

error_out:
      return rc;
}


Generated by  Doxygen 1.6.0   Back to index