def checkCredentials(self):

        if self.useCachedResponse('checkCredentialsCache'):
            xmldata = self.getCachedResponse('checkCredentialsCache')
            BongEnvironment.logger.info(u"using cached response for checkCredentials")
            #BongEnvironment.logger.info(unicode_string(xmldata))
            tree = ET.fromstring(xmldata)
        else:
            url = "http://{server}/api/users.xml?{credentials}".format( server = self.server
                                                                      , credentials = urllib.urlencode({ 'username' : self.username
                                                                                                       , 'password' : self.password }))
            request = urllib2.Request(url)
            response = urllib2.urlopen(request)
            if response.code != 200:
                BongEnvironment.logger.warning(url)
                BongEnvironment.logger.warning("request failed ({code!s} {message!s})".format( code = response.code
                                                                                  , message = response.msg ))
                return False

            BongEnvironment.logger.info("{req} -> ({code!s} {message!s})".format( req = url
                                                                     , code = response.code
                                                                     , message = response.msg ))
            xmldata = response.read()
            BongEnvironment.logger.info(unicode_string(xmldata))
            tree = ET.fromstring(xmldata)

            if self._et_node_text(tree, "status", "false") != 'true':
                BongEnvironment.logger.warning("response contains errors.")
                return False
            else:
                self.cacheResponse('checkCredentialsCache', xmldata)

        return True ;
    def deleteRecording(self, recordingID):
        url = "http://{server}/api/recordings/{id}/delete.xml?{credentials}".format( server = self.server
                                                                                   , id = recordingID
                                                                                   , credentials = urllib.urlencode({ 'username' : self.username
                                                                                                                    , 'password' : self.password }))
        request = urllib2.Request(url)
        response = urllib2.urlopen(request)
        self.killCachedResponse('getRecordingsCache')

        if response.code != 200:
            BongEnvironment.logger.warning(url)
            BongEnvironment.logger.warning("request failed ({code!s} {message!s})".format( code = response.code
                                                                              , message = response.msg ))
            return False

        BongEnvironment.logger.info("{req} -> ({code!s} {message!s})".format( req = url
                                                                 , code = response.code
                                                                 , message = response.msg ))
        xmldata = response.read()
        BongEnvironment.logger.info(unicode_string(xmldata))
        tree = ET.fromstring(xmldata)

        if self._et_node_text(tree, "status", "false") != 'true':
            BongEnvironment.logger.warning("response contains errors.")
            return False

        return True ;
    def getRecordings(self):
    
        self.recordings.clear()
        
        if self.useCachedResponse('getRecordingsCache'):
            xmldata = self.getCachedResponse('getRecordingsCache')
            BongEnvironment.logger.info(u"using cached response for getRecordings()")
            #BongEnvironment.logger.info(unicode_string(xmldata))
            tree = ET.fromstring(xmldata)
        else:
            url = "http://{server}/api/recordings.xml?{credentials}".format( server = self.server
                                                                           , credentials = urllib.urlencode({ 'username' : self.username
                                                                                                            , 'password' : self.password }))
            request = urllib2.Request(url)
            response = urllib2.urlopen(request)
            if response.code != 200:
                BongEnvironment.logger.warning(url)
                BongEnvironment.logger.warning("request failed ({code!s} {message!s})".format( code = response.code
                                                                                  , message = response.msg ))
                return False

            BongEnvironment.logger.info("{req} -> ({code!s} {message!s})".format( req = url
                                                                     , code = response.code
                                                                     , message = response.msg ))
            xmldata = response.read()
            BongEnvironment.logger.info(unicode_string(xmldata))
        
            tree = ET.fromstring(xmldata)

            if self._et_node_text(tree, "status", "false") != 'true':
                BongEnvironment.logger.warning("response contains errors.")
                return False
            else:
                self.cacheResponse('getRecordingsCache', xmldata)

        # find all recording elements with an id sub-element
        for rec in tree.findall("recording/[id]"):
            id = self._et_node_text(rec, "id")
            if 0 < len(id):
                recitems = {}
                self.recordings[id] = recitems
                for item in rec:
                    if item.tag != u"files":
                        recitems[item.tag] = unescape(item.text)
                for media in rec.findall("files/file"):
                    if self._et_node_text(media, "type") == 'download':
                        if self._et_node_text(media, "quality") == 'HQ':
                            recitems["downloadHQ"] = self._et_node_text(media, "url")
                        elif self._et_node_text(media, "quality") == 'NQ':
                            recitems["downloadNQ"] = self._et_node_text(media, "url")
                for name in self.reccat:
                    if not name in recitems:
                        BongEnvironment.logger.warning("missing element {} in recording {}".format(name, id))
                        return False
        return True