This file is indexed.

/usr/share/pyshared/framework/subsystems/ousaged/resources.py is in fso-frameworkd 0.8.5.1-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Open Usage Daemon - Generic reference counted Resource Management

(C) 2008 Michael 'Mickey' Lauer <mlauer@vanille-media.de>
(C) 2008 Jan 'Shoragan' Lübbe <jluebbe@lasnet.de>
(C) 2008 Openmoko, Inc.
GPLv2 or later

Package: ousaged
Module: resources
"""

MODULE_NAME = "ousaged"
__version__ = "0.6.1"

from framework.config import config
from framework.patterns import tasklet

import gobject
import dbus
import dbus.service

import time, os, subprocess

import logging
logger = logging.getLogger( MODULE_NAME )

#----------------------------------------------------------------------------#
# DBus Exceptions specifications specific to this module

class PolicyUnknown( dbus.DBusException ):
    _dbus_error_name = "org.freesmartphone.Usage.PolicyUnknown"

class PolicyDisabled( dbus.DBusException ):
    _dbus_error_name = "org.freesmartphone.Usage.PolicyDisabled"

class UserExists( dbus.DBusException ):
    _dbus_error_name = "org.freesmartphone.Usage.UserExists"

class UserUnknown( dbus.DBusException ):
    _dbus_error_name = "org.freesmartphone.Usage.UserUnknown"

#----------------------------------------------------------------------------#
class AbstractResource( object ):
#----------------------------------------------------------------------------#
    """
    Abstract base class for a resource.

    This is the internal class used by the resource manager to keep track of a resource.
    Every resource has a name, a list of current users, and a policy.

    Valid policies are:
        * auto: Reference counted, this is the default,
        * disabled: The resource is always off,
        * enabled: The resource is always on.
    """

    VALID_POLICIES = "disabled auto enabled".split()

    def __init__( self, usageControl, name = "Abstract" ):
        """
        Create a new resource

        `usageControl` : the resource controler object that will handle this resource
        `name` : the name of the resource
        """
        self.usageControl = usageControl
        self.name = str(name)
        self.users = []
        self.policy = 'auto'
        self.isEnabled = False

    @tasklet.tasklet
    def _enable( self ):
        """
        Enable the resource.
        """
        yield None

    @tasklet.tasklet
    def _disable( self ):
        """
        Disable the resource.
        """
        yield None

    @tasklet.tasklet
    def _suspend( self ):
        """
        Called before the system is going to suspend.
        """
        yield None

    @tasklet.tasklet
    def _resume( self ):
        """
        Called after a system resume.
        """
        yield None

    @tasklet.tasklet
    def _update( self ):
        if not self.isEnabled and ( self.users or self.policy == 'enabled' ):
            logger.debug( "Enabling %s", self.name )
            ts = time.time()
            yield self._enable()
            logger.info( "Enabled %s in %.1f seconds", self.name, time.time()-ts )
            self.isEnabled = True
        elif self.isEnabled and not ( self.users or self.policy == 'enabled' ):
            logger.debug( "Disabling %s", self.name )
            ts = time.time()
            yield self._disable()
            logger.info( "Disabled %s in %.1f seconds", self.name, time.time()-ts )
            self.isEnabled = False

    @tasklet.tasklet
    def setPolicy( self, policy ):
        if not policy in AbstractResource.VALID_POLICIES:
            raise PolicyUnknown( "Unknown resource policy. Valid policies are %s" % AbstractResource.VALID_POLICIES )
        if self.users:
            if policy == "disabled":
                raise ResourceInUse( "Can't disable %s. Current users are: %s" % ( self.name, self.users ) )
        if self.policy != policy:
            self.policy = policy
            yield self._update()
            self.usageControl.ResourceChanged(
                self.name, self.isEnabled, { "policy": self.policy, "refcount": len( self.users ) }
            )

    @tasklet.tasklet
    def request( self, user ):
        if not self.policy in [ 'auto', 'enabled' ]:
            raise PolicyDisabled( "Requesting %s not allowed by resource policy." % ( self.name ) )
        if user in self.users:
            raise UserExists( "User %s already requested %s" % ( user, self.name ) )
        self.users.append( user )
        yield self._update()
        self.usageControl.ResourceChanged(
            self.name, self.isEnabled, {"policy": self.policy, "refcount": len( self.users )}
        )

    @tasklet.tasklet
    def release( self, user ):
        if not user in self.users:
            raise UserUnknown( "User %s did not request %s before releasing it" % ( user, self.name ) )
        self.users.remove( user )
        yield self._update()
        self.usageControl.ResourceChanged(
            self.name, self.isEnabled, {"policy": self.policy, "refcount": len( self.users )}
        )

    @tasklet.tasklet
    def cleanup( self, user ):
        if user in self.users:
            yield self.release( user )
            logger.info( "Releasing %s for vanished user %s", self.name, user )

#----------------------------------------------------------------------------#
class DummyResource( AbstractResource ):
#----------------------------------------------------------------------------#
    """
    This is a dummy resource class that does nothing.
    """
    def __init__( self, usageControl, name ):
        AbstractResource.__init__( self , usageControl, name )

    @tasklet.tasklet
    def _enable( self ):
        yield None

    @tasklet.tasklet
    def _disable( self ):
        yield None

#----------------------------------------------------------------------------#
class ODeviceDResource( AbstractResource ):
#----------------------------------------------------------------------------#
    """
    This is a resource class for objects controlled by the odeviced subsystem.
    """
    DEPRECATED = True

    def __init__( self, usageControl, name ):
        AbstractResource.__init__( self , usageControl, name )
        self.bus = dbus.SystemBus()

    @tasklet.tasklet
    def _enable( self ):
        proxy = self.bus.get_object( "org.freesmartphone.odeviced", "/org/freesmartphone/Device/PowerControl/" + self.name )
        iface = dbus.Interface( proxy, "org.freesmartphone.Device.PowerControl" )
        yield tasklet.WaitDBus( iface.SetPower, True)

    @tasklet.tasklet
    def _disable( self ):
        proxy = self.bus.get_object( "org.freesmartphone.odeviced", "/org/freesmartphone/Device/PowerControl/" + self.name )
        iface = dbus.Interface( proxy, "org.freesmartphone.Device.PowerControl" )
        yield tasklet.WaitDBus( iface.SetPower, False )

#----------------------------------------------------------------------------#
class ClientResource( AbstractResource ):
#----------------------------------------------------------------------------#
    """
    A resource controlled by an external client.

    The client needs to expose a dbus object implementing org.freesmartphone.Resource.
    It can register using the RegisterResource of /org/freesmartphone/Usage.
    If the client is written in python, it can use the framework.Resource class.
    """
    sync_resources_with_lifecycle = config.getValue( "ousaged", "sync_resources_with_lifecycle", "always" )

    def __init__( self, usageControl, name, path, sender ):
        """
        Create a new ClientResource

        Only the resource manager should call this method
        """
        super( ClientResource, self ).__init__( usageControl, name )
        bus = dbus.SystemBus()
        proxy = bus.get_object( sender, path )
        self.iface = dbus.Interface( proxy, "org.freesmartphone.Resource" )

        if self.sync_resources_with_lifecycle in ( "always", "startup" ):
            self._disable().start()

    @tasklet.tasklet
    def _enable( self ):
        """Simply call the client Enable method"""
        yield tasklet.WaitDBus( self.iface.Enable )

    @tasklet.tasklet
    def _disable( self ):
        """Simply call the client Disable method"""
        yield tasklet.WaitDBus( self.iface.Disable )

    @tasklet.tasklet
    def _suspend( self ):
        """Simply call the client Suspend method"""
        yield tasklet.WaitDBus( self.iface.Suspend )

    @tasklet.tasklet
    def _resume( self ):
        """Simply call the client Resume method"""
        yield tasklet.WaitDBus( self.iface.Resume )

#----------------------------------------------------------------------------#
if __name__ == "__main__":
#----------------------------------------------------------------------------#
    pass