static PortInfo getPortInfo(const FileName & filename){ PortInfo info; const auto parts = split(filename.getFile(),':'); info.portName = parts.empty() ? "" : parts[0]; #ifdef _WIN32 info.internalPortName = "\\\\.\\" + info.portName; #else info.internalPortName = info.portName; #endif info.baudRate = 9600; info.bytesize = serial::eightbits; info.stopbits = serial::stopbits_one; info.flowcontrol = serial::flowcontrol_none; info.parity = serial::parity_none; for(auto& s:parts) // std::cout << ">"<<s<<"\n"; if(parts.size()>1){ info.baudRate = StringUtils::toNumber<uint32_t>(parts[1]); if(parts.size()>2){ switch(StringUtils::toNumber<uint32_t>(parts[2])){ case 5: info.bytesize = serial::fivebits; break; case 6: info.bytesize = serial::sixbits; break; case 7: info.bytesize = serial::sevenbits; break; case 0:// empty -> default case 8: info.bytesize = serial::eightbits; break; default: throw std::invalid_argument("SerialProvider: invalid bytesize :"+filename.toString()); } if(parts.size()<=3 || parts[3].empty() || parts[3]=="n"){ info.parity = serial::parity_none; }else if(parts[3]=="o"){ info.parity = serial::parity_odd; }else if(parts[3]=="e"){ info.parity = serial::parity_even; }else{ throw std::invalid_argument("SerialProvider: invalid parity :"+filename.toString()); } if(parts.size()<=4 || parts[4].empty() || parts[4]=="1"){ info.stopbits = serial::stopbits_one; }else if(parts[4]=="2"){ info.stopbits = serial::stopbits_two; }else{ throw std::invalid_argument("SerialProvider: invalid stopbits :"+filename.toString()); } if(parts.size()<=5 || parts[5].empty() || parts[5]=="n"){ info.flowcontrol = serial::flowcontrol_none; }else if(parts[5]=="h"){ info.flowcontrol = serial::flowcontrol_hardware; }else if(parts[5]=="s"){ info.flowcontrol = serial::flowcontrol_software; }else{ throw std::invalid_argument("SerialProvider: invalid flowcontrol :"+filename.toString()); } } } return info; }
AbstractFSProvider::status_t ZIPProvider::ZIPHandle::writeFile(const FileName & file, const std::vector<uint8_t> & data, bool overwrite) { if (file.getFile().empty()) { return FAILURE; } bool replace = false; int index = zip_name_locate(handle, file.getPath().c_str(), 0); if (index != -1) { // File already exists. if (!overwrite) { return FAILURE; } else { replace = true; } } // Store data temporary because libzip writes data not until zip_close. tempStore.emplace_back(data); zip_source * source = zip_source_buffer(handle, tempStore.back().data(), static_cast<off_t>(tempStore.back().size()), 0); if (source == nullptr) { WARN(zip_strerror(handle)); zip_source_free(source); tempStore.pop_back(); return FAILURE; } int newIndex; if (replace) { newIndex = zip_replace(handle, index, source); } else { newIndex = zip_add(handle, file.getPath().c_str(), source); } if (newIndex == -1) { WARN(zip_strerror(handle)); zip_source_free(source); tempStore.pop_back(); return FAILURE; } dataWritten = true; return OK; }
AbstractFSProvider::status_t ZIPProvider::ZIPHandle::readFile(const FileName & file, std::vector<uint8_t> & data) { if (file.getFile().empty()) { return FAILURE; } const size_t size = fileSize(file); if (size == 0) { return FAILURE; } zip_file * fileHandle = zip_fopen(handle, file.getPath().c_str(), 0); if (fileHandle == nullptr) { WARN(zip_strerror(handle)); return FAILURE; } data.resize(size); const int bytesRead = zip_fread(fileHandle, data.data(), data.size()); if (bytesRead == -1) { WARN(zip_strerror(handle)); zip_fclose(fileHandle); return FAILURE; } if (static_cast<size_t>(bytesRead) != size) { WARN("Sizes differ during read."); zip_fclose(fileHandle); return FAILURE; } if (zip_fclose(fileHandle) == -1) { WARN(zip_strerror(handle)); return FAILURE; } return OK; }