static jint android_content_XmlBlock_nativeGetAttributeIndex(JNIEnv* env, jobject clazz, jlong token, jstring ns, jstring name) { ResXMLParser* st = reinterpret_cast<ResXMLParser*>(token); if (st == NULL || name == NULL) { jniThrowNullPointerException(env, NULL); return 0; } const char16_t* ns16 = NULL; jsize nsLen = 0; if (ns) { ns16 = env->GetStringChars(ns, NULL); nsLen = env->GetStringLength(ns); } const char16_t* name16 = env->GetStringChars(name, NULL); jsize nameLen = env->GetStringLength(name); jint idx = static_cast<jint>(st->indexOfAttribute(ns16, nsLen, name16, nameLen)); if (ns) { env->ReleaseStringChars(ns, ns16); } env->ReleaseStringChars(name, name16); return idx; }
static jint android_content_XmlBlock_nativeGetAttributeIndex(JNIEnv* env, jobject clazz, jint token, jstring ns, jstring name) { ResXMLParser* st = (ResXMLParser*)token; if (st == NULL || name == NULL) { doThrow(env, "java/lang/NullPointerException"); return 0; } const char16_t* ns16 = NULL; jsize nsLen = 0; if (ns) { ns16 = env->GetStringChars(ns, NULL); nsLen = env->GetStringLength(ns); } const char16_t* name16 = env->GetStringChars(name, NULL); jsize nameLen = env->GetStringLength(name); jint idx = (jint)st->indexOfAttribute(ns16, nsLen, name16, nameLen); if (ns) { env->ReleaseStringChars(ns, ns16); } env->ReleaseStringChars(name, name16); return idx; }
static jint android_content_XmlBlock_nativeNext(JNIEnv* env, jobject clazz, jint token) { ResXMLParser* st = (ResXMLParser*)token; if (st == NULL) { return ResXMLParser::END_DOCUMENT; } do { jint code = (jint)st->next(); switch (code) { case ResXMLParser::START_TAG: return 2; case ResXMLParser::END_TAG: return 3; case ResXMLParser::TEXT: return 4; case ResXMLParser::START_DOCUMENT: return 0; case ResXMLParser::END_DOCUMENT: return 1; case ResXMLParser::BAD_DOCUMENT: goto bad; } } while (true); bad: doThrow(env, "org/xmlpull/v1/XmlPullParserException", "Corrupt XML binary file"); return ResXMLParser::BAD_DOCUMENT; }
static jint android_content_XmlBlock_nativeNext(JNIEnv* env, jobject clazz, jlong token) { ResXMLParser* st = reinterpret_cast<ResXMLParser*>(token); if (st == NULL) { return ResXMLParser::END_DOCUMENT; } do { ResXMLParser::event_code_t code = st->next(); switch (code) { case ResXMLParser::START_TAG: return 2; case ResXMLParser::END_TAG: return 3; case ResXMLParser::TEXT: return 4; case ResXMLParser::START_DOCUMENT: return 0; case ResXMLParser::END_DOCUMENT: return 1; case ResXMLParser::BAD_DOCUMENT: goto bad; default: break; } } while (true); bad: jniThrowException(env, "org/xmlpull/v1/XmlPullParserException", "Corrupt XML binary file"); return ResXMLParser::BAD_DOCUMENT; }
static jint android_content_XmlBlock_nativeGetText(JNIEnv* env, jobject clazz, jint token) { ResXMLParser* st = (ResXMLParser*)token; if (st == NULL) { return -1; } return (jint)st->getTextID(); }
static jint android_content_XmlBlock_nativeGetText(JNIEnv* env, jobject clazz, jlong token) { ResXMLParser* st = reinterpret_cast<ResXMLParser*>(token); if (st == NULL) { return -1; } return static_cast<jint>(st->getTextID()); }
static jint android_content_XmlBlock_nativeGetAttributeStringValue(JNIEnv* env, jobject clazz, jlong token, jint idx) { ResXMLParser* st = reinterpret_cast<ResXMLParser*>(token); if (st == NULL) { jniThrowNullPointerException(env, NULL); return 0; } return static_cast<jint>(st->getAttributeValueStringID(idx)); }
static jint android_content_XmlBlock_nativeGetLineNumber(JNIEnv* env, jobject clazz, jlong token) { ResXMLParser* st = reinterpret_cast<ResXMLParser*>(token); if (st == NULL) { jniThrowNullPointerException(env, NULL); return 0; } return static_cast<jint>(st->getLineNumber()); }
static jint android_content_XmlBlock_nativeGetAttributeData(JNIEnv* env, jobject clazz, jint token, jint idx) { ResXMLParser* st = (ResXMLParser*)token; if (st == NULL) { jniThrowNullPointerException(env, NULL); return 0; } return (jint)st->getAttributeData(idx); }
static jint android_content_XmlBlock_nativeGetAttributeStringValue(JNIEnv* env, jobject clazz, jint token, jint idx) { ResXMLParser* st = (ResXMLParser*)token; if (st == NULL) { doThrow(env, "java/lang/NullPointerException"); return 0; } return (jint)st->getAttributeValueStringID(idx); }
static jint android_content_XmlBlock_nativeGetLineNumber(JNIEnv* env, jobject clazz, jint token) { ResXMLParser* st = (ResXMLParser*)token; if (st == NULL) { doThrow(env, "java/lang/NullPointerException"); return 0; } return (jint)st->getLineNumber(); }
static jint android_content_XmlBlock_nativeGetClassAttribute(JNIEnv* env, jobject clazz, jint token) { ResXMLParser* st = (ResXMLParser*)token; if (st == NULL) { doThrow(env, "java/lang/NullPointerException"); return 0; } ssize_t idx = st->indexOfClass(); return idx >= 0 ? (jint)st->getAttributeValueStringID(idx) : -1; }
static jint android_content_XmlBlock_nativeGetClassAttribute(JNIEnv* env, jobject clazz, jlong token) { ResXMLParser* st = reinterpret_cast<ResXMLParser*>(token); if (st == NULL) { jniThrowNullPointerException(env, NULL); return 0; } ssize_t idx = st->indexOfClass(); return idx >= 0 ? static_cast<jint>(st->getAttributeValueStringID(idx)) : -1; }
static jint android_content_XmlBlock_nativeGetIdAttribute(JNIEnv* env, jobject clazz, jint token) { ResXMLParser* st = (ResXMLParser*)token; if (st == NULL) { jniThrowNullPointerException(env, NULL); return 0; } ssize_t idx = st->indexOfID(); return idx >= 0 ? (jint)st->getAttributeValueStringID(idx) : -1; }
static jint android_content_XmlBlock_nativeCreateParseState(JNIEnv* env, jobject clazz, jint token) { ResXMLTree* osb = (ResXMLTree*)token; if (osb == NULL) { doThrow(env, "java/lang/NullPointerException"); return 0; } ResXMLParser* st = new ResXMLParser(*osb); if (st == NULL) { doThrow(env, "java/lang/OutOfMemoryError"); return 0; } st->restart(); return (jint)st; }
static jlong android_content_XmlBlock_nativeCreateParseState(JNIEnv* env, jobject clazz, jlong token) { ResXMLTree* osb = reinterpret_cast<ResXMLTree*>(token); if (osb == NULL) { jniThrowNullPointerException(env, NULL); return 0; } ResXMLParser* st = new ResXMLParser(*osb); if (st == NULL) { jniThrowException(env, "java/lang/OutOfMemoryError", NULL); return 0; } st->restart(); return reinterpret_cast<jlong>(st); }
static jint android_content_XmlBlock_nativeGetStyleAttribute(JNIEnv* env, jobject clazz, jint token) { ResXMLParser* st = (ResXMLParser*)token; if (st == NULL) { doThrow(env, "java/lang/NullPointerException"); return 0; } ssize_t idx = st->indexOfStyle(); if (idx < 0) { return 0; } Res_value value; if (st->getAttributeValue(idx, &value) < 0) { return 0; } return value.dataType == value.TYPE_REFERENCE || value.dataType == value.TYPE_ATTRIBUTE ? value.data : 0; }
static jint android_content_XmlBlock_nativeGetStyleAttribute(JNIEnv* env, jobject clazz, jlong token) { ResXMLParser* st = reinterpret_cast<ResXMLParser*>(token); if (st == NULL) { jniThrowNullPointerException(env, NULL); return 0; } ssize_t idx = st->indexOfStyle(); if (idx < 0) { return 0; } Res_value value; if (st->getAttributeValue(idx, &value) < 0) { return 0; } return value.dataType == value.TYPE_REFERENCE || value.dataType == value.TYPE_ATTRIBUTE ? value.data : 0; }
static void android_content_res_XResources_rewriteXmlReferencesNative(JNIEnv* env, jclass clazz, jint parserPtr, jobject origRes, jobject repRes) { ResXMLParser* parser = (ResXMLParser*)parserPtr; const ResXMLTree& mTree = parser->mTree; uint32_t* mResIds = (uint32_t*)mTree.mResIds; ResXMLTree_attrExt* tag; int attrCount; if (parser == NULL) return; do { switch (parser->next()) { case ResXMLParser::START_TAG: tag = (ResXMLTree_attrExt*)parser->mCurExt; attrCount = dtohs(tag->attributeCount); for (int idx = 0; idx < attrCount; idx++) { ResXMLTree_attribute* attr = (ResXMLTree_attribute*) (((const uint8_t*)tag) + dtohs(tag->attributeStart) + (dtohs(tag->attributeSize)*idx)); // find resource IDs for attribute names int32_t attrNameID = parser->getAttributeNameID(idx); // only replace attribute name IDs for app packages if (attrNameID >= 0 && (size_t)attrNameID < mTree.mNumResIds && dtohl(mResIds[attrNameID]) >= 0x7f000000) { size_t attNameLen; const char16_t* attrName = mTree.mStrings.stringAt(attrNameID, &attNameLen); jint attrResID = env->CallStaticIntMethod(xresourcesClass, xresourcesTranslateAttrId, env->NewString((const jchar*)attrName, attNameLen), origRes); if (env->ExceptionCheck()) goto leave; mResIds[attrNameID] = htodl(attrResID); } // find original resource IDs for reference values (app packages only) if (attr->typedValue.dataType != Res_value::TYPE_REFERENCE) continue; jint oldValue = dtohl(attr->typedValue.data); if (oldValue < 0x7f000000) continue; jint newValue = env->CallStaticIntMethod(xresourcesClass, xresourcesTranslateResId, oldValue, origRes, repRes); if (env->ExceptionCheck()) goto leave; if (newValue != oldValue) attr->typedValue.data = htodl(newValue); } continue; case ResXMLParser::END_DOCUMENT: case ResXMLParser::BAD_DOCUMENT: goto leave; default: continue; } } while (true); leave: parser->restart(); }