54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
|
|
###########################################################################
|
||
|
|
#
|
||
|
|
# This program is part of Zenoss Core, an open source monitoring platform.
|
||
|
|
# Copyright (C) 2008-2010, Zenoss Inc.
|
||
|
|
#
|
||
|
|
# This program is free software; you can redistribute it and/or modify it
|
||
|
|
# under the terms of the GNU General Public License version 2, or (at your
|
||
|
|
# option) any later version, as published by the Free Software Foundation.
|
||
|
|
#
|
||
|
|
# For complete information please visit: http://www.zenoss.com/oss/
|
||
|
|
#
|
||
|
|
###########################################################################
|
||
|
|
|
||
|
|
__doc__="""
|
||
|
|
Support classes for integrating deferreds into the Samba asynchronous framework
|
||
|
|
"""
|
||
|
|
|
||
|
|
from pysamba.library import logFuncCall
|
||
|
|
from pysamba.composite_context import *
|
||
|
|
from twisted.internet import defer
|
||
|
|
|
||
|
|
DEFERS = {}
|
||
|
|
COUNTER = 0L
|
||
|
|
|
||
|
|
class WMIFailure(Exception):
|
||
|
|
"Exception that represents a composite_context failure"
|
||
|
|
def __str__(self):
|
||
|
|
return library.nt_errstr(self.args[1])
|
||
|
|
|
||
|
|
class Callback(object):
|
||
|
|
"Turn a composite_context callback into a deferred callback"
|
||
|
|
def __init__(self):
|
||
|
|
# keep a reference to this object as long as it lives in the C code
|
||
|
|
global COUNTER
|
||
|
|
COUNTER += 1
|
||
|
|
self.which = COUNTER
|
||
|
|
DEFERS[self.which] = self
|
||
|
|
self.callback = composite_context_callback(self.callback)
|
||
|
|
self.deferred = defer.Deferred()
|
||
|
|
|
||
|
|
@logFuncCall
|
||
|
|
def callback(self, ctx):
|
||
|
|
# remove the reference to the object now that we're out of C code
|
||
|
|
try:
|
||
|
|
DEFERS.pop(self.which)
|
||
|
|
except KeyError, ex:
|
||
|
|
log.error("Encountered error in pysamba.Callback.callback: " + ex)
|
||
|
|
d = self.deferred
|
||
|
|
if ctx.contents.state == COMPOSITE_STATE_DONE:
|
||
|
|
d.callback(ctx.contents.async.private_data)
|
||
|
|
else:
|
||
|
|
d.errback(WMIFailure(ctx.contents.state,
|
||
|
|
ctx.contents.status))
|