aboutsummaryrefslogblamecommitdiff
path: root/connector/marshal.go
blob: 065c955afa1e1ad72e04f6139c592bd94a966c51 (plain) (tree)
1
2
3
4
5
6
7
8







                         









                                   




                                                  
                                                
                         
                                                 
                           
                                                   
                          
                                                  






                                                                   
                          

                               
                           

                                
                             

                                  
                            











                                                                         
                                          

                                                
                                         


                                                      
                                  





                                          
                                     
                                          
                                    
         













                                                                                  
         
 












                                                           




















                                                                                                        











                                                             
package connector

import (
	"bytes"
	"encoding/base64"
	"encoding/json"
	"fmt"
	"io"
	"io/ioutil"
	"net/http"
	"strings"
)

const (
	S_EVENT_JOIN    = "join"
	S_EVENT_LEAVE   = "leave"
	S_EVENT_MESSAGE = "message"
	S_EVENT_ACTION  = "action"
)

func (t EventType) MarshalText() ([]byte, error) {
	switch t {
	case EVENT_JOIN:
		return []byte(S_EVENT_JOIN), nil
	case EVENT_LEAVE:
		return []byte(S_EVENT_LEAVE), nil
	case EVENT_MESSAGE:
		return []byte(S_EVENT_MESSAGE), nil
	case EVENT_ACTION:
		return []byte(S_EVENT_ACTION), nil
	default:
		return nil, fmt.Errorf("Invalid event type: %d", t)
	}
}

func (t *EventType) UnmarshalText(text []byte) error {
	switch string(text) {
	case S_EVENT_JOIN:
		*t = EVENT_JOIN
		return nil
	case S_EVENT_LEAVE:
		*t = EVENT_LEAVE
		return nil
	case S_EVENT_MESSAGE:
		*t = EVENT_MESSAGE
		return nil
	case S_EVENT_ACTION:
		*t = EVENT_ACTION
		return nil
	default:
		return fmt.Errorf("Invalid event type: %s", string(text))
	}
}

// ----

type MediaObjectJSON struct {
	Filename  string     `json:"filename"`
	Mimetype  string     `json:"mime_type"`
	Size      int64      `json:"size"`
	ImageSize *ImageSize `json:"image_size"`
	Data      string     `json:"data"`
	URL       string     `json:"url"`
}

func (mo SMediaObject) MarshalJSON() ([]byte, error) {
	if mo.MediaObject == nil {
		return []byte("null"), nil
	}

	mod := MediaObjectJSON{
		Filename:  mo.Filename(),
		Mimetype:  mo.Mimetype(),
		Size:      mo.Size(),
		ImageSize: mo.ImageSize(),
		URL:       mo.URL(),
	}

	if mod.URL == "" {
		// If we don't have a URL, the only way is to pass the blob itself
		rd, err := mo.Read()
		if err != nil {
			return nil, err
		}
		defer rd.Close()
		buf := bytes.NewBuffer([]byte{})
		_, err = io.Copy(buf, rd)
		if err != nil {
			return nil, err
		}
		mod.Data = base64.StdEncoding.EncodeToString(buf.Bytes())
	}

	return json.Marshal(&mod)
}

func (mo *SMediaObject) UnmarshalJSON(jdata []byte) error {
	if string(jdata) == "null" {
		return nil
	}

	var d MediaObjectJSON
	err := json.Unmarshal(jdata, &d)
	if err != nil {
		return err
	}

	if d.URL != "" {
		*mo = SMediaObject{&LazyBlobMediaObject{
			ObjectFilename:  d.Filename,
			ObjectMimetype:  d.Mimetype,
			ObjectImageSize: d.ImageSize,
			GetFn: func(o *LazyBlobMediaObject) error {
				resp, err := http.Get(d.URL)
				if err != nil {
					return err
				}
				if o.ObjectMimetype == "" {
					o.ObjectMimetype = strings.Join(resp.Header["Content-Type"], "")
				}
				o.ObjectData, err = ioutil.ReadAll(resp.Body)
				return err
			},
		}}
		return nil
	}

	bytes, err := base64.StdEncoding.DecodeString(d.Data)
	if err != nil {
		return err
	}
	*mo = SMediaObject{&BlobMediaObject{
		ObjectFilename:  d.Filename,
		ObjectMimetype:  d.Mimetype,
		ObjectImageSize: d.ImageSize,
		ObjectData:      bytes,
	}}
	return nil
}