package tl; import static ru.denull.mtproto.CryptoUtils.CRC32; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.*; import java.util.zip.GZIPInputStream; import ru.denull.mtproto.Base64; public class TL { private static final String TAG = "TL"; private static int lastNum = 0, prevNum = 0; // Read method (boxed) public static TLObject read(ByteBuffer buffer) throws Exception { int number = buffer.getInt(); prevNum = lastNum; lastNum = number; switch (number) { case 0x3072cfa1: { // autounpack gzipped container GzipPacked pack = new GzipPacked(buffer); try { GZIPInputStream stream = new GZIPInputStream(new ByteArrayInputStream(pack.packed_data)); ByteArrayOutputStream output = new ByteArrayOutputStream(pack.packed_data.length * 2); byte[] temp = new byte[1024]; while (stream.available() > 0) { int count = stream.read(temp); if (count <= 0) break; output.write(temp, 0, count); } stream.close(); ByteBuffer buf = ByteBuffer.wrap(output.toByteArray()); buf.order(ByteOrder.LITTLE_ENDIAN); return read(buf); } catch (IOException e) { e.printStackTrace(); } } case 0x60469778: return new tl.ReqPq(buffer); case 0x05162463: return new tl.ResPQ(buffer); case 0xd712e4be: return new tl.ReqDHParams(buffer); case 0x83c95aec: return new tl.PQInnerData(buffer); case 0x79cb045d: return new tl.ServerDHParamsFail(buffer); case 0xd0e8075c: return new tl.ServerDHParamsOk(buffer); case 0xb5890dba: return new tl.ServerDHInnerData(buffer); case 0xf5045f1f: return new tl.SetClientDHParams(buffer); case 0x6643b654: return new tl.ClientDHInnerData(buffer); case 0x3bcbf734: return new tl.DhGenOk(buffer); case 0x46dc1fb9: return new tl.DhGenRetry(buffer); case 0xa69dae02: return new tl.DhGenFail(buffer); case 0xf35c6d01: return new tl.RpcResult(buffer); case 0x2144ca19: return new tl.RpcError(buffer); case 0x58e4a740: return new tl.RpcDropAnswer(buffer); case 0x5e2ad36e: return new tl.RpcAnswerUnknown(buffer); case 0xcd78e586: return new tl.RpcAnswerDroppedRunning(buffer); case 0xa43ad8b7: return new tl.RpcAnswerDropped(buffer); case 0xb921bd04: return new tl.GetFutureSalts(buffer); case 0x0949d9dc: return new tl.FutureSalt(buffer); case 0xae500895: return new tl.FutureSalts(buffer); case 0x7abe77ec: return new tl.Ping(buffer); case 0x347773c5: return new tl.Pong(buffer); case 0xe22045fc: return new tl.DestroySessionOk(buffer); case 0x62d350c9: return new tl.DestroySessionNone(buffer); case 0x9ec20908: return new tl.NewSessionCreated(buffer); case 0x73f1f8dc: return new tl.MsgContainer(buffer); case 0xe06046b2: return new tl.MsgCopy(buffer); case 0x9299359f: return new tl.HttpWait(buffer); case 0x62d6b459: return new tl.MsgsAck(buffer); case 0xa7eff811: return new tl.BadMsgNotification(buffer); case 0xedab447b: return new tl.BadServerSalt(buffer); case 0xda69fb52: return new tl.MsgsStateReq(buffer); case 0x04deb57d: return new tl.MsgsStateInfo(buffer); case 0x8cc0d131: return new tl.MsgsAllInfo(buffer); case 0x276d3ec6: return new tl.MsgDetailedInfo(buffer); case 0x809db6df: return new tl.MsgNewDetailedInfo(buffer); case 0x7d861a08: return new tl.MsgResendReq(buffer); case 0xbc799737: return new tl.BoolFalse(buffer); case 0x997275b5: return new tl.BoolTrue(buffer); case 0xc4b9f9bb: return new tl.Error(buffer); case 0x56730bcc: return new tl.Null(buffer); case 0x7f3b18ea: return new tl.InputPeerEmpty(buffer); case 0x7da07ec9: return new tl.InputPeerSelf(buffer); case 0x1023dbe8: return new tl.InputPeerContact(buffer); case 0x9b447325: return new tl.InputPeerForeign(buffer); case 0x179be863: return new tl.InputPeerChat(buffer); case 0xb98886cf: return new tl.InputUserEmpty(buffer); case 0xf7c1b13f: return new tl.InputUserSelf(buffer); case 0x86e94f65: return new tl.InputUserContact(buffer); case 0x655e74ff: return new tl.InputUserForeign(buffer); case 0xf392b7f4: return new tl.InputPhoneContact(buffer); case 0xf52ff27f: return new tl.InputFile(buffer); case 0x9664f57f: return new tl.InputMediaEmpty(buffer); case 0x2dc53a7d: return new tl.InputMediaUploadedPhoto(buffer); case 0x8f2ab2ec: return new tl.InputMediaPhoto(buffer); case 0xf9c44144: return new tl.InputMediaGeoPoint(buffer); case 0xa6e45987: return new tl.InputMediaContact(buffer); case 0x4847d92a: return new tl.InputMediaUploadedVideo(buffer); case 0xe628a145: return new tl.InputMediaUploadedThumbVideo(buffer); case 0x7f023ae6: return new tl.InputMediaVideo(buffer); case 0x1ca48f57: return new tl.InputChatPhotoEmpty(buffer); case 0x94254732: return new tl.InputChatUploadedPhoto(buffer); case 0xb2e1bf08: return new tl.InputChatPhoto(buffer); case 0xe4c123d6: return new tl.InputGeoPointEmpty(buffer); case 0xf3b7acc9: return new tl.InputGeoPoint(buffer); case 0x1cd7bf0d: return new tl.InputPhotoEmpty(buffer); case 0xfb95c6c4: return new tl.InputPhoto(buffer); case 0x5508ec75: return new tl.InputVideoEmpty(buffer); case 0xee579652: return new tl.InputVideo(buffer); case 0x14637196: return new tl.InputFileLocation(buffer); case 0x3d0364ec: return new tl.InputVideoFileLocation(buffer); case 0xade6b004: return new tl.InputPhotoCropAuto(buffer); case 0xd9915325: return new tl.InputPhotoCrop(buffer); case 0x770656a8: return new tl.InputAppEvent(buffer); case 0x9db1bc6d: return new tl.PeerUser(buffer); case 0xbad0e5bb: return new tl.PeerChat(buffer); case 0xaa963b05: return new tl.storage.FileUnknown(buffer); case 0x7efe0e: return new tl.storage.FileJpeg(buffer); case 0xcae1aadf: return new tl.storage.FileGif(buffer); case 0xa4f63c0: return new tl.storage.FilePng(buffer); case 0x528a0677: return new tl.storage.FileMp3(buffer); case 0x4b09ebbc: return new tl.storage.FileMov(buffer); case 0x40bc6f52: return new tl.storage.FilePartial(buffer); case 0xb3cea0e4: return new tl.storage.FileMp4(buffer); case 0x1081464c: return new tl.storage.FileWebp(buffer); case 0x7c596b46: return new tl.FileLocationUnavailable(buffer); case 0x53d69076: return new tl.FileLocation(buffer); case 0x200250ba: return new tl.UserEmpty(buffer); case 0x720535ec: return new tl.UserSelf(buffer); case 0xf2fb8319: return new tl.UserContact(buffer); case 0x22e8ceb0: return new tl.UserRequest(buffer); case 0x5214c89d: return new tl.UserForeign(buffer); case 0xb29ad7cc: return new tl.UserDeleted(buffer); case 0x4f11bae1: return new tl.UserProfilePhotoEmpty(buffer); case 0xd559d8c8: return new tl.UserProfilePhoto(buffer); case 0x9d05049: return new tl.UserStatusEmpty(buffer); case 0xedb93949: return new tl.UserStatusOnline(buffer); case 0x8c703f: return new tl.UserStatusOffline(buffer); case 0x9ba2d800: return new tl.ChatEmpty(buffer); case 0x6e9c9bc7: return new tl.Chat(buffer); case 0xfb0ccc41: return new tl.ChatForbidden(buffer); case 0x630e61be: return new tl.ChatFull(buffer); case 0xc8d7493e: return new tl.ChatParticipant(buffer); case 0xfd2bb8a: return new tl.ChatParticipantsForbidden(buffer); case 0x7841b415: return new tl.ChatParticipants(buffer); case 0x37c1011c: return new tl.ChatPhotoEmpty(buffer); case 0x6153276a: return new tl.ChatPhoto(buffer); case 0x83e5de54: return new tl.MessageEmpty(buffer); case 0x22eb6aba: return new tl.Message(buffer); case 0x5f46804: return new tl.MessageForwarded(buffer); case 0x9f8d60bb: return new tl.MessageService(buffer); case 0x3ded6320: return new tl.MessageMediaEmpty(buffer); case 0xc8c45a2a: return new tl.MessageMediaPhoto(buffer); case 0xa2d24290: return new tl.MessageMediaVideo(buffer); case 0x56e0d474: return new tl.MessageMediaGeo(buffer); case 0x5e7d2f39: return new tl.MessageMediaContact(buffer); case 0x29632a36: return new tl.MessageMediaUnsupported(buffer); case 0xb6aef7b0: return new tl.MessageActionEmpty(buffer); case 0xa6638b9a: return new tl.MessageActionChatCreate(buffer); case 0xb5a1ce5a: return new tl.MessageActionChatEditTitle(buffer); case 0x7fcb13a8: return new tl.MessageActionChatEditPhoto(buffer); case 0x95e3fbef: return new tl.MessageActionChatDeletePhoto(buffer); case 0x5e3cfc4b: return new tl.MessageActionChatAddUser(buffer); case 0xb2ae9b0c: return new tl.MessageActionChatDeleteUser(buffer); case 0x214a8cdf: return new tl.Dialog(buffer); case 0x2331b22d: return new tl.PhotoEmpty(buffer); case 0x22b56751: return new tl.Photo(buffer); case 0xe17e23c: return new tl.PhotoSizeEmpty(buffer); case 0x77bfb61b: return new tl.PhotoSize(buffer); case 0xe9a734fa: return new tl.PhotoCachedSize(buffer); case 0xc10658a8: return new tl.VideoEmpty(buffer); case 0x5a04a49f: return new tl.Video(buffer); case 0x1117dd5f: return new tl.GeoPointEmpty(buffer); case 0x2049d70c: return new tl.GeoPoint(buffer); case 0xe300cc3b: return new tl.auth.CheckedPhone(buffer); case 0x2215bcbd: return new tl.auth.SentCode(buffer); case 0xf6b673a4: return new tl.auth.Authorization(buffer); case 0xdf969c2d: return new tl.auth.ExportedAuthorization(buffer); case 0xb8bc5b0c: return new tl.InputNotifyPeer(buffer); case 0x193b4417: return new tl.InputNotifyUsers(buffer); case 0x4a95e84e: return new tl.InputNotifyChats(buffer); case 0xa429b886: return new tl.InputNotifyAll(buffer); case 0xf03064d8: return new tl.InputPeerNotifyEventsEmpty(buffer); case 0xe86a2c74: return new tl.InputPeerNotifyEventsAll(buffer); case 0x46a2ce98: return new tl.InputPeerNotifySettings(buffer); case 0xadd53cb3: return new tl.PeerNotifyEventsEmpty(buffer); case 0x6d1ded88: return new tl.PeerNotifyEventsAll(buffer); case 0x70a68512: return new tl.PeerNotifySettingsEmpty(buffer); case 0x8d5e11ee: return new tl.PeerNotifySettings(buffer); case 0xccb03657: return new tl.WallPaper(buffer); case 0x771095da: return new tl.UserFull(buffer); case 0xf911c994: return new tl.Contact(buffer); case 0xd0028438: return new tl.ImportedContact(buffer); case 0x561bc879: return new tl.ContactBlocked(buffer); case 0xea879f95: return new tl.ContactFound(buffer); case 0x3de191a1: return new tl.ContactSuggested(buffer); case 0xaa77b873: return new tl.ContactStatus(buffer); case 0x3631cf4c: return new tl.ChatLocated(buffer); case 0x133421f8: return new tl.contacts.ForeignLinkUnknown(buffer); case 0xa7801f47: return new tl.contacts.ForeignLinkRequested(buffer); case 0x1bea8ce1: return new tl.contacts.ForeignLinkMutual(buffer); case 0xd22a1c60: return new tl.contacts.MyLinkEmpty(buffer); case 0x6c69efee: return new tl.contacts.MyLinkRequested(buffer); case 0xc240ebd9: return new tl.contacts.MyLinkContact(buffer); case 0xeccea3f5: return new tl.contacts.Link(buffer); case 0x6f8b8cb2: return new tl.contacts.Contacts(buffer); case 0xb74ba9d2: return new tl.contacts.ContactsNotModified(buffer); case 0xd1cd0a4c: return new tl.contacts.ImportedContacts(buffer); case 0x1c138d15: return new tl.contacts.Blocked(buffer); case 0x900802a1: return new tl.contacts.BlockedSlice(buffer); case 0x566000e: return new tl.contacts.Found(buffer); case 0x5649dcc5: return new tl.contacts.Suggested(buffer); case 0x15ba6c40: return new tl.messages.Dialogs(buffer); case 0x71e094f3: return new tl.messages.DialogsSlice(buffer); case 0x8c718e87: return new tl.messages.Messages(buffer); case 0xb446ae3: return new tl.messages.MessagesSlice(buffer); case 0x3f4e0648: return new tl.messages.MessageEmpty(buffer); case 0xff90c417: return new tl.messages.Message(buffer); case 0x969478bb: return new tl.messages.StatedMessages(buffer); case 0xd07ae726: return new tl.messages.StatedMessage(buffer); case 0xd1f4d35c: return new tl.messages.SentMessage(buffer); case 0x40e9002a: return new tl.messages.Chat(buffer); case 0x8150cbd8: return new tl.messages.Chats(buffer); case 0xe5d7d19c: return new tl.messages.ChatFull(buffer); case 0xb7de36f2: return new tl.messages.AffectedHistory(buffer); case 0x57e2f66c: return new tl.InputMessagesFilterEmpty(buffer); case 0x9609a51c: return new tl.InputMessagesFilterPhotos(buffer); case 0x9fc00e65: return new tl.InputMessagesFilterVideo(buffer); case 0x56e9f0e4: return new tl.InputMessagesFilterPhotoVideo(buffer); case 0x13abdb3: return new tl.UpdateNewMessage(buffer); case 0x4e90bfd6: return new tl.UpdateMessageID(buffer); case 0xc6649e31: return new tl.UpdateReadMessages(buffer); case 0xa92bfe26: return new tl.UpdateDeleteMessages(buffer); case 0xd15de04d: return new tl.UpdateRestoreMessages(buffer); case 0x6baa8508: return new tl.UpdateUserTyping(buffer); case 0x3c46cfe6: return new tl.UpdateChatUserTyping(buffer); case 0x7761198: return new tl.UpdateChatParticipants(buffer); case 0x1bfbd823: return new tl.UpdateUserStatus(buffer); case 0xda22d9ad: return new tl.UpdateUserName(buffer); case 0x95313b0c: return new tl.UpdateUserPhoto(buffer); case 0x2575bbb9: return new tl.UpdateContactRegistered(buffer); case 0x51a48a9a: return new tl.UpdateContactLink(buffer); case 0x6f690963: return new tl.UpdateActivation(buffer); case 0x8f06529a: return new tl.UpdateNewAuthorization(buffer); case 0xa56c2a3e: return new tl.updates.State(buffer); case 0x5d75a138: return new tl.updates.DifferenceEmpty(buffer); case 0xf49ca0: return new tl.updates.Difference(buffer); case 0xa8fb1981: return new tl.updates.DifferenceSlice(buffer); case 0xe317af7e: return new tl.UpdatesTooLong(buffer); case 0xd3f45784: return new tl.UpdateShortMessage(buffer); case 0x2b2fbd4e: return new tl.UpdateShortChatMessage(buffer); case 0x78d4dec1: return new tl.UpdateShort(buffer); case 0x725b04c3: return new tl.UpdatesCombined(buffer); case 0x74ae4240: return new tl.Updates(buffer); case 0x8dca6aa5: return new tl.photos.Photos(buffer); case 0x15051f54: return new tl.photos.PhotosSlice(buffer); case 0x20212ca8: return new tl.photos.Photo(buffer); case 0x96a18d5: return new tl.upload.File(buffer); case 0x2ec2a43c: return new tl.DcOption(buffer); case 0x232d5905: return new tl.Config(buffer); case 0x8e1a1775: return new tl.NearestDc(buffer); case 0x18cb9f78: return new tl.help.InviteText(buffer); case 0x3e74f5c6: return new tl.messages.StatedMessagesLinks(buffer); case 0xa9af2881: return new tl.messages.StatedMessageLink(buffer); case 0xe9db4a3f: return new tl.messages.SentMessageLink(buffer); case 0x74d456fa: return new tl.InputGeoChat(buffer); case 0x4d8ddec8: return new tl.InputNotifyGeoChatPeer(buffer); case 0x75eaea5a: return new tl.GeoChat(buffer); case 0x60311a9b: return new tl.GeoChatMessageEmpty(buffer); case 0x4505f8e1: return new tl.GeoChatMessage(buffer); case 0xd34fa24e: return new tl.GeoChatMessageService(buffer); case 0x17b1578b: return new tl.geochats.StatedMessage(buffer); case 0x48feb267: return new tl.geochats.Located(buffer); case 0xd1526db1: return new tl.geochats.Messages(buffer); case 0xbc5863e8: return new tl.geochats.MessagesSlice(buffer); case 0x6f038ebc: return new tl.MessageActionGeoChatCreate(buffer); case 0xc7d53de: return new tl.MessageActionGeoChatCheckin(buffer); case 0x5a68e3f7: return new tl.UpdateNewGeoChatMessage(buffer); case 0x63117f24: return new tl.WallPaperSolid(buffer); case 0x12bcbd9a: return new tl.UpdateNewEncryptedMessage(buffer); case 0x1710f156: return new tl.UpdateEncryptedChatTyping(buffer); case 0xb4a2e88d: return new tl.UpdateEncryption(buffer); case 0x38fe25b7: return new tl.UpdateEncryptedMessagesRead(buffer); case 0xab7ec0a0: return new tl.EncryptedChatEmpty(buffer); case 0x3bf703dc: return new tl.EncryptedChatWaiting(buffer); case 0xfda9a7b7: return new tl.EncryptedChatRequested(buffer); case 0x6601d14f: return new tl.EncryptedChat(buffer); case 0x13d6dd27: return new tl.EncryptedChatDiscarded(buffer); case 0xf141b5e1: return new tl.InputEncryptedChat(buffer); case 0xc21f497e: return new tl.EncryptedFileEmpty(buffer); case 0x4a70994c: return new tl.EncryptedFile(buffer); case 0x1837c364: return new tl.InputEncryptedFileEmpty(buffer); case 0x64bd0306: return new tl.InputEncryptedFileUploaded(buffer); case 0x5a17b5e5: return new tl.InputEncryptedFile(buffer); case 0xf5235d55: return new tl.InputEncryptedFileLocation(buffer); case 0xed18c118: return new tl.EncryptedMessage(buffer); case 0x23734b06: return new tl.EncryptedMessageService(buffer); case 0x99a438cf: return new tl.DecryptedMessageLayer(buffer); case 0x1f814f1f: return new tl.DecryptedMessage(buffer); case 0xaa48327d: return new tl.DecryptedMessageService(buffer); case 0x89f5c4a: return new tl.DecryptedMessageMediaEmpty(buffer); case 0x32798a8c: return new tl.DecryptedMessageMediaPhoto(buffer); case 0x4cee6ef3: return new tl.DecryptedMessageMediaVideo(buffer); case 0x35480a59: return new tl.DecryptedMessageMediaGeoPoint(buffer); case 0x588a0a97: return new tl.DecryptedMessageMediaContact(buffer); case 0xa1733aec: return new tl.DecryptedMessageActionSetMessageTTL(buffer); case 0xc0e24635: return new tl.messages.DhConfigNotModified(buffer); case 0x2c221edd: return new tl.messages.DhConfig(buffer); case 0x560f8935: return new tl.messages.SentEncryptedMessage(buffer); case 0x9493ff32: return new tl.messages.SentEncryptedFile(buffer); case 0xfa4f0bb5: return new tl.InputFileBig(buffer); case 0x2dc173c8: return new tl.InputEncryptedFileBigUploaded(buffer); case 0xe7512126: return new tl.DestroySession(buffer); case 0xcb9f372d: return new tl.InvokeAfterMsg(buffer); case 0x3dc4b4f0: return new tl.InvokeAfterMsgs(buffer); case 0x53835315: return new tl.InvokeWithLayer1(buffer); case 0x3fc12e08: return new tl.InitConnection(buffer); case 0x6fe51dfb: return new tl.auth.CheckPhone(buffer); case 0x768d5f4d: return new tl.auth.SendCode(buffer); case 0x3c51564: return new tl.auth.SendCall(buffer); case 0x1b067634: return new tl.auth.SignUp(buffer); case 0xbcd51581: return new tl.auth.SignIn(buffer); case 0x5717da40: return new tl.auth.LogOut(buffer); case 0x9fab0d1a: return new tl.auth.ResetAuthorizations(buffer); case 0x771c1d97: return new tl.auth.SendInvites(buffer); case 0xe5bfffcd: return new tl.auth.ExportAuthorization(buffer); case 0xe3ef9613: return new tl.auth.ImportAuthorization(buffer); case 0x446c712c: return new tl.account.RegisterDevice(buffer); case 0x65c55b40: return new tl.account.UnregisterDevice(buffer); case 0x84be5b93: return new tl.account.UpdateNotifySettings(buffer); case 0x12b3ad31: return new tl.account.GetNotifySettings(buffer); case 0xdb7e1747: return new tl.account.ResetNotifySettings(buffer); case 0xf0888d68: return new tl.account.UpdateProfile(buffer); case 0x6628562c: return new tl.account.UpdateStatus(buffer); case 0xc04cfac2: return new tl.account.GetWallPapers(buffer); case 0xd91a548: return new tl.users.GetUsers(buffer); case 0xca30a5b1: return new tl.users.GetFullUser(buffer); case 0xc4a353ee: return new tl.contacts.GetStatuses(buffer); case 0x22c6aa08: return new tl.contacts.GetContacts(buffer); case 0xda30b32d: return new tl.contacts.ImportContacts(buffer); case 0x11f812d8: return new tl.contacts.Search(buffer); case 0xcd773428: return new tl.contacts.GetSuggested(buffer); case 0x8e953744: return new tl.contacts.DeleteContact(buffer); case 0x59ab389e: return new tl.contacts.DeleteContacts(buffer); case 0x332b49fc: return new tl.contacts.Block(buffer); case 0xe54100bd: return new tl.contacts.Unblock(buffer); case 0xf57c350f: return new tl.contacts.GetBlocked(buffer); case 0x4222fa74: return new tl.messages.GetMessages(buffer); case 0xeccf1df6: return new tl.messages.GetDialogs(buffer); case 0x92a1df2f: return new tl.messages.GetHistory(buffer); case 0x7e9f2ab: return new tl.messages.Search(buffer); case 0xb04f2510: return new tl.messages.ReadHistory(buffer); case 0xf4f8fb61: return new tl.messages.DeleteHistory(buffer); case 0x14f2dd0a: return new tl.messages.DeleteMessages(buffer); case 0x395f9d7e: return new tl.messages.RestoreMessages(buffer); case 0x28abcb68: return new tl.messages.ReceivedMessages(buffer); case 0x719839e9: return new tl.messages.SetTyping(buffer); case 0x4cde0aab: return new tl.messages.SendMessage(buffer); case 0xa3c85d76: return new tl.messages.SendMedia(buffer); case 0x514cd10f: return new tl.messages.ForwardMessages(buffer); case 0x3c6aa187: return new tl.messages.GetChats(buffer); case 0x3b831c66: return new tl.messages.GetFullChat(buffer); case 0xb4bc68b5: return new tl.messages.EditChatTitle(buffer); case 0xd881821d: return new tl.messages.EditChatPhoto(buffer); case 0x2ee9ee9e: return new tl.messages.AddChatUser(buffer); case 0xc3c5cd23: return new tl.messages.DeleteChatUser(buffer); case 0x419d9aee: return new tl.messages.CreateChat(buffer); case 0xedd4882a: return new tl.updates.GetState(buffer); case 0xa041495: return new tl.updates.GetDifference(buffer); case 0xeef579a0: return new tl.photos.UpdateProfilePhoto(buffer); case 0xd50f9c88: return new tl.photos.UploadProfilePhoto(buffer); case 0xb304a621: return new tl.upload.SaveFilePart(buffer); case 0xe3a6cfb5: return new tl.upload.GetFile(buffer); case 0xc4f9186b: return new tl.help.GetConfig(buffer); case 0x1fb33026: return new tl.help.GetNearestDc(buffer); case 0x6f02f748: return new tl.help.SaveAppLog(buffer); case 0xa4a95186: return new tl.help.GetInviteText(buffer); case 0xb7ee553c: return new tl.photos.GetUserPhotos(buffer); case 0x289dd1f6: return new tl.InvokeWithLayer2(buffer); case 0x3f3f4f2: return new tl.messages.ForwardMessage(buffer); case 0x41bb0972: return new tl.messages.SendBroadcast(buffer); case 0xb7475268: return new tl.InvokeWithLayer3(buffer); case 0x7f192d8f: return new tl.geochats.GetLocated(buffer); case 0xe1427e6f: return new tl.geochats.GetRecents(buffer); case 0x55b3e8fb: return new tl.geochats.Checkin(buffer); case 0x6722dd6f: return new tl.geochats.GetFullChat(buffer); case 0x4c8e2273: return new tl.geochats.EditChatTitle(buffer); case 0x35d81a95: return new tl.geochats.EditChatPhoto(buffer); case 0xcfcdc44d: return new tl.geochats.Search(buffer); case 0xb53f7a68: return new tl.geochats.GetHistory(buffer); case 0x8b8a729: return new tl.geochats.SetTyping(buffer); case 0x61b0044: return new tl.geochats.SendMessage(buffer); case 0xb8f0deff: return new tl.geochats.SendMedia(buffer); case 0xe092e16: return new tl.geochats.CreateGeoChat(buffer); case 0xdea0d430: return new tl.InvokeWithLayer4(buffer); case 0x417a57ae: return new tl.InvokeWithLayer5(buffer); case 0x3a64d54d: return new tl.InvokeWithLayer6(buffer); case 0xa5be56d3: return new tl.InvokeWithLayer7(buffer); case 0x26cf8950: return new tl.messages.GetDhConfig(buffer); case 0xf64daf43: return new tl.messages.RequestEncryption(buffer); case 0x3dbc0415: return new tl.messages.AcceptEncryption(buffer); case 0xedd923c5: return new tl.messages.DiscardEncryption(buffer); case 0x791451ed: return new tl.messages.SetEncryptedTyping(buffer); case 0x7f4b690a: return new tl.messages.ReadEncryptedHistory(buffer); case 0xa9776773: return new tl.messages.SendEncrypted(buffer); case 0x9a901b66: return new tl.messages.SendEncryptedFile(buffer); case 0x32d439a4: return new tl.messages.SendEncryptedService(buffer); case 0x55a5bb66: return new tl.messages.ReceivedQueue(buffer); case 0xe9abd9fd: return new tl.InvokeWithLayer8(buffer); case 0xde7b673d: return new tl.upload.SaveBigFilePart(buffer); case 0x69796de9: return new tl.InitConnection(buffer); case 0x76715a63: return new tl.InvokeWithLayer9(buffer); } System.err.println("Unable to decode TLObject with constructor 0x" + Integer.toHexString(number) + ", previous 0x" + Integer.toHexString(prevNum)); //Log.e(TAG, "Buffer dump (error at " + buffer.position() + "): " + toString(buffer)); return null; } public static TLObject read(byte[] buffer) throws Exception { ByteBuffer buf = ByteBuffer.wrap(buffer); buf.order(ByteOrder.LITTLE_ENDIAN); return read(buf); } public static TLObject read(String base64) throws Exception { return read(Base64.decodeFast(base64)); } // Read methods for simple types (unboxed) public static byte[] readString(ByteBuffer buffer) { int len = buffer.get(); byte[] value = null; if (len == -2) { len = (((int) buffer.get()) & 0xFF) | ((((int) buffer.get()) & 0xFF) << 8) | ((((int) buffer.get()) & 0xFF) << 16); value = new byte[len]; buffer.get(value); int padlen = (4 - len % 4) % 4; byte[] pad = new byte[padlen]; buffer.get(pad); } else { len &= 0xFF; value = new byte[len]; buffer.get(value); int padlen = (4 - (len + 1) % 4) % 4; byte[] pad = new byte[padlen]; buffer.get(pad); } return value; } public static byte[] readInt128(ByteBuffer buffer) { byte[] value = new byte[16]; buffer.get(value); return value; } public static byte[] readInt256(ByteBuffer buffer) { byte[] value = new byte[32]; buffer.get(value); return value; } @SuppressWarnings("unchecked") public static <T extends TLObject> T[] readVector(ByteBuffer buffer, boolean boxed, T[] a) throws Exception { if (boxed) { buffer.getInt(); } int size = buffer.getInt(); ArrayList<T> value = new ArrayList<T>(size); for (int i = 0; i < size; i++) { value.add((T) TL.read(buffer)); } return value.toArray(a); } //TODO: remove this single exception (now only TransportMessage can be inner unboxed type) public static TransportMessage[] readVectorMessage(ByteBuffer buffer, boolean boxed) throws Exception { if (boxed) { buffer.getInt(); } TransportMessage[] value = new TransportMessage[buffer.getInt()]; for (int i = 0; i < value.length; i++) { value[i] = new TransportMessage(buffer); } return value; } public static int[] readVectorInt(ByteBuffer buffer, boolean boxed) { if (boxed) { buffer.getInt(); // check if it's actually vector long } int[] value = new int[buffer.getInt()]; for (int i = 0; i < value.length; i++) { value[i] = buffer.getInt(); } return value; } public static long[] readVectorLong(ByteBuffer buffer, boolean boxed) { if (boxed) { buffer.getInt(); // check if it's actually vector long } long[] value = new long[buffer.getInt()]; for (int i = 0; i < value.length; i++) { value[i] = buffer.getLong(); } return value; } public static String[] readVectorString(ByteBuffer buffer, boolean boxed) { if (boxed) { buffer.getInt(); // check if it's actually vector long } String[] value = new String[buffer.getInt()]; for (int i = 0; i < value.length; i++) { try { value[i] = new String(TL.readString(buffer), "UTF8"); } catch (Exception e) { }; } return value; } // Write methods for simple types public static void writeString(ByteBuffer buffer, byte[] value, boolean boxed) { if (boxed) { buffer.putInt(CRC32("string ? = String")); } if (value.length <= 253) { int padlen = (4 - (value.length + 1) % 4) % 4; buffer.put((byte) value.length); buffer.put(value); byte[] pad = new byte[padlen]; buffer.put(pad); } else { int padlen = (4 - value.length % 4) % 4; buffer.putInt(0xFE + (value.length << 8)); buffer.put(value); byte[] pad = new byte[padlen]; buffer.put(pad); } } public static void writeVector(ByteBuffer buffer, TLObject[] value, boolean outerBoxed, boolean innerBoxed) throws Exception { if (outerBoxed) { //buffer.putInt(0xa351ae8e); buffer.putInt(0x1cb5c415); } buffer.putInt(value.length); for (int i = 0; i < value.length; i++) { value[i].writeTo(buffer, innerBoxed); } } public static void writeVector(ByteBuffer buffer, int[] value, boolean outerBoxed, boolean innerBoxed) { if (outerBoxed) { buffer.putInt(CRC32("vector # [ int ] = Vector int")); } buffer.putInt(value.length); for (int i = 0; i < value.length; i++) { if (innerBoxed) { buffer.putInt(CRC32("int ? = Int")); } buffer.putInt(value[i]); } } public static void writeVector(ByteBuffer buffer, long[] value, boolean outerBoxed, boolean innerBoxed) { if (outerBoxed) { buffer.putInt(CRC32("vector # [ long ] = Vector long")); } buffer.putInt(value.length); for (int i = 0; i < value.length; i++) { if (innerBoxed) { buffer.putInt(CRC32("long ? = Long")); } buffer.putLong(value[i]); } } public static void writeVector(ByteBuffer buffer, String[] value, boolean outerBoxed, boolean innerBoxed) { if (outerBoxed) { buffer.putInt(CRC32("vector # [ string ] = Vector string")); } buffer.putInt(value.length); for (int i = 0; i < value.length; i++) { writeString(buffer, value[i].getBytes(), innerBoxed); } } // Length methods for simple types public static int length(byte[] value) { int len = value.length + (value.length < 253 ? 1 : 4); while (len % 4 != 0) len++; return len; } public static int length(TLObject[] value, boolean boxed) throws Exception { int len = 0; for (TLObject object : value) { len += object.length() + (boxed ? 4 : 0); } return len; } public static int length(TLObject[] value) throws Exception { return length(value, false); } public static int length(String[] value) { int len = 0; for (String object : value) { len += TL.length(object.getBytes()); } return len; } // toString methods for simple types public static String toString(TLObject[] value) { String str = ""; for (TLObject object : value) { if (str.length() > 0) str += ", "; str += object; } return "[" + str + "]"; } public static String toString(ByteBuffer value) { String str = ""; for (int i = 0; i < value.limit(); i++) { if (i % 16 > 0) str += " "; else if (i > 0) str += "\n"; str += String.format("%02x", value.get(i)); } return "\n" + str + "\n"; } public static String toString(byte[] value) { String str = ""; for (int i = 0; i < value.length; i++) { if (i % 16 > 0) str += " "; else if (i > 0) str += "\n"; str += String.format("%02x", value[i]); } return "\n" + str + "\n"; } public static String toString(int[] value) { String str = ""; for (int object : value) { if (str.length() > 0) str += ", "; str += object; } return "[" + str + "]"; } public static String toString(long[] value) { String str = ""; for (long object : value) { if (str.length() > 0) str += ", "; str += String.format("%016x", object); } return "[" + str + "]"; } public static String toString(String[] value) { String str = ""; for (String object : value) { if (str.length() > 0) str += ", "; str += "\"" + object + "\""; } return "[" + str + "]"; } }