void UpdaterComponent::downloadUpdate(const QVariantMap& updateInfo) { if (isDownloading()) return; QLOG_INFO() << updateInfo; if (!updateInfo.contains("version") || !updateInfo.contains("manifestURL") || !updateInfo.contains("manifestHash") || !updateInfo.contains("fileURL") || !updateInfo.contains("fileHash") || !updateInfo.contains("fileName")) { QLOG_ERROR() << "updateInfo was missing fields required to carry out this action."; return; } m_version = updateInfo["version"].toString(); m_manifest = new Update(updateInfo["manifestURL"].toString(), UpdateManager::GetPath("manifest.xml.bz2", m_version, false), updateInfo["manifestHash"].toString(), this); // determine if we have a manifest (some distros don't like OE) m_hasManifest = ((!m_manifest->m_url.isEmpty()) && (!m_manifest->m_hash.isEmpty())); m_file = new Update(updateInfo["fileURL"].toString(), UpdateManager::GetPath(updateInfo["fileName"].toString(), m_version, true), updateInfo["fileHash"].toString(), this); if (m_hasManifest) connect(m_manifest, &Update::fileDone, this, &UpdaterComponent::fileComplete); connect(m_file, &Update::fileDone, this, &UpdaterComponent::fileComplete); // create directories we need QDir dr(QFileInfo(m_file->m_localPath).dir()); if (!dr.exists()) { if (!dr.mkpath(".")) { QLOG_ERROR() << "Failed to create update directory:" << dr.absolutePath(); emit downloadError("Failed to create download directory"); return; } } // this will first check if the files are done // and in that case emit the done signal. if (fileComplete(NULL)) return; if (!m_manifest->isReady() && m_hasManifest) downloadFile(m_manifest); if (!m_file->isReady()) downloadFile(m_file); }
/* * getStringInWindow: main routine */ static bool getStringInWindow( input_buffer *input ) { vi_key event; bool old_mode; ReadingAString = true; initInput( input ); input->last_str = alloca( input->buffer_length ); memset( input->last_str, 0, input->buffer_length ); if( input->h != NULL ) { input->curr_hist = input->h->curr; } for( ;; ) { event = GetNextEvent( false ); event = cursorKeyFilter( input, event ); event = historyFilter( input, event ); event = specialKeyFilter( input, event ); switch( event ) { case VI_KEY( NULL ): break; case VI_KEY( SHIFT_TAB ): case VI_KEY( TAB ): if( !fileComplete( input, event ) ) { endColumn( input ); break; } /* fall through */ case VI_KEY( ENTER ): if( input->buffer[0] == NO_ADD_TO_HISTORY_KEY ) { strcpy( &input->buffer[0], &input->buffer[1] ); } else { addHistory( input ); } /* fall through */ case VI_KEY( ESC ): finiInput( input ); /* * this call may not be necessary if the file complete window has * already closed of natural causes but it doesn't harm anything * if called when not needed - so we leave it here. */ FinishFileComplete(); ReadingAString = false; return( event != VI_KEY( ESC ) ); case VI_KEY( INS ): input->overstrike = !input->overstrike; if( !EditFlags.NoInputWindow ) { NewCursor( input->window.id, input->overstrike ? EditVars.NormalCursorType : EditVars.InsertCursorType ); } break; case VI_KEY( CTRL_END ): saveStr( input ); input->buffer[input->curr_pos] = '\0'; break; case VI_KEY( CTRL_X ): case VI_KEY( CTRL_U ): saveStr( input ); input->buffer[0] = '\0'; endColumn( input ); break; case VI_KEY( CTRL_INS ): swapString( input ); break; case VI_KEY( CTRL_V ): case VI_KEY( CTRL_Q ): insertChar( input, '^' ); displayLine( input ); // here we have a bit of a kluge input->curr_pos -= 1; event = GetNextEvent( false ); saveStr( input ); old_mode = input->overstrike; input->overstrike = true; insertChar( input, event ); input->overstrike = old_mode; break; case VI_KEY( ALT_END ): /* just want to redraw the line - for windows */ break; default: if( (event >= 32 && event < 256) || event == VI_KEY( CTRL_A ) ) { saveStr( input ); if( !insertChar( input, event ) ) { MyBeep(); } } } if( !EditFlags.NoInputWindow ) { displayLine( input ); } } } /* getStringInWindow */
unsigned int Process::start(const String& rawCommandLine) { // split commands into words List<Word> command; Word::split(rawCommandLine, command); // separate leading environment variables and the command line Map<String, String> environmentVariables; for(List<Word>::Node* envNode = command.getFirst(); envNode; envNode = command.getFirst()) { const char* data = envNode->data.getData(); const char* sep = strchr(data, '='); if(sep) { // load list of existing existing variables if(environmentVariables.isEmpty()) { const Map<String, String>& envs = getEnvironmentVariables(); for(const Map<String, String>::Node* i = envs.getFirst(); i; i = i->getNext()) environmentVariables.append(i->key, i->data); } // add or override a variable String key(data, sep - data); Map<String, String>::Node* existingNode = environmentVariables.find(key); if(existingNode) existingNode->data = envNode->data; else environmentVariables.append(key, envNode->data); // command.removeFirst(); } else break; } #ifdef _WIN32 struct Executable { static bool fileComplete(const String& searchName, bool testExtensions, String& result) { if(File::exists(searchName)) { result = searchName; return true; } if(testExtensions) { String testPath = searchName; testPath.append(".exe"); if(File::exists(testPath)) { result = testPath; return true; } testPath.setLength(searchName.getLength()); testPath.append(".com"); if(File::exists(testPath)) { result = testPath; return true; } } return false; } static const List<String>& getPathEnv() { static List<String> searchPaths; static bool loaded = false; if(!loaded) { char* pathVar = (char*)alloca(32767); GetEnvironmentVariable("PATH", pathVar, 32767); for(const char* str = pathVar; *str;) { const char* end = strchr(str, ';'); if(end) { if(end > str) searchPaths.append(String(str, end - str)); ++end; str = end; } else { searchPaths.append(String(str, -1)); break; } } loaded = true; } return searchPaths; } static bool resolveSymlink(const String& fileName, String& result) { String cygwinRoot = File::getDirname(File::getDirname(fileName)); result = fileName; bool success = false; for(;;) { File file; if(!file.open(result)) return success; const int len = 12 + MAX_PATH * 2 + 2; char buffer[len]; int i = file.read(buffer, len); if(i < 12 || strncmp(buffer, "!<symlink>\xff\xfe", 12) != 0) return success; i &= ~1; wchar_t* wdest = (wchar_t*)(buffer + 12); wdest[(i - 12) >> 1] = 0; String dest; dest.format(i - 12, "%S", wdest); if(strncmp(dest.getData(), "/usr/bin/", 9) == 0) { result = cygwinRoot; result.append(dest.substr(4)); } else if(dest.getData()[0] == '/') { result = cygwinRoot; result.append(dest); } else { result = File::getDirname(result); result.append('/'); result.append(dest); } success = true; } return false; } static String find(const String& program) { String result = program; bool testExtensions = File::getExtension(program).isEmpty(); // check whether the given path is absolute if(program.getData()[0] == '/' || (program.getLength() > 2 && program.getData()[1] == ':')) { // absolute fileComplete(program, testExtensions, result); } else { // try each search path const List<String>& searchPaths = getPathEnv(); for(const List<String>::Node* i = searchPaths.getFirst(); i; i = i->getNext()) { String testPath = i->data; testPath.append('\\'); testPath.append(program); if(fileComplete(testPath, testExtensions, result)) { if(strncmp(program.getData(), "../", 3) == 0 || strncmp(program.getData(), "..\\", 3) == 0) result = File::simplifyPath(result); break; } } } return result; }