summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Nelissen <marcone@google.com>2010-02-10 09:56:05 -0800
committerMarco Nelissen <marcone@google.com>2010-02-10 10:36:02 -0800
commitb45b0845a6db32848ad08ac1037ef67a68ec2d39 (patch)
tree3f75d6ea3cbd61fc759c42b731f56d495ef81dba
parentbfcb22a207499c7ecd4aef9bea2ac778d8be8fc8 (diff)
downloadframeworks_base-b45b0845a6db32848ad08ac1037ef67a68ec2d39.zip
frameworks_base-b45b0845a6db32848ad08ac1037ef67a68ec2d39.tar.gz
frameworks_base-b45b0845a6db32848ad08ac1037ef67a68ec2d39.tar.bz2
Do autodetection even if no locale was specified, and use the
detected encoding if it is unambiguous.
-rw-r--r--media/libmedia/MediaScannerClient.cpp74
1 files changed, 39 insertions, 35 deletions
diff --git a/media/libmedia/MediaScannerClient.cpp b/media/libmedia/MediaScannerClient.cpp
index bd3596e..bb3717f 100644
--- a/media/libmedia/MediaScannerClient.cpp
+++ b/media/libmedia/MediaScannerClient.cpp
@@ -64,28 +64,26 @@ void MediaScannerClient::beginFile()
bool MediaScannerClient::addStringTag(const char* name, const char* value)
{
- if (mLocaleEncoding != kEncodingNone) {
- // don't bother caching strings that are all ASCII.
- // call handleStringTag directly instead.
- // check to see if value (which should be utf8) has any non-ASCII characters
- bool nonAscii = false;
- const char* chp = value;
- char ch;
- while ((ch = *chp++)) {
- if (ch & 0x80) {
- nonAscii = true;
- break;
- }
+ // don't bother caching strings that are all ASCII.
+ // call handleStringTag directly instead.
+ // check to see if value (which should be utf8) has any non-ASCII characters
+ bool nonAscii = false;
+ const char* chp = value;
+ char ch;
+ while ((ch = *chp++)) {
+ if (ch & 0x80) {
+ nonAscii = true;
+ break;
}
+ }
- if (nonAscii) {
- // save the strings for later so they can be used for native encoding detection
- mNames->push_back(name);
- mValues->push_back(value);
- return true;
- }
- // else fall through
+ if (nonAscii) {
+ // save the strings for later so they can be used for native encoding detection
+ mNames->push_back(name);
+ mValues->push_back(value);
+ return true;
}
+ // else fall through
// autodetection is not necessary, so no need to cache the values
// pass directly to the client instead
@@ -198,23 +196,29 @@ void MediaScannerClient::convertValues(uint32_t encoding)
void MediaScannerClient::endFile()
{
- if (mLocaleEncoding != kEncodingNone) {
- int size = mNames->size();
- uint32_t encoding = kEncodingAll;
-
- // compute a bit mask containing all possible encodings
- for (int i = 0; i < mNames->size(); i++)
- encoding &= possibleEncodings(mValues->getEntry(i));
-
- // if the locale encoding matches, then assume we have a native encoding.
- if (encoding & mLocaleEncoding)
- convertValues(mLocaleEncoding);
+ int size = mNames->size();
+ uint32_t encoding = kEncodingAll;
+
+ // compute a bit mask containing all possible encodings
+ for (int i = 0; i < mNames->size(); i++)
+ encoding &= possibleEncodings(mValues->getEntry(i));
+
+ // If one of the possible encodings matches the locale encoding, use that.
+ // Otherwise, if there is only one possible encoding, use that.
+ if (encoding & mLocaleEncoding)
+ convertValues(mLocaleEncoding);
+ else if ((encoding & (encoding - 1)) == 0)
+ convertValues(encoding);
+ else {
+ // TODO: try harder to disambiguate the encoding, perhaps by looking at
+ // other files by same artist, or even the user's entire collection.
+ // For now, fall through and insert the strings as they are.
+ }
- // finally, push all name/value pairs to the client
- for (int i = 0; i < mNames->size(); i++) {
- if (!handleStringTag(mNames->getEntry(i), mValues->getEntry(i)))
- break;
- }
+ // finally, push all name/value pairs to the client
+ for (int i = 0; i < mNames->size(); i++) {
+ if (!handleStringTag(mNames->getEntry(i), mValues->getEntry(i)))
+ break;
}
// else addStringTag() has done all the work so we have nothing to do