class RemoteSession(GetterSetter,QObject):
    '''This is the main high level object of the core of the Uploader.
    You need to create a remote session and use its methods in order
    to communicate and upload file to the Bloop servers'''

    def __init__(self):
        self.remote_url = "http://%s:%s/api/%s/index.o" % (
            meta['SERVER'],
            meta['PORT'],
            meta['API'])

        self.server = ServiceProxy(self.remote_url)
        
        QObject.__init__(self)
        GetterSetter.__init__(self)
        
    def onStateChanged(self, state):
        print "RemoteSession.onStateChanged()! state:",state
    
    def _readRemoteResponse(self,result):
        '''Used in every request, this parses the
        returned array and fills in several variables'''
        if result.has_key(u'result'):

            if result.has_key(u'status'):
                self.status = result[u'status']

            if result.has_key(u'api_name'):
                self.api_name = result[u'api_name']

            if result.has_key(u'api_version'):
                self.api_version = result[u'api_version']

            if result.has_key(u'time'):
                self.time = result[u'time']

            if result.has_key(u'result'):
                result = result[u'result']

        return result

    def setSessionId(self,sessionId):
        '''Sets the session Id.(Set to None when
        the session is destroyed)'''
        self._set('session_id',sessionId)

    def getSessionId(self):
        '''Gets the current session Id.'''
        return self._get('session_id')

    def setUsername(self,username):
        self._set('username',username)

    def setPassword(self,password):
        self._set('password',password)

    def getUsername(self):
        return self._get('username')
    
    def getCallStatus(self):
        return self.status

    def _getPassword(self):
        return self._get('password')
    
    def invalidate(self):
        '''Gets rid of all the data about this object, basically reset it, make it invalid'''
        self.setUsername(None)
        self.setPassword(None)
        self.setSessionId(None)
        self.setUserProfile(None)

    def create(self,username,password):
        '''
        Request for session creation.
        
        This is the handshake with the
        server.
        
        We should come out of this with a session ID.
        '''
        result = None
        r = None
        try:
            r = self.server.create(username,password,meta)
            result = self._readRemoteResponse(r)
        except Exception,e:
            self.invalidate()
            raise e

        if self.status != u'1':
            self.invalidate()
            raise Exception(result)
        
        self.setUsername(username)
        self.setPassword(password)

        assert(result.has_key(u'sessionId'))

        self.setSessionId(result[u"sessionId"])

        return result