I am using epubreader.cross NuGet package for parsing .epub files.
My Code:
string fileName = "SampleEPUB.epub";
var assembly = typeof(MainPage).GetTypeInfo().Assembly;
Stream stream = assembly.GetManifestResourceStream($"{assembly.GetName().Name}.{fileName}");
EpubBook epubBook = EpubReader.ReadBook(stream);
For some .epb files I am getting below exceptions:
System.AggregateException: 'One or more errors occurred. (Incorrect EPUB navigation page target: normal is incorrect value for page target type.)'
System.AggregateException: 'One or more errors occurred. (Incorrect EPUB spine: TOC is missing)'
All my .epub files are able to view using Adobe Digital Editions 4.5.11. So what will be the reason behind this issue?
I have added a sample project here having .epub files for the reference.
That project seems to be deprecated. However , it looks like that the root repo is active though . You could check the github project site .
You need to download the dll file manually from this link , choose the for .NET Standard one . Then add the dll file into forms project , just right click Dependencies - Add project reference - Browse - Select the download file
I'm trying to load a video from a network using UNC paths thanks to Qt 5.5 QMediaPlayer.
The code snippet is the following one:
projectDirectory = QFileDialog::getExistingDirectory (this,
tr ("Choose project folder (sensor + video data"),
QDir::homePath(), QFileDialog::ShowDirsOnly);
QDir dir(projectDirectory);
QStringList test = dir.entryList();
qDebug () << projectDirectory << "contains:" << endl << test;
mediaPlayer.setMedia(QUrl::fromLocalFile(projectDirectory+"/video.mov"));
The code snippet works for a local file but doesn't work when the path begins with //.
Example output:
"//m4800/Partage/111" contains:
(".", "..", "HandBrake.txt", "sensors.csv", "video.mov")
DirectShowPlayerService::doSetUrlSource: Unresolved error code 80004005
Note that I am able to read the sensors.csv text file and that video.mov has the same permissions.
Instead of
mediaPlayer.setMedia(QUrl::fromLocalFile(projectDirectory+"/video.mov"));
remove ::fromLocalFile and try
mediaPlayer.setMedia(QUrl(projectDirectory+"/video.mov"));
This seems to solve the problem. In the codebase I am working on, we have added a check for "//" at the start of the raw path before creating the URL to check it is a UNC path and still use the fromLocalFile if it is not.
The DirectShow library does not appear to correctly support UNC paths.
You either have to copy the file to a local temp folder or load the file into a QByteArray and stream from there.
Neither is a great solution and Microsoft depreciated DirectShow in favour of Media Foundation (which has limited playback support at this time).
I have a .NET WebApi project with two files, both of which have been marked as embedded resources and are deployed with the application. The files are also both in the same directory in the deployed application:
./xsl/transform.xslt
./xsl/schema.xsd
The xslt file needs to load the xsd file via the document() function:
<xsl:template match="*[not(local-name() = document('schema.xsd')//xs:element/#name)]" />
<xsl:template match="#*[not(local-name() = document('schema.xsd')//xs:attribute/#name)]" />
Unfortunately, I'm getting an exception at runtime that indicates that the relative path being resolved is the program files directory for IIS and not the directory where transform.xslt is located:
{
"Message": "An error has occurred.",
"ExceptionMessage": "An error occurred while loading document 'schema.xsd'. See InnerException for a complete description of the error.",
"ExceptionType": "System.Xml.Xsl.XslTransformException",
"StackTrace": "<ommitted>"
"InnerException": {
"Message": "An error has occurred.",
"ExceptionMessage": "Could not find file 'C:\\Program Files (x86)\\IIS Express\\schema.xsd'.",
"ExceptionType": "System.IO.FileNotFoundException",
"StackTrace": "<omitted>"
}
}
I don't want to use an absolute path here because I don't want to become overly dependent on the environment the application is deployed into. Is there anyway to force the relative path source from the same directory that transform.xslt is deployed into at runtime?
For reference, the absolute path to the xslt file at runtime was:
C:\\MyFolder\\MyCode\\MyProject\\Web\\bin\\xsl\\transform.xslt
EDIT:
As requested, the following is (roughly) the code that is used to load the xslt from the manifest resource stream and run the transform. This code is unwrapped from several different custom packages to boil it down into core libraries, so don't worry about the stream management. I promise the real code is much safer:
XmlReader input = this.GetInput();
Stream ouput = new MemoryStream(4096);
Stream stream = typeof(ClassUsingTransform).Assembly.GetManifestResourceStream("transform.xslt");
MemoryStream mStream = new MemoryStream(stream.ToByteArray());
var navigator = new XPathDocument(mStream).CreateNavigator();
XslCompiledTransform processor = new XslCompiledTransform();
processor.Load(navigator, XsltSettings.TrustedXslt, new XmlUrlResolver());
processor.Transform(input, new XsltArgumentList(), output);
The XmlUrlResolver could not be unwrapped into builtins easily, but the type used inherited from XmlUrlResolver and didn't appear to modify any of the builtin settings. Most of the work done in the derived classes seemed to focus on performance optimizations. If anyone thinks the implementation here is important, I can try to unwrap that class a bit better.
The XsltArgumentList used was also a derived type, but the argument list is empty as far as I can tell.
I made a pretty simple application with Qt Creator on Ubuntu 12.04. The application reads an xml-file and shows a couple of images. But when I try to start the application by double clicking the icon on a different machine (running Lubuntu), the images are not shown, and the xml-file is not read. The application does work properly when it is started from the command line by typing ./App.
Why does it behave like this and how do I fix it?
edit: The method that reads the xml:
QDomDocument doc("document");
QString path = "datastorage.xml"; // xml is in same directory as the executable
QFile xmlFile(path);
if (!xmlFile.open(QIODevice::ReadOnly))
throw QString("Error with XML: Could not open file " + path);
if (!doc.setContent(&xmlFile)) {
xmlFile.close();
throw QString("Error with XML: Could not set QDomDocument content from " + path);
}
xmlFile.close();
QDomElement root = doc.documentElement();
return root;
Simply you are using relative paths to read files and those paths are always relative to "working directory". If you're launching your app from console, and all required files are within app directory then everything works. When launching from desktop working directory may be different. Just prepend QCoreApplication::applicationDirPath() to all paths you're using.
I'm using QSettings to store some data as ini file in Windows.
I want to see the ini file, but I don't know what is the location of the ini file.
This is my code:
QSettings *set = new QSettings(QSettings::IniFormat, QSettings::UserScope, "bbb", "aaa");
set->setValue("size", size());
set->setValue("pos", pos());
Where do I have to look? Or may be I miss the code which write it to the file?
When does the QSettings write its values?
To print out the exact location of your settings file use method fileName method of QSettings class.
QSettings settings("folderName", "fileName");
qDebug() << settings.fileName();
Console output looks then like:
/home/user/.config/folderName/fileName.conf
I think you'll find everything you're looking for here : http://doc.qt.io/archives/qt-4.7/qsettings.html
It's plateform specific, see under :
Platform-Specific Notes
Locations Where Application Settings Are Stored
You can store Settings in files as well :
QSettings settings("/home/petra/misc/myapp.ini",
QSettings::IniFormat);
QSettings save location changes to the QSettings.Scope enum. QSettings save to the Local scope by default. On Linux, I found my local settings in:
~/.config/CompanyName/ApplicationName.conf
If you create a QSettings without giving any specific path, the ini file will be located in the application path.
QSettings Settings("myapp.ini", QSettings::IniFormat);
Settings.setValue("Test", "data");
//...
qDebug() << QApplication::applicationDirPath();
Be careful though : the application path might change : for instance, if you are developping your app with Qt Creator, in debug mode, the application path is in the /debug subfolder.
If you are running it in release mode, the application path is in the /release subfolder.
And when your application is deployed, by default, the application path is in the same folder as the executable (at least for Windows).
Check out the QStandardPaths class, it links to multiple standard paths including configuration on all supported platforms. https://doc.qt.io/qt-5/qstandardpaths.html
QT >= 5.5:
QString path = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
QT < 5.5:
QString path = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation);
There are paths for config files in shared config directories, application data directories, and more.
In linux you can use this snippet or insert this lines into your main code for find location of your file with python.
from PyQt5.QtCore import QSettings
settings = QSettings("Organization Name", "App name")
print(QSettings.fileName(settings))
It should return an output like this.
/$HOME/.config/Organization Name/App name.conf
Source
in windows path is like below:
C:\Users\user_name\AppData\Roaming\bbb
On Mac OSX, I found the file under at ~/Library/Preferences
The QSettings class provides persistent platform-independent application settings.
Users normally expect an application to remember its settings (window sizes and positions, options, etc.) across sessions. This information is often stored in the system registry on Windows, and in XML preferences files on Mac OS X. On Unix systems, in the absence of a standard, many applications (including the KDE applications) use INI text files
http://doc.qt.io/archives/qt-4.7/qsettings.html
On Windows without providing an ini filename, you'll find the data in the registry.
Using this code snippet:
int red = color.red();
int green = color.green();
int blue = color.blue();
QSettings settings("Joe", "SettingsDemo");
qDebug() << settings.fileName();
settings.beginGroup("ButtonColor");
settings.setValue("button1r", red);
settings.setValue("button1g", green);
settings.setValue("button1b", blue);
settings.endGroup();
After running this code, you'll see the output:
"\\HKEY_CURRENT_USER\\Software\\Joe\\SettingsDemo"
Now, opening the regedit tool and following the path list you got: 1