forked from sendgrid/go-gmime
-
Notifications
You must be signed in to change notification settings - Fork 0
/
stream_mem.go
63 lines (53 loc) · 1.41 KB
/
stream_mem.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package gmime
/*
#cgo pkg-config: gmime-2.6
#include <stdlib.h>
#include <string.h>
#include <gmime/gmime.h>
static GMimeStream * gmime_mem_stream_to_stream(GMimeStreamMem *obj) {
return GMIME_STREAM(obj);
}
*/
import "C"
import (
"unsafe"
)
type MemStream interface {
Stream
Bytes() []byte
}
type aMemStream struct {
*aStream
}
func CastMemStream(cms *C.GMimeStreamMem) *aMemStream {
s := CastStream((*C.GMimeStream)(unsafe.Pointer(cms)))
return &aMemStream{s}
}
func NewMemStream() MemStream {
cStream := C.g_mime_stream_mem_new()
cMemStream := (*C.GMimeStreamMem)(unsafe.Pointer(cStream))
defer unref(C.gpointer(cMemStream))
return CastMemStream(cMemStream)
}
func NewMemStreamWithBuffer(str string) MemStream {
var cBuffer *C.char = C.CString(str)
defer C.free(unsafe.Pointer(cBuffer))
strLen := len(str)
cStream := C.g_mime_stream_mem_new_with_buffer(cBuffer, (C.size_t)(strLen))
cMemStream := (*C.GMimeStreamMem)(unsafe.Pointer(cStream))
defer unref(C.gpointer(cMemStream))
return CastMemStream(cMemStream)
}
func (m *aMemStream) Bytes() []byte {
ptr := (*C.GMimeStreamMem)(m.pointer())
if m.Length() > 1 {
bArray := C.g_mime_stream_mem_get_byte_array(ptr)
length := bArray.len
cBuf := make([]byte, length)
cChar := unsafe.Pointer(unsafe.Pointer(&cBuf[0]))
// defer C.g_byte_array_unref(bArray)
C.memcpy(cChar, unsafe.Pointer(bArray.data), C.size_t(length))
return cBuf
}
return nil
}