Beispiel #1
0
func ConnectDomainEventRegister(conn VirConnection, domain VirDomain, event int, eventHandler interface{}) int {

	var cb C.virConnectDomainEventGenericCallback
	var myevent C.int
	//check eventHandler
	switch eventHandler.(type) {
	case LifeCycleCallBackType:
		break
	case GenericCallBackType:
		break
	default:
		fmt.Printf("Type error %T", eventHandler)
		return -1
	}

	var data = innerData{userCallback: eventHandler}

	gcMap[&data] = true

	switch event {
	case VIR_DOMAIN_EVENT_ID_LIFECYCLE:
		cb = C.virConnectDomainEventGenericCallback(C.libvirt_lifecycle_eventcallback_cgo)
		myevent = C.VIR_DOMAIN_EVENT_ID_LIFECYCLE
	case VIR_DOMAIN_EVENT_ID_REBOOT:
		cb = C.virConnectDomainEventGenericCallback(C.libvirt_generic_eventcallback_cgo)
		myevent = C.VIR_DOMAIN_EVENT_ID_REBOOT
	}

	r := C.virConnectDomainEventRegisterAny(conn.ptr, domain.ptr, myevent,
		cb,
		unsafe.Pointer(&data),
		(C.virFreeCallback)(C.libvirt_virfreecalback_cgo))
	result := int(r)
	return result
}
Beispiel #2
0
func (c *VirConnection) DomainEventRegister(dom VirDomain,
	eventId int,
	callback *DomainEventCallback,
	opaque func()) int {
	var callbackPtr unsafe.Pointer
	context := domainCallbackContext{
		cb: callback,
		f:  opaque,
	}

	switch eventId {
	case VIR_DOMAIN_EVENT_ID_LIFECYCLE:
		callbackPtr = unsafe.Pointer(C.domainEventLifecycleCallback_cgo)
	case VIR_DOMAIN_EVENT_ID_REBOOT:
	case VIR_DOMAIN_EVENT_ID_CONTROL_ERROR:
		callbackPtr = unsafe.Pointer(C.domainEventGenericCallback_cgo)
	case VIR_DOMAIN_EVENT_ID_RTC_CHANGE:
		callbackPtr = unsafe.Pointer(C.domainEventRTCChangeCallback_cgo)
	case VIR_DOMAIN_EVENT_ID_WATCHDOG:
		callbackPtr = unsafe.Pointer(C.domainEventWatchdogCallback_cgo)
	case VIR_DOMAIN_EVENT_ID_IO_ERROR:
		callbackPtr = unsafe.Pointer(C.domainEventIOErrorCallback_cgo)
	case VIR_DOMAIN_EVENT_ID_GRAPHICS:
		callbackPtr = unsafe.Pointer(C.domainEventGraphicsCallback_cgo)
	case VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON:
		callbackPtr = unsafe.Pointer(C.domainEventIOErrorReasonCallback_cgo)
	case VIR_DOMAIN_EVENT_ID_BLOCK_JOB:
		// TODO Post 1.2.4, uncomment later
		// case VIR_DOMAIN_EVENT_ID_BLOCK_JOB_2:
		callbackPtr = unsafe.Pointer(C.domainEventBlockJobCallback_cgo)
	case VIR_DOMAIN_EVENT_ID_DISK_CHANGE:
		callbackPtr = unsafe.Pointer(C.domainEventDiskChangeCallback_cgo)
	case VIR_DOMAIN_EVENT_ID_TRAY_CHANGE:
		callbackPtr = unsafe.Pointer(C.domainEventTrayChangeCallback_cgo)
	case VIR_DOMAIN_EVENT_ID_PMWAKEUP:
	case VIR_DOMAIN_EVENT_ID_PMSUSPEND:
	case VIR_DOMAIN_EVENT_ID_PMSUSPEND_DISK:
		callbackPtr = unsafe.Pointer(C.domainEventReasonCallback_cgo)
	case VIR_DOMAIN_EVENT_ID_BALLOON_CHANGE:
		callbackPtr = unsafe.Pointer(C.domainEventBalloonChangeCallback_cgo)
	case VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED:
		callbackPtr = unsafe.Pointer(C.domainEventDeviceRemovedCallback_cgo)
	default:
	}
	ret := int(C.virConnectDomainEventRegisterAny(c.ptr, dom.ptr, C.VIR_DOMAIN_EVENT_ID_LIFECYCLE,
		C.virConnectDomainEventGenericCallback(callbackPtr),
		unsafe.Pointer(&context),
		nil))
	// Keep context in registry
	if ret != -1 {
		c.event_cbs[ret] = &context
	}
	return ret
}