def findDocumentByURI(self, uri):
     from URIlib import URIParser
     p = URIParser()
     uri = p.URI = uri  # cleanup uri
     self._cDoc.acquire()
     try:
         for displayPath, wrappedDocRef in self._documents.items():
             try:
                 wrappedDoc = wrappedDocRef()
             except COMException:
                 wrappedDoc = None  # dead object
             if not wrappedDoc:
                 del self._documents[displayPath]
             elif ((wrappedDoc.isUntitled
                    and fequal(wrappedDoc.baseName, uri))
                   or (not wrappedDoc.isUntitled
                       and fequal(wrappedDoc.file.URI, uri))):
                 doc = UnwrapObject(wrappedDoc)
                 if doc._refcount == 0:
                     log.debug("deleting reference to %s", displayPath)
                     del self._documents[displayPath]
                     return None
                 return wrappedDoc
     finally:
         self._cDoc.release()
     return None
Example #2
0
 def __init__(self):
     self._files = {}
     self._statuscheck_files = {}
     self._tmpfiles = {}
     self._tmpdirs = {}
     self._uriParser = URIParser()
     self.obsSvc = components.classes["@mozilla.org/observer-service;1"].getService(components.interfaces.nsIObserverService)
     self.obsSvc.addObserver(WrapObject(self,components.interfaces.nsIObserver), "xpcom-shutdown", 0)
    def findCandidateFilesRemotely(self, part, dirname, include, exclude, recursive, connection=None, serverUri=None):
        self.lastErrorSvc.setLastError(0, '')
        try:
            if include != '':
                include_pats = include.split(';')
            else:
                include_pats = None
            if exclude != '':
                exclude_pats = exclude.split(';')
            else:
                exclude_pats = None
            part = UnwrapObject(part)
            if connection is None:
                # Setup the connection for the given url
                # Note: dirname is a url for the first call, but sebsequent
                #       recursive calls it will just be the remote path/directory.
                RFService = components.classes["@activestate.com/koRemoteConnectionService;1"].\
                            getService(components.interfaces.koIRemoteConnectionService)
                connection = RFService.getConnectionUsingUri(dirname)
                if not connection:
                    self.lastErrorSvc.setLastError(1, 'Could not obtain remote file connection')
                    return []
                # Parse up the url, so we get the remote directory path
                URI = URIParser()
                URI.URI = dirname
                remoteDir = URI.path
                # Base URI for the remote filesystem
                serverUri = "%s://%s" % (URI.scheme, URI.server)
            else:
                remoteDir = dirname

            # Get the remote directory listing
            #print "Getting connection listing for: %s" % (remoteDir)
            koRemoteInfo = connection.list(remoteDir, 1)  # Refresh it
            if koRemoteInfo is None:
                self.lastErrorSvc.setLastError(1, 'Could not locate the remote file path: %r' % (remoteDir))
                return []
            koRemoteInfo = koRemoteInfo.getChildren()
            #print "koRemoteInfo:", koRemoteInfo

            filesonly = [f for f in koRemoteInfo if f.isFile()]
            filenames = [f.getFilename() for f in filesonly]
            if filenames:
                # Filter them. Note: Files have include and exclude patterns
                # Note2: _filterFiles works on basenames only
                filteredFilenames = _filterFiles(filenames, include_pats, exclude_pats)
                # Convert back to list of full path filenames
                filenames = ["%s/%s" % (remoteDir, name) for name in filteredFilenames]

            # now look at children for recursive imports
            if recursive:
                # Determine the directories
                dirnames = [f.getFilename() for f in koRemoteInfo if f.isDirectory()]
                # Directories only have an exclude pattern
                # Note: _filterFiles works on basenames only
                filteredDirnames = _filterFiles(dirnames, None, exclude_pats)
                # Turn into full path
                filteredDirnames = ["%s/%s" % (remoteDir, name) for name in filteredDirnames]
                for subdirname in filteredDirnames:
                    filenames += self.findCandidateFilesRemotely(part, subdirname, include, exclude, recursive, connection, serverUri)

            # Don't add files that already exist in the project
            if not part.live:
                # XXX REMOVE ME when livefolder == folder
                # for now, support the js dialog for importing
                newfiles = []
                for name in filenames:
                    uri = "%s%s" % (serverUri, name)
                    if not part._project._urlmap.get(uri, None):
                        newfiles.append(name)
                return newfiles

            return filenames
        except:
            # TODO: Catch OSError or appropriate specific exception
            log.exception("failed scaning remote file system")
            return []
    def addSelectedFiles(self, folder, importType, basedir, filenames):
        #import time
        #t1 = time.clock()
        # XXX bug 38793
        if basedir[-1]=='/':
            basedir = basedir[:-1]

        folder = UnwrapObject(folder)
        project = folder._project
        _folderCache = {}

        # See what type of import this is
        #print "basedir: %r" % (basedir)
        URI = URIParser()
        URI.URI = basedir
        if URI.scheme in RemoteURISchemeTypes:
            isRemote = True
            # Convert all filenames into remote URI's
            remotePrefix = "%s://%s" % (URI.scheme, URI.server)
            # XXX - This hack may be needed on Windows ??
            #if sys.platform.startswith("win"):
            #    # Windows, convert the filenames to a windows format
            #    filenames_and_urls = [(os.path.normpath(filename), remotePrefix + filename) for filename in filenames]
            #else:
            filenames_and_urls = [(filename, remotePrefix + filename) for filename in filenames]
        else:
            isRemote = False
            # Convert all filenames into local URI's
            filenames_and_urls = [(filename, uriparse.localPathToURI(str(filename))) for filename in filenames]
        data = [(project.getPart(filename, url, project, folder.live), filename, url) for (filename,url) in filenames_and_urls]

        #c1 = time.clock()
        #print "addSelectedFiles c1 ", c1-t1

        if importType == 'makeFlat':
            for part, filename, url in data:
                part.live = folder.live
                folder.children.append(part)
                part._parent = folder
                project._urlmap[url] = part
                part.assignId()
        elif importType == 'groupByType':
            registry = components.classes["@activestate.com/koLanguageRegistryService;1"].\
                getService(components.interfaces.koILanguageRegistryService)
            for part, filename, url in data:
                language = registry.suggestLanguageForFile(filename)
                if not language: language = 'Other'
                if language in _folderCache and _folderCache[subdirname]:
                    subfolder = _folderCache[language]
                else:
                    subfolder = _folderCache[language] = folder.getLanguageFolder(language)
                part.live = subfolder.live
                subfolder.children.append(part)
                part._parent = subfolder
                project._urlmap[url] = part
                part.assignId()
        elif importType == 'useFolders':
            if not isRemote:
                basedir = uriparse.localPathToURI(basedir)
            baseuri = basedir
            for part, filename, url in data:
                diruri = os.path.dirname(url)
                if diruri in _folderCache and _folderCache[diruri]:
                    subfolder = _folderCache[diruri]
                else:
                    subfolder = _folderCache[diruri] = folder.getDirFolder(baseuri, diruri)
                if not subfolder:
                    log.error("Unable to get subfolder for %s: %s", baseuri, diruri)
                part.live = subfolder.live
                subfolder.children.append(part)
                part._parent = subfolder
                project._urlmap[url] = part
                part.assignId()
        #c2 = time.clock()
        #print "addSelectedFiles c2 ", c2-c1
        try:
            # let the file status service know we need to get status info
            obSvc = components.classes["@mozilla.org/observer-service;1"]\
                .getService(components.interfaces.nsIObserverService)
            obSvc.notifyObservers(self,'file_changed',basedir)
        except:
            pass # no listener
        project.set_isDirty(len(data) > 0)