mirror of
https://github.com/DrKLO/Telegram.git
synced 2025-05-14 03:06:45 +02:00
first commit
This commit is contained in:
commit
4622ba9186
1029 changed files with 208243 additions and 0 deletions
339
LICENSE
Normal file
339
LICENSE
Normal file
|
@ -0,0 +1,339 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
13
TMessages.iml
Normal file
13
TMessages.iml
Normal file
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/.gradle" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
|
80
TMessagesProj/TMessagesProj.iml
Normal file
80
TMessagesProj/TMessagesProj.iml
Normal file
|
@ -0,0 +1,80 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="android" name="Android">
|
||||
<configuration>
|
||||
<option name="SELECTED_BUILD_VARIANT" value="Debug" />
|
||||
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
|
||||
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebug" />
|
||||
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleTest" />
|
||||
<option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
|
||||
<option name="ALLOW_USER_CONFIGURATION" value="false" />
|
||||
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
|
||||
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
|
||||
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
|
||||
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
|
||||
<option name="APK_PATH" value="/build/apk/TMessagesProj-debug-unaligned.apk" />
|
||||
</configuration>
|
||||
</facet>
|
||||
<facet type="android-gradle" name="Android-Gradle">
|
||||
<configuration>
|
||||
<option name="GRADLE_PROJECT_PATH" value=":TMessagesProj" />
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="false">
|
||||
<output url="file://$MODULE_DIR$/build/classes/debug" />
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/source/r/debug" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/source/aidl/debug" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/source/rs/debug" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/debug" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/res/rs/debug" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/source/r/test" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/source/aidl/test" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/source/rs/test" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/test" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/res/rs/test" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/res" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/aidl" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/assets" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/jni" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/rs" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/res" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/resources" isTestSource="true" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/apk" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/assets" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/bundles" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/classes" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/dependency-cache" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/incremental" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/libs" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/manifests" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/symbols" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Android 4.3 Platform" jdkType="Android SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" exported="" name="support-v4-18.0.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="ComGoogleAndroidGmsPlayServices3159.aar" level="project" />
|
||||
<orderEntry type="library" exported="" name="HockeySDK-3.0.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="native-libs" level="project" />
|
||||
<orderEntry type="library" exported="" name="ComActionbarsherlockActionbarsherlock440.aar" level="project" />
|
||||
</component>
|
||||
</module>
|
||||
|
49
TMessagesProj/build.gradle
Normal file
49
TMessagesProj/build.gradle
Normal file
|
@ -0,0 +1,49 @@
|
|||
buildscript {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:0.5.+'
|
||||
}
|
||||
}
|
||||
apply plugin: 'android'
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
task nativeLibsToJar(
|
||||
type: Zip,
|
||||
description: 'create a jar archive of the native libs') {
|
||||
destinationDir file("$buildDir/native-libs")
|
||||
baseName 'native-libs'
|
||||
extension 'jar'
|
||||
from fileTree(dir: 'libs', include: '**/*.so')
|
||||
into 'lib/'
|
||||
}
|
||||
|
||||
tasks.withType(Compile) {
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
|
||||
tasks.withType(Compile) {
|
||||
compileTask -> compileTask.dependsOn(nativeLibsToJar)
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
|
||||
compile 'com.google.android.gms:play-services:3.1.+'
|
||||
compile 'net.hockeyapp.android:HockeySDK:3.0.0'
|
||||
compile 'com.android.support:support-v4:18.0.+'
|
||||
compile fileTree(dir: "$buildDir/native-libs", include: '*.jar')
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 18
|
||||
buildToolsVersion "17.0.0"
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 8
|
||||
targetSdkVersion 18
|
||||
}
|
||||
}
|
19
TMessagesProj/jni/Android.mk
Executable file
19
TMessagesProj/jni/Android.mk
Executable file
|
@ -0,0 +1,19 @@
|
|||
LOCAL_PATH := $(call my-dir)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := tmessages
|
||||
LOCAL_CFLAGS = -w
|
||||
LOCAL_LDLIBS := -llog
|
||||
|
||||
LOCAL_SRC_FILES := \
|
||||
./aes_core.c \
|
||||
./aes_ige.c \
|
||||
./aes_misc.c \
|
||||
./jni.c \
|
||||
./sqlite3.c \
|
||||
./org_telegram_SQLite_SQLiteCursor.c \
|
||||
./org_telegram_SQLite_SQLiteDatabase.c \
|
||||
./org_telegram_SQLite_SQLitePreparedStatement.c \
|
||||
./org_telegram_SQLite.c
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
2
TMessagesProj/jni/Application.mk
Normal file
2
TMessagesProj/jni/Application.mk
Normal file
|
@ -0,0 +1,2 @@
|
|||
APP_PLATFORM := android-8
|
||||
APP_ABI := armeabi armeabi-v7a x86 mips
|
147
TMessagesProj/jni/aes.h
Normal file
147
TMessagesProj/jni/aes.h
Normal file
|
@ -0,0 +1,147 @@
|
|||
/* crypto/aes/aes.h -*- mode:C; c-file-style: "eay" -*- */
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* openssl-core@openssl.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef HEADER_AES_H
|
||||
#define HEADER_AES_H
|
||||
|
||||
//#include <openssl/opensslconf.h>
|
||||
|
||||
#ifdef OPENSSL_NO_AES
|
||||
#error AES is disabled.
|
||||
#endif
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#define AES_ENCRYPT 1
|
||||
#define AES_DECRYPT 0
|
||||
|
||||
/* Because array size can't be a const in C, the following two are macros.
|
||||
Both sizes are in bytes. */
|
||||
#define AES_MAXNR 14
|
||||
#define AES_BLOCK_SIZE 16
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* This should be a hidden type, but EVP requires that the size be known */
|
||||
struct aes_key_st {
|
||||
#ifdef AES_LONG
|
||||
unsigned long rd_key[4 *(AES_MAXNR + 1)];
|
||||
#else
|
||||
unsigned int rd_key[4 *(AES_MAXNR + 1)];
|
||||
#endif
|
||||
int rounds;
|
||||
};
|
||||
typedef struct aes_key_st AES_KEY;
|
||||
|
||||
const char *AES_options(void);
|
||||
|
||||
int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
|
||||
AES_KEY *key);
|
||||
int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
|
||||
AES_KEY *key);
|
||||
|
||||
int private_AES_set_encrypt_key(const unsigned char *userKey, const int bits,
|
||||
AES_KEY *key);
|
||||
int private_AES_set_decrypt_key(const unsigned char *userKey, const int bits,
|
||||
AES_KEY *key);
|
||||
|
||||
void AES_encrypt(const unsigned char *in, unsigned char *out,
|
||||
const AES_KEY *key);
|
||||
void AES_decrypt(const unsigned char *in, unsigned char *out,
|
||||
const AES_KEY *key);
|
||||
|
||||
void AES_ecb_encrypt(const unsigned char *in, unsigned char *out,
|
||||
const AES_KEY *key, const int enc);
|
||||
void AES_cbc_encrypt(const unsigned char *in, unsigned char *out,
|
||||
size_t length, const AES_KEY *key,
|
||||
unsigned char *ivec, const int enc);
|
||||
void AES_cfb128_encrypt(const unsigned char *in, unsigned char *out,
|
||||
size_t length, const AES_KEY *key,
|
||||
unsigned char *ivec, int *num, const int enc);
|
||||
void AES_cfb1_encrypt(const unsigned char *in, unsigned char *out,
|
||||
size_t length, const AES_KEY *key,
|
||||
unsigned char *ivec, int *num, const int enc);
|
||||
void AES_cfb8_encrypt(const unsigned char *in, unsigned char *out,
|
||||
size_t length, const AES_KEY *key,
|
||||
unsigned char *ivec, int *num, const int enc);
|
||||
void AES_ofb128_encrypt(const unsigned char *in, unsigned char *out,
|
||||
size_t length, const AES_KEY *key,
|
||||
unsigned char *ivec, int *num);
|
||||
void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out,
|
||||
size_t length, const AES_KEY *key,
|
||||
unsigned char ivec[AES_BLOCK_SIZE],
|
||||
unsigned char ecount_buf[AES_BLOCK_SIZE],
|
||||
unsigned int *num);
|
||||
/* NB: the IV is _two_ blocks long */
|
||||
void AES_ige_encrypt(const unsigned char *in, unsigned char *out,
|
||||
size_t length, const AES_KEY *key,
|
||||
unsigned char *ivec, const int enc);
|
||||
/* NB: the IV is _four_ blocks long */
|
||||
void AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out,
|
||||
size_t length, const AES_KEY *key,
|
||||
const AES_KEY *key2, const unsigned char *ivec,
|
||||
const int enc);
|
||||
|
||||
int AES_wrap_key(AES_KEY *key, const unsigned char *iv,
|
||||
unsigned char *out,
|
||||
const unsigned char *in, unsigned int inlen);
|
||||
int AES_unwrap_key(AES_KEY *key, const unsigned char *iv,
|
||||
unsigned char *out,
|
||||
const unsigned char *in, unsigned int inlen);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !HEADER_AES_H */
|
1358
TMessagesProj/jni/aes_core.c
Normal file
1358
TMessagesProj/jni/aes_core.c
Normal file
File diff suppressed because it is too large
Load diff
325
TMessagesProj/jni/aes_ige.c
Normal file
325
TMessagesProj/jni/aes_ige.c
Normal file
|
@ -0,0 +1,325 @@
|
|||
/* crypto/aes/aes_ige.c -*- mode:C; c-file-style: "eay" -*- */
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2006 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* openssl-core@openssl.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
*/
|
||||
|
||||
//#include "cryptlib.h"
|
||||
|
||||
#include "aes.h"
|
||||
#include "aes_locl.h"
|
||||
#include <assert.h>
|
||||
#define OPENSSL_assert assert
|
||||
|
||||
#define N_WORDS (AES_BLOCK_SIZE / sizeof(unsigned long))
|
||||
typedef struct {
|
||||
unsigned long data[N_WORDS];
|
||||
} aes_block_t;
|
||||
|
||||
/* XXX: probably some better way to do this */
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
#define UNALIGNED_MEMOPS_ARE_FAST 1
|
||||
#else
|
||||
#define UNALIGNED_MEMOPS_ARE_FAST 0
|
||||
#endif
|
||||
|
||||
#if UNALIGNED_MEMOPS_ARE_FAST
|
||||
#define load_block(d, s) (d) = *(const aes_block_t *)(s)
|
||||
#define store_block(d, s) *(aes_block_t *)(d) = (s)
|
||||
#else
|
||||
#define load_block(d, s) memcpy((d).data, (s), AES_BLOCK_SIZE)
|
||||
#define store_block(d, s) memcpy((d), (s).data, AES_BLOCK_SIZE)
|
||||
#endif
|
||||
|
||||
/* N.B. The IV for this mode is _twice_ the block size */
|
||||
|
||||
void AES_ige_encrypt(const unsigned char *in, unsigned char *out,
|
||||
size_t length, const AES_KEY *key,
|
||||
unsigned char *ivec, const int enc)
|
||||
{
|
||||
size_t n;
|
||||
size_t len = length;
|
||||
|
||||
OPENSSL_assert(in && out && key && ivec);
|
||||
OPENSSL_assert((AES_ENCRYPT == enc)||(AES_DECRYPT == enc));
|
||||
OPENSSL_assert((length%AES_BLOCK_SIZE) == 0);
|
||||
|
||||
len = length / AES_BLOCK_SIZE;
|
||||
|
||||
if (AES_ENCRYPT == enc)
|
||||
{
|
||||
if (in != out &&
|
||||
(UNALIGNED_MEMOPS_ARE_FAST || ((size_t)in|(size_t)out|(size_t)ivec)%sizeof(long)==0))
|
||||
{
|
||||
aes_block_t *ivp = (aes_block_t *)ivec;
|
||||
aes_block_t *iv2p = (aes_block_t *)(ivec + AES_BLOCK_SIZE);
|
||||
|
||||
while (len)
|
||||
{
|
||||
aes_block_t *inp = (aes_block_t *)in;
|
||||
aes_block_t *outp = (aes_block_t *)out;
|
||||
|
||||
for(n=0 ; n < N_WORDS; ++n)
|
||||
outp->data[n] = inp->data[n] ^ ivp->data[n];
|
||||
AES_encrypt((unsigned char *)outp->data, (unsigned char *)outp->data, key);
|
||||
for(n=0 ; n < N_WORDS; ++n)
|
||||
outp->data[n] ^= iv2p->data[n];
|
||||
ivp = outp;
|
||||
iv2p = inp;
|
||||
--len;
|
||||
in += AES_BLOCK_SIZE;
|
||||
out += AES_BLOCK_SIZE;
|
||||
}
|
||||
memcpy(ivec, ivp->data, AES_BLOCK_SIZE);
|
||||
memcpy(ivec + AES_BLOCK_SIZE, iv2p->data, AES_BLOCK_SIZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
aes_block_t tmp, tmp2;
|
||||
aes_block_t iv;
|
||||
aes_block_t iv2;
|
||||
|
||||
load_block(iv, ivec);
|
||||
load_block(iv2, ivec + AES_BLOCK_SIZE);
|
||||
|
||||
while (len)
|
||||
{
|
||||
load_block(tmp, in);
|
||||
for(n=0 ; n < N_WORDS; ++n)
|
||||
tmp2.data[n] = tmp.data[n] ^ iv.data[n];
|
||||
AES_encrypt((unsigned char *)tmp2.data, (unsigned char *)tmp2.data, key);
|
||||
for(n=0 ; n < N_WORDS; ++n)
|
||||
tmp2.data[n] ^= iv2.data[n];
|
||||
store_block(out, tmp2);
|
||||
iv = tmp2;
|
||||
iv2 = tmp;
|
||||
--len;
|
||||
in += AES_BLOCK_SIZE;
|
||||
out += AES_BLOCK_SIZE;
|
||||
}
|
||||
memcpy(ivec, iv.data, AES_BLOCK_SIZE);
|
||||
memcpy(ivec + AES_BLOCK_SIZE, iv2.data, AES_BLOCK_SIZE);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (in != out &&
|
||||
(UNALIGNED_MEMOPS_ARE_FAST || ((size_t)in|(size_t)out|(size_t)ivec)%sizeof(long)==0))
|
||||
{
|
||||
aes_block_t *ivp = (aes_block_t *)ivec;
|
||||
aes_block_t *iv2p = (aes_block_t *)(ivec + AES_BLOCK_SIZE);
|
||||
|
||||
while (len)
|
||||
{
|
||||
aes_block_t tmp;
|
||||
aes_block_t *inp = (aes_block_t *)in;
|
||||
aes_block_t *outp = (aes_block_t *)out;
|
||||
|
||||
for(n=0 ; n < N_WORDS; ++n)
|
||||
tmp.data[n] = inp->data[n] ^ iv2p->data[n];
|
||||
AES_decrypt((unsigned char *)tmp.data, (unsigned char *)outp->data, key);
|
||||
for(n=0 ; n < N_WORDS; ++n)
|
||||
outp->data[n] ^= ivp->data[n];
|
||||
ivp = inp;
|
||||
iv2p = outp;
|
||||
--len;
|
||||
in += AES_BLOCK_SIZE;
|
||||
out += AES_BLOCK_SIZE;
|
||||
}
|
||||
memcpy(ivec, ivp->data, AES_BLOCK_SIZE);
|
||||
memcpy(ivec + AES_BLOCK_SIZE, iv2p->data, AES_BLOCK_SIZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
aes_block_t tmp, tmp2;
|
||||
aes_block_t iv;
|
||||
aes_block_t iv2;
|
||||
|
||||
load_block(iv, ivec);
|
||||
load_block(iv2, ivec + AES_BLOCK_SIZE);
|
||||
|
||||
while (len)
|
||||
{
|
||||
load_block(tmp, in);
|
||||
tmp2 = tmp;
|
||||
for(n=0 ; n < N_WORDS; ++n)
|
||||
tmp.data[n] ^= iv2.data[n];
|
||||
AES_decrypt((unsigned char *)tmp.data, (unsigned char *)tmp.data, key);
|
||||
for(n=0 ; n < N_WORDS; ++n)
|
||||
tmp.data[n] ^= iv.data[n];
|
||||
store_block(out, tmp);
|
||||
iv = tmp2;
|
||||
iv2 = tmp;
|
||||
--len;
|
||||
in += AES_BLOCK_SIZE;
|
||||
out += AES_BLOCK_SIZE;
|
||||
}
|
||||
memcpy(ivec, iv.data, AES_BLOCK_SIZE);
|
||||
memcpy(ivec + AES_BLOCK_SIZE, iv2.data, AES_BLOCK_SIZE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Note that its effectively impossible to do biIGE in anything other
|
||||
* than a single pass, so no provision is made for chaining.
|
||||
*/
|
||||
|
||||
/* N.B. The IV for this mode is _four times_ the block size */
|
||||
|
||||
void AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out,
|
||||
size_t length, const AES_KEY *key,
|
||||
const AES_KEY *key2, const unsigned char *ivec,
|
||||
const int enc)
|
||||
{
|
||||
size_t n;
|
||||
size_t len = length;
|
||||
unsigned char tmp[AES_BLOCK_SIZE];
|
||||
unsigned char tmp2[AES_BLOCK_SIZE];
|
||||
unsigned char tmp3[AES_BLOCK_SIZE];
|
||||
unsigned char prev[AES_BLOCK_SIZE];
|
||||
const unsigned char *iv;
|
||||
const unsigned char *iv2;
|
||||
|
||||
OPENSSL_assert(in && out && key && ivec);
|
||||
OPENSSL_assert((AES_ENCRYPT == enc)||(AES_DECRYPT == enc));
|
||||
OPENSSL_assert((length%AES_BLOCK_SIZE) == 0);
|
||||
|
||||
if (AES_ENCRYPT == enc)
|
||||
{
|
||||
/* XXX: Do a separate case for when in != out (strictly should
|
||||
check for overlap, too) */
|
||||
|
||||
/* First the forward pass */
|
||||
iv = ivec;
|
||||
iv2 = ivec + AES_BLOCK_SIZE;
|
||||
while (len >= AES_BLOCK_SIZE)
|
||||
{
|
||||
for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
|
||||
out[n] = in[n] ^ iv[n];
|
||||
AES_encrypt(out, out, key);
|
||||
for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
|
||||
out[n] ^= iv2[n];
|
||||
iv = out;
|
||||
memcpy(prev, in, AES_BLOCK_SIZE);
|
||||
iv2 = prev;
|
||||
len -= AES_BLOCK_SIZE;
|
||||
in += AES_BLOCK_SIZE;
|
||||
out += AES_BLOCK_SIZE;
|
||||
}
|
||||
|
||||
/* And now backwards */
|
||||
iv = ivec + AES_BLOCK_SIZE*2;
|
||||
iv2 = ivec + AES_BLOCK_SIZE*3;
|
||||
len = length;
|
||||
while(len >= AES_BLOCK_SIZE)
|
||||
{
|
||||
out -= AES_BLOCK_SIZE;
|
||||
/* XXX: reduce copies by alternating between buffers */
|
||||
memcpy(tmp, out, AES_BLOCK_SIZE);
|
||||
for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
|
||||
out[n] ^= iv[n];
|
||||
/* hexdump(stdout, "out ^ iv", out, AES_BLOCK_SIZE); */
|
||||
AES_encrypt(out, out, key);
|
||||
/* hexdump(stdout,"enc", out, AES_BLOCK_SIZE); */
|
||||
/* hexdump(stdout,"iv2", iv2, AES_BLOCK_SIZE); */
|
||||
for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
|
||||
out[n] ^= iv2[n];
|
||||
/* hexdump(stdout,"out", out, AES_BLOCK_SIZE); */
|
||||
iv = out;
|
||||
memcpy(prev, tmp, AES_BLOCK_SIZE);
|
||||
iv2 = prev;
|
||||
len -= AES_BLOCK_SIZE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* First backwards */
|
||||
iv = ivec + AES_BLOCK_SIZE*2;
|
||||
iv2 = ivec + AES_BLOCK_SIZE*3;
|
||||
in += length;
|
||||
out += length;
|
||||
while (len >= AES_BLOCK_SIZE)
|
||||
{
|
||||
in -= AES_BLOCK_SIZE;
|
||||
out -= AES_BLOCK_SIZE;
|
||||
memcpy(tmp, in, AES_BLOCK_SIZE);
|
||||
memcpy(tmp2, in, AES_BLOCK_SIZE);
|
||||
for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
|
||||
tmp[n] ^= iv2[n];
|
||||
AES_decrypt(tmp, out, key);
|
||||
for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
|
||||
out[n] ^= iv[n];
|
||||
memcpy(tmp3, tmp2, AES_BLOCK_SIZE);
|
||||
iv = tmp3;
|
||||
iv2 = out;
|
||||
len -= AES_BLOCK_SIZE;
|
||||
}
|
||||
|
||||
/* And now forwards */
|
||||
iv = ivec;
|
||||
iv2 = ivec + AES_BLOCK_SIZE;
|
||||
len = length;
|
||||
while (len >= AES_BLOCK_SIZE)
|
||||
{
|
||||
memcpy(tmp, out, AES_BLOCK_SIZE);
|
||||
memcpy(tmp2, out, AES_BLOCK_SIZE);
|
||||
for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
|
||||
tmp[n] ^= iv2[n];
|
||||
AES_decrypt(tmp, out, key);
|
||||
for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
|
||||
out[n] ^= iv[n];
|
||||
memcpy(tmp3, tmp2, AES_BLOCK_SIZE);
|
||||
iv = tmp3;
|
||||
iv2 = out;
|
||||
len -= AES_BLOCK_SIZE;
|
||||
in += AES_BLOCK_SIZE;
|
||||
out += AES_BLOCK_SIZE;
|
||||
}
|
||||
}
|
||||
}
|
89
TMessagesProj/jni/aes_locl.h
Normal file
89
TMessagesProj/jni/aes_locl.h
Normal file
|
@ -0,0 +1,89 @@
|
|||
/* crypto/aes/aes.h -*- mode:C; c-file-style: "eay" -*- */
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* openssl-core@openssl.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef HEADER_AES_LOCL_H
|
||||
#define HEADER_AES_LOCL_H
|
||||
|
||||
//#include <openssl/e_os2.h>
|
||||
|
||||
#ifdef OPENSSL_NO_AES
|
||||
#error AES is disabled.
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64))
|
||||
# define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00)
|
||||
# define GETU32(p) SWAP(*((u32 *)(p)))
|
||||
# define PUTU32(ct, st) { *((u32 *)(ct)) = SWAP((st)); }
|
||||
#else
|
||||
# define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3]))
|
||||
# define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); }
|
||||
#endif
|
||||
|
||||
#ifdef AES_LONG
|
||||
typedef unsigned long u32;
|
||||
#else
|
||||
typedef unsigned int u32;
|
||||
#endif
|
||||
typedef unsigned short u16;
|
||||
typedef unsigned char u8;
|
||||
|
||||
#define MAXKC (256/32)
|
||||
#define MAXKB (256/8)
|
||||
#define MAXNR 14
|
||||
|
||||
/* This controls loop-unrolling in aes_core.c */
|
||||
#undef FULL_UNROLL
|
||||
|
||||
#endif /* !HEADER_AES_LOCL_H */
|
85
TMessagesProj/jni/aes_misc.c
Normal file
85
TMessagesProj/jni/aes_misc.c
Normal file
|
@ -0,0 +1,85 @@
|
|||
/* crypto/aes/aes_misc.c -*- mode:C; c-file-style: "eay" -*- */
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* openssl-core@openssl.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
*/
|
||||
|
||||
//#include <openssl/opensslv.h>
|
||||
//#include <openssl/crypto.h>
|
||||
#include "aes.h"
|
||||
#include "aes_locl.h"
|
||||
|
||||
const char AES_version[]="AES" ;//OPENSSL_VERSION_PTEXT;
|
||||
|
||||
const char *AES_options(void) {
|
||||
#ifdef FULL_UNROLL
|
||||
return "aes(full)";
|
||||
#else
|
||||
return "aes(partial)";
|
||||
#endif
|
||||
}
|
||||
|
||||
/* FIPS wrapper functions to block low level AES calls in FIPS mode */
|
||||
|
||||
int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
|
||||
AES_KEY *key)
|
||||
{
|
||||
#ifdef OPENSSL_FIPS
|
||||
fips_cipher_abort(AES);
|
||||
#endif
|
||||
return private_AES_set_encrypt_key(userKey, bits, key);
|
||||
}
|
||||
|
||||
int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
|
||||
AES_KEY *key)
|
||||
{
|
||||
#ifdef OPENSSL_FIPS
|
||||
fips_cipher_abort(AES);
|
||||
#endif
|
||||
return private_AES_set_decrypt_key(userKey, bits, key);
|
||||
}
|
183
TMessagesProj/jni/jni.c
Normal file
183
TMessagesProj/jni/jni.c
Normal file
|
@ -0,0 +1,183 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <jni.h>
|
||||
#include <sys/types.h>
|
||||
#include <inttypes.h>
|
||||
#include <android/log.h>
|
||||
#include "aes.h"
|
||||
|
||||
#define LOG_TAG "tmessages_native"
|
||||
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
|
||||
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
|
||||
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
|
||||
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)
|
||||
|
||||
JNIEXPORT jbyteArray Java_org_telegram_messenger_Utilities_aesIgeEncryption(JNIEnv *env, jclass class, jbyteArray _what, jbyteArray _key, jbyteArray _iv, jboolean encrypt, jboolean changeIv) {
|
||||
unsigned char *what = (unsigned char *)(*env)->GetByteArrayElements(env, _what, NULL);
|
||||
unsigned char *key = (unsigned char *)(*env)->GetByteArrayElements(env, _key, NULL);
|
||||
unsigned char *__iv = (unsigned char *)(*env)->GetByteArrayElements(env, _iv, NULL);
|
||||
unsigned char *iv = 0;
|
||||
|
||||
if (!changeIv) {
|
||||
iv = (unsigned char *)malloc((*env)->GetArrayLength(env, _iv));
|
||||
memcpy(iv, __iv, (*env)->GetArrayLength(env, _iv));
|
||||
} else {
|
||||
iv = __iv;
|
||||
}
|
||||
|
||||
int len = (*env)->GetArrayLength(env, _what);
|
||||
AES_KEY akey;
|
||||
if (!encrypt) {
|
||||
AES_set_decrypt_key(key, (*env)->GetArrayLength(env, _key) * 8, &akey);
|
||||
AES_ige_encrypt(what, what, len, &akey, iv, AES_DECRYPT);
|
||||
} else {
|
||||
AES_set_encrypt_key(key, (*env)->GetArrayLength(env, _key) * 8, &akey);
|
||||
AES_ige_encrypt(what, what, len, &akey, iv, AES_ENCRYPT);
|
||||
}
|
||||
(*env)->ReleaseByteArrayElements(env, _what, what, 0);
|
||||
(*env)->ReleaseByteArrayElements(env, _key, key, JNI_ABORT);
|
||||
if (!changeIv) {
|
||||
(*env)->ReleaseByteArrayElements(env, _iv, __iv, JNI_ABORT);
|
||||
free(iv);
|
||||
} else {
|
||||
(*env)->ReleaseByteArrayElements(env, _iv, __iv, 0);
|
||||
}
|
||||
return _what;
|
||||
}
|
||||
|
||||
uint64_t gcd(uint64_t a, uint64_t b){
|
||||
while(a != 0 && b != 0) {
|
||||
while((b & 1) == 0) b >>= 1;
|
||||
while((a & 1) == 0) a >>= 1;
|
||||
if(a > b) a -= b; else b -= a;
|
||||
}
|
||||
return b == 0 ? a : b;
|
||||
}
|
||||
|
||||
JNIEXPORT jlong Java_org_telegram_messenger_Utilities_doPQNative(JNIEnv* env, jclass class, jlong _what) {
|
||||
uint64_t what = _what;
|
||||
int it = 0, i, j;
|
||||
uint64_t g = 0;
|
||||
for (i = 0; i < 3 || it < 1000; i++){
|
||||
int q = ((lrand48() & 15) + 17) % what;
|
||||
uint64_t x = (long long)lrand48() % (what - 1) + 1, y = x;
|
||||
int lim = 1 << (i + 18), j;
|
||||
for(j = 1; j < lim; j++){
|
||||
++it;
|
||||
uint64_t a = x, b = x, c = q;
|
||||
while(b){
|
||||
if(b & 1){
|
||||
c += a;
|
||||
if(c >= what) c -= what;
|
||||
}
|
||||
a += a;
|
||||
if(a >= what) a -= what;
|
||||
b >>= 1;
|
||||
}
|
||||
x = c;
|
||||
uint64_t z = x < y ? what + x - y : x - y;
|
||||
g = gcd(z, what);
|
||||
if(g != 1) break;
|
||||
if(!(j & (j - 1))) y = x;
|
||||
}
|
||||
if(g > 1 && g < what) break;
|
||||
}
|
||||
return g;
|
||||
}
|
||||
|
||||
//sqlite
|
||||
|
||||
/*JNIEXPORT void Java_org_telegram_messenger_Utilities_beginTransaction(JNIEnv* env, jobject object, int dbHandle) {
|
||||
sqlite3 *db = (sqlite3 *)dbHandle;
|
||||
if (db == NULL) {
|
||||
return;
|
||||
}
|
||||
sqlite3_exec(db, "BEGIN", 0, 0, 0);
|
||||
}
|
||||
|
||||
JNIEXPORT void Java_org_telegram_messenger_Utilities_commitTransaction(JNIEnv* env, jobject object, int dbHandle) {
|
||||
sqlite3 *db = (sqlite3 *)dbHandle;
|
||||
if (db == NULL) {
|
||||
return;
|
||||
}
|
||||
sqlite3_exec(db, "COMMIT", 0, 0, 0);
|
||||
}
|
||||
|
||||
int Java_org_telegram_messenger_Utilities_step(JNIEnv* env, jobject object, int statementHandle) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
|
||||
|
||||
int errcode = 0 ;
|
||||
|
||||
errcode = sqlite3_step(handle);
|
||||
if (errcode == SQLITE_ROW) {
|
||||
return 0;
|
||||
} else if(errcode == SQLITE_DONE) {
|
||||
return 1;
|
||||
} else if(errcode == SQLITE_BUSY) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
|
||||
}
|
||||
|
||||
int Java_org_telegram_messenger_Utilities_columnType(JNIEnv* env, jobject object, int statementHandle, int columnIndex) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
|
||||
|
||||
return sqlite3_column_type(handle, columnIndex);
|
||||
}
|
||||
|
||||
int Java_org_telegram_messenger_Utilities_columnIsNull(JNIEnv* env, jobject object, int statementHandle, int columnIndex) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
|
||||
|
||||
int valType = sqlite3_column_type(handle, columnIndex);
|
||||
|
||||
return SQLITE_NULL == valType;
|
||||
}
|
||||
|
||||
int Java_org_telegram_messenger_Utilities_columnIntValue(JNIEnv* env, jobject object, int statementHandle, int columnIndex) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
|
||||
|
||||
int valType = sqlite3_column_type(handle, columnIndex);
|
||||
if (SQLITE_NULL == valType) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return sqlite3_column_int(handle, columnIndex);
|
||||
}
|
||||
|
||||
jdouble Java_org_telegram_messenger_Utilities_columnDoubleValue(JNIEnv* env, jobject object, int statementHandle, int columnIndex) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
|
||||
|
||||
int valType = sqlite3_column_type(handle, columnIndex);
|
||||
if (SQLITE_NULL == valType) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return sqlite3_column_double(handle, columnIndex);
|
||||
}
|
||||
|
||||
jstring Java_org_telegram_messenger_Utilities_columnStringValue(JNIEnv* env, jobject object, int statementHandle, int columnIndex) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
|
||||
|
||||
const char* str = sqlite3_column_text(handle, columnIndex);
|
||||
if (str != 0) {
|
||||
return (*env)->NewStringUTF(env, str);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
jbyteArray Java_org_telegram_messenger_Utilities_columnByteArrayValue(JNIEnv* env, jobject object, int statementHandle, int columnIndex) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
|
||||
|
||||
void *buf = sqlite3_column_blob(handle, columnIndex);
|
||||
int length = sqlite3_column_bytes(handle, columnIndex);
|
||||
|
||||
if (buf != 0 && length > 0) {
|
||||
jbyteArray result = (*env)->NewByteArray(env, length);
|
||||
(*env)->SetByteArrayRegion(env, result, 0, length, buf);
|
||||
return result;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}*/
|
11
TMessagesProj/jni/org_telegram_SQLite.c
Executable file
11
TMessagesProj/jni/org_telegram_SQLite.c
Executable file
|
@ -0,0 +1,11 @@
|
|||
#include "sqlite3.h"
|
||||
#include "org_telegram_SQLite.h"
|
||||
|
||||
void throw_sqlite3_exception(JNIEnv *env, sqlite3 *handle, int errcode) {
|
||||
if (SQLITE_OK == errcode) {
|
||||
errcode = sqlite3_errcode(handle);
|
||||
}
|
||||
const char *errmsg = sqlite3_errmsg(handle);
|
||||
jclass exClass = (*env)->FindClass(env, "org/telegram/SQLite/SQLiteException");
|
||||
(*env)->ThrowNew(env, exClass, errmsg);
|
||||
}
|
9
TMessagesProj/jni/org_telegram_SQLite.h
Executable file
9
TMessagesProj/jni/org_telegram_SQLite.h
Executable file
|
@ -0,0 +1,9 @@
|
|||
#ifndef __SQLITE_H__
|
||||
#define __SQLITE_H__
|
||||
|
||||
#include <jni.h>
|
||||
#include "sqlite3.h"
|
||||
|
||||
void throw_sqlite3_exception(JNIEnv* env, sqlite3 *handle, int errcode);
|
||||
|
||||
#endif
|
60
TMessagesProj/jni/org_telegram_SQLite_SQLiteCursor.c
Executable file
60
TMessagesProj/jni/org_telegram_SQLite_SQLiteCursor.c
Executable file
|
@ -0,0 +1,60 @@
|
|||
#include "org_telegram_SQLite.h"
|
||||
|
||||
int Java_org_telegram_SQLite_SQLiteCursor_columnType(JNIEnv *env, jobject object, int statementHandle, int columnIndex) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
|
||||
return sqlite3_column_type(handle, columnIndex);
|
||||
}
|
||||
|
||||
int Java_org_telegram_SQLite_SQLiteCursor_columnIsNull(JNIEnv *env, jobject object, int statementHandle, int columnIndex) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
|
||||
int valType = sqlite3_column_type(handle, columnIndex);
|
||||
return SQLITE_NULL == valType;
|
||||
}
|
||||
|
||||
int Java_org_telegram_SQLite_SQLiteCursor_columnIntValue(JNIEnv *env, jobject object, int statementHandle, int columnIndex) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
|
||||
int valType = sqlite3_column_type(handle, columnIndex);
|
||||
if (SQLITE_NULL == valType) {
|
||||
return 0;
|
||||
}
|
||||
return sqlite3_column_int(handle, columnIndex);
|
||||
}
|
||||
|
||||
long long Java_org_telegram_SQLite_SQLiteCursor_columnLongValue(JNIEnv *env, jobject object, int statementHandle, int columnIndex) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
|
||||
int valType = sqlite3_column_type(handle, columnIndex);
|
||||
if (SQLITE_NULL == valType) {
|
||||
return 0;
|
||||
}
|
||||
return sqlite3_column_int64(handle, columnIndex);
|
||||
}
|
||||
|
||||
double Java_org_telegram_SQLite_SQLiteCursor_columnDoubleValue(JNIEnv *env, jobject object, int statementHandle, int columnIndex) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
|
||||
int valType = sqlite3_column_type(handle, columnIndex);
|
||||
if (SQLITE_NULL == valType) {
|
||||
return 0;
|
||||
}
|
||||
return sqlite3_column_double(handle, columnIndex);
|
||||
}
|
||||
|
||||
jstring Java_org_telegram_SQLite_SQLiteCursor_columnStringValue(JNIEnv *env, jobject object, int statementHandle, int columnIndex) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
|
||||
const char *str = sqlite3_column_text(handle, columnIndex);
|
||||
if (str != 0) {
|
||||
return (*env)->NewStringUTF(env, str);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
jbyteArray Java_org_telegram_SQLite_SQLiteCursor_columnByteArrayValue(JNIEnv *env, jobject object, int statementHandle, int columnIndex) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
|
||||
void *buf = sqlite3_column_blob(handle, columnIndex);
|
||||
int length = sqlite3_column_bytes(handle, columnIndex);
|
||||
if (buf != 0 && length > 0) {
|
||||
jbyteArray result = (*env)->NewByteArray(env, length);
|
||||
(*env)->SetByteArrayRegion(env, result, 0, length, buf);
|
||||
return result;
|
||||
}
|
||||
return 0;
|
||||
}
|
32
TMessagesProj/jni/org_telegram_SQLite_SQLiteDatabase.c
Executable file
32
TMessagesProj/jni/org_telegram_SQLite_SQLiteDatabase.c
Executable file
|
@ -0,0 +1,32 @@
|
|||
#include "org_telegram_SQLite.h"
|
||||
|
||||
void Java_org_telegram_SQLite_SQLiteDatabase_closedb(JNIEnv *env, jobject object, int sqliteHandle) {
|
||||
sqlite3 *handle = (sqlite3 *)sqliteHandle;
|
||||
int err = sqlite3_close(handle);
|
||||
if (SQLITE_OK != err) {
|
||||
throw_sqlite3_exception(env, handle, err);
|
||||
}
|
||||
}
|
||||
|
||||
void Java_org_telegram_SQLite_SQLiteDatabase_beginTransaction(JNIEnv *env, jobject object, int sqliteHandle) {
|
||||
sqlite3 *handle = (sqlite3 *)sqliteHandle;
|
||||
sqlite3_exec(handle, "BEGIN", 0, 0, 0);
|
||||
}
|
||||
|
||||
void Java_org_telegram_SQLite_SQLiteDatabase_commitTransaction(JNIEnv *env, jobject object, int sqliteHandle) {
|
||||
sqlite3 *handle = (sqlite3 *)sqliteHandle;
|
||||
sqlite3_exec(handle, "COMMIT", 0, 0, 0);
|
||||
}
|
||||
|
||||
int Java_org_telegram_SQLite_SQLiteDatabase_opendb(JNIEnv *env, jobject object, jstring fileName) {
|
||||
char const *fileNameStr = (*env)->GetStringUTFChars(env, fileName, 0);
|
||||
sqlite3 *handle = 0;
|
||||
int err = sqlite3_open(fileNameStr, &handle);
|
||||
if (SQLITE_OK != err) {
|
||||
throw_sqlite3_exception(env, handle, err);
|
||||
}
|
||||
if (fileNameStr != 0) {
|
||||
(*env)->ReleaseStringUTFChars(env, fileName, fileNameStr);
|
||||
}
|
||||
return (int)handle;
|
||||
}
|
138
TMessagesProj/jni/org_telegram_SQLite_SQLitePreparedStatement.c
Executable file
138
TMessagesProj/jni/org_telegram_SQLite_SQLitePreparedStatement.c
Executable file
|
@ -0,0 +1,138 @@
|
|||
#include "org_telegram_SQLite.h"
|
||||
|
||||
jfieldID queryArgsCountField;
|
||||
|
||||
jint JNI_OnLoad(JavaVM *vm, void *reserved) {
|
||||
JNIEnv* env = 0;
|
||||
|
||||
if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
jclass class = (*env)->FindClass(env, "org/telegram/SQLite/SQLitePreparedStatement");
|
||||
queryArgsCountField = (*env)->GetFieldID(env, class, "queryArgsCount", "I");
|
||||
|
||||
return JNI_VERSION_1_4;
|
||||
}
|
||||
|
||||
int Java_org_telegram_SQLite_SQLitePreparedStatement_step(JNIEnv* env, jobject object, int statementHandle) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
|
||||
|
||||
int errcode = sqlite3_step(handle);
|
||||
if (errcode == SQLITE_ROW) {
|
||||
return 0;
|
||||
} else if(errcode == SQLITE_DONE) {
|
||||
return 1;
|
||||
} else if(errcode == SQLITE_BUSY) {
|
||||
return -1;
|
||||
}
|
||||
throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
|
||||
}
|
||||
|
||||
int Java_org_telegram_SQLite_SQLitePreparedStatement_prepare(JNIEnv *env, jobject object, int sqliteHandle, jstring sql) {
|
||||
sqlite3* handle = (sqlite3 *)sqliteHandle;
|
||||
|
||||
char const *sqlStr = (*env)->GetStringUTFChars(env, sql, 0);
|
||||
|
||||
sqlite3_stmt *stmt_handle;
|
||||
|
||||
int errcode = sqlite3_prepare_v2(handle, sqlStr, -1, &stmt_handle, 0);
|
||||
if (SQLITE_OK != errcode) {
|
||||
throw_sqlite3_exception(env, handle, errcode);
|
||||
} else {
|
||||
int argsCount = sqlite3_bind_parameter_count(stmt_handle);
|
||||
(*env)->SetIntField(env, object, queryArgsCountField, argsCount);
|
||||
}
|
||||
|
||||
if (sqlStr != 0) {
|
||||
(*env)->ReleaseStringUTFChars(env, sql, sqlStr);
|
||||
}
|
||||
|
||||
return (int)stmt_handle;
|
||||
}
|
||||
|
||||
void Java_org_telegram_SQLite_SQLitePreparedStatement_reset(JNIEnv *env, jobject object, int statementHandle) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
|
||||
|
||||
int errcode = sqlite3_reset(handle);
|
||||
if (SQLITE_OK != errcode) {
|
||||
throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
|
||||
}
|
||||
}
|
||||
|
||||
void Java_org_telegram_SQLite_SQLitePreparedStatement_finalize(JNIEnv *env, jobject object, int statementHandle) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
|
||||
|
||||
int errcode = sqlite3_finalize (handle);
|
||||
if (SQLITE_OK != errcode) {
|
||||
throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
|
||||
}
|
||||
}
|
||||
|
||||
void Java_org_telegram_SQLite_SQLitePreparedStatement_bindByteArray(JNIEnv *env, jobject object, int statementHandle, int index, jbyteArray value) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
|
||||
|
||||
const void *buf = (*env)->GetByteArrayElements(env, value, 0);
|
||||
int length = (*env)->GetArrayLength(env, value);
|
||||
|
||||
int errcode = sqlite3_bind_blob(handle, index, buf, length, SQLITE_STATIC);
|
||||
if (SQLITE_OK != errcode) {
|
||||
throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
|
||||
}
|
||||
|
||||
if (buf != 0) {
|
||||
(*env)->ReleaseByteArrayElements(env, value, buf, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void Java_org_telegram_SQLite_SQLitePreparedStatement_bindString(JNIEnv *env, jobject object, int statementHandle, int index, jstring value) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt*)statementHandle;
|
||||
|
||||
char const *valueStr = (*env)->GetStringUTFChars(env, value, 0);
|
||||
|
||||
int errcode = sqlite3_bind_text(handle, index, valueStr, -1, SQLITE_TRANSIENT);
|
||||
if (SQLITE_OK != errcode) {
|
||||
throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
|
||||
}
|
||||
|
||||
if (valueStr != 0) {
|
||||
(*env)->ReleaseStringUTFChars(env, value, valueStr);
|
||||
}
|
||||
}
|
||||
|
||||
void Java_org_telegram_SQLite_SQLitePreparedStatement_bindInt(JNIEnv *env, jobject object, int statementHandle, int index, int value) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt*)statementHandle;
|
||||
|
||||
int errcode = sqlite3_bind_int(handle, index, value);
|
||||
if (SQLITE_OK != errcode) {
|
||||
throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
|
||||
}
|
||||
}
|
||||
|
||||
void Java_org_telegram_SQLite_SQLitePreparedStatement_bindLong(JNIEnv *env, jobject object, int statementHandle, int index, long long value) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt*)statementHandle;
|
||||
|
||||
int errcode = sqlite3_bind_int64(handle, index, value);
|
||||
if (SQLITE_OK != errcode) {
|
||||
throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
|
||||
}
|
||||
}
|
||||
|
||||
void Java_org_telegram_SQLite_SQLitePreparedStatement_bindDouble(JNIEnv* env, jobject object, int statementHandle, int index, double value) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt*)statementHandle;
|
||||
|
||||
int errcode = sqlite3_bind_double(handle, index, value);
|
||||
if (SQLITE_OK != errcode) {
|
||||
throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
|
||||
}
|
||||
}
|
||||
|
||||
void Java_org_telegram_SQLite_SQLitePreparedStatement_bindNull(JNIEnv* env, jobject object, int statementHandle, int index) {
|
||||
sqlite3_stmt *handle = (sqlite3_stmt*)statementHandle;
|
||||
|
||||
int errcode = sqlite3_bind_null(handle, index);
|
||||
if (SQLITE_OK != errcode) {
|
||||
throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
|
||||
}
|
||||
}
|
||||
|
140460
TMessagesProj/jni/sqlite3.c
Normal file
140460
TMessagesProj/jni/sqlite3.c
Normal file
File diff suppressed because it is too large
Load diff
7245
TMessagesProj/jni/sqlite3.h
Normal file
7245
TMessagesProj/jni/sqlite3.h
Normal file
File diff suppressed because it is too large
Load diff
484
TMessagesProj/jni/sqlite3ext.h
Normal file
484
TMessagesProj/jni/sqlite3ext.h
Normal file
|
@ -0,0 +1,484 @@
|
|||
/*
|
||||
** 2006 June 7
|
||||
**
|
||||
** The author disclaims copyright to this source code. In place of
|
||||
** a legal notice, here is a blessing:
|
||||
**
|
||||
** May you do good and not evil.
|
||||
** May you find forgiveness for yourself and forgive others.
|
||||
** May you share freely, never taking more than you give.
|
||||
**
|
||||
*************************************************************************
|
||||
** This header file defines the SQLite interface for use by
|
||||
** shared libraries that want to be imported as extensions into
|
||||
** an SQLite instance. Shared libraries that intend to be loaded
|
||||
** as extensions by SQLite should #include this file instead of
|
||||
** sqlite3.h.
|
||||
*/
|
||||
#ifndef _SQLITE3EXT_H_
|
||||
#define _SQLITE3EXT_H_
|
||||
#include "sqlite3.h"
|
||||
|
||||
typedef struct sqlite3_api_routines sqlite3_api_routines;
|
||||
|
||||
/*
|
||||
** The following structure holds pointers to all of the SQLite API
|
||||
** routines.
|
||||
**
|
||||
** WARNING: In order to maintain backwards compatibility, add new
|
||||
** interfaces to the end of this structure only. If you insert new
|
||||
** interfaces in the middle of this structure, then older different
|
||||
** versions of SQLite will not be able to load each others' shared
|
||||
** libraries!
|
||||
*/
|
||||
struct sqlite3_api_routines {
|
||||
void * (*aggregate_context)(sqlite3_context*,int nBytes);
|
||||
int (*aggregate_count)(sqlite3_context*);
|
||||
int (*bind_blob)(sqlite3_stmt*,int,const void*,int n,void(*)(void*));
|
||||
int (*bind_double)(sqlite3_stmt*,int,double);
|
||||
int (*bind_int)(sqlite3_stmt*,int,int);
|
||||
int (*bind_int64)(sqlite3_stmt*,int,sqlite_int64);
|
||||
int (*bind_null)(sqlite3_stmt*,int);
|
||||
int (*bind_parameter_count)(sqlite3_stmt*);
|
||||
int (*bind_parameter_index)(sqlite3_stmt*,const char*zName);
|
||||
const char * (*bind_parameter_name)(sqlite3_stmt*,int);
|
||||
int (*bind_text)(sqlite3_stmt*,int,const char*,int n,void(*)(void*));
|
||||
int (*bind_text16)(sqlite3_stmt*,int,const void*,int,void(*)(void*));
|
||||
int (*bind_value)(sqlite3_stmt*,int,const sqlite3_value*);
|
||||
int (*busy_handler)(sqlite3*,int(*)(void*,int),void*);
|
||||
int (*busy_timeout)(sqlite3*,int ms);
|
||||
int (*changes)(sqlite3*);
|
||||
int (*close)(sqlite3*);
|
||||
int (*collation_needed)(sqlite3*,void*,void(*)(void*,sqlite3*,
|
||||
int eTextRep,const char*));
|
||||
int (*collation_needed16)(sqlite3*,void*,void(*)(void*,sqlite3*,
|
||||
int eTextRep,const void*));
|
||||
const void * (*column_blob)(sqlite3_stmt*,int iCol);
|
||||
int (*column_bytes)(sqlite3_stmt*,int iCol);
|
||||
int (*column_bytes16)(sqlite3_stmt*,int iCol);
|
||||
int (*column_count)(sqlite3_stmt*pStmt);
|
||||
const char * (*column_database_name)(sqlite3_stmt*,int);
|
||||
const void * (*column_database_name16)(sqlite3_stmt*,int);
|
||||
const char * (*column_decltype)(sqlite3_stmt*,int i);
|
||||
const void * (*column_decltype16)(sqlite3_stmt*,int);
|
||||
double (*column_double)(sqlite3_stmt*,int iCol);
|
||||
int (*column_int)(sqlite3_stmt*,int iCol);
|
||||
sqlite_int64 (*column_int64)(sqlite3_stmt*,int iCol);
|
||||
const char * (*column_name)(sqlite3_stmt*,int);
|
||||
const void * (*column_name16)(sqlite3_stmt*,int);
|
||||
const char * (*column_origin_name)(sqlite3_stmt*,int);
|
||||
const void * (*column_origin_name16)(sqlite3_stmt*,int);
|
||||
const char * (*column_table_name)(sqlite3_stmt*,int);
|
||||
const void * (*column_table_name16)(sqlite3_stmt*,int);
|
||||
const unsigned char * (*column_text)(sqlite3_stmt*,int iCol);
|
||||
const void * (*column_text16)(sqlite3_stmt*,int iCol);
|
||||
int (*column_type)(sqlite3_stmt*,int iCol);
|
||||
sqlite3_value* (*column_value)(sqlite3_stmt*,int iCol);
|
||||
void * (*commit_hook)(sqlite3*,int(*)(void*),void*);
|
||||
int (*complete)(const char*sql);
|
||||
int (*complete16)(const void*sql);
|
||||
int (*create_collation)(sqlite3*,const char*,int,void*,
|
||||
int(*)(void*,int,const void*,int,const void*));
|
||||
int (*create_collation16)(sqlite3*,const void*,int,void*,
|
||||
int(*)(void*,int,const void*,int,const void*));
|
||||
int (*create_function)(sqlite3*,const char*,int,int,void*,
|
||||
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
|
||||
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
||||
void (*xFinal)(sqlite3_context*));
|
||||
int (*create_function16)(sqlite3*,const void*,int,int,void*,
|
||||
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
|
||||
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
||||
void (*xFinal)(sqlite3_context*));
|
||||
int (*create_module)(sqlite3*,const char*,const sqlite3_module*,void*);
|
||||
int (*data_count)(sqlite3_stmt*pStmt);
|
||||
sqlite3 * (*db_handle)(sqlite3_stmt*);
|
||||
int (*declare_vtab)(sqlite3*,const char*);
|
||||
int (*enable_shared_cache)(int);
|
||||
int (*errcode)(sqlite3*db);
|
||||
const char * (*errmsg)(sqlite3*);
|
||||
const void * (*errmsg16)(sqlite3*);
|
||||
int (*exec)(sqlite3*,const char*,sqlite3_callback,void*,char**);
|
||||
int (*expired)(sqlite3_stmt*);
|
||||
int (*finalize)(sqlite3_stmt*pStmt);
|
||||
void (*free)(void*);
|
||||
void (*free_table)(char**result);
|
||||
int (*get_autocommit)(sqlite3*);
|
||||
void * (*get_auxdata)(sqlite3_context*,int);
|
||||
int (*get_table)(sqlite3*,const char*,char***,int*,int*,char**);
|
||||
int (*global_recover)(void);
|
||||
void (*interruptx)(sqlite3*);
|
||||
sqlite_int64 (*last_insert_rowid)(sqlite3*);
|
||||
const char * (*libversion)(void);
|
||||
int (*libversion_number)(void);
|
||||
void *(*malloc)(int);
|
||||
char * (*mprintf)(const char*,...);
|
||||
int (*open)(const char*,sqlite3**);
|
||||
int (*open16)(const void*,sqlite3**);
|
||||
int (*prepare)(sqlite3*,const char*,int,sqlite3_stmt**,const char**);
|
||||
int (*prepare16)(sqlite3*,const void*,int,sqlite3_stmt**,const void**);
|
||||
void * (*profile)(sqlite3*,void(*)(void*,const char*,sqlite_uint64),void*);
|
||||
void (*progress_handler)(sqlite3*,int,int(*)(void*),void*);
|
||||
void *(*realloc)(void*,int);
|
||||
int (*reset)(sqlite3_stmt*pStmt);
|
||||
void (*result_blob)(sqlite3_context*,const void*,int,void(*)(void*));
|
||||
void (*result_double)(sqlite3_context*,double);
|
||||
void (*result_error)(sqlite3_context*,const char*,int);
|
||||
void (*result_error16)(sqlite3_context*,const void*,int);
|
||||
void (*result_int)(sqlite3_context*,int);
|
||||
void (*result_int64)(sqlite3_context*,sqlite_int64);
|
||||
void (*result_null)(sqlite3_context*);
|
||||
void (*result_text)(sqlite3_context*,const char*,int,void(*)(void*));
|
||||
void (*result_text16)(sqlite3_context*,const void*,int,void(*)(void*));
|
||||
void (*result_text16be)(sqlite3_context*,const void*,int,void(*)(void*));
|
||||
void (*result_text16le)(sqlite3_context*,const void*,int,void(*)(void*));
|
||||
void (*result_value)(sqlite3_context*,sqlite3_value*);
|
||||
void * (*rollback_hook)(sqlite3*,void(*)(void*),void*);
|
||||
int (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*,
|
||||
const char*,const char*),void*);
|
||||
void (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*));
|
||||
char * (*snprintf)(int,char*,const char*,...);
|
||||
int (*step)(sqlite3_stmt*);
|
||||
int (*table_column_metadata)(sqlite3*,const char*,const char*,const char*,
|
||||
char const**,char const**,int*,int*,int*);
|
||||
void (*thread_cleanup)(void);
|
||||
int (*total_changes)(sqlite3*);
|
||||
void * (*trace)(sqlite3*,void(*xTrace)(void*,const char*),void*);
|
||||
int (*transfer_bindings)(sqlite3_stmt*,sqlite3_stmt*);
|
||||
void * (*update_hook)(sqlite3*,void(*)(void*,int ,char const*,char const*,
|
||||
sqlite_int64),void*);
|
||||
void * (*user_data)(sqlite3_context*);
|
||||
const void * (*value_blob)(sqlite3_value*);
|
||||
int (*value_bytes)(sqlite3_value*);
|
||||
int (*value_bytes16)(sqlite3_value*);
|
||||
double (*value_double)(sqlite3_value*);
|
||||
int (*value_int)(sqlite3_value*);
|
||||
sqlite_int64 (*value_int64)(sqlite3_value*);
|
||||
int (*value_numeric_type)(sqlite3_value*);
|
||||
const unsigned char * (*value_text)(sqlite3_value*);
|
||||
const void * (*value_text16)(sqlite3_value*);
|
||||
const void * (*value_text16be)(sqlite3_value*);
|
||||
const void * (*value_text16le)(sqlite3_value*);
|
||||
int (*value_type)(sqlite3_value*);
|
||||
char *(*vmprintf)(const char*,va_list);
|
||||
/* Added ??? */
|
||||
int (*overload_function)(sqlite3*, const char *zFuncName, int nArg);
|
||||
/* Added by 3.3.13 */
|
||||
int (*prepare_v2)(sqlite3*,const char*,int,sqlite3_stmt**,const char**);
|
||||
int (*prepare16_v2)(sqlite3*,const void*,int,sqlite3_stmt**,const void**);
|
||||
int (*clear_bindings)(sqlite3_stmt*);
|
||||
/* Added by 3.4.1 */
|
||||
int (*create_module_v2)(sqlite3*,const char*,const sqlite3_module*,void*,
|
||||
void (*xDestroy)(void *));
|
||||
/* Added by 3.5.0 */
|
||||
int (*bind_zeroblob)(sqlite3_stmt*,int,int);
|
||||
int (*blob_bytes)(sqlite3_blob*);
|
||||
int (*blob_close)(sqlite3_blob*);
|
||||
int (*blob_open)(sqlite3*,const char*,const char*,const char*,sqlite3_int64,
|
||||
int,sqlite3_blob**);
|
||||
int (*blob_read)(sqlite3_blob*,void*,int,int);
|
||||
int (*blob_write)(sqlite3_blob*,const void*,int,int);
|
||||
int (*create_collation_v2)(sqlite3*,const char*,int,void*,
|
||||
int(*)(void*,int,const void*,int,const void*),
|
||||
void(*)(void*));
|
||||
int (*file_control)(sqlite3*,const char*,int,void*);
|
||||
sqlite3_int64 (*memory_highwater)(int);
|
||||
sqlite3_int64 (*memory_used)(void);
|
||||
sqlite3_mutex *(*mutex_alloc)(int);
|
||||
void (*mutex_enter)(sqlite3_mutex*);
|
||||
void (*mutex_free)(sqlite3_mutex*);
|
||||
void (*mutex_leave)(sqlite3_mutex*);
|
||||
int (*mutex_try)(sqlite3_mutex*);
|
||||
int (*open_v2)(const char*,sqlite3**,int,const char*);
|
||||
int (*release_memory)(int);
|
||||
void (*result_error_nomem)(sqlite3_context*);
|
||||
void (*result_error_toobig)(sqlite3_context*);
|
||||
int (*sleep)(int);
|
||||
void (*soft_heap_limit)(int);
|
||||
sqlite3_vfs *(*vfs_find)(const char*);
|
||||
int (*vfs_register)(sqlite3_vfs*,int);
|
||||
int (*vfs_unregister)(sqlite3_vfs*);
|
||||
int (*xthreadsafe)(void);
|
||||
void (*result_zeroblob)(sqlite3_context*,int);
|
||||
void (*result_error_code)(sqlite3_context*,int);
|
||||
int (*test_control)(int, ...);
|
||||
void (*randomness)(int,void*);
|
||||
sqlite3 *(*context_db_handle)(sqlite3_context*);
|
||||
int (*extended_result_codes)(sqlite3*,int);
|
||||
int (*limit)(sqlite3*,int,int);
|
||||
sqlite3_stmt *(*next_stmt)(sqlite3*,sqlite3_stmt*);
|
||||
const char *(*sql)(sqlite3_stmt*);
|
||||
int (*status)(int,int*,int*,int);
|
||||
int (*backup_finish)(sqlite3_backup*);
|
||||
sqlite3_backup *(*backup_init)(sqlite3*,const char*,sqlite3*,const char*);
|
||||
int (*backup_pagecount)(sqlite3_backup*);
|
||||
int (*backup_remaining)(sqlite3_backup*);
|
||||
int (*backup_step)(sqlite3_backup*,int);
|
||||
const char *(*compileoption_get)(int);
|
||||
int (*compileoption_used)(const char*);
|
||||
int (*create_function_v2)(sqlite3*,const char*,int,int,void*,
|
||||
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
|
||||
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
||||
void (*xFinal)(sqlite3_context*),
|
||||
void(*xDestroy)(void*));
|
||||
int (*db_config)(sqlite3*,int,...);
|
||||
sqlite3_mutex *(*db_mutex)(sqlite3*);
|
||||
int (*db_status)(sqlite3*,int,int*,int*,int);
|
||||
int (*extended_errcode)(sqlite3*);
|
||||
void (*log)(int,const char*,...);
|
||||
sqlite3_int64 (*soft_heap_limit64)(sqlite3_int64);
|
||||
const char *(*sourceid)(void);
|
||||
int (*stmt_status)(sqlite3_stmt*,int,int);
|
||||
int (*strnicmp)(const char*,const char*,int);
|
||||
int (*unlock_notify)(sqlite3*,void(*)(void**,int),void*);
|
||||
int (*wal_autocheckpoint)(sqlite3*,int);
|
||||
int (*wal_checkpoint)(sqlite3*,const char*);
|
||||
void *(*wal_hook)(sqlite3*,int(*)(void*,sqlite3*,const char*,int),void*);
|
||||
int (*blob_reopen)(sqlite3_blob*,sqlite3_int64);
|
||||
int (*vtab_config)(sqlite3*,int op,...);
|
||||
int (*vtab_on_conflict)(sqlite3*);
|
||||
/* Version 3.7.16 and later */
|
||||
int (*close_v2)(sqlite3*);
|
||||
const char *(*db_filename)(sqlite3*,const char*);
|
||||
int (*db_readonly)(sqlite3*,const char*);
|
||||
int (*db_release_memory)(sqlite3*);
|
||||
const char *(*errstr)(int);
|
||||
int (*stmt_busy)(sqlite3_stmt*);
|
||||
int (*stmt_readonly)(sqlite3_stmt*);
|
||||
int (*stricmp)(const char*,const char*);
|
||||
int (*uri_boolean)(const char*,const char*,int);
|
||||
sqlite3_int64 (*uri_int64)(const char*,const char*,sqlite3_int64);
|
||||
const char *(*uri_parameter)(const char*,const char*);
|
||||
char *(*vsnprintf)(int,char*,const char*,va_list);
|
||||
int (*wal_checkpoint_v2)(sqlite3*,const char*,int,int*,int*);
|
||||
};
|
||||
|
||||
/*
|
||||
** The following macros redefine the API routines so that they are
|
||||
** redirected throught the global sqlite3_api structure.
|
||||
**
|
||||
** This header file is also used by the loadext.c source file
|
||||
** (part of the main SQLite library - not an extension) so that
|
||||
** it can get access to the sqlite3_api_routines structure
|
||||
** definition. But the main library does not want to redefine
|
||||
** the API. So the redefinition macros are only valid if the
|
||||
** SQLITE_CORE macros is undefined.
|
||||
*/
|
||||
#ifndef SQLITE_CORE
|
||||
#define sqlite3_aggregate_context sqlite3_api->aggregate_context
|
||||
#ifndef SQLITE_OMIT_DEPRECATED
|
||||
#define sqlite3_aggregate_count sqlite3_api->aggregate_count
|
||||
#endif
|
||||
#define sqlite3_bind_blob sqlite3_api->bind_blob
|
||||
#define sqlite3_bind_double sqlite3_api->bind_double
|
||||
#define sqlite3_bind_int sqlite3_api->bind_int
|
||||
#define sqlite3_bind_int64 sqlite3_api->bind_int64
|
||||
#define sqlite3_bind_null sqlite3_api->bind_null
|
||||
#define sqlite3_bind_parameter_count sqlite3_api->bind_parameter_count
|
||||
#define sqlite3_bind_parameter_index sqlite3_api->bind_parameter_index
|
||||
#define sqlite3_bind_parameter_name sqlite3_api->bind_parameter_name
|
||||
#define sqlite3_bind_text sqlite3_api->bind_text
|
||||
#define sqlite3_bind_text16 sqlite3_api->bind_text16
|
||||
#define sqlite3_bind_value sqlite3_api->bind_value
|
||||
#define sqlite3_busy_handler sqlite3_api->busy_handler
|
||||
#define sqlite3_busy_timeout sqlite3_api->busy_timeout
|
||||
#define sqlite3_changes sqlite3_api->changes
|
||||
#define sqlite3_close sqlite3_api->close
|
||||
#define sqlite3_collation_needed sqlite3_api->collation_needed
|
||||
#define sqlite3_collation_needed16 sqlite3_api->collation_needed16
|
||||
#define sqlite3_column_blob sqlite3_api->column_blob
|
||||
#define sqlite3_column_bytes sqlite3_api->column_bytes
|
||||
#define sqlite3_column_bytes16 sqlite3_api->column_bytes16
|
||||
#define sqlite3_column_count sqlite3_api->column_count
|
||||
#define sqlite3_column_database_name sqlite3_api->column_database_name
|
||||
#define sqlite3_column_database_name16 sqlite3_api->column_database_name16
|
||||
#define sqlite3_column_decltype sqlite3_api->column_decltype
|
||||
#define sqlite3_column_decltype16 sqlite3_api->column_decltype16
|
||||
#define sqlite3_column_double sqlite3_api->column_double
|
||||
#define sqlite3_column_int sqlite3_api->column_int
|
||||
#define sqlite3_column_int64 sqlite3_api->column_int64
|
||||
#define sqlite3_column_name sqlite3_api->column_name
|
||||
#define sqlite3_column_name16 sqlite3_api->column_name16
|
||||
#define sqlite3_column_origin_name sqlite3_api->column_origin_name
|
||||
#define sqlite3_column_origin_name16 sqlite3_api->column_origin_name16
|
||||
#define sqlite3_column_table_name sqlite3_api->column_table_name
|
||||
#define sqlite3_column_table_name16 sqlite3_api->column_table_name16
|
||||
#define sqlite3_column_text sqlite3_api->column_text
|
||||
#define sqlite3_column_text16 sqlite3_api->column_text16
|
||||
#define sqlite3_column_type sqlite3_api->column_type
|
||||
#define sqlite3_column_value sqlite3_api->column_value
|
||||
#define sqlite3_commit_hook sqlite3_api->commit_hook
|
||||
#define sqlite3_complete sqlite3_api->complete
|
||||
#define sqlite3_complete16 sqlite3_api->complete16
|
||||
#define sqlite3_create_collation sqlite3_api->create_collation
|
||||
#define sqlite3_create_collation16 sqlite3_api->create_collation16
|
||||
#define sqlite3_create_function sqlite3_api->create_function
|
||||
#define sqlite3_create_function16 sqlite3_api->create_function16
|
||||
#define sqlite3_create_module sqlite3_api->create_module
|
||||
#define sqlite3_create_module_v2 sqlite3_api->create_module_v2
|
||||
#define sqlite3_data_count sqlite3_api->data_count
|
||||
#define sqlite3_db_handle sqlite3_api->db_handle
|
||||
#define sqlite3_declare_vtab sqlite3_api->declare_vtab
|
||||
#define sqlite3_enable_shared_cache sqlite3_api->enable_shared_cache
|
||||
#define sqlite3_errcode sqlite3_api->errcode
|
||||
#define sqlite3_errmsg sqlite3_api->errmsg
|
||||
#define sqlite3_errmsg16 sqlite3_api->errmsg16
|
||||
#define sqlite3_exec sqlite3_api->exec
|
||||
#ifndef SQLITE_OMIT_DEPRECATED
|
||||
#define sqlite3_expired sqlite3_api->expired
|
||||
#endif
|
||||
#define sqlite3_finalize sqlite3_api->finalize
|
||||
#define sqlite3_free sqlite3_api->free
|
||||
#define sqlite3_free_table sqlite3_api->free_table
|
||||
#define sqlite3_get_autocommit sqlite3_api->get_autocommit
|
||||
#define sqlite3_get_auxdata sqlite3_api->get_auxdata
|
||||
#define sqlite3_get_table sqlite3_api->get_table
|
||||
#ifndef SQLITE_OMIT_DEPRECATED
|
||||
#define sqlite3_global_recover sqlite3_api->global_recover
|
||||
#endif
|
||||
#define sqlite3_interrupt sqlite3_api->interruptx
|
||||
#define sqlite3_last_insert_rowid sqlite3_api->last_insert_rowid
|
||||
#define sqlite3_libversion sqlite3_api->libversion
|
||||
#define sqlite3_libversion_number sqlite3_api->libversion_number
|
||||
#define sqlite3_malloc sqlite3_api->malloc
|
||||
#define sqlite3_mprintf sqlite3_api->mprintf
|
||||
#define sqlite3_open sqlite3_api->open
|
||||
#define sqlite3_open16 sqlite3_api->open16
|
||||
#define sqlite3_prepare sqlite3_api->prepare
|
||||
#define sqlite3_prepare16 sqlite3_api->prepare16
|
||||
#define sqlite3_prepare_v2 sqlite3_api->prepare_v2
|
||||
#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2
|
||||
#define sqlite3_profile sqlite3_api->profile
|
||||
#define sqlite3_progress_handler sqlite3_api->progress_handler
|
||||
#define sqlite3_realloc sqlite3_api->realloc
|
||||
#define sqlite3_reset sqlite3_api->reset
|
||||
#define sqlite3_result_blob sqlite3_api->result_blob
|
||||
#define sqlite3_result_double sqlite3_api->result_double
|
||||
#define sqlite3_result_error sqlite3_api->result_error
|
||||
#define sqlite3_result_error16 sqlite3_api->result_error16
|
||||
#define sqlite3_result_int sqlite3_api->result_int
|
||||
#define sqlite3_result_int64 sqlite3_api->result_int64
|
||||
#define sqlite3_result_null sqlite3_api->result_null
|
||||
#define sqlite3_result_text sqlite3_api->result_text
|
||||
#define sqlite3_result_text16 sqlite3_api->result_text16
|
||||
#define sqlite3_result_text16be sqlite3_api->result_text16be
|
||||
#define sqlite3_result_text16le sqlite3_api->result_text16le
|
||||
#define sqlite3_result_value sqlite3_api->result_value
|
||||
#define sqlite3_rollback_hook sqlite3_api->rollback_hook
|
||||
#define sqlite3_set_authorizer sqlite3_api->set_authorizer
|
||||
#define sqlite3_set_auxdata sqlite3_api->set_auxdata
|
||||
#define sqlite3_snprintf sqlite3_api->snprintf
|
||||
#define sqlite3_step sqlite3_api->step
|
||||
#define sqlite3_table_column_metadata sqlite3_api->table_column_metadata
|
||||
#define sqlite3_thread_cleanup sqlite3_api->thread_cleanup
|
||||
#define sqlite3_total_changes sqlite3_api->total_changes
|
||||
#define sqlite3_trace sqlite3_api->trace
|
||||
#ifndef SQLITE_OMIT_DEPRECATED
|
||||
#define sqlite3_transfer_bindings sqlite3_api->transfer_bindings
|
||||
#endif
|
||||
#define sqlite3_update_hook sqlite3_api->update_hook
|
||||
#define sqlite3_user_data sqlite3_api->user_data
|
||||
#define sqlite3_value_blob sqlite3_api->value_blob
|
||||
#define sqlite3_value_bytes sqlite3_api->value_bytes
|
||||
#define sqlite3_value_bytes16 sqlite3_api->value_bytes16
|
||||
#define sqlite3_value_double sqlite3_api->value_double
|
||||
#define sqlite3_value_int sqlite3_api->value_int
|
||||
#define sqlite3_value_int64 sqlite3_api->value_int64
|
||||
#define sqlite3_value_numeric_type sqlite3_api->value_numeric_type
|
||||
#define sqlite3_value_text sqlite3_api->value_text
|
||||
#define sqlite3_value_text16 sqlite3_api->value_text16
|
||||
#define sqlite3_value_text16be sqlite3_api->value_text16be
|
||||
#define sqlite3_value_text16le sqlite3_api->value_text16le
|
||||
#define sqlite3_value_type sqlite3_api->value_type
|
||||
#define sqlite3_vmprintf sqlite3_api->vmprintf
|
||||
#define sqlite3_overload_function sqlite3_api->overload_function
|
||||
#define sqlite3_prepare_v2 sqlite3_api->prepare_v2
|
||||
#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2
|
||||
#define sqlite3_clear_bindings sqlite3_api->clear_bindings
|
||||
#define sqlite3_bind_zeroblob sqlite3_api->bind_zeroblob
|
||||
#define sqlite3_blob_bytes sqlite3_api->blob_bytes
|
||||
#define sqlite3_blob_close sqlite3_api->blob_close
|
||||
#define sqlite3_blob_open sqlite3_api->blob_open
|
||||
#define sqlite3_blob_read sqlite3_api->blob_read
|
||||
#define sqlite3_blob_write sqlite3_api->blob_write
|
||||
#define sqlite3_create_collation_v2 sqlite3_api->create_collation_v2
|
||||
#define sqlite3_file_control sqlite3_api->file_control
|
||||
#define sqlite3_memory_highwater sqlite3_api->memory_highwater
|
||||
#define sqlite3_memory_used sqlite3_api->memory_used
|
||||
#define sqlite3_mutex_alloc sqlite3_api->mutex_alloc
|
||||
#define sqlite3_mutex_enter sqlite3_api->mutex_enter
|
||||
#define sqlite3_mutex_free sqlite3_api->mutex_free
|
||||
#define sqlite3_mutex_leave sqlite3_api->mutex_leave
|
||||
#define sqlite3_mutex_try sqlite3_api->mutex_try
|
||||
#define sqlite3_open_v2 sqlite3_api->open_v2
|
||||
#define sqlite3_release_memory sqlite3_api->release_memory
|
||||
#define sqlite3_result_error_nomem sqlite3_api->result_error_nomem
|
||||
#define sqlite3_result_error_toobig sqlite3_api->result_error_toobig
|
||||
#define sqlite3_sleep sqlite3_api->sleep
|
||||
#define sqlite3_soft_heap_limit sqlite3_api->soft_heap_limit
|
||||
#define sqlite3_vfs_find sqlite3_api->vfs_find
|
||||
#define sqlite3_vfs_register sqlite3_api->vfs_register
|
||||
#define sqlite3_vfs_unregister sqlite3_api->vfs_unregister
|
||||
#define sqlite3_threadsafe sqlite3_api->xthreadsafe
|
||||
#define sqlite3_result_zeroblob sqlite3_api->result_zeroblob
|
||||
#define sqlite3_result_error_code sqlite3_api->result_error_code
|
||||
#define sqlite3_test_control sqlite3_api->test_control
|
||||
#define sqlite3_randomness sqlite3_api->randomness
|
||||
#define sqlite3_context_db_handle sqlite3_api->context_db_handle
|
||||
#define sqlite3_extended_result_codes sqlite3_api->extended_result_codes
|
||||
#define sqlite3_limit sqlite3_api->limit
|
||||
#define sqlite3_next_stmt sqlite3_api->next_stmt
|
||||
#define sqlite3_sql sqlite3_api->sql
|
||||
#define sqlite3_status sqlite3_api->status
|
||||
#define sqlite3_backup_finish sqlite3_api->backup_finish
|
||||
#define sqlite3_backup_init sqlite3_api->backup_init
|
||||
#define sqlite3_backup_pagecount sqlite3_api->backup_pagecount
|
||||
#define sqlite3_backup_remaining sqlite3_api->backup_remaining
|
||||
#define sqlite3_backup_step sqlite3_api->backup_step
|
||||
#define sqlite3_compileoption_get sqlite3_api->compileoption_get
|
||||
#define sqlite3_compileoption_used sqlite3_api->compileoption_used
|
||||
#define sqlite3_create_function_v2 sqlite3_api->create_function_v2
|
||||
#define sqlite3_db_config sqlite3_api->db_config
|
||||
#define sqlite3_db_mutex sqlite3_api->db_mutex
|
||||
#define sqlite3_db_status sqlite3_api->db_status
|
||||
#define sqlite3_extended_errcode sqlite3_api->extended_errcode
|
||||
#define sqlite3_log sqlite3_api->log
|
||||
#define sqlite3_soft_heap_limit64 sqlite3_api->soft_heap_limit64
|
||||
#define sqlite3_sourceid sqlite3_api->sourceid
|
||||
#define sqlite3_stmt_status sqlite3_api->stmt_status
|
||||
#define sqlite3_strnicmp sqlite3_api->strnicmp
|
||||
#define sqlite3_unlock_notify sqlite3_api->unlock_notify
|
||||
#define sqlite3_wal_autocheckpoint sqlite3_api->wal_autocheckpoint
|
||||
#define sqlite3_wal_checkpoint sqlite3_api->wal_checkpoint
|
||||
#define sqlite3_wal_hook sqlite3_api->wal_hook
|
||||
#define sqlite3_blob_reopen sqlite3_api->blob_reopen
|
||||
#define sqlite3_vtab_config sqlite3_api->vtab_config
|
||||
#define sqlite3_vtab_on_conflict sqlite3_api->vtab_on_conflict
|
||||
/* Version 3.7.16 and later */
|
||||
#define sqlite3_close_v2 sqlite3_api->close_v2
|
||||
#define sqlite3_db_filename sqlite3_api->db_filename
|
||||
#define sqlite3_db_readonly sqlite3_api->db_readonly
|
||||
#define sqlite3_db_release_memory sqlite3_api->db_release_memory
|
||||
#define sqlite3_errstr sqlite3_api->errstr
|
||||
#define sqlite3_stmt_busy sqlite3_api->stmt_busy
|
||||
#define sqlite3_stmt_readonly sqlite3_api->stmt_readonly
|
||||
#define sqlite3_stricmp sqlite3_api->stricmp
|
||||
#define sqlite3_uri_boolean sqlite3_api->uri_boolean
|
||||
#define sqlite3_uri_int64 sqlite3_api->uri_int64
|
||||
#define sqlite3_uri_parameter sqlite3_api->uri_parameter
|
||||
#define sqlite3_uri_vsnprintf sqlite3_api->vsnprintf
|
||||
#define sqlite3_wal_checkpoint_v2 sqlite3_api->wal_checkpoint_v2
|
||||
#endif /* SQLITE_CORE */
|
||||
|
||||
#ifndef SQLITE_CORE
|
||||
/* This case when the file really is being compiled as a loadable
|
||||
** extension */
|
||||
# define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0;
|
||||
# define SQLITE_EXTENSION_INIT2(v) sqlite3_api=v;
|
||||
#else
|
||||
/* This case when the file is being statically linked into the
|
||||
** application */
|
||||
# define SQLITE_EXTENSION_INIT1 /*no-op*/
|
||||
# define SQLITE_EXTENSION_INIT2(v) (void)v; /* unused parameter */
|
||||
#endif
|
||||
|
||||
#endif /* _SQLITE3EXT_H_ */
|
BIN
TMessagesProj/libs/HockeySDK-3.0.0.jar
Normal file
BIN
TMessagesProj/libs/HockeySDK-3.0.0.jar
Normal file
Binary file not shown.
BIN
TMessagesProj/libs/armeabi-v7a/libtmessages.so
Executable file
BIN
TMessagesProj/libs/armeabi-v7a/libtmessages.so
Executable file
Binary file not shown.
BIN
TMessagesProj/libs/armeabi/libtmessages.so
Executable file
BIN
TMessagesProj/libs/armeabi/libtmessages.so
Executable file
Binary file not shown.
BIN
TMessagesProj/libs/mips/libtmessages.so
Executable file
BIN
TMessagesProj/libs/mips/libtmessages.so
Executable file
Binary file not shown.
BIN
TMessagesProj/libs/x86/libtmessages.so
Executable file
BIN
TMessagesProj/libs/x86/libtmessages.so
Executable file
Binary file not shown.
157
TMessagesProj/src/main/AndroidManifest.xml
Normal file
157
TMessagesProj/src/main/AndroidManifest.xml
Normal file
|
@ -0,0 +1,157 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.telegram.messenger"
|
||||
android:versionCode="91"
|
||||
android:versionName="1.2.4">
|
||||
|
||||
<supports-screens android:anyDensity="true"
|
||||
android:smallScreens="true"
|
||||
android:normalScreens="true"
|
||||
android:largeScreens="true"
|
||||
android:resizeable="true"
|
||||
android:xlargeScreens="true"/>
|
||||
|
||||
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" />
|
||||
|
||||
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
|
||||
<uses-feature android:name="android.hardware.telephony" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.location.gps" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.location.network" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.location" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.LOCATION" android:required="false" />
|
||||
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_SMS" />
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
|
||||
<uses-permission android:name="org.telegram.messenger.permission.MAPS_RECEIVE"/>
|
||||
<uses-permission android:name="org.telegram.messenger.permission.C2D_MESSAGE" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
|
||||
<uses-permission android:name="android.permission.READ_CONTACTS" />
|
||||
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
|
||||
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
|
||||
<uses-permission android:name="android.permission.READ_PROFILE"/>
|
||||
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>
|
||||
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
|
||||
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
|
||||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
||||
|
||||
<permission android:name="org.telegram.messenger.permission.MAPS_RECEIVE" android:protectionLevel="signature"/>
|
||||
<permission android:name="org.telegram.messenger.permission.C2D_MESSAGE" android:protectionLevel="signature" />
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:icon="@drawable/ic_launcher"
|
||||
android:label="@string/AppName"
|
||||
android:theme="@style/Theme.Sherlock.Light"
|
||||
android:name="org.telegram.ui.ApplicationLoader"
|
||||
android:hardwareAccelerated="true">
|
||||
|
||||
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="your-google-maps-api-key-here" />
|
||||
|
||||
<activity
|
||||
android:name="org.telegram.ui.LaunchActivity"
|
||||
android:windowSoftInputMode="adjustResize"
|
||||
android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
<data android:mimeType="image/*"/>
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
<data android:mimeType="video/*"/>
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
<data android:mimeType="text/plain"/>
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
<data android:mimeType="vnd.android.cursor.item/vnd.org.telegram.messenger.android.profile"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name="org.telegram.ui.LoginActivity"
|
||||
android:windowSoftInputMode="adjustResize"
|
||||
android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
|
||||
</activity>
|
||||
<activity
|
||||
android:name="org.telegram.ui.IntroActivity"
|
||||
android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
|
||||
</activity>
|
||||
<activity
|
||||
android:name="org.telegram.ui.ApplicationActivity"
|
||||
android:windowSoftInputMode="adjustResize"
|
||||
android:theme="@style/Theme.TMessages"
|
||||
android:hardwareAccelerated="true"
|
||||
android:launchMode="singleTask"
|
||||
android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
|
||||
</activity>
|
||||
<activity
|
||||
android:name="org.telegram.ui.GalleryImageViewer"
|
||||
android:theme="@style/Theme.TMessages.Gallery"
|
||||
android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
|
||||
</activity>
|
||||
|
||||
|
||||
<activity android:name="net.hockeyapp.android.UpdateActivity" />
|
||||
|
||||
<receiver android:name="org.telegram.messenger.SmsListener">
|
||||
<intent-filter>
|
||||
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<receiver
|
||||
android:name="org.telegram.messenger.GcmBroadcastReceiver"
|
||||
android:permission="com.google.android.c2dm.permission.SEND" >
|
||||
<intent-filter>
|
||||
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
|
||||
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
|
||||
<category android:name="org.telegram.messenger" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<service android:name="org.telegram.messenger.AuthenticatorService"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.accounts.AccountAuthenticator"/>
|
||||
</intent-filter>
|
||||
<meta-data android:name="android.accounts.AccountAuthenticator"
|
||||
android:resource="@xml/auth"/>
|
||||
</service>
|
||||
|
||||
<service android:name="org.telegram.messenger.ContactsSyncAdapterService"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.content.SyncAdapter" />
|
||||
</intent-filter>
|
||||
<meta-data android:name="android.content.SyncAdapter"
|
||||
android:resource="@xml/sync_contacts" />
|
||||
<meta-data android:name="android.provider.CONTACTS_STRUCTURE"
|
||||
android:resource="@xml/contacts" />
|
||||
</service>
|
||||
|
||||
<uses-library android:name="com.google.android.maps" android:required="false"/>
|
||||
</application>
|
||||
|
||||
</manifest>
|
BIN
TMessagesProj/src/main/assets/PhoneFormats.dat
Normal file
BIN
TMessagesProj/src/main/assets/PhoneFormats.dat
Normal file
Binary file not shown.
236
TMessagesProj/src/main/assets/countries.txt
Normal file
236
TMessagesProj/src/main/assets/countries.txt
Normal file
|
@ -0,0 +1,236 @@
|
|||
6723;NF;Norfolk Island
|
||||
5999;CW;Curaçao
|
||||
1939;PR;Puerto Rico
|
||||
1876;JM;Jamaica
|
||||
1869;KN;Saint Kitts and Nevis
|
||||
1868;TT;Trinidad and Tobago
|
||||
1849;DO;Dominican Republic
|
||||
1829;DO;Dominican Republic
|
||||
1809;DO;Dominican Republic
|
||||
1787;PR;Puerto Rico
|
||||
1784;VC;Saint Vincent and the Grenadines
|
||||
1767;DM;Dominica
|
||||
1758;LC;Saint Lucia
|
||||
1721;SX;Bonaire, Sint Eustatius and Saba
|
||||
1684;AS;American Samoa
|
||||
1671;GU;Guam
|
||||
1670;MP;Northern Mariana Islands
|
||||
1664;MS;Montserrat
|
||||
1649;TC;Turks and Caicos Islands
|
||||
1473;GD;Grenada
|
||||
1441;BM;Bermuda
|
||||
1345;KY;Cayman Islands
|
||||
1340;VI;US Virgin Islands
|
||||
1284;VG;British Virgin Islands
|
||||
1268;AG;Antigua and Barbuda
|
||||
1264;AI;Anguilla
|
||||
1246;BB;Barbados
|
||||
1242;BS;Bahamas
|
||||
998;UZ;Uzbekistan
|
||||
996;KG;Kyrgyzstan
|
||||
995;GE;Georgia
|
||||
994;AZ;Azerbaijan
|
||||
993;TM;Turkmenistan
|
||||
992;TJ;Tajikistan
|
||||
977;NP;Nepal
|
||||
976;MN;Mongolia
|
||||
975;BT;Bhutan
|
||||
974;QA;Qatar
|
||||
973;BH;Bahrain
|
||||
972;IL;Israel
|
||||
971;AE;United Arab Emirates
|
||||
970;PS;Palestine
|
||||
968;OM;Oman
|
||||
967;YE;Yemen
|
||||
966;SA;Saudi Arabia
|
||||
965;KW;Kuwait
|
||||
964;IQ;Iraq
|
||||
963;SY;Syria
|
||||
962;JO;Jordan
|
||||
961;LB;Lebanon
|
||||
960;MV;Maldives
|
||||
886;TW;Taiwan
|
||||
880;BD;Bangladesh
|
||||
856;LA;Laos
|
||||
855;KH;Cambodia
|
||||
853;MO;Macau
|
||||
852;HK;Hong Kong
|
||||
850;KP;North Korea
|
||||
692;MH;Marshall Islands
|
||||
691;FM;Micronesia
|
||||
690;TK;Tokelau
|
||||
689;PF;French Polynesia
|
||||
688;TV;Tuvalu
|
||||
687;NC;New Caledonia
|
||||
686;KI;Kiribati
|
||||
685;WS;Samoa
|
||||
683;NU;Niue
|
||||
682;CK;Cook Islands
|
||||
681;WF;Wallis and Futuna
|
||||
680;PW;Palau
|
||||
679;FJ;Fiji
|
||||
678;VU;Vanuatu
|
||||
677;SB;Solomon Islands
|
||||
676;TO;Tonga
|
||||
675;PG;Papua New Guinea
|
||||
674;NR;Nauru
|
||||
673;BN;Brunei Darussalam
|
||||
672;AU;Australia
|
||||
670;TL;East Timor
|
||||
599;BQ;Sint Maarten
|
||||
598;UY;Uruguay
|
||||
597;SR;Suriname
|
||||
596;MQ;Martinique
|
||||
595;PY;Paraguay
|
||||
594;GF;French Guiana
|
||||
593;EC;Ecuador
|
||||
592;GY;Guyana
|
||||
591;BO;Bolivia
|
||||
590;GP;Guadeloupe
|
||||
509;HT;Haiti
|
||||
508;PM;Saint Pierre and Miquelon
|
||||
507;PA;Panama
|
||||
506;CR;Costa Rica
|
||||
505;NI;Nicaragua
|
||||
504;HN;Honduras
|
||||
503;SV;El Salvador
|
||||
502;GT;Guatemala
|
||||
501;BZ;Belize
|
||||
500;FK;Falkland Islands
|
||||
423;LI;Liechtenstein
|
||||
421;SK;Slovakia
|
||||
420;CZ;Czech Republic
|
||||
389;MK;Macedonia
|
||||
387;BA;Bosnia and Herzegovina
|
||||
386;SI;Slovenia
|
||||
385;HR;Croatia
|
||||
382;ME;Montenegro
|
||||
381;RS;Serbia
|
||||
380;UA;Ukraine
|
||||
378;SM;San Marino
|
||||
377;MC;Monaco
|
||||
376;AD;Andorra
|
||||
375;BY;Belarus
|
||||
374;AM;Armenia
|
||||
373;MD;Moldova
|
||||
372;EE;Estonia
|
||||
371;LV;Latvia
|
||||
370;LT;Lithuania
|
||||
359;BG;Bulgaria
|
||||
358;FI;Finland
|
||||
357;CY;Cyprus
|
||||
356;MT;Malta
|
||||
355;AL;Albania
|
||||
354;IS;Iceland
|
||||
353;IE;Ireland
|
||||
352;LU;Luxembourg
|
||||
351;PT;Portugal
|
||||
350;GI;Gibraltar
|
||||
299;GL;Greenland
|
||||
298;FO;Faroe Islands
|
||||
297;AW;Aruba
|
||||
291;ER;Eritrea
|
||||
290;SH;Saint Helena
|
||||
269;KM;Comoros
|
||||
268;SZ;Swaziland
|
||||
267;BW;Botswana
|
||||
266;LS;Lesotho
|
||||
265;MW;Malawi
|
||||
264;NA;Namibia
|
||||
263;ZW;Zimbabwe
|
||||
262;RE;Réunion
|
||||
261;MG;Madagascar
|
||||
260;ZM;Zambia
|
||||
258;MZ;Mozambique
|
||||
257;BI;Burundi
|
||||
256;UG;Uganda
|
||||
255;TZ;Tanzania
|
||||
254;KE;Kenya
|
||||
253;DJ;Djibouti
|
||||
252;SO;Somalia
|
||||
251;ET;Ethiopia
|
||||
250;RW;Rwanda
|
||||
249;SD;Sudan
|
||||
248;SC;Seychelles
|
||||
247;SH;Saint Helena
|
||||
246;IO;United Kingdom
|
||||
245;GW;Guinea-Bissau
|
||||
244;AO;Angola
|
||||
243;CD;Congo, Democratic Republic
|
||||
242;CG;Congo
|
||||
241;GA;Gabon
|
||||
240;GQ;Equatorial Guinea
|
||||
239;ST;São Tomé and Príncipe
|
||||
238;CV;Cape Verde
|
||||
237;CM;Cameroon
|
||||
236;CF;Central African Republic
|
||||
235;TD;Chad
|
||||
234;NG;Nigeria
|
||||
233;GH;Ghana
|
||||
232;SL;Sierra Leone
|
||||
231;LR;Liberia
|
||||
230;MU;Mauritius
|
||||
229;BJ;Benin
|
||||
228;TG;Togo
|
||||
227;NE;Niger
|
||||
226;BF;Burkina Faso
|
||||
225;CI;Côte d`Ivoire
|
||||
224;GN;Guinea
|
||||
223;ML;Mali
|
||||
222;MR;Mauritania
|
||||
221;SN;Senegal
|
||||
220;GM;Gambia
|
||||
218;LY;Libya
|
||||
216;TN;Tunisia
|
||||
213;DZ;Algeria
|
||||
212;MA;Morocco
|
||||
211;SS;South Sudan
|
||||
98;IR;Iran
|
||||
95;MM;Myanmar
|
||||
94;LK;Sri Lanka
|
||||
93;AF;Afghanistan
|
||||
92;PK;Pakistan
|
||||
91;IN;India
|
||||
90;TR;Turkey
|
||||
86;CN;China
|
||||
84;VN;Vietnam
|
||||
82;KR;South Korea
|
||||
81;JP;Japan
|
||||
66;TH;Thailand
|
||||
65;SG;Singapore
|
||||
64;NZ;New Zealand
|
||||
63;PH;Philippines
|
||||
62;ID;Indonesia
|
||||
61;AU;Australia
|
||||
60;MY;Malaysia
|
||||
58;VE;Venezuela
|
||||
57;CO;Colombia
|
||||
56;CL;Chile
|
||||
55;BR;Brazil
|
||||
54;AR;Argentina
|
||||
53;CU;Cuba
|
||||
52;MX;Mexico
|
||||
51;PE;Peru
|
||||
49;DE;Germany
|
||||
48;PL;Poland
|
||||
47;NO;Norway
|
||||
46;SE;Sweden
|
||||
45;DK;Denmark
|
||||
44;GB;United Kingdom
|
||||
43;AT;Austria
|
||||
41;CH;Switzerland
|
||||
40;RO;Romania
|
||||
39;IT;Italy
|
||||
36;HU;Hungary
|
||||
34;ES;Spain
|
||||
33;FR;France
|
||||
32;BE;Belgium
|
||||
31;NL;Netherlands
|
||||
30;GR;Greece
|
||||
27;ZA;South Africa
|
||||
21;DZ;Algeria
|
||||
20;EG;Egypt
|
||||
7;KZ;Kazakhstan
|
||||
7;RU;Russia
|
||||
1;US;USA
|
||||
1;CA;Canada
|
BIN
TMessagesProj/src/main/assets/emojisprite_0.png
Normal file
BIN
TMessagesProj/src/main/assets/emojisprite_0.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 722 KiB |
BIN
TMessagesProj/src/main/assets/emojisprite_1.png
Normal file
BIN
TMessagesProj/src/main/assets/emojisprite_1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 531 KiB |
BIN
TMessagesProj/src/main/assets/emojisprite_2.png
Normal file
BIN
TMessagesProj/src/main/assets/emojisprite_2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 944 KiB |
BIN
TMessagesProj/src/main/assets/emojisprite_3.png
Normal file
BIN
TMessagesProj/src/main/assets/emojisprite_3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 402 KiB |
BIN
TMessagesProj/src/main/assets/emojisprite_4.png
Normal file
BIN
TMessagesProj/src/main/assets/emojisprite_4.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 470 KiB |
BIN
TMessagesProj/src/main/assets/fonts/rlight.ttf
Normal file
BIN
TMessagesProj/src/main/assets/fonts/rlight.ttf
Normal file
Binary file not shown.
566
TMessagesProj/src/main/java/jawnae/pyronet/PyroClient.java
Executable file
566
TMessagesProj/src/main/java/jawnae/pyronet/PyroClient.java
Executable file
|
@ -0,0 +1,566 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet;
|
||||
|
||||
import java.io.EOFException;
|
||||
import java.io.IOException;
|
||||
import java.net.ConnectException;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Socket;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.channels.NotYetConnectedException;
|
||||
import java.nio.channels.SelectionKey;
|
||||
import java.nio.channels.SocketChannel;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
import jawnae.pyronet.events.PyroClientListener;
|
||||
import jawnae.pyronet.traffic.ByteStream;
|
||||
|
||||
public class PyroClient {
|
||||
private final PyroSelector selector;
|
||||
|
||||
final PyroServer server;
|
||||
|
||||
private final SelectionKey key;
|
||||
|
||||
private final ByteStream outbound;
|
||||
|
||||
// called by PyroSelector.connect()
|
||||
PyroClient(PyroSelector selector, InetSocketAddress bind,
|
||||
InetSocketAddress host) throws IOException {
|
||||
this(selector, null, PyroClient.bindAndConfigure(selector,
|
||||
SocketChannel.open(), bind));
|
||||
|
||||
((SocketChannel) this.key.channel()).connect(host);
|
||||
}
|
||||
|
||||
// called by PyroClient and PyroServer
|
||||
PyroClient(PyroSelector selector, PyroServer server, SelectionKey key) {
|
||||
this.selector = selector;
|
||||
this.selector.checkThread();
|
||||
|
||||
this.server = server;
|
||||
this.key = key;
|
||||
this.key.attach(this);
|
||||
|
||||
this.outbound = new ByteStream();
|
||||
this.listeners = new CopyOnWriteArrayList<PyroClientListener>();
|
||||
this.lastEventTime = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
private final List<PyroClientListener> listeners;
|
||||
|
||||
public void addListener(PyroClientListener listener) {
|
||||
this.selector.checkThread();
|
||||
|
||||
this.listeners.add(listener);
|
||||
}
|
||||
|
||||
public void removeListener(PyroClientListener listener) {
|
||||
this.selector.checkThread();
|
||||
|
||||
this.listeners.remove(listener);
|
||||
}
|
||||
|
||||
public void removeListeners() {
|
||||
this.selector.checkThread();
|
||||
|
||||
this.listeners.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the PyroSelector that created this client
|
||||
*/
|
||||
|
||||
public PyroSelector selector() {
|
||||
return this.selector;
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
private Object attachment;
|
||||
|
||||
/**
|
||||
* Attach any object to a client, for example to store session information
|
||||
*/
|
||||
|
||||
public void attach(Object attachment) {
|
||||
this.attachment = attachment;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the previously attached object, or <code>null</code> if none is
|
||||
* set
|
||||
*/
|
||||
|
||||
public <T> T attachment() {
|
||||
return (T) this.attachment;
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
/**
|
||||
* Returns the local socket address (host+port)
|
||||
*/
|
||||
|
||||
public InetSocketAddress getLocalAddress() {
|
||||
Socket s = ((SocketChannel) key.channel()).socket();
|
||||
return (InetSocketAddress) s.getLocalSocketAddress();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the remove socket address (host+port)
|
||||
*/
|
||||
|
||||
public InetSocketAddress getRemoteAddress() {
|
||||
Socket s = ((SocketChannel) key.channel()).socket();
|
||||
return (InetSocketAddress) s.getRemoteSocketAddress();
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
public void setTimeout(int ms) throws IOException {
|
||||
this.selector.checkThread();
|
||||
|
||||
((SocketChannel) key.channel()).socket().setSoTimeout(ms);
|
||||
|
||||
// prevent a call to setTimeout from immediately causing a timeout
|
||||
this.lastEventTime = System.currentTimeMillis();
|
||||
this.timeout = ms;
|
||||
}
|
||||
|
||||
public void setLinger(boolean enabled, int seconds) throws IOException {
|
||||
this.selector.checkThread();
|
||||
|
||||
((SocketChannel) key.channel()).socket().setSoLinger(enabled, seconds);
|
||||
}
|
||||
|
||||
public void setKeepAlive(boolean enabled) throws IOException {
|
||||
this.selector.checkThread();
|
||||
|
||||
((SocketChannel) key.channel()).socket().setKeepAlive(enabled);
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
/**
|
||||
* Returns the server that accepted this client.
|
||||
*
|
||||
* @throws PyroException
|
||||
* if this client was not accepted by a server (it connected to
|
||||
* a server)
|
||||
*/
|
||||
|
||||
public final PyroServer getServer() throws PyroException {
|
||||
if (this.server == null)
|
||||
throw new PyroException("this client was not accepted by a server");
|
||||
return this.server;
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
//
|
||||
|
||||
private boolean doEagerWrite = false;
|
||||
|
||||
/**
|
||||
* If enabled, causes calls to write() to make an attempt to write the
|
||||
* bytes, without waiting for the selector to signal writable state.
|
||||
*/
|
||||
|
||||
public void setEagerWrite(boolean enabled) {
|
||||
this.doEagerWrite = enabled;
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
public void writeCopy(ByteBuffer data) throws PyroException {
|
||||
this.write(this.selector.copy(data));
|
||||
}
|
||||
|
||||
/**
|
||||
* Will enqueue the bytes to send them<br>
|
||||
* 1. when the selector is ready to write, if eagerWrite is disabled
|
||||
* (default)<br>
|
||||
* 2. immediately, if eagerWrite is enabled<br>
|
||||
* The ByteBuffer instance is kept, not copied, and thus should not be
|
||||
* modified
|
||||
*
|
||||
* @throws PyroException
|
||||
* when shutdown() has been called.
|
||||
*/
|
||||
|
||||
public void write(ByteBuffer data) throws PyroException {
|
||||
this.selector.checkThread();
|
||||
|
||||
if (!this.key.isValid()) {
|
||||
// graceful, as this is meant to be async
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.doShutdown) {
|
||||
throw new PyroException("shutting down");
|
||||
}
|
||||
|
||||
this.outbound.append(data);
|
||||
|
||||
if (this.doEagerWrite) {
|
||||
try {
|
||||
this.onReadyToWrite(System.currentTimeMillis());
|
||||
} catch (NotYetConnectedException exc) {
|
||||
this.adjustWriteOp();
|
||||
} catch (IOException exc) {
|
||||
this.onConnectionError(exc);
|
||||
key.cancel();
|
||||
}
|
||||
} else {
|
||||
this.adjustWriteOp();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes as many as possible bytes to the socket buffer
|
||||
*/
|
||||
|
||||
public int flush() {
|
||||
int total = 0;
|
||||
|
||||
while (this.outbound.hasData()) {
|
||||
int written;
|
||||
|
||||
try {
|
||||
written = this.onReadyToWrite(System.currentTimeMillis());
|
||||
} catch (IOException exc) {
|
||||
written = 0;
|
||||
}
|
||||
|
||||
if (written == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
total += written;
|
||||
}
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes an attempt to write all outbound bytes, fails on failure.
|
||||
*
|
||||
* @throws PyroException
|
||||
* on failure
|
||||
*/
|
||||
|
||||
public int flushOrDie() throws PyroException {
|
||||
int total = 0;
|
||||
|
||||
while (this.outbound.hasData()) {
|
||||
int written;
|
||||
|
||||
try {
|
||||
written = this.onReadyToWrite(System.currentTimeMillis());
|
||||
} catch (IOException exc) {
|
||||
written = 0;
|
||||
}
|
||||
|
||||
if (written == 0) {
|
||||
throw new PyroException("failed to flush, wrote " + total
|
||||
+ " bytes");
|
||||
}
|
||||
|
||||
total += written;
|
||||
}
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether there are bytes left in the outbound queue.
|
||||
*/
|
||||
|
||||
public boolean hasDataEnqueued() {
|
||||
this.selector.checkThread();
|
||||
|
||||
return this.outbound.hasData();
|
||||
}
|
||||
|
||||
private boolean doShutdown = false;
|
||||
|
||||
/**
|
||||
* Gracefully shuts down the connection. The connection is closed after the
|
||||
* last outbound bytes are sent. Enqueuing new bytes after shutdown, is not
|
||||
* allowed and will throw an exception
|
||||
*/
|
||||
|
||||
public void shutdown() {
|
||||
this.selector.checkThread();
|
||||
|
||||
this.doShutdown = true;
|
||||
|
||||
if (!this.hasDataEnqueued()) {
|
||||
this.dropConnection();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Immediately drop the connection, regardless of any pending outbound
|
||||
* bytes. Actual behaviour depends on the socket linger settings.
|
||||
*/
|
||||
|
||||
public void dropConnection() {
|
||||
this.selector.checkThread();
|
||||
|
||||
if (this.isDisconnected()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Runnable drop = new Runnable() {
|
||||
@Override
|
||||
@SuppressWarnings("synthetic-access")
|
||||
public void run() {
|
||||
try {
|
||||
if (key.channel().isOpen()) {
|
||||
((SocketChannel) key.channel()).close();
|
||||
}
|
||||
} catch (Exception exc) {
|
||||
selector().scheduleTask(this);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
drop.run();
|
||||
|
||||
this.onConnectionError("local");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the connection is connected to a remote client.
|
||||
*/
|
||||
|
||||
public boolean isDisconnected() {
|
||||
this.selector.checkThread();
|
||||
|
||||
return !((SocketChannel) this.key.channel()).isOpen();
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
void onInterestOp(long now) {
|
||||
if (!key.isValid()) {
|
||||
this.onConnectionError("remote");
|
||||
} else {
|
||||
try {
|
||||
if (key.isConnectable())
|
||||
this.onReadyToConnect(now);
|
||||
if (key.isReadable())
|
||||
this.onReadyToRead(now);
|
||||
if (key.isWritable())
|
||||
this.onReadyToWrite(now);
|
||||
} catch (Exception exc) {
|
||||
this.onConnectionError(exc);
|
||||
key.cancel();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private long timeout = 0L;
|
||||
|
||||
private long lastEventTime;
|
||||
|
||||
boolean didTimeout(long now) {
|
||||
if (this.timeout == 0)
|
||||
return false; // never timeout
|
||||
return (now - this.lastEventTime) > this.timeout;
|
||||
}
|
||||
|
||||
private void onReadyToConnect(long now) throws IOException {
|
||||
this.selector.checkThread();
|
||||
this.lastEventTime = now;
|
||||
|
||||
this.selector.adjustInterestOp(key, SelectionKey.OP_CONNECT, false);
|
||||
boolean result = ((SocketChannel) key.channel()).finishConnect();
|
||||
|
||||
for (PyroClientListener listener: this.listeners)
|
||||
listener.connectedClient(this);
|
||||
}
|
||||
|
||||
private void onReadyToRead(long now) throws IOException {
|
||||
this.selector.checkThread();
|
||||
this.lastEventTime = now;
|
||||
|
||||
SocketChannel channel = (SocketChannel) key.channel();
|
||||
|
||||
ByteBuffer buffer = this.selector.networkBuffer;
|
||||
|
||||
// read from channel
|
||||
buffer.clear();
|
||||
int bytes = channel.read(buffer);
|
||||
if (bytes == -1)
|
||||
throw new EOFException();
|
||||
buffer.flip();
|
||||
|
||||
for (PyroClientListener listener: this.listeners)
|
||||
listener.receivedData(this, buffer);
|
||||
}
|
||||
|
||||
private int onReadyToWrite(long now) throws IOException {
|
||||
this.selector.checkThread();
|
||||
this.lastEventTime = now;
|
||||
|
||||
int sent = 0;
|
||||
|
||||
// copy outbound bytes into network buffer
|
||||
ByteBuffer buffer = this.selector.networkBuffer;
|
||||
buffer.clear();
|
||||
this.outbound.get(buffer);
|
||||
buffer.flip();
|
||||
|
||||
// write to channel
|
||||
if (buffer.hasRemaining()) {
|
||||
SocketChannel channel = (SocketChannel) key.channel();
|
||||
sent = channel.write(buffer);
|
||||
}
|
||||
|
||||
if (sent > 0) {
|
||||
this.outbound.discard(sent);
|
||||
}
|
||||
|
||||
for (PyroClientListener listener: this.listeners)
|
||||
listener.sentData(this, sent);
|
||||
|
||||
this.adjustWriteOp();
|
||||
|
||||
if (this.doShutdown && !this.outbound.hasData()) {
|
||||
this.dropConnection();
|
||||
}
|
||||
|
||||
return sent;
|
||||
}
|
||||
|
||||
void onConnectionError(final Object cause) {
|
||||
this.selector.checkThread();
|
||||
|
||||
try {
|
||||
// if the key is invalid, the channel may remain open!!
|
||||
((SocketChannel) this.key.channel()).close();
|
||||
} catch (Exception exc) {
|
||||
// type: java.io.IOException
|
||||
// message:
|
||||
// "A non-blocking socket operation could not be completed immediately"
|
||||
|
||||
// try again later
|
||||
this.selector.scheduleTask(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
PyroClient.this.onConnectionError(cause);
|
||||
}
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.server != null) {
|
||||
this.server.onDisconnect(this);
|
||||
}
|
||||
|
||||
if (cause instanceof ConnectException) {
|
||||
for (PyroClientListener listener: this.listeners)
|
||||
listener.unconnectableClient(this);
|
||||
} else if (cause instanceof EOFException) // after read=-1
|
||||
{
|
||||
for (PyroClientListener listener: this.listeners)
|
||||
listener.disconnectedClient(this);
|
||||
} else if (cause instanceof IOException) {
|
||||
for (PyroClientListener listener: this.listeners)
|
||||
listener.droppedClient(this, (IOException) cause);
|
||||
} else if (!(cause instanceof String)) {
|
||||
for (PyroClientListener listener: this.listeners)
|
||||
listener.unconnectableClient(this);
|
||||
} else if (cause.equals("local")) {
|
||||
for (PyroClientListener listener: this.listeners)
|
||||
listener.disconnectedClient(this);
|
||||
} else if (cause.equals("remote")) {
|
||||
for (PyroClientListener listener: this.listeners)
|
||||
listener.droppedClient(this, null);
|
||||
} else {
|
||||
throw new IllegalStateException("illegal cause: " + cause);
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return this.getClass().getSimpleName() + "[" + this.getAddressText()
|
||||
+ "]";
|
||||
}
|
||||
|
||||
private final String getAddressText() {
|
||||
if (!this.key.channel().isOpen())
|
||||
return "closed";
|
||||
|
||||
InetSocketAddress sockaddr = this.getRemoteAddress();
|
||||
if (sockaddr == null)
|
||||
return "connecting";
|
||||
InetAddress inetaddr = sockaddr.getAddress();
|
||||
return inetaddr.getHostAddress() + "@" + sockaddr.getPort();
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
void adjustWriteOp() {
|
||||
this.selector.checkThread();
|
||||
|
||||
boolean interested = this.outbound.hasData();
|
||||
|
||||
this.selector.adjustInterestOp(this.key, SelectionKey.OP_WRITE,
|
||||
interested);
|
||||
}
|
||||
|
||||
static final SelectionKey bindAndConfigure(PyroSelector selector,
|
||||
SocketChannel channel, InetSocketAddress bind) throws IOException {
|
||||
selector.checkThread();
|
||||
|
||||
channel.socket().bind(bind);
|
||||
|
||||
return configure(selector, channel, true);
|
||||
}
|
||||
|
||||
static final SelectionKey configure(PyroSelector selector,
|
||||
SocketChannel channel, boolean connect) throws IOException {
|
||||
selector.checkThread();
|
||||
|
||||
channel.configureBlocking(false);
|
||||
// channel.socket().setSoLinger(false, 0); // this will b0rk your
|
||||
// connections
|
||||
channel.socket().setSoLinger(true, 4);
|
||||
channel.socket().setReuseAddress(true);
|
||||
channel.socket().setKeepAlive(false);
|
||||
channel.socket().setTcpNoDelay(true);
|
||||
channel.socket().setReceiveBufferSize(PyroSelector.BUFFER_SIZE);
|
||||
channel.socket().setSendBufferSize(PyroSelector.BUFFER_SIZE);
|
||||
|
||||
int ops = SelectionKey.OP_READ;
|
||||
if (connect)
|
||||
ops |= SelectionKey.OP_CONNECT;
|
||||
|
||||
return selector.register(channel, ops);
|
||||
}
|
||||
}
|
34
TMessagesProj/src/main/java/jawnae/pyronet/PyroException.java
Executable file
34
TMessagesProj/src/main/java/jawnae/pyronet/PyroException.java
Executable file
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class PyroException extends RuntimeException {
|
||||
public PyroException() {
|
||||
super();
|
||||
}
|
||||
|
||||
public PyroException(String msg) {
|
||||
super(msg);
|
||||
}
|
||||
|
||||
public PyroException(String msg, Throwable cause) {
|
||||
super(msg, cause);
|
||||
}
|
||||
}
|
325
TMessagesProj/src/main/java/jawnae/pyronet/PyroSelector.java
Executable file
325
TMessagesProj/src/main/java/jawnae/pyronet/PyroSelector.java
Executable file
|
@ -0,0 +1,325 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.channels.CancelledKeyException;
|
||||
import java.nio.channels.SelectableChannel;
|
||||
import java.nio.channels.SelectionKey;
|
||||
import java.nio.channels.Selector;
|
||||
import java.nio.channels.ServerSocketChannel;
|
||||
import java.nio.channels.SocketChannel;
|
||||
import java.util.Iterator;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
|
||||
import jawnae.pyronet.events.PyroSelectorListener;
|
||||
|
||||
public class PyroSelector {
|
||||
public static boolean DO_NOT_CHECK_NETWORK_THREAD = true;
|
||||
|
||||
public static final int BUFFER_SIZE = 64 * 1024;
|
||||
|
||||
Thread networkThread;
|
||||
|
||||
final Selector nioSelector;
|
||||
|
||||
final ByteBuffer networkBuffer;
|
||||
|
||||
final PyroSelectorListener listener;
|
||||
|
||||
public PyroSelector() {
|
||||
this(null);
|
||||
}
|
||||
|
||||
public PyroSelector(PyroSelectorListener listener) {
|
||||
this.listener = listener;
|
||||
this.networkBuffer = ByteBuffer.allocateDirect(BUFFER_SIZE);
|
||||
|
||||
try {
|
||||
this.nioSelector = Selector.open();
|
||||
} catch (IOException exc) {
|
||||
throw new PyroException("Failed to open a selector?!", exc);
|
||||
}
|
||||
|
||||
this.networkThread = Thread.currentThread();
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
public ByteBuffer malloc(int size) {
|
||||
return ByteBuffer.allocate(size);
|
||||
}
|
||||
|
||||
public ByteBuffer malloc(byte[] array) {
|
||||
ByteBuffer copy = this.malloc(array.length);
|
||||
copy.put(array);
|
||||
copy.flip();
|
||||
return copy;
|
||||
}
|
||||
|
||||
public ByteBuffer copy(ByteBuffer buffer) {
|
||||
ByteBuffer copy = this.malloc(buffer.remaining());
|
||||
copy.put(buffer);
|
||||
buffer.position(buffer.position() - copy.remaining());
|
||||
copy.flip();
|
||||
return copy;
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
public final boolean isNetworkThread() {
|
||||
if (DO_NOT_CHECK_NETWORK_THREAD) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return networkThread == Thread.currentThread();
|
||||
}
|
||||
|
||||
public final Thread networkThread() {
|
||||
return this.networkThread;
|
||||
}
|
||||
|
||||
public final void checkThread() {
|
||||
if (DO_NOT_CHECK_NETWORK_THREAD) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.isNetworkThread()) {
|
||||
throw new PyroException(
|
||||
"call from outside the network-thread, you must schedule tasks");
|
||||
}
|
||||
}
|
||||
|
||||
public PyroServer listen(InetSocketAddress end, int backlog)
|
||||
throws IOException {
|
||||
try {
|
||||
return new PyroServer(this, nioSelector, end, backlog);
|
||||
} catch (IOException exc) {
|
||||
if (this.listener == null)
|
||||
throw exc;
|
||||
|
||||
this.listener.serverBindFailed(exc);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public PyroServer listen(InetSocketAddress end) throws IOException {
|
||||
return this.listen(end, 50);
|
||||
}
|
||||
|
||||
public PyroServer listen(int port) throws IOException {
|
||||
return this.listen(new InetSocketAddress(InetAddress.getLocalHost(),
|
||||
port));
|
||||
}
|
||||
|
||||
public PyroClient connect(InetSocketAddress host) throws IOException {
|
||||
return this.connect(host, null);
|
||||
}
|
||||
|
||||
public PyroClient connect(InetSocketAddress host, InetSocketAddress bind)
|
||||
throws IOException {
|
||||
try {
|
||||
return new PyroClient(this, bind, host);
|
||||
} catch (IOException exc) {
|
||||
if (this.listener == null)
|
||||
throw exc;
|
||||
|
||||
this.listener.clientBindFailed(exc);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void select() {
|
||||
this.select(10);
|
||||
}
|
||||
|
||||
public void select(long eventTimeout) {
|
||||
this.checkThread();
|
||||
|
||||
//
|
||||
|
||||
this.executePendingTasks();
|
||||
this.performNioSelect(eventTimeout);
|
||||
|
||||
final long now = System.currentTimeMillis();
|
||||
this.handleSelectedKeys(now);
|
||||
this.handleSocketTimeouts(now);
|
||||
}
|
||||
|
||||
private void executePendingTasks() {
|
||||
while (true) {
|
||||
Runnable task = this.tasks.poll();
|
||||
if (task == null)
|
||||
break;
|
||||
|
||||
if (this.listener != null)
|
||||
this.listener.executingTask(task);
|
||||
|
||||
try {
|
||||
task.run();
|
||||
} catch (Throwable cause) {
|
||||
if (this.listener != null)
|
||||
this.listener.taskCrashed(task, cause);
|
||||
else
|
||||
cause.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private final void performNioSelect(long timeout) {
|
||||
int selected;
|
||||
try {
|
||||
selected = nioSelector.select(timeout);
|
||||
} catch (IOException exc) {
|
||||
if (this.listener != null)
|
||||
this.listener.selectFailure(exc);
|
||||
else
|
||||
exc.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.listener != null)
|
||||
this.listener.selectedKeys(selected);
|
||||
}
|
||||
|
||||
private final void handleSelectedKeys(long now) {
|
||||
Iterator<SelectionKey> keys = nioSelector.selectedKeys().iterator();
|
||||
|
||||
while (keys.hasNext()) {
|
||||
SelectionKey key = keys.next();
|
||||
keys.remove();
|
||||
|
||||
if (key.channel() instanceof ServerSocketChannel) {
|
||||
PyroServer server = (PyroServer) key.attachment();
|
||||
if (this.listener != null)
|
||||
this.listener.serverSelected(server);
|
||||
server.onInterestOp();
|
||||
}
|
||||
|
||||
if (key.channel() instanceof SocketChannel) {
|
||||
PyroClient client = (PyroClient) key.attachment();
|
||||
if (this.listener != null)
|
||||
this.listener.clientSelected(client, key.readyOps());
|
||||
client.onInterestOp(now);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private final void handleSocketTimeouts(long now) {
|
||||
for (SelectionKey key: nioSelector.keys()) {
|
||||
if (key.channel() instanceof SocketChannel) {
|
||||
PyroClient client = (PyroClient) key.attachment();
|
||||
|
||||
if (client.didTimeout(now)) {
|
||||
try {
|
||||
throw new SocketTimeoutException(
|
||||
"PyroNet detected NIO timeout");
|
||||
} catch (SocketTimeoutException exc) {
|
||||
client.onConnectionError(exc);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void spawnNetworkThread(final String name) {
|
||||
// now no thread can access this selector
|
||||
//
|
||||
// N.B.
|
||||
// -- updating this non-volatile field is thread-safe
|
||||
// -- because the current thread can see it (causing it
|
||||
// -- to become UNACCESSIBLE), and all other threads
|
||||
// -- that might not see the change will
|
||||
// -- (continue to) block access to this selector
|
||||
this.networkThread = null;
|
||||
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
// spawned thread can access this selector
|
||||
//
|
||||
// N.B.
|
||||
// -- updating this non-volatile field is thread-safe
|
||||
// -- because the current thread can see it (causing it
|
||||
// -- to become ACCESSIBLE), and all other threads
|
||||
// -- that might not see the change will
|
||||
// -- (continue to) block access to this selector
|
||||
PyroSelector.this.networkThread = Thread.currentThread();
|
||||
|
||||
// start select-loop
|
||||
try {
|
||||
while (true) {
|
||||
PyroSelector.this.select();
|
||||
}
|
||||
} catch (Exception exc) {
|
||||
// this never be caused by Pyro-code
|
||||
throw new IllegalStateException(exc);
|
||||
}
|
||||
}
|
||||
}, name).start();
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
private BlockingQueue<Runnable> tasks = new LinkedBlockingQueue<Runnable>();
|
||||
|
||||
public void scheduleTask(Runnable task) {
|
||||
if (task == null) {
|
||||
throw new NullPointerException();
|
||||
}
|
||||
|
||||
try {
|
||||
this.tasks.put(task);
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
wakeup();
|
||||
}
|
||||
|
||||
public void wakeup() {
|
||||
this.nioSelector.wakeup();
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
final SelectionKey register(SelectableChannel channel, int ops)
|
||||
throws IOException {
|
||||
return channel.register(this.nioSelector, ops);
|
||||
}
|
||||
|
||||
final boolean adjustInterestOp(SelectionKey key, int op, boolean state) {
|
||||
this.checkThread();
|
||||
|
||||
try {
|
||||
int ops = key.interestOps();
|
||||
boolean changed = state != ((ops & op) == op);
|
||||
if (changed)
|
||||
key.interestOps(state ? (ops | op) : (ops & ~op));
|
||||
return changed;
|
||||
} catch (CancelledKeyException exc) {
|
||||
// ignore
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
224
TMessagesProj/src/main/java/jawnae/pyronet/PyroServer.java
Executable file
224
TMessagesProj/src/main/java/jawnae/pyronet/PyroServer.java
Executable file
|
@ -0,0 +1,224 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.nio.channels.SelectionKey;
|
||||
import java.nio.channels.Selector;
|
||||
import java.nio.channels.ServerSocketChannel;
|
||||
import java.nio.channels.SocketChannel;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
import jawnae.pyronet.addon.PyroSelectorProvider;
|
||||
import jawnae.pyronet.events.PyroServerListener;
|
||||
|
||||
public class PyroServer implements Iterable<PyroClient> {
|
||||
private final PyroSelector selector;
|
||||
|
||||
public final SelectionKey serverKey;
|
||||
|
||||
final List<PyroClient> clients;
|
||||
|
||||
PyroServer(PyroSelector selector, Selector nioSelector,
|
||||
InetSocketAddress endpoint, int backlog) throws IOException {
|
||||
this.selector = selector;
|
||||
this.selector.checkThread();
|
||||
|
||||
ServerSocketChannel ssc;
|
||||
ssc = ServerSocketChannel.open();
|
||||
ssc.socket().bind(endpoint, backlog);
|
||||
ssc.configureBlocking(false);
|
||||
|
||||
this.serverKey = ssc.register(nioSelector, SelectionKey.OP_ACCEPT);
|
||||
this.serverKey.attach(this);
|
||||
|
||||
this.clients = new ArrayList<PyroClient>();
|
||||
this.listeners = new CopyOnWriteArrayList<PyroServerListener>();
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
private final List<PyroServerListener> listeners;
|
||||
|
||||
public void addListener(PyroServerListener listener) {
|
||||
this.selector.checkThread();
|
||||
|
||||
this.listeners.add(listener);
|
||||
}
|
||||
|
||||
public void removeListener(PyroServerListener listener) {
|
||||
this.selector.checkThread();
|
||||
|
||||
this.listeners.remove(listener);
|
||||
}
|
||||
|
||||
public void removeListeners() {
|
||||
this.selector.checkThread();
|
||||
|
||||
this.listeners.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the network that created this server
|
||||
*/
|
||||
|
||||
public PyroSelector selector() {
|
||||
return this.selector;
|
||||
}
|
||||
|
||||
private PyroSelectorProvider selectorProvider;
|
||||
|
||||
/**
|
||||
* By installing a PyroSelectorProvider you alter the PyroSelector used to
|
||||
* do the I/O of a PyroClient. This can be used for multi-threading your
|
||||
* network code
|
||||
*/
|
||||
|
||||
public void installSelectorProvider(PyroSelectorProvider selectorProvider) {
|
||||
this.selector().checkThread();
|
||||
|
||||
this.selectorProvider = selectorProvider;
|
||||
}
|
||||
|
||||
void onInterestOp() {
|
||||
if (!serverKey.isValid())
|
||||
throw new PyroException("invalid selection key");
|
||||
|
||||
try {
|
||||
if (serverKey.isAcceptable()) {
|
||||
this.onReadyToAccept();
|
||||
}
|
||||
} catch (IOException exc) {
|
||||
throw new IllegalStateException(exc);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an iterator to access all connected clients of this server
|
||||
*/
|
||||
|
||||
@Override
|
||||
public Iterator<PyroClient> iterator() {
|
||||
this.selector.checkThread();
|
||||
|
||||
List<PyroClient> copy = new ArrayList<PyroClient>();
|
||||
copy.addAll(this.clients);
|
||||
return copy.iterator();
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the server socket. Any current connections will continue.
|
||||
*/
|
||||
|
||||
public void close() throws IOException {
|
||||
this.selector.checkThread();
|
||||
|
||||
this.serverKey.channel().close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the server socket. Any current connections will be closed.
|
||||
*/
|
||||
|
||||
public void terminate() throws IOException {
|
||||
this.close();
|
||||
|
||||
for (PyroClient client: this) {
|
||||
client.dropConnection();
|
||||
}
|
||||
}
|
||||
|
||||
private void onReadyToAccept() throws IOException {
|
||||
this.selector.checkThread();
|
||||
|
||||
final SocketChannel channel = ((ServerSocketChannel) serverKey
|
||||
.channel()).accept();
|
||||
|
||||
final PyroSelector acceptedClientSelector;
|
||||
{
|
||||
if (this.selectorProvider == null)
|
||||
acceptedClientSelector = this.selector;
|
||||
else
|
||||
acceptedClientSelector = this.selectorProvider
|
||||
.provideFor(channel);
|
||||
}
|
||||
|
||||
if (acceptedClientSelector == this.selector) {
|
||||
SelectionKey clientKey = PyroClient.configure(
|
||||
acceptedClientSelector, channel, false);
|
||||
PyroClient client = new PyroClient(acceptedClientSelector, this,
|
||||
clientKey);
|
||||
this.fireAcceptedClient(client);
|
||||
this.clients.add(client);
|
||||
} else {
|
||||
// create client in PyroClient-selector thread
|
||||
acceptedClientSelector.scheduleTask(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
SelectionKey clientKey;
|
||||
try {
|
||||
clientKey = PyroClient.configure(
|
||||
acceptedClientSelector, channel, false);
|
||||
} catch (IOException exc) {
|
||||
throw new IllegalStateException(exc);
|
||||
}
|
||||
final PyroClient client = new PyroClient(
|
||||
acceptedClientSelector, PyroServer.this, clientKey);
|
||||
PyroServer.this.fireAcceptedClient(client);
|
||||
|
||||
// add client to list in PyroServer-selector thread
|
||||
PyroServer.this.selector().scheduleTask(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
PyroServer.this.clients.add(client);
|
||||
}
|
||||
});
|
||||
PyroServer.this.selector().wakeup();
|
||||
}
|
||||
});
|
||||
acceptedClientSelector.wakeup();
|
||||
}
|
||||
}
|
||||
|
||||
void fireAcceptedClient(PyroClient client) {
|
||||
for (PyroServerListener listener: this.listeners) {
|
||||
listener.acceptedClient(client);
|
||||
}
|
||||
}
|
||||
|
||||
void onDisconnect(final PyroClient client) {
|
||||
if (this.selector().isNetworkThread()) {
|
||||
this.clients.remove(client);
|
||||
} else {
|
||||
// we are in the PyroClient-selector thread
|
||||
this.selector().scheduleTask(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
// call again from the PyroServer-selector thread
|
||||
PyroServer.this.onDisconnect(client);
|
||||
}
|
||||
});
|
||||
this.selector().wakeup();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet.addon;
|
||||
|
||||
import java.nio.channels.SocketChannel;
|
||||
import java.util.Arrays;
|
||||
|
||||
import jawnae.pyronet.PyroSelector;
|
||||
|
||||
public class PyroRoundrobinSelectorProvider implements PyroSelectorProvider {
|
||||
private final PyroSelector[] selectors;
|
||||
|
||||
private int index;
|
||||
|
||||
public PyroRoundrobinSelectorProvider(PyroSelector[] selectors) {
|
||||
this.selectors = Arrays.copyOf(selectors, selectors.length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PyroSelector provideFor(SocketChannel channel) {
|
||||
// this is called from the PyroServer-selector thread
|
||||
return this.selectors[this.index++ % this.selectors.length];
|
||||
}
|
||||
}
|
27
TMessagesProj/src/main/java/jawnae/pyronet/addon/PyroSelectorProvider.java
Executable file
27
TMessagesProj/src/main/java/jawnae/pyronet/addon/PyroSelectorProvider.java
Executable file
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet.addon;
|
||||
|
||||
import java.nio.channels.SocketChannel;
|
||||
|
||||
import jawnae.pyronet.PyroSelector;
|
||||
|
||||
public interface PyroSelectorProvider {
|
||||
public PyroSelector provideFor(SocketChannel channel);
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet.addon;
|
||||
|
||||
import java.nio.channels.SocketChannel;
|
||||
|
||||
import jawnae.pyronet.PyroSelector;
|
||||
|
||||
public class PyroSingletonSelectorProvider implements PyroSelectorProvider {
|
||||
private final PyroSelector selector;
|
||||
|
||||
public PyroSingletonSelectorProvider(PyroSelector selector) {
|
||||
this.selector = selector;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PyroSelector provideFor(SocketChannel channel) {
|
||||
return this.selector;
|
||||
}
|
||||
}
|
55
TMessagesProj/src/main/java/jawnae/pyronet/events/PyroClientAdapter.java
Executable file
55
TMessagesProj/src/main/java/jawnae/pyronet/events/PyroClientAdapter.java
Executable file
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet.events;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import jawnae.pyronet.PyroClient;
|
||||
|
||||
public class PyroClientAdapter implements PyroClientListener {
|
||||
public void connectedClient(PyroClient client) {
|
||||
//
|
||||
}
|
||||
|
||||
public void unconnectableClient(PyroClient client) {
|
||||
System.out.println("unconnectable");
|
||||
}
|
||||
|
||||
public void droppedClient(PyroClient client, IOException cause) {
|
||||
if (cause != null) {
|
||||
System.out.println(this.getClass().getSimpleName()
|
||||
+ ".droppedClient() caught exception: " + cause);
|
||||
}
|
||||
}
|
||||
|
||||
public void disconnectedClient(PyroClient client) {
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
public void receivedData(PyroClient client, ByteBuffer data) {
|
||||
//
|
||||
}
|
||||
|
||||
public void sentData(PyroClient client, int bytes) {
|
||||
//
|
||||
}
|
||||
}
|
40
TMessagesProj/src/main/java/jawnae/pyronet/events/PyroClientListener.java
Executable file
40
TMessagesProj/src/main/java/jawnae/pyronet/events/PyroClientListener.java
Executable file
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet.events;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import jawnae.pyronet.PyroClient;
|
||||
|
||||
public interface PyroClientListener {
|
||||
public void connectedClient(PyroClient client);
|
||||
|
||||
public void unconnectableClient(PyroClient client);
|
||||
|
||||
public void droppedClient(PyroClient client, IOException cause);
|
||||
|
||||
public void disconnectedClient(PyroClient client);
|
||||
|
||||
//
|
||||
|
||||
public void receivedData(PyroClient client, ByteBuffer data);
|
||||
|
||||
public void sentData(PyroClient client, int bytes);
|
||||
}
|
111
TMessagesProj/src/main/java/jawnae/pyronet/events/PyroLazyBastardAdapter.java
Executable file
111
TMessagesProj/src/main/java/jawnae/pyronet/events/PyroLazyBastardAdapter.java
Executable file
|
@ -0,0 +1,111 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet.events;
|
||||
|
||||
import java.io.EOFException;
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import jawnae.pyronet.PyroClient;
|
||||
import jawnae.pyronet.PyroServer;
|
||||
|
||||
public class PyroLazyBastardAdapter implements PyroSelectorListener,
|
||||
PyroServerListener, PyroClientListener {
|
||||
// --------------- PyroSelectorListener
|
||||
|
||||
public void executingTask(Runnable task) {
|
||||
//
|
||||
}
|
||||
|
||||
public void taskCrashed(Runnable task, Throwable cause) {
|
||||
System.out.println(this.getClass().getSimpleName()
|
||||
+ ".taskCrashed() caught exception:");
|
||||
cause.printStackTrace();
|
||||
}
|
||||
|
||||
public void selectedKeys(int count) {
|
||||
//
|
||||
}
|
||||
|
||||
public void selectFailure(IOException cause) {
|
||||
System.out.println(this.getClass().getSimpleName()
|
||||
+ ".selectFailure() caught exception:");
|
||||
cause.printStackTrace();
|
||||
}
|
||||
|
||||
public void serverSelected(PyroServer server) {
|
||||
//
|
||||
}
|
||||
|
||||
public void clientSelected(PyroClient client, int readyOps) {
|
||||
//
|
||||
}
|
||||
|
||||
// ------------- PyroServerListener
|
||||
|
||||
public void acceptedClient(PyroClient client) {
|
||||
//
|
||||
}
|
||||
|
||||
// ------------- PyroClientListener
|
||||
|
||||
public void connectedClient(PyroClient client) {
|
||||
//
|
||||
}
|
||||
|
||||
public void unconnectableClient(PyroClient client) {
|
||||
System.out.println(this.getClass().getSimpleName()
|
||||
+ ".unconnectableClient()");
|
||||
}
|
||||
|
||||
public void droppedClient(PyroClient client, IOException cause) {
|
||||
if (cause != null && !(cause instanceof EOFException)) {
|
||||
System.out.println(this.getClass().getSimpleName()
|
||||
+ ".droppedClient() caught exception: " + cause);
|
||||
}
|
||||
}
|
||||
|
||||
public void disconnectedClient(PyroClient client) {
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
public void receivedData(PyroClient client, ByteBuffer data) {
|
||||
//
|
||||
}
|
||||
|
||||
public void sentData(PyroClient client, int bytes) {
|
||||
//
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serverBindFailed(IOException cause) {
|
||||
System.out.println(this.getClass().getSimpleName()
|
||||
+ ".serverBindFailed() caught exception:");
|
||||
cause.printStackTrace();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clientBindFailed(IOException cause) {
|
||||
System.out.println(this.getClass().getSimpleName()
|
||||
+ ".serverBindFailed() caught exception:");
|
||||
cause.printStackTrace();
|
||||
}
|
||||
}
|
70
TMessagesProj/src/main/java/jawnae/pyronet/events/PyroSelectorAdapter.java
Executable file
70
TMessagesProj/src/main/java/jawnae/pyronet/events/PyroSelectorAdapter.java
Executable file
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet.events;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import jawnae.pyronet.PyroClient;
|
||||
import jawnae.pyronet.PyroServer;
|
||||
|
||||
public class PyroSelectorAdapter implements PyroSelectorListener {
|
||||
public void executingTask(Runnable task) {
|
||||
//
|
||||
}
|
||||
|
||||
public void taskCrashed(Runnable task, Throwable cause) {
|
||||
System.out.println(this.getClass().getSimpleName()
|
||||
+ " caught exception: " + cause);
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
public void selectedKeys(int count) {
|
||||
//
|
||||
}
|
||||
|
||||
public void selectFailure(IOException cause) {
|
||||
System.out.println(this.getClass().getSimpleName()
|
||||
+ " caught exception: " + cause);
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
public void serverSelected(PyroServer server) {
|
||||
//
|
||||
}
|
||||
|
||||
public void clientSelected(PyroClient client, int readyOps) {
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
@Override
|
||||
public void serverBindFailed(IOException cause) {
|
||||
System.out.println(this.getClass().getSimpleName()
|
||||
+ ".serverBindFailed() caught exception: " + cause);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clientBindFailed(IOException cause) {
|
||||
System.out.println(this.getClass().getSimpleName()
|
||||
+ ".serverBindFailed() caught exception: " + cause);
|
||||
}
|
||||
}
|
48
TMessagesProj/src/main/java/jawnae/pyronet/events/PyroSelectorListener.java
Executable file
48
TMessagesProj/src/main/java/jawnae/pyronet/events/PyroSelectorListener.java
Executable file
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet.events;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import jawnae.pyronet.PyroClient;
|
||||
import jawnae.pyronet.PyroServer;
|
||||
|
||||
public interface PyroSelectorListener {
|
||||
public void executingTask(Runnable task);
|
||||
|
||||
public void taskCrashed(Runnable task, Throwable cause);
|
||||
|
||||
//
|
||||
|
||||
public void selectedKeys(int count);
|
||||
|
||||
public void selectFailure(IOException cause);
|
||||
|
||||
//
|
||||
|
||||
public void serverSelected(PyroServer server);
|
||||
|
||||
public void clientSelected(PyroClient client, int readyOps);
|
||||
|
||||
//
|
||||
|
||||
public void serverBindFailed(IOException cause);
|
||||
|
||||
public void clientBindFailed(IOException cause);
|
||||
}
|
28
TMessagesProj/src/main/java/jawnae/pyronet/events/PyroServerAdapter.java
Executable file
28
TMessagesProj/src/main/java/jawnae/pyronet/events/PyroServerAdapter.java
Executable file
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet.events;
|
||||
|
||||
import jawnae.pyronet.PyroClient;
|
||||
|
||||
public class PyroServerAdapter implements PyroServerListener {
|
||||
@Override
|
||||
public void acceptedClient(PyroClient client) {
|
||||
//
|
||||
}
|
||||
}
|
28
TMessagesProj/src/main/java/jawnae/pyronet/events/PyroServerListener.java
Executable file
28
TMessagesProj/src/main/java/jawnae/pyronet/events/PyroServerListener.java
Executable file
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet.events;
|
||||
|
||||
import jawnae.pyronet.PyroClient;
|
||||
|
||||
public interface PyroServerListener {
|
||||
/**
|
||||
* Note: invoked from the PyroSelector-thread that created this PyroClient
|
||||
*/
|
||||
public void acceptedClient(PyroClient client);
|
||||
}
|
48
TMessagesProj/src/main/java/jawnae/pyronet/traffic/ByteSink.java
Executable file
48
TMessagesProj/src/main/java/jawnae/pyronet/traffic/ByteSink.java
Executable file
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet.traffic;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
public interface ByteSink {
|
||||
public static int FEED_ACCEPTED = 1;
|
||||
|
||||
public static int FEED_ACCEPTED_LAST = 2;
|
||||
|
||||
public static int FEED_REJECTED = 3;
|
||||
|
||||
/**
|
||||
* determines what to do with the specified byte: accept, accept as final
|
||||
* byte, reject
|
||||
*/
|
||||
|
||||
public int feed(byte b);
|
||||
|
||||
/**
|
||||
* Resets the state of this ByteSink, allowing it to be enqueued again
|
||||
*/
|
||||
|
||||
public void reset();
|
||||
|
||||
/**
|
||||
* Called by the client when this ByteSink is complete
|
||||
*/
|
||||
|
||||
public void onReady(ByteBuffer buffer);
|
||||
}
|
74
TMessagesProj/src/main/java/jawnae/pyronet/traffic/ByteSinkEndsWith.java
Executable file
74
TMessagesProj/src/main/java/jawnae/pyronet/traffic/ByteSinkEndsWith.java
Executable file
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet.traffic;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
public abstract class ByteSinkEndsWith implements ByteSink {
|
||||
private final ByteBuffer result;
|
||||
|
||||
private final byte[] endsWith;
|
||||
|
||||
private final boolean includeEndsWith;
|
||||
|
||||
private int matchCount;
|
||||
|
||||
private int filled;
|
||||
|
||||
public ByteSinkEndsWith(byte[] endsWith, int capacity,
|
||||
boolean includeEndsWith) {
|
||||
if (endsWith == null || endsWith.length == 0)
|
||||
throw new IllegalStateException();
|
||||
this.result = ByteBuffer.allocate(capacity);
|
||||
this.endsWith = endsWith;
|
||||
this.includeEndsWith = includeEndsWith;
|
||||
|
||||
this.reset();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
this.result.clear();
|
||||
this.matchCount = 0;
|
||||
this.filled = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int feed(byte b) {
|
||||
if (this.endsWith[this.matchCount] == b) {
|
||||
this.matchCount++;
|
||||
} else {
|
||||
this.matchCount = 0;
|
||||
}
|
||||
|
||||
this.result.put(this.filled, b);
|
||||
|
||||
this.filled += 1;
|
||||
|
||||
if (this.matchCount == this.endsWith.length) {
|
||||
int len = this.filled
|
||||
- (this.includeEndsWith ? 0 : this.endsWith.length);
|
||||
this.result.limit(len);
|
||||
this.onReady(this.result);
|
||||
return FEED_ACCEPTED_LAST;
|
||||
}
|
||||
|
||||
return ByteSink.FEED_ACCEPTED;
|
||||
}
|
||||
}
|
55
TMessagesProj/src/main/java/jawnae/pyronet/traffic/ByteSinkLength.java
Executable file
55
TMessagesProj/src/main/java/jawnae/pyronet/traffic/ByteSinkLength.java
Executable file
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet.traffic;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
public abstract class ByteSinkLength implements ByteSink {
|
||||
private final ByteBuffer result;
|
||||
|
||||
private int filled;
|
||||
|
||||
public ByteSinkLength(int size) {
|
||||
if (size == 0)
|
||||
throw new IllegalArgumentException();
|
||||
this.result = ByteBuffer.allocate(size);
|
||||
|
||||
this.reset();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
this.result.clear();
|
||||
this.filled = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int feed(byte b) {
|
||||
this.result.put(this.filled, b);
|
||||
|
||||
this.filled += 1;
|
||||
|
||||
if (this.filled == this.result.capacity()) {
|
||||
this.onReady(this.result);
|
||||
return FEED_ACCEPTED_LAST;
|
||||
}
|
||||
|
||||
return ByteSink.FEED_ACCEPTED;
|
||||
}
|
||||
}
|
95
TMessagesProj/src/main/java/jawnae/pyronet/traffic/ByteSinkPacket16.java
Executable file
95
TMessagesProj/src/main/java/jawnae/pyronet/traffic/ByteSinkPacket16.java
Executable file
|
@ -0,0 +1,95 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet.traffic;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import jawnae.pyronet.PyroClient;
|
||||
|
||||
public abstract class ByteSinkPacket16 implements ByteSink {
|
||||
public static void sendTo(PyroClient client, byte[] payload) {
|
||||
if (payload.length > 0x0000FFFF) {
|
||||
throw new IllegalStateException("packet bigger than 64K-1 bytes");
|
||||
}
|
||||
|
||||
byte[] wrapped = new byte[2 + payload.length];
|
||||
wrapped[0] = (byte) (payload.length >> 8);
|
||||
wrapped[1] = (byte) (payload.length >> 0);
|
||||
System.arraycopy(payload, 0, wrapped, 2, payload.length);
|
||||
|
||||
client.write(client.selector().malloc(wrapped));
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
ByteSinkLength current;
|
||||
|
||||
public ByteSinkPacket16() {
|
||||
this.reset();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
this.current = new ByteSinkLength(2) {
|
||||
@Override
|
||||
public void onReady(ByteBuffer buffer) {
|
||||
// header is received
|
||||
int len = buffer.getShort(0) & 0xFFFF;
|
||||
|
||||
current = new ByteSinkLength(len) {
|
||||
@Override
|
||||
public void onReady(ByteBuffer buffer) {
|
||||
// sometime we want do reset in
|
||||
// ByteSinkPacket16.this.onReady, then add the sink back
|
||||
// to feeder, in such process, onReady should be execute
|
||||
// at last.
|
||||
current = null;
|
||||
|
||||
// content is received
|
||||
ByteSinkPacket16.this.onReady(buffer);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int feed(byte b) {
|
||||
if (this.current == null) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
int result = this.current.feed(b);
|
||||
|
||||
if (result == FEED_ACCEPTED) {
|
||||
return result;
|
||||
}
|
||||
|
||||
// 'current' will be replaced by now
|
||||
|
||||
if (this.current == null) {
|
||||
return result;
|
||||
}
|
||||
|
||||
else {
|
||||
return FEED_ACCEPTED;
|
||||
}
|
||||
// return this.current.feed(b);
|
||||
}
|
||||
}
|
94
TMessagesProj/src/main/java/jawnae/pyronet/traffic/ByteSinkPacket24.java
Executable file
94
TMessagesProj/src/main/java/jawnae/pyronet/traffic/ByteSinkPacket24.java
Executable file
|
@ -0,0 +1,94 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet.traffic;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import jawnae.pyronet.PyroClient;
|
||||
|
||||
public abstract class ByteSinkPacket24 implements ByteSink {
|
||||
public static void sendTo(PyroClient client, byte[] payload) {
|
||||
if (payload.length > 0x00FFFFFF) {
|
||||
throw new IllegalStateException("packet bigger than 16M-1 bytes");
|
||||
}
|
||||
|
||||
byte[] wrapped = new byte[3 + payload.length];
|
||||
wrapped[0] = (byte) (payload.length >> 16);
|
||||
wrapped[1] = (byte) (payload.length >> 8);
|
||||
wrapped[2] = (byte) (payload.length >> 0);
|
||||
System.arraycopy(payload, 0, wrapped, 3, payload.length);
|
||||
|
||||
client.write(client.selector().malloc(wrapped));
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
ByteSinkLength current;
|
||||
|
||||
public ByteSinkPacket24() {
|
||||
this.reset();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
this.current = new ByteSinkLength(3) {
|
||||
@Override
|
||||
public void onReady(ByteBuffer buffer) {
|
||||
// header is received
|
||||
int len = ((buffer.getShort(0) & 0xFFFF) << 8)
|
||||
| (buffer.get(3) & 0xFF);
|
||||
|
||||
current = new ByteSinkLength(len) {
|
||||
@Override
|
||||
public void onReady(ByteBuffer buffer) {
|
||||
// sometime we want do reset in
|
||||
// ByteSinkPacket24.this.onReady, then add the sink back
|
||||
// to feeder, in such process, onReady should be execute
|
||||
// at last.
|
||||
current = null;
|
||||
// content is received
|
||||
ByteSinkPacket24.this.onReady(buffer);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int feed(byte b) {
|
||||
if (this.current == null) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
int result = this.current.feed(b);
|
||||
|
||||
if (result == FEED_ACCEPTED) {
|
||||
return result;
|
||||
}
|
||||
|
||||
// 'current' will be replaced by now
|
||||
|
||||
if (this.current == null) {
|
||||
return result;
|
||||
} else {
|
||||
return FEED_ACCEPTED;
|
||||
}
|
||||
// return this.current.feed(b);
|
||||
}
|
||||
}
|
102
TMessagesProj/src/main/java/jawnae/pyronet/traffic/ByteSinkPacket32.java
Executable file
102
TMessagesProj/src/main/java/jawnae/pyronet/traffic/ByteSinkPacket32.java
Executable file
|
@ -0,0 +1,102 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet.traffic;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import jawnae.pyronet.PyroClient;
|
||||
|
||||
public abstract class ByteSinkPacket32 implements ByteSink {
|
||||
public static void sendTo(PyroClient client, byte[] payload) {
|
||||
boolean isExtreme = (payload.length > 0xFFFFFFFF - 4);
|
||||
|
||||
byte[] wrapped = new byte[4 + (isExtreme ? 0 : payload.length)];
|
||||
wrapped[0] = (byte) (payload.length >> 24);
|
||||
wrapped[1] = (byte) (payload.length >> 16);
|
||||
wrapped[2] = (byte) (payload.length >> 8);
|
||||
wrapped[3] = (byte) (payload.length >> 0);
|
||||
|
||||
if (!isExtreme) {
|
||||
System.arraycopy(payload, 0, wrapped, 4, payload.length);
|
||||
}
|
||||
|
||||
client.write(client.selector().malloc(wrapped));
|
||||
|
||||
if (isExtreme) {
|
||||
client.write(client.selector().malloc(payload));
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
ByteSinkLength current;
|
||||
|
||||
public ByteSinkPacket32() {
|
||||
this.reset();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
this.current = new ByteSinkLength(4) {
|
||||
@Override
|
||||
public void onReady(ByteBuffer buffer) {
|
||||
// header is received
|
||||
int len = buffer.getInt(0);
|
||||
|
||||
current = new ByteSinkLength(len) {
|
||||
@Override
|
||||
public void onReady(ByteBuffer buffer) {
|
||||
// sometime we want do reset in
|
||||
// ByteSinkPacket24.this.onReady, then add the sink back
|
||||
// to feeder, in such process, onReady should be execute
|
||||
// at last.
|
||||
current = null;
|
||||
|
||||
// content is received
|
||||
ByteSinkPacket32.this.onReady(buffer);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int feed(byte b) {
|
||||
if (this.current == null) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
int result = this.current.feed(b);
|
||||
|
||||
if (result == FEED_ACCEPTED) {
|
||||
return result;
|
||||
}
|
||||
|
||||
// 'current' will be replaced by now
|
||||
|
||||
if (this.current == null) {
|
||||
return result;
|
||||
}
|
||||
|
||||
else {
|
||||
return FEED_ACCEPTED;
|
||||
}
|
||||
// return this.current.feed(b);
|
||||
}
|
||||
}
|
141
TMessagesProj/src/main/java/jawnae/pyronet/traffic/ByteStream.java
Executable file
141
TMessagesProj/src/main/java/jawnae/pyronet/traffic/ByteStream.java
Executable file
|
@ -0,0 +1,141 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet.traffic;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import jawnae.pyronet.PyroException;
|
||||
|
||||
public class ByteStream {
|
||||
private final List<ByteBuffer> queue;
|
||||
|
||||
public ByteStream() {
|
||||
// the queue is expected to be relatively small, and iterated often.
|
||||
// hence removing the first element will be fast, even when using an
|
||||
// ArrayList
|
||||
this.queue = new ArrayList<ByteBuffer>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends the ByteBuffer instance to the ByteStream. The bytes are not
|
||||
* copied, so do not modify the contents of the ByteBuffer.
|
||||
*/
|
||||
|
||||
public void append(ByteBuffer buf) {
|
||||
if (buf == null)
|
||||
throw new NullPointerException();
|
||||
this.queue.add(buf);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether there are any bytes pending in this stream
|
||||
*/
|
||||
|
||||
public boolean hasData() {
|
||||
int size = this.queue.size();
|
||||
for (int i = 0; i < size; i++)
|
||||
if (this.queue.get(i).hasRemaining())
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public int getByteCount() {
|
||||
int size = this.queue.size();
|
||||
|
||||
int sum = 0;
|
||||
for (int i = 0; i < size; i++)
|
||||
sum += this.queue.get(i).remaining();
|
||||
return sum;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fills the specified buffer with as much bytes as possible. When N bytes
|
||||
* are read, the buffer position will be increased by N
|
||||
*/
|
||||
|
||||
public void get(ByteBuffer dst) {
|
||||
if (dst == null) {
|
||||
throw new NullPointerException();
|
||||
}
|
||||
|
||||
for (ByteBuffer data: this.queue) {
|
||||
// data pos/lim must not be modified
|
||||
data = data.slice();
|
||||
|
||||
if (data.remaining() > dst.remaining()) {
|
||||
data.limit(dst.remaining());
|
||||
dst.put(data);
|
||||
break;
|
||||
}
|
||||
|
||||
dst.put(data);
|
||||
|
||||
if (!dst.hasRemaining()) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Discards the specified amount of bytes from the stream.
|
||||
*
|
||||
* @throws PyroException
|
||||
* if it failed to discard the specified number of bytes
|
||||
*/
|
||||
|
||||
public void discard(int count) {
|
||||
int original = count;
|
||||
|
||||
while (count > 0) {
|
||||
// peek at the first buffer
|
||||
ByteBuffer data = this.queue.get(0);
|
||||
|
||||
if (count < data.remaining()) {
|
||||
// discarding less bytes than remaining in buffer
|
||||
data.position(data.position() + count);
|
||||
count = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
// discard the first buffer
|
||||
this.queue.remove(0);
|
||||
count -= data.remaining();
|
||||
}
|
||||
|
||||
if (count != 0) {
|
||||
// apparantly we cannot discard the amount of bytes
|
||||
// the user demanded, this is a bug in other code
|
||||
throw new PyroException("discarded " + (original - count) + "/"
|
||||
+ original + " bytes");
|
||||
}
|
||||
}
|
||||
|
||||
public byte read() {
|
||||
ByteBuffer data = this.queue.get(0);
|
||||
byte result = data.get();
|
||||
if (!data.hasRemaining()) {
|
||||
// discard the first buffer
|
||||
this.queue.remove(0);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
119
TMessagesProj/src/main/java/jawnae/pyronet/traffic/PyroByteSinkFeeder.java
Executable file
119
TMessagesProj/src/main/java/jawnae/pyronet/traffic/PyroByteSinkFeeder.java
Executable file
|
@ -0,0 +1,119 @@
|
|||
/*
|
||||
* Copyright (c) 2008, https://code.google.com/p/pyronet/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package jawnae.pyronet.traffic;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.LinkedList;
|
||||
|
||||
import jawnae.pyronet.PyroClient;
|
||||
import jawnae.pyronet.PyroSelector;
|
||||
import jawnae.pyronet.events.PyroClientAdapter;
|
||||
|
||||
public class PyroByteSinkFeeder extends PyroClientAdapter {
|
||||
private final PyroSelector selector;
|
||||
|
||||
private final ByteStream inbound;
|
||||
|
||||
private final LinkedList<ByteSink> sinks;
|
||||
|
||||
public PyroByteSinkFeeder(PyroClient client) {
|
||||
this(client.selector());
|
||||
}
|
||||
|
||||
public PyroByteSinkFeeder(PyroSelector selector) {
|
||||
this(selector, 8 * 1024);
|
||||
}
|
||||
|
||||
public PyroByteSinkFeeder(PyroSelector selector, int bufferSize) {
|
||||
this.selector = selector;
|
||||
this.inbound = new ByteStream();
|
||||
this.sinks = new LinkedList<ByteSink>();
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
@Override
|
||||
public void receivedData(PyroClient client, ByteBuffer data) {
|
||||
this.feed(data);
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
public ByteBuffer shutdown() {
|
||||
int bytes = this.inbound.getByteCount();
|
||||
ByteBuffer tmp = this.selector.malloc(bytes);
|
||||
this.inbound.get(tmp);
|
||||
this.inbound.discard(bytes);
|
||||
tmp.flip();
|
||||
return tmp;
|
||||
}
|
||||
|
||||
public void addByteSink(ByteSink sink) {
|
||||
this.selector.checkThread();
|
||||
|
||||
this.register(sink);
|
||||
}
|
||||
|
||||
public void feed(ByteBuffer data) {
|
||||
ByteBuffer copy = this.selector.copy(data);
|
||||
|
||||
this.inbound.append(copy);
|
||||
|
||||
this.fill();
|
||||
}
|
||||
|
||||
final void register(ByteSink sink) {
|
||||
this.sinks.addLast(sink);
|
||||
|
||||
this.fill();
|
||||
}
|
||||
|
||||
private final void fill() {
|
||||
if (this.sinks.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
ByteSink currentSink = this.sinks.removeFirst();
|
||||
|
||||
while (currentSink != null && inbound.hasData()) {
|
||||
switch (currentSink.feed(inbound.read())) {
|
||||
case ByteSink.FEED_ACCEPTED:
|
||||
continue; // continue to next feed
|
||||
|
||||
case ByteSink.FEED_ACCEPTED_LAST:
|
||||
break; // break out switch, not while
|
||||
|
||||
case ByteSink.FEED_REJECTED:
|
||||
break; // break out switch, not while
|
||||
}
|
||||
|
||||
if (this.sinks.isEmpty()) {
|
||||
currentSink = null;
|
||||
break;
|
||||
}
|
||||
|
||||
currentSink = this.sinks.removeFirst();
|
||||
}
|
||||
|
||||
if (currentSink != null) {
|
||||
this.sinks.addFirst(currentSink);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,123 @@
|
|||
// Copyright (c) 2012, Rick Maddy
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice, this
|
||||
// list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package org.telegram.PhoneFormat;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class CallingCodeInfo {
|
||||
public ArrayList<String> countries;
|
||||
public String callingCode;
|
||||
public ArrayList<String> trunkPrefixes;
|
||||
public ArrayList<String> intlPrefixes;
|
||||
public ArrayList<RuleSet> ruleSets;
|
||||
//public ArrayList formatStrings;
|
||||
|
||||
String matchingAccessCode(String str) {
|
||||
for (String code : intlPrefixes) {
|
||||
if (str.startsWith(code)) {
|
||||
return code;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
String matchingTrunkCode(String str) {
|
||||
for (String code : trunkPrefixes) {
|
||||
if (str.startsWith(code)) {
|
||||
return code;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
String format(String orig) {
|
||||
String str = orig;
|
||||
String trunkPrefix = null;
|
||||
String intlPrefix = null;
|
||||
if (str.startsWith(callingCode)) {
|
||||
intlPrefix = callingCode;
|
||||
str = str.substring(intlPrefix.length());
|
||||
} else {
|
||||
String trunk = matchingTrunkCode(str);
|
||||
if (trunk != null) {
|
||||
trunkPrefix = trunk;
|
||||
str = str.substring(trunkPrefix.length());
|
||||
}
|
||||
}
|
||||
|
||||
for (RuleSet set : ruleSets) {
|
||||
String phone = set.format(str, intlPrefix, trunkPrefix, true);
|
||||
if (phone != null) {
|
||||
return phone;
|
||||
}
|
||||
}
|
||||
|
||||
for (RuleSet set : ruleSets) {
|
||||
String phone = set.format(str, intlPrefix, trunkPrefix, false);
|
||||
if (phone != null) {
|
||||
return phone;
|
||||
}
|
||||
}
|
||||
|
||||
if (intlPrefix != null && str.length() != 0) {
|
||||
return String.format("%s %s", intlPrefix, str);
|
||||
}
|
||||
|
||||
return orig;
|
||||
}
|
||||
|
||||
boolean isValidPhoneNumber(String orig) {
|
||||
String str = orig;
|
||||
String trunkPrefix = null;
|
||||
String intlPrefix = null;
|
||||
if (str.startsWith(callingCode)) {
|
||||
intlPrefix = callingCode;
|
||||
str = str.substring(intlPrefix.length());
|
||||
} else {
|
||||
String trunk = matchingTrunkCode(str);
|
||||
if (trunk != null) {
|
||||
trunkPrefix = trunk;
|
||||
str = str.substring(trunkPrefix.length());
|
||||
}
|
||||
}
|
||||
|
||||
for (RuleSet set : ruleSets) {
|
||||
boolean valid = set.isValid(str, intlPrefix, trunkPrefix, true);
|
||||
if (valid) {
|
||||
return valid;
|
||||
}
|
||||
}
|
||||
|
||||
for (RuleSet set : ruleSets) {
|
||||
boolean valid = set.isValid(str, intlPrefix, trunkPrefix, false);
|
||||
if (valid) {
|
||||
return valid;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,365 @@
|
|||
// Copyright (c) 2012, Rick Maddy
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice, this
|
||||
// list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package org.telegram.PhoneFormat;
|
||||
|
||||
import org.telegram.messenger.Utilities;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
|
||||
public class PhoneFormat {
|
||||
public byte[] data;
|
||||
public ByteBuffer buffer;
|
||||
public String defaultCountry;
|
||||
public String defaultCallingCode;
|
||||
public HashMap<String, Integer> callingCodeOffsets;
|
||||
public HashMap<String, ArrayList<String>> callingCodeCountries;
|
||||
public HashMap<String, CallingCodeInfo> callingCodeData;
|
||||
public HashMap<String, String> countryCallingCode;
|
||||
|
||||
public static PhoneFormat Instance = new PhoneFormat();
|
||||
|
||||
public static String strip(String str) {
|
||||
StringBuilder res = new StringBuilder(str);
|
||||
String phoneChars = "0123456789+*#";
|
||||
for (int i = res.length() - 1; i >= 0; i--) {
|
||||
if (!phoneChars.contains(res.substring(i, i + 1))) {
|
||||
res.deleteCharAt(i);
|
||||
}
|
||||
}
|
||||
return res.toString();
|
||||
}
|
||||
|
||||
public static String stripExceptNumbers(String str) {
|
||||
StringBuilder res = new StringBuilder(str);
|
||||
String phoneChars = "0123456789";
|
||||
for (int i = res.length() - 1; i >= 0; i--) {
|
||||
if (!phoneChars.contains(res.substring(i, i + 1))) {
|
||||
res.deleteCharAt(i);
|
||||
}
|
||||
}
|
||||
return res.toString();
|
||||
}
|
||||
|
||||
public PhoneFormat() {
|
||||
init(null);
|
||||
}
|
||||
|
||||
public PhoneFormat(String countryCode) {
|
||||
init(countryCode);
|
||||
}
|
||||
|
||||
public void init(String countryCode) {
|
||||
try {
|
||||
InputStream stream = Utilities.applicationContext.getAssets().open("PhoneFormats.dat");
|
||||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||
byte[] buf = new byte[1024];
|
||||
int len;
|
||||
while ((len = stream.read(buf, 0, 1024)) != -1) {
|
||||
bos.write(buf, 0, len);
|
||||
}
|
||||
data = bos.toByteArray();
|
||||
buffer = ByteBuffer.wrap(data);
|
||||
buffer.order(ByteOrder.LITTLE_ENDIAN);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
if (countryCode != null && countryCode.length() != 0) {
|
||||
defaultCountry = countryCode;
|
||||
} else {
|
||||
Locale loc = Locale.getDefault();
|
||||
defaultCountry = loc.getCountry().toLowerCase();
|
||||
}
|
||||
callingCodeOffsets = new HashMap<String, Integer>(255);
|
||||
callingCodeCountries = new HashMap<String, ArrayList<String>>(255);
|
||||
callingCodeData = new HashMap<String, CallingCodeInfo>(10);
|
||||
countryCallingCode = new HashMap<String, String>(255);
|
||||
|
||||
parseDataHeader();
|
||||
}
|
||||
|
||||
public String defaultCallingCode() {
|
||||
return callingCodeForCountryCode(defaultCountry);
|
||||
}
|
||||
|
||||
public String callingCodeForCountryCode(String countryCode) {
|
||||
return countryCallingCode.get(countryCode.toLowerCase());
|
||||
}
|
||||
|
||||
public ArrayList countriesForCallingCode(String callingCode) {
|
||||
if (callingCode.startsWith("+")) {
|
||||
callingCode = callingCode.substring(1);
|
||||
}
|
||||
|
||||
return callingCodeCountries.get(callingCode);
|
||||
}
|
||||
|
||||
public CallingCodeInfo findCallingCodeInfo(String str) {
|
||||
CallingCodeInfo res = null;
|
||||
for (int i = 0; i < 3; i++) {
|
||||
if (i < str.length()) {
|
||||
res = callingCodeInfo(str.substring(0, i + 1));
|
||||
if (res != null) {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public String format(String orig) {
|
||||
String str = strip(orig);
|
||||
|
||||
if (str.startsWith("+")) {
|
||||
String rest = str.substring(1);
|
||||
CallingCodeInfo info = findCallingCodeInfo(rest);
|
||||
if (info != null) {
|
||||
String phone = info.format(rest);
|
||||
return "+" + phone;
|
||||
} else {
|
||||
return orig;
|
||||
}
|
||||
} else {
|
||||
CallingCodeInfo info = callingCodeInfo(defaultCallingCode);
|
||||
if (info == null) {
|
||||
return orig;
|
||||
}
|
||||
|
||||
String accessCode = info.matchingAccessCode(str);
|
||||
if (accessCode != null) {
|
||||
String rest = str.substring(accessCode.length());
|
||||
String phone = rest;
|
||||
CallingCodeInfo info2 = findCallingCodeInfo(rest);
|
||||
if (info2 != null) {
|
||||
phone = info2.format(rest);
|
||||
}
|
||||
|
||||
if (phone.length() == 0) {
|
||||
return accessCode;
|
||||
} else {
|
||||
return String.format("%s %s", accessCode, phone);
|
||||
}
|
||||
} else {
|
||||
return info.format(str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isPhoneNumberValid(String phoneNumber) {
|
||||
String str = strip(phoneNumber);
|
||||
|
||||
if (str.startsWith("+")) {
|
||||
String rest = str.substring(1);
|
||||
CallingCodeInfo info = findCallingCodeInfo(rest);
|
||||
return info != null && info.isValidPhoneNumber(rest);
|
||||
} else {
|
||||
CallingCodeInfo info = callingCodeInfo(defaultCallingCode);
|
||||
if (info == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
String accessCode = info.matchingAccessCode(str);
|
||||
if (accessCode != null) {
|
||||
String rest = str.substring(accessCode.length());
|
||||
if (rest.length() != 0) {
|
||||
CallingCodeInfo info2 = findCallingCodeInfo(rest);
|
||||
return info2 != null && info2.isValidPhoneNumber(rest);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return info.isValidPhoneNumber(str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int value32(int offset) {
|
||||
if (offset + 4 <= data.length) {
|
||||
buffer.position(offset);
|
||||
return buffer.getInt();
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
short value16(int offset) {
|
||||
if (offset + 2 <= data.length) {
|
||||
buffer.position(offset);
|
||||
return buffer.getShort();
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public String valueString(int offset) {
|
||||
try {
|
||||
for (int a = offset; a < data.length; a++) {
|
||||
if (data[a] == '\0') {
|
||||
if (offset == a - offset) {
|
||||
return "";
|
||||
}
|
||||
return new String(data, offset, a - offset);
|
||||
}
|
||||
}
|
||||
return "";
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
public CallingCodeInfo callingCodeInfo(String callingCode) {
|
||||
CallingCodeInfo res = callingCodeData.get(callingCode);
|
||||
if (res == null) {
|
||||
Integer num = callingCodeOffsets.get(callingCode);
|
||||
if (num != null) {
|
||||
final byte[] bytes = data;
|
||||
int start = num;
|
||||
int offset = start;
|
||||
res = new CallingCodeInfo();
|
||||
res.callingCode = callingCode;
|
||||
res.countries = callingCodeCountries.get(callingCode);
|
||||
callingCodeData.put(callingCode, res);
|
||||
|
||||
int block1Len = value16(offset);
|
||||
offset += 2;
|
||||
|
||||
offset += 2;
|
||||
int block2Len = value16(offset);
|
||||
offset += 2;
|
||||
|
||||
offset += 2;
|
||||
int setCnt = value16(offset);
|
||||
offset += 2;
|
||||
|
||||
offset += 2;
|
||||
|
||||
ArrayList<String> strs = new ArrayList<String>(5);
|
||||
String str;
|
||||
while ((str = valueString(offset)).length() != 0) {
|
||||
strs.add(str);
|
||||
offset += str.length() + 1;
|
||||
}
|
||||
res.trunkPrefixes = strs;
|
||||
offset++;
|
||||
|
||||
strs = new ArrayList<String>(5);
|
||||
while ((str = valueString(offset)).length() != 0) {
|
||||
strs.add(str);
|
||||
offset += str.length() + 1;
|
||||
}
|
||||
res.intlPrefixes = strs;
|
||||
|
||||
ArrayList<RuleSet> ruleSets = new ArrayList<RuleSet>(setCnt);
|
||||
offset = start + block1Len;
|
||||
for (int s = 0; s < setCnt; s++) {
|
||||
RuleSet ruleSet = new RuleSet();
|
||||
ruleSet.matchLen = value16(offset);
|
||||
offset += 2;
|
||||
int ruleCnt = value16(offset);
|
||||
offset += 2;
|
||||
ArrayList<PhoneRule> rules = new ArrayList<PhoneRule>(ruleCnt);
|
||||
for (int r = 0; r < ruleCnt; r++) {
|
||||
PhoneRule rule = new PhoneRule();
|
||||
rule.minVal = value32(offset);
|
||||
offset += 4;
|
||||
rule.maxVal = value32(offset);
|
||||
offset += 4;
|
||||
rule.byte8 = (int)bytes[offset++];
|
||||
rule.maxLen = (int)bytes[offset++];
|
||||
rule.otherFlag = (int)bytes[offset++];
|
||||
rule.prefixLen = (int)bytes[offset++];
|
||||
rule.flag12 = (int)bytes[offset++];
|
||||
rule.flag13 = (int)bytes[offset++];
|
||||
int strOffset = value16(offset);
|
||||
offset += 2;
|
||||
rule.format = valueString(start + block1Len + block2Len + strOffset);
|
||||
|
||||
int openPos = rule.format.indexOf("[[");
|
||||
if (openPos != -1) {
|
||||
int closePos = rule.format.indexOf("]]");
|
||||
rule.format = String.format("%s%s", rule.format.substring(0, openPos), rule.format.substring(closePos + 2));
|
||||
}
|
||||
|
||||
rules.add(rule);
|
||||
|
||||
if (rule.hasIntlPrefix) {
|
||||
ruleSet.hasRuleWithIntlPrefix = true;
|
||||
}
|
||||
if (rule.hasTrunkPrefix) {
|
||||
ruleSet.hasRuleWithTrunkPrefix = true;
|
||||
}
|
||||
}
|
||||
ruleSet.rules = rules;
|
||||
ruleSets.add(ruleSet);
|
||||
}
|
||||
res.ruleSets = ruleSets;
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public void parseDataHeader() {
|
||||
int count = value32(0);
|
||||
int base = count * 12 + 4;
|
||||
int spot = 4;
|
||||
for (int i = 0; i < count; i++) {
|
||||
String callingCode = valueString(spot);
|
||||
spot += 4;
|
||||
String country = valueString(spot);
|
||||
spot += 4;
|
||||
int offset = value32(spot) + base;
|
||||
spot += 4;
|
||||
|
||||
if (country.equals(defaultCountry)) {
|
||||
defaultCallingCode = callingCode;
|
||||
}
|
||||
|
||||
countryCallingCode.put(country, callingCode);
|
||||
|
||||
callingCodeOffsets.put(callingCode, offset);
|
||||
ArrayList<String> countries = callingCodeCountries.get(callingCode);
|
||||
if (countries == null) {
|
||||
countries = new ArrayList<String>();
|
||||
callingCodeCountries.put(callingCode, countries);
|
||||
}
|
||||
countries.add(country);
|
||||
}
|
||||
|
||||
if (defaultCallingCode != null) {
|
||||
callingCodeInfo(defaultCallingCode);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,101 @@
|
|||
// Copyright (c) 2012, Rick Maddy
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice, this
|
||||
// list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package org.telegram.PhoneFormat;
|
||||
|
||||
public class PhoneRule {
|
||||
public int minVal;
|
||||
public int maxVal;
|
||||
public int byte8;
|
||||
public int maxLen;
|
||||
public int otherFlag;
|
||||
public int prefixLen;
|
||||
public int flag12;
|
||||
public int flag13;
|
||||
public String format;
|
||||
public boolean hasIntlPrefix;
|
||||
public boolean hasTrunkPrefix;
|
||||
|
||||
String format(String str, String intlPrefix, String trunkPrefix) {
|
||||
boolean hadC = false;
|
||||
boolean hadN = false;
|
||||
boolean hasOpen = false;
|
||||
int spot = 0;
|
||||
StringBuilder res = new StringBuilder(20);
|
||||
for (int i = 0; i < format.length(); i++) {
|
||||
char ch = format.charAt(i);
|
||||
switch (ch) {
|
||||
case 'c':
|
||||
hadC = true;
|
||||
if (intlPrefix != null) {
|
||||
res.append(intlPrefix);
|
||||
}
|
||||
break;
|
||||
case 'n':
|
||||
hadN = true;
|
||||
if (trunkPrefix != null) {
|
||||
res.append(trunkPrefix);
|
||||
}
|
||||
break;
|
||||
case '#':
|
||||
if (spot < str.length()) {
|
||||
res.append(str.substring(spot, spot + 1));
|
||||
spot++;
|
||||
} else if (hasOpen) {
|
||||
res.append(" ");
|
||||
}
|
||||
break;
|
||||
case '(':
|
||||
if (spot < str.length()) {
|
||||
hasOpen = true;
|
||||
}
|
||||
default:
|
||||
if (!(ch == ' ' && i > 0 && ((format.charAt(i - 1) == 'n' && trunkPrefix == null) || (format.charAt(i - 1) == 'c' && intlPrefix == null)))) {
|
||||
if (spot < str.length() || (hasOpen && ch == ')')) {
|
||||
res.append(format.substring(i, i + 1));
|
||||
if (ch == ')') {
|
||||
hasOpen = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (intlPrefix != null && !hadC) {
|
||||
res.insert(0, String.format("%s ", intlPrefix));
|
||||
} else if (trunkPrefix != null && !hadN) {
|
||||
res.insert(0, trunkPrefix);
|
||||
}
|
||||
|
||||
return res.toString();
|
||||
}
|
||||
|
||||
boolean hasIntlPrefix() {
|
||||
return (flag12 & 0x02) != 0;
|
||||
}
|
||||
|
||||
boolean hasTrunkPrefix() {
|
||||
return (flag12 & 0x01) != 0;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,138 @@
|
|||
// Copyright (c) 2012, Rick Maddy
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice, this
|
||||
// list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package org.telegram.PhoneFormat;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class RuleSet {
|
||||
public int matchLen;
|
||||
public ArrayList<PhoneRule> rules;
|
||||
public boolean hasRuleWithIntlPrefix;
|
||||
public boolean hasRuleWithTrunkPrefix;
|
||||
public static Pattern pattern = Pattern.compile("[0-9]+");
|
||||
|
||||
String format(String str, String intlPrefix, String trunkPrefix, boolean prefixRequired) {
|
||||
if (str.length() >= matchLen) {
|
||||
String begin = str.substring(0, matchLen);
|
||||
|
||||
int val = 0;
|
||||
Matcher matcher = pattern.matcher(begin);
|
||||
if (matcher.find()) {
|
||||
String num = matcher.group(0);
|
||||
val = Integer.parseInt(num);
|
||||
}
|
||||
|
||||
for (PhoneRule rule : rules) {
|
||||
if (val >= rule.minVal && val <= rule.maxVal && str.length() <= rule.maxLen) {
|
||||
if (prefixRequired) {
|
||||
if (((rule.flag12 & 0x03) == 0 && trunkPrefix == null && intlPrefix == null) || (trunkPrefix != null && (rule.flag12 & 0x01) != 0) || (intlPrefix != null && (rule.flag12 & 0x02) != 0)) {
|
||||
return rule.format(str, intlPrefix, trunkPrefix);
|
||||
}
|
||||
} else {
|
||||
if ((trunkPrefix == null && intlPrefix == null) || (trunkPrefix != null && (rule.flag12 & 0x01) != 0) || (intlPrefix != null && (rule.flag12 & 0x02) != 0)) {
|
||||
return rule.format(str, intlPrefix, trunkPrefix);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!prefixRequired) {
|
||||
if (intlPrefix != null) {
|
||||
for (PhoneRule rule : rules) {
|
||||
if (val >= rule.minVal && val <= rule.maxVal && str.length() <= rule.maxLen) {
|
||||
if (trunkPrefix == null || (rule.flag12 & 0x01) != 0) {
|
||||
return rule.format(str, intlPrefix, trunkPrefix);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (trunkPrefix != null) {
|
||||
for (PhoneRule rule : rules) {
|
||||
if (val >= rule.minVal && val <= rule.maxVal && str.length() <= rule.maxLen) {
|
||||
if (intlPrefix == null || (rule.flag12 & 0x02) != 0) {
|
||||
return rule.format(str, intlPrefix, trunkPrefix);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
boolean isValid(String str, String intlPrefix, String trunkPrefix, boolean prefixRequired) {
|
||||
if (str.length() >= matchLen) {
|
||||
String begin = str.substring(0, matchLen);
|
||||
int val = 0;
|
||||
Matcher matcher = pattern.matcher(begin);
|
||||
if (matcher.find()) {
|
||||
String num = matcher.group(0);
|
||||
val = Integer.parseInt(num);
|
||||
}
|
||||
|
||||
for (PhoneRule rule : rules) {
|
||||
if (val >= rule.minVal && val <= rule.maxVal && str.length() == rule.maxLen) {
|
||||
if (prefixRequired) {
|
||||
if (((rule.flag12 & 0x03) == 0 && trunkPrefix == null && intlPrefix == null) || (trunkPrefix != null && (rule.flag12 & 0x01) != 0) || (intlPrefix != null && (rule.flag12 & 0x02) != 0)) {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
if ((trunkPrefix == null && intlPrefix == null) || (trunkPrefix != null && (rule.flag12 & 0x01) != 0) || (intlPrefix != null && (rule.flag12 & 0x02) != 0)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!prefixRequired) {
|
||||
if (intlPrefix != null && !hasRuleWithIntlPrefix) {
|
||||
for (PhoneRule rule : rules) {
|
||||
if (val >= rule.minVal && val <= rule.maxVal && str.length() == rule.maxLen) {
|
||||
if (trunkPrefix == null || (rule.flag12 & 0x01) != 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (trunkPrefix != null && !hasRuleWithTrunkPrefix) {
|
||||
for (PhoneRule rule : rules) {
|
||||
if (val >= rule.minVal && val <= rule.maxVal && str.length() == rule.maxLen) {
|
||||
if (intlPrefix == null || (rule.flag12 & 0x02) != 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
125
TMessagesProj/src/main/java/org/telegram/SQLite/SQLiteCursor.java
Executable file
125
TMessagesProj/src/main/java/org/telegram/SQLite/SQLiteCursor.java
Executable file
|
@ -0,0 +1,125 @@
|
|||
/*
|
||||
* This is the source code of Telegram for Android v. 1.2.3.
|
||||
* It is licensed under GNU GPL v. 2 or later.
|
||||
* You should have received a copy of the license in this archive (see LICENSE).
|
||||
*
|
||||
* Copyright Nikolai Kudashov, 2013.
|
||||
*/
|
||||
|
||||
package org.telegram.SQLite;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
public class SQLiteCursor {
|
||||
|
||||
public static final int FIELD_TYPE_INT = 1;
|
||||
public static final int FIELD_TYPE_FLOAT = 2;
|
||||
public static final int FIELD_TYPE_STRING = 3;
|
||||
public static final int FIELD_TYPE_BYTEARRAY = 4;
|
||||
public static final int FIELD_TYPE_NULL = 5;
|
||||
|
||||
SQLitePreparedStatement preparedStatement;
|
||||
boolean inRow = false;
|
||||
|
||||
public SQLiteCursor(SQLitePreparedStatement stmt) {
|
||||
preparedStatement = stmt;
|
||||
}
|
||||
|
||||
public boolean isNull(int columnIndex) throws SQLiteException {
|
||||
checkRow();
|
||||
return columnIsNull(preparedStatement.getStatementHandle(), columnIndex) == 1;
|
||||
}
|
||||
|
||||
public int intValue(int columnIndex) throws SQLiteException {
|
||||
checkRow();
|
||||
return columnIntValue(preparedStatement.getStatementHandle(), columnIndex);
|
||||
}
|
||||
|
||||
public double doubleValue(int columnIndex) throws SQLiteException {
|
||||
checkRow();
|
||||
return columnDoubleValue(preparedStatement.getStatementHandle(), columnIndex);
|
||||
}
|
||||
|
||||
public long longValue(int columnIndex) throws SQLiteException {
|
||||
checkRow();
|
||||
return columnLongValue(preparedStatement.getStatementHandle(), columnIndex);
|
||||
}
|
||||
|
||||
public String stringValue(int columnIndex) throws SQLiteException {
|
||||
checkRow();
|
||||
return columnStringValue(preparedStatement.getStatementHandle(), columnIndex);
|
||||
}
|
||||
|
||||
public byte[] byteArrayValue(int columnIndex) throws SQLiteException {
|
||||
checkRow();
|
||||
return columnByteArrayValue(preparedStatement.getStatementHandle(), columnIndex);
|
||||
}
|
||||
|
||||
public int getTypeOf(int columnIndex) throws SQLiteException {
|
||||
checkRow();
|
||||
return columnType(preparedStatement.getStatementHandle(), columnIndex);
|
||||
}
|
||||
|
||||
public Object objectValue(int columnIndex) throws SQLiteException {
|
||||
checkRow();
|
||||
|
||||
int type = columnType(preparedStatement.getStatementHandle(), columnIndex);
|
||||
switch (type) {
|
||||
case FIELD_TYPE_INT:
|
||||
return intValue(columnIndex);
|
||||
case FIELD_TYPE_BYTEARRAY:
|
||||
return byteArrayValue(columnIndex);
|
||||
case FIELD_TYPE_FLOAT:
|
||||
return doubleValue(columnIndex);
|
||||
case FIELD_TYPE_STRING:
|
||||
return stringValue(columnIndex);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean next() throws SQLiteException {
|
||||
int res = preparedStatement.step(preparedStatement.getStatementHandle());
|
||||
if(res == -1) {
|
||||
int repeatCount = 6;
|
||||
while (repeatCount-- != 0) {
|
||||
try {
|
||||
Log.e("tmessages", "sqlite busy, waiting...");
|
||||
Thread.sleep(500);
|
||||
res = preparedStatement.step();
|
||||
if (res == 0) {
|
||||
break;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
if (res == -1) {
|
||||
throw new SQLiteException("sqlite busy");
|
||||
}
|
||||
}
|
||||
inRow = (res == 0);
|
||||
return inRow;
|
||||
}
|
||||
|
||||
public int getStatementHandle() {
|
||||
return preparedStatement.getStatementHandle();
|
||||
}
|
||||
|
||||
public void dispose() {
|
||||
preparedStatement.dispose();
|
||||
}
|
||||
|
||||
void checkRow() throws SQLiteException {
|
||||
if (!inRow) {
|
||||
throw new SQLiteException("You must call next before");
|
||||
}
|
||||
}
|
||||
|
||||
native int columnType(int statementHandle, int columnIndex);
|
||||
native int columnIsNull(int statementHandle, int columnIndex);
|
||||
native int columnIntValue(int statementHandle, int columnIndex);
|
||||
native long columnLongValue(int statementHandle, int columnIndex);
|
||||
native double columnDoubleValue(int statementHandle, int columnIndex);
|
||||
native String columnStringValue(int statementHandle, int columnIndex);
|
||||
native byte[] columnByteArrayValue(int statementHandle, int columnIndex);
|
||||
}
|
149
TMessagesProj/src/main/java/org/telegram/SQLite/SQLiteDatabase.java
Executable file
149
TMessagesProj/src/main/java/org/telegram/SQLite/SQLiteDatabase.java
Executable file
|
@ -0,0 +1,149 @@
|
|||
/*
|
||||
* This is the source code of Telegram for Android v. 1.2.3.
|
||||
* It is licensed under GNU GPL v. 2 or later.
|
||||
* You should have received a copy of the license in this archive (see LICENSE).
|
||||
*
|
||||
* Copyright Nikolai Kudashov, 2013.
|
||||
*/
|
||||
|
||||
package org.telegram.SQLite;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
public class SQLiteDatabase {
|
||||
private final int sqliteHandle;
|
||||
|
||||
private final Map<String, SQLitePreparedStatement> preparedMap;
|
||||
private boolean isOpen = false;
|
||||
private boolean inTransaction = false;
|
||||
|
||||
public int getSQLiteHandle() {
|
||||
return sqliteHandle;
|
||||
}
|
||||
|
||||
public SQLiteDatabase(String fileName) throws SQLiteException {
|
||||
sqliteHandle = opendb(fileName);
|
||||
isOpen = true;
|
||||
preparedMap = new HashMap<String, SQLitePreparedStatement>();
|
||||
}
|
||||
|
||||
public boolean tableExists(String tableName) throws SQLiteException {
|
||||
checkOpened();
|
||||
String s = "SELECT rowid FROM sqlite_master WHERE type='table' AND name=?;";
|
||||
return executeInt(s, tableName) != null;
|
||||
}
|
||||
|
||||
public void execute(String sql, Object... args) throws SQLiteException {
|
||||
checkOpened();
|
||||
SQLiteCursor cursor = query(sql, args);
|
||||
try {
|
||||
cursor.next();
|
||||
} finally {
|
||||
cursor.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public SQLitePreparedStatement executeFast(String sql) throws SQLiteException{
|
||||
return new SQLitePreparedStatement(this, sql, true);
|
||||
}
|
||||
|
||||
public Integer executeInt(String sql, Object... args) throws SQLiteException {
|
||||
checkOpened();
|
||||
SQLiteCursor cursor = query(sql, args);
|
||||
try {
|
||||
if (!cursor.next()) {
|
||||
return null;
|
||||
}
|
||||
return cursor.intValue(0);
|
||||
} finally {
|
||||
cursor.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public int executeIntOrThrow(String sql, Object... args) throws SQLiteException, SQLiteNoRowException {
|
||||
checkOpened();
|
||||
Integer val = executeInt(sql, args);
|
||||
if (val != null) {
|
||||
return val;
|
||||
}
|
||||
|
||||
throw new SQLiteNoRowException();
|
||||
}
|
||||
|
||||
public String executeString(String sql, Object... args) throws SQLiteException {
|
||||
checkOpened();
|
||||
SQLiteCursor cursor = query(sql, args);
|
||||
try {
|
||||
if (!cursor.next()) {
|
||||
return null;
|
||||
}
|
||||
return cursor.stringValue(0);
|
||||
} finally {
|
||||
cursor.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public SQLiteCursor query(String sql, Object... args) throws SQLiteException {
|
||||
checkOpened();
|
||||
SQLitePreparedStatement stmt = preparedMap.get(sql);
|
||||
|
||||
if (stmt == null) {
|
||||
stmt = new SQLitePreparedStatement(this, sql, false);
|
||||
preparedMap.put(sql, stmt);
|
||||
}
|
||||
|
||||
return stmt.query(args);
|
||||
}
|
||||
|
||||
public SQLiteCursor queryFinalized(String sql, Object... args) throws SQLiteException {
|
||||
checkOpened();
|
||||
return new SQLitePreparedStatement(this, sql, true).query(args);
|
||||
}
|
||||
|
||||
public void close() {
|
||||
if (isOpen) {
|
||||
try {
|
||||
for (SQLitePreparedStatement stmt : preparedMap.values()) {
|
||||
stmt.finalizeQuery();
|
||||
}
|
||||
closedb(sqliteHandle);
|
||||
} catch (SQLiteException e) {
|
||||
Log.e("tmessages", e.getMessage(), e);
|
||||
}
|
||||
isOpen = false;
|
||||
}
|
||||
}
|
||||
|
||||
void checkOpened() throws SQLiteException {
|
||||
if (!isOpen) {
|
||||
throw new SQLiteException("Database closed");
|
||||
}
|
||||
}
|
||||
|
||||
public void finalize() throws Throwable {
|
||||
super.finalize();
|
||||
close();
|
||||
}
|
||||
|
||||
private StackTraceElement[] temp;
|
||||
public void beginTransaction() throws SQLiteException {
|
||||
if (inTransaction) {
|
||||
throw new SQLiteException("database already in transaction");
|
||||
}
|
||||
inTransaction = true;
|
||||
beginTransaction(sqliteHandle);
|
||||
}
|
||||
|
||||
public void commitTransaction() {
|
||||
inTransaction = false;
|
||||
commitTransaction(sqliteHandle);
|
||||
}
|
||||
|
||||
native int opendb(String fileName) throws SQLiteException;
|
||||
native void closedb(int sqliteHandle) throws SQLiteException;
|
||||
native void beginTransaction(int sqliteHandle);
|
||||
native void commitTransaction(int sqliteHandle);
|
||||
}
|
27
TMessagesProj/src/main/java/org/telegram/SQLite/SQLiteException.java
Executable file
27
TMessagesProj/src/main/java/org/telegram/SQLite/SQLiteException.java
Executable file
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* This is the source code of Telegram for Android v. 1.2.3.
|
||||
* It is licensed under GNU GPL v. 2 or later.
|
||||
* You should have received a copy of the license in this archive (see LICENSE).
|
||||
*
|
||||
* Copyright Nikolai Kudashov, 2013.
|
||||
*/
|
||||
|
||||
package org.telegram.SQLite;
|
||||
|
||||
public class SQLiteException extends Exception {
|
||||
private static final long serialVersionUID = -2398298479089615621L;
|
||||
public final int errorCode;
|
||||
|
||||
public SQLiteException(int errcode, String msg) {
|
||||
super(msg);
|
||||
errorCode = errcode;
|
||||
}
|
||||
|
||||
public SQLiteException(String msg) {
|
||||
this(0, msg);
|
||||
}
|
||||
|
||||
public SQLiteException() {
|
||||
errorCode = 0;
|
||||
}
|
||||
}
|
13
TMessagesProj/src/main/java/org/telegram/SQLite/SQLiteNoRowException.java
Executable file
13
TMessagesProj/src/main/java/org/telegram/SQLite/SQLiteNoRowException.java
Executable file
|
@ -0,0 +1,13 @@
|
|||
/*
|
||||
* This is the source code of Telegram for Android v. 1.2.3.
|
||||
* It is licensed under GNU GPL v. 2 or later.
|
||||
* You should have received a copy of the license in this archive (see LICENSE).
|
||||
*
|
||||
* Copyright Nikolai Kudashov, 2013.
|
||||
*/
|
||||
|
||||
package org.telegram.SQLite;
|
||||
|
||||
public class SQLiteNoRowException extends Exception {
|
||||
private static final long serialVersionUID = 4098095358028103112L;
|
||||
}
|
127
TMessagesProj/src/main/java/org/telegram/SQLite/SQLitePreparedStatement.java
Executable file
127
TMessagesProj/src/main/java/org/telegram/SQLite/SQLitePreparedStatement.java
Executable file
|
@ -0,0 +1,127 @@
|
|||
/*
|
||||
* This is the source code of Telegram for Android v. 1.2.3.
|
||||
* It is licensed under GNU GPL v. 2 or later.
|
||||
* You should have received a copy of the license in this archive (see LICENSE).
|
||||
*
|
||||
* Copyright Nikolai Kudashov, 2013.
|
||||
*/
|
||||
|
||||
package org.telegram.SQLite;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
public class SQLitePreparedStatement {
|
||||
private boolean isFinalized = false;
|
||||
private int sqliteStatementHandle;
|
||||
|
||||
private int queryArgsCount;
|
||||
private boolean finalizeAfterQuery = false;
|
||||
|
||||
public int getStatementHandle() {
|
||||
return sqliteStatementHandle;
|
||||
}
|
||||
|
||||
public SQLitePreparedStatement(SQLiteDatabase db, String sql, boolean finalize) throws SQLiteException {
|
||||
finalizeAfterQuery = finalize;
|
||||
sqliteStatementHandle = prepare(db.getSQLiteHandle(), sql);
|
||||
}
|
||||
|
||||
public SQLiteCursor query(Object[] args) throws SQLiteException {
|
||||
if (args == null || args.length != queryArgsCount) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
|
||||
checkFinalized();
|
||||
|
||||
reset(sqliteStatementHandle);
|
||||
|
||||
int i = 1;
|
||||
for (Object obj : args) {
|
||||
if (obj == null) {
|
||||
bindNull(sqliteStatementHandle, i);
|
||||
} else if (obj instanceof Integer) {
|
||||
bindInt(sqliteStatementHandle, i, (Integer)obj);
|
||||
} else if (obj instanceof Double) {
|
||||
bindDouble(sqliteStatementHandle, i, (Double)obj);
|
||||
} else if (obj instanceof String) {
|
||||
bindString(sqliteStatementHandle, i, (String)obj);
|
||||
} else if (obj instanceof byte[]) {
|
||||
bindByteArray(sqliteStatementHandle, i, (byte[])obj);
|
||||
} else {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
return new SQLiteCursor(this);
|
||||
}
|
||||
|
||||
public int step() throws SQLiteException {
|
||||
return step(sqliteStatementHandle);
|
||||
}
|
||||
|
||||
public SQLitePreparedStatement stepThis() throws SQLiteException {
|
||||
step(sqliteStatementHandle);
|
||||
return this;
|
||||
}
|
||||
|
||||
public void requery() throws SQLiteException {
|
||||
checkFinalized();
|
||||
reset(sqliteStatementHandle);
|
||||
}
|
||||
|
||||
public void dispose() {
|
||||
if (finalizeAfterQuery) {
|
||||
finalizeQuery();
|
||||
}
|
||||
}
|
||||
|
||||
void checkFinalized() throws SQLiteException {
|
||||
if (isFinalized) {
|
||||
throw new SQLiteException("Prepared query finalized");
|
||||
}
|
||||
}
|
||||
|
||||
public void finalizeQuery() {
|
||||
if (isFinalized) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
isFinalized = true;
|
||||
finalize(sqliteStatementHandle);
|
||||
} catch (SQLiteException e) {
|
||||
Log.e("tmessages", e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
public void bindInteger(int index, int value) throws SQLiteException {
|
||||
bindInt(sqliteStatementHandle, index, value);
|
||||
}
|
||||
|
||||
public void bindDouble(int index, double value) throws SQLiteException {
|
||||
bindDouble(sqliteStatementHandle, index, value);
|
||||
}
|
||||
|
||||
public void bindByteArray(int index, byte[] value) throws SQLiteException {
|
||||
bindByteArray(sqliteStatementHandle, index, value);
|
||||
}
|
||||
|
||||
public void bindString(int index, String value) throws SQLiteException {
|
||||
bindString(sqliteStatementHandle, index, value);
|
||||
}
|
||||
|
||||
public void bindLong(int index, long value) throws SQLiteException {
|
||||
bindLong(sqliteStatementHandle, index, value);
|
||||
}
|
||||
|
||||
native void bindByteArray(int statementHandle, int index, byte[] value) throws SQLiteException;
|
||||
native void bindString(int statementHandle, int index, String value) throws SQLiteException;
|
||||
native void bindInt(int statementHandle, int index, int value) throws SQLiteException;
|
||||
native void bindLong(int statementHandle, int index, long value) throws SQLiteException;
|
||||
native void bindDouble(int statementHandle, int index, double value) throws SQLiteException;
|
||||
native void bindNull(int statementHandle, int index) throws SQLiteException;
|
||||
native void reset(int statementHandle) throws SQLiteException;
|
||||
native int prepare(int sqliteHandle, String sql) throws SQLiteException;
|
||||
native void finalize(int statementHandle) throws SQLiteException;
|
||||
native int step(int statementHandle) throws SQLiteException;
|
||||
}
|
436
TMessagesProj/src/main/java/org/telegram/TL/TLClassStore.java
Normal file
436
TMessagesProj/src/main/java/org/telegram/TL/TLClassStore.java
Normal file
|
@ -0,0 +1,436 @@
|
|||
/*
|
||||
* This is the source code of Telegram for Android v. 1.2.3.
|
||||
* It is licensed under GNU GPL v. 2 or later.
|
||||
* You should have received a copy of the license in this archive (see LICENSE).
|
||||
*
|
||||
* Copyright Nikolai Kudashov, 2013.
|
||||
*/
|
||||
|
||||
package org.telegram.TL;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import org.telegram.messenger.ConnectionsManager;
|
||||
import org.telegram.messenger.SerializedData;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
public class TLClassStore {
|
||||
private HashMap<Integer, Class> classStore;
|
||||
|
||||
public TLClassStore () {
|
||||
classStore = new HashMap<Integer, Class>();
|
||||
|
||||
classStore.put(TLRPC.TL_chatPhotoEmpty.constructor, TLRPC.TL_chatPhotoEmpty.class);
|
||||
classStore.put(TLRPC.TL_chatPhoto.constructor, TLRPC.TL_chatPhoto.class);
|
||||
classStore.put(TLRPC.TL_futuresalts.constructor, TLRPC.TL_futuresalts.class);
|
||||
classStore.put(TLRPC.TL_bad_msg_notification.constructor, TLRPC.TL_bad_msg_notification.class);
|
||||
classStore.put(TLRPC.TL_bad_server_salt.constructor, TLRPC.TL_bad_server_salt.class);
|
||||
classStore.put(TLRPC.TL_error.constructor, TLRPC.TL_error.class);
|
||||
classStore.put(TLRPC.TL_messages_sentEncryptedMessage.constructor, TLRPC.TL_messages_sentEncryptedMessage.class);
|
||||
classStore.put(TLRPC.TL_messages_sentEncryptedFile.constructor, TLRPC.TL_messages_sentEncryptedFile.class);
|
||||
classStore.put(TLRPC.TL_auth_checkedPhone.constructor, TLRPC.TL_auth_checkedPhone.class);
|
||||
classStore.put(TLRPC.TL_msgs_ack.constructor, TLRPC.TL_msgs_ack.class);
|
||||
classStore.put(TLRPC.TL_messages_chatFull.constructor, TLRPC.TL_messages_chatFull.class);
|
||||
classStore.put(TLRPC.TL_rpc_result.constructor, TLRPC.TL_rpc_result.class);
|
||||
classStore.put(TLRPC.TL_contactStatus.constructor, TLRPC.TL_contactStatus.class);
|
||||
classStore.put(TLRPC.TL_auth_authorization.constructor, TLRPC.TL_auth_authorization.class);
|
||||
classStore.put(TLRPC.TL_messages_messages.constructor, TLRPC.TL_messages_messages.class);
|
||||
classStore.put(TLRPC.TL_messages_messagesSlice.constructor, TLRPC.TL_messages_messagesSlice.class);
|
||||
classStore.put(TLRPC.TL_rpc_answer_unknown.constructor, TLRPC.TL_rpc_answer_unknown.class);
|
||||
classStore.put(TLRPC.TL_rpc_answer_dropped.constructor, TLRPC.TL_rpc_answer_dropped.class);
|
||||
classStore.put(TLRPC.TL_rpc_answer_dropped_running.constructor, TLRPC.TL_rpc_answer_dropped_running.class);
|
||||
classStore.put(TLRPC.TL_contacts_link.constructor, TLRPC.TL_contacts_link.class);
|
||||
classStore.put(TLRPC.TL_encryptedFile.constructor, TLRPC.TL_encryptedFile.class);
|
||||
classStore.put(TLRPC.TL_encryptedFileEmpty.constructor, TLRPC.TL_encryptedFileEmpty.class);
|
||||
classStore.put(TLRPC.TL_peerUser.constructor, TLRPC.TL_peerUser.class);
|
||||
classStore.put(TLRPC.TL_peerChat.constructor, TLRPC.TL_peerChat.class);
|
||||
classStore.put(TLRPC.TL_destroy_session_ok.constructor, TLRPC.TL_destroy_session_ok.class);
|
||||
classStore.put(TLRPC.TL_destroy_session_none.constructor, TLRPC.TL_destroy_session_none.class);
|
||||
classStore.put(TLRPC.TL_updates_difference.constructor, TLRPC.TL_updates_difference.class);
|
||||
classStore.put(TLRPC.TL_updates_getDifference.constructor, TLRPC.TL_updates_getDifference.class);
|
||||
classStore.put(TLRPC.TL_updates_differenceSlice.constructor, TLRPC.TL_updates_differenceSlice.class);
|
||||
classStore.put(TLRPC.TL_updates_differenceEmpty.constructor, TLRPC.TL_updates_differenceEmpty.class);
|
||||
classStore.put(TLRPC.TL_geoPointEmpty.constructor, TLRPC.TL_geoPointEmpty.class);
|
||||
classStore.put(TLRPC.TL_geoPoint.constructor, TLRPC.TL_geoPoint.class);
|
||||
classStore.put(TLRPC.TL_messageForwarded.constructor, TLRPC.TL_messageForwarded.class);
|
||||
classStore.put(TLRPC.TL_messageEmpty.constructor, TLRPC.TL_messageEmpty.class);
|
||||
classStore.put(TLRPC.TL_message.constructor, TLRPC.TL_message.class);
|
||||
classStore.put(TLRPC.TL_messageService.constructor, TLRPC.TL_messageService.class);
|
||||
classStore.put(TLRPC.TL_inputPhoneContact.constructor, TLRPC.TL_inputPhoneContact.class);
|
||||
classStore.put(TLRPC.TL_invokeAfterMsg.constructor, TLRPC.TL_invokeAfterMsg.class);
|
||||
classStore.put(TLRPC.TL_messageMediaVideo.constructor, TLRPC.TL_messageMediaVideo.class);
|
||||
classStore.put(TLRPC.TL_messageMediaGeo.constructor, TLRPC.TL_messageMediaGeo.class);
|
||||
classStore.put(TLRPC.TL_messageMediaPhoto.constructor, TLRPC.TL_messageMediaPhoto.class);
|
||||
classStore.put(TLRPC.TL_messageMediaEmpty.constructor, TLRPC.TL_messageMediaEmpty.class);
|
||||
classStore.put(TLRPC.TL_messageMediaContact.constructor, TLRPC.TL_messageMediaContact.class);
|
||||
classStore.put(TLRPC.TL_auth_sentCode.constructor, TLRPC.TL_auth_sentCode.class);
|
||||
classStore.put(TLRPC.TL_peerNotifySettingsEmpty.constructor, TLRPC.TL_peerNotifySettingsEmpty.class);
|
||||
classStore.put(TLRPC.TL_peerNotifySettings.constructor, TLRPC.TL_peerNotifySettings.class);
|
||||
classStore.put(TLRPC.TL_msg_resend_req.constructor, TLRPC.TL_msg_resend_req.class);
|
||||
classStore.put(TLRPC.TL_http_wait.constructor, TLRPC.TL_http_wait.class);
|
||||
classStore.put(TLRPC.TL_contacts_blocked.constructor, TLRPC.TL_contacts_blocked.class);
|
||||
classStore.put(TLRPC.TL_contacts_blockedSlice.constructor, TLRPC.TL_contacts_blockedSlice.class);
|
||||
classStore.put(TLRPC.TL_inputGeoPoint.constructor, TLRPC.TL_inputGeoPoint.class);
|
||||
classStore.put(TLRPC.TL_inputGeoPointEmpty.constructor, TLRPC.TL_inputGeoPointEmpty.class);
|
||||
classStore.put(TLRPC.TL_help_inviteText.constructor, TLRPC.TL_help_inviteText.class);
|
||||
classStore.put(TLRPC.TL_messages_dhConfigNotModified.constructor, TLRPC.TL_messages_dhConfigNotModified.class);
|
||||
classStore.put(TLRPC.TL_messages_dhConfig.constructor, TLRPC.TL_messages_dhConfig.class);
|
||||
classStore.put(TLRPC.TL_destroy_sessions_res.constructor, TLRPC.TL_destroy_sessions_res.class);
|
||||
classStore.put(TLRPC.TL_contacts_contacts.constructor, TLRPC.TL_contacts_contacts.class);
|
||||
classStore.put(TLRPC.TL_contacts_contactsNotModified.constructor, TLRPC.TL_contacts_contactsNotModified.class);
|
||||
classStore.put(TLRPC.TL_photos_photos.constructor, TLRPC.TL_photos_photos.class);
|
||||
classStore.put(TLRPC.TL_photos_photosSlice.constructor, TLRPC.TL_photos_photosSlice.class);
|
||||
classStore.put(TLRPC.TL_chatFull.constructor, TLRPC.TL_chatFull.class);
|
||||
classStore.put(TLRPC.TL_msgs_all_info.constructor, TLRPC.TL_msgs_all_info.class);
|
||||
classStore.put(TLRPC.TL_inputPeerNotifySettings.constructor, TLRPC.TL_inputPeerNotifySettings.class);
|
||||
classStore.put(TLRPC.TL_null.constructor, TLRPC.TL_null.class);
|
||||
classStore.put(TLRPC.TL_inputUserSelf.constructor, TLRPC.TL_inputUserSelf.class);
|
||||
classStore.put(TLRPC.TL_inputUserForeign.constructor, TLRPC.TL_inputUserForeign.class);
|
||||
classStore.put(TLRPC.TL_inputUserEmpty.constructor, TLRPC.TL_inputUserEmpty.class);
|
||||
classStore.put(TLRPC.TL_inputUserContact.constructor, TLRPC.TL_inputUserContact.class);
|
||||
classStore.put(TLRPC.TL_p_q_inner_data.constructor, TLRPC.TL_p_q_inner_data.class);
|
||||
classStore.put(TLRPC.TL_msgs_state_req.constructor, TLRPC.TL_msgs_state_req.class);
|
||||
classStore.put(TLRPC.TL_boolTrue.constructor, TLRPC.TL_boolTrue.class);
|
||||
classStore.put(TLRPC.TL_boolFalse.constructor, TLRPC.TL_boolFalse.class);
|
||||
classStore.put(TLRPC.TL_auth_exportedAuthorization.constructor, TLRPC.TL_auth_exportedAuthorization.class);
|
||||
classStore.put(TLRPC.TL_messages_statedMessagesLinks.constructor, TLRPC.TL_messages_statedMessagesLinks.class);
|
||||
classStore.put(TLRPC.TL_messages_statedMessages.constructor, TLRPC.TL_messages_statedMessages.class);
|
||||
classStore.put(TLRPC.TL_inputNotifyChats.constructor, TLRPC.TL_inputNotifyChats.class);
|
||||
classStore.put(TLRPC.TL_inputNotifyPeer.constructor, TLRPC.TL_inputNotifyPeer.class);
|
||||
classStore.put(TLRPC.TL_inputNotifyUsers.constructor, TLRPC.TL_inputNotifyUsers.class);
|
||||
classStore.put(TLRPC.TL_inputNotifyGeoChatPeer.constructor, TLRPC.TL_inputNotifyGeoChatPeer.class);
|
||||
classStore.put(TLRPC.TL_inputNotifyAll.constructor, TLRPC.TL_inputNotifyAll.class);
|
||||
classStore.put(TLRPC.TL_inputEncryptedFileLocation.constructor, TLRPC.TL_inputEncryptedFileLocation.class);
|
||||
classStore.put(TLRPC.TL_inputFileLocation.constructor, TLRPC.TL_inputFileLocation.class);
|
||||
classStore.put(TLRPC.TL_inputVideoFileLocation.constructor, TLRPC.TL_inputVideoFileLocation.class);
|
||||
classStore.put(TLRPC.TL_photos_photo.constructor, TLRPC.TL_photos_photo.class);
|
||||
classStore.put(TLRPC.TL_userContact.constructor, TLRPC.TL_userContact.class);
|
||||
classStore.put(TLRPC.TL_userRequest.constructor, TLRPC.TL_userRequest.class);
|
||||
classStore.put(TLRPC.TL_userForeign.constructor, TLRPC.TL_userForeign.class);
|
||||
classStore.put(TLRPC.TL_userDeleted.constructor, TLRPC.TL_userDeleted.class);
|
||||
classStore.put(TLRPC.TL_userSelf.constructor, TLRPC.TL_userSelf.class);
|
||||
classStore.put(TLRPC.TL_userEmpty.constructor, TLRPC.TL_userEmpty.class);
|
||||
classStore.put(TLRPC.TL_geoChatMessage.constructor, TLRPC.TL_geoChatMessage.class);
|
||||
classStore.put(TLRPC.TL_geoChatMessageService.constructor, TLRPC.TL_geoChatMessageService.class);
|
||||
classStore.put(TLRPC.TL_geoChatMessageEmpty.constructor, TLRPC.TL_geoChatMessageEmpty.class);
|
||||
classStore.put(TLRPC.TL_pong.constructor, TLRPC.TL_pong.class);
|
||||
classStore.put(TLRPC.TL_messageActionChatEditPhoto.constructor, TLRPC.TL_messageActionChatEditPhoto.class);
|
||||
classStore.put(TLRPC.TL_messageActionChatDeleteUser.constructor, TLRPC.TL_messageActionChatDeleteUser.class);
|
||||
classStore.put(TLRPC.TL_messageActionChatDeletePhoto.constructor, TLRPC.TL_messageActionChatDeletePhoto.class);
|
||||
classStore.put(TLRPC.TL_messageActionChatAddUser.constructor, TLRPC.TL_messageActionChatAddUser.class);
|
||||
classStore.put(TLRPC.TL_messageActionChatCreate.constructor, TLRPC.TL_messageActionChatCreate.class);
|
||||
classStore.put(TLRPC.TL_messageActionEmpty.constructor, TLRPC.TL_messageActionEmpty.class);
|
||||
classStore.put(TLRPC.TL_messageActionChatEditTitle.constructor, TLRPC.TL_messageActionChatEditTitle.class);
|
||||
classStore.put(TLRPC.TL_messageActionGeoChatCreate.constructor, TLRPC.TL_messageActionGeoChatCreate.class);
|
||||
classStore.put(TLRPC.TL_messageActionGeoChatCheckin.constructor, TLRPC.TL_messageActionGeoChatCheckin.class);
|
||||
classStore.put(TLRPC.TL_contacts_foreignLinkMutual.constructor, TLRPC.TL_contacts_foreignLinkMutual.class);
|
||||
classStore.put(TLRPC.TL_contacts_foreignLinkUnknown.constructor, TLRPC.TL_contacts_foreignLinkUnknown.class);
|
||||
classStore.put(TLRPC.TL_contacts_foreignLinkRequested.constructor, TLRPC.TL_contacts_foreignLinkRequested.class);
|
||||
classStore.put(TLRPC.TL_dh_gen_retry.constructor, TLRPC.TL_dh_gen_retry.class);
|
||||
classStore.put(TLRPC.TL_dh_gen_fail.constructor, TLRPC.TL_dh_gen_fail.class);
|
||||
classStore.put(TLRPC.TL_dh_gen_ok.constructor, TLRPC.TL_dh_gen_ok.class);
|
||||
classStore.put(TLRPC.TL_peerNotifyEventsAll.constructor, TLRPC.TL_peerNotifyEventsAll.class);
|
||||
classStore.put(TLRPC.TL_chatLocated.constructor, TLRPC.TL_chatLocated.class);
|
||||
classStore.put(TLRPC.TL_decryptedMessageService.constructor, TLRPC.TL_decryptedMessageService.class);
|
||||
classStore.put(TLRPC.TL_decryptedMessage.constructor, TLRPC.TL_decryptedMessage.class);
|
||||
classStore.put(TLRPC.TL_inputPeerNotifyEventsAll.constructor, TLRPC.TL_inputPeerNotifyEventsAll.class);
|
||||
classStore.put(TLRPC.TL_client_DH_inner_data.constructor, TLRPC.TL_client_DH_inner_data.class);
|
||||
classStore.put(TLRPC.TL_video.constructor, TLRPC.TL_video.class);
|
||||
classStore.put(TLRPC.TL_videoEmpty.constructor, TLRPC.TL_videoEmpty.class);
|
||||
classStore.put(TLRPC.TL_contactBlocked.constructor, TLRPC.TL_contactBlocked.class);
|
||||
classStore.put(TLRPC.TL_inputAppEvent.constructor, TLRPC.TL_inputAppEvent.class);
|
||||
classStore.put(TLRPC.TL_messages_affectedHistory.constructor, TLRPC.TL_messages_affectedHistory.class);
|
||||
classStore.put(TLRPC.TL_inputMediaUploadedPhoto.constructor, TLRPC.TL_inputMediaUploadedPhoto.class);
|
||||
classStore.put(TLRPC.TL_inputMediaVideo.constructor, TLRPC.TL_inputMediaVideo.class);
|
||||
classStore.put(TLRPC.TL_inputMediaGeoPoint.constructor, TLRPC.TL_inputMediaGeoPoint.class);
|
||||
classStore.put(TLRPC.TL_inputMediaContact.constructor, TLRPC.TL_inputMediaContact.class);
|
||||
classStore.put(TLRPC.TL_inputMediaUploadedThumbVideo.constructor, TLRPC.TL_inputMediaUploadedThumbVideo.class);
|
||||
classStore.put(TLRPC.TL_inputMediaUploadedVideo.constructor, TLRPC.TL_inputMediaUploadedVideo.class);
|
||||
classStore.put(TLRPC.TL_inputMediaPhoto.constructor, TLRPC.TL_inputMediaPhoto.class);
|
||||
classStore.put(TLRPC.TL_inputMediaEmpty.constructor, TLRPC.TL_inputMediaEmpty.class);
|
||||
classStore.put(TLRPC.TL_geochats_messagesSlice.constructor, TLRPC.TL_geochats_messagesSlice.class);
|
||||
classStore.put(TLRPC.TL_geochats_messages.constructor, TLRPC.TL_geochats_messages.class);
|
||||
classStore.put(TLRPC.TL_messages_sentMessage.constructor, TLRPC.TL_messages_sentMessage.class);
|
||||
classStore.put(TLRPC.TL_messages_sentMessageLink.constructor, TLRPC.TL_messages_sentMessageLink.class);
|
||||
classStore.put(TLRPC.TL_encryptedMessageService.constructor, TLRPC.TL_encryptedMessageService.class);
|
||||
classStore.put(TLRPC.TL_encryptedMessage.constructor, TLRPC.TL_encryptedMessage.class);
|
||||
classStore.put(TLRPC.TL_server_DH_params_fail.constructor, TLRPC.TL_server_DH_params_fail.class);
|
||||
classStore.put(TLRPC.TL_server_DH_params_ok.constructor, TLRPC.TL_server_DH_params_ok.class);
|
||||
classStore.put(TLRPC.TL_userStatusEmpty.constructor, TLRPC.TL_userStatusEmpty.class);
|
||||
classStore.put(TLRPC.TL_userStatusOnline.constructor, TLRPC.TL_userStatusOnline.class);
|
||||
classStore.put(TLRPC.TL_userStatusOffline.constructor, TLRPC.TL_userStatusOffline.class);
|
||||
classStore.put(TLRPC.TL_msg_copy.constructor, TLRPC.TL_msg_copy.class);
|
||||
classStore.put(TLRPC.TL_contacts_importedContacts.constructor, TLRPC.TL_contacts_importedContacts.class);
|
||||
classStore.put(TLRPC.TL_futureSalt.constructor, TLRPC.TL_futureSalt.class);
|
||||
classStore.put(TLRPC.TL_updateEncryptedMessagesRead.constructor, TLRPC.TL_updateEncryptedMessagesRead.class);
|
||||
classStore.put(TLRPC.TL_updateContactLink.constructor, TLRPC.TL_updateContactLink.class);
|
||||
classStore.put(TLRPC.TL_updateReadMessages.constructor, TLRPC.TL_updateReadMessages.class);
|
||||
classStore.put(TLRPC.TL_updateRestoreMessages.constructor, TLRPC.TL_updateRestoreMessages.class);
|
||||
classStore.put(TLRPC.TL_updateUserTyping.constructor, TLRPC.TL_updateUserTyping.class);
|
||||
classStore.put(TLRPC.TL_updateChatUserTyping.constructor, TLRPC.TL_updateChatUserTyping.class);
|
||||
classStore.put(TLRPC.TL_updateUserName.constructor, TLRPC.TL_updateUserName.class);
|
||||
classStore.put(TLRPC.TL_updateNewEncryptedMessage.constructor, TLRPC.TL_updateNewEncryptedMessage.class);
|
||||
classStore.put(TLRPC.TL_updateNewMessage.constructor, TLRPC.TL_updateNewMessage.class);
|
||||
classStore.put(TLRPC.TL_updateMessageID.constructor, TLRPC.TL_updateMessageID.class);
|
||||
classStore.put(TLRPC.TL_updateDeleteMessages.constructor, TLRPC.TL_updateDeleteMessages.class);
|
||||
classStore.put(TLRPC.TL_updateEncryptedChatTyping.constructor, TLRPC.TL_updateEncryptedChatTyping.class);
|
||||
classStore.put(TLRPC.TL_updateChatParticipants.constructor, TLRPC.TL_updateChatParticipants.class);
|
||||
classStore.put(TLRPC.TL_updateEncryption.constructor, TLRPC.TL_updateEncryption.class);
|
||||
classStore.put(TLRPC.TL_updateActivation.constructor, TLRPC.TL_updateActivation.class);
|
||||
classStore.put(TLRPC.TL_updateNewAuthorization.constructor, TLRPC.TL_updateNewAuthorization.class);
|
||||
classStore.put(TLRPC.TL_updateNewGeoChatMessage.constructor, TLRPC.TL_updateNewGeoChatMessage.class);
|
||||
classStore.put(TLRPC.TL_updateUserPhoto.constructor, TLRPC.TL_updateUserPhoto.class);
|
||||
classStore.put(TLRPC.TL_updateContactRegistered.constructor, TLRPC.TL_updateContactRegistered.class);
|
||||
classStore.put(TLRPC.TL_updateUserStatus.constructor, TLRPC.TL_updateUserStatus.class);
|
||||
classStore.put(TLRPC.TL_rpc_error.constructor, TLRPC.TL_rpc_error.class);
|
||||
classStore.put(TLRPC.TL_rpc_req_error.constructor, TLRPC.TL_rpc_req_error.class);
|
||||
classStore.put(TLRPC.TL_inputEncryptedFile.constructor, TLRPC.TL_inputEncryptedFile.class);
|
||||
classStore.put(TLRPC.TL_inputEncryptedFileEmpty.constructor, TLRPC.TL_inputEncryptedFileEmpty.class);
|
||||
classStore.put(TLRPC.TL_inputEncryptedFileUploaded.constructor, TLRPC.TL_inputEncryptedFileUploaded.class);
|
||||
classStore.put(TLRPC.TL_decryptedMessageActionSetMessageTTL.constructor, TLRPC.TL_decryptedMessageActionSetMessageTTL.class);
|
||||
classStore.put(TLRPC.TL_contacts_myLinkRequested.constructor, TLRPC.TL_contacts_myLinkRequested.class);
|
||||
classStore.put(TLRPC.TL_contacts_myLinkContact.constructor, TLRPC.TL_contacts_myLinkContact.class);
|
||||
classStore.put(TLRPC.TL_contacts_myLinkEmpty.constructor, TLRPC.TL_contacts_myLinkEmpty.class);
|
||||
classStore.put(TLRPC.TL_server_DH_inner_data.constructor, TLRPC.TL_server_DH_inner_data.class);
|
||||
classStore.put(TLRPC.TL_new_session_created.constructor, TLRPC.TL_new_session_created.class);
|
||||
classStore.put(TLRPC.TL_userProfilePhotoEmpty.constructor, TLRPC.TL_userProfilePhotoEmpty.class);
|
||||
classStore.put(TLRPC.TL_userProfilePhoto.constructor, TLRPC.TL_userProfilePhoto.class);
|
||||
classStore.put(TLRPC.TL_photo.constructor, TLRPC.TL_photo.class);
|
||||
classStore.put(TLRPC.TL_photoEmpty.constructor, TLRPC.TL_photoEmpty.class);
|
||||
classStore.put(TLRPC.TL_encryptedChatWaiting.constructor, TLRPC.TL_encryptedChatWaiting.class);
|
||||
classStore.put(TLRPC.TL_encryptedChatEmpty.constructor, TLRPC.TL_encryptedChatEmpty.class);
|
||||
classStore.put(TLRPC.TL_encryptedChatDiscarded.constructor, TLRPC.TL_encryptedChatDiscarded.class);
|
||||
classStore.put(TLRPC.TL_encryptedChat.constructor, TLRPC.TL_encryptedChat.class);
|
||||
classStore.put(TLRPC.TL_encryptedChatRequested.constructor, TLRPC.TL_encryptedChatRequested.class);
|
||||
classStore.put(TLRPC.TL_geochats_statedMessage.constructor, TLRPC.TL_geochats_statedMessage.class);
|
||||
classStore.put(TLRPC.TL_contact.constructor, TLRPC.TL_contact.class);
|
||||
classStore.put(TLRPC.TL_config.constructor, TLRPC.TL_config.class);
|
||||
classStore.put(TLRPC.TL_messages_chats.constructor, TLRPC.TL_messages_chats.class);
|
||||
classStore.put(TLRPC.TL_chatParticipants.constructor, TLRPC.TL_chatParticipants.class);
|
||||
classStore.put(TLRPC.TL_chatParticipantsForbidden.constructor, TLRPC.TL_chatParticipantsForbidden.class);
|
||||
classStore.put(TLRPC.TL_decryptedMessageMediaContact.constructor, TLRPC.TL_decryptedMessageMediaContact.class);
|
||||
classStore.put(TLRPC.TL_decryptedMessageMediaVideo.constructor, TLRPC.TL_decryptedMessageMediaVideo.class);
|
||||
classStore.put(TLRPC.TL_decryptedMessageMediaGeoPoint.constructor, TLRPC.TL_decryptedMessageMediaGeoPoint.class);
|
||||
classStore.put(TLRPC.TL_decryptedMessageMediaFile.constructor, TLRPC.TL_decryptedMessageMediaFile.class);
|
||||
classStore.put(TLRPC.TL_decryptedMessageMediaEmpty.constructor, TLRPC.TL_decryptedMessageMediaEmpty.class);
|
||||
classStore.put(TLRPC.TL_decryptedMessageMediaPhoto.constructor, TLRPC.TL_decryptedMessageMediaPhoto.class);
|
||||
classStore.put(TLRPC.TL_chatParticipant.constructor, TLRPC.TL_chatParticipant.class);
|
||||
classStore.put(TLRPC.TL_chatForbidden.constructor, TLRPC.TL_chatForbidden.class);
|
||||
classStore.put(TLRPC.TL_geoChat.constructor, TLRPC.TL_geoChat.class);
|
||||
classStore.put(TLRPC.TL_chatEmpty.constructor, TLRPC.TL_chatEmpty.class);
|
||||
classStore.put(TLRPC.TL_chat.constructor, TLRPC.TL_chat.class);
|
||||
classStore.put(TLRPC.TL_storage_fileUnknown.constructor, TLRPC.TL_storage_fileUnknown.class);
|
||||
classStore.put(TLRPC.TL_storage_fileWebp.constructor, TLRPC.TL_storage_fileWebp.class);
|
||||
classStore.put(TLRPC.TL_storage_filePng.constructor, TLRPC.TL_storage_filePng.class);
|
||||
classStore.put(TLRPC.TL_storage_fileGif.constructor, TLRPC.TL_storage_fileGif.class);
|
||||
classStore.put(TLRPC.TL_storage_fileMov.constructor, TLRPC.TL_storage_fileMov.class);
|
||||
classStore.put(TLRPC.TL_storage_fileMp3.constructor, TLRPC.TL_storage_fileMp3.class);
|
||||
classStore.put(TLRPC.TL_storage_fileJpeg.constructor, TLRPC.TL_storage_fileJpeg.class);
|
||||
classStore.put(TLRPC.TL_storage_filePartial.constructor, TLRPC.TL_storage_filePartial.class);
|
||||
classStore.put(TLRPC.TL_storage_fileMp4.constructor, TLRPC.TL_storage_fileMp4.class);
|
||||
classStore.put(TLRPC.TL_inputMessagesFilterVideo.constructor, TLRPC.TL_inputMessagesFilterVideo.class);
|
||||
classStore.put(TLRPC.TL_inputMessagesFilterEmpty.constructor, TLRPC.TL_inputMessagesFilterEmpty.class);
|
||||
classStore.put(TLRPC.TL_inputMessagesFilterPhotos.constructor, TLRPC.TL_inputMessagesFilterPhotos.class);
|
||||
classStore.put(TLRPC.TL_inputMessagesFilterPhotoVideo.constructor, TLRPC.TL_inputMessagesFilterPhotoVideo.class);
|
||||
classStore.put(TLRPC.TL_geochats_located.constructor, TLRPC.TL_geochats_located.class);
|
||||
classStore.put(TLRPC.TL_msgs_state_info.constructor, TLRPC.TL_msgs_state_info.class);
|
||||
classStore.put(TLRPC.TL_upload_file.constructor, TLRPC.TL_upload_file.class);
|
||||
classStore.put(TLRPC.TL_dialog.constructor, TLRPC.TL_dialog.class);
|
||||
classStore.put(TLRPC.TL_messages_messageEmpty.constructor, TLRPC.TL_messages_messageEmpty.class);
|
||||
classStore.put(TLRPC.TL_messages_message.constructor, TLRPC.TL_messages_message.class);
|
||||
classStore.put(TLRPC.TL_fileLocation.constructor, TLRPC.TL_fileLocation.class);
|
||||
classStore.put(TLRPC.TL_fileLocationUnavailable.constructor, TLRPC.TL_fileLocationUnavailable.class);
|
||||
classStore.put(TLRPC.TL_inputGeoChat.constructor, TLRPC.TL_inputGeoChat.class);
|
||||
classStore.put(TLRPC.TL_protoMessage.constructor, TLRPC.TL_protoMessage.class);
|
||||
classStore.put(TLRPC.TL_photoSize.constructor, TLRPC.TL_photoSize.class);
|
||||
classStore.put(TLRPC.TL_photoSizeEmpty.constructor, TLRPC.TL_photoSizeEmpty.class);
|
||||
classStore.put(TLRPC.TL_photoCachedSize.constructor, TLRPC.TL_photoCachedSize.class);
|
||||
classStore.put(TLRPC.TL_inputFile.constructor, TLRPC.TL_inputFile.class);
|
||||
classStore.put(TLRPC.TL_messages_statedMessageLink.constructor, TLRPC.TL_messages_statedMessageLink.class);
|
||||
classStore.put(TLRPC.TL_messages_statedMessage.constructor, TLRPC.TL_messages_statedMessage.class);
|
||||
classStore.put(TLRPC.TL_userFull.constructor, TLRPC.TL_userFull.class);
|
||||
classStore.put(TLRPC.TL_msg_new_detailed_info.constructor, TLRPC.TL_msg_new_detailed_info.class);
|
||||
classStore.put(TLRPC.TL_msg_detailed_info.constructor, TLRPC.TL_msg_detailed_info.class);
|
||||
classStore.put(TLRPC.TL_resPQ.constructor, TLRPC.TL_resPQ.class);
|
||||
classStore.put(TLRPC.TL_updateShortChatMessage.constructor, TLRPC.TL_updateShortChatMessage.class);
|
||||
classStore.put(TLRPC.TL_updates.constructor, TLRPC.TL_updates.class);
|
||||
classStore.put(TLRPC.TL_updateShortMessage.constructor, TLRPC.TL_updateShortMessage.class);
|
||||
classStore.put(TLRPC.TL_updateShort.constructor, TLRPC.TL_updateShort.class);
|
||||
classStore.put(TLRPC.TL_updatesCombined.constructor, TLRPC.TL_updatesCombined.class);
|
||||
classStore.put(TLRPC.TL_updatesTooLong.constructor, TLRPC.TL_updatesTooLong.class);
|
||||
classStore.put(TLRPC.TL_messages_chat.constructor, TLRPC.TL_messages_chat.class);
|
||||
classStore.put(TLRPC.TL_wallPaper.constructor, TLRPC.TL_wallPaper.class);
|
||||
classStore.put(TLRPC.TL_wallPaperSolid.constructor, TLRPC.TL_wallPaperSolid.class);
|
||||
classStore.put(TLRPC.TL_updates_state.constructor, TLRPC.TL_updates_state.class);
|
||||
classStore.put(TLRPC.TL_inputEncryptedChat.constructor, TLRPC.TL_inputEncryptedChat.class);
|
||||
classStore.put(TLRPC.TL_inputChatPhoto.constructor, TLRPC.TL_inputChatPhoto.class);
|
||||
classStore.put(TLRPC.TL_inputChatPhotoEmpty.constructor, TLRPC.TL_inputChatPhotoEmpty.class);
|
||||
classStore.put(TLRPC.TL_inputChatUploadedPhoto.constructor, TLRPC.TL_inputChatUploadedPhoto.class);
|
||||
classStore.put(TLRPC.TL_inputVideoEmpty.constructor, TLRPC.TL_inputVideoEmpty.class);
|
||||
classStore.put(TLRPC.TL_inputVideo.constructor, TLRPC.TL_inputVideo.class);
|
||||
classStore.put(TLRPC.TL_nearestDc.constructor, TLRPC.TL_nearestDc.class);
|
||||
classStore.put(TLRPC.TL_inputPhotoEmpty.constructor, TLRPC.TL_inputPhotoEmpty.class);
|
||||
classStore.put(TLRPC.TL_inputPhoto.constructor, TLRPC.TL_inputPhoto.class);
|
||||
classStore.put(TLRPC.TL_importedContact.constructor, TLRPC.TL_importedContact.class);
|
||||
classStore.put(TLRPC.TL_inputPeerContact.constructor, TLRPC.TL_inputPeerContact.class);
|
||||
classStore.put(TLRPC.TL_inputPeerChat.constructor, TLRPC.TL_inputPeerChat.class);
|
||||
classStore.put(TLRPC.TL_inputPeerEmpty.constructor, TLRPC.TL_inputPeerEmpty.class);
|
||||
classStore.put(TLRPC.TL_inputPeerSelf.constructor, TLRPC.TL_inputPeerSelf.class);
|
||||
classStore.put(TLRPC.TL_inputPeerForeign.constructor, TLRPC.TL_inputPeerForeign.class);
|
||||
classStore.put(TLRPC.TL_dcOption.constructor, TLRPC.TL_dcOption.class);
|
||||
classStore.put(TLRPC.TL_inputPhotoCropAuto.constructor, TLRPC.TL_inputPhotoCropAuto.class);
|
||||
classStore.put(TLRPC.TL_inputPhotoCrop.constructor, TLRPC.TL_inputPhotoCrop.class);
|
||||
classStore.put(TLRPC.TL_messages_dialogs.constructor, TLRPC.TL_messages_dialogs.class);
|
||||
classStore.put(TLRPC.TL_messages_dialogsSlice.constructor, TLRPC.TL_messages_dialogsSlice.class);
|
||||
classStore.put(TLRPC.TL_req_pq.constructor, TLRPC.TL_req_pq.class);
|
||||
classStore.put(TLRPC.TL_req_DH_params.constructor, TLRPC.TL_req_DH_params.class);
|
||||
classStore.put(TLRPC.TL_set_client_DH_params.constructor, TLRPC.TL_set_client_DH_params.class);
|
||||
classStore.put(TLRPC.TL_ping.constructor, TLRPC.TL_ping.class);
|
||||
classStore.put(TLRPC.TL_destroy_session.constructor, TLRPC.TL_destroy_session.class);
|
||||
classStore.put(TLRPC.TL_destroy_sessions.constructor, TLRPC.TL_destroy_sessions.class);
|
||||
classStore.put(TLRPC.TL_get_future_salts.constructor, TLRPC.TL_get_future_salts.class);
|
||||
classStore.put(TLRPC.TL_rpc_drop_answer.constructor, TLRPC.TL_rpc_drop_answer.class);
|
||||
classStore.put(TLRPC.TL_auth_checkPhone.constructor, TLRPC.TL_auth_checkPhone.class);
|
||||
classStore.put(TLRPC.TL_auth_sendCode.constructor, TLRPC.TL_auth_sendCode.class);
|
||||
classStore.put(TLRPC.TL_auth_sendCall.constructor, TLRPC.TL_auth_sendCall.class);
|
||||
classStore.put(TLRPC.TL_auth_signUp.constructor, TLRPC.TL_auth_signUp.class);
|
||||
classStore.put(TLRPC.TL_auth_signIn.constructor, TLRPC.TL_auth_signIn.class);
|
||||
classStore.put(TLRPC.TL_auth_logOut.constructor, TLRPC.TL_auth_logOut.class);
|
||||
classStore.put(TLRPC.TL_auth_sendInvites.constructor, TLRPC.TL_auth_sendInvites.class);
|
||||
classStore.put(TLRPC.TL_auth_exportAuthorization.constructor, TLRPC.TL_auth_exportAuthorization.class);
|
||||
classStore.put(TLRPC.TL_auth_importAuthorization.constructor, TLRPC.TL_auth_importAuthorization.class);
|
||||
classStore.put(TLRPC.TL_account_registerDevice.constructor, TLRPC.TL_account_registerDevice.class);
|
||||
classStore.put(TLRPC.TL_account_unregisterDevice.constructor, TLRPC.TL_account_unregisterDevice.class);
|
||||
classStore.put(TLRPC.TL_account_updateNotifySettings.constructor, TLRPC.TL_account_updateNotifySettings.class);
|
||||
classStore.put(TLRPC.TL_account_getNotifySettings.constructor, TLRPC.TL_account_getNotifySettings.class);
|
||||
classStore.put(TLRPC.TL_account_resetNotifySettings.constructor, TLRPC.TL_account_resetNotifySettings.class);
|
||||
classStore.put(TLRPC.TL_account_updateProfile.constructor, TLRPC.TL_account_updateProfile.class);
|
||||
classStore.put(TLRPC.TL_account_updateStatus.constructor, TLRPC.TL_account_updateStatus.class);
|
||||
classStore.put(TLRPC.TL_account_getWallPapers.constructor, TLRPC.TL_account_getWallPapers.class);
|
||||
classStore.put(TLRPC.TL_users_getUsers.constructor, TLRPC.TL_users_getUsers.class);
|
||||
classStore.put(TLRPC.TL_users_getFullUser.constructor, TLRPC.TL_users_getFullUser.class);
|
||||
classStore.put(TLRPC.TL_contacts_getStatuses.constructor, TLRPC.TL_contacts_getStatuses.class);
|
||||
classStore.put(TLRPC.TL_contacts_getContacts.constructor, TLRPC.TL_contacts_getContacts.class);
|
||||
classStore.put(TLRPC.TL_contacts_importContacts.constructor, TLRPC.TL_contacts_importContacts.class);
|
||||
classStore.put(TLRPC.TL_contacts_deleteContact.constructor, TLRPC.TL_contacts_deleteContact.class);
|
||||
classStore.put(TLRPC.TL_contacts_deleteContacts.constructor, TLRPC.TL_contacts_deleteContacts.class);
|
||||
classStore.put(TLRPC.TL_contacts_block.constructor, TLRPC.TL_contacts_block.class);
|
||||
classStore.put(TLRPC.TL_contacts_unblock.constructor, TLRPC.TL_contacts_unblock.class);
|
||||
classStore.put(TLRPC.TL_contacts_getBlocked.constructor, TLRPC.TL_contacts_getBlocked.class);
|
||||
classStore.put(TLRPC.TL_messages_getMessages.constructor, TLRPC.TL_messages_getMessages.class);
|
||||
classStore.put(TLRPC.TL_messages_getDialogs.constructor, TLRPC.TL_messages_getDialogs.class);
|
||||
classStore.put(TLRPC.TL_messages_getHistory.constructor, TLRPC.TL_messages_getHistory.class);
|
||||
classStore.put(TLRPC.TL_messages_search.constructor, TLRPC.TL_messages_search.class);
|
||||
classStore.put(TLRPC.TL_messages_readHistory.constructor, TLRPC.TL_messages_readHistory.class);
|
||||
classStore.put(TLRPC.TL_messages_deleteHistory.constructor, TLRPC.TL_messages_deleteHistory.class);
|
||||
classStore.put(TLRPC.TL_messages_deleteMessages.constructor, TLRPC.TL_messages_deleteMessages.class);
|
||||
classStore.put(TLRPC.TL_messages_restoreMessages.constructor, TLRPC.TL_messages_restoreMessages.class);
|
||||
classStore.put(TLRPC.TL_messages_receivedMessages.constructor, TLRPC.TL_messages_receivedMessages.class);
|
||||
classStore.put(TLRPC.TL_messages_setTyping.constructor, TLRPC.TL_messages_setTyping.class);
|
||||
classStore.put(TLRPC.TL_messages_sendMessage.constructor, TLRPC.TL_messages_sendMessage.class);
|
||||
classStore.put(TLRPC.TL_messages_sendMedia.constructor, TLRPC.TL_messages_sendMedia.class);
|
||||
classStore.put(TLRPC.TL_messages_forwardMessages.constructor, TLRPC.TL_messages_forwardMessages.class);
|
||||
classStore.put(TLRPC.TL_messages_getChats.constructor, TLRPC.TL_messages_getChats.class);
|
||||
classStore.put(TLRPC.TL_messages_getFullChat.constructor, TLRPC.TL_messages_getFullChat.class);
|
||||
classStore.put(TLRPC.TL_messages_editChatTitle.constructor, TLRPC.TL_messages_editChatTitle.class);
|
||||
classStore.put(TLRPC.TL_messages_editChatPhoto.constructor, TLRPC.TL_messages_editChatPhoto.class);
|
||||
classStore.put(TLRPC.TL_messages_addChatUser.constructor, TLRPC.TL_messages_addChatUser.class);
|
||||
classStore.put(TLRPC.TL_messages_deleteChatUser.constructor, TLRPC.TL_messages_deleteChatUser.class);
|
||||
classStore.put(TLRPC.TL_messages_createChat.constructor, TLRPC.TL_messages_createChat.class);
|
||||
classStore.put(TLRPC.TL_updates_getState.constructor, TLRPC.TL_updates_getState.class);
|
||||
classStore.put(TLRPC.TL_photos_updateProfilePhoto.constructor, TLRPC.TL_photos_updateProfilePhoto.class);
|
||||
classStore.put(TLRPC.TL_photos_uploadProfilePhoto.constructor, TLRPC.TL_photos_uploadProfilePhoto.class);
|
||||
classStore.put(TLRPC.TL_upload_saveFilePart.constructor, TLRPC.TL_upload_saveFilePart.class);
|
||||
classStore.put(TLRPC.TL_upload_getFile.constructor, TLRPC.TL_upload_getFile.class);
|
||||
classStore.put(TLRPC.TL_help_getConfig.constructor, TLRPC.TL_help_getConfig.class);
|
||||
classStore.put(TLRPC.TL_help_getNearestDc.constructor, TLRPC.TL_help_getNearestDc.class);
|
||||
classStore.put(TLRPC.TL_help_saveAppLog.constructor, TLRPC.TL_help_saveAppLog.class);
|
||||
classStore.put(TLRPC.TL_help_getInviteText.constructor, TLRPC.TL_help_getInviteText.class);
|
||||
classStore.put(TLRPC.TL_photos_getUserPhotos.constructor, TLRPC.TL_photos_getUserPhotos.class);
|
||||
classStore.put(TLRPC.TL_messages_forwardMessage.constructor, TLRPC.TL_messages_forwardMessage.class);
|
||||
classStore.put(TLRPC.TL_messages_sendBroadcast.constructor, TLRPC.TL_messages_sendBroadcast.class);
|
||||
classStore.put(TLRPC.TL_geochats_getLocated.constructor, TLRPC.TL_geochats_getLocated.class);
|
||||
classStore.put(TLRPC.TL_geochats_getRecents.constructor, TLRPC.TL_geochats_getRecents.class);
|
||||
classStore.put(TLRPC.TL_geochats_checkin.constructor, TLRPC.TL_geochats_checkin.class);
|
||||
classStore.put(TLRPC.TL_geochats_getFullChat.constructor, TLRPC.TL_geochats_getFullChat.class);
|
||||
classStore.put(TLRPC.TL_geochats_editChatTitle.constructor, TLRPC.TL_geochats_editChatTitle.class);
|
||||
classStore.put(TLRPC.TL_geochats_editChatPhoto.constructor, TLRPC.TL_geochats_editChatPhoto.class);
|
||||
classStore.put(TLRPC.TL_geochats_search.constructor, TLRPC.TL_geochats_search.class);
|
||||
classStore.put(TLRPC.TL_geochats_getHistory.constructor, TLRPC.TL_geochats_getHistory.class);
|
||||
classStore.put(TLRPC.TL_geochats_setTyping.constructor, TLRPC.TL_geochats_setTyping.class);
|
||||
classStore.put(TLRPC.TL_geochats_sendMessage.constructor, TLRPC.TL_geochats_sendMessage.class);
|
||||
classStore.put(TLRPC.TL_geochats_sendMedia.constructor, TLRPC.TL_geochats_sendMedia.class);
|
||||
classStore.put(TLRPC.TL_geochats_createGeoChat.constructor, TLRPC.TL_geochats_createGeoChat.class);
|
||||
classStore.put(TLRPC.TL_updates_getDifference.constructor, TLRPC.TL_updates_getDifference.class);
|
||||
classStore.put(TLRPC.TL_messages_getDhConfig.constructor, TLRPC.TL_messages_getDhConfig.class);
|
||||
classStore.put(TLRPC.TL_messages_requestEncryption.constructor, TLRPC.TL_messages_requestEncryption.class);
|
||||
classStore.put(TLRPC.TL_messages_acceptEncryption.constructor, TLRPC.TL_messages_acceptEncryption.class);
|
||||
classStore.put(TLRPC.TL_messages_discardEncryption.constructor, TLRPC.TL_messages_discardEncryption.class);
|
||||
classStore.put(TLRPC.TL_messages_setEncryptedTyping.constructor, TLRPC.TL_messages_setEncryptedTyping.class);
|
||||
classStore.put(TLRPC.TL_messages_readEncryptedHistory.constructor, TLRPC.TL_messages_readEncryptedHistory.class);
|
||||
classStore.put(TLRPC.TL_messages_sendEncrypted.constructor, TLRPC.TL_messages_sendEncrypted.class);
|
||||
classStore.put(TLRPC.TL_messages_sendEncryptedFile.constructor, TLRPC.TL_messages_sendEncryptedFile.class);
|
||||
classStore.put(TLRPC.TL_messages_sendEncryptedService.constructor, TLRPC.TL_messages_sendEncryptedService.class);
|
||||
classStore.put(TLRPC.TL_messages_receivedQueue.constructor, TLRPC.TL_messages_receivedQueue.class);
|
||||
|
||||
classStore.put(TLRPC.TL_msg_container.constructor, TLRPC.TL_msg_container.class);
|
||||
classStore.put(TLRPC.TL_fileEncryptedLocation.constructor, TLRPC.TL_fileEncryptedLocation.class);
|
||||
classStore.put(TLRPC.TL_messageActionTTLChange.constructor, TLRPC.TL_messageActionTTLChange.class);
|
||||
classStore.put(TLRPC.TL_videoEncrypted.constructor, TLRPC.TL_videoEncrypted.class);
|
||||
classStore.put(TLRPC.TL_gzip_packed.constructor, TLRPC.TL_gzip_packed.class);
|
||||
classStore.put(TLRPC.Vector.constructor, TLRPC.Vector.class);
|
||||
classStore.put(TLRPC.TL_userProfilePhotoOld.constructor, TLRPC.TL_userProfilePhotoOld.class);
|
||||
}
|
||||
|
||||
static TLClassStore store = null;
|
||||
|
||||
public static TLClassStore Instance() {
|
||||
if (store == null) {
|
||||
store = new TLClassStore();
|
||||
}
|
||||
return store;
|
||||
}
|
||||
|
||||
public TLObject TLdeserialize(SerializedData stream, int constructor) {
|
||||
try {
|
||||
return TLdeserialize(stream, constructor, null);
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public TLObject TLdeserialize(SerializedData stream, int constructor, TLObject request) {
|
||||
Class objClass = classStore.get(constructor);
|
||||
if (objClass != null) {
|
||||
try {
|
||||
TLObject response = (TLObject)objClass.newInstance();
|
||||
if (response instanceof TLRPC.Vector) {
|
||||
if (request != null) {
|
||||
request.parseVector((TLRPC.Vector)response, stream);
|
||||
} else {
|
||||
int size = stream.readInt32();
|
||||
for (int a = 0; a < size; a++) {
|
||||
((TLRPC.Vector)response).objects.add(stream.readInt32());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
response.readParams(stream);
|
||||
}
|
||||
return response;
|
||||
} catch (IllegalAccessException e) {
|
||||
Log.e("tmessages", "can't create class");
|
||||
return null;
|
||||
} catch (InstantiationException e2) {
|
||||
Log.e("tmessages", "can't create class");
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
if (ConnectionsManager.DEBUG_VERSION) {
|
||||
Log.e("tmessages", String.format("unknown class %x", constructor));
|
||||
}
|
||||
return null;
|
||||
//throw new RuntimeException(String.format("unknown class %x", constructor));
|
||||
}
|
||||
}
|
||||
}
|
41
TMessagesProj/src/main/java/org/telegram/TL/TLObject.java
Normal file
41
TMessagesProj/src/main/java/org/telegram/TL/TLObject.java
Normal file
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
* This is the source code of Telegram for Android v. 1.2.3.
|
||||
* It is licensed under GNU GPL v. 2 or later.
|
||||
* You should have received a copy of the license in this archive (see LICENSE).
|
||||
*
|
||||
* Copyright Nikolai Kudashov, 2013.
|
||||
*/
|
||||
|
||||
package org.telegram.TL;
|
||||
|
||||
import org.telegram.messenger.SerializedData;
|
||||
|
||||
public class TLObject {
|
||||
public TLObject () {
|
||||
|
||||
}
|
||||
|
||||
public void readParams(SerializedData stream) {
|
||||
|
||||
}
|
||||
|
||||
public byte[] serialize () {
|
||||
return null;
|
||||
}
|
||||
|
||||
public void serializeToStream(SerializedData stream) {
|
||||
|
||||
}
|
||||
|
||||
public Class<? extends TLObject> responseClass () {
|
||||
return this.getClass();
|
||||
}
|
||||
|
||||
public int layer () {
|
||||
return 8;
|
||||
}
|
||||
|
||||
public void parseVector(TLRPC.Vector vector, SerializedData data) {
|
||||
|
||||
}
|
||||
}
|
8121
TMessagesProj/src/main/java/org/telegram/TL/TLRPC.java
Normal file
8121
TMessagesProj/src/main/java/org/telegram/TL/TLRPC.java
Normal file
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
* This is the source code of Telegram for Android v. 1.2.3.
|
||||
* It is licensed under GNU GPL v. 2 or later.
|
||||
* You should have received a copy of the license in this archive (see LICENSE).
|
||||
*
|
||||
* Copyright Nikolai Kudashov, 2013.
|
||||
*/
|
||||
|
||||
package org.telegram.messenger;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
public class Action {
|
||||
public interface ActionDelegate {
|
||||
void ActionDidFinishExecution(Action action, HashMap<String, Object> params);
|
||||
void ActionDidFailExecution(Action action);
|
||||
}
|
||||
|
||||
public ActionDelegate delegate;
|
||||
|
||||
public void execute(HashMap params) {
|
||||
|
||||
}
|
||||
|
||||
public void cancel() {
|
||||
|
||||
}
|
||||
|
||||
public int state;
|
||||
}
|
|
@ -0,0 +1,123 @@
|
|||
/*
|
||||
* This is the source code of Telegram for Android v. 1.2.3.
|
||||
* It is licensed under GNU GPL v. 2 or later.
|
||||
* You should have received a copy of the license in this archive (see LICENSE).
|
||||
*
|
||||
* Copyright Nikolai Kudashov, 2013.
|
||||
*/
|
||||
|
||||
package org.telegram.messenger;
|
||||
|
||||
import android.accounts.AbstractAccountAuthenticator;
|
||||
import android.accounts.Account;
|
||||
import android.accounts.AccountAuthenticatorResponse;
|
||||
import android.accounts.AccountManager;
|
||||
import android.accounts.NetworkErrorException;
|
||||
import android.app.Service;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.IBinder;
|
||||
|
||||
public class AuthenticatorService extends Service {
|
||||
|
||||
private static class Authenticator extends AbstractAccountAuthenticator {
|
||||
private final Context context;
|
||||
|
||||
public Authenticator(Context context) {
|
||||
super(context);
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options)
|
||||
throws NetworkErrorException {
|
||||
return null;
|
||||
/*Log.e(TAG, "addAccount");
|
||||
|
||||
// check if an account already exists; we only allow one
|
||||
QuillAccount account = new QuillAccount(context);
|
||||
if (account.exists())
|
||||
return null;
|
||||
|
||||