blob: 480c1e79b4dce9bdcd0c3c0437048d81f3ecd251 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.url;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.MainDex;
import org.chromium.base.annotations.NativeMethods;
/**
* A java wrapper for Parsed, GURL's internal parsed URI representation.
*/
@MainDex
@JNINamespace("url")
/* package */ class Parsed {
/* package */ final int mSchemeBegin;
/* package */ final int mSchemeLength;
/* package */ final int mUsernameBegin;
/* package */ final int mUsernameLength;
/* package */ final int mPasswordBegin;
/* package */ final int mPasswordLength;
/* package */ final int mHostBegin;
/* package */ final int mHostLength;
/* package */ final int mPortBegin;
/* package */ final int mPortLength;
/* package */ final int mPathBegin;
/* package */ final int mPathLength;
/* package */ final int mQueryBegin;
/* package */ final int mQueryLength;
/* package */ final int mRefBegin;
/* package */ final int mRefLength;
private final Parsed mInnerUrl;
private final boolean mPotentiallyDanglingMarkup;
/* package */ static Parsed createEmpty() {
return new Parsed(0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, false, null);
}
@CalledByNative
private Parsed(int schemeBegin, int schemeLength, int usernameBegin, int usernameLength,
int passwordBegin, int passwordLength, int hostBegin, int hostLength, int portBegin,
int portLength, int pathBegin, int pathLength, int queryBegin, int queryLength,
int refBegin, int refLength, boolean potentiallyDanglingMarkup, Parsed innerUrl) {
mSchemeBegin = schemeBegin;
mSchemeLength = schemeLength;
mUsernameBegin = usernameBegin;
mUsernameLength = usernameLength;
mPasswordBegin = passwordBegin;
mPasswordLength = passwordLength;
mHostBegin = hostBegin;
mHostLength = hostLength;
mPortBegin = portBegin;
mPortLength = portLength;
mPathBegin = pathBegin;
mPathLength = pathLength;
mQueryBegin = queryBegin;
mQueryLength = queryLength;
mRefBegin = refBegin;
mRefLength = refLength;
mPotentiallyDanglingMarkup = potentiallyDanglingMarkup;
mInnerUrl = innerUrl;
}
/* package */ long toNativeParsed() {
long inner = 0;
if (mInnerUrl != null) {
inner = mInnerUrl.toNativeParsed();
}
return ParsedJni.get().createNative(mSchemeBegin, mSchemeLength, mUsernameBegin,
mUsernameLength, mPasswordBegin, mPasswordLength, mHostBegin, mHostLength,
mPortBegin, mPortLength, mPathBegin, mPathLength, mQueryBegin, mQueryLength,
mRefBegin, mRefLength, mPotentiallyDanglingMarkup, inner);
}
/* package */ String serialize() {
StringBuilder builder = new StringBuilder();
builder.append(mSchemeBegin).append(GURL.SERIALIZER_DELIMITER);
builder.append(mSchemeLength).append(GURL.SERIALIZER_DELIMITER);
builder.append(mUsernameBegin).append(GURL.SERIALIZER_DELIMITER);
builder.append(mUsernameLength).append(GURL.SERIALIZER_DELIMITER);
builder.append(mPasswordBegin).append(GURL.SERIALIZER_DELIMITER);
builder.append(mPasswordLength).append(GURL.SERIALIZER_DELIMITER);
builder.append(mHostBegin).append(GURL.SERIALIZER_DELIMITER);
builder.append(mHostLength).append(GURL.SERIALIZER_DELIMITER);
builder.append(mPortBegin).append(GURL.SERIALIZER_DELIMITER);
builder.append(mPortLength).append(GURL.SERIALIZER_DELIMITER);
builder.append(mPathBegin).append(GURL.SERIALIZER_DELIMITER);
builder.append(mPathLength).append(GURL.SERIALIZER_DELIMITER);
builder.append(mQueryBegin).append(GURL.SERIALIZER_DELIMITER);
builder.append(mQueryLength).append(GURL.SERIALIZER_DELIMITER);
builder.append(mRefBegin).append(GURL.SERIALIZER_DELIMITER);
builder.append(mRefLength).append(GURL.SERIALIZER_DELIMITER);
builder.append(mPotentiallyDanglingMarkup).append(GURL.SERIALIZER_DELIMITER);
builder.append(mInnerUrl != null);
if (mInnerUrl != null) {
builder.append(GURL.SERIALIZER_DELIMITER).append(mInnerUrl.serialize());
}
return builder.toString();
}
/* package */ static Parsed deserialize(String[] tokens, int startIndex) {
int schemeBegin = Integer.parseInt(tokens[startIndex++]);
int schemeLength = Integer.parseInt(tokens[startIndex++]);
int usernameBegin = Integer.parseInt(tokens[startIndex++]);
int usernameLength = Integer.parseInt(tokens[startIndex++]);
int passwordBegin = Integer.parseInt(tokens[startIndex++]);
int passwordLength = Integer.parseInt(tokens[startIndex++]);
int hostBegin = Integer.parseInt(tokens[startIndex++]);
int hostLength = Integer.parseInt(tokens[startIndex++]);
int portBegin = Integer.parseInt(tokens[startIndex++]);
int portLength = Integer.parseInt(tokens[startIndex++]);
int pathBegin = Integer.parseInt(tokens[startIndex++]);
int pathLength = Integer.parseInt(tokens[startIndex++]);
int queryBegin = Integer.parseInt(tokens[startIndex++]);
int queryLength = Integer.parseInt(tokens[startIndex++]);
int refBegin = Integer.parseInt(tokens[startIndex++]);
int refLength = Integer.parseInt(tokens[startIndex++]);
boolean potentiallyDanglingMarkup = Boolean.parseBoolean(tokens[startIndex++]);
Parsed innerParsed = null;
if (Boolean.parseBoolean(tokens[startIndex++])) {
innerParsed = Parsed.deserialize(tokens, startIndex);
}
return new Parsed(schemeBegin, schemeLength, usernameBegin, usernameLength, passwordBegin,
passwordLength, hostBegin, hostLength, portBegin, portLength, pathBegin, pathLength,
queryBegin, queryLength, refBegin, refLength, potentiallyDanglingMarkup,
innerParsed);
}
@NativeMethods
interface Natives {
/**
* Create and return the pointer to a native Parsed.
*/
long createNative(int schemeBegin, int schemeLength, int usernameBegin, int usernameLength,
int passwordBegin, int passwordLength, int hostBegin, int hostLength, int portBegin,
int portLength, int pathBegin, int pathLength, int queryBegin, int queryLength,
int refBegin, int refLength, boolean potentiallyDanglingMarkup, long innerUrl);
}
}