Пример #1
0
    def downloadFile(self, url_to_download, download_location):
        url = QUrl(url_to_download)
        fileInfo = QFileInfo(url.path())
        #fileName = fileInfo.fileName()
        fileName = download_location + fileInfo.fileName()
        self.file_name = fileName
        print("Filename = " + fileName)

        if QFile.exists(fileName):
            QFile.remove(fileName)

        self.outFile = QFile(fileName)
        if not self.outFile.open(QIODevice.WriteOnly):
            QMessageBox.information(self, 'Error',
                    'Unable to save the file %s: %s.' % (fileName, self.outFile.errorString()))
            self.outFile = None
            return

        mode = QHttp.ConnectionModeHttp
        port = url.port()
        if port == -1:
            port = 0
        self.http.setHost(url.host(), mode, port)
        self.httpRequestAborted = False

        path = QUrl.toPercentEncoding(url.path(), "!$&'()*+,;=:@/")
        if path:
            path = str(path)
        else:
            path = '/'

        # Download the file.
        self.httpGetId = self.http.get(path, self.outFile)
        return fileName
Пример #2
0
    def downloadFile(self, url_to_download, fout):
        " get the file from remote url to local folder "
        url = QUrl(url_to_download)
        fileInfo = QFileInfo(url.path())
        fileName = path.join(fout, str(fileInfo.fileName()))

        if QFile.exists(fileName):
            QFile.remove(fileName)

        self.outFile = QFile(fileName)
        if not self.outFile.open(QIODevice.WriteOnly):
            QMessageBox.information(
                self, "ERROR", "Cant save the file %s: %s." % (fileName, self.outFile.errorString())
            )
            self.outFile = None
            return

        mode = QHttp.ConnectionModeHttp
        port = url.port()
        if port == -1:
            port = 0
        self.http.setHost(url.host(), mode, port)
        self.httpRequestAborted = False

        tpath = QUrl.toPercentEncoding(url.path(), "!$&'()*+,;=:@/")
        if tpath:
            tpath = str(tpath)
        else:
            tpath = sep
        # Download the file.
        print(" INFO: Blender Download Started ! ")
        self.httpGetId = self.http.get(tpath, self.outFile)
Пример #3
0
 def downloadFile(self):
     url = QUrl(self.downloadUrl)
     fileInfo = QFileInfo(url.path())
     #fileName = fileInfo.fileName()
     fileName = self.targetDirectory + fileInfo.fileName()
     if QFile.exists(fileName):
         QFile.remove(fileName)
     self.outFile = QFile(fileName)
     if not self.outFile.open(QIODevice.WriteOnly):
         QMessageBox.information(self, 'Error', 'Unable to save the file %s: %s.' % (fileName, self.outFile.errorString()))
         self.outFile = None
         return
     mode = QHttp.ConnectionModeHttp
     port = url.port()
     if port == -1:
         port = 0
     self.http.setHost(url.host(), mode, port)
     self.httpRequestAborted = False
     print url
     path = QUrl.toPercentEncoding(url.path(), "!$&'()*+,;=:@/")
     if path:
         path = str(path)
     else:
         path = '/'
     # Right at the end we append the query string that is lost, the original author did not include this unfortunately.
     parsedUrl = urlparse(self.downloadUrl)
     if not parsedUrl.query == '':
         # fix this mess, otherwise leave it alone
         path = path + "?" + parsedUrl.query
         print path
     # Download the file.
     self.httpGetId = self.http.get(path, self.outFile)
Пример #4
0
class DownloadFtp(Download):
    def __init__(self, file_share, local_path, date):
        Download.__init__(self, file_share, local_path, date)
        self.ftp = QFtp(self)
        self.ftp.dataTransferProgress.connect(self.update_progress)
        self.ftp.done.connect(self.download_finished)
        self.ftp.stateChanged.connect(self.state_changed)
        self.url = QUrl(self._file_share.url)
        self.out_file = QFile(self.local_path)

        self.read_bytes = self.out_file.size() 
 
    def start_download(self):
        self.ftp.connectToHost(self.url.host(), self.url.port(21))
        self.ftp.login()
        
        if self.out_file.open(QIODevice.WriteOnly):
            self.ftp.get(self.url.path(), self.out_file)

    def stop(self):
        self.ftp

    def state_changed(self, state):
        if state == 1 or state == 2:
            self._state = 1

    def download_finished(self, _):
        print "finished !"

    def update_progress(self, read_bytes, total_bytes):
        self.read_bytes = read_bytes
Пример #5
0
    def downloadFile(self, url, archivo_destino):
        url = QUrl(url)
        fileName = archivo_destino
        directorio_usuario_para_pilas = os.path.dirname(archivo_destino)

        if not os.path.exists(directorio_usuario_para_pilas):
            os.mkdir(directorio_usuario_para_pilas)

        if QFile.exists(fileName):
            QFile.remove(fileName)

        self.outFile = QFile(fileName)

        if not self.outFile.open(QIODevice.WriteOnly):
            QMessageBox.information(self, 'Error', 'Lo siento, no se puede descargar el archivo desde %s: %s.' % (self.url, self.outFile.errorString()))
            self.outFile = None
            return

        mode = QHttp.ConnectionModeHttp
        port = url.port()
        if port == -1:
            port = 0
        self.http.setHost(url.host(), mode, port)
        self.httpRequestAborted = False

        path = QUrl.toPercentEncoding(url.path(), "!$&'()*+,;=:@/")
        if path:
            path = str(path)
        else:
            path = '/'

        self.httpGetId = self.http.get(path, self.outFile)
Пример #6
0
    def search(self, description):
        if description.help_ref:
            ref = description.help_ref
        else:
            raise KeyError()

        url = QUrl(self.baseurl).resolved(QUrl(ref))
        if url.isLocalFile():
            path = url.toLocalFile()
            fragment = url.fragment()
            if os.path.isfile(path):
                return url
            elif os.path.isfile("{}.html".format(path)):
                url = QUrl.fromLocalFile("{}.html".format(path))
                url.setFragment(fragment)
                return url
            elif os.path.isdir(path) and \
                    os.path.isfile(os.path.join(path, "index.html")):
                url = QUrl.fromLocalFile(os.path.join(path, "index.html"))
                url.setFragment(fragment)
                return url
            else:
                raise KeyError()
        else:
            if url.scheme() in ["http", "https"]:
                path = url.path()
                if not (path.endswith(".html") or path.endswith("/")):
                    url.setPath(path + ".html")
        return url
Пример #7
0
    def downloadFile(self):
        url = QUrl(self.url_to_download)

        fileName = QFileDialog.getSaveFileName(self, "Enregistrer la liste des dossiers", self.nameFile, "conf")

        if QFile.exists(fileName):
            QFile.remove(fileName)

        self.outFile = QFile(fileName)
        if not self.outFile.open(QIODevice.WriteOnly):
            QMessageBox.information(self, 'Erreur','Impossible d\'enregistrer le fichier %s: %s.' % (fileName, self.outFile.errorString()))
            self.outFile = None
            return

        #Création que la connexion HTTPS
        mode = QHttp.ConnectionModeHttps
        port = 0
        self.http.setHost(url.host(), mode, port)
        
        self.requeteHTTPannule = False
        path = QUrl.toPercentEncoding(url.path(), "!$&'()*+,;=:@/")
        if path:
            path = str(path)
        else:
            path = '/'

        #Concaténation des paramètres à l'URL
        path = path+("?")
        for item in url.queryItems():
            path = path + item[0] + "=" + item[1] + "&" 
        
        self.http.setUser(self.login, self.password)
        self.httpGetId = self.http.get(path, self.outFile)
Пример #8
0
 def data(self):
     """Return all the data for this model (including dependencies) in a structured dict
     """
     empty_template = '{}'
     param_map = {PATH: 'Path', GET: 'GET', POST: 'POST', COOKIE: 'Cookie'}
     url = QUrl(self.transition.url)
     path_dict = path_to_dict(url.path())
     get_keys, post_keys = set(), set()
     output = {}
     if self.override:
         output['variables'] = []
         for param_type, key, template, parent_model in self.override:
             parent = parent_model if isinstance(
                 parent_model, basestring) else parent_model.data()
             output['variables'].append({
                 'key': key,
                 'origin': param_map[param_type],
                 'source': parent,
                 'template': template,
             })
             if param_type == PATH:
                 path_dict[key] = empty_template
             elif param_type == GET:
                 get_keys.add(key)
             elif param_type == POST:
                 post_keys.add(key)
     url.setPath(dict_to_path(path_dict))
     qs_items = [(key, empty_template if key in get_keys else value)
                 for (key, value) in url.queryItems()
                 if (GET, key) not in self.ignored]
     url.setEncodedQueryItems(qs_items)
     output['url'] = url.toString()
     data = dict([(key, empty_template if key in post_keys else value)
                  for (key, value) in self.transition.data
                  if (POST, key) not in self.ignored])
     if data:
         output['data'] = data
     #if self.ignored:
     #    output['ignored'] = [(param_map[param_type], value) for (param_type, value) in self.ignored]
     if self.selector is not None:
         output['columns'] = {'data': str(self.selector)}
     elif self.columns is not None:
         output['columns'] = {
             field: str(selector)
             for (field, selector) in self.columns.items()
         }
     output['headers'] = [(str(key), str(value))
                          for (key,
                               value) in self.transition.request_headers
                          if str(key).lower() not in ('content-length', )]
     output['verb'] = self.transition.verb
     return output
Пример #9
0
    def downloadFile(self):

        url = QUrl(self.url_text.text())
        if self.txt_location.text() == "":
            QDir.setCurrent("$HOME/Downloads")
        else:
            QDir.setCurrent(self.loc)

        self.statusbar.showMessage("Downloading")

        fileInfo = QFileInfo(url.path())
        fileName = fileInfo.fileName()

        if QFile.exists(fileName):
            QFile.remove(fileName)

        self.outFile = QFile(fileName)
        if not self.outFile.open(QIODevice.WriteOnly):
            QMessageBox.information(
                self, 'Error', 'Unable to save the file %s: %s.' %
                (fileName, self.outFile.errorString()))
            self.outFile = None
            return

        mode = QHttp.ConnectionModeHttp
        port = url.port()
        if port == -1:
            port = 0
        self.http.setHost(url.host(), mode, port)
        self.httpRequestAborted = False

        path = QUrl.toPercentEncoding(url.path(), "!$&'()*+,;=:@/")
        if path:
            path = str(path)
        else:
            path = '$HOME/Downloads'

        # Download the file.
        self.httpGetId = self.http.get(path, self.outFile)
Пример #10
0
    def downloadFile(self):
        
        url = QUrl(self.url_text.text())
        if self.txt_location.text()=="":
            QDir.setCurrent("$HOME/Downloads")
        else:
            QDir.setCurrent(self.loc)

        self.statusbar.showMessage("Downloading")
        
        fileInfo = QFileInfo(url.path())
        fileName = fileInfo.fileName()

        if QFile.exists(fileName):
            QFile.remove(fileName)

        self.outFile = QFile(fileName)
        if not self.outFile.open(QIODevice.WriteOnly):
            QMessageBox.information(self, 'Error',
                    'Unable to save the file %s: %s.' % (fileName, self.outFile.errorString()))
            self.outFile = None
            return

        mode = QHttp.ConnectionModeHttp
        port = url.port()
        if port == -1:
            port = 0
        self.http.setHost(url.host(), mode, port)
        self.httpRequestAborted = False

        path = QUrl.toPercentEncoding(url.path(), "!$&'()*+,;=:@/")
        if path:
            path = str(path)
        else:
            path = '$HOME/Downloads'

        # Download the file.
        self.httpGetId = self.http.get(path, self.outFile)
Пример #11
0
    def urlFromValue(self, value):
        variable = value.variable
        origin = variable.attributes.get("origin", "")
        if origin and QDir(origin).exists():
            origin = QUrl.fromLocalFile(origin)
        elif origin:
            origin = QUrl(origin)
            if not origin.scheme():
                origin.setScheme("file")
        else:
            origin = QUrl("")
        base = origin.path()
        if base.strip() and not base.endswith("/"):
            origin.setPath(base + "/")

        name = QUrl(str(value))
        url = origin.resolved(name)
        if not url.scheme():
            url.setScheme("file")
        return url
Пример #12
0
    def urlFromValue(self, value):
        variable = value.variable
        origin = variable.attributes.get("origin", "")
        if origin and QDir(origin).exists():
            origin = QUrl.fromLocalFile(origin)
        elif origin:
            origin = QUrl(origin)
            if not origin.scheme():
                origin.setScheme("file")
        else:
            origin = QUrl("")
        base = origin.path()
        if base.strip() and not base.endswith("/"):
            origin.setPath(base + "/")

        name = QUrl(str(value))
        url = origin.resolved(name)
        if not url.scheme():
            url.setScheme("file")
        return url
Пример #13
0
class FTP_Handler( QFtp ):

    # =======================================================================
    def __init__( self, parent=None ):

        # -------------------------------------------------------------------
        QFtp.__init__( self, parent );
        
        # -------------------------------------------------------------------
        self.PARENT                                 = parent;
        self.DEBUG                                  = False;
        self.LOG_TAG                                = str(self.__class__.__name__).upper();

        # -------------------------------------------------------------------
        self.stateChanged.connect( self.ON_STATE_CHANGED ); 
        self.listInfo.connect( self.ON_LIST_INFO_AVAILABLE ); 
        self.commandFinished.connect( self.ON_COMMAND_FINISHED ); 
        self.commandStarted.connect( self.ON_COMMAND_STARTED ); 
        self.readyRead.connect( self.ON_READY_READ ); 
        self.done.connect( self.ON_DONE ); 
        self.dataTransferProgress.connect( self.ON_DATA_TRANSFER_PROGRESS ); 
        self.rawCommandReply.connect( self.ON_RAW_COMMAND_REPLY ); 

        # -------------------------------------------------------------------
        self.HOST                                   = "";
        self.PATH                                   = "";
        self.USER                                   = "";
        self.PWD                                    = "";
        self.PORT                                   = 21;

        # -------------------------------------------------------------------
        self.FILE_INFO_LIST                         = [];
        self.LOGIN_SUCCESS                          = False;
        self.ALLOW_TO_RUN                           = True;
        self.LAST_ERROR                             = QFtp.NoError;

        self.NEW_URL                                = "";
        self.SHOW_HIDDEN_FILES                      = False;
        self.SHOW_FILES_FIRST                       = False;

        self.PRINT_CONN_INFO                        = False;

        # -------------------------------------------------------------------
        self.REQ_UIDS                               = {

            "connect"       : 0,
            "login"         : 0,
            "cd"            : 0,
            "list"          : 0,

        } 

        # -------------------------------------------------------------------
        self.PARENT.SPLASH.STATUS( self.LOG_TAG+": [INIT]" );
        # -------------------------------------------------------------------

    # =======================================================================
    def MK_CONNECT( self, _url, _user="******", _pwd="", _port=21 ):

        # -------------------------------------------------------------------
        try:

            req  = urllib2.Request( _url, headers=self.PARENT.WEB_PAGE.HEADERS );
            resp = urllib2.urlopen( req );
            t = resp.headers["content-type"];
            self.PARENT.DOWNLOAD_MANAGER.REQUEST( _url, False );

            return;

        except Exception as _err:
            pass;


        # -------------------------------------------------------------------
        try:
            
            # -----------------------------------------------------------
            # Name, isFile, date, size, owner
            for _f_info in self.FILE_INFO_LIST:
                if _url.split("/")[-1] == _f_info[0] and _f_info[1]:

                    self.PARENT.DOWNLOAD_MANAGER.REQUEST( "ftp://"+self.HOST+self.PATH+_f_info[0], False );
                    return;

            # -----------------------------------------------------------
            self.FILE_INFO_LIST                     = [];

            self.Q_URL                              = QUrl( _url ); 

            self.USER                               = str(_user);
            self.PWD                                = str(_pwd);
            self.PORT                               = int(_port);
            self.HOST                               = self.HOST if str(self.Q_URL.host()) == "" else str(self.Q_URL.host());
            self.PATH                               = "/" if str(self.Q_URL.path()) == "" else str(self.Q_URL.path());

            # -----------------------------------------------------------
            if self.PRINT_CONN_INFO:

                print(" --------------------------------------------------------- " );
                print("USER: ["+self.USER+"]" );
                print("PWD: ["+self.PWD+"]" );
                print("PORT: ["+str(self.PORT)+"]" );
                print("HOST: ["+self.HOST+"]" );
                print("PATH: ["+self.PATH+"]" );
                print(" --------------------------------------------------------- " );
            # -----------------------------------------------------------

            self.CONNECT();

        except Exception as _err:
            self.LOCAL_ERROR_LOG( "MK_CONNECT[1]: "+str(_err) );
            
        # -------------------------------------------------------------------

    # =======================================================================
    def CONNECT( self ):

        # -------------------------------------------------------------------
        try:

            self.REQ_UIDS["connect"] = self.connectToHost( self.HOST, self.PORT );
            self.REQ_UIDS["login"]   = self.login( self.USER, self.PWD );

        except Exception as _err:
            self.LOCAL_ERROR_LOG( "CONNECT: "+str(_err) );

        # -------------------------------------------------------------------

    # =======================================================================
    def ON_COMMAND_FINISHED( self, _response, _bool ):

        # -------------------------------------------------------------------
        try:

            if _response == self.REQ_UIDS["connect"]:
                print("Connected.")

            elif _response == self.REQ_UIDS["login"]:

                if self.state() == QFtp.LoggedIn:

                    print(" LoggedIn: 200");
                    self.LOGIN_SUCCESS = True;

                    print(" cd: ["+self.PATH+"]");
                    self.REQ_UIDS["cd"] = self.cd( self.PATH );


                else:
                    print(" NOT-LoggedIn: 500");

            elif _response == self.REQ_UIDS["cd"]:

                self.REQ_UIDS["list"] = self.list();                


            elif _response == self.REQ_UIDS["list"]:

                self.CREATE_TREE( self.PATH );
                self.close();

        except Exception as _err:
            self.LOCAL_ERROR_LOG( "ON_COMMAND_FINISHED: "+str(_err) );

        # -------------------------------------------------------------------

    # =======================================================================
    def CREATE_TREE( self, _ADDR ):

        # -------------------------------------------------------------------

        try:

            LEVEL_UP = "";

            if _ADDR == "/":
                LEVEL_UP = "/";

            else:
                dirs = _ADDR.split("/");
                for i in xrange(0, len(dirs)-2):

                    LEVEL_UP += dirs[i]+"/";


        except Exception as _err:
            self.LOCAL_ERROR_LOG( str(_err), "CREATE_TREE:0" );
            return False;

        # -----------------------------------------------------------------
        try:

            # GENERATE HTML-BASED-FILE-EXPLORER
            _HTML = "";
            _HR_ = '<div class="_hr_div"></div>'+"\n";


            with open( self.PARENT.DATA_DIR+"css/file_browser.css", 'r' ) as FS:
                for _l in FS:
                    _HTML += _l;

            _HTML += _HR_;
            _HTML += '&nbsp;&nbsp;&nbsp;["<a class="_nav_path" href="ftp://'+self.HOST+LEVEL_UP+'">level up</a>"] => ';

            # -----------------------------------------------------------------
            _ADDR = _ADDR.replace("//","/");

            QUICK_NAV_PATH = "";
            QUICK_NAV_NAME = '["';
            QUICK_NAV_DATA = _ADDR.split( "/" );

            for quick_nav in QUICK_NAV_DATA:
                
                QUICK_NAV_PATH += quick_nav.strip()+"/";
                QUICK_NAV_NAME += '<a class="_nav_path" href="ftp://'+self.HOST+QUICK_NAV_PATH+'">'+quick_nav.strip()+"</a>/";

            _HTML += (QUICK_NAV_NAME[ 0: len(QUICK_NAV_NAME)-1 ])+'"]';
            _HTML += _HR_;

        except Exception as _err:
            self.LOCAL_ERROR_LOG( str(_err), "CREATE_TREE:1" );
            return False;


        # -----------------------------------------------------------------
        try:

            _F = []; # files
            _D = []; # directoris
            
            host_path = 'ftp://'+self.HOST+self.PATH;

            # Name, isFile, date, size, owner
            for _f_info in self.FILE_INFO_LIST:
                
                try:
                    mod_date = "["+strftime("%d-%b-%Y %H:%M:%S", localtime( _f_info[2] ))+"]";
                except:
                    print( ":::::::::::::::: "+str(_f_info[2]) );
                    mod_date = "[out of range]";



                if _f_info[1]:

                    _sizeByte  = _f_info[3];
                    _sizeKByte = float(_sizeByte/1024);
                    _sizeMByte = float(_sizeKByte/1024);


                    if _sizeMByte > 0.99999:
                        _size = "{0:.2f} Mb".format( _sizeMByte );

                    elif _sizeKByte > 0.99999:
                        _size = "{0:.2f} KiB".format( _sizeKByte );

                    else:
                        _size = str(_sizeByte)+" Byte";

                    _f = '<div class="_line">';

                    if _f_info[0:1] == ".":
                        _f += '<div class="_long_name"><a class="_file_hidden" href="'+host_path+_f_info[0]+'"> '+_f_info[0]+'</a></div>';
                    else:
                        _f += '<div class="_long_name"><a class="_file" href="'+host_path+_f_info[0]+'"> '+_f_info[0]+'</a></div>';

                    _f += '<span class="_size">'+_size+'</span>';
                    _f += '<span class="_mod_date">'+mod_date+'</span>';
                    _f += '<span class="_descr_F">(F)</span>';
                    _f += '</div>\n';

                    _F.append( _f );

                else:

                    _d = '<div class="_line">';

                    if _f_info[0:1] == ".":
                        _d += '<div class="_long_name"><a class="_dir_hidden" href="'+host_path+_f_info[0]+'/"> '+_f_info[0]+'/</a></div>';
                    else:
                        #print(host_path, _f_info[0], [self.HOST,self.PATH])
                        _d += '<div class="_long_name"><a class="_dir" href="'+host_path+_f_info[0]+'/"> '+_f_info[0]+'/</a></div>';

                    _d += '<span class="_size">...</span>';
                    _d += '<span class="_mod_date">'+mod_date+'</span>';
                    _d += '<span class="_descr_D">(D)</span>';
                    _d += '</div>\n';

                    _D.append( _d );


        except Exception as _err:
            self.LOCAL_ERROR_LOG( str(_err), "CREATE_TREE:2" );
            return False;

        # -------------------------------------------------------------------------
        for _d in _D: _HTML += _d;
        for _f in _F: _HTML += _f;

        """
        try:

            if self.SHOW_FILES_FIRST: #if _file_first:

                for _f in _F: _HTML += _f;
                for _d in _D: _HTML += _d;

            else:

                for _d in _D: _HTML += _d;
                for _f in _F: _HTML += _f;

        except Exception as _err:
            self.LOCAL_ERROR_LOG( str(_err), "CREATE_TREE:3" );
            return False;

        """
        # -------------------------------------------------------------------------
        try:

            new_name = self.PARENT.TMP_DIR+str(int(time()))+".html";
            FS = open(new_name, "w");
            FS.write( _HTML+_HR_ );
            FS.close();
            self.NEW_URL = new_name;

        except Exception as _err:
            self.LOCAL_ERROR_LOG( str(_err), "CREATE_TREE:4" );
            return False;

        # -------------------------------------------------------------------
        try:

            self.PARENT.WEB_VIEW.load( QUrl(self.NEW_URL) );

        except Exception as _err:
            self.LOCAL_ERROR_LOG( str(_err), "CREATE_TREE:5" );
            return False;

        # -------------------------------------------------------------------
        return True;

        # -------------------------------------------------------------------

    # =======================================================================
    def ON_LIST_INFO_AVAILABLE( self, _QUrlInfo ):

        # -------------------------------------------------------------------
        try:

            _f_info = QUrlInfo( _QUrlInfo );

            self.FILE_INFO_LIST.append([

                str(_f_info.name()),
                bool( _f_info.isFile() ),
                long( _f_info.lastModified().toMSecsSinceEpoch()/1000 ),
                int(_f_info.size()),
                str(_f_info.owner())

            ]);

        except Exception as _err:
            self.LOCAL_ERROR_LOG( "LIST_INFO: "+str(_err) );

        # -------------------------------------------------------------------

    # =======================================================================
    def ON_STATE_CHANGED ( self, _state ):

        # -------------------------------------------------------------------
        try:

            if _state == QFtp.Unconnected: # 0 - There is no connection to the host.
                if self.DEBUG:
                    print("DocFTPHandler: [QFtp.Unconnected]");
                self.close();

            elif _state == QFtp.HostLookup: # 1 - A host name lookup is in progress.
                if self.DEBUG:
                    print("DocFTPHandler: [QFtp.HostLookup]");

            elif _state == QFtp.Connecting: # 2 - An attempt to connect to the host is in progress.
                if self.DEBUG:
                    print("DocFTPHandler: [QFtp.Connecting]");

            elif _state == QFtp.Connected: # 3 - Connection to the host has been achieved.
                if self.DEBUG:
                    print("DocFTPHandler: [QFtp.Connected]");

            elif _state == QFtp.LoggedIn: # 4 - Connection and user login have been achieved.
                if self.DEBUG:
                    print("DocFTPHandler: [QFtp.LoggedIn]");

            elif _state == QFtp.Closing: # 5 - The connection is closing down, but it is not yet closed. (The state will be Unconnected when the connection is closed.)
                if self.DEBUG:
                    print("DocFTPHandler: [QFtp.Closing]");
                self.close();

            else:
                print("DocFTPHandler: [QFtp.STATE: 'Unknown'");

        except Exception as _err:
            self.LOCAL_ERROR_LOG( "ON_STATE_CHANGED: "+str(_err) );

        # -------------------------------------------------------------------

    # =======================================================================
    def ON_DATA_TRANSFER_PROGRESS( self, _qint64_A, _qint64_B ):

        # -------------------------------------------------------------------
        try:

            pass;
            #print(" ON_DATA_TRANSFER_PROGRESS: ["+str(_qint64_A)+", "+str(_qint64_B)+"]" );

        except Exception as _err:
            self.LOCAL_ERROR_LOG( "ON_DATA_TRANSFER_PROGRESS: "+str(_err) );

        # -------------------------------------------------------------------

    # =======================================================================
    def ON_RAW_COMMAND_REPLY ( self, _int, _str ):

        # -------------------------------------------------------------------
        try:

            pass;
            #print(" ON_RAW_COMMAND_REPLY: ["+str(_int)+", "+str(_str)+"]" );

        except Exception as _err:
            self.LOCAL_ERROR_LOG( "ON_RAW_COMMAND_REPLY: "+str(_err) );
        # -------------------------------------------------------------------

    # =======================================================================
    def ON_DONE( self, _bool ):

        # -------------------------------------------------------------------
        try:

            pass;

        except Exception as _err:
            self.LOCAL_ERROR_LOG( "ON_DONE: "+str(_err) );

        # -------------------------------------------------------------------

    # =======================================================================
    def ON_READY_READ( self ):

        # -------------------------------------------------------------------
        try:

            pass;

        except Exception as _err:
            self.LOCAL_ERROR_LOG( "ON_READY_READ: "+str(_err) );
        # -------------------------------------------------------------------

    # =======================================================================
    def ON_COMMAND_STARTED ( self, _int ):

        # -------------------------------------------------------------------
        try:

            pass;

        except Exception as _err:
            self.LOCAL_ERROR_LOG( "ON_COMMAND_STARTED: "+str(_err) );

        # -------------------------------------------------------------------

    # =======================================================================
    def LOCAL_INFO_LOG( self, _msg, METHOD=None ):

        # -------------------------------------------------------------------
        if METHOD is None:
            self.PARENT.LOCAL_INFO_LOG( "['"+self.LOG_TAG+"']: ["+_msg+"]" );
        else:
            self.PARENT.LOCAL_INFO_LOG( "['"+self.LOG_TAG+"."+METHOD+"']: ["+_msg+"]" );
        # -------------------------------------------------------------------

    # =======================================================================
    def LOCAL_ERROR_LOG( self, _msg, METHOD=None ):

        # -------------------------------------------------------------------
        if self.DEBUG or self.PARENT.DEBUG_GLOBAL: self.PARENT.DEBUGGER.DEBUG();
        # -------------------------------------------------------------------
        if METHOD is None:
            self.PARENT.LOCAL_ERROR_LOG( "['"+self.LOG_TAG+"']: ["+_msg+"]" );
        else:
            self.PARENT.LOCAL_ERROR_LOG( "['"+self.LOG_TAG+"."+METHOD+"']: ["+_msg+"]" );
        # -------------------------------------------------------------------

    # =======================================================================
    def LOCAL_WARNING_LOG( self, _msg, METHOD=None ):

        # -------------------------------------------------------------------
        #if self.DEBUG or self.PARENT.DEBUG_GLOBAL: self.PARENT.DEBUGGER.DEBUG();
        # -------------------------------------------------------------------
        if METHOD is None:
            self.PARENT.LOCAL_WARNING_LOG( "['"+self.LOG_TAG+"']: ["+_msg+"]" );
        else:
            self.PARENT.LOCAL_WARNING_LOG( "['"+self.LOG_TAG+"."+METHOD+"']: ["+_msg+"]" );
Пример #14
0
class FileDownloader(object):
    """The blueprint for downloading file from url."""
    def __init__(self, url, output_path, progress_dialog=None):
        """Constructor of the class.

        .. versionchanged:: 3.3 removed manager parameter.

        :param url: URL of file.
        :type url: str

        :param output_path: Output path.
        :type output_path: str

        :param progress_dialog: Progress dialog widget.
        :type progress_dialog: QWidget

        """
        # noinspection PyArgumentList
        self.manager = qgis.core.QgsNetworkAccessManager.instance()
        self.url = QUrl(url)
        self.output_path = output_path
        self.progress_dialog = progress_dialog
        if self.progress_dialog:
            self.prefix_text = self.progress_dialog.labelText()
        self.output_file = None
        self.reply = None
        self.downloaded_file_buffer = None
        self.finished_flag = False

    def download(self):
        """Downloading the file.

        :returns: True if success, otherwise returns a tuple with format like
            this (QNetworkReply.NetworkError, error_message)

        :raises: IOError - when cannot create output_path
        """
        # Prepare output path
        self.output_file = QFile(self.output_path)
        if not self.output_file.open(QFile.WriteOnly):
            raise IOError(self.output_file.errorString())

        # Prepare downloaded buffer
        self.downloaded_file_buffer = QByteArray()

        # Request the url
        request = QNetworkRequest(self.url)
        self.reply = self.manager.get(request)
        self.reply.readyRead.connect(self.get_buffer)
        self.reply.finished.connect(self.write_data)
        self.manager.requestTimedOut.connect(self.request_timeout)

        if self.progress_dialog:
            # progress bar
            def progress_event(received, total):
                """Update progress.

                :param received: Data received so far.
                :type received: int

                :param total: Total expected data.
                :type total: int
                """
                # noinspection PyArgumentList
                QCoreApplication.processEvents()

                self.progress_dialog.adjustSize()

                human_received = humanize_file_size(received)
                human_total = humanize_file_size(total)

                label_text = tr("%s : %s of %s" % (
                    self.prefix_text, human_received, human_total))

                self.progress_dialog.setLabelText(label_text)
                self.progress_dialog.setMaximum(total)
                self.progress_dialog.setValue(received)

            # cancel
            def cancel_action():
                """Cancel download."""
                self.reply.abort()
                self.reply.deleteLater()

            self.reply.downloadProgress.connect(progress_event)
            self.progress_dialog.canceled.connect(cancel_action)

        # Wait until finished
        # On Windows 32bit AND QGIS 2.2, self.reply.isFinished() always
        # returns False even after finished slot is called. So, that's why we
        # are adding self.finished_flag (see #864)
        while not self.reply.isFinished() and not self.finished_flag:
            # noinspection PyArgumentList
            QCoreApplication.processEvents()

        result = self.reply.error()
        try:
            http_code = int(self.reply.attribute(
                QNetworkRequest.HttpStatusCodeAttribute))
        except TypeError:
            # If the user cancels the request, the HTTP response will be None.
            http_code = None

        self.reply.abort()
        self.reply.deleteLater()

        if result == QNetworkReply.NoError:
            return True, None

        elif result == QNetworkReply.UnknownNetworkError:
            return False, tr(
                'The network is unreachable. Please check your internet '
                'connection.')

        elif http_code == 408:
            msg = tr(
                'Sorry, the server aborted your request. '
                'Please try a smaller area.')
            LOGGER.debug(msg)
            return False, msg

        elif http_code == 509:
            msg = tr(
                'Sorry, the server is currently busy with another request. '
                'Please try again in a few minutes.')
            LOGGER.debug(msg)
            return False, msg

        elif result == QNetworkReply.ProtocolUnknownError or \
                result == QNetworkReply.HostNotFoundError:
            LOGGER.exception('Host not found : %s' % self.url.encodedHost())
            return False, tr(
                'Sorry, the server is unreachable. Please try again later.')

        elif result == QNetworkReply.ContentNotFoundError:
            LOGGER.exception('Path not found : %s' % self.url.path())
            return False, tr('Sorry, the layer was not found on the server.')

        else:
            return result, self.reply.errorString()

    def get_buffer(self):
        """Get buffer from self.reply and store it to our buffer container."""
        buffer_size = self.reply.size()
        data = self.reply.read(buffer_size)
        self.downloaded_file_buffer.append(data)

    def write_data(self):
        """Write data to a file."""
        self.output_file.write(self.downloaded_file_buffer)
        self.output_file.close()
        self.finished_flag = True

    def request_timeout(self):
        """The request timed out."""
        if self.progress_dialog:
            self.progress_dialog.hide()
Пример #15
0
class DownloadFtp(Download):
    progressModified = pyqtSignal(object)
    stateChanged = pyqtSignal(object)
    downloadFinished = pyqtSignal(object)
    speedModified = pyqtSignal(object)

    def __init__(self, file_share, local_path, date, state):
        Download.__init__(self, file_share, local_path, date, state)
        self.ftp = QFtp(self)
        # Signaux
        self.ftp.dataTransferProgress.connect(self.update_progress)
        self.ftp.done.connect(self.download_finished)
        self.ftp.stateChanged.connect(self.state_changed)
        # Ouverture de fichiers
        self.url = QUrl(self._file_share.url)
        self.out_file = QFile(self.local_path)
        # Vars
        self.read_bytes = self.out_file.size()
        # Timer
        self.timer = QTimer()
        self.timer.start(500)
        self.timer.timeout.connect(self.update_speed)

    def start_download(self):
        self.ftp.connectToHost(self.url.host(), self.url.port(21))
        self.ftp.login()
        if self.out_file.open(QIODevice.WriteOnly):
            self.ftp.get(self.url.path(), self.out_file)

    def stop(self):
        self._state = 5
        self.ftp.abort()
        self.timer.stop()
        self.ftp.close()

    def state_changed(self, state):
        if state == 1 or state == 2:
            self._state = 1
        elif state == 3 or state == 4:
            self._state = 3
        self.stateChanged.emit(self)

    def download_finished(self, _):
        print "finished !"
        if self.read_bytes != self.file_share.size:
            self._state = 7
        self._speed = 0
        self.timer.stop()
        self.ftp.abort()
        self.ftp.close()
        self._state = 4
        self.stateChanged.emit(self)
        self.ftp.done.disconnect(self.download_finished)
        self.ftp.stateChanged.disconnect(self.state_changed)
        self.ftp.dataTransferProgress.disconnect(self.update_progress)
        self.downloadFinished.emit(self)

    def update_speed(self):
        delta = time.time() - self._last_time
        self._speed = float(self.read_bytes - self._last_size) / delta
        self.last_time = time.time()
        self.last_size = self.read_bytes
        self.speedModified.emit(self)

    def update_progress(self, read_bytes, total_bytes):
        self.read_bytes = read_bytes
        self.progressModified.emit(self)
Пример #16
0
    def setContentList(self):

        url = QUrl(self.url())
        if not url.path().endsWith(u"/"):
            url.setPath(url.path() + u"/")

        base_url = self.url().toString()
        base_path = (url.path())

        self.open(self.ReadOnly | self.Unbuffered)
        content = (u"<html>\n"
                   u"<head>\n"
                   u"  <title>" + self.html(base_url) + u"</title>\n"
                   u'  <style type="text/css">\n'
                   u"  th { background-color: #aaaaaa;\n"
                   u"       color: black }\n"
                   u"  table { border: solid 1px #aaaaaa }\n"
                   u"  tr.odd { background-color: #dddddd;\n"
                   u"           color: black\n }\n"
                   u"  tr.even { background-color: white;\n"
                   u"           color: black\n }\n"
                   u"  </style>\n"
                   u"</head>\n\n"
                   u"<body>\n"
                   u"<h1>Listing for " + base_path + u"</h1>\n\n")

        lines = self.input.splitlines()

        for line in lines:

            pieces = line.split("\t")
            if pieces == ["."]:
                break
            try:
                type, path, host, port = pieces[:4]
            except ValueError:
                # This isn't a listing. Let's try returning data instead.
                self.setContentData()
                return

            if type[0] == "i":
                content += u"<p>" + self.html(type[1:]) + u"</p>"
            elif type[0] == "h" and path.startswith(u"URL:"):
                content += u"<p><a href=\"" + path[4:] + u"\">" + self.html(
                    type[1:]) + u"</a></p>"
            elif type[0] == "0":
                content += u"<p><a href=\"gopher://" + host + u":" + port + path + u"?type=text\">" + self.html(
                    type[1:]) + u"</a></p>"
            elif type[0] == "1":
                content += u"<p><a href=\"gopher://" + host + u":" + port + path + u"\">" + self.html(
                    type[1:]) + u"</a></p>"
            elif type[0] == "4":
                content += u"<p><a href=\"gopher://" + host + u":" + port + path + u"?type=binhex\">" + self.html(
                    type[1:]) + u"</a></p>"
            elif type[0] == "5":
                content += u"<p><a href=\"gopher://" + host + u":" + port + path + u"?type=dos\">" + self.html(
                    type[1:]) + u"</a></p>"
            elif type[0] == "6":
                content += u"<p><a href=\"gopher://" + host + u":" + port + path + u"?type=uuencoded\">" + self.html(
                    type[1:]) + u"</a></p>"
            elif type[0] == "9":
                content += u"<p><a href=\"gopher://" + host + u":" + port + path + u"?type=binary\">" + self.html(
                    type[1:]) + u"</a></p>"
            elif type[0] == "g":
                content += u"<img src=\"gopher://" + host + u":" + port + path + u"?type=binary\">" + self.html(
                    type[1:]) + u"</img>"
            elif type[0] == "I":
                content += u"<img src=\"gopher://" + host + u":" + port + path + u"?type=binary\">" + self.html(
                    type[1:]) + u"</img>"

        content += (u"</body>\n" u"</html>\n")

        self.content = content.encode("utf-8")

        self.setHeader(QNetworkRequest.ContentTypeHeader,
                       QVariant("text/html; charset=UTF-8"))
        self.setHeader(QNetworkRequest.ContentLengthHeader,
                       QVariant(len(self.content)))
        self.readyRead.emit()
        self.finished.emit()
Пример #17
0
class FileDownloader(object):
    """The blueprint for downloading file from url."""
    def __init__(self, url, output_path, progress_dialog=None):
        """Constructor of the class.

        .. versionchanged:: 3.3 removed manager parameter.

        :param url: URL of file.
        :type url: str

        :param output_path: Output path.
        :type output_path: str

        :param progress_dialog: Progress dialog widget.
        :type progress_dialog: QWidget

        """
        # noinspection PyArgumentList
        self.manager = qgis.core.QgsNetworkAccessManager.instance()
        self.url = QUrl(url)
        self.output_path = output_path
        self.progress_dialog = progress_dialog
        if self.progress_dialog:
            self.prefix_text = self.progress_dialog.labelText()
        self.output_file = None
        self.reply = None
        self.downloaded_file_buffer = None
        self.finished_flag = False

    def download(self):
        """Downloading the file.

        :returns: True if success, otherwise returns a tuple with format like
            this (QNetworkReply.NetworkError, error_message)

        :raises: IOError - when cannot create output_path
        """
        # Prepare output path
        self.output_file = QFile(self.output_path)
        if not self.output_file.open(QFile.WriteOnly):
            raise IOError(self.output_file.errorString())

        # Prepare downloaded buffer
        self.downloaded_file_buffer = QByteArray()

        # Request the url
        request = QNetworkRequest(self.url)
        self.reply = self.manager.get(request)
        self.reply.readyRead.connect(self.get_buffer)
        self.reply.finished.connect(self.write_data)
        self.manager.requestTimedOut.connect(self.request_timeout)

        if self.progress_dialog:
            # progress bar
            def progress_event(received, total):
                """Update progress.

                :param received: Data received so far.
                :type received: int

                :param total: Total expected data.
                :type total: int
                """
                # noinspection PyArgumentList
                QCoreApplication.processEvents()

                self.progress_dialog.adjustSize()

                human_received = humanize_file_size(received)
                human_total = humanize_file_size(total)

                label_text = tr(
                    "%s : %s of %s" %
                    (self.prefix_text, human_received, human_total))

                self.progress_dialog.setLabelText(label_text)
                self.progress_dialog.setMaximum(total)
                self.progress_dialog.setValue(received)

            # cancel
            def cancel_action():
                """Cancel download."""
                self.reply.abort()
                self.reply.deleteLater()

            self.reply.downloadProgress.connect(progress_event)
            self.progress_dialog.canceled.connect(cancel_action)

        # Wait until finished
        # On Windows 32bit AND QGIS 2.2, self.reply.isFinished() always
        # returns False even after finished slot is called. So, that's why we
        # are adding self.finished_flag (see #864)
        while not self.reply.isFinished() and not self.finished_flag:
            # noinspection PyArgumentList
            QCoreApplication.processEvents()

        result = self.reply.error()
        try:
            http_code = int(
                self.reply.attribute(QNetworkRequest.HttpStatusCodeAttribute))
        except TypeError:
            # If the user cancels the request, the HTTP response will be None.
            http_code = None

        self.reply.abort()
        self.reply.deleteLater()

        if result == QNetworkReply.NoError:
            return True, None

        elif result == QNetworkReply.UnknownNetworkError:
            return False, tr(
                'The network is unreachable. Please check your internet '
                'connection.')

        elif http_code == 408:
            msg = tr('Sorry, the server aborted your request. '
                     'Please try a smaller area.')
            LOGGER.debug(msg)
            return False, msg

        elif http_code == 509:
            msg = tr(
                'Sorry, the server is currently busy with another request. '
                'Please try again in a few minutes.')
            LOGGER.debug(msg)
            return False, msg

        elif result == QNetworkReply.ProtocolUnknownError or \
                result == QNetworkReply.HostNotFoundError:
            LOGGER.exception('Host not found : %s' % self.url.encodedHost())
            return False, tr(
                'Sorry, the server is unreachable. Please try again later.')

        elif result == QNetworkReply.ContentNotFoundError:
            LOGGER.exception('Path not found : %s' % self.url.path())
            return False, tr('Sorry, the layer was not found on the server.')

        else:
            return result, self.reply.errorString()

    def get_buffer(self):
        """Get buffer from self.reply and store it to our buffer container."""
        buffer_size = self.reply.size()
        data = self.reply.read(buffer_size)
        self.downloaded_file_buffer.append(data)

    def write_data(self):
        """Write data to a file."""
        self.output_file.write(self.downloaded_file_buffer)
        self.output_file.close()
        self.finished_flag = True

    def request_timeout(self):
        """The request timed out."""
        if self.progress_dialog:
            self.progress_dialog.hide()
Пример #18
0
class Downloader(QDialog):
    " MultiThreaded GUI Downloader Dialog "

    def __init__(self, parent=None, url_to_download=None, fout=None):
        " init class "
        super(Downloader, self).__init__(parent)
        self.timer = time()
        self.httpGetId = 0
        self.httpRequestAborted = False
        self.url = QUrl(url_to_download)
        self.fileInfo = QFileInfo(self.url.path())
        self.fout = fout
        self.fileName = path.join(fout, str(self.fileInfo.fileName()))
        self.statusLabel = QLabel(
            "<center><h3>Downloading from:</h3>%s<h3>Saving to:</h3>%s</center>" % (url_to_download, fout)
        )
        self.bytes = QLabel(" ??? ")
        self.closeButton = QPushButton(" Cancel ")
        self.closeButton.setAutoDefault(False)
        self.progressBar = QProgressBar()

        buttonBox = QDialogButtonBox()
        buttonBox.addButton(self.closeButton, QDialogButtonBox.RejectRole)

        self.http = QHttp(self)
        self.http.requestFinished.connect(self.httpRequestFinished)
        self.http.dataReadProgress.connect(self.updateDataReadProgress)
        self.http.responseHeaderReceived.connect(self.readResponseHeader)
        self.closeButton.clicked.connect(self.cancelDownload)

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.statusLabel)
        mainLayout.addWidget(self.progressBar)
        mainLayout.addWidget(self.bytes)
        mainLayout.addWidget(buttonBox)
        self.setLayout(mainLayout)

        self.setWindowTitle(__doc__ + " - MultiThreaded Downloader ")
        self.resize(parent.size().width(), self.size().height())
        self.downloadFile(url_to_download, fout)

    def downloadFile(self, url_to_download, fout):
        " get the file from remote url to local folder "
        url = QUrl(url_to_download)
        fileInfo = QFileInfo(url.path())
        fileName = path.join(fout, str(fileInfo.fileName()))

        if QFile.exists(fileName):
            QFile.remove(fileName)

        self.outFile = QFile(fileName)
        if not self.outFile.open(QIODevice.WriteOnly):
            QMessageBox.information(
                self, "ERROR", "Cant save the file %s: %s." % (fileName, self.outFile.errorString())
            )
            self.outFile = None
            return

        mode = QHttp.ConnectionModeHttp
        port = url.port()
        if port == -1:
            port = 0
        self.http.setHost(url.host(), mode, port)
        self.httpRequestAborted = False

        tpath = QUrl.toPercentEncoding(url.path(), "!$&'()*+,;=:@/")
        if tpath:
            tpath = str(tpath)
        else:
            tpath = sep
        # Download the file.
        print(" INFO: Blender Download Started ! ")
        self.httpGetId = self.http.get(tpath, self.outFile)

    def cancelDownload(self):
        " abort the download "
        self.statusLabel.setText(" INFO: Download Canceled ! ")
        self.httpRequestAborted = True
        self.http.abort()
        self.close()

    def httpRequestFinished(self, requestId, error):
        " what to do when download is finised "
        if requestId != self.httpGetId:
            return
        if self.httpRequestAborted:
            if self.outFile is not None:
                self.outFile.close()
                self.outFile.remove()
                self.outFile = None
            return
        self.outFile.close()
        if error:
            self.outFile.remove()
            QMessageBox.information(self, "ERROR", "Download Failed: %s." % self.http.errorString())
        self.statusLabel.setText(" <center> <h1> ✔ OK!    ʘ‿ʘ </h1> <center> ")
        print(" INFO: Blender Download Finished ! ")
        if self.fileName.lower().endswith((".tar.gz", ".tgz", ".tar.bz2", ".tbz")):
            self.extract_file(self.fileName)

    def readResponseHeader(self, responseHeader):
        " Check for genuine error conditions "
        print(" INFO: HTTP Response is " + responseHeader.reasonPhrase())
        print(" INFO: HTTP Status Code is " + responseHeader.statusCode())
        if responseHeader.statusCode() not in (200, 300, 301, 302, 303, 307):
            QMessageBox.information(self, "ERROR", "Download Failed: %s." % responseHeader.reasonPhrase())
            self.httpRequestAborted = True
            self.http.abort()

    def updateDataReadProgress(self, bytesRead, totalBytes):
        " update the GUI Dialog "
        if self.httpRequestAborted:
            return
        self.progressBar.setMaximum(totalBytes)
        self.progressBar.setValue(bytesRead)
        self.bytes.setText(" %s of %s Bytes on %s Minutes " % (bytesRead, totalBytes, int(time() - self.timer) / 60))

    def extract_file(self, filepath):
        " extract the file "
        tarfile.debug = 3
        zipfile.debug = 3
        if filepath is None:
            return
        elif filepath.endswith(".zip"):
            opener, mode = zipfile.ZipFile, "r"
            print((" INFO: Extraction Mode is zipfile.ZipFile " + mode))
        elif filepath.endswith(".tar.gz") or filepath.endswith(".tgz"):
            opener, mode = tarfile.open, "r:gz"
            print((" INFO: Extraction Mode is tarfile.open " + mode))
        elif filepath.endswith(".tar.bz2") or filepath.endswith(".tbz"):
            opener, mode = tarfile.open, "r:bz2"
            print((" INFO: Extraction Mode is tarfile.open " + mode))
        else:
            raise ValueError("Could not extract %s " % filepath)
        cwd = getcwd()
        chdir(self.fout)
        try:
            print((" INFO: Extracting Compressed file " + filepath))
            filez = opener(filepath, mode)
            filez.extractall()
            filez.close()
        except:
            print((" ERROR: Could not extract %s " + filepath))
            raise ValueError("Could not extract %s " % filepath)
        finally:
            print((" INFO: Finished Extraction of Compressed file " + filepath))
            chdir(cwd)
        print(" INFO: Done. ")