From feb101ee6e3ca9082a31775bc6567c7a917f47c0 Mon Sep 17 00:00:00 2001 From: clay_shooter <> Date: Fri, 8 Dec 2006 13:03:56 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create tag 'Root_B-1_11_1'. --- CVSROOT/checkoutlist | 13 - CVSROOT/commitinfo | 15 - CVSROOT/config | 21 - CVSROOT/cvswrappers | 19 - CVSROOT/editinfo | 21 - CVSROOT/loginfo | 27 - CVSROOT/modules | 26 - CVSROOT/notify | 12 - CVSROOT/rcsinfo | 13 - CVSROOT/taginfo | 20 - CVSROOT/verifymsg | 21 - jacobgen/.cvsignore | 13 - jacobgen/LICENSE.txt | 340 ---------- jacobgen/README.txt | 29 - jacobgen/build.xml | 278 --------- jacobgen/docs/HowToBuild.txt | 48 -- jacobgen/docs/ReleaseNotes.html | 101 --- jacobgen/docs/credits.txt | 6 - jacobgen/docs/run_jacobgen.bat | 24 - jacobgen/docs/todo.txt | 5 - jacobgen/jni/TypeLibInspector.cpp | 581 ------------------ jacobgen/jni/TypeLibInspector.h | 62 -- jacobgen/jni/makeh.bat | 11 - jacobgen/lib/viztool.jar | Bin 56730 -> 0 bytes jacobgen/samples/README.txt | 1 - .../com/jacob/jacobgen/AbstractGenerator.java | 96 --- .../com/jacob/jacobgen/AliasGenerator.java | 50 -- .../com/jacob/jacobgen/ClassGenerator.java | 508 --------------- .../src/com/jacob/jacobgen/EnumGenerator.java | 60 -- .../src/com/jacob/jacobgen/FieldItem.java | 107 ---- .../jacobgen/IllegalFormatException.java | 42 -- jacobgen/src/com/jacob/jacobgen/Jacobgen.java | 413 ------------- .../src/com/jacob/jacobgen/MethodItem.java | 329 ---------- .../src/com/jacob/jacobgen/ParameterItem.java | 254 -------- .../com/jacob/jacobgen/TypeLibInspector.java | 50 -- jacobgen/unittest/README.txt | 1 - 36 files changed, 3617 deletions(-) delete mode 100644 CVSROOT/checkoutlist delete mode 100644 CVSROOT/commitinfo delete mode 100644 CVSROOT/config delete mode 100644 CVSROOT/cvswrappers delete mode 100644 CVSROOT/editinfo delete mode 100644 CVSROOT/loginfo delete mode 100644 CVSROOT/modules delete mode 100644 CVSROOT/notify delete mode 100644 CVSROOT/rcsinfo delete mode 100644 CVSROOT/taginfo delete mode 100644 CVSROOT/verifymsg delete mode 100644 jacobgen/.cvsignore delete mode 100644 jacobgen/LICENSE.txt delete mode 100644 jacobgen/README.txt delete mode 100644 jacobgen/build.xml delete mode 100644 jacobgen/docs/HowToBuild.txt delete mode 100644 jacobgen/docs/ReleaseNotes.html delete mode 100644 jacobgen/docs/credits.txt delete mode 100644 jacobgen/docs/run_jacobgen.bat delete mode 100644 jacobgen/docs/todo.txt delete mode 100644 jacobgen/jni/TypeLibInspector.cpp delete mode 100644 jacobgen/jni/TypeLibInspector.h delete mode 100644 jacobgen/jni/makeh.bat delete mode 100644 jacobgen/lib/viztool.jar delete mode 100644 jacobgen/samples/README.txt delete mode 100644 jacobgen/src/com/jacob/jacobgen/AbstractGenerator.java delete mode 100644 jacobgen/src/com/jacob/jacobgen/AliasGenerator.java delete mode 100644 jacobgen/src/com/jacob/jacobgen/ClassGenerator.java delete mode 100644 jacobgen/src/com/jacob/jacobgen/EnumGenerator.java delete mode 100644 jacobgen/src/com/jacob/jacobgen/FieldItem.java delete mode 100644 jacobgen/src/com/jacob/jacobgen/IllegalFormatException.java delete mode 100644 jacobgen/src/com/jacob/jacobgen/Jacobgen.java delete mode 100644 jacobgen/src/com/jacob/jacobgen/MethodItem.java delete mode 100644 jacobgen/src/com/jacob/jacobgen/ParameterItem.java delete mode 100644 jacobgen/src/com/jacob/jacobgen/TypeLibInspector.java delete mode 100644 jacobgen/unittest/README.txt diff --git a/CVSROOT/checkoutlist b/CVSROOT/checkoutlist deleted file mode 100644 index 2921bff..0000000 --- a/CVSROOT/checkoutlist +++ /dev/null @@ -1,13 +0,0 @@ -# The "checkoutlist" file is used to support additional version controlled -# administrative files in $CVSROOT/CVSROOT, such as template files. -# -# The first entry on a line is a filename which will be checked out from -# the corresponding RCS file in the $CVSROOT/CVSROOT directory. -# The remainder of the line is an error message to use if the file cannot -# be checked out. -# -# File format: -# -# [][] -# -# comment lines begin with '#' diff --git a/CVSROOT/commitinfo b/CVSROOT/commitinfo deleted file mode 100644 index b19e7b7..0000000 --- a/CVSROOT/commitinfo +++ /dev/null @@ -1,15 +0,0 @@ -# The "commitinfo" file is used to control pre-commit checks. -# The filter on the right is invoked with the repository and a list -# of files to check. A non-zero exit of the filter program will -# cause the commit to be aborted. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being committed to, relative -# to the $CVSROOT. For the first match that is found, then the remainder -# of the line is the name of the filter to run. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/config b/CVSROOT/config deleted file mode 100644 index 92c150b..0000000 --- a/CVSROOT/config +++ /dev/null @@ -1,21 +0,0 @@ -# Set this to "no" if pserver shouldn't check system users/passwords -#SystemAuth=no - -# Put CVS lock files in this directory rather than directly in the repository. -#LockDir=/var/lock/cvs - -# Set `TopLevelAdmin' to `yes' to create a CVS directory at the top -# level of the new working directory when using the `cvs checkout' -# command. -#TopLevelAdmin=no - -# Set `LogHistory' to `all' or `TOEFWUPCGMAR' to log all transactions to the -# history file, or a subset as needed (ie `TMAR' logs all write operations) -#LogHistory=TOEFWUPCGMAR - -# Set `RereadLogAfterVerify' to `always' (the default) to allow the verifymsg -# script to change the log message. Set it to `stat' to force CVS to verify# that the file has changed before reading it (this can take up to an extra -# second per directory being committed, so it is not recommended for large -# repositories. Set it to `never' (the previous CVS behavior) to prevent -# verifymsg scripts from changing the log message. -#RereadLogAfterVerify=always diff --git a/CVSROOT/cvswrappers b/CVSROOT/cvswrappers deleted file mode 100644 index e989b75..0000000 --- a/CVSROOT/cvswrappers +++ /dev/null @@ -1,19 +0,0 @@ -# This file affects handling of files based on their names. -# -# The -m option specifies whether CVS attempts to merge files. -# -# The -k option specifies keyword expansion (e.g. -kb for binary). -# -# Format of wrapper file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers) -# -# wildcard [option value][option value]... -# -# where option is one of -# -f from cvs filter value: path to filter -# -t to cvs filter value: path to filter -# -m update methodology value: MERGE or COPY -# -k expansion mode value: b, o, kkv, &c -# -# and value is a single-quote delimited value. -# For example: -#*.gif -k 'b' diff --git a/CVSROOT/editinfo b/CVSROOT/editinfo deleted file mode 100644 index d78886c..0000000 --- a/CVSROOT/editinfo +++ /dev/null @@ -1,21 +0,0 @@ -# The "editinfo" file is used to allow verification of logging -# information. It works best when a template (as specified in the -# rcsinfo file) is provided for the logging procedure. Given a -# template with locations for, a bug-id number, a list of people who -# reviewed the code before it can be checked in, and an external -# process to catalog the differences that were code reviewed, the -# following test can be applied to the code: -# -# Making sure that the entered bug-id number is correct. -# Validating that the code that was reviewed is indeed the code being -# checked in (using the bug-id number or a seperate review -# number to identify this particular code set.). -# -# If any of the above test failed, then the commit would be aborted. -# -# Actions such as mailing a copy of the report to each reviewer are -# better handled by an entry in the loginfo file. -# -# One thing that should be noted is the the ALL keyword is not -# supported. There can be only one entry that matches a given -# repository. diff --git a/CVSROOT/loginfo b/CVSROOT/loginfo deleted file mode 100644 index 537607d..0000000 --- a/CVSROOT/loginfo +++ /dev/null @@ -1,27 +0,0 @@ -# The "loginfo" file controls where "cvs commit" log information -# is sent. The first entry on a line is a regular expression which must match -# the directory that the change is being made to, relative to the -# $CVSROOT. If a match is found, then the remainder of the line is a filter -# program that should expect log information on its standard input. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name ALL appears as a regular expression it is always used -# in addition to the first matching regex or DEFAULT. -# -# You may specify a format string as part of the -# filter. The string is composed of a `%' followed -# by a single format character, or followed by a set of format -# characters surrounded by `{' and `}' as separators. The format -# characters are: -# -# s = file name -# V = old version number (pre-checkin) -# v = new version number (post-checkin) -# t = tag or branch name -# -# For example: -#DEFAULT (echo ""; id; echo %s; date; cat) >> $CVSROOT/CVSROOT/commitlog -# or -#DEFAULT (echo ""; id; echo %{sVv}; date; cat) >> $CVSROOT/CVSROOT/commitlog diff --git a/CVSROOT/modules b/CVSROOT/modules deleted file mode 100644 index cb9e9ef..0000000 --- a/CVSROOT/modules +++ /dev/null @@ -1,26 +0,0 @@ -# Three different line formats are valid: -# key -a aliases... -# key [options] directory -# key [options] directory files... -# -# Where "options" are composed of: -# -i prog Run "prog" on "cvs commit" from top-level of module. -# -o prog Run "prog" on "cvs checkout" of module. -# -e prog Run "prog" on "cvs export" of module. -# -t prog Run "prog" on "cvs rtag" of module. -# -u prog Run "prog" on "cvs update" of module. -# -d dir Place module in directory "dir" instead of module name. -# -l Top-level directory only -- do not recurse. -# -# NOTE: If you change any of the "Run" options above, you'll have to -# release and re-checkout any working directories of these modules. -# -# And "directory" is a path to a directory relative to $CVSROOT. -# -# The "-a" option specifies an alias. An alias is interpreted as if -# everything on the right of the "-a" had been typed on the command line. -# -# You can encode a module within a module by using the special '&' -# character to interpose another module into the current module. This -# can be useful for creating a module that consists of many directories -# spread out over the entire source repository. diff --git a/CVSROOT/notify b/CVSROOT/notify deleted file mode 100644 index 74ae6f9..0000000 --- a/CVSROOT/notify +++ /dev/null @@ -1,12 +0,0 @@ -# The "notify" file controls where notifications from watches set by -# "cvs watch add" or "cvs edit" are sent. The first entry on a line is -# a regular expression which is tested against the directory that the -# change is being made to, relative to the $CVSROOT. If it matches, -# then the remainder of the line is a filter program that should contain -# one occurrence of %s for the user to notify, and information on its -# standard input. -# -# "ALL" or "DEFAULT" can be used in place of the regular expression. -# -# For example: -#ALL mail -s "CVS notification" %s diff --git a/CVSROOT/rcsinfo b/CVSROOT/rcsinfo deleted file mode 100644 index 49e59f4..0000000 --- a/CVSROOT/rcsinfo +++ /dev/null @@ -1,13 +0,0 @@ -# The "rcsinfo" file is used to control templates with which the editor -# is invoked on commit and import. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being made to, relative to the -# $CVSROOT. For the first match that is found, then the remainder of the -# line is the name of the file that contains the template. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/taginfo b/CVSROOT/taginfo deleted file mode 100644 index 274a46d..0000000 --- a/CVSROOT/taginfo +++ /dev/null @@ -1,20 +0,0 @@ -# The "taginfo" file is used to control pre-tag checks. -# The filter on the right is invoked with the following arguments: -# -# $1 -- tagname -# $2 -- operation "add" for tag, "mov" for tag -F, and "del" for tag -d -# $3 -- repository -# $4-> file revision [file revision ...] -# -# A non-zero exit of the filter program will cause the tag to be aborted. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being committed to, relative -# to the $CVSROOT. For the first match that is found, then the remainder -# of the line is the name of the filter to run. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/verifymsg b/CVSROOT/verifymsg deleted file mode 100644 index 86f747c..0000000 --- a/CVSROOT/verifymsg +++ /dev/null @@ -1,21 +0,0 @@ -# The "verifymsg" file is used to allow verification of logging -# information. It works best when a template (as specified in the -# rcsinfo file) is provided for the logging procedure. Given a -# template with locations for, a bug-id number, a list of people who -# reviewed the code before it can be checked in, and an external -# process to catalog the differences that were code reviewed, the -# following test can be applied to the code: -# -# Making sure that the entered bug-id number is correct. -# Validating that the code that was reviewed is indeed the code being -# checked in (using the bug-id number or a seperate review -# number to identify this particular code set.). -# -# If any of the above test failed, then the commit would be aborted. -# -# Actions such as mailing a copy of the report to each reviewer are -# better handled by an entry in the loginfo file. -# -# One thing that should be noted is the the ALL keyword is not -# supported. There can be only one entry that matches a given -# repository. diff --git a/jacobgen/.cvsignore b/jacobgen/.cvsignore deleted file mode 100644 index ebf9efe..0000000 --- a/jacobgen/.cvsignore +++ /dev/null @@ -1,13 +0,0 @@ -jacob.dll -jacob.jar -jacobdll.jar -*.zip -RELEASE.txt -.project -.classpath -compilation_tools.properties -version.properties -release -.externalToolBuilders -.cdtproject - diff --git a/jacobgen/LICENSE.txt b/jacobgen/LICENSE.txt deleted file mode 100644 index b6f92f3..0000000 --- a/jacobgen/LICENSE.txt +++ /dev/null @@ -1,340 +0,0 @@ - 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 Library 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. - - - Copyright (C) - - 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. - - , 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 Library General -Public License instead of this License. diff --git a/jacobgen/README.txt b/jacobgen/README.txt deleted file mode 100644 index 20181c5..0000000 --- a/jacobgen/README.txt +++ /dev/null @@ -1,29 +0,0 @@ -======================================================= -Jacobgen basic readme.txt -Most documentation is being moved to the docs directory -======================================================= - -Description ------------ -Jacobgen generates java class wrappers microsoft DLLs -that make them callable from java programs. The class -are built on top of the Jacob (Java-COM Bridge) project. -This library is ONLY useful if you are running Jacob. - -Running Jacobgen ----------------- -See docs/run_jacobgen.bat for an example script that -runs jacobgen - -ReleaseNotes and Technical Issues ---------------------------------- -see docs/ReleaseNotes.html - -Credits -------- -see docs/credits.txt - -History -------- -See docs/ReleaseNotes.html - \ No newline at end of file diff --git a/jacobgen/build.xml b/jacobgen/build.xml deleted file mode 100644 index 7484183..0000000 --- a/jacobgen/build.xml +++ /dev/null @@ -1,278 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Building java classes... - - Building java sample classes... - - Building java test classes... - - - - - Removing old jars - - Packaging java classes... - - - - - - - - - -
- - - - -
-
-
-
- - - - - - - - - - - - - - - Clean up the target folders and file, for safety - - Compiling C++ classes with JDK JNI library ${JDK} - - - - - - - - - - - - - - - - - - - - - Clean up the target folders and file, for safety - - Creating dll_fullpath - - - - - - - - - - - - - - - - - - - - - - - - - - ${application.title}]]> - ${application.vendor}]]> - - - - - - - - - - - - - - Packaging release... ${jarfile_fullpath} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- diff --git a/jacobgen/docs/HowToBuild.txt b/jacobgen/docs/HowToBuild.txt deleted file mode 100644 index 2518ed6..0000000 --- a/jacobgen/docs/HowToBuild.txt +++ /dev/null @@ -1,48 +0,0 @@ -To build and run: - -Unpack the source archive or check the files out of CVS into d:\jacobgen - -Install the following tools - Microsoft Visual Studio, a stripped down version is available from the MS web site. - Eclipse from www.eclipse.org. - Java jdk 1.4 (this was built using 1.4.2.09) - -The following configuration was used by most of the development team: - JDK = d:\j2sdk1.4.2_09 - DEST_DIR = d:\jacobgen - MSDEVDIR = d:\apps\\"Microsoft Visual Studio"\VC98 - -This project has been converted completely over to ANT. You can -run ANT from inside of eclipse or from the command line. -The ant process is driven off of a configuration file -compilation_tools.properties. Instructions on the information required -in that file are contained in build.xml in the root directory. - -Ant, via build.xml will do the following with teh default target. - Build the Java code - Build the jni code - create the dll - create jar file - -The package target creates the - javadoc and - zip files - -ECLIPSE - -Eclipse users will have to do some minor tweaks to their project if they -want to use the integrated build process. This is because the unit -tests are files located in the "unittest" directory while -the project source files themselves are in "src" the root directory. - Eclipse automatically adds the whole project as a source directory - Remove the root of the project from the build path - Add folders samples, src and unittest to the build path - Exclude *.txt from each of the newly added folders. - -The Servlet examples that required j2ee libraries to compile have temporarily -been removed. - -The java code is in .\src -The C++ code is in .\jni. - -Last Modified 10/2005 diff --git a/jacobgen/docs/ReleaseNotes.html b/jacobgen/docs/ReleaseNotes.html deleted file mode 100644 index 3e17788..0000000 --- a/jacobgen/docs/ReleaseNotes.html +++ /dev/null @@ -1,101 +0,0 @@ - - -Jacobgen Release Notes - - -This document descibes the known changes made to Jacobgen across releases. -(Dates in this document are in the format yy/mm/dd) - -

Version 0.7 (06/04/28)

-
    -
  • BUG-FIX: 1460974 Replaced samskivert.jar with viztool.jar for jdk1.5 compatibility. -
  • BUT-FIX: 1478303 Fixed jacobgen to now generate compilable Date related code. -
- -

Version 0.6 (05/12/07)

-
    -
  • BUG-FIX: changed code generator for in/out parameters toVariant() and putVariantRef() -
- -

Version 0.5 (05/10/14)

-
    -
  • PROJECT: source code moved to jacob-project on sourceforge -
  • PROJECT: converted from makefile to ant -
  • PROJECT: compiles on XP -
- -

Version 0.4 (04/03/02)

-
    -
  • UPGRADE: support for middle argument list optional parameters (with Variant.noParam()) -
  • UPGRADE: support for out-parameters (thanks to Hannes Reisinger) -
  • UPGRADE: MSMQ 2.0 support. Almost. -
  • UPGRADE: now you can check tlbs using TypeLibInspector.main(), see testJacobgendll.bat -
  • BUG-FIX: corrected class attributes (only for VAR_CONST) -
  • BUG-FIX: corrected return code for SafeArray type (thanks to Bill Kelemen) -
  • UPGRADE: added AliasGenerator to create TKIND_ALIAS classes (reported by Richard Range) -
  • UPGRADE: alias of enums support -
- -

Version 0.3 (04/01/02)

-
    -
  • BUG-FIX: change to Dispatch.call() to support more than 8 method parameters -
  • UPGRADE: COM Date support (thanks to rev) -
  • UPGRADE: CLASSPATH searching for type referenced outside the component. - Warning: classes searching is based on class name. If different jars or - packgages contains the same class the result is unknown. -
  • BUG-FIX: better Enum identification. Now works with Excel8 -
  • BUG-FIX: Excel8 caused VM crash due to buffer size limitations -
  • BUG-FIX: the generator didn't produce last class in TLB file (thanks to Liz Heine) -
-

Version 0.2

-

Version 0.1

- -(**) Dates are in italian format (dd/mm/yy) - -
-

Known Issues

-
    -
  • The wrapper classes will require a little hand tweaking - in most situations to get them to compile. -
  • Some methods will be generated more than once if they are - detected in a "class" more than once. -
  • This will generate the wrappers for most of a DLL but - will sometimes run into problems with unrecognized types. - A good example is MSWord. It will generate a lot of classes - but will have problems with some so the wrappers will have - to be hand tweaked in roder to work. -
  • EVENTS and STRUCTURES. Not supported -
  • VT_PTR type is not well supported -
- - -

Features

-
    -
  • TLB/OLB/DLL inspection via native code -
  • IN/OUT/OPTIONAL parameters support -
- -
    -
  • Office8/Excel8/Word8 wrapper generation -
  • MSMQ 2.0 wrapper generation (Almost) -
  • Lotus Domino wrapper generation (Almost) -
- - -

Data Mapping Notes

-
    -
  • SafeArray by reference are passed as arrays -
  • MsoRGBType mapped to int -
  • Enum types mapped to int -
- - - -

Application LIMITATIONS

-
    -
  • Acrobat Reader. Jacobgen is unable to parse Acrobat Reader OCX. I'm still investigating - this issue. By now you need to wrap it inside an another COM component. -
- - - \ No newline at end of file diff --git a/jacobgen/docs/credits.txt b/jacobgen/docs/credits.txt deleted file mode 100644 index c7cc577..0000000 --- a/jacobgen/docs/credits.txt +++ /dev/null @@ -1,6 +0,0 @@ -This is the brainchild of Massimiliano Bigatti. All original work copyright -Massimiliano Bigatti and licensed under LGPL by Massimiliano Bigatti - -+ Jacobgen out parameters are contrib of Hannes Reisinger -+ Jacobgen now depends on Sam Skivert library and viztool (only some classes are - provided with Jacobgen - license is GPL and LGPL) diff --git a/jacobgen/docs/run_jacobgen.bat b/jacobgen/docs/run_jacobgen.bat deleted file mode 100644 index 851b027..0000000 --- a/jacobgen/docs/run_jacobgen.bat +++ /dev/null @@ -1,24 +0,0 @@ -@echo off -cls - -REM run this from the root directory of the Jacobgen project -REM it will spit out the interface classes for a dll you pass in as a parameter -REM sample command line while sitting in the JACOBGEN project directory -REM -REM The following command built a sample in the jacob directory I have -REM installed near my jacobgen proejct directory -REM $ docs/run_jacobgen.bat -destdir:"..\jacob\samples" -listfile:"jacobgenlog.txt" -package:com.jacobgen.microsoft.msword "C:\Program Files\Microsoft Office\OFFICE11\MSWORD.OLB" -REM -REM -set JAVA_HOME=D:\j2sdk1.4.2_09 -set JRE=%JAVA_HOME%\bin\java - -set JACOBGEN_HOME=. -set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\lib\dt.jar;%JACOBGEN_HOME%\release\jacobgen.jar;%JACOBGEN_HOME%\lib\viztool.jar -REM put the dll in the path where we can find it -set PATH=%PATH%;%JACOBGEN_HOME%\release - -rem echo %CLASSPATH% - -%JRE% -Xint com.jacob.jacobgen.Jacobgen %1 %2 %3 %4 %5 -pause diff --git a/jacobgen/docs/todo.txt b/jacobgen/docs/todo.txt deleted file mode 100644 index ce460e2..0000000 --- a/jacobgen/docs/todo.txt +++ /dev/null @@ -1,5 +0,0 @@ -Upgrade javadoc comments generation -Events -Structures -Better Array support -VT_PTR support diff --git a/jacobgen/jni/TypeLibInspector.cpp b/jacobgen/jni/TypeLibInspector.cpp deleted file mode 100644 index e69be5c..0000000 --- a/jacobgen/jni/TypeLibInspector.cpp +++ /dev/null @@ -1,581 +0,0 @@ -/* - * Jacobgen.cpp - * Copyright (C) 2000 Massimiliano Bigatti - * - * 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -#include -#include -#include -#include -#include -// W2A conversion for converting BSTR to LPCTSTR -#include -#include -#include "TypeLibInspector.h" - -extern "C" -{ -LPTSTR buffer; -LPTSTR current_position; - - -/** - * Java_com_jacob_jacobgen_TypeLibInspector_queryInterface - * - * Main Java function - */ -JNIEXPORT jbyteArray JNICALL Java_com_jacob_jacobgen_TypeLibInspector_queryInterface -(JNIEnv *env, jobject jobj, jstring name) { - - jbyteArray jb; - jboolean iscopy; - int cchWideChar; - LPWSTR wname; - LPCSTR sname; - - buffer = NULL; - // could we just get the unicode characters to bein with? - sname = env->GetStringUTFChars( name, &iscopy ); - cchWideChar = strlen( sname ) * 2; - wname = (LPWSTR)malloc( cchWideChar ); - - //Perform conversion from non Unicode to Unicode string - int i = MultiByteToWideChar(CP_ACP,0,sname,strlen(sname),wname,cchWideChar); - printf("converted %s to %ls\n",sname,wname); - - CoInitialize( 0 ); - printf("calling ExtractTypeLib with %ls",wname); - ExtractTypeLib( wname ); - CoUninitialize(); - - if( buffer == NULL ) { - buffer = (char * )malloc( 1 ); - if( buffer != NULL ){ - *buffer = '\0'; - } - } - - //Construct return Java byte array - size_t dim = strlen( buffer ); - jb = env->NewByteArray( dim ); - env->SetByteArrayRegion( jb, 0, dim, (jbyte *)buffer ); - - return jb; -} -/** - * ExtractTypeLib - * - * Extract type lib information from specified file. It produces - * formatted output that the Generator is able to convert in source - * java files. - * - */ -void ExtractTypeLib( LPWSTR pszFileName ) -{ - LPTYPELIB pITypeLib; - - printf("trying to extract library %ls\n", pszFileName); - buffer = (LPTSTR )malloc( BUF_SIZE ); - if( buffer == NULL ) - { - _tprintf( _T("Jacobgen: unable to allocate temporary buffer\n") ); - return; - } - current_position = buffer; - HRESULT hr = LoadTypeLib( pszFileName, &pITypeLib ); - if ( S_OK != hr ) - { - append1( "ERROR: LoadTypeLib failed" ); - return; - } - - EnumTypeLib( pITypeLib ); - pITypeLib->Release(); -} - -void EnumTypeLib( LPTYPELIB pITypeLib ) -{ - UINT tiCount = pITypeLib->GetTypeInfoCount(); - printf("enumerating %d\n",tiCount); - //Extract Type lib name - BSTR pLibName; - pITypeLib->GetDocumentation(-1, &pLibName, NULL, 0, NULL ); - append2b("TYPELIB %ls\n", pLibName ); - - //hr = ptlib->GetDocumentation(-1, &pTypeLibrary->m_bstrName, &pTypeLibrary->m_bstrDocumentation, - // &pTypeLibrary->m_ulHelpContext, &pTypeLibrary->m_bstrHelpFile); - - for ( UINT i = 0; i < tiCount; i++ ) - { - LPTYPEINFO pITypeInfo; - - HRESULT hr = pITypeLib->GetTypeInfo( i, &pITypeInfo ); - - if ( S_OK == hr ) - { - ExtractTypeInfo( pITypeInfo ); - - pITypeInfo->Release(); - } - } -} - -void ExtractTypeInfo( LPTYPEINFO pITypeInfo ) -{ - HRESULT hr; - - BSTR pszTypeInfoName; - hr = pITypeInfo->GetDocumentation(MEMBERID_NIL, &pszTypeInfoName, 0, 0, 0); - if ( S_OK != hr ) - return; - printf("retrieved documentation %ls\n",pszTypeInfoName); - TYPEATTR * pTypeAttr; - hr = pITypeInfo->GetTypeAttr( &pTypeAttr ); - if ( S_OK != hr ) - { - printf("failed to get attribute!!!!!!!\n"); - SysFreeString( pszTypeInfoName ); - return; - } - - //append3("CLASS %ls;%ls\n", pszTypeInfoName, - append3("CLASS %ls;%s\n", pszTypeInfoName, - GetTypeKindName(pTypeAttr->typekind) ); - - if( pTypeAttr->typekind == TKIND_ALIAS ) { - TYPEDESC tdesc; - tdesc = pTypeAttr->tdescAlias; - - if( tdesc.vt == VT_PTR ) { - tdesc = *tdesc.lptdesc; - } - - if( tdesc.vt == VT_USERDEFINED ) { - BSTR pszRefFuncName = GetUserDefinedType( pITypeInfo, tdesc ); - if( pszRefFuncName ) { - append2b("EXTENDS;%ls\n",pszRefFuncName ); - SysFreeString( pszRefFuncName ); - } - } else { - append2("%EXTENDS;%ls\n",GetVarTypeName( tdesc.vt ) ); - } - } else - EnumTypeInfoMembers( pITypeInfo, pTypeAttr ); - - SysFreeString( pszTypeInfoName ); - - pITypeInfo->ReleaseTypeAttr( pTypeAttr ); -} - -void EnumTypeInfoMembers( LPTYPEINFO pITypeInfo, LPTYPEATTR pTypeAttr ) -{ - FUNCDESC * pFuncDesc; - BSTR pszFuncName; - ELEMDESC elemdesc; - TYPEDESC tdesc; - - if ( pTypeAttr->cImplTypes ) { - for ( unsigned i = 0; i < pTypeAttr->cImplTypes; i++ ) { - - LPTYPEINFO pImplInfo; - HREFTYPE hRefType; - - pITypeInfo->GetRefTypeOfImplType( i, &hRefType ); - pITypeInfo->GetRefTypeInfo( hRefType, &pImplInfo ); - - if( pImplInfo != NULL ) { - pImplInfo->GetDocumentation(MEMBERID_NIL, &pszFuncName,0,0,0); - append2b("EXTENDS;%ls",pszFuncName ); - } - append1("\n"); - SysFreeString( pszFuncName ); - } - } - - if ( pTypeAttr->cFuncs ) { - for ( unsigned i = 0; i < pTypeAttr->cFuncs; i++ ) { - - pITypeInfo->GetFuncDesc( i, &pFuncDesc ); - pITypeInfo->GetDocumentation(pFuncDesc->memid, &pszFuncName,0,0,0); - - append2("%ls;", GetInvokeKindName(pFuncDesc->invkind) ); - - elemdesc = pFuncDesc->elemdescFunc; - //PARAMDESC pdesc; //PENDING - //pdesc = elemdesc.paramdesc; - tdesc = elemdesc.tdesc; - - //If type type is pointer, dereference - if( tdesc.vt == VT_PTR ) { - tdesc = *tdesc.lptdesc; - } - - //Check for user defined types - //append2("%ls",GetVarTypeName( tdesc.vt ) ); - if( tdesc.vt == VT_USERDEFINED ) { - //append1( "^" ); - BSTR pszRefFuncName = GetUserDefinedType( pITypeInfo, tdesc ); - if( pszRefFuncName ) { - append2b("%ls",pszRefFuncName ); - SysFreeString( pszRefFuncName ); - } - } else - append2("%ls",GetVarTypeName( tdesc.vt ) ); - - append2b(" ;%ls;",pszFuncName ); - - //Extract function parameters - EnumParameters( pITypeInfo, pFuncDesc ); - - pITypeInfo->ReleaseFuncDesc( pFuncDesc ); - SysFreeString( pszFuncName ); - } - } - - if ( pTypeAttr->cVars ) - { - - for ( unsigned i = 0; i < pTypeAttr->cVars; i++ ) - { - VARDESC * pVarDesc; - - pITypeInfo->GetVarDesc( i, &pVarDesc ); - - BSTR pszVarName; - pITypeInfo->GetDocumentation(pVarDesc->memid, &pszVarName,0,0,0); - VARIANT *pvarValue = pVarDesc->lpvarValue; - - //_tprintf( _T(" %ls\n"), pszVarName ); - append2("%ls;", GetVarKindName( pVarDesc->varkind ) ); - append2b("%ls;",pszVarName ); - - if( pVarDesc->varkind == VAR_CONST ) { - if(pvarValue!=NULL) - append2("%ls;", GetVarTypeName( pvarValue->vt ) ); - else - append1("UNKNOWN" ); - - LPTSTR s = GetVarDefaultValue( pvarValue ); - append1( s ); - free( (void *)s ); - } - - append1("\n"); - - pITypeInfo->ReleaseVarDesc( pVarDesc ); - SysFreeString( pszVarName ); - } - } - -} - -/** - * For a USERDEFINED typedesc, extract the referred type - */ -BSTR GetUserDefinedType( LPTYPEINFO pITypeInfo, TYPEDESC tdesc ) { - HREFTYPE htype; - LPTYPEINFO ppTInfo = NULL; - HRESULT hr; - BSTR pszRefFuncName = NULL; - - if( tdesc.vt == VT_USERDEFINED ) { - htype = tdesc.hreftype; - - hr = pITypeInfo->GetRefTypeInfo( htype, &ppTInfo ); - if( ppTInfo ) - ppTInfo->GetDocumentation(MEMBERID_NIL, &pszRefFuncName, 0, 0, 0); - } - - return pszRefFuncName; -} - -void EnumParameters( ITypeInfo *pTypeInfo, FUNCDESC *pFuncDesc ) { - TYPEDESC tdesc; - - unsigned int cMaxNames = pFuncDesc->cParams; //+ pFuncDesc->cParamsOpt; - unsigned int pcNames; - - BSTR rgBstrNames[ 100 ]; - MEMBERID pMemId[ 100 ]; - - pTypeInfo->GetNames( pFuncDesc->memid, rgBstrNames, cMaxNames, &pcNames ); - pTypeInfo->GetIDsOfNames( rgBstrNames, pcNames, pMemId ); - - append1( "[" ); - for ( unsigned k = 0; k < pcNames; k++ ) - { - BSTR pszParName = rgBstrNames[ k ]; - - PARAMDESC pd = pFuncDesc->lprgelemdescParam[k].paramdesc; - - if( pd.wParamFlags != 0 ) { - append1( "{" ); - - if( pd.wParamFlags & PARAMFLAG_FIN ) - append1( "in-" ); - if( pd.wParamFlags & PARAMFLAG_FOUT ) - append1( "out-" ); - if( pd.wParamFlags & PARAMFLAG_FRETVAL ) - append1("retval-" ); - if( pd.wParamFlags & PARAMFLAG_FOPT ) - append1("optional-" ); - - append1( "}" ); - } - /* - VARTYPE vt = pFuncDesc->lprgelemdescParam[k].tdesc.vt; - if( vt == VT_PTR ) { - TYPEDESC *pPointedAt = pFuncDesc->lprgelemdescParam[k].tdesc.lptdesc; - vt = pPointedAt->vt; - append2( "%ls", GetVarTypeName( vt ) ); - } else if( vt == VT_SAFEARRAY ) { - TYPEDESC *pPointedAt = pFuncDesc->lprgelemdescParam[k].tdesc.lptdesc; - vt = pPointedAt->vt; - append2( "SAFEARRAY(%ls)", GetVarTypeName( vt ) ); - } else { - append2( "%ls", GetVarTypeName( vt ) ); - } - */ - - //If type type is pointer, dereference - tdesc = pFuncDesc->lprgelemdescParam[k].tdesc; - if( tdesc.vt == VT_PTR ) { - tdesc = *tdesc.lptdesc; - } - - //Check for user defined types - if( tdesc.vt == VT_USERDEFINED ) { - BSTR pszRefFuncName = GetUserDefinedType( pTypeInfo, tdesc ); - if( pszRefFuncName ) { - append2b("%ls",pszRefFuncName ); - SysFreeString( pszRefFuncName ); - } - } else - append2("%ls",GetVarTypeName( tdesc.vt ) ); - - if( k < pcNames-1 ) - append2b( " %ls,", rgBstrNames[k+1] ); - else - append1( " LastParam" ); - - } - append1("]\n" ); - -} - -/** - * Append a char array to destination buffer - */ -void append1( LPTSTR string ) { - LPTSTR s; - - s = string; - while( *s != '\0' ) { //TODO: add bound check - *current_position = *s; - s++; - current_position++; - } - - *current_position = '\0'; -} - -void append2b ( LPTSTR format, BSTR s1){ - append2c(format,s1); -} - -void append2c ( LPTSTR format, LPCWSTR s1){ - LPTSTR s; - //printf("append2c: '%s' %ls -- ",format, s1); - size_t dim = (wcslen( s1 )+ strlen(format)+1) * 2; - //printf("allocating %d -- ", dim); - //size_t dim = _tcslen( s1 ) * sizeof(_TCHAR) * 2; - - if( (dim > 0) ) { - s = (LPTSTR )malloc( dim ); - if( s != NULL ) { - *(s + dim - 1) = '\0'; - sprintf( s, format, s1 ); - //printf("generated %s\n", s); - append1( s ); - free( s ); - } - } -} - -/** - * Copy a generic text string to a char array and copies it - * to destination array - */ -void append2( LPTSTR format, LPCTSTR s1 ) { - //printf("append2 %s\n",s1); - USES_CONVERSION; - append2c(format,A2W(s1)); -} - -/** - * Copy two generic text strings to a char array and copies it - * to destination array - */ -void append3( LPTSTR format, BSTR s1, LPCTSTR s2 ) { - LPCWSTR wideS2; - LPTSTR s; - USES_CONVERSION; - wideS2 = A2W(s2); - int formatLength = strlen(format); - int width1 = wcslen(s1); - int width2 = wcslen(wideS2); - size_t dim = ( formatLength+ width1 + width2 +1 ) * 2; - //size_t dim = ( _tcslen( s1 ) + _tcslen( wideS2 ) ) * sizeof(_TCHAR) * 2; - - if( width1 > 0 && width2 > 0 ) { - s = (LPTSTR )malloc( dim ); - if( s != NULL ) { - *(s + dim - 1) = '\0'; - sprintf( s, format, s1, s2 ); - append1( s ); - free( s ); - } - } -} - - -#define CASE_STRING( x ) case x: s = _T(#x); break; - -LPCTSTR GetTypeKindName( TYPEKIND typekind ) -{ - LPTSTR s = _T(""); - - switch( typekind ) - { - CASE_STRING( TKIND_ENUM ) - CASE_STRING( TKIND_RECORD ) - CASE_STRING( TKIND_MODULE ) - CASE_STRING( TKIND_INTERFACE ) - CASE_STRING( TKIND_DISPATCH ) - CASE_STRING( TKIND_COCLASS ) - CASE_STRING( TKIND_ALIAS ) - CASE_STRING( TKIND_UNION ) - } - printf("found type %s\n"); - - return s; -} - -LPCTSTR GetInvokeKindName( INVOKEKIND invkind ) -{ - LPTSTR s = _T(""); - - switch( invkind ) - { - CASE_STRING( INVOKE_FUNC ) - CASE_STRING( INVOKE_PROPERTYGET ) - CASE_STRING( INVOKE_PROPERTYPUT ) - CASE_STRING( INVOKE_PROPERTYPUTREF ) - } - - return s; -} - -LPCTSTR GetVarTypeName( VARTYPE vt ) -{ - LPTSTR s = _T(""); - //LPTSTR s = _T(""); - - switch( vt ) - { - CASE_STRING( VT_EMPTY ) - CASE_STRING( VT_NULL ) - CASE_STRING( VT_I2 ) - CASE_STRING( VT_I4 ) - CASE_STRING( VT_R4 ) - CASE_STRING( VT_R8 ) - CASE_STRING( VT_CY ) - CASE_STRING( VT_DATE ) - CASE_STRING( VT_BSTR ) - CASE_STRING( VT_DISPATCH ) // IDispatch FAR* - CASE_STRING( VT_ERROR ) // Scodes - CASE_STRING( VT_BOOL ) - CASE_STRING( VT_VARIANT ) - CASE_STRING( VT_UNKNOWN ) // IUnknown FAR* - CASE_STRING( VT_I1 ) // Signed char. - CASE_STRING( VT_UI1 ) // Unsigned char. - CASE_STRING( VT_UI2 ) // Unsigned short. - CASE_STRING( VT_UI4 ) // Unsigned short. - CASE_STRING( VT_I8 ) // Signed 64-bit int. - CASE_STRING( VT_UI8 ) // Unsigned 64-bit int. - CASE_STRING( VT_INT ) // Signed machine int. - CASE_STRING( VT_UINT ) // Unsigned machine int. - CASE_STRING( VT_VOID ) // C-style void. - CASE_STRING( VT_HRESULT ) - CASE_STRING( VT_PTR ) // Pointer type. - CASE_STRING( VT_SAFEARRAY ) // Use VT_ARRAY in VARIANT. - CASE_STRING( VT_CARRAY ) // C-style array. - CASE_STRING( VT_USERDEFINED ) // User-defined type. - CASE_STRING( VT_LPSTR ) // Null-terminated string. - CASE_STRING( VT_LPWSTR ) // Wide null-terminated string. - CASE_STRING( VT_FILETIME ) // FILETIME. - CASE_STRING( VT_BLOB ) // Length-prefixed bytes. - CASE_STRING( VT_STREAM ) // Name of the stream follows. - CASE_STRING( VT_STORAGE ) // Name of the storage follows. - CASE_STRING( VT_STREAMED_OBJECT ) // Stream contains an object. - CASE_STRING( VT_STORED_OBJECT ) // Storage contains an object. - CASE_STRING( VT_BLOB_OBJECT ) // Blob contains an object. - CASE_STRING( VT_CF ) // Clipboard format. - CASE_STRING( VT_CLSID ) // A class ID. - CASE_STRING( VT_VECTOR ) // Simple counted array. - CASE_STRING( VT_ARRAY )// SAFEARRAY*. - CASE_STRING( VT_BYREF ) - CASE_STRING( VT_RESERVED ) - - //CASE_STRING( VT_USERDEFINED ) - //CASE_STRING( VT_RESERVED ) - //CASE_STRING( VT_BYREF ) // A pointer to data is passed - //CASE_STRING( VT_ARRAY ) // A safe array of the data is passed - } - - return s; -} - -LPCTSTR GetVarKindName( VARKIND vk ) -{ - LPTSTR s = _T(""); - - switch( vk ) - { - CASE_STRING( VAR_PERINSTANCE ) - CASE_STRING( VAR_STATIC ) - CASE_STRING( VAR_CONST ) - CASE_STRING( VAR_DISPATCH ) - } - - return s; -} - -LPTSTR GetVarDefaultValue( VARIANT *pv ) -{ - LPTSTR buf = (LPTSTR )malloc( 128 ); - - if( buf != NULL ) { - switch( pv->vt ) - { - case VT_I4: sprintf(buf, "%ld", pv->lVal ); break; - } - } - - return buf; -} - -} \ No newline at end of file diff --git a/jacobgen/jni/TypeLibInspector.h b/jacobgen/jni/TypeLibInspector.h deleted file mode 100644 index b408b8e..0000000 --- a/jacobgen/jni/TypeLibInspector.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Jacobgen.h - * Copyright (C) 2000 Massimiliano Bigatti - * - * 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -#include -/* Header for class com_jacob_jacobgen_TypeLibInspector */ - -#ifndef _Included_com_jacob_jacobgen_TypeLibInspector -#define _Included_com_jacob_jacobgen_TypeLibInspector -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jacob_jacobgen_TypeLibInspector - * Method: queryInterface - * Signature: (Ljava/lang/String;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_com_jacob_jacobgen_TypeLibInspector_queryInterface - (JNIEnv *, jobject, jstring); - -void ExtractTypeLib( LPWSTR pszFileName ); -void EnumTypeLib( LPTYPELIB pITypeLib ); -void ExtractTypeInfo( LPTYPEINFO pITypeInfo ); -void EnumTypeInfoMembers( LPTYPEINFO pITypeInfo, LPTYPEATTR pTypeAttr); -void EnumParameters( ITypeInfo *pTypeInfo, FUNCDESC *f ); - -BSTR GetUserDefinedType( LPTYPEINFO pITypeInfo, TYPEDESC tdesc ); - -LPCTSTR GetTypeKindName( TYPEKIND typekind ); -LPCTSTR GetInvokeKindName( INVOKEKIND invkind ); -LPCTSTR GetVarTypeName( VARTYPE vt ); -LPCTSTR GetVarKindName( VARKIND vk ); -LPTSTR GetVarDefaultValue( VARIANT *pv ); - -void append1( LPTSTR string ); -void append2( LPTSTR format, LPCTSTR s1 ); -void append2b( LPTSTR format, BSTR s1); -void append2c ( LPTSTR format, LPCWSTR s1); -void append3( LPTSTR format, BSTR bstr1, LPCTSTR s2 ); - -//Output buffer size -#define BUF_SIZE 5000000 - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jacobgen/jni/makeh.bat b/jacobgen/jni/makeh.bat deleted file mode 100644 index d3a2e3c..0000000 --- a/jacobgen/jni/makeh.bat +++ /dev/null @@ -1,11 +0,0 @@ -@echo off -cls -REM This file uses javah to create the jni headers for a class -REM It will use the verbose naming convention - -set JAVA_HOME=D:\j2sdk1.4.2_09 -set JAVAH=%JAVA_HOME%\bin\javah -set CLASSPATH=%JAVA_HOME%\lib\classes.zip;src;release - -%JAVAH% -d jni -jni com.jacob.jacobgen.TypeLibInspector -pause diff --git a/jacobgen/lib/viztool.jar b/jacobgen/lib/viztool.jar deleted file mode 100644 index 553db19545bd5c2b69ccbf18dbde1a1c13761636..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56730 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 diff --git a/jacobgen/samples/README.txt b/jacobgen/samples/README.txt deleted file mode 100644 index 7502363..0000000 --- a/jacobgen/samples/README.txt +++ /dev/null @@ -1 +0,0 @@ -This file exists to make sure this directory hangs around until there are actual sample files to put in the samples directory \ No newline at end of file diff --git a/jacobgen/src/com/jacob/jacobgen/AbstractGenerator.java b/jacobgen/src/com/jacob/jacobgen/AbstractGenerator.java deleted file mode 100644 index 9038288..0000000 --- a/jacobgen/src/com/jacob/jacobgen/AbstractGenerator.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * AbstractGenerator.java - * Copyright (C) 2000-2002 Massimiliano Bigatti - * - * 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -package com.jacob.jacobgen; - -import java.io.*; -import java.util.*; - -/** - * This class represents any of the Abstract classes generated by Jacobgen - * @version $Id$ - * - */ -public abstract class AbstractGenerator { - protected final String classHeader = - "/**\n" + - " * JacobGen generated file --- do not edit\n" + - " *\n" + - " * (http://www.sourceforge.net/projects/jacob-project"+ - " */\n"; - - protected String filename; - protected String typelibName; - protected String className; - protected String baseClass; - protected Vector classFields; - protected Vector classMethods; - protected String destinationPackage; - protected Writer w; - - protected boolean simpleEnums = true; - - protected AbstractGenerator( String filename, String typelibName, String destinationPackage, - String className, String baseClass, Vector classFields, Vector classMethods ) { - - this.filename = filename; - this.typelibName = typelibName; - this.className = className; - this.baseClass = baseClass; - this.classFields = classFields; - this.classMethods = classMethods; - this.destinationPackage =destinationPackage; - } - - public void generate() throws IOException { - w = new FileWriter( filename ); - w.write(classHeader); - - writePackageDeclaration(); - writeImports(); - writeClassDeclaration(); - writeFields(); - writeConstructors(); - writeMethods(); - writeEndings(); - writeClassClosing(); - - w.close(); - } - - protected void writeImports() throws IOException { - w.write( "import com.jacob.com.*;\n\n" ); - } - - protected void writePackageDeclaration() throws IOException { - if( destinationPackage != null && destinationPackage.trim().length() > 0 ) - w.write( "package " + destinationPackage + ";\n\n" ); - } - - protected abstract void writeClassDeclaration() throws IOException; - protected abstract void writeFields() throws IOException; - protected abstract void writeConstructors() throws IOException; - protected abstract void writeMethods() throws IOException; - protected void writeEndings() throws IOException { - } - - protected void writeClassClosing() throws IOException { - w.write( "}\n"); - } -} - diff --git a/jacobgen/src/com/jacob/jacobgen/AliasGenerator.java b/jacobgen/src/com/jacob/jacobgen/AliasGenerator.java deleted file mode 100644 index f1ac759..0000000 --- a/jacobgen/src/com/jacob/jacobgen/AliasGenerator.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * AliasGenerator.java - * Copyright (C) 2002 Massimiliano Bigatti - * - * 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -package com.jacob.jacobgen; - -import java.io.*; - -/** - * This class creates any of the wrapper classes that map to a DLL object - * of type TKIND_ALIAS - * @version $Id$ - */ -class AliasGenerator extends AbstractGenerator { - - protected AliasGenerator( String filename, String typelibName, String destinationPackage, - String className, String baseClass ) { - super( filename, typelibName, destinationPackage, className, baseClass, - null, null ); - } - - protected void writeClassDeclaration() throws IOException { - w.write( "public interface " + className + " extends " + baseClass + " {\n\n" ); - } - - protected void writeFields() throws IOException { - } - - protected void writeConstructors() throws IOException { - } - - protected void writeMethods() throws IOException { - } - -} - diff --git a/jacobgen/src/com/jacob/jacobgen/ClassGenerator.java b/jacobgen/src/com/jacob/jacobgen/ClassGenerator.java deleted file mode 100644 index 01b9135..0000000 --- a/jacobgen/src/com/jacob/jacobgen/ClassGenerator.java +++ /dev/null @@ -1,508 +0,0 @@ -/* - * ClassGenerator.java - * Copyright (C) 2000-2002 Massimiliano Bigatti - * - * 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -package com.jacob.jacobgen; - -import java.io.*; -import java.util.*; - -/** - * The standard class generator for DLL entities of type - * TKIND_COCLASS and TKIND_DISPATCH - * - * @version $Id$ - * - */ -class ClassGenerator extends AbstractGenerator { - - public static String[] javaKeywords = { "goto", "default", "volatile", "import", - "new", "abstract"}; - - protected boolean containsDate = false; - - protected ClassGenerator( String filename, String typelibName, String destinationPackage, - String className, String baseClass, Vector classFields, Vector classMethods ) { - super( filename, typelibName, destinationPackage, className, baseClass, - classFields, classMethods ); - } - - protected void writeClassDeclaration() throws IOException { - w.write( "public class " + className + " extends " + baseClass + " {\n\n" ); - } - - protected void writeFields() throws IOException { - w.write("\tpublic static final String componentName = \"" + typelibName + "." + - className + "\";\n\n"); - } - - protected void writeConstructors() throws IOException { - if( baseClass.equals("Dispatch") ) { - writeConstructor1(); - writeConstructor2(); - writeConstructor4(); - } else - writeConstructor3(); - } - - protected void writeConstructor1() throws IOException { - w.write( "\tpublic " + className + - "() {\n\t\tsuper(componentName);\n\t}\n\n"); - } - - protected void writeConstructor2() throws IOException { - w.write("\t/**\n"); - w.write("\t* This constructor is used instead of a case operation to\n"); - w.write("\t* turn a Dispatch object into a wider object - it must exist\n"); - w.write("\t* in every wrapper class whose instances may be returned from\n"); - w.write("\t* method calls wrapped in VT_DISPATCH Variants.\n"); - w.write("\t*/\n"); - w.write("\tpublic " + className + "(Dispatch d) {\n"); - w.write("\t\t// take over the IDispatch pointer\n"); - w.write("\t\tm_pDispatch = d.m_pDispatch;\n"); - w.write("\t\t// null out the input's pointer\n"); - w.write("\t\td.m_pDispatch = 0;\n"); - w.write("\t}\n\n"); - } - - protected void writeConstructor4() throws IOException { - w.write( "\tpublic " + className + - "(String compName) {\n\t\tsuper(compName);\n\t}\n\n"); - } - - protected void writeConstructor3() throws IOException { - w.write( "\tpublic " + className + - "() {\n\t\tsuper(componentName);\n\t}\n\n"); - w.write("\tpublic " + className + "(Dispatch d) {\n"+ - "\t\tsuper(d);\n\t}\n"); - } - - protected void writeMethods() throws IOException { - Enumeration e = classMethods.elements(); - while( e.hasMoreElements() ) { - MethodItem mi = (MethodItem)e.nextElement(); - - if( mi.getMethodType() == MethodItem.METHODTYPE_FUNCTION || - mi.getMethodType() == MethodItem.METHODTYPE_PROPERTYGET || - mi.getMethodType() == MethodItem.METHODTYPE_PROPERTYPUT || - mi.getMethodType() == MethodItem.METHODTYPE_PROPERTYPUTREF ) { - - writeMethod( mi ); - if( mi.isAdditionalMethodRequired() ) - writeByRefMethod( mi ); - } - } - } - - protected void writeByRefMethod( MethodItem mi ) throws IOException { - ParameterItem[] parameters = mi.getParameters(); - - writeMethodDeclaration( mi, parameters.length, false ); - writeMethodBody( mi, parameters.length, false ); - } - - protected void writeMethod( MethodItem mi ) throws IOException { - ParameterItem[] parameters = mi.getParameters(); - - writeMethodDeclaration( mi, parameters.length, true ); - writeMethodBody( mi, parameters.length, true ); - - //Try to guess which overloaded methods to write - for( int i = parameters.length-1; i>=0; i-- ) { - ParameterItem p = parameters[i]; - - if( p.isOptional() ) { - writeMethodDeclaration( mi, i, true ); - writeMethodBody( mi, i, true ); - } - } - } - - /** - * This Method writes a short javadoc-comment in front of the method. - * Maybe in a future version the helpstring could be extracted an used - * instead the current weak description. - * @param mi the MethodItem which should be documented - * @param paramNum the count of parameters - * @param baseTypes is this a comment for method with only base types - * or is this a comment for method with output-parameters - * @throws IOException the used Writer could throw an IOException - */ - protected void writeMethodComment( MethodItem mi, int paramNum, - boolean baseTypes ) throws IOException { - // Short description of the method - w.write( "\t/**\n" ); - if ( baseTypes ) { - w.write( "\t * Wrapper for calling the ActiveX-Method with input-parameter(s).\n" ); - } else { - w.write( "\t * Wrapper for calling the ActiveX-Method and receiving the output-parameter(s).\n" ); - } - - // descriptions of the parameters - ParameterItem[] parameters = mi.getParameters(); - for ( int i = 0; i < paramNum; i++ ) { - ParameterItem p = parameters[i]; - if ( baseTypes || p.getDirection() == ParameterItem.DIRECTION_IN ) { - w.write( "\t * @param " + p.getJavaName() + " an input-parameter of type " + p.getType() + "\n" ); - } else { - // this is only necessary if we want to comment non-basetypes and if it is an output-parameter - char[] achParamSpace = new char[p.getJavaName().length()]; - Arrays.fill(achParamSpace, ' '); - // don't want to put a char array in a write() statement - String achParamSpaceString = new String(achParamSpace); - w.write( "\t * @param " + p.getJavaName() + " is an one-element array which sends the input-parameter\n" - + "\t * " + achParamSpaceString + " to the ActiveX-Component and receives the output-parameter\n" ); - } - } - - // and the return-value - if( !mi.getReturnType().equals("void") ) { - w.write( "\t * @return the result is of type " + mi.getReturnType() + "\n"); - } - - w.write( "\t */\n" ); - } - - protected void writeMethodDeclaration( MethodItem mi, int paramNum, - boolean baseTypes ) throws IOException { - String[] objectMethods = { "clone", "equals", "finalize", "getClass" - , "hashCode", "notify", "notifyAll", "toString", "wait" }; - - writeMethodComment(mi, paramNum, baseTypes); - - w.write( "\tpublic " ); - if( mi.getMethodType() == MethodItem.METHODTYPE_PROPERTYGET - && mi.getReturnType().trim().length() == 0 ) - w.write( "Variant" ); - else if( mi.getReturnType().trim().length() == 0 ) - w.write( "void" ); - else - w.write( mi.getReturnType() ); - - w.write( " " ); - - StringBuffer methodName = new StringBuffer(); - - //Change Method name if it is a property get or set - switch( mi.getMethodType() ) { - case MethodItem.METHODTYPE_FUNCTION: - if( checkForJavaKeywords( mi.getName() ) ) - methodName.append( "m_" ); - methodName.append( mi.getName().substring(0,1).toLowerCase() ); - methodName.append( mi.getName().substring(1) ); - break; - - case MethodItem.METHODTYPE_PROPERTYGET: - methodName.append( "get" ); - methodName.append( mi.getName() ); - break; - - case MethodItem.METHODTYPE_PROPERTYPUT: - case MethodItem.METHODTYPE_PROPERTYPUTREF: - methodName.append( "set" ); - methodName.append( mi.getName() ); - break; - } - - for( int i=0; i 8 ) - w.write("N"); - w.write("(this, \"" + mi.getName() + "\""); - if( paramNum > 0 ) - w.write(", "); - - if( paramNum > 8 ) - w.write( "new Object[] { " ); - - for( int i = 0; i < paramNum; i++ ) { - if( i!=0 ) - w.write( ", " ); - - ParameterItem p = parameters[i]; - if ( p.getDirection() == ParameterItem.DIRECTION_IN ) { - // if it is an input-parameter we use the normal behaviour - w.write( p.getParameterCallingCode() ); - } else { - // if it is an output-parameter we use the variant-variable - w.write( p.getVariantName() ); - } - } - - if( paramNum > 8 ) - w.write( "}" ); - - w.write( ")" ); - if( !mi.getReturnType().equals("void") ) - w.write( mi.getReturnConversionMethodCode() ); - - if( mi.isCustomReturnType() ) - w.write( ".toDispatch())" ); - - if( mi.getReturnType().equals("java.util.Date") ) - w.write( ")" ); - - w.write( ";\n\n" ); - - // If we are using paramters with return values we have to retrieve this - // values from the Varaints with to*(). This has to be done after the call. - // It should look like the following: lastParam[0] = param1.getInt(); - for( int i = 0; i < paramNum; i++ ) { - ParameterItem p = parameters[i]; - // this is only necessary if it is an output-parameter - if ( p.getDirection() == ParameterItem.DIRECTION_OUT ) { - w.write("\t\tif( "+p.getJavaName()+" != null && "+p.getJavaName()+".length > 0 )\n"); - if (p.getVariantGetMethod().equals("toVariant")){ - // 12/2005 hack to get get this to generate compileable code. - // Hopefully someone will look at this later and make sure it is correct - w.write("\t\t\t" +p.getJavaName() + "[0] = " +p.getVariantName() + ";\n"); - } else { - w.write("\t\t\t" + p.getJavaName() + "[0] = " + p.getVariantName() + "." + p.getVariantGetMethod() + "();\n"); - } - } - } - - // Now it is time to return the result - if( !mi.getReturnType().equals("void") ) { - w.write("\n\t\treturn result_of_" + mi.getName() + ";\n"); - } - } - - protected void writeFunctionMethodBody( MethodItem mi, int paramNum ) throws IOException { - w.write("\t\t"); - - if( !mi.getReturnType().equals("void") ) { - w.write("return "); - - if( mi.isCustomReturnType() ) - w.write("new " + mi.getReturnType() + "("); - } - - w.write("Dispatch.call"); - if( paramNum > 8 ) - w.write("N"); - w.write("(this, \"" + mi.getName() + "\""); - if( paramNum > 0 ) - w.write(", "); - - ParameterItem[] parameters = mi.getParameters(); - if( paramNum > 8 ) - w.write( "new Object[] { " ); - - for( int i = 0; i < paramNum; i++ ) { - if( i!=0 ) - w.write( ", " ); - - ParameterItem p = parameters[i]; - w.write( p.getParameterCallingCode() ); - } - - if( paramNum > 8 ) - w.write( "}" ); - - w.write( ")" ); - if( !mi.getReturnType().equals("void") ) - w.write( mi.getReturnConversionMethodCode() ); - - if( mi.isCustomReturnType() ) - w.write( ".toDispatch())" ); - - w.write( ";\n" ); - } - - protected void writeDateConversionCode() throws IOException { - w.write( "\tstatic long zoneOffset" ); - w.write( "\t= java.util.Calendar.getInstance().get(java.util.Calendar.ZONE_OFFSET);\n\n" ); -/* - w.write( "\tstatic java.util.Date comDateToJavaDate(double comDate) {\n"); - w.write( "\t\tcomDate = comDate - 25569D;\n"); - w.write( "\t\tlong millis = Math.round(86400000L * comDate) - zoneOffset;\n\n"); - w.write( "\t\tjava.util.Calendar cal = java.util.Calendar.getInstance();\n"); - w.write( "\t\tcal.setTime(new java.util.Date(millis));\n"); - w.write( "\t\tmillis -= cal.get(java.util.Calendar.DST_OFFSET);\n\n"); - w.write( "\t\treturn new java.util.Date(millis);\n"); - w.write( "\t}\n\n"); -*/ - w.write( "\tstatic double javaDateToComDate(java.util.Date javaDate) {\n\n"); - w.write( "\t\tjava.util.Calendar cal = java.util.Calendar.getInstance();\n"); - w.write( "\t\tcal.setTime(javaDate);\n"); - w.write( "\t\tlong gmtOffset = (cal.get(java.util.Calendar.ZONE_OFFSET) + cal.get(java.util.Calendar.DST_OFFSET));\n\n"); - w.write( "\t\tlong millis = javaDate.getTime() + gmtOffset;\n"); - w.write( "\t\treturn 25569D+millis/86400000D;\n"); - w.write( "\t}\n\n"); - } - - protected void writeEndings() throws IOException { - if( containsDate ) - writeDateConversionCode(); - } - - /* - protected String computeParamType( ParameterItem pi ) { - String result = "new Variant(" + pi.getName() + ")"; - if( pi.getType().equals("String" ) || pi.isObject() || pi.isCustomType() ) - result = pi.getName(); - - return result; - } - */ - - /** - * Change contents of StringBuffer if contains a Java Keyword. It should - * prevent compile errors. - */ - public static boolean checkForJavaKeywords( String s ) { - boolean result = false; - for( int i=0; i - * %JRE% -Xint com.jacob.jacobgen.Jacobgen %1 %2 %3 %4 %5 - * - * - * @version $Id$ - * @author Massimiliano Bigatti - */ -public class Jacobgen { - - public static final String version = "0.4"; - public static Jacobgen instance; - protected Vector methodsToAvoid; - - /** - * Package where to put generated classes - */ - protected String destinationPackage = ""; - - protected String destinationPath = ""; - - protected String typelibFilename = null; - - protected String tempFileName = null; - - protected Vector internalEnums = new Vector(); - - protected Hashtable externalClasses; - - private Jacobgen() { - methodsToAvoid = new Vector(); - methodsToAvoid.addElement( "QueryInterface" ); - methodsToAvoid.addElement( "AddRef" ); - methodsToAvoid.addElement( "Release" ); - methodsToAvoid.addElement( "GetTypeInfoCount" ); - methodsToAvoid.addElement( "GetTypeInfo" ); - methodsToAvoid.addElement( "GetIDsOfNames" ); - methodsToAvoid.addElement( "Invoke" ); - } - - protected void loadExternalClasses() { - String classpath = System.getProperty("java.class.path"); - ClassEnumerator aClassEnumerator = new ClassEnumerator(classpath); - - // print out the warnings - ClassEnumerator.Warning[] warnings = aClassEnumerator.getWarnings(); - for (int i = 0; i < warnings.length; i++) { - System.out.println("External Class Loader Warning: " + warnings[i].reason); - } - - externalClasses = new Hashtable(); - while (aClassEnumerator.hasNext()) { - String s = (String)aClassEnumerator.next(); - int p = s.lastIndexOf('.'); - externalClasses.put(s.substring(p+1), s); - } - } - - protected String getExternalClass( String className ) { - return (String)externalClasses.get( className ); - } - - public boolean isEnum( String className ) { - String fullClassName = null; - boolean result = internalEnums.contains( className.toLowerCase() ); - - //Check for pointed JARs. We assume that all enums are implemented - //as interfaces. - if( !result ) { - fullClassName = getExternalClass( className ); - if( fullClassName != null ) - try { - Class clazz = Class.forName( fullClassName ); - result = clazz.isInterface(); //Little hack - //if( result ) - // System.out.println("isEnum : " + fullClassName ); - - } catch( ClassNotFoundException ex1 ) { - } catch( NoClassDefFoundError ex2 ) { - } - } - - return result; - } - - public void generate() throws IOException { - - System.out.println("JACOBGEN " + version + ". Copyright 2000-2002 Massimiliano Bigatti. Relased under GNU GPL License"); - System.out.println("starting ..." ); - - //Create a list of external classes - loadExternalClasses(); - System.out.println("creating TypeLibInspector"); - //Query TypeLib informations - TypeLibInspector inspector = new TypeLibInspector(); - System.out.println("calling TypeLibInspector.queryInterface with "+typelibFilename); - byte[] typelibinfo = inspector.queryInterface(typelibFilename); - - //Convert byte array to a vector of lines - LineNumberReader reader = new LineNumberReader( new StringReader( new - String( typelibinfo ) ) ); - - Vector lines = new Vector(); - while( true ) { - String line = reader.readLine(); - if( line == null ) - break; - - lines.addElement( line ); - } - - if( tempFileName != null ) { - try { - File out = new File(tempFileName); - FileWriter fw = new FileWriter( out ); - - Enumeration e = lines.elements(); - while( e.hasMoreElements() ) { - fw.write( (String)e.nextElement() ); - fw.write( '\n' ); - } - - fw.close(); - - } catch( IOException io ) { - System.err.println("Unable to generate temporary output file\n"); - } - } - - generateClasses( lines ); - } - - protected void generateClasses( Vector lines ) throws IOException { - int count = 0; - boolean startClass = false; - Vector classMethods = null; - Vector classFields = null; - String className = ""; - String classType = ""; - String typelibName = ""; - String baseClass = ""; - - int enums = 0; - System.out.print("finding ENUMS ("+lines.size()+")... " ); - for( int i=0; i 0 ) - if( !destinationPath.endsWith( File.separator ) ) - destinationPath += File.separator; - - if( destinationPackage.length() > 0 ){ - directory = convertPackageToDir(destinationPackage) + File.separator; - } - - filename = destinationPath + directory + className + ".java"; - - System.out.println("Creating " + filename + " ..." ); - - File file = new File( destinationPath + directory ); - if( !file.exists() ){ - if( !file.mkdirs() ){ - System.err.println("Unable to create directories (" + destinationPath + directory + ") !" ); - } - } - - g = null; - if( classType.equals("TKIND_ENUM") ) { - g = new EnumGenerator( filename, typelibName, destinationPackage, className, baseClass, classFields, null ); - } else if( classType.equals("TKIND_COCLASS") ) { - g = new ClassGenerator( filename, typelibName, destinationPackage, className, baseClass, null, classMethods ); - } else if( classType.equals("TKIND_DISPATCH") ) { - g = new ClassGenerator( filename, typelibName, destinationPackage, className, baseClass, null, classMethods ); - } else if( classType.equals("TKIND_ALIAS") ) { - g = new AliasGenerator( filename, typelibName, destinationPackage, className, baseClass ); - } else { - //System.err.println("Unrecognized class type "+classType); - } - - if( g != null ) - g.generate(); - - } - - protected String convertPackageToDir( String packageName ) { - StringTokenizer st = new StringTokenizer( packageName, "." ); - StringBuffer buffer = new StringBuffer(); - - while( st.hasMoreTokens() ) { - buffer.append( st.nextToken() ); - if( st.hasMoreTokens() ) - buffer.append( File.separator ); - } - - return buffer.toString(); - } - - protected Vector readFile(String filename) throws FileNotFoundException, IOException { - Vector result = new Vector(); - - FileReader fr = new FileReader( filename ); - LineNumberReader reader = new LineNumberReader( fr ); - - while( true ) { - String line = reader.readLine(); - if( line == null ) - break; - - result.addElement( line ); - } - - return result; - } - - public static Jacobgen getInstance() { - if( instance == null ) - instance = new Jacobgen(); - - return instance; - } - - public void parseOptions( String[] args ) { - for( int i=0; i"); - System.out.println("\t-destdir:"); - System.out.println("\t-listfile:"); - System.out.println(); - System.exit(0); - } else { - Jacobgen g = getInstance(); - try { - g.parseOptions( args ); - if( g.typelibFilename == null ) - System.out.println("Jacobgen you need to specify an input file"); - else - g.generate(); - //g.generate( argv[0], argv[1] ); - } catch( IOException ex2 ) { - System.err.println("Jacobgen: I/O error (file " + g.typelibFilename +")" ); - } - } - } -} diff --git a/jacobgen/src/com/jacob/jacobgen/MethodItem.java b/jacobgen/src/com/jacob/jacobgen/MethodItem.java deleted file mode 100644 index 51d4f2e..0000000 --- a/jacobgen/src/com/jacob/jacobgen/MethodItem.java +++ /dev/null @@ -1,329 +0,0 @@ -/* - * MethodItem.java - * Copyright (C) 2000-2002 Massimiliano Bigatti - * - * 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -package com.jacob.jacobgen; - -import java.util.*; - -/** - * Represents a class method. - * - * @version $Id$ - * @author Massimiliano Bigatti - */ -public class MethodItem { - - private String name; - private String returnType; - private String nativeReturnType; - private int methodType; - private Vector parametersList; - private boolean customReturnType; - private boolean additionalMethodRequired; - - public static final int METHODTYPE_UNKNOWN = -1; - public static final int METHODTYPE_FUNCTION = 1; - public static final int METHODTYPE_PROPERTYGET = 2; - public static final int METHODTYPE_PROPERTYPUT = 3; - public static final int METHODTYPE_PROPERTYPUTREF = 4; - - protected MethodItem(String line) throws IllegalFormatException { - parametersList = new Vector(); - extractData( line ); - } - - /** - * Extract information from a well formatted line - */ - protected void extractData( String line ) throws IllegalFormatException { - StringTokenizer st = new StringTokenizer( line, ";" ); - - try { - //Extract method type - methodType = computeMethodType( st.nextToken() ); - - //Extract return type - nativeReturnType = st.nextToken().trim(); - if( nativeReturnType.length() > 0 ) - returnType = computeVarType( nativeReturnType ); - else - returnType = ""; - - //Extract name - name = st.nextToken(); - - //Extract parameters - extractParameters( st.nextToken() ); - - //Computes if the return type is a standard type - computeCustomReturnType(); - - } catch( NoSuchElementException ns ) { - System.err.println("Seems that line " + line + " is not well " + - "formed, report to support."); - ns.printStackTrace(); - } - } - - protected void extractParameters( String parameters ) throws IllegalFormatException { - additionalMethodRequired = false; - - //Strip trailing and ending [] - if( !parameters.startsWith("[") || !parameters.endsWith("]") ) - throw new IllegalFormatException("Parameters format error : " - + parameters ); - - parameters = parameters.substring( 1, parameters.length()-1 ); - - StringTokenizer st = new StringTokenizer( parameters, "," ); - while( st.hasMoreTokens() ) { - String param = st.nextToken(); - - //Extract parameters data - StringTokenizer st1 = new StringTokenizer( param ); - String options = st1.nextToken("{}"); - String type = st1.nextToken(" "); - String name = st1.nextToken(); - - type = type.substring( 1 ).trim(); - - //Extract options - int direction = ParameterItem.DIRECTION_UNKNOWN; - boolean optional = false; - StringTokenizer st2 = new StringTokenizer( options, "-" ); - while( st2.hasMoreTokens() ) { - String option = st2.nextToken(); - if( option.equals("in") ) - direction = ParameterItem.DIRECTION_IN; - else if( option.equals("out") ) - direction = ParameterItem.DIRECTION_OUT; - else if( option.equals("retval") ) - direction = ParameterItem.DIRECTION_RETVAL; - else if( option.equals("optional") ) - optional = true; - } - - ParameterItem pi = new ParameterItem( name, - type, computeVarType( type ), direction, optional ); - - //This parameter is a Java base class - //if( pi.getObjectType() != pi.getType() ) - if( optional || direction == ParameterItem.DIRECTION_OUT) - additionalMethodRequired = true; - - parametersList.addElement( pi ); - } - - } - - public String getName() { - return name; - } - - public String getReturnType() { - return returnType; - } - - public int getMethodType() { - return methodType; - } - - public boolean isAdditionalMethodRequired() { - return additionalMethodRequired; - } - - protected void computeCustomReturnType() { - if( nativeReturnType.equals("VT_SAFEARRAY") ) { - customReturnType = false; - return; - } - - String[] types = { "void", "Object", "short", "int", "float", "double", - "long", "java.util.Date", "String", "Dispatch", - "boolean", "Variant", "byte" }; - - customReturnType = true; - if( returnType.trim().length() == 0 ) - customReturnType = false; - else - for( int i=0; ip_. - * @return a String which is the name of the parameter without any - * conflicts with Java-Keywords - */ - public String getJavaName() { - if ( ClassGenerator.checkForJavaKeywords(this.name) ) { - return "p_" + this.name; - } else { - return this.name; - } - } - - /** - * Returns the name for the parameter as it is used by the Variant-variable - * which is necessary for calls with out-parameters. - * @return a String which is the name of the Variant-variable of this parameter - */ - public String getVariantName() { - return "vnt_" + this.name; - } - - /** - * Returns the name for the put*Ref-method for this parameter as it is used - * by the Variant-variable which is necessary for calls with out-parameters. - * @return a String which is the name of the put*Ref-method of this parameter - */ - public String getVariantPutMethod() { - if (getObjectType().equals("java.util.Date")) { - return "putDateRef"; - } else { - return "put" + getObjectType() + "Ref"; - } - } - - /** - * Returns the name for the to*-method for this parameter as it is used - * by the Variant-variable which is necessary for calls with out-parameters. - * @return a String which is the name of the to*-method of this parameter - */ - public String getVariantGetMethod() { - if (getObjectType().equals("java.util.Date")) { - return "toJavaDate"; - } else { - return "to" + getObjectType(); - } - } - - /** - * Returns the type for the parameter as an array. - * @return a String which is the type of this parameter as an array - */ - public String getArrayType() { - return this.type + "[]"; - } - - /** - * Returns the type for this parameter. Also if non-basetypes are - * requested it returns ab basetye if it is a pure input parameter. - * @return a String which is the type of this parameter - */ - public String getType(boolean baseType) { - if ( baseType || (direction == DIRECTION_IN) ) { - return getType(); - } else { - return getArrayType(); - } - } - - public String getType() { - return type; - } - - private String getObjectType() { - return objectType; - } - - public String getNativeType() { - return nativeType; - } - - public int getDirection() { - return direction; - } - - public boolean isOptional() { - return optional; - } - - public boolean isObject() { - return object; - } - - public boolean isCustomType() { - return customType; - } - - - /** - * Return the method required to pass this parameter to the Dispatch - * call method. - */ - protected String getParameterCallingCode() { - String result = name; - String paramName = name; - - if( ClassGenerator.checkForJavaKeywords( name ) ) - paramName = "p_" + name; - - result = Jacobgen.getInstance().getExternalClass(paramName)==null ? - paramName : Jacobgen.getInstance().getExternalClass(paramName); - - if( nativeType.equals("VT_EMPTY") ) //Pending - result = ""; - else if( nativeType.equals("VT_NULL") ) //Pending - result = ""; - else if( nativeType.equals("VT_I2") ) - result = "new Variant(" + paramName + ")"; - else if( nativeType.equals("VT_I4") || nativeType.equals("VT_INT") ) - result = "new Variant(" + paramName + ")"; - else if( nativeType.equals("VT_R4") ) - result = "new Variant(" + paramName + ")"; - else if( nativeType.equals("VT_R8") ) - result = "new Variant(" + paramName + ")"; - else if( nativeType.equals("VT_CY") ) //Currency - result = "new Variant(" + paramName + ")"; - else if( nativeType.equals("VT_DATE") ) - result = "new Variant(" + paramName + ")"; - else if( nativeType.equals("VT_BSTR") ) - result = paramName; - else if( nativeType.equals("VT_DISPATCH") ) - result = paramName; - else if( nativeType.equals("VT_ERROR") ) - result = "new Variant(" + paramName + ")"; - else if( nativeType.equals("VT_BOOL") ) - result = "new Variant(" + paramName + ")"; - else if( nativeType.equals("VT_HRESULT") ) - result = "new Variant(" + paramName + ")"; - - //For variant use class type - //else if( nativeType.equals("VT_VARIANT") ) - - //JACOB wrapper ADO.Field.getDataFormat() maps UNKNOWN as Variant. - //I hope it is correct - else if( nativeType.equals("VT_UNKNOWN") ) - result = paramName; - else if( nativeType.equals("VT_UI1") ) //Pending - result = "new Variant(" + paramName + ")"; - - //Simple Enums - if( Jacobgen.getInstance().isEnum(nativeType) ) - result = "new Variant(" + paramName + ")"; - - //RGB VB Internal type - if( nativeType.equals( "MsoRGBType" ) ) - result = "new Variant(" + paramName + ")"; - - return result; - } - - protected void computeCustomType() { - customType = true; - if( type.trim().length() == 0 ) - customType = false; - else - for( int i=0; i 0 ) { - buf = dll.queryInterface( argv[0] ); - - for( int i=0; i"); - } - -} diff --git a/jacobgen/unittest/README.txt b/jacobgen/unittest/README.txt deleted file mode 100644 index f8ff79d..0000000 --- a/jacobgen/unittest/README.txt +++ /dev/null @@ -1 +0,0 @@ -This file exists to make sure this directory hangs around until there are actual sample files to put in the unittest directory \ No newline at end of file