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 __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
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()
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"