Example #1
0
 def __init__(self):
     self.processMap = {}
     self.officeLock = threading.BoundedSemaphore(1)
     self.pdfLock = threading.BoundedSemaphore(maxPDFAccess)
     self.collator = Collator()
     self.curlHandle = CurlWrapper()
     self.demHelper = JSON()
     self.resolveUrl = "uno:socket,host=localhost,port=8100;urp;StarOffice.ComponentContext"
     self.isOOHealthy = "False"
Example #2
0
 def __init__(self):
 
     self.jsonObj = demjson.JSON()
     self.curlHandle = CurlWrapper()
     self.stateEngine = sl_stateMachine()
     
     # fill up cache buffer
     presenterCacheHandle = open(os.path.join(osconfig.cobArchive(), 'presenter.template'), 'r')
     self.presenterCacheBuffer = presenterCacheHandle.read()
     presenterCacheHandle.close()
     
     attendeeCacheHandle = open(os.path.join(osconfig.cobArchive(), 'attendee.template'), 'r')
     self.attendeeCacheBuffer = attendeeCacheHandle.read()
     attendeeCacheHandle.close()
     
     self.presenterCacheBuffer = string.replace(self.presenterCacheBuffer, 'DIMDIMSL_SCRIPTSERVER_URL', osconfig.scriptServerURL())
     self.attendeeCacheBuffer = string.replace(self.attendeeCacheBuffer, 'DIMDIMSL_SCRIPTSERVER_URL', osconfig.scriptServerURL())
     
     return
Example #3
0
class COBServer(object):
    
    jsonObj = None
    curlHandle = None
    stateEngine = None
    
    attendeeCacheBuffer = None
    presenterCacheBuffer = None
    
    def __init__(self):
    
        self.jsonObj = demjson.JSON()
        self.curlHandle = CurlWrapper()
        self.stateEngine = sl_stateMachine()
        
        # fill up cache buffer
        presenterCacheHandle = open(os.path.join(osconfig.cobArchive(), 'presenter.template'), 'r')
        self.presenterCacheBuffer = presenterCacheHandle.read()
        presenterCacheHandle.close()
        
        attendeeCacheHandle = open(os.path.join(osconfig.cobArchive(), 'attendee.template'), 'r')
        self.attendeeCacheBuffer = attendeeCacheHandle.read()
        attendeeCacheHandle.close()
        
        self.presenterCacheBuffer = string.replace(self.presenterCacheBuffer, 'DIMDIMSL_SCRIPTSERVER_URL', osconfig.scriptServerURL())
        self.attendeeCacheBuffer = string.replace(self.attendeeCacheBuffer, 'DIMDIMSL_SCRIPTSERVER_URL', osconfig.scriptServerURL())
        
        return
    
    def generateResourceID(self):
        random.seed()
        rString1 = str(random.random())
        rString1 = rString1[2:9]
        rString2 = str(random.random())
        rString2 = rString2[2:random.randint(1,8)]   
        return 'r' + rString1 + rString2
    
    def baseURL(self, originalURL):
        return string.rstrip(urlparse.urljoin(originalURL, 'dimdimsl'), 'dimdimsl')
    
    def closeMeeting(self, dimdimID):
        self.stateEngine.handleMeetingClose(dimdimID)
        
        jsonSuccess = jsonObject()
        jsonSuccess.clearResponse()
        jsonSuccess.add('result', 'true')
        jsonSuccess.add('method', 'closeMeeting')
        jsonSuccess.add('dimdimID', dimdimID)
        jsonSuccess.add('error', '7200')
        return jsonSuccess.jsonResponse()
    
    def listURLResources(self, dimdimID, bookmarkAction):
        jsonError = jsonObject()
        jsonError.clearResponse()
        jsonError.add('result', 'false')
        jsonError.add('method', 'listURLResources')
        jsonError.add('dimdimID', dimdimID)
        jsonError.add('error', '7404')
        
        meeting = self.stateEngine.getMeeting(dimdimID)
        if not meeting:
            # register the meeting first
            self.stateEngine.registerMeeting(dimdimID, bookmarkAction)
            return jsonError.jsonResponse()
        
        # update the bookmark action
        meeting.update({'bmAction' : bookmarkAction})
        
        jsonSuccess = jsonObject()
        jsonSuccess.clearResponse()
        jsonSuccess.add('result', 'true')
        jsonSuccess.add('method', 'listURLResources')
        entryJSONValue = '['
        count = 0

        resourceList = meeting.get('resources')
        regularList = resourceList.get('regular')
        preloadedList = resourceList.get('preloaded')
        noOfResources = len(regularList) + len(preloadedList)
        for (resourceID, resource) in regularList.iteritems():
            page = self.stateEngine.getCurrentPage(dimdimID)
            
            entryJSON = jsonObject()
            entryJSON.clearResponse()
            entryJSON.add('resourceID', resourceID)
            entryJSON.add('resourceType', 'regular')
            entryJSON.add('resourceURL', page.get('url'))
            entryJSONValue += entryJSON.jsonResponse()
            del entryJSON
            entryJSON = None
            
            if count < noOfResources - 1:
                entryJSONValue += ','
            count = count + 1
            
        for (resourceID, resource) in preloadedList.iteritems():
            page = self.stateEngine.getCurrentPage(dimdimID)
            
            entryJSON = jsonObject()
            entryJSON.clearResponse()
            entryJSON.add('resourceID', resourceID)
            entryJSON.add('resourceType', 'preloaded')
            entryJSON.add('resourceURL', page.get('url'))
            entryJSONValue += entryJSON.jsonResponse()
            del entryJSON
            entryJSON = None
            
            if count < noOfResources - 1:
                entryJSONValue += ','
            count = count + 1
            
        entryJSONValue += ']'

        jsonSuccess.add('resources',entryJSONValue)
        jsonSuccess.add('dimdimID', dimdimID)
        jsonSuccess.add('error', '7200')
        

        return jsonSuccess.jsonResponse()
    
    def sendEvents(self, dimdimID, roomID, sessionID, events):
        if not self.stateEngine.getMeeting(dimdimID):
            response = self.jsonObj.encode({'result' : False})
            return response.encode()
        eventObj = self.jsonObj.decode(events)
        lockState = eventObj.pop('lock')
        if lockState and (lockState.get('locked') != None):
            self.stateEngine.updateLockState(dimdimID, lockState)
        self.stateEngine.updateCurrentEvents(dimdimID, eventObj)
        response = self.jsonObj.encode({'result' : True})
        return response.encode()
    
    def bookmarkCurrentPage(self, dimdimID, roomID, sessionID):
        # bookmark can only be done on current resource, on the current page
        
        newResourceID = self.generateResourceID()
        meeting = self.stateEngine.getMeeting(dimdimID)
        if not meeting:
            response = self.jsonObj.encode({'result':False})
            return response.encode()
        page = self.stateEngine.getCurrentPage(dimdimID)
        self.stateEngine.bookmarkCurrentPage(dimdimID, newResourceID)
        response = self.jsonObj.encode({'result':True, 'resourceID':newResourceID, \
                                        'url' : urllib.quote(page.get('url')), 'bmAction' : meeting.get('bmAction')})
        return response.encode()
    
    def unregisterResource(self, dimdimID, roomID, sessionID, resourceID):
        # ideally, this should never be used.
        # we might have to use it if console cannot add a bookmarked
        # resource to the 'show items' list
        self.stateEngine.unregisterResource(dimdimID, resourceID)
        
        response = self.jsonObj.encode({'result':True})
        return response.encode()
    
    def syncToAttendeeContext(self, dimdimID, roomID, sessionID, returnType = 'json'):
        
        # Just give the current resource data and be done with it
        meeting = self.stateEngine.getMeeting(dimdimID)
        if not meeting:
            response = self.jsonObj.encode({'result':False})
            if returnType == 'json':
                return response.encode()
            return 'dimdimsl_contentAdvisory.handleSyncResponse('+response.encode()+')'
        currentResource = meeting.get('currentResource')
        resource = self.stateEngine.getCurrentResource(dimdimID)
        resourceType = self.stateEngine.getResourceType(dimdimID, currentResource)
        currentPageNum = resource.get('currentPage')
        lastPageNum = resource.get('lastPage')
        page = self.stateEngine.getCurrentPage(dimdimID)
        events = page.get('events')
        
        # add the lock event
        lockState = self.stateEngine.getLockState(dimdimID)
        if lockState and (lockState.get('locked') != None):
            events['lock'] = lockState
        
        responseMap = {}
        responseMap['result'] = True
        responseMap['resourceType'] = resourceType
        responseMap['resourceID'] = currentResource
        responseMap['pageNum'] = currentPageNum
        responseMap['lastPage'] = lastPageNum
        responseMap['page'] = page
        
        response = self.jsonObj.encode(responseMap)
        if returnType == 'json':
            return response.encode()
        
        return 'dimdimsl_contentAdvisory.handleSyncResponse('+response.encode()+')'
    
    def syncToPresenterContext(self, dimdimID, roomID, sessionID, pageNum = -1):
        
        # Presenter is a bit tricky.
        # pageNum parameter basically suggests that
        # it is the last known good configuration for the presenter.
        # so trim any resources till pageNum and then
        # sync to pageNum
        
        meeting = self.stateEngine.getMeeting(dimdimID)
        if not meeting:
            response = self.jsonObj.encode({'result':False})
            return response.encode()
        resource = self.stateEngine.getCurrentResource(dimdimID)
        if (pageNum > -1):
            if resource.get('lastPage') >= pageNum:
                resource.update({'currentPage' : pageNum})
                self.stateEngine.trimResourceToCurrentPage(dimdimID)
        
        # prepare presenter cache with current state
        resourceID = meeting.get('currentResource')
        resourceType = self.stateEngine.getCurrentResourceType(dimdimID)
        currentPageNum = resource.get('currentPage')
        
        # prepare cache
        presenterLocation = resourceType + '/' + resourceID + '/' + str(currentPageNum) + '/presenter/content.html'
        presenterCache = string.replace(self.presenterCacheBuffer, 'DIMDIMSL_COB_CONTENT_SRC', presenterLocation)
        
        pCacheLocation = os.path.join(os.path.join(osconfig.cobArchive(), dimdimID), 'p_cache.html')
        pCacheHandle = open(pCacheLocation, 'wb')
        pCacheHandle.write(presenterCache)
        pCacheHandle.close()
        
        response = self.jsonObj.encode({'result' : True, 'pageNum' : currentPageNum, 'location' : '/content/' + str(dimdimID) + '/p_cache.html'})
        return response.encode()
    
    def syncToResource(self, dimdimID, roomID, sessionID, resourceID, returnType):
        
        # navigate to the given resource first
        self.stateEngine.navigateToResource(dimdimID, resourceID)
        self.stateEngine.resetCurrentResource(dimdimID)
        self.stateEngine.trimResourceToCurrentPage(dimdimID)
        
        # prepare attendee and presenter cache with current state
        resource = self.stateEngine.getCurrentResource(dimdimID)
        resourceType = self.stateEngine.getCurrentResourceType(dimdimID)
        
        currentPageNum = resource.get('currentPage')
        
        # prepare cache
        presenterLocation = resourceType + '/' + resourceID + '/' + str(currentPageNum) + '/presenter/content.html'
        presenterCache = string.replace(self.presenterCacheBuffer, 'DIMDIMSL_COB_CONTENT_SRC', presenterLocation)
        
        attendeeLocation = resourceType + '/' + resourceID + '/' + str(currentPageNum) + '/attendee/content.html'
        attendeeCache = string.replace(self.attendeeCacheBuffer, 'DIMDIMSL_COB_CONTENT_SRC', attendeeLocation)
        
        pCacheLocation = os.path.join(os.path.join(osconfig.cobArchive(), dimdimID), 'p_cache.html')
        pCacheHandle = open(pCacheLocation, 'wb')
        pCacheHandle.write(presenterCache)
        pCacheHandle.close()
        
        aCacheLocation = os.path.join(os.path.join(osconfig.cobArchive(), dimdimID), 'a_cache.html')
        aCacheHandle = open(aCacheLocation, 'wb')
        aCacheHandle.write(attendeeCache)
        aCacheHandle.close()
        
        if returnType == 'method':
            return 'cobCallback(\''+str(dimdimID) + '\')'
        
        jsonSuccess = jsonObject()
        jsonSuccess.clearResponse()
        jsonSuccess.add('result', 'true')
        jsonSuccess.add('method', 'syncToURLResource')
        jsonSuccess.add('error', '7200')
        jsonSuccess.add('location', '/content/' + str(dimdimID))
        
        logManager.log('Meeting ' + dimdimID + ' synced to resource ' + resourceID, logging.INFO)
        
        return jsonSuccess.jsonResponse()
    
    def formSubmit(self, paramDict):
        
        dimdimID = paramDict.pop('dimdimsl_dimdimID')
        roomID = paramDict.pop('dimdimsl_roomID')
        sessionID = paramDict.pop('dimdimsl_sessionID')
        method = paramDict.pop('dimdimsl_method')
        action = paramDict.pop('dimdimsl_action')
        
        
        originalAction = urllib.unquote(action)
        page = self.stateEngine.getCurrentPage(dimdimID)
        currentBaseURL = self.baseURL(page.get('url'))
        baseURL = self.baseURL(originalAction)
        
        if string.find(originalAction, osconfig.serverURL()) >= 0:
            # some pages don't have base injected (e.g. youtube)
            # these pages might give out relative links which
            # assume osconfig.serverURL() as the base URL.
            originalAction = string.lstrip(originalAction, osconfig.serverURL())
            
        # it is possible that originalAction isn't an absolute link
        if string.find(originalAction, 'http://') != 0:
            # the only way originalAction isn't an absolute link is if
            # it belongs to the existing server. so we can
            # safely set baseURL to existing currentBaseURL
            baseURL = currentBaseURL
            originalAction = urlparse.urljoin(baseURL, originalAction)
            action = urllib.quote(originalAction)
    
        meeting = self.stateEngine.getMeeting(dimdimID)
        resourceID = meeting.get('currentResource')
        resource = self.stateEngine.getCurrentResource(dimdimID)
        lastPageNum = resource.get('lastPage')
        currentPageNum = resource.get('currentPage')
        if (currentPageNum != lastPageNum):
            self.stateEngine.trimResourceToCurrentPage(dimdimID)
            
        resourceType = self.stateEngine.getResourceType(dimdimID, resourceID)
        currentPageNum = currentPageNum + 1
        
        # just create the page and return its location
        
        resourcePath = os.path.join(os.path.join(os.path.join(osconfig.cobArchive(), dimdimID), resourceType), resourceID)
        pagePath = os.path.join(resourcePath, str(currentPageNum))
        presenterPagePath = os.path.join(pagePath, 'presenter')
        attendeePagePath = os.path.join(pagePath, 'attendee')
        
        if not os.path.isdir(presenterPagePath):
            os.makedirs(presenterPagePath)
        if not os.path.isdir(attendeePagePath):
            os.makedirs(attendeePagePath)
        
        tempStore = os.path.join(resourcePath, 'temp.html')
        try:
            os.remove(tempStore)
        except:
            pass
        
        retval = self.curlHandle.downloadToFileFromHTTPFormSubmit(action, method, paramDict, tempStore)
        if len(retval) < 3:
            try:
                os.remove(tempStore)
            except:
                pass
            try:
                shutil.rmtree(pagePath)
            except:
                pass

            response = self.jsonObj.encode({'result' : False, 'error' : 7500})
            return response.encode()
        
        if originalAction != retval:
            # must be a 302. this is our new URL
            originalAction = retval
            baseURL = self.baseURL(originalAction)
            encodedURL = urllib.quote(originalAction)
        
        htmlHandle = open(tempStore, 'r')
        htmlContent = htmlHandle.read()
        htmlHandle.close()
        
        # inject baseURL and jquery.noConflict
        # TODO - WHAT IF BASE URL IS ALREADY THERE ??
        htmlContent = contentMgr.sanitizeHTML(htmlContent, baseURL)
        
        self.prepareHtml(originalAction, htmlContent, presenterPagePath, attendeePagePath)
     
        try:
            os.remove(tempStore)
        except:
            pass
        
        # add this page to the stateMachine
        self.stateEngine.registerPage(dimdimID, originalAction)
        resource = self.stateEngine.getCurrentResource(dimdimID)
        lastPage = resource.get('lastPage')
        response = self.jsonObj.encode({'result' : True, 'lastPage' : str(lastPage), 'currentPage' : str(currentPageNum), 'error' : 7200})
        return response.encode()
    
    def navigateToURL(self, dimdimID, roomID, sessionID, encodedURL):
        
        # navigateToURL is called only from within a page.
        # so this is always for the 'current' resourceID
            
        originalURL = urllib.unquote(encodedURL)
        page = self.stateEngine.getCurrentPage(dimdimID)
        currentBaseURL = self.baseURL(page.get('url'))
        baseURL = self.baseURL(originalURL)
        
        if string.find(originalURL, osconfig.serverURL()) >= 0:
            # some pages don't have base injected (e.g. youtube)
            # these pages might give out relative links which
            # assume osconfig.serverURL() as the base URL.
            originalURL = string.lstrip(originalURL, osconfig.serverURL())
        
        # it is possible that originalURL isn't an absolute link
        if string.find(originalURL, 'http://') != 0:
            # the only way originalURL isn't an absolute link is if
            # it belongs to the existing server. so we can
            # safely set baseURL to existing currentBaseURL
            baseURL = currentBaseURL
            originalURL = urlparse.urljoin(baseURL, originalURL)
            encodedURL = urllib.quote(originalURL)
        
        meeting = self.stateEngine.getMeeting(dimdimID)
        resourceID = meeting.get('currentResource')
        resource = self.stateEngine.getCurrentResource(dimdimID)
        lastPageNum = resource.get('lastPage')
        currentPageNum = resource.get('currentPage')
        if (currentPageNum != lastPageNum):
            self.stateEngine.trimResourceToCurrentPage(dimdimID)
            
        resourceType = self.stateEngine.getResourceType(dimdimID, resourceID)
        currentPageNum = currentPageNum + 1
        
        # just create the page and return its location
        
        resourcePath = os.path.join(os.path.join(os.path.join(osconfig.cobArchive(), dimdimID), resourceType), resourceID)
        pagePath = os.path.join(resourcePath, str(currentPageNum))
        presenterPagePath = os.path.join(pagePath, 'presenter')
        attendeePagePath = os.path.join(pagePath, 'attendee')
        
        if not os.path.isdir(presenterPagePath):
            os.makedirs(presenterPagePath)
        if not os.path.isdir(attendeePagePath):
            os.makedirs(attendeePagePath)
        
        tempStore = os.path.join(resourcePath, 'temp.html')
        try:
            os.remove(tempStore)
        except:
            pass
        
        retval = self.curlHandle.downloadToFileFromHTTPURL(encodedURL, tempStore)
        if len(retval) < 3:
            try:
                os.remove(tempStore)
            except:
                pass
            try:
                shutil.rmtree(pagePath)
            except:
                pass
                
            response = self.jsonObj.encode({'result' : False, 'error' : 7500})
            return response.encode()
        
        if originalURL != retval:
            # must be a 302. this is our new URL
            originalURL = retval
            baseURL = self.baseURL(originalURL)
            encodedURL = urllib.quote(originalURL)
            
        htmlHandle = open(tempStore, 'r')
        htmlContent = htmlHandle.read()
        htmlHandle.close()
        
        htmlContent = contentMgr.sanitizeHTML(htmlContent, baseURL)
        self.prepareHtml(originalURL, htmlContent, presenterPagePath, attendeePagePath)
        
        try:
            os.remove(tempStore)
        except:
            pass
        
        # add this page to the stateMachine
        self.stateEngine.registerPage(dimdimID, originalURL)
        resource = self.stateEngine.getCurrentResource(dimdimID)
        lastPage = resource.get('lastPage')
        response = self.jsonObj.encode({'result' : True, 'lastPage' : str(lastPage), 'currentPage' : str(currentPageNum), 'error' : 7200})
        return response.encode()
    
    def navigateBack(self, dimdimID, roomID, sessionID):
        currentPageNum = self.stateEngine.navigateToPage(dimdimID, 'back')
        resource = self.stateEngine.getCurrentResource(dimdimID)
        lastPage = resource.get('lastPage')
        response = self.jsonObj.encode({'result' : True, 'lastPage' : str(lastPage), 'currentPage' : str(currentPageNum), 'error' : 7200})
        return response.encode()
    
    def navigateForward(self, dimdimID, roomID, sessionID):
        currentPageNum = self.stateEngine.navigateToPage(dimdimID, 'forward')
        resource = self.stateEngine.getCurrentResource(dimdimID)
        lastPage = resource.get('lastPage')
        response = self.jsonObj.encode({'result' : True, 'lastPage' : str(lastPage), 'currentPage' : str(currentPageNum), 'error' : 7200})
        return response.encode()
    
    def getResourceInfo(self, dimdimID, roomID, sessionID):
        resource = self.stateEngine.getCurrentResource(dimdimID)
        lockState = self.stateEngine.getLockState(dimdimID)
        if resource:
            currentPage = resource.get('currentPage')
            page = self.stateEngine.getCurrentPage(dimdimID)
            currentURL = page.get('url')
            toBeReplaced = 'http://'
            if string.find(currentURL, 'https://') == 0:
                toBeReplaced = 'https://'
            currentURL = string.replace(currentURL, toBeReplaced, '')
            lastPage = resource.get('lastPage')
            resourceInfo = {'result' : True, 'currentPage' : currentPage, 'lastPage' : lastPage, 'url': currentURL}
            if lockState and (lockState.get('locked') != None):
                resourceInfo['lock'] = lockState
            response = self.jsonObj.encode(resourceInfo)
        else:
            response = self.jsonObj.encode({'result':False})
        return response.encode();
    
    def createURLResource(self, dimdimID, roomID, sessionID, encodedURL, resourceID = '_default', resourceType = 'regular'):
        
        # createURLResource is only called for a fresh resource
        
        jsonError = jsonObject()
        jsonError.clearResponse()
        jsonError.add('result', 'false')
        jsonError.add('method', 'cacheURL')
        jsonError.add('error', '7500')
        
        meeting = self.stateEngine.getMeeting(dimdimID)
        if not meeting:
            # register the meeting first
            # ideally, this call should never come..
            # meeting should be registered in listURLResources
            logManager.log('Detected that meeting ' + dimdimID + ' was never registered. This could mean that listURLResources was not called', logging.WARN)
            self.stateEngine.registerMeeting(dimdimID, '')
            self.stateEngine.registerMeeting(dimdimID, 'http://webmeeting.dimdim.com:80/dimdim/BookmarkCobResource.action')
            #return jsonError.jsonResponse()
        
        if resourceType != 'regular':
            resourceType = 'preloaded'
            
        if resourceID == '_default':
            resourceType = 'regular'    # can't have preloaded resources with _default
            
        originalURL = urllib.unquote(encodedURL)
        baseURL = self.baseURL(originalURL)
        
        pageNum = '0'       # duh! this is a new resource
        
        resourcePath = os.path.join(os.path.join(os.path.join(osconfig.cobArchive(), dimdimID), resourceType), resourceID)
        presenterPagePath = os.path.join(os.path.join(resourcePath, pageNum), 'presenter')
        attendeePagePath = os.path.join(os.path.join(resourcePath, pageNum), 'attendee')
        
        if not os.path.isdir(presenterPagePath):
            os.makedirs(presenterPagePath)
        if not os.path.isdir(attendeePagePath):
            os.makedirs(attendeePagePath)
        
        tempStore = os.path.join(resourcePath, 'temp.html')
        try:
            os.remove(tempStore)
        except:
            pass
        
        retval = self.curlHandle.downloadToFileFromHTTPURL(encodedURL, tempStore)
        
        if len(retval) < 3:
            try:
                shutil.rmtree(presenterPagePath)
                shutil.rmtree(attendeePagePath)
                os.remove(tempStore)
            except:
                pass
            return jsonError.jsonResponse()
        
        if originalURL != retval:
            # must be a 302. this is our new URL
            originalURL = retval
            baseURL = self.baseURL(originalURL)
            encodedURL = urllib.quote(originalURL)
            
        htmlHandle = open(tempStore, 'r')
        htmlContent = htmlHandle.read()
        htmlHandle.close()
        
        # inject baseURL
        htmlContent = contentMgr.sanitizeHTML(htmlContent, baseURL)
        self.prepareHtml(originalURL, htmlContent, presenterPagePath, attendeePagePath)
        
        # prepare cache
        presenterLocation = resourceType + '/' + resourceID + '/' + pageNum + '/presenter/content.html'
        presenterCache = string.replace(self.presenterCacheBuffer, 'DIMDIMSL_COB_CONTENT_SRC', presenterLocation)
        
        attendeeLocation = resourceType + '/' + resourceID + '/' + pageNum + '/attendee/content.html'
        attendeeCache = string.replace(self.attendeeCacheBuffer, 'DIMDIMSL_COB_CONTENT_SRC', attendeeLocation)
        
        pCacheLocation = os.path.join(os.path.join(osconfig.cobArchive(), dimdimID), 'p_cache.html')
        pCacheHandle = open(pCacheLocation, 'wb')
        pCacheHandle.write(presenterCache)
        pCacheHandle.close()
        
        aCacheLocation = os.path.join(os.path.join(osconfig.cobArchive(), dimdimID), 'a_cache.html')
        aCacheHandle = open(aCacheLocation, 'wb')
        aCacheHandle.write(attendeeCache)
        aCacheHandle.close()
        
        # clean up
        
        try:
            os.remove(tempStore)
        except:
            pass
        
        # register everything
        
        
        self.stateEngine.registerResource(dimdimID, resourceID, resourceType)
        self.stateEngine.registerPage(dimdimID, originalURL)
        
        jsonSuccess = jsonObject()
        jsonSuccess.clearResponse()
        jsonSuccess.add('result', 'true')
        jsonSuccess.add('method', 'cacheURL')
        jsonSuccess.add('error', '7200')
        jsonSuccess.add('location', '/content/' + str(dimdimID))
        
        return jsonSuccess.jsonResponse()
    
    def prepareHtml(self, currentURL, htmlContent, presenterPagePath, attendeePagePath):
        
        # disable frame busters
        matchObj = re.search(('\S{0,}(window.top|top).(location|location.href)\s{0,}=\s{0,}\S{0,};'), htmlContent)
        while matchObj:
            start, end = matchObj.span()
            htmlContent = htmlContent[0:start] + 'var disabled = "disabled";' + htmlContent[end : len(htmlContent)+1]
            matchObj = re.search(('\S{0,}(window.top|top).(location|location.href)\s{0,}=\s{0,}\S{0,};'), htmlContent)
            
        # disable meta tags
        matchObj = re.finditer(('<meta.*?>'), htmlContent, re.IGNORECASE)
        for item in matchObj:
            match = item.group()
            internalMatch = re.search('<meta.+http-equiv\s{0,}=\s{0,}"refresh".+?>', match, re.IGNORECASE)
            if internalMatch:
                htmlContent = string.replace(htmlContent, internalMatch.group(), '<!--'+internalMatch.group()+'-->')
                break
            
        # disable parent object modifications
        matchObj = re.finditer('\S{0,}\s{0,}(window.parent|parent)\s{0,}=\s{0,}\S+;', htmlContent, re.IGNORECASE)
        for item in matchObj:
            match = item.group()
            token = 'parent'
            if string.find(match, 'window.parent') > 0:
                token = 'window.parent'
            match = string.replace(match, token, 'self')
            htmlContent = string.replace(htmlContent, item.group(), match)
            
        # disable target tags
        matchObj = re.search('<(a|area|form).*target\s{0,}=\s{0,}"\S+".*>', htmlContent, re.IGNORECASE)
        while matchObj:
            tagMatchString = matchObj.group()
            targetMatch = re.search('target\s{0,}=\s{0,}"\S+"', tagMatchString, re.IGNORECASE)
            htmlContent = string.replace(htmlContent, targetMatch.group(), '')
            matchObj = re.search('<a.*target\s{0,}=\s{0,}"\S+".*>', htmlContent, re.IGNORECASE)
        
        presenterContent    = htmlContent
        attendeeContent     = htmlContent
        
        presenterContent    = contentMgr.insertPreamble(presenterContent, 'presenter')
        attendeeContent     = contentMgr.insertPreamble(attendeeContent, 'attendee')
        
        # take care of urls which are not part of anchor / area tags
        # for lack of better skills at regular expressions, attempting urls enclosed
        # in single and double quotes separately.
            
        matchObj = re.search(('(document|window).(location|location.href)\s{0,}=\s{0,}\'\S+\''), presenterContent)
        while matchObj:     # Matching single quotes
            start, end = matchObj.span()
            match = string.replace(matchObj.group(), ' ', '')
            pos = string.find(match, '=')
            rhs = match[pos + 1 : len(match) - 1]
            replace = 'var dimdimsl_navigateURL = '+rhs+';dimdimsl_contentAdvisory.setupProxy("anch_area", dimdimsl_navigateURL);'
            presenterContent = presenterContent[0:start] + replace + presenterContent[end:len(presenterContent)+1]
            matchObj = re.search(('(document|window).(location|location.href)\s{0,}=\s{0,}\'\S+\''), presenterContent)
            
        matchObj = re.search(('(document|window).(location|location.href)\s{0,}=\s{0,}"\S+"'), presenterContent)
        while matchObj:     # Matching double quotes
            start, end = matchObj.span()
            match = string.replace(matchObj.group(), ' ', '')
            pos = string.find(match, '=')
            rhs = match[pos + 1 : len(match) - 1]
            replace = 'var dimdimsl_navigateURL = '+rhs+';dimdimsl_contentAdvisory.setupProxy("anch_area", dimdimsl_navigateURL);'
            presenterContent = presenterContent[0:start] + replace + presenterContent[end:len(presenterContent)+1]
            matchObj = re.search(('(document|window).(location|location.href)\s{0,}=\s{0,}"\S+"'), presenterContent)

        presenterHandle = open(os.path.join(presenterPagePath, 'content.html'), 'wb')
        presenterHandle.write(presenterContent)
        presenterHandle.close()
        
        attendeeHandle = open(os.path.join(attendeePagePath, 'content.html'), 'wb')
        attendeeHandle.write(attendeeContent)
        attendeeHandle.close()
Example #4
0
class CSlidedeck(object):
    processMap = None
    officeLock = None
    pdfLock = None
    collator = None
    curlHandle = None
    demHelper = None
    resolveUrl = None
    isOOHealthy = None

    def __init__(self):
        self.processMap = {}
        self.officeLock = threading.BoundedSemaphore(1)
        self.pdfLock = threading.BoundedSemaphore(maxPDFAccess)
        self.collator = Collator()
        self.curlHandle = CurlWrapper()
        self.demHelper = JSON()
        self.resolveUrl = "uno:socket,host=localhost,port=8100;urp;StarOffice.ComponentContext"
        self.isOOHealthy = "False"

    def findDocuments(self, path, meetingID, docID):
        localMetaPath = os.path.join(os.path.join(os.path.join(path, meetingID), docID), 'documentData.txt')
        preloadedMetaPath = os.path.join(os.path.join(os.path.join(os.path.join(path, meetingID), 'Preloaded'), docID), 'documentData.txt')
        globalMetaPath = os.path.join(os.path.join(os.path.join(path, 'global-meeting'), docID), 'documentData.txt')

        entries = []
        if os.path.exists(localMetaPath):
            entries.append(localMetaPath)

        if os.path.exists(preloadedMetaPath):
            entries.append(preloadedMetaPath)

        if os.path.exists(globalMetaPath):
            if meetingID != 'global-meeting':   # because we have already taken care of this
                entries.append(globalMetaPath)

        return entries

    def findMeetingDocuments(self, path, meetingID):

        # primarily used to find preloaded and global documents

        entries = []

        globalDir = os.path.join(path, 'global-meeting')
        preloadedDir = os.path.join(os.path.join(path, meetingID), 'Preloaded')

        globalFolderList = []
        preloadedFolderList = []

        if os.path.exists(globalDir):
            globalFolderList = os.listdir(globalDir)

        if os.path.exists(preloadedDir):
            preloadedFolderList = os.listdir(preloadedDir)

        if len(globalFolderList) > 0:
            for i in range(0, len(globalFolderList)):
                metaFileName = os.path.join(os.path.join(os.path.join(path, 'global-meeting'), globalFolderList[i]), 'documentData.txt')
                if os.path.isfile(metaFileName):
                    entries.append(metaFileName)

        if len(preloadedFolderList) > 0:
            for i in range(0, len(preloadedFolderList)):
                metaFileName = os.path.join(os.path.join(os.path.join(os.path.join(path, meetingID), 'Preloaded'), preloadedFolderList[i]), 'documentData.txt')
                if os.path.isfile(metaFileName):
                    entries.append(metaFileName)

        return entries

    def generatePPTIDxx(self):
        doc = xml.dom.minidom.Document()
        textNode = doc.createElement("jb")
        textNode.appendChild(doc.createTextNode(idgen.gen()))
        doc.appendChild(textNode)
        return doc.toxml()

    def generateDocID(self):
        return idgen.gen()

    def copyAllPreloaded(self, sourceMeetingRoom, destinationMeetingRoom, strictJSON = False):
        slidedeckArchive = osconfig.slidedeckArchive()

        sourcePath = os.path.join(os.path.join(slidedeckArchive, sourceMeetingRoom), 'Preloaded')

        if not os.path.isdir(sourcePath):
            if not strictJSON:
                jsonError = jsonObject()
                jsonError.clearResponse()
                jsonError.add('result', 'false')
                jsonError.add('method', 'copyAllPreloaded')
                jsonError.add('error', '7404')
                return jsonError.jsonResponse()
            else:
                jsonError = {'result':'false', 'method':'copyAllPreloaded', 'error':7404}
                response = self.demHelper.encode(jsonError)
                return response.encode()

        for entry in os.listdir(sourcePath):
            sourcePath = os.path.join(os.path.join(os.path.join(slidedeckArchive, sourceMeetingRoom), 'Preloaded'), entry)
            destPath = os.path.join(os.path.join(os.path.join(slidedeckArchive, destinationMeetingRoom), 'Preloaded'), entry)

            try:
                # in case the destination directory doesn't exist
                os.makedirs(destPath)
            except:
                pass
            
            try:
                fileList = dir_util.copy_tree(sourcePath, destPath)
            except:
                if not strictJSON:
                    jsonError = jsonObject()
                    jsonError.clearResponse()
                    jsonError.add('result', 'false')
                    jsonError.add('method', 'copyAllPreloaded')
                    jsonError.add('error', '7500')
                    return jsonError.jsonResponse()
                else:
                    jsonError = {'result':'false', 'method':'copyAllPreloaded', 'error':7500}
                    response = self.demHelper.encode(jsonError)
                    return response.encode()

        if not strictJSON:
            jsonError = jsonObject()
            jsonError.clearResponse()
            jsonError.add('result', 'true')
            jsonError.add('method', 'copyAllPreloaded')
            jsonError.add('error', '7200')
            return jsonError.jsonResponse()
        else:
            jsonError = {'result':'true', 'method':'copyAllPreloaded', 'error':7200}
            response = self.demHelper.encode(jsonError)
            return response.encode()

    def deletePreloadedDocumentFromRooms(self, inputFile, strictJSON = False):

        fileStoreLocation = os.path.join(mediaDirectory, self.generateDocID())
        fileStoreLocation += '.cfg'
        storedFile = None
        if sys.platform.startswith('win'):
            storedFile = open(fileStoreLocation, 'wb')
        else:
            storedFile = open(fileStoreLocation, 'w')
        while True:
            data = inputFile.file.read(8192)
            if not data:
                break
            storedFile.write(data)

        storedFile.close()

        response = self.deletePreloadedDocumentFromRoomsAtLocation(fileStoreLocation, strictJSON)
        os.remove(fileStoreLocation)
        return response

    def deletePreloadedDocumentFromRoomsAtLocation(self, inputFileLocation, strictJSON = False):
        # file should have meetingIDs and docIDs as follows -
        # meetingID:docID,meetingID:docID,....

        inFileContent = None
        try:
            inFile = open(inputFileLocation, 'r')
            inFileContent = inFile.read()
            inFile.close()
        except:
            return 'failure to open fail at ' + inputFileLocation
        itemList = string.split(inFileContent, ',')

        for item in itemList:
            itemContent = string.split(item, ':')
            meetingID = string.strip(itemContent[0], ' ')
            docID = string.strip(itemContent[1], ' ')
            self.deleteDocument(docID, meetingID, strictJSON)

    def copyPreloadedDocumentToRooms(self, sourceMeetingRoom, docID, inputFile, strictJSON = False):

        fileStoreLocation = os.path.join(mediaDirectory, docID)
        fileStoreLocation += '.cfg'
        storedFile = None
        if sys.platform.startswith('win'):
            storedFile = open(fileStoreLocation, 'wb')
        else:
            storedFile = open(fileStoreLocation, 'w')
        while True:
            data = inputFile.file.read(8192)
            if not data:
                break
            storedFile.write(data)

        storedFile.close()

        response = self.copyPreloadedDocumentToRoomsAtLocation(sourceMeetingRoom, docID, fileStoreLocation, strictJSON)
        os.remove(fileStoreLocation)
        return response

    def copyPreloadedDocumentToRoomsAtLocation(self, sourceMeetingRoom, docID, inputFileLocation, strictJSON=False):

        # file should have meetingIDs separated by commas

        inFileContent = None
        try:
            inFile = open(inputFileLocation, 'r')
            inFileContent = inFile.read()
            inFile.close()
        except:
            return 'failure to open file at ' + inputFileLocation

        meetingIDList = string.split(inFileContent, ',')
        failedMeetingIDList = []
        for meetingID in meetingIDList:
            meetingID = string.strip(meetingID, ' ')
            response = self.copyPreloadedDocument(sourceMeetingRoom, docID, meetingID, strictJSON)
            if string.find(response, '7200') < 0:
                failedMeetingIDList.append(meetingID)

        if len(failedMeetingIDList) > 0:
            retString = 'failed to copy document to following meetingIDs : '
            for meetingID in failedMeetingIDList:
                retString += meetingID + ', '
            return retString
        else:
            return 'document copied to all meetings successfully'

    def copyPreloadedDocument(self, sourceMeetingRoom, docID, destinationMeetingRoom, strictJSON=False):
        slidedeckArchive = osconfig.slidedeckArchive()

        sourcePath = os.path.join(os.path.join(os.path.join(slidedeckArchive, sourceMeetingRoom), 'Preloaded'), docID)
        destPath = os.path.join(os.path.join(os.path.join(slidedeckArchive, destinationMeetingRoom), 'Preloaded'), docID)
        if not os.path.isdir(sourcePath):
            if not strictJSON:
                jsonError = jsonObject()
                jsonError.clearResponse()
                jsonError.add('result', 'false')
                jsonError.add('method', 'copyPreloadedDocument')
                jsonError.add('error', '7404')
                return jsonError.jsonResponse()
            else:
                jsonError = {'result':'false', 'method':'copyPreloadedDocument', 'error':7404}
                response = self.demHelper.encode(jsonError)
                return response.encode()

        try:
            fileList = dir_util.copy_tree(sourcePath, destPath)
        except:
            if not strictJSON:
                jsonError = jsonObject()
                jsonError.clearResponse()
                jsonError.add('result', 'false')
                jsonError.add('method', 'copyPreloadedDocument')
                jsonError.add('error', '7500')
                return jsonError.jsonResponse()
            else:
                jsonError = {'result':'false', 'method':'copyPreloadedDocument', 'error':7500}
                response = self.demHelper.encode(jsonError)
                return response.encode()

        if not strictJSON:
            jsonError = jsonObject()
            jsonError.clearResponse()
            jsonError.add('result', 'true')
            jsonError.add('method', 'copyPreloadedDocument')
            jsonError.add('error', '7200')
            return jsonError.jsonResponse()
        else:
            jsonError = {'result':'true', 'method':'copyPreloadedDocument', 'error':7200}
            response = self.demHelper.encode(jsonError)
            return response.encode()


    def getDocumentData(self, meetingID, docID, strictJSON=False):
        slidedeckArchive = osconfig.slidedeckArchive()
        [installationID, dimdimID] = osconfig.splitIdentity(meetingID)
        meetingID = installationID + '____' + dimdimID
        jsonSuccess = jsonObject()
        jsonSuccess.clearResponse()
        jsonSuccess.add('result', 'true')
        jsonSuccess.add('method', 'getDocumentData')
        jsonSuccess.add('meetingID', meetingID)
        entries = self.findDocuments(slidedeckArchive, meetingID, docID)
        
        strictSuccess = {'result' : 'true', 'method' : 'getDocumentData', 'meetingID' : meetingID}

        if len(entries) == 0:
            if not strictJSON:
                jsonError = jsonObject()
                jsonError.clearResponse()
                jsonError.add('result', 'false')
                jsonError.add('method', 'getDocumentData')
                jsonError.add('meetingID', meetingID)
                jsonError.add('docID', docID)
                jsonError.add('error', '7404')
                return jsonError.jsonResponse()
            else:
                strictError = {'result':'false', 'method':'getDocumentData', 'meetingID':meetingID, 'docID':docID, 'error':7404}
                response = self.demHelper.encode(strictError)
                return response.encode()

        if not strictJSON:
            for i in range(0, len(entries)):
                fp = serialObject()
                fp.clearBuffer()
                fp.importData(entries[i])
                #jsonSuccess.add('docName', fp.get('docName'))
                jsonSuccess.add('docID', docID)
                jsonSuccess.add('docName', fp.get('docName'))
                jsonSuccess.add('noOfPages', string.atoi(fp.get('noOfPages')))
                jsonSuccess.add('width', fp.get('width'))
                jsonSuccess.add('height', fp.get('height'))
            jsonSuccess.add('error', '7200')
            return jsonSuccess.jsonResponse()
        else:
            for i in range(0, len(entries)):
                fp = serialObject()
                fp.clearBuffer()
                fp.importData(entries[i])
                strictSuccess.update({'docID':docID, 'docName':fp.get('docName'), 'noOfPages' : string.atoi(fp.get('noOfPages')), \
                                      'width': string.atoi(fp.get('width')), 'height': string.atoi(fp.get('height'))})
                
            response = self.demHelper.encode(strictSuccess)
            return response.encode()

    def listDocuments(self, meetingID, strictJSON = False):
        slidedeckArchive = osconfig.slidedeckArchive()
        [installationID, dimdimID] = osconfig.splitIdentity(meetingID)
        meetingID = installationID + '____' + dimdimID
        jsondata = jsonObject()
        jsondata.clearResponse()
        entries = self.findMeetingDocuments(slidedeckArchive, meetingID)

        if len(entries) == 0:
            if not strictJSON:
                jsondata.add('result', 'false')
                jsondata.add('method', 'listDocuments')
                jsondata.add('error', '7404')
                jsondata.add('meetingID', meetingID)
                return jsondata.jsonResponse()
            else:
                jsondata = {'result':'false', 'method':'listDocuments', 'error':7404, 'meetingID':meetingID}
                response = self.demHelper.encode(jsondata)
                return response.encode()
            
        if not strictJSON:
            jsondata.add('result', 'true')
            jsondata.add('method', 'listDocuments')
            jsondata.add('meetingID', meetingID)
            jsondata.add('error', '7200')
    
            entryJSONValue = '['
            for i in range(0, len(entries)):
                entryJSON = jsonObject()
                entryJSON.clearResponse()
                fp = serialObject()
                fp.clearBuffer()
                fp.importData(entries[i])
                entryJSON.add('docName',fp.get('docName'))
                entryJSON.add('docID',fp.get('docID'))
                entryJSON.add('width', fp.get('width'))
                entryJSON.add('height', fp.get('height'))
                entryJSON.add('noOfPages',string.atoi(fp.get('noOfPages')))
                if entries[i].find('global-meeting') >= 0:
                    entryJSON.add('Type', "global")
                else:
                    entryJSON.add('Type', "preloaded")
                entryJSONValue += entryJSON.jsonResponse()
                if i < len(entries) -1:
                    entryJSONValue += ','
    
            entryJSONValue += ']'
            jsondata.add('docs',entryJSONValue)
            return jsondata.jsonResponse()
        else:
            jsondata = {'result':'true', 'method':'listDocuments', 'meetingID':meetingID, 'error':7200}
            entryList = []
            for i in range(0, len(entries)):
                fp = serialObject()
                fp.clearBuffer()
                fp.importData(entries[i])
                entryMap = {'docName' : fp.get('docName'), 'docID' : fp.get('docID'), 'width' : string.atoi(fp.get('width')), \
                                        'height': string.atoi(fp.get('height')), 'noOfPages' : string.atoi(fp.get('noOfPages')) }
                if entries[i].find('global-meeting') >= 0:
                    entryMap.update({'Type':'global'})
                else:
                    entryMap.update({'Type' : 'preloaded'})
                entryList.append(entryMap)
            jsondata.update({'docs':entryList})
            response = self.demHelper.encode(jsondata)
            return response.encode()
            

    def startDocumentConversion(self, docID, docName, meetingID, roomID, sessionID, docType, uploadType):

        # 'uploadType accepts "global" or "preloaded". If neither is specified, it is assumed as a regular presentation.
        # if the type is global, "global-meeting" is used as a meeting key. Any meeting ID specified is discarded

        errorjson = jsonObject()
        errorjson.clearResponse()
        errorjson.add('result', 'false')
        errorjson.add('method', 'startDocumentConversion')
        errorjson.add('meetingID', meetingID)
        errorjson.add('docID', docID)

        type = string.lower(uploadType)

        fileStoreLocation = os.path.join(mediaDirectory, docID)
        fileStoreLocation += '.' + str(docType)

        if not os.path.isfile(fileStoreLocation):
            errorjson.add('error', '7404')       # file not found. not uploaded properly
            return errorjson.jsonResponse()

        xPorter = None
        try:
            xPorter = exportEngine(meetingID, roomID, sessionID, fileStoreLocation, docID, uploadType, docName, docType, self.officeLock, self.pdfLock, self.collator)
            self.processMap[docID] = xPorter
            xPorter.start()

            # job created. register in collator
            self.collator.register(docID)

        except:
            errorjson.add('error', '7503')      # service not available. unable to convert
            return errorjson.jsonResponse()

        # JSON Response BEGIN
        jsondata = jsonObject()
        jsondata.clearResponse()
        jsondata.add('result','true')
        jsondata.add('method','startDocumentConversion')
        #jsondata.add('docName',docName)
        jsondata.add('docID',docID)
        jsondata.add('docType', docType)
        jsondata.add('meetingID', meetingID)
        #JSON Response END

        doc = xml.dom.minidom.Document()
        textNode = doc.createElement("jb")
        textNode.appendChild(doc.createTextNode(jsondata.jsonResponse()))
        doc.appendChild(textNode)

        return jsondata.jsonResponse()

    def cancelDocumentConversion(self, docID, meetingID):
        jsondata = jsonObject()
        jsondata.clearResponse()
        [installationID, dimdimID] = osconfig.splitIdentity(meetingID)
        meetingID = installationID + '____' + dimdimID
        if self.processMap.has_key(docID):
            self.collator.setConversionState(docID, 'done')
            try:
                xPorter = self.processMap.get(docID)
                xPorter.cancelConversion(False)
                self.processMap.pop(docID)
                try:
                    del xPorter
                except:
                    pass
                jsondata.add('result','true')
                jsondata.add('method','cancelDocumentConversion')
                jsondata.add('docID',docID)
                jsondata.add('error', '7200')
            except:
                jsondata.add('result','false')
                jsondata.add('method', 'cancelDocumentConversion')
                jsondata.add('docID',docID)
                jsondata.add('error','7500')
        else:
            jsondata.add('result','false')
            jsondata.add('method', 'cancelDocumentConversion')
            jsondata.add('docID',docID)
            jsondata.add('error','7404')

        self.deleteDocument(docID, meetingID)
        return jsondata.jsonResponse()

    def getDocumentStatus(self, docID, strictJSON = False):
        
        strictData = {}
        jsondata = jsonObject()
        jsondata.clearResponse()
        if self.processMap.has_key(docID):
            try:
                xPorter = self.processMap.get(docID)
                bPop = False
                if xPorter.errCode != 7200:

                    try:
                        if xPorter.docType == 'ppt':
                            self.collator.registerPPTFailure(docID, xPorter.meetingID)
                        elif xPorter.docType == 'pdf':
                            self.collator.registerPDFFailure(docID, xPorter.meetingID)
                    except:
                        pass
                    
                    if not strictJSON:
                        jsondata.add('result', 'false')
                        jsondata.add('method', 'getDocumentStatus')
                        jsondata.add('docID', docID)
                        jsondata.add('error', xPorter.errCode)
                    else:
                        strictData.update({'result' : 'false', 'method' : 'getDocumentStatus', 'docID' : docID, 'error' : xPorter.errCode})
                        
                    bPop = True
                    meetingID = xPorter.meetingID
                    self.collator.setConversionState(docID, 'done')
                    try:
                        xPorter.cancelConversion()
                    except:
                        pass

                    try:
                         self.deleteDocument(docID, meetingID, strictJSON)
                    except:
                        pass

                    try:
                        del xPorter
                    except:
                        pass

                    if not strictJSON:
                        return jsondata.jsonResponse()
                    else:
                        response = self.demHelper.encode(strictData)
                        return response.encode()
                    
                    
                if not strictJSON:
                    jsondata.add('result','true')
                    jsondata.add('method','getDocumentStatus')
                    jsondata.add('docID',docID)
                    jsondata.add('width',xPorter.width)
                    jsondata.add('height',xPorter.height)
                    jsondata.add('pagesConverted',xPorter.pagesConverted)
                    jsondata.add('totalPages',xPorter.totalPageCount)
                    jsondata.add('conversionComplete',xPorter.conversionComplete)
                    jsondata.add('error', '7200')
                else:
                    strictData.update({'result':'true', 'method':'getDocumentStatus', 'docID':docID, 'width':xPorter.width, 'height':xPorter.height, \
                                       'pagesConverted' : xPorter.pagesConverted, 'totalPages': xPorter.totalPageCount, \
                                       'conversionComplete':xPorter.conversionComplete, 'error':7200})


                if xPorter.conversionComplete == True:
                    bPop = True
                    try:
                        if xPorter.docType == 'pdf':
                            self.collator.resetPDFFailures()
                        else:
                            self.collator.resetUploadFailures()
                    except:
                        pass

                    try:
                        del xPorter
                    except:
                        pass

                if bPop:
                    self.processMap.pop(docID)

            except:
                jsondata.add('result', 'false')
                jsondata.add('method', 'getDocumentStatus')
                jsondata.add('docID', docID)
                jsondata.add('error', '7500')
                strictData.update({'result':'false', 'method':'getDocumentStatus', 'docID':docID, 'error':7500})
        else:
            if not strictJSON:
                jsondata.add('result','false')
                jsondata.add('method','getDocumentStatus')
                jsondata.add('docID',docID)
                jsondata.add('error','7404')
            else:
                strictData.update({'result':'false', 'method':'getDocumentStatus', 'docID':docID, 'error':7404})

        if not strictJSON:
            return jsondata.jsonResponse()
        else:
            response = self.demHelper.encode(strictData)
            return response.encode()

    def uploadPPTXSlide(self, docFile, meetingID, docID, docName, pageNo, noOfPages):
        # 'Type' will be 'regular', becuase PPTX slides are uploaded by the presenter
        # There is no conversion involved in this operation. We just need to commit this file to archive

        iPageNo = string.atoi(pageNo)
        iNoOfPages = string.atoi(noOfPages)

        jsonComplete = jsonObject()
        jsonComplete.clearResponse()
        jsonComplete.add('result', 'true')
        jsonComplete.add('method', 'uploadPPTXSlide')
        jsonComplete.add('docID', docID)

        slidedeckArchive = osconfig.slidedeckArchive()
        specArchive = os.path.join(slidedeckArchive, meetingID)

        if docID == 'GENERATE' or docID == '':
            docID = idgen.gen()

        specArchive = os.path.join(specArchive, docID)

        if not os.path.isdir(specArchive):
            os.makedirs(specArchive)

        storedFileName = os.path.join(specArchive, pageNo)
        storedFileName += ".jpg"

        if sys.platform.startswith('win'):
            storedFile = open(storedFileName, 'wb')
        else:
            storedFile = open(storedFileName, 'w')
        while True:
            data = docFile.file.read(8192)
            if not data:
                break
            storedFile.write(data)

        storedFile.close()

        if (iPageNo == iNoOfPages - 1):
            # store some details for probable future use
            storeObject = filehelper.serialObject()
            storeObject.clearBuffer()
            storeObject.add('docName', docName)
            storeObject.add('docID',docID)
            storeObject.add('noOfPages',noOfPages)
            dataStore = os.path.join(specArchive, 'documentData.txt');
            storeObject.exportData(dataStore)

            jsonComplete.add('complete', 'true')
            return jsonComplete.jsonResponse()

        jsonComplete.add('complete', 'false')
        return jsonComplete.jsonResponse()

    def startStress(self, docFile, docType, count, index):

        if (count <= 0):
            return

        iter = 0
        docID = 's' + str(index) + '_' + str(iter)

        # store docFile for the first iteration

        fileStoreLocation = os.path.join(mediaDirectory, docID)
        fileStoreLocation += '.' + docType
        storedFile = None
        if sys.platform.startswith('win'):
            storedFile = open(fileStoreLocation, 'wb')
        else:
            storedFile = open(fileStoreLocation, 'w')
        while True:
            data = docFile.file.read(8192)
            if not data:
                break
            storedFile.write(data)

        storedFile.close()

        # now make copies for all remaining iterations

        for i in range(1, string.atoi(count)):
            if sys.platform.startswith('win'):
                shellCmd = 'copy ' + fileStoreLocation + ' ' + os.path.join(mediaDirectory, 's' + str(index) + '_' + str(i)) + '.' + docType
            else:
                shellCmd = 'cp ' + fileStoreLocation + ' ' + os.path.join(mediaDirectory, 's' + str(index) + '_' + str(i)) + '.' + docType
            print shellCmd
            os.system(shellCmd)

        # start conversions for each of the iterations

        for i in range(0, string.atoi(count)):
            print self.startDocumentConversion('s' + str(index) + '_' + str(i), 'stress' + str(index) + '_' + str(i),'ROOMID','SESSIONID', 'stress', docType, '')

    def uploadPreloadedDocumentWithPath(self, filePath, fileName, meetingID, docID, docType, strictJSON = False):

        if docID == 'GENERATE' or docID == '':
            docID = idgen.gen()

        docPath = os.path.join(osconfig.preloadedDocumentRoot(),filePath)
        if not os.path.isfile(docPath):
            return 'invalid file location'

        fileStoreLocation = os.path.join(mediaDirectory, docID)
        fileStoreLocation += '.' + docType

        # copy the file from location to media directory

        if sys.platform.startswith('win'):
            os.system('copy ' + docPath + ' ' + fileStoreLocation)
        else:
            os.system('cp ' + docPath + ' ' + fileStoreLocation)

        if len(fileName) == 0:
            fileName = os.path.basename(docPath)
        xPorter = exportEngine(meetingID, '', '', fileStoreLocation, docID, 'preloaded', fileName, docType, self.officeLock, self.pdfLock, self.collator)

        self.processMap[docID] = xPorter
        xPorter.start()
        
        if not strictJSON:
            # JSON Response BEGIN
            jsondata = jsonObject()
            jsondata.clearResponse()
            jsondata.add('result','true')
            jsondata.add('method','uploadPreloadedDocumentWithPath')
            jsondata.add('docName',fileName)
            jsondata.add('docType',docType)
            jsondata.add('docID',docID)
            #JSON Response END
    
            return jsondata.jsonResponse()
        else:
            jsondata = {'result': 'true', 'method' : 'uploadPreloadedDocumentWithPath', 'docName': fileName, 'docType' : docType, 'docID' : docID}
            response = self.demHelper.encode(jsondata)
            return response.encode()

    def uploadPreloadedDocumentWithURL(self, fileURL, fileName, meetingID, docID, docType, strictJSON = False):

         # fileName can be empty. If that is the case, we take the name from the url using os.path.basename

        fileStoreLocation = os.path.join(mediaDirectory, docID)
        fileStoreLocation += '.' + docType

        # download the file to media directory

        retval = self.curlHandle.downloadToFileFromHTTPURL(fileURL, fileStoreLocation)
        if retval == 0:
            return 'unable to download file'
        if retval == -1:
            return 'internal exception in downloading file'
        if retval == -2:
            return 'unable to create local copy due to access privileges'

        if len(fileName) == 0:
            fileName = os.path.basename(fileURL)
        xPorter = exportEngine(meetingID, '', '', fileStoreLocation, docID, 'preloaded', fileName, docType, self.officeLock, self.pdfLock, self.collator)

        self.processMap[docID] = xPorter
        xPorter.start()
        
        if not strictJSON:
            # JSON Response BEGIN
            jsondata = jsonObject()
            jsondata.clearResponse()
            jsondata.add('result','true')
            jsondata.add('method','uploadPreloadedDocumentWithURL')
            jsondata.add('docName',fileName)
            jsondata.add('docType',docType)
            jsondata.add('docID',docID)
            #JSON Response END
            
            return jsondata.jsonResponse()
        
        else:
            strictData = {'result' : 'true', 'method' : 'uploadPreloadedDocumentWithURL', 'docName' : fileName, 'docType' : docType, 'docID': docID}
            response = self.demHelper.encode(strictData)
            return response.encode()

    def uploadPreloadedDocument(self, docFile, fileName, meetingID, docID, docType, strictJSON = False):

         # fileName can be empty. If that is the case, we take the name from the file object

        if docID == 'GENERATE' or docID == '':
            docID = idgen.gen()

        fileStoreLocation = os.path.join(mediaDirectory, docID)
        fileStoreLocation += '.' + docType
        storedFile = None
        if sys.platform.startswith('win'):
            storedFile = open(fileStoreLocation, 'wb')
        else:
            storedFile = open(fileStoreLocation, 'w')
        while True:
            data = docFile.file.read(8192)
            if not data:
                break
            storedFile.write(data)

        storedFile.close()

        if len(fileName) == 0:
            fileName = os.path.basename(docFile.filename)

        xPorter = exportEngine(meetingID, '', '', fileStoreLocation, docID, 'preloaded', fileName, docType, self.officeLock, self.pdfLock, self.collator)

        self.processMap[docID] = xPorter
        xPorter.start()

        if not strictJSON:
            # JSON Response BEGIN
            jsondata = jsonObject()
            jsondata.clearResponse()
            jsondata.add('result','true')
            jsondata.add('method','uploadPreloadedDocument')
            jsondata.add('docName',fileName)
            jsondata.add('docType',docType)
            jsondata.add('docID',docID)
            #JSON Response END
    
            return jsondata.jsonResponse()
        else:
            strictData = {'result' : 'true', 'method' : 'uploadPreloadedDocument', 'docName' : fileName, 'docType' : docType, 'docID': docID}
            response = self.demHelper.encode(strictData)
            return response.encode()


    def uploadDocument(self, docFile, meetingID, roomID, sessionID, docID, docType, uploadType):

        # 'uploadType' accepts "global" or "preloaded". If neither is specified, it is assumed as a regular presentation.
        # if the type is global, "global-meeting" is used as a meeting key. Any meeting ID specified is discarded
        oosetupsemaphore = threading.BoundedSemaphore(1)
        if not docType == 'pdf':
            #print 'in upload document function'
            self.isOOHealthy = self.checkOO()
            #print self.isOOHealthy+' ooHealthy'
            if self.isOOHealthy=="False":
                oosetupsemaphore.acquire()
                self.startOO()
                oosetupsemaphore.release()
        uploadType = string.lower(uploadType)

        if docID == 'GENERATE' or docID == '':
            docID = idgen.gen()

        fileStoreLocation = os.path.join(mediaDirectory, docID)
        fileStoreLocation += '.' + docType
        storedFile = None
        if sys.platform.startswith('win'):
            storedFile = open(fileStoreLocation, 'wb')
        else:
            storedFile = open(fileStoreLocation, 'w')
        while True:
            data = docFile.file.read(8192)
            if not data:
                break
            storedFile.write(data)

        storedFile.close()
        xPorter = exportEngine(meetingID, roomID, sessionID, fileStoreLocation, docID, uploadType, os.path.basename(docFile.filename), docType, self.officeLock, self.pdfLock, self.collator)

        self.processMap[docID] = xPorter
        xPorter.start()

        # JSON Response BEGIN
        jsondata = jsonObject()
        jsondata.clearResponse()
        jsondata.add('result','true')
        jsondata.add('method','uploadDocument')
        jsondata.add('docName',os.path.basename(docFile.filename))
        jsondata.add('docType',docType)
        jsondata.add('docID',docID)
        #JSON Response END

        return jsondata.jsonResponse()

    def retrieveDocument(self, docID, meetingID, pageNo):
        [installationID, dimdimID] = osconfig.splitIdentity(meetingID)
        meetingID = installationID + '____' + dimdimID
        # JSON Response BEGIN (error message)
        jsondata = jsonObject()
        jsondata.clearResponse()
        jsondata.add('result','false')
        jsondata.add('method','retrieveDocument')
        jsondata.add('docID',docID)
        jsondata.add('meetingID',meetingID)
        jsondata.add('error', '7404')
        #JSON Response END

        if (docID == ''):
            return jsondata.jsonResponse()

        if sys.platform.startswith('win'):
            archiveDirectory = string.rstrip(osconfig.slidedeckArchive(), '\\')
        else:
            archiveDirectory = osconfig.slidedeckArchive()

        localDocDir = os.path.join(os.path.join(archiveDirectory, meetingID), docID)
        preloadedDocDir = os.path.join(os.path.join(os.path.join(archiveDirectory, meetingID), 'Preloaded'), docID)
        globalDocDir = os.path.join(os.path.join(archiveDirectory, 'global-meeting'), docID)

        docPath = None
        if os.path.exists(localDocDir):
            docPath = localDocDir
        if os.path.exists(preloadedDocDir):
            docPath = preloadedDocDir
        if os.path.exists(globalDocDir):
            docPath = globalDocDir

        if not docPath:
            self.collator.registerRetrieveFailure()
            return jsondata.jsonResponse()

        fileList = os.listdir(docPath)
        if len(fileList) <= 1:  # we need *atleast* 2 files. i.e. atleast 1 swf and 1 meta data file
            self.collator.registerRetrieveFailure()
            return jsondata.jsonResponse()

        swfpath = docPath
        jpgpath = docPath

        if sys.platform.startswith('win'):
           jpgpath += '\\' + pageNo + '.jpg'
           swfpath += '\\' + pageNo + '.swf'
        else:
           jpgpath += '/' + pageNo + '.jpg'
           swfpath += '/' + pageNo + '.swf'

        path = ''

        if os.path.isfile(swfpath):
            path = swfpath
        elif os.path.isfile(jpgpath):
            path = jpgpath
        else:
            self.collator.registerRetrieveFailure()
            return jsondata.jsonResponse()
        self.collator.resetRetrieveFailures()
        return static.serve_file(path,"application/octet-stream","inline",os.path.basename(path))

    def deletePreloadedDocuments(self, meetingID, strictJSON = False):

        if sys.platform.startswith('win'):
            archiveDirectory = string.rstrip(osconfig.slidedeckArchive(), '\\')
        else:
            archiveDirectory = osconfig.slidedeckArchive()

        preloadedDocDir = os.path.join(os.path.join(archiveDirectory, meetingID), 'Preloaded')

        try:
            shutil.rmtree(preloadedDocDir)
        except:
            pass

        if not strictJSON:
            # JSON Response BEGIN
            jsondata = jsonObject()
            jsondata.clearResponse()
            jsondata.add('result','true')
            jsondata.add('method','deletePreloadedDocuments')
            jsondata.add('meetingID', meetingID)
            jsondata.add('error', '7200')
            #JSON Response END
    
            return jsondata.jsonResponse()
        else:
            jsondata = {'result' : 'true', 'method' : 'deletePreloadedDocuments', 'meetingID': meetingID, 'error' : 7200}
            response = self.demHelper.encode(jsondata)
            return response.encode()

    def deleteDocument(self, docID, meetingID, strictJSON = False):

        # JSON Response BEGIN (error message)
        
        strictdata = {'result' : 'false', 'method' : 'deleteDocument', 'docID' : docID, 'meetingID' : meetingID, 'error' : 7404}
        
        jsondata = jsonObject()
        jsondata.clearResponse()
        jsondata.add('result','false')
        jsondata.add('method','deleteDocument')
        jsondata.add('docID', docID)
        jsondata.add('meetingID', meetingID)
        jsondata.add('error', '7404')
        #JSON Response END

        if (docID == ''):
            if not strictJSON:
                return jsondata.jsonResponse()
            else:
                response = self.demHelper.encode(strictdata)
                return response.encode()
            

        if sys.platform.startswith('win'):
            archiveDirectory = string.rstrip(osconfig.slidedeckArchive(), '\\')
        else:
            archiveDirectory = osconfig.slidedeckArchive()

        # check if the directory exists, in global, preloaded and local

        localDocDir = os.path.join(os.path.join(archiveDirectory, meetingID), docID)
        preloadedDocDir = os.path.join(os.path.join(os.path.join(archiveDirectory, meetingID), 'Preloaded'), docID)
        globalDocDir = os.path.join(os.path.join(archiveDirectory, 'global-meeting'), docID)

        docPath = None
        if os.path.isdir(localDocDir):
            docPath = localDocDir
        if os.path.isdir(preloadedDocDir):
            docPath = preloadedDocDir
        if os.path.isdir(globalDocDir):
            if meetingID != 'global-meeting':   # we have already taken care of this
                docPath = globalDocDir

        if not docPath:
            return jsondata.jsonResponse()

        try:
            shutil.rmtree(docPath)
        except:
            pass

        if not strictJSON:
            # JSON Response BEGIN
            jsondata = jsonObject()
            jsondata.clearResponse()
            jsondata.add('result','true')
            jsondata.add('method','deleteDocument')
            jsondata.add('docID', docID)
            jsondata.add('meetingID', meetingID)
            jsondata.add('error', '7200')
            #JSON Response END
    
            return jsondata.jsonResponse()
        else:
            
            strictdata = {'result' : 'true', 'method' : 'deleteDocument', 'docID' : docID, 'meetingID' : meetingID, 'error' : 7200}
            response = self.demHelper.encode(strictdata)
            return response.encode()

    def closeMeeting(self, meetingID):

        # JSON Response BEGIN (error message)
        jsonError = jsonObject()
        jsonError.clearResponse()
        jsonError.add('result','false')
        jsonError.add('method','closeMeeting')
        jsonError.add('meetingID',meetingID)
        jsonError.add('error','7404')
        #JSON Response END

        # Do meetingID-related input verification
        if (meetingID == ''):
            return jsonError.jsonResponse()

        if sys.platform.startswith('win'):
            archiveDirectory = string.rstrip(osconfig.slidedeckArchive(), '\\')
        else:
            archiveDirectory = string.rstrip(osconfig.slidedeckArchive(), '/')

        localMeetingDir = os.path.join(archiveDirectory, meetingID)

        if not os.path.isdir(localMeetingDir):
            return jsonError.jsonResponse()

        docList = os.listdir(localMeetingDir)

        if len(docList) == 0:
            return jsonError.jsonResponse()

        for i in range (0, len(docList)):
            if docList[i] == 'Preloaded': # we don't delete preloaded directories
                continue
            docPath = os.path.join(localMeetingDir, docList[i])
            try:
                shutil.rmtree(docPath)
            except:
                pass

        docList = os.listdir(localMeetingDir)
        if len(docList) == 0:
            try:
                os.rmdir(localMeetingDir)
            except:
                pass

        # JSON Response BEGIN
        jsonSuccess = jsonObject()
        jsonSuccess.clearResponse()
        jsonSuccess.add('result','true')
        jsonSuccess.add('method','closeMeeting')
        jsonSuccess.add('meetingID',meetingID)
        jsonSuccess.add('error', '7200')
        #JSON Response END

        return jsonSuccess.jsonResponse()

    def uploadOnlyDocument(self, meetingID, docID, docType, docFile):
        
        # 'uploadType' accepts "global" or "preloaded". If neither is specified, it is assumed as a regular presentation.
        # if the type is global, "global-meeting" is used as a meeting key. Any meeting ID specified is discarded
        oosetupsemaphore = threading.BoundedSemaphore(1)
        if not docType == 'pdf':
            #print 'in upload document function'
            self.isOOHealthy = self.checkOO()
            #print self.isOOHealthy+' ooHealthy'
            if self.isOOHealthy=="False":
                oosetupsemaphore.acquire()
                self.startOO()
                oosetupsemaphore.release()
                
        if docID == 'GENERATE' or docID == '':
            docID = idgen.gen()
            
        fileStoreLocation = os.path.join(mediaDirectory, docID)
        fileStoreLocation += '.' + docType
        storedFile = None
        if sys.platform.startswith('win'):
            storedFile = open(fileStoreLocation, 'wb')
        else:
            storedFile = open(fileStoreLocation, 'w')
        while True:
            data = docFile.file.read(8192)
            if not data:
                break
            storedFile.write(data)
            
        storedFile.close()
        # JSON Response BEGIN
        jsondata = jsonObject()
        jsondata.clearResponse()
        jsondata.add('result','true')
        jsondata.add('method','uploadOnlyDocument')
        #jsondata.add('docName',os.path.basename(docFile.filename))
        jsondata.add('docType',docType)
        jsondata.add('docID',docID)
        #JSON Response END

        return jsondata.jsonResponse()

    def startOO(self):
       cherrypy.log('waiting to start openoffice---')
       status = self.getOpenOfficeContext()
       if status == "Success":
           cherrypy.log('openoffice started successfully---')
       else:
           cherrypy.log('openoffice couldnot get start even after waiting for it---')


        #print cmd

    def checkOO(self):
        local = uno.getComponentContext()
        resolver = local.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", local)
        try:
            context = resolver.resolve(self.resolveUrl)
            cherrypy.log('OpenOffice was already running---')
            self.isOOHealthy="True"
            return "True"
        except:
            cherrypy.log('killing All openoffice process---')
            if sys.platform.startswith('win'):
                cmd = 'tskill soffice'
            else:
                cmd = 'killall -9 soffice.bin'
            try:
                os.system(cmd)
            except:
               cherrypy.log('OpenOffice could not get killed---')
            self.isOOHealthy="False"
            return "False"

    def getOpenOfficeContext(self):
        cherrypy.log('starting oo process')
        if sys.platform.startswith('win'):
            cmd = 'c:\\www\\mods\\RunHiddenConsole.exe StartOO.bat'
            os.system(cmd)
        else:
            args = ['/usr/local/dimdim/Mediaserver/mods/StartOO.sh']
            popen2.Popen3(args)
            #cmd = 'nohup sh StartOO.sh 2>&1 &'
        #os.system(cmd)
        bSuccess = False
        nLoop = 5
        while True:
            try:
                context = resolver.resolve(self.resolveUrl)
                bSuccess = True
                return "Success"
            except:
                nLoop -= 1
                if nLoop <= 0:
                    cherrypy.log('Error in resolving url resolver---')
                    return "Failure"
                time.sleep(2)  # Sleep 1 second.

        if bSuccess == False:
            return "Failure"