Diff for /libaitmqtt/src/conn.c between versions 1.1.1.1.2.2 and 1.1.1.1.2.4

version 1.1.1.1.2.2, 2012/04/26 12:33:14 version 1.1.1.1.2.4, 2012/06/20 08:57:48
Line 51  SUCH DAMAGE. Line 51  SUCH DAMAGE.
  *   *
  * @buf = Message buffer   * @buf = Message buffer
  * @csConnID = ConnectID   * @csConnID = ConnectID
 * @kasec = Keep alive timeout * @kasec = Keep alive timeout, if =0 default timeout for MQTT
  * @csUser = Username if !=NULL   * @csUser = Username if !=NULL
  * @csPass = Password for Username, only if csUser is set   * @csPass = Password for Username, only if csUser is set
  * @csWillTopic = Will Topic if !=NULL Will Flags set into message   * @csWillTopic = Will Topic if !=NULL Will Flags set into message
Line 67  mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha Line 67  mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha
                 const char *csWillTopic, const char *csWillMessage,                   const char *csWillTopic, const char *csWillMessage, 
                 u_char ClrSess, u_char WillQOS, u_char WillRetain)                  u_char ClrSess, u_char WillQOS, u_char WillRetain)
 {  {
        int siz = 0;        int n, len, siz = 0;
         struct mqtthdr *hdr;          struct mqtthdr *hdr;
         mqtthdr_var_t *var, *cid, *topic, *wmsg, *user, *pass;          mqtthdr_var_t *var, *cid, *topic, *wmsg, *user, *pass;
         mqtthdr_protover_t *proto;          mqtthdr_protover_t *proto;
         mqtthdr_connflgs_t *flags;          mqtthdr_connflgs_t *flags;
         mqtt_len_t *ka;          mqtt_len_t *ka;
           void *data;
   
         if (!buf || !csConnID)          if (!buf || !csConnID)
                 return -1;                  return -1;
           else
                   data = buf->msg_base;
         if (strlen(csConnID) > 23) {          if (strlen(csConnID) > 23) {
                 mqtt_SetErr(EINVAL, "Invalid argument ConnID is too long (max 23 bytes)");                  mqtt_SetErr(EINVAL, "Invalid argument ConnID is too long (max 23 bytes)");
                 return -1;                  return -1;
Line 93  mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha Line 96  mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha
                 return -1;                  return -1;
         }          }
   
        if (mqtt_msgRealloc(buf, BUFSIZ) == -1)        /* calculate message size */
                return -1;        len = 10 + sizeof(mqtt_len_t);                      /* connect arguments */
        else {        len += sizeof(mqtt_len_t) + strlen(csConnID);     /* connect id */
                hdr = (struct mqtthdr *) (buf->msg_base + siz);        if (csUser && *csUser) {                        /* user/pass */
                siz += sizeof(struct mqtthdr);                len += sizeof(mqtt_len_t) + strlen(csUser);
                var = (mqtthdr_var_t*) (buf->msg_base + siz);                if (csPass)
                siz += 8;                        len += sizeof(mqtt_len_t) + strlen(csPass);
                proto = buf->msg_base + siz; 
                siz++; 
                flags = (mqtthdr_connflgs_t*) (buf->msg_base + siz); 
                siz++; 
                ka = (mqtt_len_t*) (buf->msg_base + siz); 
                siz += sizeof(mqtt_len_t); 
         }          }
           if (csWillTopic && *csWillTopic) {              /* will messages */
                   len += sizeof(mqtt_len_t) + strlen(csWillTopic);
                   len += sizeof(mqtt_len_t) + csWillMessage ? strlen(csWillMessage) : 0;
           }
   
           /* calculate header size */
           siz = sizeof(struct mqtthdr);                   /* mqtt fixed header */
           n = mqtt_encodeLen(len);                        /* message size */
           siz += mqtt_sizeLen(n) - 1;                     /* length size */
   
           if (mqtt_msgRealloc(buf, siz + len) == -1)
                   return -1;
           else
                   hdr = (struct mqtthdr *) data;
   
         /* fixed header */          /* fixed header */
         MQTTHDR_MSGINIT(hdr);          MQTTHDR_MSGINIT(hdr);
         hdr->mqtt_msg.type = MQTT_TYPE_CONNECT;          hdr->mqtt_msg.type = MQTT_TYPE_CONNECT;
        *hdr->mqtt_len = 0;        *(u_int*) hdr->mqtt_len = n;
         data += siz;
   
         /* variable header */          /* variable header */
        var->var_sb.sb.l = 6;        var = (mqtthdr_var_t*) data;
        memcpy(var->var_data, MQTT_CONN_STR, 6);        var->var_sb.val = htons(strlen(MQTT_CONN_STR));
         memcpy(var->var_data, MQTT_CONN_STR, ntohs(var->var_sb.val));
         data += MQTTHDR_VAR_SIZEOF(var);
   
           /* protocol version */
           proto = (mqtthdr_protover_t*) data++;
         *proto = MQTT_PROTO_VER;          *proto = MQTT_PROTO_VER;
   
         /* CONNECT header */          /* CONNECT header */
           flags = (mqtthdr_connflgs_t*) data++;
         flags->clean_sess = ClrSess ? 1 : 0;          flags->clean_sess = ClrSess ? 1 : 0;
         if (csUser && *csUser) {          if (csUser && *csUser) {
                 flags->username = 1;                  flags->username = 1;
Line 138  mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha Line 155  mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha
                 flags->will_retain = 0;                  flags->will_retain = 0;
         }          }
   
           /* keep alive */
           ka = (mqtt_len_t*) data;
         ka->val = kasec ? htons(kasec) : htons(MQTT_KEEPALIVE);          ka->val = kasec ? htons(kasec) : htons(MQTT_KEEPALIVE);
           data += sizeof(mqtt_len_t);
   
         /* ConnID */          /* ConnID */
        cid = (mqtthdr_var_t*) (buf->msg_base + siz);        cid = (mqtthdr_var_t*) data;
         cid->var_sb.val = htons(strlen(csConnID));          cid->var_sb.val = htons(strlen(csConnID));
         siz += MQTTHDR_VAR_SIZEOF(cid);  
         memcpy(cid->var_data, csConnID, ntohs(cid->var_sb.val));          memcpy(cid->var_data, csConnID, ntohs(cid->var_sb.val));
           data += MQTTHDR_VAR_SIZEOF(cid);
   
         /* If Will Flags setup */          /* If Will Flags setup */
         if (csWillTopic && *csWillTopic) {          if (csWillTopic && *csWillTopic) {
                topic = (mqtthdr_var_t*) (buf->msg_base + siz);                topic = (mqtthdr_var_t*) data;
                 topic->var_sb.val = htons(strlen(csWillTopic));                  topic->var_sb.val = htons(strlen(csWillTopic));
                 memcpy(topic->var_data, csWillTopic, ntohs(topic->var_sb.val));                  memcpy(topic->var_data, csWillTopic, ntohs(topic->var_sb.val));
                siz += MQTTHDR_VAR_SIZEOF(topic);                data += MQTTHDR_VAR_SIZEOF(topic);
   
                wmsg = (mqtthdr_var_t*) (buf->msg_base + siz);                wmsg = (mqtthdr_var_t*) data;
                 if (csWillMessage && *csWillMessage) {                  if (csWillMessage && *csWillMessage) {
                         wmsg->var_sb.val = htons(strlen(csWillMessage));                          wmsg->var_sb.val = htons(strlen(csWillMessage));
                         memcpy(wmsg->var_data, csWillMessage, ntohs(wmsg->var_sb.val));                          memcpy(wmsg->var_data, csWillMessage, ntohs(wmsg->var_sb.val));
                 } else                  } else
                         wmsg->var_sb.val = 0;                          wmsg->var_sb.val = 0;
                siz += MQTTHDR_VAR_SIZEOF(wmsg);                data += MQTTHDR_VAR_SIZEOF(wmsg);
         }          }
   
         /* If defined Username & Password */          /* If defined Username & Password */
         if (csUser && *csUser) {          if (csUser && *csUser) {
                user = (mqtthdr_var_t*) (buf->msg_base + siz);                user = (mqtthdr_var_t*) data;
                 user->var_sb.val = htons(strlen(csUser));                  user->var_sb.val = htons(strlen(csUser));
                 memcpy(user->var_data, csUser, ntohs(user->var_sb.val));                  memcpy(user->var_data, csUser, ntohs(user->var_sb.val));
                siz += MQTTHDR_VAR_SIZEOF(user);                data += MQTTHDR_VAR_SIZEOF(user);
   
                 if (csPass && *csPass) {                  if (csPass && *csPass) {
                        pass = (mqtthdr_var_t*) (buf->msg_base + siz);                        pass = (mqtthdr_var_t*) data;
                         pass->var_sb.val = htons(strlen(csPass));                          pass->var_sb.val = htons(strlen(csPass));
                         memcpy(pass->var_data, csPass, ntohs(pass->var_sb.val));                          memcpy(pass->var_data, csPass, ntohs(pass->var_sb.val));
                        siz += MQTTHDR_VAR_SIZEOF(pass);                        data += MQTTHDR_VAR_SIZEOF(pass);
                 }                  }
         }          }
   
        *hdr->mqtt_len = mqtt_encodeLen(siz - sizeof(struct mqtthdr));        return siz + len;
        return siz; 
 }  }
   
 /*  /*

Removed from v.1.1.1.1.2.2  
changed lines
  Added in v.1.1.1.1.2.4


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>