Source code for canlib.kvmlib.dll

import ctypes as ct

from .. import dllLoader
from .exceptions import kvm_error
from .structures import memoLogEventEx

_no_errcheck = dllLoader.no_errcheck
_kvmDeviceOpen_errcheck = dllLoader.errcheck_by_argp(status_pos=1, errortype=kvm_error)
_kvmKmfOpen_errcheck = dllLoader.errcheck_by_argp(status_pos=1, errortype=kvm_error)
_kvmKmfOpenEx_errcheck = dllLoader.errcheck_by_argp(status_pos=1, errortype=kvm_error)
_kvmKmfOpenEx_errcheck = dllLoader.errcheck_by_argp(status_pos=1, errortype=kvm_error)
_kvmKmeOpenFile_errcheck = dllLoader.errcheck_by_argp(status_pos=1, errortype=kvm_error)
_kvmKmeCreateFile_errcheck = dllLoader.errcheck_by_argp(status_pos=1, errortype=kvm_error)


class KvmlibDll(dllLoader.MyDll):
    function_prototypes = {
        'kvmGetVersion': [[ct.POINTER(ct.c_int), ct.POINTER(ct.c_int), ct.POINTER(ct.c_int)]],
        'kvmInitialize': [[], None, _no_errcheck],  # Returns void, no errcheck function
        'kvmGetErrorText': [[ct.c_int32, ct.c_char_p, ct.c_size_t]],
        'kvmDeviceFormatDisk': [[ct.c_void_p, ct.c_int, ct.c_uint32, ct.c_uint32]],
        'kvmKmfGetUsage': [[ct.c_void_p, ct.POINTER(ct.c_uint32), ct.POINTER(ct.c_uint32)]],
        'kvmKmfOpen': [[ct.c_char_p, ct.POINTER(ct.c_int32), ct.c_int32], ct.c_void_p, _kvmKmfOpen_errcheck],
        'kvmKmfOpenEx': [[ct.c_char_p, ct.POINTER(ct.c_int32), ct.c_int32, ct.POINTER(ct.c_int), ct.POINTER(ct.c_int)], ct.c_void_p, _kvmKmfOpenEx_errcheck],
        'kvmDeviceDiskSize': [[ct.c_void_p, ct.POINTER(ct.c_uint32)]],
        'kvmDeviceGetRTC': [[ct.c_void_p, ct.POINTER(ct.c_ulong)]],
        'kvmLogFileGetCreatorSerial': [[ct.c_int32, ct.POINTER(ct.c_uint)]],
        'kvmLogFileGetStartTime': [[ct.c_void_p, ct.POINTER(ct.c_uint32)]],
        'kvmDeviceOpen': [[ct.c_int32, ct.POINTER(ct.c_int), ct.c_int], ct.c_void_p, _kvmDeviceOpen_errcheck],  # Returns handle
        'kvmDeviceMountKmf': [[ct.c_int32]],
        'kvmDeviceMountKmfEx': [[ct.c_void_p, ct.POINTER(ct.c_int), ct.POINTER(ct.c_int)]],
        'kvmLogFileDismount': [[ct.c_void_p]],
        'kvmLogFileMount': [[ct.c_void_p, ct.c_uint32, ct.POINTER(ct.c_uint32)]],
        'kvmKmfReadConfig': [[ct.c_void_p, ct.c_void_p, ct.c_size_t, ct.POINTER(ct.c_size_t)]],
        'kvmDeviceSetRTC': [[ct.c_void_p, ct.c_ulong]],
        'kvmDeviceDiskStatus': [[ct.c_void_p, ct.POINTER(ct.c_int)]],
        'kvmLogFileGetCount': [[ct.c_void_p, ct.POINTER(ct.c_uint32)]],
        'kvmDeviceGetSerialNumber': [[ct.c_void_p, ct.POINTER(ct.c_uint)]],
        'kvmLogFileReadEvent': [[ct.c_void_p, ct.POINTER(memoLogEventEx)]],
        'kvmKmfValidate': [[ct.c_void_p]],
        'kvmKmfWriteConfig': [[ct.c_void_p, ct.c_void_p, ct.c_uint]],
        'kvmLogFileDeleteAll': [[ct.c_void_p]],
        'kvmClose': [[ct.c_void_p]],
        'kvmKmeOpenFile': [[ct.c_char_p, ct.POINTER(ct.c_int32), ct.c_int32], ct.c_void_p, _kvmKmeOpenFile_errcheck],
        'kvmKmeScanFileType': [[ct.c_char_p, ct.POINTER(ct.c_int32)]],
        'kvmKmeCreateFile': [[ct.c_char_p, ct.POINTER(ct.c_int32), ct.c_int32], ct.c_void_p, _kvmKmeCreateFile_errcheck],
        'kvmKmeReadEvent': [[ct.c_void_p, ct.POINTER(memoLogEventEx)]],
        'kvmKmeWriteEvent': [[ct.c_void_p, ct.POINTER(memoLogEventEx)]],
        'kvmKmeCountEvents': [[ct.c_void_p, ct.POINTER(ct.c_uint32)]],
        'kvmKmeCloseFile': [[ct.c_void_p]],
    }

    def __init__(self, ct_dll):
        # set default values for function_prototypes
        self.default_restype = ct.c_int
        self.default_errcheck = self._error_check
        super(KvmlibDll, self).__init__(ct_dll, **self.function_prototypes)

    def _error_check(self, result, func, arguments):
        if result < 0:
            raise kvm_error(result)
        else:
            return result