blob: a543ece41842f574d3690d2b7427d98d11303272 [file] [log] [blame]
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package lucy
/*
#include <stdlib.h>
#include "Lucy/Store/Lock.h"
#include "Lucy/Store/Folder.h"
#include "Lucy/Store/InStream.h"
#include "Lucy/Store/OutStream.h"
#include "Lucy/Store/DirHandle.h"
#include "Lucy/Store/FSDirHandle.h"
#include "Lucy/Store/FileHandle.h"
#include "Lucy/Store/FSFileHandle.h"
#include "Lucy/Store/RAMFileHandle.h"
#include "Lucy/Store/CompoundFileReader.h"
#include "Lucy/Store/CompoundFileWriter.h"
#include "Clownfish/Err.h"
*/
import "C"
import "unsafe"
import "fmt"
import "git-wip-us.apache.org/repos/asf/lucy-clownfish.git/runtime/go/clownfish"
type DirHandleIMP struct {
clownfish.ObjIMP
err error
}
func (e *LockErrIMP) Error() string {
self := ((*C.lucy_LockErr)(unsafe.Pointer(e.TOPTR())))
return clownfish.CFStringToGo(unsafe.Pointer(C.LUCY_LockErr_Get_Mess(self)))
}
func OpenInStream(file interface{}) (in InStream, err error) {
err = clownfish.TrapErr(func() {
fileC := (*C.cfish_Obj)(clownfish.GoToClownfish(file, unsafe.Pointer(C.CFISH_OBJ), false))
defer C.cfish_decref(unsafe.Pointer(fileC))
cfObj := C.lucy_InStream_open(fileC)
if cfObj == nil {
cfErr := C.cfish_Err_get_error();
panic(clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error))
}
in = WRAPInStream(unsafe.Pointer(cfObj))
})
return in, err
}
func (in *InStreamIMP) Reopen(fileName string, offset int64, length int64) (InStream, error) {
var retval InStream
err := clownfish.TrapErr(func() {
self := (*C.lucy_InStream)(clownfish.Unwrap(in, "in"))
fileNameCF := (*C.cfish_String)(clownfish.GoToClownfish(fileName, unsafe.Pointer(C.CFISH_STRING), true))
defer C.cfish_decref(unsafe.Pointer(fileNameCF))
retvalCF := C.LUCY_InStream_Reopen(self, fileNameCF,
C.int64_t(offset), C.int64_t(length))
retval = WRAPInStream(unsafe.Pointer(retvalCF))
})
return retval, err
}
func (in *InStreamIMP) Close() error {
return clownfish.TrapErr(func() {
self := (*C.lucy_InStream)(clownfish.Unwrap(in, "in"))
C.LUCY_InStream_Close(self)
})
}
func (in *InStreamIMP) Seek(target int64) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_InStream)(clownfish.Unwrap(in, "in"))
C.LUCY_InStream_Seek(self, C.int64_t(target))
})
}
func (in *InStreamIMP) ReadString() (string, error) {
var retval string
err := clownfish.TrapErr(func() {
self := (*C.lucy_InStream)(clownfish.Unwrap(in, "in"))
size := C.size_t(C.LUCY_InStream_Read_CU32(self))
buf := (*C.char)(C.malloc(size))
defer C.free(unsafe.Pointer(buf))
C.LUCY_InStream_Read_Bytes(self, buf, size)
retval = C.GoStringN(buf, C.int(size))
})
return retval, err
}
func (in *InStreamIMP) ReadBytes(b []byte, size int) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_InStream)(clownfish.Unwrap(in, "in"))
buf := (*C.char)(C.malloc(C.size_t(size)))
defer C.free(unsafe.Pointer(buf))
C.LUCY_InStream_Read_Bytes(self, buf, C.size_t(size))
dupe := []byte(C.GoStringN(buf, C.int(size)))
for i := 0; i < size; i++ {
b[i] = dupe[i]
}
})
}
func (in *InStreamIMP) ReadI8() (int8, error) {
var retval int8
err := clownfish.TrapErr(func() {
self := (*C.lucy_InStream)(clownfish.Unwrap(in, "in"))
retval = int8(C.LUCY_InStream_Read_I8(self))
})
return retval, err
}
func (in *InStreamIMP) ReadI32() (int32, error) {
var retval int32
err := clownfish.TrapErr(func() {
self := (*C.lucy_InStream)(clownfish.Unwrap(in, "in"))
retval = int32(C.LUCY_InStream_Read_I32(self))
})
return retval, err
}
func (in *InStreamIMP) ReadI64() (int64, error) {
var retval int64
err := clownfish.TrapErr(func() {
self := (*C.lucy_InStream)(clownfish.Unwrap(in, "in"))
retval = int64(C.LUCY_InStream_Read_I64(self))
})
return retval, err
}
func (in *InStreamIMP) ReadU8() (uint8, error) {
var retval uint8
err := clownfish.TrapErr(func() {
self := (*C.lucy_InStream)(clownfish.Unwrap(in, "in"))
retval = uint8(C.LUCY_InStream_Read_U8(self))
})
return retval, err
}
func (in *InStreamIMP) ReadU32() (uint32, error) {
var retval uint32
err := clownfish.TrapErr(func() {
self := (*C.lucy_InStream)(clownfish.Unwrap(in, "in"))
retval = uint32(C.LUCY_InStream_Read_U32(self))
})
return retval, err
}
func (in *InStreamIMP) ReadU64() (uint64, error) {
var retval uint64
err := clownfish.TrapErr(func() {
self := (*C.lucy_InStream)(clownfish.Unwrap(in, "in"))
retval = uint64(C.LUCY_InStream_Read_U64(self))
})
return retval, err
}
func (in *InStreamIMP) ReadCI32() (int32, error) {
var retval int32
err := clownfish.TrapErr(func() {
self := (*C.lucy_InStream)(clownfish.Unwrap(in, "in"))
retval = int32(C.LUCY_InStream_Read_CI32(self))
})
return retval, err
}
func (in *InStreamIMP) ReadCU32() (uint32, error) {
var retval uint32
err := clownfish.TrapErr(func() {
self := (*C.lucy_InStream)(clownfish.Unwrap(in, "in"))
retval = uint32(C.LUCY_InStream_Read_CU32(self))
})
return retval, err
}
func (in *InStreamIMP) ReadCI64() (int64, error) {
var retval int64
err := clownfish.TrapErr(func() {
self := (*C.lucy_InStream)(clownfish.Unwrap(in, "in"))
retval = int64(C.LUCY_InStream_Read_CI64(self))
})
return retval, err
}
func (in *InStreamIMP) ReadCU64() (uint64, error) {
var retval uint64
err := clownfish.TrapErr(func() {
self := (*C.lucy_InStream)(clownfish.Unwrap(in, "in"))
retval = uint64(C.LUCY_InStream_Read_CU64(self))
})
return retval, err
}
func (in *InStreamIMP) ReadF32() (float32, error) {
var retval float32
err := clownfish.TrapErr(func() {
self := (*C.lucy_InStream)(clownfish.Unwrap(in, "in"))
retval = float32(C.LUCY_InStream_Read_F32(self))
})
return retval, err
}
func (in *InStreamIMP) ReadF64() (float64, error) {
var retval float64
err := clownfish.TrapErr(func() {
self := (*C.lucy_InStream)(clownfish.Unwrap(in, "in"))
retval = float64(C.LUCY_InStream_Read_F64(self))
})
return retval, err
}
func OpenOutStream(file interface{}) (out OutStream, err error) {
err = clownfish.TrapErr(func() {
fileC := (*C.cfish_Obj)(clownfish.GoToClownfish(file, unsafe.Pointer(C.CFISH_OBJ), false))
defer C.cfish_decref(unsafe.Pointer(fileC))
cfObj := C.lucy_OutStream_open(fileC)
if cfObj == nil {
cfErr := C.cfish_Err_get_error();
panic(clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error))
}
out = WRAPOutStream(unsafe.Pointer(cfObj))
})
return out, err
}
func (out *OutStreamIMP) Close() error {
return clownfish.TrapErr(func() {
self := (*C.lucy_OutStream)(clownfish.Unwrap(out, "out"))
C.LUCY_OutStream_Close(self)
})
}
func (out *OutStreamIMP) Grow(length int64) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_OutStream)(clownfish.Unwrap(out, "out"))
C.LUCY_OutStream_Grow(self, C.int64_t(length))
})
}
func (out *OutStreamIMP) Align(modulus int64) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_OutStream)(clownfish.Unwrap(out, "out"))
C.LUCY_OutStream_Align(self, C.int64_t(modulus))
})
}
func (out *OutStreamIMP) WriteBytes(content []byte, size int) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_OutStream)(clownfish.Unwrap(out, "out"))
if size > len(content) {
panic(clownfish.NewErr(fmt.Sprintf("Buf only %d long, can't write %d bytes",
len(content), size)))
}
octets := C.CString(string(content))
defer C.free(unsafe.Pointer(octets))
C.LUCY_OutStream_Write_Bytes(self, unsafe.Pointer(octets), C.size_t(size))
})
}
func (out *OutStreamIMP) WriteString(content string) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_OutStream)(clownfish.Unwrap(out, "out"))
octets := C.CString(content)
defer C.free(unsafe.Pointer(octets))
size := len(content)
C.LUCY_OutStream_Write_String(self, octets, C.size_t(size))
})
}
func (out *OutStreamIMP) WriteI8(value int8) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_OutStream)(clownfish.Unwrap(out, "out"))
C.LUCY_OutStream_Write_I8(self, C.int8_t(value))
})
}
func (out *OutStreamIMP) WriteI32(value int32) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_OutStream)(clownfish.Unwrap(out, "out"))
C.LUCY_OutStream_Write_I32(self, C.int32_t(value))
})
}
func (out *OutStreamIMP) WriteI64(value int64) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_OutStream)(clownfish.Unwrap(out, "out"))
C.LUCY_OutStream_Write_I64(self, C.int64_t(value))
})
}
func (out *OutStreamIMP) WriteU8(value uint8) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_OutStream)(clownfish.Unwrap(out, "out"))
C.LUCY_OutStream_Write_U8(self, C.uint8_t(value))
})
}
func (out *OutStreamIMP) WriteU32(value uint32) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_OutStream)(clownfish.Unwrap(out, "out"))
C.LUCY_OutStream_Write_U32(self, C.uint32_t(value))
})
}
func (out *OutStreamIMP) WriteU64(value uint64) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_OutStream)(clownfish.Unwrap(out, "out"))
C.LUCY_OutStream_Write_U64(self, C.uint64_t(value))
})
}
func (out *OutStreamIMP) WriteCI32(value int32) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_OutStream)(clownfish.Unwrap(out, "out"))
C.LUCY_OutStream_Write_CI32(self, C.int32_t(value))
})
}
func (out *OutStreamIMP) WriteCU32(value uint32) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_OutStream)(clownfish.Unwrap(out, "out"))
C.LUCY_OutStream_Write_CU32(self, C.uint32_t(value))
})
}
func (out *OutStreamIMP) WriteCI64(value int64) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_OutStream)(clownfish.Unwrap(out, "out"))
C.LUCY_OutStream_Write_CI64(self, C.int64_t(value))
})
}
func (out *OutStreamIMP) WriteCU64(value uint64) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_OutStream)(clownfish.Unwrap(out, "out"))
C.LUCY_OutStream_Write_CU64(self, C.uint64_t(value))
})
}
func (out *OutStreamIMP) WriteF32(value float32) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_OutStream)(clownfish.Unwrap(out, "out"))
C.LUCY_OutStream_Write_F32(self, C.float(value))
})
}
func (out *OutStreamIMP) WriteF64(value float64) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_OutStream)(clownfish.Unwrap(out, "out"))
C.LUCY_OutStream_Write_F64(self, C.double(value))
})
}
func (out *OutStreamIMP) Absorb(in InStream) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_OutStream)(clownfish.Unwrap(out, "out"))
inStreamC := (*C.lucy_InStream)(clownfish.Unwrap(in, "in"))
C.LUCY_OutStream_Absorb(self, inStreamC)
})
}
func (f *FolderIMP) Initialize() error {
return clownfish.TrapErr(func() {
self := (*C.lucy_Folder)(clownfish.Unwrap(f, "f"))
C.LUCY_Folder_Initialize(self)
})
}
func (f *FolderIMP) OpenOut(path string) (retval OutStream, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_Folder)(clownfish.Unwrap(f, "f"))
pathC := (*C.cfish_String)(clownfish.GoToClownfish(path, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(pathC))
retvalC := C.LUCY_Folder_Open_Out(self, pathC)
if retvalC == nil {
cfErr := C.cfish_Err_get_error();
panic(clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error))
}
retval = WRAPOutStream(unsafe.Pointer(retvalC))
})
return retval, err
}
func (f *FolderIMP) OpenIn(path string) (retval InStream, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_Folder)(clownfish.Unwrap(f, "f"))
pathC := (*C.cfish_String)(clownfish.GoToClownfish(path, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(pathC))
retvalC := C.LUCY_Folder_Open_In(self, pathC)
if retvalC == nil {
cfErr := C.cfish_Err_get_error();
panic(clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error))
}
retval = WRAPInStream(unsafe.Pointer(retvalC))
})
return retval, err
}
func (f *FolderIMP) OpenFileHandle(path string, flags uint32) (retval FileHandle, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_Folder)(clownfish.Unwrap(f, "f"))
pathC := (*C.cfish_String)(clownfish.GoToClownfish(path, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(pathC))
retvalC := C.LUCY_Folder_Open_FileHandle(self, pathC, C.uint32_t(flags))
if retvalC == nil {
cfErr := C.cfish_Err_get_error();
panic(clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error))
}
retval = WRAPFileHandle(unsafe.Pointer(retvalC))
})
return retval, err
}
func (f *FolderIMP) OpenDir(path string) (retval DirHandle, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_Folder)(clownfish.Unwrap(f, "f"))
pathC := (*C.cfish_String)(clownfish.GoToClownfish(path, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(pathC))
retvalC := C.LUCY_Folder_Open_Dir(self, pathC)
if retvalC == nil {
cfErr := C.cfish_Err_get_error();
panic(clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error))
}
retval = WRAPDirHandle(unsafe.Pointer(retvalC))
})
return retval, err
}
func (f *FolderIMP) MkDir(path string) error {
self := (*C.lucy_Folder)(clownfish.Unwrap(f, "f"))
pathC := (*C.cfish_String)(clownfish.GoToClownfish(path, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(pathC))
success := C.LUCY_Folder_MkDir(self, pathC)
if !success {
cfErr := C.cfish_Err_get_error();
return clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error)
}
return nil
}
func (f *FolderIMP) List(path string) (retval []string, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_Folder)(clownfish.Unwrap(f, "f"))
pathC := (*C.cfish_String)(clownfish.GoToClownfish(path, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(pathC))
retvalC := C.LUCY_Folder_List(self, pathC)
if retvalC == nil {
cfErr := C.cfish_Err_get_error();
panic(clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error))
}
defer C.cfish_decref(unsafe.Pointer(retvalC))
retval = vecToStringSlice(retvalC)
})
return retval, err
}
func (f *FolderIMP) ListR(path string) (retval []string, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_Folder)(clownfish.Unwrap(f, "f"))
pathC := (*C.cfish_String)(clownfish.GoToClownfish(path, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(pathC))
retvalC := C.LUCY_Folder_List_R(self, pathC)
if retvalC == nil {
cfErr := C.cfish_Err_get_error();
panic(clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error))
}
defer C.cfish_decref(unsafe.Pointer(retvalC))
retval = vecToStringSlice(retvalC)
})
return retval, err
}
func (f *FolderIMP) Rename(from, to string) error {
self := (*C.lucy_Folder)(clownfish.Unwrap(f, "f"))
fromC := (*C.cfish_String)(clownfish.GoToClownfish(from, unsafe.Pointer(C.CFISH_STRING), false))
toC := (*C.cfish_String)(clownfish.GoToClownfish(to, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(fromC))
defer C.cfish_decref(unsafe.Pointer(toC))
success := C.LUCY_Folder_Rename(self, fromC, toC)
if !success {
cfErr := C.cfish_Err_get_error();
return clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error)
}
return nil
}
func (f *FolderIMP) HardLink(from, to string) error {
self := (*C.lucy_Folder)(clownfish.Unwrap(f, "f"))
fromC := (*C.cfish_String)(clownfish.GoToClownfish(from, unsafe.Pointer(C.CFISH_STRING), false))
toC := (*C.cfish_String)(clownfish.GoToClownfish(to, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(fromC))
defer C.cfish_decref(unsafe.Pointer(toC))
success := C.LUCY_Folder_Hard_Link(self, fromC, toC)
if !success {
cfErr := C.cfish_Err_get_error();
return clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error)
}
return nil
}
func (f *FolderIMP) SlurpFile(path string) (retval []byte, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_Folder)(clownfish.Unwrap(f, "f"))
pathC := (*C.cfish_String)(clownfish.GoToClownfish(path, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(pathC))
retvalC := C.LUCY_Folder_Slurp_File(self, pathC)
defer C.cfish_decref(unsafe.Pointer(retvalC))
retval = clownfish.ToGo(unsafe.Pointer(retvalC)).([]byte)
})
return retval, err
}
func (f *FolderIMP) Consolidate(path string) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_Folder)(clownfish.Unwrap(f, "f"))
pathC := (*C.cfish_String)(clownfish.GoToClownfish(path, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(pathC))
C.LUCY_Folder_Consolidate(self, pathC)
})
}
func (f *FolderIMP) LocalOpenIn(name string) (retval InStream, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_Folder)(clownfish.Unwrap(f, "f"))
nameC := (*C.cfish_String)(clownfish.GoToClownfish(name, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(nameC))
retvalC := C.LUCY_Folder_Local_Open_In(self, nameC)
if retvalC == nil {
cfErr := C.cfish_Err_get_error();
panic(clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error))
}
retval = WRAPInStream(unsafe.Pointer(retvalC))
})
return retval, err
}
func (f *FolderIMP) LocalOpenFileHandle(name string, flags uint32) (retval FileHandle, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_Folder)(clownfish.Unwrap(f, "f"))
nameC := (*C.cfish_String)(clownfish.GoToClownfish(name, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(nameC))
retvalC := C.LUCY_Folder_Local_Open_FileHandle(self, nameC, C.uint32_t(flags))
if retvalC == nil {
cfErr := C.cfish_Err_get_error();
panic(clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error))
}
retval = WRAPFileHandle(unsafe.Pointer(retvalC))
})
return retval, err
}
func (f *FolderIMP) LocalOpenDir() (retval DirHandle, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_Folder)(clownfish.Unwrap(f, "f"))
retvalC := C.LUCY_Folder_Local_Open_Dir(self)
if retvalC == nil {
cfErr := C.cfish_Err_get_error();
panic(clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error))
}
retval = WRAPDirHandle(unsafe.Pointer(retvalC))
})
return retval, err
}
func (f *FolderIMP) LocalMkDir(name string) error {
self := (*C.lucy_Folder)(clownfish.Unwrap(f, "f"))
nameC := (*C.cfish_String)(clownfish.GoToClownfish(name, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(nameC))
success := C.LUCY_Folder_Local_MkDir(self, nameC)
if !success {
cfErr := C.cfish_Err_get_error();
return clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error)
}
return nil
}
func (fh *FileHandleIMP) Write(data []byte, size int) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_FileHandle)(clownfish.Unwrap(fh, "fh"))
if size > len(data) {
panic(clownfish.NewErr(fmt.Sprintf("Buf only %d long, can't write %d bytes",
len(data), size)))
}
octets := C.CString(string(data))
defer C.free(unsafe.Pointer(octets))
C.LUCY_FH_Write(self, unsafe.Pointer(octets), C.size_t(size))
})
}
func (fh *FileHandleIMP) Read(b []byte, offset int64, length int) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_FileHandle)(clownfish.Unwrap(fh, "fh"))
buf := (*C.char)(C.malloc(C.size_t(length)))
defer C.free(unsafe.Pointer(buf))
C.LUCY_FH_Read(self, buf, C.int64_t(offset), C.size_t(length))
dupe := []byte(C.GoStringN(buf, C.int(length)))
for i := 0; i < length; i++ {
b[i] = dupe[i]
}
})
}
func (fh *FileHandleIMP) Grow(length int64) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_FileHandle)(clownfish.Unwrap(fh, "fh"))
C.LUCY_FH_Grow(self, C.int64_t(length))
})
}
func (fh *FileHandleIMP) Window(window FileWindow, offset, length int64) error {
self := (*C.lucy_FileHandle)(clownfish.Unwrap(fh, "fh"))
windowC := (*C.lucy_FileWindow)(clownfish.Unwrap(window, "window"))
success := C.LUCY_FH_Window(self, windowC, C.int64_t(offset), C.int64_t(length))
if !success {
cfErr := C.cfish_Err_get_error();
return clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error)
}
return nil
}
func (fh *FileHandleIMP) ReleaseWindow(window FileWindow) error {
self := (*C.lucy_FileHandle)(clownfish.Unwrap(fh, "fh"))
windowC := (*C.lucy_FileWindow)(clownfish.Unwrap(window, "window"))
success := C.LUCY_FH_Release_Window(self, windowC)
if !success {
cfErr := C.cfish_Err_get_error();
return clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error)
}
return nil
}
func (fh *FileHandleIMP) Close() error {
return clownfish.TrapErr(func() {
self := (*C.lucy_FileHandle)(clownfish.Unwrap(fh, "fh"))
C.LUCY_FH_Close(self)
})
}
func OpenFSFileHandle(path string, flags uint32) (fh FSFileHandle, err error) {
err = clownfish.TrapErr(func() {
pathC := (*C.cfish_String)(clownfish.GoToClownfish(path, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(pathC))
cfObj := C.lucy_FSFH_open(pathC, C.uint32_t(flags))
if cfObj == nil {
cfErr := C.cfish_Err_get_error();
panic(clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error))
}
fh = WRAPFSFileHandle(unsafe.Pointer(cfObj))
})
return fh, err
}
func OpenRAMFileHandle(path string, flags uint32, ramFile RAMFile) (fh RAMFileHandle, err error) {
err = clownfish.TrapErr(func() {
pathC := (*C.cfish_String)(clownfish.GoToClownfish(path, unsafe.Pointer(C.CFISH_STRING), false))
ramFileC := (*C.lucy_RAMFile)(clownfish.GoToClownfish(ramFile, unsafe.Pointer(C.LUCY_RAMFILE), true))
defer C.cfish_decref(unsafe.Pointer(pathC))
cfObj := C.lucy_RAMFH_open(pathC, C.uint32_t(flags), ramFileC)
if cfObj == nil {
cfErr := C.cfish_Err_get_error();
panic(clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error))
}
fh = WRAPRAMFileHandle(unsafe.Pointer(cfObj))
})
return fh, err
}
func (dh *DirHandleIMP) Error() error {
return dh.err
}
func (dh *DirHandleIMP) next() bool {
var retval bool
dh.err = clownfish.TrapErr(func() {
self := (*C.lucy_DirHandle)(clownfish.Unwrap(dh, "dh"))
retval = bool(C.LUCY_DH_Next(self))
})
if dh.err != nil {
return false
}
return retval
}
func (dh *DirHandleIMP) Close() error {
return clownfish.TrapErr(func() {
self := (*C.lucy_DirHandle)(clownfish.Unwrap(dh, "dh"))
C.LUCY_DH_Close(self)
})
}
func OpenFSDirHandle(path string) (dh FSDirHandle, err error) {
err = clownfish.TrapErr(func() {
pathC := (*C.cfish_String)(clownfish.GoToClownfish(path, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(pathC))
cfObj := C.lucy_FSDH_open(pathC)
if cfObj == nil {
cfErr := C.cfish_Err_get_error();
panic(clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error))
}
dh = WRAPFSDirHandle(unsafe.Pointer(cfObj))
})
return dh, err
}
func (lock *LockIMP) Request() error {
self := (*C.lucy_Lock)(clownfish.Unwrap(lock, "lock"))
success := C.LUCY_Lock_Request(self)
if !success {
cfErr := C.cfish_Err_get_error();
return clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error)
}
return nil
}
func (lock *LockIMP) Obtain() error {
self := (*C.lucy_Lock)(clownfish.Unwrap(lock, "lock"))
success := C.LUCY_Lock_Obtain(self)
if !success {
cfErr := C.cfish_Err_get_error();
return clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error)
}
return nil
}
func (lock *LockIMP) Release() error {
return clownfish.TrapErr(func() {
self := (*C.lucy_Lock)(clownfish.Unwrap(lock, "lock"))
C.LUCY_Lock_Release(self)
})
}
func (lock *LockIMP) ClearStale() error {
return clownfish.TrapErr(func() {
self := (*C.lucy_Lock)(clownfish.Unwrap(lock, "lock"))
C.LUCY_Lock_Clear_Stale(self)
})
}
func OpenCompoundFileReader(folder Folder) (reader CompoundFileReader, err error) {
err = clownfish.TrapErr(func() {
folderC := (*C.lucy_Folder)(clownfish.Unwrap(folder, "Folder"))
cfObj := C.lucy_CFReader_open(folderC)
if cfObj == nil {
cfErr := C.cfish_Err_get_error();
panic(clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error))
}
reader = WRAPCompoundFileReader(unsafe.Pointer(cfObj))
})
return reader, err
}
func (writer *CompoundFileWriterIMP) Consolidate() error {
return clownfish.TrapErr(func() {
self := (*C.lucy_CompoundFileWriter)(clownfish.Unwrap(writer, "writer"))
C.LUCY_CFWriter_Consolidate(self)
})
}