package sender
import (
- "../frontend"
- "../rmr"
"fmt"
"github.com/pkg/errors"
"log"
"sync/atomic"
"time"
"unicode"
+ "xappmock/models"
+ "xappmock/rmr"
)
var counter uint64
-func SendJsonRmrMessage(command frontend.JsonCommand /*the copy is modified locally*/, xAction *[]byte, r *rmr.Service) error {
+func SendJsonRmrMessage(command models.JsonCommand /*the copy is modified locally*/, xAction *[]byte, r *rmr.Service) error {
var payload []byte
_, err := fmt.Sscanf(command.PackedPayload, "%x", &payload)
if err != nil {
command.TransactionId = string(*xAction)
}
command.PayloadHeader = expandPayloadHeader(command.PayloadHeader, &command)
- rmrMsgId, err := rmr.MessageIdToUint(command.RmrMessageType)
+ log.Printf("#jsonSender.SendJsonRmrMessage - command payload header: %s", command.PayloadHeader)
+ rmrMsgId, err := rmr.MessageIdToUint(command.SendRmrMessageType)
if err != nil {
- return errors.New(fmt.Sprintf("invalid rmr message id: %s",command.WaitForRmrMessageType))
+ return errors.New(fmt.Sprintf("invalid rmr message id: %s", command.SendRmrMessageType))
}
- _, err = r.SendMessage(int(rmrMsgId), append([]byte(command.PayloadHeader), payload...), []byte(command.TransactionId))
+ _, err = r.SendMessage(int(rmrMsgId), command.Meid, append([]byte(command.PayloadHeader), payload...), []byte(command.TransactionId))
return err
}
* Example: “payloadHeader”: “$ranIp|$ranPort|$ranName|#packedPayload|”
*/
-func expandPayloadHeader(header string, command *frontend.JsonCommand) string {
+func expandPayloadHeader(header string, command *models.JsonCommand) string {
var name strings.Builder
var expandedHeader strings.Builder
if err != nil {
break
}
+
switch ch {
case '$':
for {
- ch, err = r.ReadByte() //on error ch == 0
+ ch, err = r.ReadByte() //on error ch == 0
if unicode.IsDigit(rune(ch)) || unicode.IsLetter(rune(ch)) {
- name.WriteByte(ch)
+ if name.Len() == 0 {
+ name.WriteByte(byte(unicode.ToUpper(rune(ch))))
+ } else {
+ name.WriteByte(ch)
+ }
} else {
if fieldValue := reflect.Indirect(reflect.ValueOf(command)).FieldByName(name.String()); fieldValue.IsValid() {
switch fieldValue.Kind() {
case reflect.Float64, reflect.Float32:
expandedHeader.WriteString(fmt.Sprintf("%g", fieldValue.Float()))
default:
- log.Fatalf("invalid type for $%s, value must be a string, an int, a bool or a float", name.String())
+ log.Fatalf("#jsonSender.expandPayloadHeader - invalid type for $%s, value must be a string, an int, a bool or a float", name.String())
}
}
name.Reset()
}
case '#':
for {
- ch, err = r.ReadByte() //on error ch == 0
+ ch, err = r.ReadByte() //on error ch == 0
if unicode.IsDigit(rune(ch)) || unicode.IsLetter(rune(ch)) {
- name.WriteByte(ch)
+ if name.Len() == 0 {
+ name.WriteByte(byte(unicode.ToUpper(rune(ch))))
+ } else {
+ name.WriteByte(ch)
+ }
} else {
if fieldValue := reflect.Indirect(reflect.ValueOf(command)).FieldByName(name.String()); fieldValue.IsValid() {
if fieldValue.Kind() == reflect.String {
expandedHeader.WriteString(strconv.FormatInt(int64(len(fieldValue.String())), 10))
} else {
- log.Fatalf("invalid type for #%s, value must be a string", name.String())
+ log.Fatalf("#jsonSender.expandPayloadHeader - invalid type for #%s, value must be a string", name.String())
}
}
name.Reset()
}
func init() {
- counter = uint64(time.Now().Second())
+ counter = uint64(time.Now().Unix() - 1572000000)
}