func (d *mdiscovery) Scan(query string, handlerPtr mojom.ScanHandler_Pointer) (*mojom.Closer_Pointer, *mojom.Error, error) { ctx, cancel := context.WithCancel(d.ctx) scanCh, err := d.d.Scan(ctx, query) if err != nil { cancel() return nil, v2mError(err), nil } handler := mojom.NewScanHandlerProxy(handlerPtr, bindings.GetAsyncWaiter()) go func() { defer handler.Close_Proxy() for update := range scanCh { mUpdate := newMojoUpdate(d.ctx, update) req, ptr := mojom.CreateMessagePipeForUpdate() stub := mojom.NewUpdateStub(req, mUpdate, bindings.GetAsyncWaiter()) if err := handler.OnUpdate(ptr); err != nil { stub.Close() cancel() return } d.serveStub(stub, nil) } }() req, ptr := mojom.CreateMessagePipeForCloser() stub := mojom.NewCloserStub(req, &closer{cancel}, bindings.GetAsyncWaiter()) d.serveStub(stub, cancel) return &ptr, nil, nil }
func (d *mdiscovery) Advertise(ad mojom.Advertisement, visibility *[]string) (*[AdIdLen]uint8, *mojom.Closer_Pointer, *mojom.Error, error) { ctx, cancel := context.WithCancel(d.ctx) vAd := m2vAd(&ad) vVisibility := m2vVisibility(visibility) done, err := d.d.Advertise(ctx, &vAd, vVisibility) if err != nil { cancel() return nil, nil, v2mError(err), nil } stop := func() { cancel() <-done } req, ptr := mojom.CreateMessagePipeForCloser() stub := mojom.NewCloserStub(req, &closer{stop}, bindings.GetAsyncWaiter()) d.serveStub(stub, stop) var id [AdIdLen]uint8 id = vAd.Id return &id, &ptr, nil, nil }