diff --git a/qqinterface/src/main/java/com/tencent/mobileqq/transfile/HttpNetReq.java b/qqinterface/src/main/java/com/tencent/mobileqq/transfile/HttpNetReq.java new file mode 100644 index 0000000..9bb451d --- /dev/null +++ b/qqinterface/src/main/java/com/tencent/mobileqq/transfile/HttpNetReq.java @@ -0,0 +1,51 @@ +package com.tencent.mobileqq.transfile; + +public class HttpNetReq extends NetReq { + public static final int HTTP_GET = 0; + public static final int HTTP_POST = 1; + public IFlowDecoder decoder; + public DnsParseCallback mDnsParseCallback; + public boolean mHaveIpConnect; + public String mHostForHttpsVerify; + public int mHttpMethod; + public boolean mIsHostIP; + public boolean mIsHttps; + public boolean mIsPreStructPic; + public boolean mIsSync; + public boolean mNeedIpConnect; + public boolean mNeedNotReferer; + public boolean mNeedRedirectCallback; + public String mReqUrl; + public TimeoutParam mTimeoutParam; + public boolean mUseCmwapConnectionTypeFromDpc; + public String[] mWhiteListContentType; + + public interface DecoderState { + public static final int STATE_END = 2; + public static final int STATE_INIT = 0; + public static final int STATE_RUNNING = 1; + } + + public interface DnsParseCallback { + void end(); + + void start(); + } + + public interface IFlowDecoder { + byte[] decode(byte[] bArr); + + boolean isFinish(); + + void reset(); + } + + public HttpNetReq() { + this.mHttpMethod = 0; + this.mNeedIpConnect = false; + this.mHaveIpConnect = false; + this.mNeedRedirectCallback = false; + this.mUseCmwapConnectionTypeFromDpc = false; + this.mNeedNotReferer = false; + } +} diff --git a/qqinterface/src/main/java/com/tencent/mobileqq/transfile/INetEngineListener.java b/qqinterface/src/main/java/com/tencent/mobileqq/transfile/INetEngineListener.java new file mode 100644 index 0000000..24b0dbb --- /dev/null +++ b/qqinterface/src/main/java/com/tencent/mobileqq/transfile/INetEngineListener.java @@ -0,0 +1,7 @@ +package com.tencent.mobileqq.transfile; + +public interface INetEngineListener { + void onResp(NetResp netResp); + + void onUpdateProgeress(NetReq netReq, long j2, long j3); +} \ No newline at end of file diff --git a/qqinterface/src/main/java/com/tencent/mobileqq/transfile/NetFailedListener.java b/qqinterface/src/main/java/com/tencent/mobileqq/transfile/NetFailedListener.java new file mode 100644 index 0000000..f05f2e6 --- /dev/null +++ b/qqinterface/src/main/java/com/tencent/mobileqq/transfile/NetFailedListener.java @@ -0,0 +1,5 @@ +package com.tencent.mobileqq.transfile; + +public interface NetFailedListener { + void onFailed(NetResp netResp); +} diff --git a/qqinterface/src/main/java/com/tencent/mobileqq/transfile/NetReq.java b/qqinterface/src/main/java/com/tencent/mobileqq/transfile/NetReq.java new file mode 100644 index 0000000..b6a7a42 --- /dev/null +++ b/qqinterface/src/main/java/com/tencent/mobileqq/transfile/NetReq.java @@ -0,0 +1,89 @@ +package com.tencent.mobileqq.transfile; + +import java.io.OutputStream; +import java.util.HashMap; +import java.util.List; + +public class NetReq { + public static final int PRIOTY_HIGH = 0; + public static final int PRIOTY_LOW = 2; + public static final int PRIOTY_NORMAL = 1; + public boolean bAcceptNegativeContentLength; + public int mBusiProtoType; + public INetEngineListener mCallback; + public boolean mCanPrintUrl; + public int mContinuErrorLimit; + public int mContinueConnReusedErrorLimit; + public long mDelayTime; + public long mEndDownOffset; + public long mExcuteTimeLimit; + public NetFailedListener mFailedListener; + public int mFileType; + public HostParseToIp mHostParseToIp; + public boolean mIsNetChgAsError; + public boolean mIsRenameInEngine; + public String mKey; + public String mMsgId; + public String mOutPath; + public OutputStream mOutStream; + public int mPrioty; + public Object mPrivate; + public HashMap mReqProperties; + public NetResp mResp; + public byte[] mSendData; + public List mServerList; + public long mStartDownOffset; + public boolean mSupportBreakResume; + public String mTempPath; + public boolean mUseByteArrayPool; + public boolean mUseRaf; + private Object mUserData; + public long taskStartTime; + + public interface HostParseToIp { + List getIpByHost(String str); + } + + public NetReq() { + this.mStartDownOffset = 0L; + this.mEndDownOffset = 0L; + this.mIsRenameInEngine = true; + this.mDelayTime = 0L; + this.mExcuteTimeLimit = 480000L; + this.mContinuErrorLimit = 8; + this.mContinueConnReusedErrorLimit = 5; + this.mIsNetChgAsError = false; + this.mPrioty = 1; + this.mResp = null; + this.mCanPrintUrl = true; + this.bAcceptNegativeContentLength = true; + this.mUseByteArrayPool = false; + this.mKey = null; + this.taskStartTime = -1L; + this.mReqProperties = new HashMap<>(); + } + + public long getTaskCostTime() { + return System.currentTimeMillis() - taskStartTime; + } + + public synchronized Object getUserData() { + return mUserData; + } + + public boolean isWriteToFile() { + return this.mOutPath != null; + } + + public boolean isWriteToStream() { + return this.mOutStream != null; + } + + public boolean saveRecvDataInTransLayer() { + return this.mOutPath != null || this.mOutStream != null; + } + + public synchronized void setUserData(Object obj) { + this.mUserData = obj; + } +} diff --git a/qqinterface/src/main/java/com/tencent/mobileqq/transfile/NetResp.java b/qqinterface/src/main/java/com/tencent/mobileqq/transfile/NetResp.java new file mode 100644 index 0000000..98da9ec --- /dev/null +++ b/qqinterface/src/main/java/com/tencent/mobileqq/transfile/NetResp.java @@ -0,0 +1,72 @@ +package com.tencent.mobileqq.transfile; + +import java.util.HashMap; + +public class NetResp { + public static final String KEY_FIRST_USE_IP = "firstserverip"; + public static final String KEY_RAW_REQ_HTTP_HEADER = "param_reqHeader"; + public static final String KEY_RAW_RESP_HTTP_HEADER = "param_rspHeader"; + public static final String KEY_REASON = "netresp_param_reason"; + public static final String KEY_USE_SERVER_IP = "serverip"; + public static final String KEY_USE_URL = "param_url"; + public static final int RESULT_DOWNLOADING = 3; + public static final int RESULT_FAIL = 1; + public static final int RESULT_NOT_SET = 2; + public static final int RESULT_OK = 0; + public long inQueueCost; + public long mConsumeTime; + public int mErrCode; + public String mErrDesc; + public int mHttpCode; + public long mLastReqStartTime; + public int mRedirectCount; + public long mRedirectTime; + public NetReq mReq; + public byte[] mRespData; + public HashMap mRespProperties; + public int mResult; + public long mTotalBlockLen; + public long mTotalFileLen; + public int mTryTime; + public long mWrittenBlockLen; + public long reqCost; + + public NetResp(NetReq netReq) { + this.mResult = 2; + this.mTotalFileLen = 0L; + this.mTotalBlockLen = 0L; + this.mWrittenBlockLen = 0L; + this.mConsumeTime = 0L; + this.mTryTime = 0; + this.mRespProperties = new HashMap<>(); + this.mRedirectCount = 0; + this.mRedirectTime = 0L; + this.reqCost = 0L; + this.inQueueCost = 0L; + this.mReq = netReq; + this.mLastReqStartTime = System.currentTimeMillis(); + } + + public void reset() { + this.mResult = 2; + this.mErrCode = 0; + this.mErrDesc = ""; + this.mHttpCode = 0; + this.mTotalFileLen = 0L; + this.mTotalBlockLen = 0L; + this.mWrittenBlockLen = 0L; + this.mConsumeTime = 0L; + this.mTryTime = 0; + this.mRespData = null; + this.mRespProperties.clear(); + } + + public void setResult(int i2, int i3, String str, HashMap hashMap) { + this.mResult = i2; + this.mErrCode = i3; + this.mErrDesc = str; + if (hashMap != null) { + this.mRespProperties.putAll(hashMap); + } + } +} diff --git a/qqinterface/src/main/java/com/tencent/mobileqq/transfile/TimeoutParam.java b/qqinterface/src/main/java/com/tencent/mobileqq/transfile/TimeoutParam.java new file mode 100644 index 0000000..de6d057 --- /dev/null +++ b/qqinterface/src/main/java/com/tencent/mobileqq/transfile/TimeoutParam.java @@ -0,0 +1,72 @@ +package com.tencent.mobileqq.transfile; + +public class TimeoutParam { + public static final int TIMEOUT_STEP = 2000; + private int connectTimeoutBias; + public int connectTimeoutFor2G; + public int connectTimeoutFor3G; + public int connectTimeoutForWifi; + public int readTimeoutFor2G; + public int readTimeoutFor3G; + public int readTimeoutForWifi; + + public TimeoutParam() { + this.readTimeoutFor2G = 40000; + this.readTimeoutFor3G = 30000; + this.readTimeoutForWifi = 20000; + this.connectTimeoutFor2G = 20000; + this.connectTimeoutFor3G = 15000; + this.connectTimeoutForWifi = 10000; + this.connectTimeoutBias = 0; + } + + public void adjustConnectTimeout(int i2) { + + this.connectTimeoutBias = i2 * 2000; + } + + public int getConnectTimeout(int i2) { + if (i2 != 1) { + if (i2 == 3) { + return this.connectTimeoutFor3G + this.connectTimeoutBias; + } + if (i2 != 4 && i2 != 5) { + return this.connectTimeoutFor2G + this.connectTimeoutBias; + } + } + return this.connectTimeoutForWifi + this.connectTimeoutBias; + } + + public int getReadTimeout(int i2) { + if (i2 != 1) { + if (i2 == 3) { + return this.readTimeoutFor3G; + } + if (i2 != 4 && i2 != 5) { + return this.readTimeoutFor2G; + } + } + return this.readTimeoutForWifi; + } + + //public TimeoutParam clone() { + // IPatchRedirector iPatchRedirector = $redirector_; + // return (iPatchRedirector == null || !iPatchRedirector.hasPatch((short) 4)) ? new TimeoutParam(this) : (TimeoutParam) iPatchRedirector.redirect((short) 4, (Object) this); + //} + + TimeoutParam(TimeoutParam timeoutParam) { + this.readTimeoutFor2G = 40000; + this.readTimeoutFor3G = 30000; + this.readTimeoutForWifi = 20000; + this.connectTimeoutFor2G = 20000; + this.connectTimeoutFor3G = 15000; + this.connectTimeoutForWifi = 10000; + this.connectTimeoutBias = 0; + this.readTimeoutFor2G = timeoutParam.readTimeoutFor2G; + this.readTimeoutFor3G = timeoutParam.readTimeoutFor3G; + this.readTimeoutForWifi = timeoutParam.readTimeoutForWifi; + this.connectTimeoutFor2G = timeoutParam.connectTimeoutFor2G; + this.connectTimeoutFor3G = timeoutParam.connectTimeoutFor3G; + this.connectTimeoutForWifi = timeoutParam.connectTimeoutForWifi; + } +} diff --git a/qqinterface/src/main/java/com/tencent/mobileqq/transfile/api/IHttpEngineService.java b/qqinterface/src/main/java/com/tencent/mobileqq/transfile/api/IHttpEngineService.java new file mode 100644 index 0000000..759bca9 --- /dev/null +++ b/qqinterface/src/main/java/com/tencent/mobileqq/transfile/api/IHttpEngineService.java @@ -0,0 +1,15 @@ +package com.tencent.mobileqq.transfile.api; + +import com.tencent.mobileqq.transfile.NetReq; +import com.tencent.mobileqq.transfile.NetResp; + +import mqq.app.api.IRuntimeService; + +@Deprecated +public interface IHttpEngineService extends IRuntimeService { + void cancelReq(NetReq netReq); + + void sendReq(NetReq netReq); + + NetResp sendReqSync(NetReq netReq); +} diff --git a/qqinterface/src/main/java/com/tencent/mobileqq/transfile/api/IOldHttpEngineProcessor.java b/qqinterface/src/main/java/com/tencent/mobileqq/transfile/api/IOldHttpEngineProcessor.java new file mode 100644 index 0000000..820ce10 --- /dev/null +++ b/qqinterface/src/main/java/com/tencent/mobileqq/transfile/api/IOldHttpEngineProcessor.java @@ -0,0 +1,14 @@ +package com.tencent.mobileqq.transfile.api; + +import com.tencent.mobileqq.qroute.QRouteApi; +import com.tencent.mobileqq.transfile.NetReq; + +public interface IOldHttpEngineProcessor extends QRouteApi { + //void cancelMsg(HttpMsg httpMsg); + + void cancelReq(NetReq netReq); + + //int sendMsg(HttpMsg httpMsg); + + void sendReq(NetReq netReq); +} \ No newline at end of file diff --git a/qqinterface/src/main/java/mqq/manager/TicketManager.java b/qqinterface/src/main/java/mqq/manager/TicketManager.java index e0fe625..64af138 100644 --- a/qqinterface/src/main/java/mqq/manager/TicketManager.java +++ b/qqinterface/src/main/java/mqq/manager/TicketManager.java @@ -3,6 +3,7 @@ package mqq.manager; import android.content.Context; import oicq.wlogin_sdk.request.Ticket; +import oicq.wlogin_sdk.request.WtTicketPromise; public interface TicketManager extends Manager { String getA2(String uin); @@ -15,6 +16,8 @@ public interface TicketManager extends Manager { String getPskey(String uin, String domain); + Ticket getPskey(String str, long j2, String[] strArr, WtTicketPromise wtTicketPromise); + String getPt4Token(String uin, String domain); String getSkey(String uin); // 假的Skey diff --git a/qqinterface/src/main/java/oicq/wlogin_sdk/request/WtTicketPromise.java b/qqinterface/src/main/java/oicq/wlogin_sdk/request/WtTicketPromise.java new file mode 100644 index 0000000..4021694 --- /dev/null +++ b/qqinterface/src/main/java/oicq/wlogin_sdk/request/WtTicketPromise.java @@ -0,0 +1,11 @@ +package oicq.wlogin_sdk.request; + +import oicq.wlogin_sdk.tools.ErrMsg; + +public interface WtTicketPromise { + void Done(Ticket ticket); + + void Failed(ErrMsg errMsg); + + void Timeout(ErrMsg errMsg); +} \ No newline at end of file diff --git a/qqinterface/src/main/java/oicq/wlogin_sdk/tools/ErrMsg.java b/qqinterface/src/main/java/oicq/wlogin_sdk/tools/ErrMsg.java new file mode 100644 index 0000000..9eaa6aa --- /dev/null +++ b/qqinterface/src/main/java/oicq/wlogin_sdk/tools/ErrMsg.java @@ -0,0 +1,122 @@ +package oicq.wlogin_sdk.tools; + +import android.os.Parcel; +import android.os.Parcelable; + +public class ErrMsg implements Cloneable, Parcelable { + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { // from class: oicq.wlogin_sdk.tools.ErrMsg.1 + @Override // android.os.Parcelable.Creator + public ErrMsg createFromParcel(Parcel parcel) { + return new ErrMsg(parcel); + } + + @Override // android.os.Parcelable.Creator + public ErrMsg[] newArray(int i2) { + return new ErrMsg[i2]; + } + }; + private String message; + private String otherinfo; + private String title; + private int type; + private int version; + + public ErrMsg() { + this.version = 0; + this.type = 0; + //this.title = InternationMsg.a(InternationMsg.MSG_TYPE.MSG_0); + //this.message = InternationMsg.a(InternationMsg.MSG_TYPE.MSG_1); + this.otherinfo = ""; + } + + public ErrMsg(int i2, int i3, String str, String str2, String str3) { + this.version = i2; + this.type = i3; + this.title = str; + this.message = str2; + this.otherinfo = str3; + } + + private ErrMsg(Parcel parcel) { + readFromParcel(parcel); + } + + public Object clone() { + return super.clone(); + } + + @Override // android.os.Parcelable + public int describeContents() { + return 0; + } + + public String getMessage() { + return this.message; + } + + public String getOtherinfo() { + return this.otherinfo; + } + + public String getTitle() { + return this.title; + } + + public int getType() { + return this.type; + } + + public int getVersion() { + return this.version; + } + + public void readFromParcel(Parcel parcel) { + this.version = parcel.readInt(); + this.type = parcel.readInt(); + this.title = parcel.readString(); + this.message = parcel.readString(); + this.otherinfo = parcel.readString(); + } + + public void setMessage(String str) { + this.message = str; + } + + public void setOtherinfo(String str) { + this.otherinfo = str; + } + + public void setTitle(String str) { + this.title = str; + } + + public void setType(int i2) { + this.type = i2; + } + + public void setVersion(int i2) { + this.version = i2; + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("("); + int i2 = this.version; + sb.append(i2 < 0 ? Integer.valueOf(i2) : Integer.toString(i2)); + sb.append(")("); + int i3 = this.type; + sb.append(i3 < 0 ? Integer.valueOf(i3) : Integer.toString(i3)); + sb.append(")["); + String sb2 = sb.toString(); + return sb2 + this.title + "]" + this.message + "[" + this.otherinfo + "]"; + } + + @Override // android.os.Parcelable + public void writeToParcel(Parcel parcel, int i2) { + parcel.writeInt(this.version); + parcel.writeInt(this.type); + parcel.writeString(this.title); + parcel.writeString(this.message); + parcel.writeString(this.otherinfo); + } +} diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/entries/pb/WeiyunCommonMessage.java b/xposed/src/main/java/moe/fuqiuluo/qqinterface/entries/pb/WeiyunCommonMessage.java new file mode 100644 index 0000000..300ba08 --- /dev/null +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/entries/pb/WeiyunCommonMessage.java @@ -0,0 +1,255 @@ +package moe.fuqiuluo.qqinterface.entries.pb; + +import com.tencent.mobileqq.pb.ByteStringMicro; +import com.tencent.mobileqq.pb.MessageMicro; +import com.tencent.mobileqq.pb.PBBoolField; +import com.tencent.mobileqq.pb.PBBytesField; +import com.tencent.mobileqq.pb.PBField; +import com.tencent.mobileqq.pb.PBInt32Field; +import com.tencent.mobileqq.pb.PBInt64Field; +import com.tencent.mobileqq.pb.PBRepeatField; +import com.tencent.mobileqq.pb.PBRepeatMessageField; +import com.tencent.mobileqq.pb.PBStringField; +import com.tencent.mobileqq.pb.PBUInt32Field; +import com.tencent.mobileqq.pb.PBUInt64Field; + +public class WeiyunCommonMessage { + public static class MsgHead extends MessageMicro { + public static final int ReqMsg = 1; + public static final int RspMsg = 2; + + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 24, 32, 40, 48, 56, 66, 72, 80, 90, 112, 120, 808, 818, 826, 888, 896}, new String[]{"uin", "seq", "type", "cmd", "appid", "version", "nettype", "clientip", "encrypt", "keytype", "encryptkey", "major_version", "minor_version", "retcode", "retmsg", "promptmsg", "total_space", "used_space"}, new Object[]{0L, 0, 0, 0, 0, 0, 0, "", 0, 0, ByteStringMicro.EMPTY, 0, 0, 0, "", "", 0L, 0L}, MsgHead.class); + + public final PBInt64Field uin = PBField.initInt64(0); + public final PBUInt32Field seq = PBField.initUInt32(0); + public final PBUInt32Field type = PBField.initUInt32(0); + public final PBUInt32Field cmd = PBField.initUInt32(0); + public final PBInt32Field appid = PBField.initInt32(0); + public final PBInt32Field version = PBField.initInt32(0); + public final PBInt32Field nettype = PBField.initInt32(0); + public final PBStringField clientip = PBField.initString(""); + public final PBInt32Field encrypt = PBField.initInt32(0); + public final PBInt32Field keytype = PBField.initInt32(0); + public final PBBytesField encryptkey = PBField.initBytes(ByteStringMicro.EMPTY); + public final PBInt32Field major_version = PBField.initInt32(0); + public final PBInt32Field minor_version = PBField.initInt32(0); + public final PBInt32Field retcode = PBField.initInt32(0); + public final PBStringField retmsg = PBField.initString(""); + public final PBStringField promptmsg = PBField.initString(""); + public final PBUInt64Field total_space = PBField.initUInt64(0); + public final PBUInt64Field used_space = PBField.initUInt64(0); + } + + public static class AddRichMediaCollectionMsgReq extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10, 18, 26, 32}, new String[]{"comm_info", "summary", "content", "need_share_url"}, new Object[]{null, null, null, Boolean.FALSE}, AddRichMediaCollectionMsgReq.class); + public CollectCommonInfo comm_info = new CollectCommonInfo(); + public RichMediaSummary summary = new RichMediaSummary(); + public RichMediaContent content = new RichMediaContent(); + public final PBBoolField need_share_url = PBField.initBool(false); + } + + public static class RichMediaContent extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__; + public RichMedia rich_media = new RichMedia(); + public final PBBytesField raw_data = PBField.initBytes(ByteStringMicro.EMPTY); + public final PBRepeatField biz_data_list = PBField.initRepeat(PBBytesField.__repeatHelper__); + public final PBRepeatMessageField pic_list = PBField.initRepeatMessage(PicInfo.class); + public final PBRepeatMessageField file_list = PBField.initRepeatMessage(FileInfo.class); + + static { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + __fieldMap__ = MessageMicro.initFieldMap(new int[]{10, 18, 26, 34, 42}, new String[]{"rich_media", "raw_data", "biz_data_list", "pic_list", "file_list"}, new Object[]{null, byteStringMicro, byteStringMicro, null, null}, RichMediaContent.class); + } + } + + public static class FileInfo extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__; + public final PBUInt32Field category; + public final PBBytesField md5; + public final PBBytesField sha1; + public final PBUInt32Field src = PBField.initUInt32(0); + public final PBUInt64Field uid = PBField.initUInt64(0); + public final PBUInt32Field bid = PBField.initUInt32(0); + public final PBStringField fid = PBField.initString(""); + public final PBStringField name = PBField.initString(""); + public final PBUInt64Field size = PBField.initUInt64(0); + + static { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 24, 34, 42, 48, 58, 66, 72}, new String[]{"src", "uid", "bid", "fid", "name", "size", "md5", "sha1", "category"}, new Object[]{0, 0L, 0, "", "", 0L, byteStringMicro, byteStringMicro, 0}, FileInfo.class); + } + + public FileInfo() { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + this.md5 = PBField.initBytes(byteStringMicro); + this.sha1 = PBField.initBytes(byteStringMicro); + this.category = PBField.initUInt32(0); + } + } + + public static class RichMedia extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10}, new String[]{"sections"}, new Object[]{null}, RichMedia.class); + public final PBRepeatMessageField
sections = PBField.initRepeatMessage(Section.class); + } + + public static class Section extends MessageMicro
{ + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10}, new String[]{"items"}, new Object[]{null}, Section.class); + public final PBRepeatMessageField items = PBField.initRepeatMessage(Item.class); + } + + public static class Item extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 18, 26, 34}, new String[]{"item_type", "parag", "anchor", "pic_info"}, new Object[]{0, null, null, null}, Item.class); + public final PBUInt32Field item_type = PBField.initUInt32(0); + public Paragraph parag = new Paragraph(); + public Anchor anchor = new Anchor(); + public PicInfo pic_info = new PicInfo(); + } + + public static class Anchor extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10, 18}, new String[]{"url", "desc"}, new Object[]{"", ""}, Anchor.class); + public final PBStringField url = PBField.initString(""); + public final PBStringField desc = PBField.initString(""); + } + + public static class Paragraph extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10, 18}, new String[]{"content", "style"}, new Object[]{"", null}, Paragraph.class); + public final PBStringField content = PBField.initString(""); + public Style style = new Style(); + } + + public static class Style extends MessageMicro