am 9f03d4f9: Merge "Revert "use utf8_length() instead of local function, isValidUtf8()""

# Via Gerrit Code Review
* commit '9f03d4f921fab5757a791653891ce73c2d006e20':
  Revert "use utf8_length() instead of local function, isValidUtf8()"
This commit is contained in:
Marco Nelissen
2013-02-12 11:14:48 -08:00
committed by Android Git Automerger

View File

@ -19,7 +19,6 @@
#define LOG_TAG "MediaScannerJNI"
#include <utils/Log.h>
#include <utils/threads.h>
#include <utils/Unicode.h>
#include <media/mediascanner.h>
#include <media/stagefright/StagefrightMediaScanner.h>
@ -57,6 +56,53 @@ static status_t checkAndClearExceptionFromCallback(JNIEnv* env, const char* meth
return OK;
}
// stolen from dalvik/vm/checkJni.cpp
static bool isValidUtf8(const char* bytes) {
while (*bytes != '\0') {
unsigned char utf8 = *(bytes++);
// Switch on the high four bits.
switch (utf8 >> 4) {
case 0x00:
case 0x01:
case 0x02:
case 0x03:
case 0x04:
case 0x05:
case 0x06:
case 0x07:
// Bit pattern 0xxx. No need for any extra bytes.
break;
case 0x08:
case 0x09:
case 0x0a:
case 0x0b:
case 0x0f:
/*
* Bit pattern 10xx or 1111, which are illegal start bytes.
* Note: 1111 is valid for normal UTF-8, but not the
* modified UTF-8 used here.
*/
return false;
case 0x0e:
// Bit pattern 1110, so there are two additional bytes.
utf8 = *(bytes++);
if ((utf8 & 0xc0) != 0x80) {
return false;
}
// Fall through to take care of the final byte.
case 0x0c:
case 0x0d:
// Bit pattern 110x, so there is one additional byte.
utf8 = *(bytes++);
if ((utf8 & 0xc0) != 0x80) {
return false;
}
break;
}
}
return true;
}
class MyMediaScannerClient : public MediaScannerClient
{
public:
@ -124,11 +170,8 @@ public:
mEnv->ExceptionClear();
return NO_MEMORY;
}
// Check if the value is valid UTF-8 string and replace
// any un-printable characters with '?' when it's not.
char *cleaned = NULL;
if (utf8_length(value) == -1) {
if (!isValidUtf8(value)) {
cleaned = strdup(value);
char *chp = cleaned;
char ch;