From cd8dd43123550f7e01bd09e6f5d8bb6dbd2bfee0 Mon Sep 17 00:00:00 2001
From: Christian Pointner <equinox@helsinki.at>
Date: Tue, 29 Dec 2015 03:31:16 +0100
Subject: implemented basic structure for web socket interface


diff --git a/src/helsinki.at/rhimportd/ctrlWebSocket.go b/src/helsinki.at/rhimportd/ctrlWebSocket.go
index 2ba2192..09095dd 100644
--- a/src/helsinki.at/rhimportd/ctrlWebSocket.go
+++ b/src/helsinki.at/rhimportd/ctrlWebSocket.go
@@ -26,12 +26,63 @@ package main
 
 import (
 	//	"encoding/json"
+	"fmt"
 	"github.com/gorilla/websocket"
 	"helsinki.at/rhimport"
 	"html"
 	"net/http"
 )
 
+type webSocketRequestData struct {
+	Command            string `json:"COMMAND"`
+	Id                 string `json:"ID"`
+	UserName           string `json:"LOGIN_NAME"`
+	Password           string `json:"PASSWORD"`
+	ShowId             uint   `json:"SHOW_ID"`
+	ClearShowCarts     bool   `json:"CLEAR_SHOW_CARTS"`
+	MusicPoolGroup     string `json:"MUSIC_POOL_GROUP"`
+	Cart               uint   `json:"CART_NUMBER"`
+	ClearCart          bool   `json:"CLEAR_CART"`
+	Cut                uint   `json:"CUT_NUMBER"`
+	Channels           uint   `json:"CHANNELS"`
+	NormalizationLevel int    `json:"NORMALIZATION_LEVEL"`
+	AutotrimLevel      int    `json:"AUTOTRIM_LEVEL"`
+	UseMetaData        bool   `json:"USE_METADATA"`
+	SourceUri          string `json:"SOURCE_URI"`
+}
+
+func newWebSocketRequestData(conf *rhimport.Config) *webSocketRequestData {
+	rd := new(webSocketRequestData)
+	rd.Command = ""
+	rd.Id = ""
+	rd.UserName = ""
+	rd.Password = ""
+	rd.ShowId = 0
+	rd.ClearShowCarts = false
+	rd.MusicPoolGroup = ""
+	rd.Cart = 0
+	rd.ClearCart = false
+	rd.Cut = 0
+	rd.Channels = conf.ImportParamDefaults.Channels
+	rd.NormalizationLevel = conf.ImportParamDefaults.NormalizationLevel
+	rd.AutotrimLevel = conf.ImportParamDefaults.AutotrimLevel
+	rd.UseMetaData = conf.ImportParamDefaults.UseMetaData
+	rd.SourceUri = ""
+
+	return rd
+}
+
+type webSocketErrorResponseData struct {
+	ResponseCode int    `json:"RESPONSE_CODE"`
+	ErrorString  string `json:"ERROR_STRING"`
+}
+
+func sendWebSocketErrorResponse(ws *websocket.Conn, code int, err_str string) {
+	if err := ws.WriteJSON(webSocketErrorResponseData{code, err_str}); err != nil {
+		rhdl.Println("WebScoket Client", ws.RemoteAddr(), "write error:", err)
+	}
+}
+
 func webSocketHandler(conf *rhimport.Config, rddb *rhimport.RdDbChan, trusted bool, w http.ResponseWriter, r *http.Request) {
 	rhdl.Printf("WebSocketHandler: request for '%s'", html.EscapeString(r.URL.Path))
 
@@ -46,17 +97,33 @@ func webSocketHandler(conf *rhimport.Config, rddb *rhimport.RdDbChan, trusted bo
 	rhdl.Println("WebSocket Client", ws.RemoteAddr(), "connected")
 
 	for {
-		msgtype, msg, err := ws.ReadMessage()
-		if err != nil {
+		reqdata := newWebSocketRequestData(conf)
+		if err := ws.ReadJSON(&reqdata); err != nil {
 			rhdl.Println("WebSocket Client", ws.RemoteAddr(), "disconnected:", err)
 			return
-		}
-		if msgtype == websocket.TextMessage {
-			// TODO: implement the actual proto
-			rhdl.Println("Websocket Client", ws.RemoteAddr(), "got:", string(msg))
+		} else {
+			rhdl.Printf("Websocket Client %s got: %+v", ws.RemoteAddr(), reqdata)
+			if trusted {
+				reqdata.UserName = r.Header.Get("X-Forwarded-User")
+			}
 
-			if err := ws.WriteMessage(websocket.TextMessage, msg); err != nil {
-				rhdl.Println("WebScoket Client", ws.RemoteAddr(), "write error:", err)
+			switch reqdata.Command {
+			case "new":
+				sendWebSocketErrorResponse(ws, http.StatusNotImplemented, "new session - not yet implemented")
+				return
+			case "get":
+				if reqdata.UserName == "" {
+					sendWebSocketErrorResponse(ws, http.StatusBadRequest, "missing mandotary field LOGIN_NAME")
+					return
+				}
+				if reqdata.Id == "" {
+					sendWebSocketErrorResponse(ws, http.StatusBadRequest, "missing mandotary field ID")
+					return
+				}
+				sendWebSocketErrorResponse(ws, http.StatusNotImplemented, "get session - not yet implemented")
+				return
+			default:
+				sendWebSocketErrorResponse(ws, http.StatusBadRequest, fmt.Sprintf("unknown command '%s'", reqdata.Command))
 				return
 			}
 		}
diff --git a/src/helsinki.at/rhimportd/main.go b/src/helsinki.at/rhimportd/main.go
index 8a212f9..3ce61da 100644
--- a/src/helsinki.at/rhimportd/main.go
+++ b/src/helsinki.at/rhimportd/main.go
@@ -164,7 +164,7 @@ func main() {
 	}
 	defer rddb.Cleanup()
 
-	go session_test(conf, rddb.GetInterface())
+	//	go session_test(conf, rddb.GetInterface())
 
 	var wg sync.WaitGroup
 
diff --git a/test/socket.html b/test/socket.html
index d110c81..9ee91b6 100644
--- a/test/socket.html
+++ b/test/socket.html
@@ -20,12 +20,8 @@
         this.sock.onmessage = function (event) {
           $('#rawmsg').text(event.data);
         }
-        this.seqnum = 0;
         this.update = function() {
-          if ((this.seqnum % 15) == 0) {
-            this.sock.send(JSON.stringify({ test: "hello world", seq: this.seqnum }));
-          }
-          this.seqnum += 1;
+          this.sock.send(JSON.stringify({ COMMAND: "new" }));
         }
       }
 
-- 
cgit v0.10.2