Explorar o código

consolidate sequence state into one function

Mike %!s(int64=3) %!d(string=hai) anos
pai
achega
038f9e113e
Modificáronse 4 ficheiros con 26 adicións e 34 borrados
  1. 3 22
      cmd/main.go
  2. 5 4
      oscar/oservice.go
  3. 18 7
      oscar/protocol.go
  4. 0 1
      oscar/session.go

+ 3 - 22
cmd/main.go

@@ -7,7 +7,6 @@ import (
 	"log"
 	"net"
 	"net/http"
-	"os"
 )
 
 const testFile string = "/Users/mike/dev/goaim/aim.db"
@@ -76,8 +75,7 @@ func listenBOS(sm *oscar.SessionManager, fm *oscar.FeedbagStore) {
 			log.Println(err)
 			continue
 		}
-		seq := uint32(100)
-		go handleBOSConnection(sm, fm, conn, &seq)
+		go handleBOSConnection(sm, fm, conn)
 	}
 }
 
@@ -108,25 +106,8 @@ func handleAuthConnection(sm *oscar.SessionManager, conn net.Conn) {
 	}
 }
 
-func handleBOSConnection(sm *oscar.SessionManager, fm *oscar.FeedbagStore, conn net.Conn, seq *uint32) {
-	defer conn.Close()
-
-	fmt.Println("VerifyLogin...")
-	sess, err := oscar.VerifyLogin(sm, conn, seq)
-	if err != nil {
-		log.Println(err)
-		return
-	}
-
-	fmt.Println("writeOServiceHostOnline...")
-	if err := oscar.WriteOServiceHostOnline(conn, seq); err != nil {
-		if err == io.EOF {
-			fmt.Println(err.Error())
-			os.Exit(1)
-		}
-	}
-
-	if err := oscar.ReadBos(sm, sess, fm, conn, seq); err != nil && err != io.EOF {
+func handleBOSConnection(sm *oscar.SessionManager, fm *oscar.FeedbagStore, conn net.Conn) {
+	if err := oscar.ReadBos(sm, fm, conn); err != nil && err != io.EOF {
 		if err != io.EOF {
 			fmt.Println(err.Error())
 		}

+ 5 - 4
oscar/oservice.go

@@ -6,7 +6,6 @@ import (
 	"errors"
 	"fmt"
 	"io"
-	"net"
 	"reflect"
 	"time"
 )
@@ -146,7 +145,9 @@ func (s *snac01_03) write(w io.Writer) error {
 	return nil
 }
 
-func WriteOServiceHostOnline(conn net.Conn, sequence *uint32) error {
+func WriteOServiceHostOnline(rw io.ReadWriter, sequence *uint32) error {
+	fmt.Println("writeOServiceHostOnline...")
+
 	snac := &snac01_03{
 		snacFrame: snacFrame{
 			foodGroup: 0x01,
@@ -173,11 +174,11 @@ func WriteOServiceHostOnline(conn net.Conn, sequence *uint32) error {
 	*sequence++
 	fmt.Printf("writeOServiceHostOnline FLAP: %+v\n", flap)
 
-	if err := flap.write(conn); err != nil {
+	if err := flap.write(rw); err != nil {
 		return err
 	}
 
-	_, err := conn.Write(snacBuf.Bytes())
+	_, err := rw.Write(snacBuf.Bytes())
 	return err
 }
 

+ 18 - 7
oscar/protocol.go

@@ -389,6 +389,8 @@ func SendAndReceiveSignonFrame(rw io.ReadWriter, sequence *uint32) (*flapSignonF
 }
 
 func VerifyLogin(sm *SessionManager, rw io.ReadWriter, sequence *uint32) (*Session, error) {
+	fmt.Println("VerifyLogin...")
+
 	flap, err := SendAndReceiveSignonFrame(rw, sequence)
 	if err != nil {
 		return nil, err
@@ -500,7 +502,6 @@ func readIncomingRequests(rw io.Reader, msCh chan IncomingMessage, errCh chan er
 			return
 		case FlapFrameKeepAlive:
 			fmt.Println("keepalive heartbeat")
-			return
 		default:
 			errCh <- fmt.Errorf("unknown frame type: %v", flap)
 			return
@@ -508,24 +509,34 @@ func readIncomingRequests(rw io.Reader, msCh chan IncomingMessage, errCh chan er
 	}
 }
 
-func ReadBos(sm *SessionManager, sess *Session, fm *FeedbagStore, rw io.ReadWriteCloser, sequence *uint32) error {
-	defer rw.Close()
+func ReadBos(sm *SessionManager, fm *FeedbagStore, rwc io.ReadWriteCloser) error {
+	defer rwc.Close()
+
+	seq := uint32(100)
+	sess, err := VerifyLogin(sm, rwc, &seq)
+	if err != nil {
+		return err
+	}
 	defer sess.Close()
 
+	if err := WriteOServiceHostOnline(rwc, &seq); err != nil {
+		return err
+	}
+
 	// buffered so that the go routine has room to exit
 	msgCh := make(chan IncomingMessage, 1)
 	errCh := make(chan error, 1)
-	go readIncomingRequests(rw, msgCh, errCh)
+	go readIncomingRequests(rwc, msgCh, errCh)
 
 	for {
 		select {
 		case m := <-msgCh:
-			if err := routeIncomingRequests(sm, sess, fm, rw, sequence, m.snac, m.flap, m.buf); err != nil {
+			if err := routeIncomingRequests(sm, sess, fm, rwc, &seq, m.snac, m.flap, m.buf); err != nil {
 				return err
 			}
 		case m := <-sess.RecvMessage():
-			if err := writeOutSNAC(nil, m.flap, m.snacFrame, m.snacOut, sequence, rw); err != nil {
-				panic("error handling handleXMessage: " + err.Error())
+			if err := writeOutSNAC(nil, m.flap, m.snacFrame, m.snacOut, &seq, rwc); err != nil {
+				return err
 			}
 		case err := <-errCh:
 			return err

+ 0 - 1
oscar/session.go

@@ -85,7 +85,6 @@ func (s *Session) SendMessage(msg *XMessage) {
 }
 
 func (s *Session) Close() {
-	fmt.Println("closing out session")
 	close(s.stopCh)
 }