diff --git a/smpp.go b/smpp.go index fb317b4..024fd95 100644 --- a/smpp.go +++ b/smpp.go @@ -6,11 +6,10 @@ package smpp // Imports import ( - "os" "net" "bufio" "strconv" - "fmt" + "errors" ) // Used for all outbound connections @@ -25,9 +24,9 @@ type smpp struct { } // Connect to server -func (smpp *smpp) connect(host string, port int) (err os.Error) { +func (smpp *smpp) connect(host string, port int) (err error) { // Create TCP connection - smpp.conn, err = net.Dial("tcp", "", host + ":" + strconv.Itoa(port)) + smpp.conn, err = net.Dial("tcp", host + ":" + strconv.Itoa(port)) if err != nil { return } @@ -39,14 +38,16 @@ func (smpp *smpp) connect(host string, port int) (err os.Error) { } // Close connection -func (smpp *smpp) close() (err os.Error) { - err = smpp.conn.Close() - smpp.connected = false +func (smpp *smpp) close() (err error) { + if(smpp != nil && smpp.conn != nil){ + err = smpp.conn.Close() + smpp.connected = false + } return } // Send bind request (called via NewTransmitter/NewReceiver/NewTransceiver) always synchronous -func (smpp *smpp) bind(cmd, rcmd SMPPCommand, params Params) (err os.Error) { +func (smpp *smpp) bind(cmd, rcmd SMPPCommand, params Params) (err error) { // Sequence number starts at 1 smpp.sequence ++ // PDU header @@ -61,7 +62,7 @@ func (smpp *smpp) bind(cmd, rcmd SMPPCommand, params Params) (err os.Error) { paramOK := false defer func() { if !paramOK && recover() != nil { - err = os.NewError("Bind: Panic, invalid params") + err = errors.New("Bind: Panic, invalid params") return } }() @@ -97,10 +98,10 @@ func (smpp *smpp) Async(async bool) { } // Send unbind request -func (smpp *smpp) Unbind() (sequence uint32, err os.Error) { +func (smpp *smpp) Unbind() (sequence uint32, err error) { // Check connected and bound if !smpp.connected || !smpp.bound { - err = os.NewError("Unbind: A bound connection is required to unbind") + err = errors.New("Unbind: A bound connection is required to unbind") return } // Increment sequence number @@ -129,11 +130,11 @@ func (smpp *smpp) Unbind() (sequence uint32, err os.Error) { } // Get response PDU -func (smpp *smpp) GetResp(cmd SMPPCommand, sequence uint32) (rpdu PDU, err os.Error) { +func (smpp *smpp) GetResp(cmd SMPPCommand, sequence uint32) (rpdu PDU, err error) { // Read the header hdr := new(PDUHeader) err = hdr.read(smpp.reader) - fmt.Printf("Header: %#v\n", hdr) + //fmt.Printf("Header: %#v\n", hdr) if err != nil { return nil, err } @@ -148,17 +149,17 @@ func (smpp *smpp) GetResp(cmd SMPPCommand, sequence uint32) (rpdu PDU, err os.Er }() // Check cmd and/or sequence if not 0 if cmd != CMD_NONE && hdr.CmdId != cmd { - err = os.NewError("Get Response: Invalid command") + err = errors.New("Get Response: Invalid command") return nil, err } // Check sequence number if not 0 if sequence > 0 && hdr.Sequence != sequence { - err = os.NewError("Get Response: Invalid sequence number") + err = errors.New("Get Response: Invalid sequence number") return nil, err } // Check for error response if hdr.CmdStatus != STATUS_ESME_ROK { - err = os.NewError("Get Response: PDU contains an error") + err = errors.New("Get Response: PDU contains an error") return nil, err } // Set PDU as read (to disable the deferred read) @@ -167,7 +168,7 @@ func (smpp *smpp) GetResp(cmd SMPPCommand, sequence uint32) (rpdu PDU, err os.Er switch hdr.CmdId { // Default unhandled PDU default: - err = os.NewError("Get Response: Unknown or unhandled PDU received") + err = errors.New("Get Response: Unknown or unhandled PDU received") return nil, err // Bind responses case CMD_BIND_RECEIVER_RESP, CMD_BIND_TRANSMITTER_RESP, CMD_BIND_TRANSCEIVER_RESP: @@ -211,7 +212,7 @@ func (smpp *smpp) GetResp(cmd SMPPCommand, sequence uint32) (rpdu PDU, err os.Er } // Create a new Transmitter -func NewTransmitter(host string, port int, params Params) (tx *Transmitter, err os.Error) { +func NewTransmitter(host string, port int, params Params) (tx *Transmitter, err error) { // Merge params with defaults allParams := mergeParams(params, defaultsBind) // Create new transmitter @@ -236,7 +237,7 @@ func NewTransmitter(host string, port int, params Params) (tx *Transmitter, err } // Create a new Receiver -func NewReceiver(host string, port int, params Params) (rx *Receiver, err os.Error) { +func NewReceiver(host string, port int, params Params) (rx *Receiver, err error) { // Merge params with defaults allParams := mergeParams(params, defaultsBind) // Create new receiver @@ -261,7 +262,7 @@ func NewReceiver(host string, port int, params Params) (rx *Receiver, err os.Err } // Create a new Transceiver -func NewTransceiver(host string, port int, params Params) (trx *Transceiver, err os.Error) { +func NewTransceiver(host string, port int, params Params) (trx *Transceiver, err error) { // Merge params with defaults allParams := mergeParams(params, defaultsBind) // Create new receiver diff --git a/smpp_param.go b/smpp_param.go index ceec68b..bcce237 100644 --- a/smpp_param.go +++ b/smpp_param.go @@ -10,10 +10,10 @@ var ( defaultsBind = Params{"systemId": "", "password": "", "systemType": "", "addrTon": SMPPTypeOfNumber(TON_UNKNOWN), "addrNpi": SMPPNumericPlanIndicator(NPI_UNKNOWN), "addressRange": ""} // SubmitSM defaults - defaultsSubmitSM = Params{"serviceType": "", "sourceAddrTon": SMPPTypeOfNumber(TON_UNKNOWN), "sourceAddrNpi": SMPPNumericPlanIndicator(NPI_UNKNOWN), "sourceAddr": "", "destAddrTon": SMPPTypeOfNumber(TON_UNKNOWN), "destAddrNpi": SMPPNumericPlanIndicator(NPI_UNKNOWN), "esmClass": SMPPEsmClassESME(ESME_MSG_MODE_DEFAULT), "protocolId": uint8(0x00), "priorityFlag": SMPPPriority(PRIORITY_NORMAL), "schedDelTime": "", "validityPeriod": "", "regDelivery": SMPPDelivery(DELIVERY_NONE), "replaceFlag": uint8(0x00), "dataCoding": SMPPDataCoding(CODING_LATIN1), "smDefaultMsgId": uint8(0x00)} + defaultsSubmitSM = Params{"serviceType": "", "sourceAddrTon": SMPPTypeOfNumber(TON_UNKNOWN), "sourceAddrNpi": SMPPNumericPlanIndicator(NPI_UNKNOWN), "sourceAddr": "", "destAddrTon": SMPPTypeOfNumber(TON_UNKNOWN), "destAddrNpi": SMPPNumericPlanIndicator(NPI_UNKNOWN), "esmClass": SMPPEsmClassESME(ESME_MSG_MODE_DEFAULT), "protocolId": uint8(0x00), "priorityFlag": SMPPPriority(PRIORITY_NORMAL), "schedDelTime": "", "validityPeriod": "", "regDelivery": SMPPDelivery(DELIVERY_NONE), "replaceFlag": uint8(0x00), "dataCoding": SMPPDataCoding(CODING_DEFAULT), "smDefaultMsgId": uint8(0x00)} // SubmitMulti defaults - defaultsSubmitMulti = Params{"serviceType": "", "sourceAddrTon": SMPPTypeOfNumber(TON_UNKNOWN), "sourceAddrNpi": SMPPNumericPlanIndicator(NPI_UNKNOWN), "sourceAddr": "", "destAddrTon": SMPPTypeOfNumber(TON_UNKNOWN), "destAddrNpi": SMPPNumericPlanIndicator(NPI_UNKNOWN), "esmClass": SMPPEsmClassESME(ESME_MSG_MODE_DEFAULT), "protocolId": uint8(0x00), "priorityFlag": SMPPPriority(PRIORITY_NORMAL), "schedDelTime": "", "validityPeriod": "", "regDelivery": SMPPDelivery(DELIVERY_NONE), "replaceFlag": uint8(0x00), "dataCoding": SMPPDataCoding(CODING_LATIN1), "smDefaultMsgId": uint8(0x00)} + defaultsSubmitMulti = Params{"serviceType": "", "sourceAddrTon": SMPPTypeOfNumber(TON_UNKNOWN), "sourceAddrNpi": SMPPNumericPlanIndicator(NPI_UNKNOWN), "sourceAddr": "", "destAddrTon": SMPPTypeOfNumber(TON_UNKNOWN), "destAddrNpi": SMPPNumericPlanIndicator(NPI_UNKNOWN), "esmClass": SMPPEsmClassESME(ESME_MSG_MODE_DEFAULT), "protocolId": uint8(0x00), "priorityFlag": SMPPPriority(PRIORITY_NORMAL), "schedDelTime": "", "validityPeriod": "", "regDelivery": SMPPDelivery(DELIVERY_NONE), "replaceFlag": uint8(0x00), "dataCoding": SMPPDataCoding(CODING_DEFAULT), "smDefaultMsgId": uint8(0x00)} ) // Params definitions diff --git a/smpp_pdu.go b/smpp_pdu.go index 7bb4746..6a8050b 100644 --- a/smpp_pdu.go +++ b/smpp_pdu.go @@ -5,19 +5,19 @@ package smpp import ( - "os" "bufio" "reflect" "fmt" + "errors" ) // PDU interface which all PDU types should implement type PDU interface { // Read the PDU from the buffer - read(r *bufio.Reader) (err os.Error) + read(r *bufio.Reader) (err error) // Write the PDU to the buffer - write(w *bufio.Writer) (err os.Error) + write(w *bufio.Writer) (err error) // Set the packet header setHeader(hdr *PDUHeader) @@ -52,25 +52,25 @@ func (pdu *PDUCommon) GetStruct() interface{} { } // Write Optional Params -func (pdu *PDUCommon) writeOptional(w *bufio.Writer) (err os.Error) { +func (pdu *PDUCommon) writeOptional(w *bufio.Writer) (err error) { if len(pdu.Optional) > 0 { for key, val := range pdu.Optional { op := new(pduOptParam) op.tag = uint16(key) op.value = val - v := reflect.NewValue(val) - switch t := v.(type) { - case *reflect.StringValue: + v := reflect.TypeOf(val) + switch v.Kind() { + case reflect.String: op.length = uint16(len(val.(string))) - case *reflect.BoolValue: + case reflect.Bool: op.length = 1 - case *reflect.Uint8Value: + case reflect.Uint8: op.length = 1 - case *reflect.Uint16Value: + case reflect.Uint16: op.length = 2 - case *reflect.Uint32Value: + case reflect.Uint32: op.length = 4 - case *reflect.Uint64Value: + case reflect.Uint64: op.length = 8 } err = op.write(w) @@ -95,11 +95,11 @@ type PDUBind struct { } // Read Bind PDU -func (pdu *PDUBind) read(r *bufio.Reader) (err os.Error) { +func (pdu *PDUBind) read(r *bufio.Reader) (err error) { // Read system id (null terminated string or null) line, err := r.ReadBytes(0x00) if err != nil { - err = os.NewError("Bind: Error reading system id") + err = errors.New("Bind: Error reading system id") return } if len(line) > 1 { @@ -108,7 +108,7 @@ func (pdu *PDUBind) read(r *bufio.Reader) (err os.Error) { // Read Password (null terminated string or null) line, err = r.ReadBytes(0x00) if err != nil { - err = os.NewError("Bind: Error reading Password") + err = errors.New("Bind: Error reading Password") return } if len(line) > 1 { @@ -117,7 +117,7 @@ func (pdu *PDUBind) read(r *bufio.Reader) (err os.Error) { // Read system type line, err = r.ReadBytes(0x00) if err != nil { - err = os.NewError("Bind: Error reading system type") + err = errors.New("Bind: Error reading system type") return } if len(line) > 1 { @@ -126,28 +126,28 @@ func (pdu *PDUBind) read(r *bufio.Reader) (err os.Error) { // Read interface version c, err := r.ReadByte() if err != nil { - err = os.NewError("Bind: Error reading interface version") + err = errors.New("Bind: Error reading interface version") return } pdu.IfVersion = uint8(c) // Read TON c, err = r.ReadByte() if err != nil { - err = os.NewError("Bind: Error reading default type of number") + err = errors.New("Bind: Error reading default type of number") return } pdu.AddrTon = SMPPTypeOfNumber(c) // Read NPI c, err = r.ReadByte() if err != nil { - err = os.NewError("Bind: Error reading default number plan indicator") + err = errors.New("Bind: Error reading default number plan indicator") return } pdu.AddrNpi = SMPPNumericPlanIndicator(c) // Read Address range line, err = r.ReadBytes(0x00) if err != nil { - err = os.NewError("Bind Response: Error reading system type") + err = errors.New("Bind Response: Error reading system type") return } if len(line) > 1 { @@ -157,11 +157,11 @@ func (pdu *PDUBind) read(r *bufio.Reader) (err os.Error) { } // Write Bind PDU -func (pdu *PDUBind) write(w *bufio.Writer) (err os.Error) { +func (pdu *PDUBind) write(w *bufio.Writer) (err error) { // Write Header err = pdu.Header.write(w) if err != nil { - err = os.NewError("Bind: Error writing Header") + err = errors.New("Bind: Error writing Header") return } // Create byte array the size of the PDU @@ -202,13 +202,13 @@ func (pdu *PDUBind) write(w *bufio.Writer) (err os.Error) { // Write to buffer _, err = w.Write(p) if err != nil { - err = os.NewError("Bind: Error writing to buffer") + err = errors.New("Bind: Error writing to buffer") return } // Flush write buffer err = w.Flush() if err != nil { - err = os.NewError("Bind: Error flushing write buffer") + err = errors.New("Bind: Error flushing write buffer") } return } @@ -225,11 +225,11 @@ type PDUBindResp struct { } // Read Bind Response PDU -func (pdu *PDUBindResp) read(r *bufio.Reader) (err os.Error) { +func (pdu *PDUBindResp) read(r *bufio.Reader) (err error) { // Read system id (null terminated string or null) line, err := r.ReadBytes(0x00) if err != nil { - err = os.NewError("Bind Response: Error reading system id") + err = errors.New("Bind Response: Error reading system id") return } if len(line) > 1 { @@ -240,7 +240,7 @@ func (pdu *PDUBindResp) read(r *bufio.Reader) (err os.Error) { op := new(pduOptParam) err = op.read(r) if err != nil { - err = os.NewError("Bind Response: Error reading Optional param") + err = errors.New("Bind Response: Error reading Optional param") return } pdu.Optional = OptParams{SMPPOptionalParamTag(op.tag): op.value} @@ -249,11 +249,11 @@ func (pdu *PDUBindResp) read(r *bufio.Reader) (err os.Error) { } // Write Bind Response PDU -func (pdu *PDUBindResp) write(w *bufio.Writer) (err os.Error) { +func (pdu *PDUBindResp) write(w *bufio.Writer) (err error) { // Write Header err = pdu.Header.write(w) if err != nil { - err = os.NewError("Bind Response: Error writing Header") + err = errors.New("Bind Response: Error writing Header") return } // Create byte array the size of the PDU @@ -268,18 +268,18 @@ func (pdu *PDUBindResp) write(w *bufio.Writer) (err os.Error) { // Write to buffer _, err = w.Write(p) if err != nil { - err = os.NewError("Bind Response: Error writing to buffer") + err = errors.New("Bind Response: Error writing to buffer") return } // Flush write buffer err = w.Flush() if err != nil { - err = os.NewError("Bind Response: Error flushing write buffer") + err = errors.New("Bind Response: Error flushing write buffer") } // Optional params err = pdu.writeOptional(w) if err != nil { - err = os.NewError("Bind Response: Error writing optional params") + err = errors.New("Bind Response: Error writing optional params") } return } @@ -295,16 +295,16 @@ type PDUUnbind struct { } // Read Unbind PDU -func (pdu *PDUUnbind) read(r *bufio.Reader) (err os.Error) { +func (pdu *PDUUnbind) read(r *bufio.Reader) (err error) { return } // Write Unbind PDU -func (pdu *PDUUnbind) write(w *bufio.Writer) (err os.Error) { +func (pdu *PDUUnbind) write(w *bufio.Writer) (err error) { // Write Header err = pdu.Header.write(w) if err != nil { - err = os.NewError("Unbind: Error writing Header") + err = errors.New("Unbind: Error writing Header") } return } @@ -320,16 +320,16 @@ type PDUUnbindResp struct { } // Read Unbind Response PDU -func (pdu *PDUUnbindResp) read(r *bufio.Reader) (err os.Error) { +func (pdu *PDUUnbindResp) read(r *bufio.Reader) (err error) { return } // Write Unbind Response PDU -func (pdu *PDUUnbindResp) write(w *bufio.Writer) (err os.Error) { +func (pdu *PDUUnbindResp) write(w *bufio.Writer) (err error) { // Write Header err = pdu.Header.write(w) if err != nil { - err = os.NewError("Unbind Response: Error writing Header") + err = errors.New("Unbind Response: Error writing Header") } return } @@ -363,16 +363,16 @@ type PDUSubmitSM struct { } // Read SubmitSM PDU -func (pdu *PDUSubmitSM) read(r *bufio.Reader) (err os.Error) { +func (pdu *PDUSubmitSM) read(r *bufio.Reader) (err error) { return } // Write SubmitSM PDU -func (pdu *PDUSubmitSM) write(w *bufio.Writer) (err os.Error) { +func (pdu *PDUSubmitSM) write(w *bufio.Writer) (err error) { // Write Header err = pdu.Header.write(w) if err != nil { - err = os.NewError("SubmitSM: Error writing Header") + err = errors.New("SubmitSM: Error writing Header") return } // Create byte array the size of the PDU @@ -452,19 +452,19 @@ func (pdu *PDUSubmitSM) write(w *bufio.Writer) (err os.Error) { // Write to buffer _, err = w.Write(p) if err != nil { - err = os.NewError("SubmitSM: Error writing to buffer") + err = errors.New("SubmitSM: Error writing to buffer") return } // Flush write buffer err = w.Flush() if err != nil { - err = os.NewError("SubmitSM: Error flushing write buffer") + err = errors.New("SubmitSM: Error flushing write buffer") return } // Optional params err = pdu.writeOptional(w) if err != nil { - err = os.NewError("SubmitSM: Error writing optional params") + err = errors.New("SubmitSM: Error writing optional params") } return } @@ -481,11 +481,11 @@ type PDUSubmitSMResp struct { } // Read SubmitSM Response PDU -func (pdu *PDUSubmitSMResp) read(r *bufio.Reader) (err os.Error) { +func (pdu *PDUSubmitSMResp) read(r *bufio.Reader) (err error) { // Read message id (null terminated string or null) line, err := r.ReadBytes(0x00) if err != nil { - err = os.NewError("SubmitSM Response: Error reading message id") + err = errors.New("SubmitSM Response: Error reading message id") return } if len(line) > 1 { @@ -495,7 +495,7 @@ func (pdu *PDUSubmitSMResp) read(r *bufio.Reader) (err os.Error) { } // Write SubmitSM Response PDU -func (pdu *PDUSubmitSMResp) write(r *bufio.Writer) (err os.Error) { +func (pdu *PDUSubmitSMResp) write(r *bufio.Writer) (err error) { return } @@ -530,16 +530,16 @@ type PDUSubmitMulti struct { } // Read SubmitMulti PDU -func (pdu *PDUSubmitMulti) read(r *bufio.Reader) (err os.Error) { +func (pdu *PDUSubmitMulti) read(r *bufio.Reader) (err error) { return } // Write SubmitMulti PDU -func (pdu *PDUSubmitMulti) write(w *bufio.Writer) (err os.Error) { +func (pdu *PDUSubmitMulti) write(w *bufio.Writer) (err error) { // Write Header err = pdu.Header.write(w) if err != nil { - err = os.NewError("SubmitMulti: Error writing Header") + err = errors.New("SubmitMulti: Error writing Header") return } // Create byte array the size of the PDU @@ -634,19 +634,19 @@ func (pdu *PDUSubmitMulti) write(w *bufio.Writer) (err os.Error) { // Write to buffer _, err = w.Write(p) if err != nil { - err = os.NewError("SubmitMulti: Error writing to buffer") + err = errors.New("SubmitMulti: Error writing to buffer") return } // Flush write buffer err = w.Flush() if err != nil { - err = os.NewError("SubmitMulti: Error flushing write buffer") + err = errors.New("SubmitMulti: Error flushing write buffer") return } // Optional params err = pdu.writeOptional(w) if err != nil { - err = os.NewError("SubmitMulti: Error writing optional params") + err = errors.New("SubmitMulti: Error writing optional params") } fmt.Printf("SubmitMulti Header: %#v\n", pdu.Header) fmt.Printf("SubmitMulti p: %#v\nLength p: %d\n", p, len(p)) @@ -668,11 +668,11 @@ type PDUSubmitMultiResp struct { } // Read SubmitMulti Response PDU -func (pdu *PDUSubmitMultiResp) read(r *bufio.Reader) (err os.Error) { +func (pdu *PDUSubmitMultiResp) read(r *bufio.Reader) (err error) { // Read message id (null terminated string or null) line, err := r.ReadBytes(0x00) if err != nil { - err = os.NewError("SubmitMulti Response: Error reading message id") + err = errors.New("SubmitMulti Response: Error reading message id") return } if len(line) > 1 { @@ -681,7 +681,7 @@ func (pdu *PDUSubmitMultiResp) read(r *bufio.Reader) (err os.Error) { // Read unsuccessful destinations c, err := r.ReadByte() if err != nil { - err = os.NewError("SubmitMulti Response: Error reading number of unsuccessful destinations") + err = errors.New("SubmitMulti Response: Error reading number of unsuccessful destinations") return } pdu.NumUnsuccess = uint8(c) @@ -693,13 +693,13 @@ func (pdu *PDUSubmitMultiResp) read(r *bufio.Reader) (err os.Error) { p := make([]byte, 2) _, err = r.Read(p) if err != nil { - err = os.NewError("SubmitMulti Response: Error reading TON/NPI") + err = errors.New("SubmitMulti Response: Error reading TON/NPI") return } // Read Destination line, err = r.ReadBytes(0x00) if err != nil { - err = os.NewError("SubmitMulti Response: Error reading destination") + err = errors.New("SubmitMulti Response: Error reading destination") return } if len(line) > 1 { @@ -709,7 +709,7 @@ func (pdu *PDUSubmitMultiResp) read(r *bufio.Reader) (err os.Error) { p = make([]byte, 4) _, err = r.Read(p) if err != nil { - err = os.NewError("SubmitMulti Response: Error reading error code") + err = errors.New("SubmitMulti Response: Error reading error code") return } pdu.ErrorCodes[i] = uint32(unpackUint(p)) @@ -718,7 +718,7 @@ func (pdu *PDUSubmitMultiResp) read(r *bufio.Reader) (err os.Error) { } // Write SubmitMulti Response PDU -func (pdu *PDUSubmitMultiResp) write(r *bufio.Writer) (err os.Error) { +func (pdu *PDUSubmitMultiResp) write(r *bufio.Writer) (err error) { return } @@ -736,7 +736,7 @@ type PDUHeader struct { } // Read PDU Header -func (hdr *PDUHeader) read(r *bufio.Reader) (err os.Error) { +func (hdr *PDUHeader) read(r *bufio.Reader) (err error) { // Read all 16 Header bytes p := make([]byte, 16) _, err = r.Read(p) @@ -752,7 +752,7 @@ func (hdr *PDUHeader) read(r *bufio.Reader) (err os.Error) { } // Write PDU Header -func (hdr *PDUHeader) write(w *bufio.Writer) (err os.Error) { +func (hdr *PDUHeader) write(w *bufio.Writer) (err error) { // Convert Header into byte array p := make([]byte, 16) copy(p[0:4], packUint(uint64(hdr.CmdLength), 4)) @@ -777,7 +777,7 @@ type pduOptParam struct { } // Read Optional param -func (op *pduOptParam) read(r *bufio.Reader) (err os.Error) { +func (op *pduOptParam) read(r *bufio.Reader) (err error) { // Read first 4 descripter bytes p := make([]byte, 4) _, err = r.Read(p) @@ -811,21 +811,21 @@ func (op *pduOptParam) read(r *bufio.Reader) (err os.Error) { } // Write Optional param -func (op *pduOptParam) write(w *bufio.Writer) (err os.Error) { +func (op *pduOptParam) write(w *bufio.Writer) (err error) { // Create byte array p := make([]byte, 4 + op.length) copy(p[0:2], packUint(uint64(op.tag), 2)) copy(p[2:4], packUint(uint64(op.length), 2)) // Determine data type of value - v := reflect.NewValue(op.value) - switch t := v.(type) { - case *reflect.StringValue: - copy(p[4:op.length], []byte(op.value.(string))) - case *reflect.Uint8Value: + v := reflect.TypeOf(op.value) + switch v.Kind() { + case reflect.String: + copy(p[4:], []byte(op.value.(string))) + case reflect.Uint8: p[4] = byte(op.value.(uint8)) - case *reflect.Uint16Value: + case reflect.Uint16: copy(p[4:6], packUint(uint64(op.value.(uint16)), 2)) - case *reflect.Uint32Value: + case reflect.Uint32: copy(p[4:8], packUint(uint64(op.value.(uint32)), 4)) } // Write to buffer diff --git a/smpp_transmitter.go b/smpp_transmitter.go index 6e0d313..e00879b 100644 --- a/smpp_transmitter.go +++ b/smpp_transmitter.go @@ -5,9 +5,9 @@ package smpp import ( - "os" "reflect" "fmt" + "errors" ) // Transmitter type @@ -16,15 +16,15 @@ type Transmitter struct { } // Submit SM -func (tx *Transmitter) SubmitSM(dest, msg string, params Params, optional ...OptParams) (sequence uint32, msgId string, err os.Error) { +func (tx *Transmitter) SubmitSM(dest, msg string, params Params, optional ...OptParams) (sequence uint32, msgId string, err error) { // Check connected and bound if !tx.connected || !tx.bound { - err = os.NewError("SubmitSM: A bound connection is required to submit a message") + err = errors.New("SubmitSM: A bound connection is required to submit a message") return } // Check destination number and message if dest == "" { - err = os.NewError("SubmitSM: A destination number is required and should not be null") + err = errors.New("SubmitSM: A destination number is required and should not be null") return } // Merge params with defaults @@ -33,7 +33,7 @@ func (tx *Transmitter) SubmitSM(dest, msg string, params Params, optional ...Opt tx.sequence ++ // PDU header hdr := new(PDUHeader) - hdr.CmdLength = 34 + hdr.CmdLength = 33 hdr.CmdId = CMD_SUBMIT_SM hdr.CmdStatus = STATUS_ESME_ROK hdr.Sequence = tx.sequence @@ -41,7 +41,7 @@ func (tx *Transmitter) SubmitSM(dest, msg string, params Params, optional ...Opt paramOK := false defer func() { if !paramOK && recover() != nil { - err = os.NewError("SubmitSM: Panic, invalid params") + err = errors.New("SubmitSM: Panic, invalid params") return } }() @@ -73,25 +73,26 @@ func (tx *Transmitter) SubmitSM(dest, msg string, params Params, optional ...Opt hdr.CmdLength += uint32(len(pdu.SchedDelTime)) hdr.CmdLength += uint32(len(pdu.ValidityPeriod)) hdr.CmdLength += uint32(len(pdu.ShortMessage)) + // Calculate size of optional params if len(optional) > 0 && len(optional[0]) > 0 { pdu.Optional = optional[0] for _, val := range optional[0] { - v := reflect.NewValue(val) - switch t := v.(type) { + v := reflect.TypeOf(val) + switch v.Kind() { default: - err = os.NewError("SubmitSM: Invalid optional param format") + err = errors.New("SubmitSM: Invalid optional param format") return - case *reflect.StringValue: + case reflect.String: hdr.CmdLength += uint32(len(val.(string))) pdu.OptionalLen += uint32(len(val.(string))) - case *reflect.Uint8Value: + case reflect.Uint8: hdr.CmdLength ++ pdu.OptionalLen ++ - case *reflect.Uint16Value: + case reflect.Uint16: hdr.CmdLength += 2 pdu.OptionalLen += 2 - case *reflect.Uint32Value: + case reflect.Uint32: hdr.CmdLength += 4 pdu.OptionalLen += 4 } @@ -99,7 +100,7 @@ func (tx *Transmitter) SubmitSM(dest, msg string, params Params, optional ...Opt hdr.CmdLength += 4 pdu.OptionalLen += 4 } - } + } // Params were fine 'disable' the recover paramOK = true // Send PDU @@ -114,7 +115,7 @@ func (tx *Transmitter) SubmitSM(dest, msg string, params Params, optional ...Opt } else { rpdu, err := tx.GetResp(CMD_SUBMIT_SM_RESP, tx.sequence) if err != nil { - return + return sequence, msgId, err } s := rpdu.GetStruct() msgId = s.(PDUSubmitSMResp).MessageId @@ -123,15 +124,15 @@ func (tx *Transmitter) SubmitSM(dest, msg string, params Params, optional ...Opt } // Submit Multi -func (tx *Transmitter) SubmitMulti(destNum, destList []string, msg string, params Params, optional ...OptParams) (sequence uint32, msgId string, unsuccess []string, err os.Error) { +func (tx *Transmitter) SubmitMulti(destNum, destList []string, msg string, params Params, optional ...OptParams) (sequence uint32, msgId string, unsuccess []string, err error) { // Check connected and bound if !tx.connected || !tx.bound { - err = os.NewError("SubmitMulti: A bound connection is required to submit a message") + err = errors.New("SubmitMulti: A bound connection is required to submit a message") return } // Check destination number and message if len(destNum) == 0 && len(destList) == 0 { - err = os.NewError("SubmitMulti: At least 1 destination number or list is required") + err = errors.New("SubmitMulti: At least 1 destination number or list is required") return } // Merge params with defaults @@ -148,7 +149,7 @@ func (tx *Transmitter) SubmitMulti(destNum, destList []string, msg string, param paramOK := false defer func() { if !paramOK && recover() != nil { - err = os.NewError("SubmitMulti: Panic, invalid params") + err = errors.New("SubmitMulti: Panic, invalid params") return } }() @@ -197,21 +198,21 @@ func (tx *Transmitter) SubmitMulti(destNum, destList []string, msg string, param if len(optional) > 0 && len(optional[0]) > 0 { pdu.Optional = optional[0] for _, val := range optional[0] { - v := reflect.NewValue(val) - switch t := v.(type) { + v := reflect.ValueOf(val) + switch v.Kind() { default: - err = os.NewError("SubmitMulti: Invalid optional param format") + err = errors.New("SubmitMulti: Invalid optional param format") return - case *reflect.StringValue: + case reflect.String: hdr.CmdLength += uint32(len(val.(string))) pdu.OptionalLen += uint32(len(val.(string))) - case *reflect.Uint8Value: + case reflect.Uint8: hdr.CmdLength ++ pdu.OptionalLen ++ - case *reflect.Uint16Value: + case reflect.Uint16: hdr.CmdLength += 2 pdu.OptionalLen += 2 - case *reflect.Uint32Value: + case reflect.Uint32: hdr.CmdLength += 4 pdu.OptionalLen += 4 } @@ -234,8 +235,8 @@ func (tx *Transmitter) SubmitMulti(destNum, destList []string, msg string, param } else { rpdu, err := tx.GetResp(CMD_SUBMIT_MULTI_RESP, tx.sequence) if err != nil { - fmt.Printf("Result: %#v, %#v\n", rpdu, err) - return + fmt.Printf("Result: %#v, %#v\n", rpdu, err) + return sequence, msgId, unsuccess, err } s := rpdu.GetStruct() msgId = s.(PDUSubmitMultiResp).MessageId