gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

call.go (1772B)


      1 package dbus
      2 
      3 import (
      4 	"context"
      5 	"errors"
      6 )
      7 
      8 var errSignature = errors.New("dbus: mismatched signature")
      9 
     10 // Call represents a pending or completed method call.
     11 type Call struct {
     12 	Destination string
     13 	Path        ObjectPath
     14 	Method      string
     15 	Args        []interface{}
     16 
     17 	// Strobes when the call is complete.
     18 	Done chan *Call
     19 
     20 	// After completion, the error status. If this is non-nil, it may be an
     21 	// error message from the peer (with Error as its type) or some other error.
     22 	Err error
     23 
     24 	// Holds the response once the call is done.
     25 	Body []interface{}
     26 
     27 	// ResponseSequence stores the sequence number of the DBus message containing
     28 	// the call response (or error). This can be compared to the sequence number
     29 	// of other call responses and signals on this connection to determine their
     30 	// relative ordering on the underlying DBus connection.
     31 	// For errors, ResponseSequence is populated only if the error came from a
     32 	// DBusMessage that was received or if there was an error receiving. In case of
     33 	// failure to make the call, ResponseSequence will be NoSequence.
     34 	ResponseSequence Sequence
     35 
     36 	// tracks context and canceler
     37 	ctx         context.Context
     38 	ctxCanceler context.CancelFunc
     39 }
     40 
     41 func (c *Call) Context() context.Context {
     42 	if c.ctx == nil {
     43 		return context.Background()
     44 	}
     45 
     46 	return c.ctx
     47 }
     48 
     49 func (c *Call) ContextCancel() {
     50 	if c.ctxCanceler != nil {
     51 		c.ctxCanceler()
     52 	}
     53 }
     54 
     55 // Store stores the body of the reply into the provided pointers. It returns
     56 // an error if the signatures of the body and retvalues don't match, or if
     57 // the error status is not nil.
     58 func (c *Call) Store(retvalues ...interface{}) error {
     59 	if c.Err != nil {
     60 		return c.Err
     61 	}
     62 
     63 	return Store(c.Body, retvalues...)
     64 }
     65 
     66 func (c *Call) done() {
     67 	c.Done <- c
     68 	c.ContextCancel()
     69 }