4 #include <QTemporaryDir>
5 #include <QImageReader>
8 #include <QCoreApplication>
9 #include <QJniEnvironment>
11 #endif // Q_OS_ANDROID
14 #define SQLITE_DB_MAGIC "SQLite format 3"
17 static QString
documentName(const QString
&path
)
21 QJniObject urlString
= QJniObject::fromString(path
);
22 QJniObject uri
= QJniObject::callStaticObjectMethod("android/net/Uri",
23 "parse", "(Ljava/lang/String;)Landroid/net/Uri;",
24 urlString
.object
<jstring
>());
26 env
->ExceptionClear();
29 QJniObject context
= QNativeInterface::QAndroidApplication::context();
30 if (!context
.isValid()) {
31 env
->ExceptionClear();
34 QJniObject contentResolver
= context
.callObjectMethod(
35 "getContentResolver", "()Landroid/content/ContentResolver;");
36 if (!contentResolver
.isValid()) {
37 env
->ExceptionClear();
40 QJniObject columnName
= QJniObject::getStaticObjectField
<jstring
>(
41 "android/provider/MediaStore$MediaColumns", "DISPLAY_NAME");
42 if (!columnName
.isValid()) {
43 env
->ExceptionClear();
46 jobjectArray stringArray
= env
->NewObjectArray(
47 1, env
->FindClass("java/lang/String"), 0);
48 env
->SetObjectArrayElement(stringArray
, 0, columnName
.object
<jstring
>());
49 QJniObject cursor
= contentResolver
.callObjectMethod("query",
50 "(Landroid/net/Uri;[Ljava/lang/String;Landroid/os/Bundle;"
51 "Landroid/os/CancellationSignal;)Landroid/database/Cursor;",
52 uri
.object(), stringArray
, 0, 0);
53 if (!cursor
.isValid()) {
54 env
->ExceptionClear();
57 if (!cursor
.callMethod
<jboolean
>("moveToFirst")) {
58 env
->ExceptionClear();
61 QJniObject str
= cursor
.callObjectMethod("getString",
62 "(I)Ljava/lang/String;", 0);
64 env
->ExceptionClear();
68 return str
.toString();
70 #endif // Q_OS_ANDROID
72 int Util::str2int(const char *str
, int len
)
76 for (const char *sp
= str
; sp
< str
+ len
; sp
++) {
78 res
= res
* 10 + *sp
- '0';
86 double Util::niceNum(double x
, bool round
)
92 expv
= (int)floor(log10(x
));
93 f
= x
/ pow(10.0, expv
);
115 return nf
* pow(10.0, expv
);
118 int Util::log2i(unsigned val
)
128 QString
Util::file2name(const QString
&path
)
130 QFileInfo
fi(displayName(path
));
131 return fi
.baseName().replace('_', ' ');
134 QString
Util::displayName(const QString
&path
)
139 // Not an Android URL, return standard filename.
140 if (url
.scheme() != "content") {
142 return fi
.fileName();
143 // Directory browsing URLs. Those can not be translated using the Android
144 // content resolver but we can get the filename from the URL path.
145 } else if (url
.path().startsWith("/tree/")) {
146 QFileInfo
fi(url
.fileName());
147 return fi
.fileName();
148 // Translate all "regular" android URLs using the Android content resolver.
150 return documentName(path
);
153 #endif // Q_OS_ANDROID
156 const QTemporaryDir
&Util::tempDir()
158 static QTemporaryDir dir
;
162 bool Util::isSQLiteDB(const QString
&path
, QString
&errorString
)
165 char magic
[sizeof(SQLITE_DB_MAGIC
)];
167 if (!file
.open(QFile::ReadOnly
)) {
168 errorString
= file
.errorString();
171 if ((file
.read(magic
, sizeof(magic
)) < (qint64
)sizeof(magic
))
172 || memcmp(SQLITE_DB_MAGIC
, magic
, sizeof(SQLITE_DB_MAGIC
))) {
173 errorString
= "Not a SQLite database file";
180 QImage
Util::svg2img(const QString
&path
, qreal ratio
)
182 QImageReader
ir(path
, "svg");
187 ir
.setScaledSize(QSize(s
.width() * ratio
, s
.height() * ratio
));
188 QImage
img(ir
.read());
189 img
.setDevicePixelRatio(ratio
);