From 9163dff54aeb2596b380d6544f1e8faf9e00b199 Mon Sep 17 00:00:00 2001 From: Pat Thoyts Date: Fri, 13 Jun 2008 17:30:39 +0100 Subject: [PATCH] optcl-3010 import --- GNU_Public_Licence.html | 525 ------------- Images/class.gif | Bin 0 -> 190 bytes Images/copy.gif | Bin 0 -> 384 bytes Images/dispatch.gif | Bin 0 -> 81 bytes Images/down.xbm | 6 + Images/enum.gif | Bin 0 -> 117 bytes Images/find.gif | Bin 0 -> 101 bytes Images/find.xbm | 9 + Images/hide.xbm | 9 + Images/interface.gif | Bin 0 -> 99 bytes Images/libselect.gif | Bin 0 -> 99 bytes Images/libselect.xbm | 9 + Images/method.gif | Bin 0 -> 370 bytes Images/module.gif | Bin 0 -> 178 bytes Images/noselect.gif | Bin 0 -> 78 bytes Images/property.gif | Bin 0 -> 376 bytes Images/right.xbm | 6 + Images/select.gif | Bin 0 -> 108 bytes Images/show.xbm | 9 + Images/struct.gif | Bin 0 -> 181 bytes Images/typedef.gif | Bin 0 -> 107 bytes Images/union.gif | Bin 0 -> 138 bytes ReadMe.txt | 24 +- docs/optcl.html | 28 +- docs/optcltypelibaccess.html | 1 - docs/optcltypes.html | 7 +- install/optcl80.dll | Bin 204800 -> 0 bytes install/optcl_Install.tcl | 88 --- install/optclstubs.dll | Bin 745539 -> 0 bytes license.txt | 38 + src/ComRecordInfoImpl.cpp | 1162 ++++++++++++++++++++++++++++ src/ComRecordInfoImpl.h | 61 ++ src/EventBinding.cpp | 4 +- src/FixedSplitter.tcl | 24 + src/ImageListBox.tcl | 335 +++++++++ src/ObjMap.cpp | 54 +- src/ObjMap.h | 6 +- src/OptclBindPtr.h | 16 +- src/OptclObj.cpp | 340 +++++---- src/OptclObj.h | 27 +- src/Splitter.tcl | 574 ++++++++++++++ src/TLView.tcl | 1380 ++++++++++++++++++++++++++++++++++ src/Tooltip.tcl | 68 ++ src/Utilities.tcl | 43 ++ src/optcl.cpp | 9 +- src/optcl.dsp | 513 ++++++++++--- src/optcl.dsw | 29 + src/optcl.h | 2 +- src/optcl.tcl | 10 + src/resource.aps | Bin 50364 -> 0 bytes src/resource.h | 2 +- src/resource.rc | 13 +- src/test.tcl | 104 +-- src/typelib.cpp | 523 +++++++++---- src/typelib.h | 64 +- src/typelib.tcl | 747 ++++++------------ src/utility.cpp | 515 +++++++++++-- src/utility.h | 51 +- temp code/reg.tcl | 139 ++++ tests/calendar.tcl | 4 +- tests/pdf.tcl | 2 +- 61 files changed, 5801 insertions(+), 1779 deletions(-) delete mode 100644 GNU_Public_Licence.html create mode 100644 Images/class.gif create mode 100644 Images/copy.gif create mode 100644 Images/dispatch.gif create mode 100644 Images/down.xbm create mode 100644 Images/enum.gif create mode 100644 Images/find.gif create mode 100644 Images/find.xbm create mode 100644 Images/hide.xbm create mode 100644 Images/interface.gif create mode 100644 Images/libselect.gif create mode 100644 Images/libselect.xbm create mode 100644 Images/method.gif create mode 100644 Images/module.gif create mode 100644 Images/noselect.gif create mode 100644 Images/property.gif create mode 100644 Images/right.xbm create mode 100644 Images/select.gif create mode 100644 Images/show.xbm create mode 100644 Images/struct.gif create mode 100644 Images/typedef.gif create mode 100644 Images/union.gif delete mode 100644 install/optcl80.dll delete mode 100644 install/optcl_Install.tcl delete mode 100644 install/optclstubs.dll create mode 100644 license.txt create mode 100644 src/ComRecordInfoImpl.cpp create mode 100644 src/ComRecordInfoImpl.h create mode 100644 src/FixedSplitter.tcl create mode 100644 src/ImageListBox.tcl create mode 100644 src/Splitter.tcl create mode 100644 src/TLView.tcl create mode 100644 src/Tooltip.tcl create mode 100644 src/Utilities.tcl create mode 100644 src/optcl.dsw create mode 100644 src/optcl.tcl delete mode 100644 src/resource.aps create mode 100644 temp code/reg.tcl diff --git a/GNU_Public_Licence.html b/GNU_Public_Licence.html deleted file mode 100644 index ee2d7f1..0000000 --- a/GNU_Public_Licence.html +++ /dev/null @@ -1,525 +0,0 @@ - - - -GNU General Public License - GNU Project - Free Software Foundation (FSF) - - - -

GNU General Public License

- - -

- -


- -

- -

Table of Contents

- - -

- -


- -

- - - -

GNU GENERAL PUBLIC LICENSE

-

-Version 2, June 1991 - -

- -
-Copyright (C) 1989, 1991 Free Software Foundation, Inc.  
-59 Temple Place - Suite 330, Boston, MA  02111-1307, 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. - -

- - -

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: -

- -

- -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: - - - - -

- -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. -

- -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. -

- -4. - You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - -

- -5. - You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - -

- -6. - Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - -

- -7. - If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. -

- -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. -

- -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. -

- -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - -

- -8. - If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - -

- -9. - The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. -

- -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - -

- - -10. - If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - - -

NO WARRANTY

- -

- -11. - BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - -

- -12. - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - -

- - -

END OF TERMS AND CONDITIONS

- - - -

How to Apply These Terms to Your New Programs

- -

- If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - -

-

- To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - -

- -
-one line to give the program's name and an idea of what it does.
-Copyright (C) yyyy  name of author
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, 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) yyyy name of author
-Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
-type `show w'.  This is free software, and you are welcome
-to redistribute it under certain conditions; type `show c' 
-for details.
-
- -

-The hypothetical commands `show w' and `show c' should show -the appropriate parts of the General Public License. Of course, the -commands you use may be called something other than `show w' and -`show c'; they could even be mouse-clicks or menu items--whatever -suits your program. - -

-

-You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - -

- -
-Yoyodyne, Inc., hereby disclaims all copyright
-interest in the program `Gnomovision'
-(which makes passes at compilers) written 
-by James Hacker.
-
-signature of Ty Coon, 1 April 1989
-Ty Coon, President of Vice
-
- -

-This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. - -


- -Return to GNU's home page. -

-FSF & GNU inquiries & questions to -gnu@gnu.org. -Other ways to contact the FSF. -

-Comments on these web pages to -webmasters@www.gnu.org, -send other questions to -gnu@gnu.org. -

-Copyright notice above.
-Free Software Foundation, Inc., -59 Temple Place - Suite 330, Boston, MA 02111, USA -

-Updated: - -16 Feb 1998 tower - -


- - diff --git a/Images/class.gif b/Images/class.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b9ab9e00f0bf018ef5f046d3e38721254bf7fec GIT binary patch literal 190 zcmZ?wbhEHb6l4%&c+3C-|8Hjee_Zzen9u(k>HjbITwNUU|Gdxthb32Md-YAZ_-Tvl zmmO~ZH#z<`}_R;_xbzt_WAw&{{H^{`uqI$`1+;~}@Z9F^*yHT)^Y`lT_2%vK;_C6;=I`6(?(p>Y z-skVt;p@`h>d)Nh%h~3~*5v5!^yBOD-{|n$(buo&D-b7+2+pN=*89K!P4Qq z(BQev-nPoz)ZpsI*5ty|;=a(}(B0|C*X6|2_CX>@2HRA^-&M@dak03rDV0SW*=04x9i000pH5dZ)NgutJ0 zNGuuw$fS{o3^)UTr4Rsx0t89rG&vv?nodJ>dO#!;O)7FR{s9(@h9hf^w*ilApo<1T z?hz6b6aZco78e*9cN$q6NgMzjcOD-gApjyHBqb&%D0eAY5=klmD|aj{E-wHSFqSbg eGj~}4G)c6rQUEnJH#j*uJ8ea_SyIVDK>$0aW7{kM literal 0 HcmV?d00001 diff --git a/Images/dispatch.gif b/Images/dispatch.gif new file mode 100644 index 0000000000000000000000000000000000000000..3f6fe400a4266b834354a7b664eaf671b08cb37d GIT binary patch literal 81 zcmZ?wbhEHb6l4%&SjfO|(aDK{f#E+GDE?$&z>% literal 0 HcmV?d00001 diff --git a/Images/down.xbm b/Images/down.xbm new file mode 100644 index 0000000..c867fce --- /dev/null +++ b/Images/down.xbm @@ -0,0 +1,6 @@ +/* Created with The GIMP */ +#define C__Program_Files_Tcl_lib_width 12 +#define C__Program_Files_Tcl_lib_height 12 +static unsigned char C__Program_Files_Tcl_lib_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xc0, 0x00, 0xe0, 0x00, 0xf0, 0x00, + 0xe0, 0x00, 0xc0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; diff --git a/Images/enum.gif b/Images/enum.gif new file mode 100644 index 0000000000000000000000000000000000000000..7e48ce067522f0450d91c33db4f835fbc49ca4a5 GIT binary patch literal 117 zcmZ?wbhEHb6l4%&SjYeZ_V#D~gMs2dQRkx6#FEq$h4Rdj426)4R0VfW-v9>1pDc`A z3``6qt<}WF^{x%c_utF6_Gq9Az&CbKF1D^Ii4%OxoIu!rw; xx^$~ymLE!Y!L&4H301yCk6lj literal 0 HcmV?d00001 diff --git a/Images/find.xbm b/Images/find.xbm new file mode 100644 index 0000000..03267a1 --- /dev/null +++ b/Images/find.xbm @@ -0,0 +1,9 @@ +/* Created with The GIMP */ +#define C__Program_Files_Tcl_lib_width 17 +#define C__Program_Files_Tcl_lib_height 18 +static unsigned char C__Program_Files_Tcl_lib_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x50, 0x1c, 0x00, + 0x50, 0x1c, 0x00, 0x70, 0x1c, 0x00, 0xf8, 0x3e, 0x00, 0xe8, 0x3a, 0x00, + 0xfc, 0x7f, 0x00, 0x7e, 0xfb, 0x00, 0x7e, 0xfb, 0x00, 0xfe, 0xfb, 0x00, + 0xfe, 0xfe, 0x00, 0x3a, 0xe8, 0x00, 0x3a, 0xe8, 0x00, 0x3e, 0xf8, 0x00, + 0x3e, 0xf8, 0x00, 0x00, 0x00, 0x00 }; diff --git a/Images/hide.xbm b/Images/hide.xbm new file mode 100644 index 0000000..11e2008 --- /dev/null +++ b/Images/hide.xbm @@ -0,0 +1,9 @@ +/* Created with The GIMP */ +#define C__Program_Files_Tcl_lib_width 17 +#define C__Program_Files_Tcl_lib_height 17 +static unsigned char C__Program_Files_Tcl_lib_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x01, 0x00, 0x40, 0x02, 0x00, 0x20, 0x04, 0x00, 0x10, 0x08, 0x00, + 0x80, 0x01, 0x00, 0x40, 0x02, 0x00, 0x20, 0x04, 0x00, 0x10, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00 }; diff --git a/Images/interface.gif b/Images/interface.gif new file mode 100644 index 0000000000000000000000000000000000000000..40548e67785b1ee74517aabd3cffc66945b28033 GIT binary patch literal 99 zcmZ?wbhEHb6l4%&SjYeZeN!&}2Lr`_qRvIBi6yBi3gww4844j8sS56%z5xu1KUo;L u7?>DzK*~WH8JMJ}^shYqmVa@~0yhC8huha?vEFXZoNl`G)v0Z)4AuaOL?Uqj literal 0 HcmV?d00001 diff --git a/Images/libselect.gif b/Images/libselect.gif new file mode 100644 index 0000000000000000000000000000000000000000..ded2e77b7c0aa27002dbe60244c6f3f2733588e0 GIT binary patch literal 99 zcmZ?wbhEHb6l4%&SjfO|O;C`5f#E+GDE+PFQpFVv% zxc6dRbx%v!t0?W*vE_6_UGJ`KXEv@mR#Mp7RNoI& zMhQ^-$->CRV9%h#00baEF|hR?m|x(bBh~Mrq@W-nFlm3&!v+rxw(bKP4`f)#^|7fa z&6MEf^*S1~&_qPsN3ftE#Aue!(TO(-tXvp5_{F5;q{R3+1mzW6m^jNSs%oSam0Xy) zGP85@#g$cDSeOOk5|RW}Rn%O$1-UpwxdhcUG~F15#H9tL#Z@(wwA_UyWaJeWY98^F PRZvHjbITwNUU|Gdxthb32Md-YAZ_-Tvl zmmO~ZH#z#j9d)-3_2j4ATt`SNs literal 0 HcmV?d00001 diff --git a/Images/noselect.gif b/Images/noselect.gif new file mode 100644 index 0000000000000000000000000000000000000000..9623a07a22471aea12d9c3d647ca153e358c2e17 GIT binary patch literal 78 zcmZ?wbhEHb6k*_EXkcKt21bhiM4gLL6H8K46v{J8G895GQWe}ieFGR2f3h%gF)%Xd bFaQBa3j-5RPyfo(Z}}I`*>dYO7lSnb5qlL= literal 0 HcmV?d00001 diff --git a/Images/property.gif b/Images/property.gif new file mode 100644 index 0000000000000000000000000000000000000000..1e0af13b7f9982e1b589fcdc87cab440b674c6b1 GIT binary patch literal 376 zcmZ?wbhEHb6l4%&SjxaKZA#CCzLu_z>W;Rm?#{YdGbc@*(ldQ(@AWGuFP=Ym^4PZ4 z=CZo#oc5OTnbZ3pJ-qSs$(`Fb&mB9wY4`TURb}Zd4aINYJp1(V?dcOc_U&G=Y2EbV z{Mi5h|KGfR`pn5)2llMoynaSWL0olZ=CTEC1vwGxS500#uQ@Z-f9uBCtCsf6pIMue z5xjl#ymc!lEt%hvogP$HlsIR4Ra%mFdXjH>NfOW~{6O(13nLeUJ%bJd5P3 z`~nXhseTV71qBI#N&A}~Hh5@=^&H#ypu$0JVoQqCN(o;6(?>r!BpA)|6)b3ou@Lt- z{+Y4W#f6b0Gdnk5N?FB)iBm8xAxT(OP2Gi=i<3h(luKSiQ%l>0gQeIM6Ls!|*$ccIv1rTmZYXAlxLP?D1>CBD!6<41~4f8 zWMSlDU}Df=00NLk1}2p$yeq3~xf_cGTNIu*i@&aoO#G&L*CWg8c+H`vt*KLY=+EV1 HWv~VS=Ds3n literal 0 HcmV?d00001 diff --git a/Images/show.xbm b/Images/show.xbm new file mode 100644 index 0000000..e9d8548 --- /dev/null +++ b/Images/show.xbm @@ -0,0 +1,9 @@ +/* Created with The GIMP */ +#define C__Program_Files_Tcl_lib_width 17 +#define C__Program_Files_Tcl_lib_height 17 +static unsigned char C__Program_Files_Tcl_lib_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x20, 0x04, 0x00, 0x40, 0x02, 0x00, + 0x80, 0x01, 0x00, 0x10, 0x08, 0x00, 0x20, 0x04, 0x00, 0x40, 0x02, 0x00, + 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00 }; diff --git a/Images/struct.gif b/Images/struct.gif new file mode 100644 index 0000000000000000000000000000000000000000..2b8c789cb70028097f9871fdfd3e832e37fd306b GIT binary patch literal 181 zcmZ?wbhEHb6l4%&c+3C-jkEvPO#K?0zrDEYadO#_xPl!~IUB>$R>tPRgnXSdyBeP@Y+mp%9Xhs^ISF8^ECWlZBCsfuBJKqzYs>1B>T}lb)+t zEnZ9S;%5qDywA?Vuyn2ZDj`>E9=F+k2O2kQ>zdXm*T*8_RWbACTMLg9Q@rH844Zcq ZG_&e=sm_u(z4*F_n6mDREhLV0FMhC)b2s)D{VPwuJ>S66Y?htE{m@5IL#DkU!KkcVa#7Yzr%yiDzxj$Y GSOWmA+9D(X literal 0 HcmV?d00001 diff --git a/Images/union.gif b/Images/union.gif new file mode 100644 index 0000000000000000000000000000000000000000..06e042f826d521450d1791dc6d6e324b420f1257 GIT binary patch literal 138 zcmZ?wbhEHb6l4%&SjYeZ|NsBL{Zs{r6#t1j7o{eaq^2m8XO?6rgk+>DxO@5rFev_H zVdP?9X3zmC2Wezra+=e>l5Ot|2M#4Y$t5d9G-O?`9#0K^>KJ%^!OMo7>6Z;fmM@Iv ldK2{iwrqyOMAk!Gy+RIm(oQb<88==1D`RoO_D&`SYXEgMG4}uf literal 0 HcmV?d00001 diff --git a/ReadMe.txt b/ReadMe.txt index 310352f..b2ead57 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,19 +1,27 @@ -OpTcl v3.0 build 04 + +OpTcl v3.0 build 10 ------------------- +PRE PRE ALPHA RELEASE (Friends and Family only) + +What's New +---------- +Areas with Bug Fixes: Reference counting, Query Interfacing, (in/)out parameters; -with optimisation. + +New Features: Can now call custom interfaces. Handles COM's record structures. Library browser has search and history facilities. OpTcl works with COM better than ever before! :-) Licencing --------- -Use of this software indicates an agreement to the GNU Public Licence under which, -this software is provided. +Ignore any references to LGPL. I hereby renounce this license for one which is in-line with the BSD license. Please read the enclosed license.txt for details. Documentation ------------- -Please open the default.html file in the 'docs' directory for installation instructions -and documentation. +This is a beta release so the docs aren't there yet ... I've included the old ones just for comparison. A lot of the previous functionality and syntax is identical. A few things however have changed dramatically. +To start things off try the following +package require optcl +tlview::viewlib .l +I welcome any comments, suggestions and bug reports. Enjoy! -I welcome any comments, suggestions and bug reports: +Farzad. fuzz@sys.uea.ac.uk - - diff --git a/docs/optcl.html b/docs/optcl.html index 206a2d5..a1b76dc 100644 --- a/docs/optcl.html +++ b/docs/optcl.html @@ -3,7 +3,7 @@ - + OpTcl Documentation @@ -18,12 +18,8 @@ Pezeshkpour

August 1999

-

This software is freely distributed under the GNU Public -Licence. I've include this in this distribution as an HTML file.

- -

Gosh! So much to document here, and so little time. This is a -preliminary, and rather informal document - a better version is -on its way!

+

This software is freely distributed under the GNU Lesser General Public License. I've include this in this distribution as an + HTML file.

The Distribution

@@ -33,9 +29,11 @@ the distribution:

- + @@ -49,7 +47,8 @@ the distribution:

+ Calendar Control. Need to put an example of scripting DirectX - should + nicely show off what OpTcl can really do! :-)
installHolds the installer script and two versions of the - DLL - one for Tcl 8.0.5 (no stubs), and one with stubs - enabled, built for Tcl 8.2 libraries.Holds the installer script and the debug and release versions of the + stubbed DLLs for Tcl8.2 and above. I also wanted to build a + distribution for Tcl8.0.5+ without stubs, but no matter were I + downloaded the Tcl installer from, it failed half way through the + installation.
docs
tests A couple of test scripts using MS Word, and the - Calendar Control.
@@ -69,15 +68,14 @@ is applied to that directory.

  • Distribute example files.
  • Implement array parameters.
  • Implement default parameter values.
  • -
  • Test out-flagged parameters (I haven't found a - server to do this, yet).
  • Implement in/out-flagged parameters for events.
  • Use Type Libraries on the type conversion of an event-handlers result.
  • Test with DCOM. (does anyone have a setup that can do this?)
  • Write an ActiveScripting engine interface.
  • -
  • In some cases perhaps, reconsider syntax.
  • +
  • Remove explicit reference counting - I can't do this until Scriptics + patch the Tcl core to enable 'precious' objects.
  • Known Bugs/Limitations

    @@ -87,6 +85,8 @@ is applied to that directory.

  • Can't set parameters by their name, à la Visual Basic.
  • Microsoft Forms ActiveX objects can't be fully in-place activated.
  • +
  • Lack of reference counting means that objects within records need to be + explicitly unlocked.
  • Credits

    diff --git a/docs/optcltypelibaccess.html b/docs/optcltypelibaccess.html index f83e0b8..7527b88 100644 --- a/docs/optcltypelibaccess.html +++ b/docs/optcltypelibaccess.html @@ -41,7 +41,6 @@ synopsis:

    libname
    typelib::typeinfo libname.type ?element?
    -
     

    Description

    diff --git a/docs/optcltypes.html b/docs/optcltypes.html index 55bcdb6..54dd225 100644 --- a/docs/optcltypes.html +++ b/docs/optcltypes.html @@ -27,10 +27,11 @@ accurrately described.

    allow for the accurate type conversion between Tcl objects and COM types, and b) speed up an invocation on an object.

    -

    Optcl is now type library aware - at least in terms of OpTcl is now type library aware - at least in terms of reading them and being type -sensitive in its invocations. I hope a future version will be -able to write out Type Libraries.

    +sensitive in its invocations. I have a test version that can write out new +libraries, and wrap Tcl scripts as fully-fledged ActiveX objects - more about +this later...

    In OpTcl, types are represented as a strings comprising of the programmatic name for a type library and its contained typename, diff --git a/install/optcl80.dll b/install/optcl80.dll deleted file mode 100644 index a45c51a768b58a4dc147d5d790f684f14e33e5d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204800 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

    uVMh4a5|;O&0It~II}lb(!p<<~vWG?G`7DuQ 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 z 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%0A0SNsnd;{4?qSCg**8HViAW?mdEg((k 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 f3P=T{0#X5~fK)&#AQg}bNCl(8;G0Ncv diff --git a/install/optcl_Install.tcl b/install/optcl_Install.tcl deleted file mode 100644 index 0b04ace..0000000 --- a/install/optcl_Install.tcl +++ /dev/null @@ -1,88 +0,0 @@ - -# OpTcl Installer -# Author: Fuzz -# fuzz@sys.uea.ac.uk - -package require registry - -set piccy ../docs/optcl_medium.gif - -set installfolder [file join [info library] .. optcl] -set installname optcl.dll - -puts "Install dir: $installfolder" -set version [info tclversion] - -if {$version < 8.0} { - tk_messageBox -message "Sorry, but OpTcl needs Tcl version 8.0.5" -type ok - exit -} elseif {$version < 8.1} { - set dll optcl80.dll -} elseif {$version < 9.0} { - set dll optclstubs.dll -} else { - tk_messageBox -message "Sorry, but OpTcl was compiled for Tcl major-version 8" -type ok -} - -image create photo optclim -file $piccy - -proc updategui {} { - global installfolder installname - if [file exists [file join $installfolder $installname]] { - .uninstall config -state normal - .install config -text "Re-install for Tcl[info tclversion]" - } else { - .uninstall config -state disabled - .install config -text "Install for Tcl[info tclversion]" - } -} - -proc install {} { - global installfolder installname dll - set answer [tk_messageBox -title {} -message "Okay to install $dll in $installfolder\nand register as OpTcl package?" -icon question -type yesno] - - switch $answer { - no {} - yes { - set bad [catch { - file mkdir $installfolder - file copy -force $dll [file join $installfolder $installname] - pkg_mkIndex -direct $installfolder - } err] - if {$bad} { - tk_messageBox -type ok -message "Error: $err" -icon error - } else { - tk_messageBox -type ok -message "OpTcl successfully installed." -icon info - } - exit - } - } -} - -proc uninstall {} { - global installfolder installname - set reply [tk_messageBox -type yesno -message "Delete package OpTcl located at $installfolder?" -icon question] - if {[string compare $reply yes] != 0} return - file delete [file join $installfolder $installname] [file join $installfolder pkgIndex.tcl] $installfolder - updategui -} - -wm title . "OpTcl Installer - F2 for console" -bind . {console show} -bind . {exit} - -label .im -image optclim -relief flat -bd 0 -button .install -text Install... -command install -width 16 -height 1 -bd 2 -font {arial 8 bold} -button .uninstall -text Uninstall -command uninstall -width 16 -height 1 -bd 2 -font {arial 8 bold} -button .quit -text Quit -command exit -bd 2 -font {arial 8 bold} -width 5 -height 1 - -grid .im -column 0 -row 0 -rowspan 2 -padx 2 -pady 2 -grid .install -column 1 -row 0 -padx 2 -pady 2 -sticky nsew -grid .uninstall -column 2 -row 0 -padx 2 -pady 2 -sticky nsew -grid .quit -column 1 -row 1 -columnspan 2 -padx 2 -pady 2 -sticky nsew - - -wm resizable . 0 0 -updategui -raise . -focus -force . diff --git a/install/optclstubs.dll b/install/optclstubs.dll deleted file mode 100644 index 516434b01076ebc7afea0f1189e12aa5a1d10100..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 745539 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 z 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�AinKfh{y_GycE&orrHTEN2| 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 F{1>?L{^$Sz diff --git a/license.txt b/license.txt new file mode 100644 index 0000000..363ea12 --- /dev/null +++ b/license.txt @@ -0,0 +1,38 @@ +This software is copyrighted by Farzad Pezeshkpour. +The following terms apply to all files associated with the software +unless explicitly disclaimed in individual files. + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. + +GOVERNMENT USE: If you are acquiring this software on behalf of the +U.S. government, the Government shall have only "Restricted Rights" +in the software and related documentation as defined in the Federal +Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you +are acquiring the software on behalf of the Department of Defense, the +software shall be classified as "Commercial Computer Software" and the +Government shall have only "Restricted Rights" as defined in Clause +252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the +authors grant the U.S. Government and others acting in its behalf +permission to use and distribute the software in accordance with the +terms specified in this license. diff --git a/src/ComRecordInfoImpl.cpp b/src/ComRecordInfoImpl.cpp new file mode 100644 index 0000000..d393911 --- /dev/null +++ b/src/ComRecordInfoImpl.cpp @@ -0,0 +1,1162 @@ + + +/* + *------------------------------------------------------------------------- + * ComRecordInfoImpl.cpp + * Implements an IRecordInfo, that unlike the one shipped by MS, isn't + * reliant on the presence of a GUID for any structure. + * Copyright (C) 2000 Farzad Pezeshkpour + * + * Email: fuzz@sys.uea.ac.uk + * Date: 6th April 2000 + * + * Licence: + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *------------------------------------------------------------------------- + */ + + + +#include "stdafx.h" +#include +#include +#include "ComRecordInfoImpl.h" + +/* + *------------------------------------------------------------------------- + * Class CComRecordInfoImpl -- + * Declaration of the class that implements the new IRecord Info. + *------------------------------------------------------------------------- + */ +class CComRecordInfoImpl : +public CComObjectRoot, public IRecordInfo +{ +public: + BEGIN_COM_MAP(CComRecordInfoImpl) + COM_INTERFACE_ENTRY(IRecordInfo) + END_COM_MAP() + + + CComRecordInfoImpl(); + virtual ~CComRecordInfoImpl(); + + HRESULT SetTypeInfo (ITypeInfo *pti); + void FinalRelease (); + + STDMETHOD(RecordInit)(PVOID pvNew); + STDMETHOD(RecordClear)(PVOID pvExisting); + STDMETHOD(RecordCopy)(PVOID pvExisting, PVOID pvNew); + STDMETHOD(GetGuid)(GUID *pguid); + STDMETHOD(GetName)(BSTR *pbstrName); + STDMETHOD(GetSize)(ULONG *pcbSize); + STDMETHOD(GetTypeInfo)(ITypeInfo * *ppTypeInfo); + STDMETHOD(GetField)(PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField); + STDMETHOD(GetFieldNoCopy)(PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField, PVOID *ppvDataCArray); + STDMETHOD(PutField)(ULONG wFlags, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField); + STDMETHOD(PutFieldNoCopy)(ULONG wFlags, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField); + STDMETHOD(GetFieldNames)(ULONG *pcNames, BSTR *rgBstrNames); + BOOL STDMETHODCALLTYPE IsMatchingType(IRecordInfo *pRecordInfo); + PVOID STDMETHODCALLTYPE RecordCreate(void); + STDMETHOD(RecordCreateCopy)(PVOID pvSource, PVOID *ppvDest); + STDMETHOD(RecordDestroy)(PVOID pvRecord); + +protected: + STDMETHODIMP GetFieldNoCopy(PVOID pvData, VARDESC *pvd, VARIANT *pvarField, PVOID *ppvDataCArray); + STDMETHODIMP PutFieldNoCopy(ULONG wFlags, PVOID pvData, VARDESC *pvd, VARIANT *pvarField); +protected: + void ReleaseTypeAttr (); + +protected: + CComPtr m_pti; // type info we're implementing + TYPEATTR * m_pta; // type attribute for the type + CComBSTR m_name; // name of the this record type +}; + + + +/* + *------------------------------------------------------------------------- + * Class: CVarDesc + * Implements a wrapper for the VARDESC data type, and its retrieval from + * an ITypeInfo interface pointer. + *------------------------------------------------------------------------- + */ +class CVarDesc { +protected: + CComPtr m_pti; // reference to the ITypeInfo parent of the VARDESC +public: + VARDESC * m_pvd; // the vardesc itself +public: + // constructor / destructor + CVarDesc () : m_pvd(NULL) {} + + virtual ~CVarDesc () { + Release(); + } + + + // operator overloads to make this object look more like a VARDESC... + + // pointer de-reference + VARDESC * operator-> () { + ATLASSERT (m_pvd != NULL); + return m_pvd; + } + + // castin operator + operator VARDESC* () { + ATLASSERT (m_pvd != NULL); + return m_pvd; + } + + /* + *------------------------------------------------------------------------- + * Release -- + * Releases the VARDESC if it has been allocated. + * Releases reference to the ITypeInfo. + * + * Result: + * None. + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ + void Release () { + if (m_pvd != NULL) { + ATLASSERT(m_pti != NULL); + m_pti->ReleaseVarDesc(m_pvd); + m_pti.Release(); + m_pvd = NULL; + } + } + + + /* + *------------------------------------------------------------------------- + * Set -- + * Sets the VARDESC based on an index into the ITypeInfo parameter. + * + * Result: + * S_OK iff succeeded. + * + * Side Effects: + * Any previous VARDESC is released. + *------------------------------------------------------------------------- + */ + HRESULT Set (ITypeInfo *pti, ULONG index) { + Release(); + m_pti = pti; + HRESULT hr; + hr = m_pti->GetVarDesc (index, &m_pvd); + return hr; + } + + + /* + *------------------------------------------------------------------------- + * Set -- + * Sets the VARDESC based on the variable name within the ITypeInfo parameter. + * + * Result: + * S_OK iff succeeded. + * + * Side Effects: + * Any previous VARDESC is released. + *------------------------------------------------------------------------- + */ + HRESULT Set (ITypeInfo *pti, LPCOLESTR name) { + CComPtr ptc; + HRESULT hr; + hr = pti->GetTypeComp (&ptc); + if (FAILED(hr)) + return hr; + CComPtr pti2; + DESCKIND dk; + BINDPTR bp; + hr = ptc->Bind ((LPOLESTR)name, 0, INVOKE_PROPERTYPUT | INVOKE_PROPERTYPUTREF, &pti2, &dk, &bp); + if (FAILED(hr)) + return hr; + if (dk != DESCKIND_VARDESC) { + ReleaseBindPtr(dk, bp); + return E_FAIL; + } else { + Release(); + m_pvd = bp.lpvardesc; + m_pti = pti; + return S_OK; + } + } + + +private: + /* + *------------------------------------------------------------------------- + * ReleaseBindPtr -- + * Releases the bind ptr according to its type. + * + * Result: + * None. + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ + void ReleaseBindPtr (DESCKIND dk, BINDPTR bp) { + if (bp.lptcomp == NULL) + return; + + switch (dk) { + case DESCKIND_FUNCDESC: + m_pti->ReleaseFuncDesc(bp.lpfuncdesc); + break; + case DESCKIND_TYPECOMP: + bp.lptcomp->Release(); + break; + default: + ATLASSERT(FALSE); + break; + } + } +}; + + +//------------------ IRecordInfo Implementation --------------------------- + + +/* + *------------------------------------------------------------------------- + * GetRecordInfoFromTypeInfo2 -- + * Creates a valid IRecordInfo interface for the give ITypeInfo interface. + * The only criteria is that the type info must be of the type TKIND_RECORD + * The type info does not have to provide a GUID. + * + * Result: + * S_OK iff successful. + * + * Side Effects: + * A CComRecordInfo object is created on the heap. + * + *------------------------------------------------------------------------- + */ +HRESULT GetRecordInfoFromTypeInfo2 (ITypeInfo *pti, IRecordInfo **ppri) +{ + ATLASSERT (pti != NULL && ppri != NULL); + CComObject *pri = NULL; + CComPtr ptmpri; + HRESULT hr = CComObject::CreateInstance (&pri); + if (FAILED (hr)) + return hr; + hr = pri->QueryInterface (&ptmpri); + if (FAILED(hr)) + return hr; + hr = pri->SetTypeInfo (pti); + if (FAILED (hr)) + return hr; + return ptmpri.CopyTo(ppri); +} + + + + + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CComRecordInfoImpl::CComRecordInfoImpl() : m_pta(NULL) +{ + +} + +CComRecordInfoImpl::~CComRecordInfoImpl() +{ + +} + +/* + *------------------------------------------------------------------------- + * FinalRelease -- + * Called by the ATL framework when the object is about to be destroyed. + * + * Result: + * None. + * + * Side Effects: + * Releases the TYPEATTR for this Record Info. + *------------------------------------------------------------------------- + */ +void CComRecordInfoImpl::FinalRelease () { + ReleaseTypeAttr(); +} + + +/* + *------------------------------------------------------------------------- + * SetTypeInfo -- + * Sets the current TypeInfo that this RecordInfo is implementing. + * + * Result: + * S_OK iff successful. + * + * Side Effects: + * Releases any previous type info reference and attributes. + * + *------------------------------------------------------------------------- + */ +HRESULT CComRecordInfoImpl::SetTypeInfo (ITypeInfo *pti) +{ + TYPEATTR *pta = NULL; + // retrieve the type attribute for the + try { + if (FAILED(pti->GetTypeAttr(&pta))) + throw false; + if (pta->typekind != TKIND_RECORD) + throw false; + ReleaseTypeAttr(); + m_pti = pti; + m_pta = pta; + pti->GetDocumentation(-1, &m_name, NULL, NULL, NULL); + return S_OK; + } catch (...) { + if (pta != NULL) + pti->ReleaseTypeAttr(pta); + return E_INVALIDARG; + } +} + +/* + *------------------------------------------------------------------------- + * ReleaseTypeAttr -- + * Releases the TYPEATTR if any. + * + * Result: + * None. + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ +void CComRecordInfoImpl::ReleaseTypeAttr () +{ + ATLASSERT (m_pta == NULL || m_pti != NULL); + + if (m_pta != NULL && m_pti != NULL) { + m_pti->ReleaseTypeAttr(m_pta); + m_pta = NULL; + } +} + + + + + + +/* + *------------------------------------------------------------------------- + * RecordInit -- + * Initiliases the contents of a created record structure. All existing + * values are ignored. + * + * Result: + * S_OK iff successfull. + * + * Side Effects: + * None. + * + *------------------------------------------------------------------------- + */ +STDMETHODIMP CComRecordInfoImpl::RecordInit(PVOID pvNew) +{ + HRESULT hr; + for (WORD iVar = 0; iVar < m_pta->cVars; iVar++) { + + CVarDesc vd; + PVOID pvField; + CComPtr pRefInfo; + CComPtr pRefRecInfo; + + + hr = vd.Set(m_pti, iVar); + if (FAILED(hr)) + return hr; + ATLASSERT ( (vd->elemdescVar.tdesc.vt & VT_BYREF) == NULL); + + + pvField = (BYTE*)pvNew + vd->oInst; + + + switch (vd->elemdescVar.tdesc.vt) { + case VT_USERDEFINED: + hr = m_pti->GetRefTypeInfo(vd->elemdescVar.tdesc.hreftype, &pRefInfo); + if (FAILED(hr)) return hr; + + hr = GetRecordInfoFromTypeInfo2 (pRefInfo, &pRefRecInfo); + if (FAILED(hr)) return hr; + + hr = pRefRecInfo->RecordInit(pvField); + if (FAILED(hr)) + return hr; + break; + + case VT_BSTR: + // is this correct? + *((BSTR*)pvField) = SysAllocString (L""); + break; + + case VT_DATE: + *((DATE*)pvField) = 0; + break; + + case VT_CY: + ((CY*)pvField)->int64 = 0; + break; + + // generic 8bit data types + case VT_I1: + case VT_UI1: + *((BYTE*)pvField) = 0; + break; + + // generic 16bit data types + case VT_I2: + case VT_UI2: + *((SHORT*)pvField) = 0; + break; + + // generic 32 bit data types + case VT_I4: + case VT_UI4: + case VT_R4: + case VT_UNKNOWN: + case VT_DISPATCH: + case VT_ERROR: + *((ULONG*)pvField) = 0; + break; + + // platform specific: INT + case VT_INT: + case VT_UINT: + *((INT*)pvField) = 0; + break; + + // boolean + case VT_BOOL: + *((VARIANT_BOOL*)pvField) = VARIANT_FALSE; + break; + + // double + case VT_R8: + *((DOUBLE*)pvField) = double(0); + break; + + default: + // is it an array? + if (vd->elemdescVar.tdesc.vt & VT_ARRAY) { + *((SAFEARRAY**)pvField) = NULL; + } + } + + } + return S_OK; +} + + + + +/* + *------------------------------------------------------------------------- + * CComRecordInfoImpl::RecordClear -- + * Iterates through the existing record, clearing all referenced resources, + * and setting to zero. + * + * Result: + * Standard COM result. + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CComRecordInfoImpl::RecordClear(PVOID pvExisting) +{ + HRESULT hr; + for (WORD iVar = 0; iVar < m_pta->cVars; iVar++) { + + CVarDesc vd; + PVOID pvField; + CComPtr pRefInfo; + CComPtr pRefRecInfo; + + + hr = vd.Set(m_pti, iVar); + if (FAILED(hr)) + return hr; + ATLASSERT ( (vd->elemdescVar.tdesc.vt & VT_BYREF) == NULL); + + pvField = (BYTE*)pvExisting + vd->oInst; + + if (vd->elemdescVar.tdesc.vt & VT_ARRAY) { + SafeArrayDestroy (*((SAFEARRAY**)pvField)); + *((SAFEARRAY**)pvField) = NULL; + } else { + switch (vd->elemdescVar.tdesc.vt) { + case VT_USERDEFINED: + hr = m_pti->GetRefTypeInfo(vd->elemdescVar.tdesc.hreftype, &pRefInfo); + if (FAILED(hr)) return hr; + + hr = GetRecordInfoFromTypeInfo2 (pRefInfo, &pRefRecInfo); + if (FAILED(hr)) return hr; + + hr = pRefRecInfo->RecordClear(pvField); + if (FAILED(hr)) + return hr; + break; + /* strings */ + case VT_BSTR: + SysFreeString(*( (BSTR*)pvField )); + *( (BSTR*)pvField ) = NULL; + break; + /* interface types */ + case VT_DISPATCH: + case VT_UNKNOWN: + (*((IUnknown**)pvField))->Release(); + (*((IUnknown**)pvField)) = NULL; + break; + } + } + } + return S_OK; +} + + +/* + *------------------------------------------------------------------------- + * CComRecordInfoImpl::RecordCopy -- + * Makes a copy of the existing record to the new record. + * + * Result: + * Standard COM result. + * + * Side Effects: + * Performs a deep copy on all references. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CComRecordInfoImpl::RecordCopy(PVOID pvExisting, PVOID pvNew) +{ + HRESULT hr; + for (WORD iVar = 0; iVar < m_pta->cVars; iVar++) { + PVOID pvSrc, pvDst; + CVarDesc vd; + CComPtr refInfo; + CComPtr refrecInfo; + + hr = vd.Set (m_pti, iVar); + if (FAILED(hr)) return hr; + + pvSrc = (BYTE*)pvExisting + vd->oInst; + pvDst = (BYTE*)pvNew + vd->oInst; + + ATLASSERT ( (vd->elemdescVar.tdesc.vt & VT_BYREF) == 0); + if (vd->elemdescVar.tdesc.vt & VT_ARRAY != 0) { + hr = SafeArrayCopyData (*((SAFEARRAY**)pvSrc), *((SAFEARRAY**)pvDst)); + if (FAILED(hr)) return hr; + } else { + switch (vd->elemdescVar.tdesc.vt) { + // interfaces ... + case VT_UNKNOWN: + case VT_DISPATCH: + *((IUnknown**)pvDst) = *((IUnknown**)pvSrc); + (*((IUnknown**)pvDst))->AddRef(); + break; + // string + case VT_BSTR: + *((BSTR*)pvDst) = SysAllocString (*((BSTR*)pvSrc)); + break; + // 8 bit copy + case VT_I1: + case VT_UI1: + *((BYTE*)pvDst) = *((BYTE*)pvSrc); + break; + // 16 bit copy + case VT_I2: + case VT_UI2: + *((SHORT*)pvDst) = *((SHORT*)pvSrc); + break; + // 32 bit copy + case VT_I4: + case VT_UI4: + case VT_R4: + case VT_ERROR: + *((ULONG*)pvDst) = *((ULONG*)pvSrc); + break; + // doubles (64 bit) + case VT_R8: + *((DOUBLE*)pvDst) = *((DOUBLE*)pvSrc); + break; + // currency + case VT_CY: + *((CY*)pvDst) = *((CY*)pvSrc); + break; + // date + case VT_DATE: + *((DATE*)pvDst) = *((DATE*)pvSrc); + break; + // boolean + case VT_BOOL: + *((VARIANT_BOOL*)pvDst) = *((VARIANT_BOOL*)pvSrc); + break; + // decimal + case VT_DECIMAL: + *((DECIMAL*)pvDst) = *((DECIMAL*)pvSrc); + break; + // TypeLib defined + case VT_USERDEFINED: + hr = m_pti->GetRefTypeInfo(vd->elemdescVar.tdesc.hreftype, &refInfo); + if (FAILED(hr)) return hr; + hr = GetRecordInfoFromTypeInfo2 (m_pti, &refrecInfo); + if (FAILED(hr)) return hr; + hr = refrecInfo->RecordCopy (pvSrc, pvDst); + if (FAILED(hr)) return hr; + break; + default: + break; + } + } + } + return S_OK; +} + + +/* + *------------------------------------------------------------------------- + * CComRecordInfoImpl::GetGuid -- + * Retrieve GUID of struct. Can possibly be IID_NULL. + * + * Result: + * S_OK + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CComRecordInfoImpl::GetGuid(GUID *pguid) +{ + *pguid = m_pta->guid; + return S_OK; +} + + +/* + *------------------------------------------------------------------------- + * CComRecordInfoImpl::GetName -- + * Retrieve the name of the structure. + * + * Result: + * S_OK; + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CComRecordInfoImpl::GetName(BSTR *pbstrName) +{ + *pbstrName = m_name.Copy(); + return (pbstrName!=NULL?S_OK:E_FAIL); +} + + +/* + *------------------------------------------------------------------------- + * CComRecordInfoImpl::GetSize -- + * Retrieve the size, in bytes of the structure. + * + * Result: + * None. + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CComRecordInfoImpl::GetSize(ULONG *pcbSize) +{ + ATLASSERT (m_pta != NULL); + *pcbSize = m_pta->cbSizeInstance; + return S_OK; +} + + +/* + *------------------------------------------------------------------------- + * CComRecordInfoImpl::GetTypeInfo -- + * Retrieve ITypeInfo for this structure. + * + * Result: + * S_OK iff all ok. + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CComRecordInfoImpl::GetTypeInfo(ITypeInfo **ppTypeInfo) +{ + ATLASSERT(m_pti != NULL); + return m_pti.CopyTo(ppTypeInfo); +} + + +/* + *------------------------------------------------------------------------- + * CComRecordInfoImpl::GetField -- + * Retrieve the value of a given field within a structure of this type + * The value of the field is returned as a copy of the original. + * Result: + * + * Side Effects: + * + *------------------------------------------------------------------------- + */ +STDMETHODIMP CComRecordInfoImpl::GetField(PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField) +{ + VARIANT refVar; + PVOID pvFieldData; + HRESULT hr; + + VariantInit (&refVar); + VariantClear(pvarField); + + hr = GetFieldNoCopy (pvData, szFieldName, &refVar, &pvFieldData); + if (FAILED(hr)) + return hr; + hr = VariantCopyInd(pvarField, &refVar); + return hr; +} + + +/* + *------------------------------------------------------------------------- + * CComRecordInfoImpl::GetFieldNoCopy -- + * Retrieve a direct reference to the field's value using a VARDESC to identify the + * field. The caller must not free the returned variant. + * + * Result: + * S_OK iff ok. + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CComRecordInfoImpl::GetFieldNoCopy(PVOID pvData, VARDESC *pvd, VARIANT *pvarField, PVOID *ppvDataCArray) { + HRESULT hr; + hr = VariantClear (pvarField); + if (FAILED(hr)) return hr; + + // retrieve a pointer to the field data + PVOID pfield; + pfield = ( ((BYTE*)pvData) + pvd->oInst); + *ppvDataCArray = pfield; + + // now crack the field type ... + + // first some assertions ... + // not by-reference (COM Automation / Variant Declaration rules) + ATLASSERT ( (pvd->elemdescVar.tdesc.vt & VT_BYREF) == 0); + + if (pvd->elemdescVar.tdesc.vt == VT_USERDEFINED) { + // resolve the referenced type + CComPtr pRefInfo; + CComPtr pRefRecInfo; + hr = m_pti->GetRefTypeInfo (pvd->elemdescVar.tdesc.hreftype, &pRefInfo); + if (FAILED(hr)) + return hr; + hr = GetRecordInfoFromTypeInfo2 (pRefInfo, &pRefRecInfo); + if (FAILED(hr)) + return hr; + + // set the field reference and its record info + pvarField->pvRecord = pfield; + hr = pRefRecInfo.CopyTo(&(pvarField->pRecInfo)); + if (FAILED(hr)) + return hr; + pvarField->vt = VT_RECORD; + } else { + // in all other cases, we just set the pointer to the field member + pvarField->byref = pfield; + // the vartype of the resulting parameter will be a reference to the type of the field + pvarField->vt = (pvd->elemdescVar.tdesc.vt | VT_BYREF); + } + return S_OK; + +} + + +/* + *------------------------------------------------------------------------- + * CComRecordInfoImpl::GetFieldNoCopy -- + * Retrieve the value of a field as a reference, given the name of the field. + * + * Result: + * S_OK iff ok. + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CComRecordInfoImpl::GetFieldNoCopy(PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField, PVOID *ppvDataCArray) +{ + HRESULT hr; + CVarDesc vd; + + hr = vd.Set(m_pti, szFieldName); + if (FAILED(hr)) return hr; + + hr = VariantClear (pvarField); + if (FAILED(hr)) return hr; + return GetFieldNoCopy (pvData, vd, pvarField, ppvDataCArray); +} + + +/* + *------------------------------------------------------------------------- + * CComRecordInfoImpl::PutField -- + * Places a copy of the variant to the field, applying any type coercion + * as required. Rules for INVOKE_PROPERTYPUT are handled at a deeper + * level of call. + * + * Result: + * S_OK iff all ok. + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CComRecordInfoImpl::PutField(ULONG wFlags, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField) +{ + CVarDesc vd; + HRESULT hr; + hr = vd.Set(m_pti, szFieldName); + if (FAILED(hr)) return hr; + + VARIANT varCopy; + VariantInit (&varCopy); + hr = VariantCopy (&varCopy, pvarField); + if (FAILED(hr)) return hr; + return PutFieldNoCopy (wFlags, pvData, vd, &varCopy); +} + +/* + *------------------------------------------------------------------------- + * CComRecordInfoImpl::PutFieldNoCopy -- + * Given the VARDESC for a field, this function places the value in + * pvarField to the field, without allocating any new resources. + * I'm not too sure about the INVOKE_PROPERTYPUT implementation + * which I've tried to follow from the MSDN documentation. As + * far as I can make out, the field must be of type VT_DISPATCH + * (or do I have to explicitly check for derivation from IDispatch?) + * The value is either of type VT_DISPATCH (in which case it's default + * property is used as the actual value), or any other valid variant + * sub-type. The actual value will be set to the default property of + * the field. + * + * Result: + * Standard COM result - S_OK iff all OK. + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CComRecordInfoImpl::PutFieldNoCopy(ULONG wFlags, PVOID pvData, VARDESC *pvd, VARIANT *pvarField) +{ + PVOID field = (BYTE*)pvData + pvd->oInst; + HRESULT hr; + + // perform the conversion ... + + if (wFlags == INVOKE_PROPERTYPUT) { + + // if the field isn't a dispatch object or is null then we fail + if (pvd->elemdescVar.tdesc.vt != VT_DISPATCH) + return E_FAIL; + + IDispatch * pdisp = *((IDispatch**)field); + if (pdisp == NULL) + return E_FAIL; + + CComVariant varResult; + DISPPARAMS dp; + DISPID dispidNamed = DISPID_PROPERTYPUT; + dp.cArgs = 1; + dp.cNamedArgs = 1; + dp.rgdispidNamedArgs = &dispidNamed; + dp.rgvarg = pvarField; + hr = pdisp->Invoke (DISPID_VALUE, IID_NULL, 0, DISPID_PROPERTYPUT, &dp, &varResult, NULL, NULL); + return hr; + } else { + // do a straight conversion + hr = VariantChangeType (pvarField, pvarField, NULL, pvd->elemdescVar.tdesc.vt); + if (FAILED(hr)) + return hr; + + // now perform a shallow copy + if (pvd->elemdescVar.tdesc.vt & VT_ARRAY != 0) { + *((SAFEARRAY**)field) = pvarField->parray; + } else { + switch (pvd->elemdescVar.tdesc.vt) { + // interfaces ... + case VT_UNKNOWN: + case VT_DISPATCH: + *((IUnknown**)field) = pvarField->punkVal; + break; + // string + case VT_BSTR: + *((BSTR*)field) = pvarField->bstrVal; + break; + // 8 bit copy + case VT_I1: + case VT_UI1: + *((BYTE*)field) = pvarField->bVal; + break; + // 16 bit copy + case VT_I2: + case VT_UI2: + *((SHORT*)field) = pvarField->iVal; + break; + // 32 bit copy + case VT_I4: + case VT_UI4: + case VT_R4: + case VT_ERROR: + *((ULONG*)field) = pvarField->ulVal; + break; + // doubles (64 bit) + case VT_R8: + *((DOUBLE*)field) = pvarField->dblVal; + break; + // currency + case VT_CY: + *((CY*)field) = pvarField->cyVal; + break; + // date + case VT_DATE: + *((DATE*)field) = pvarField->date; + break; + // boolean + case VT_BOOL: + *((VARIANT_BOOL*)field) = pvarField->boolVal; + break; + // decimal + case VT_DECIMAL: + *((DECIMAL*)field) = pvarField->decVal; + break; + // TypeLib defined + case VT_USERDEFINED: + *((PVOID*)field) = pvarField->pvRecord; + break; + default: + break; + } + } + return S_OK; + } + +} + + +/* + *------------------------------------------------------------------------- + * CComRecordInfoImpl::PutFieldNoCopy -- + * As the VARDESC variation above, but using the field name instead. + * + * Result: + * S_O iff all ok. + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CComRecordInfoImpl::PutFieldNoCopy(ULONG wFlags, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField) +{ + CVarDesc vd; + HRESULT hr; + hr = vd.Set(m_pti, szFieldName); + if (FAILED(hr)) return hr; + return PutFieldNoCopy (wFlags, pvData, vd, pvarField); +} + + +/* + *------------------------------------------------------------------------- + * CComRecordInfoImpl::GetFieldNames -- + * Retrieves an array of fields names. + * + * Result: + * S_OK iff all ok. + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CComRecordInfoImpl::GetFieldNames(ULONG *pcNames, BSTR *rgBstrNames) +{ + ULONG index = 0; + if (pcNames == NULL) + return E_INVALIDARG; + if (rgBstrNames == NULL) { + *pcNames = m_pta->cVars; + return S_OK; + } + + if (*pcNames > m_pta->cVars) + *pcNames = m_pta->cVars; + + try { + for (index = 0; index < *pcNames; index++) { + CVarDesc vd; + HRESULT hr; + hr = vd.Set (m_pti, index); + if (FAILED(hr)) + throw (hr); + + UINT dummy = 1; + hr = m_pti->GetNames (vd->memid, rgBstrNames+index, 1, &dummy); + if (FAILED(hr)) + throw(hr); + } + } catch (HRESULT hr) { + while (index > 0) + SysFreeString (rgBstrNames[--index]); + return hr; + } + return S_OK; +} + + +/* + *------------------------------------------------------------------------- + * CComRecordInfoImpl::IsMatchingType -- + * Checks for equivalence of this record type and the one referenced by + * the only parameter. Because we can't guarantee the use of GUIDs + * I've settled for matching on the type and library name. + * + * Result: + * TRUE iff the record structures match. + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ +BOOL STDMETHODCALLTYPE CComRecordInfoImpl::IsMatchingType(IRecordInfo *pRecordInfo) +{ + BOOL result = FALSE; + CComBSTR bstrOtherName; + HRESULT hr; + + hr = pRecordInfo->GetName(&bstrOtherName); + if (FAILED(hr)) return FALSE; + + if (wcscmp(bstrOtherName, m_name) == 0) { + CComPtr pOtherInfo; + CComPtr pOurLib, pOtherLib; + UINT dummy; + TLIBATTR * pOurAttr = NULL, *pOtherAttr = NULL; + + hr = pRecordInfo->GetTypeInfo(&pOtherInfo); + if (FAILED (hr)) return FALSE; + + hr = pOtherInfo->GetContainingTypeLib(&pOtherLib, &dummy); + if (FAILED(hr)) return FALSE; + + hr = m_pti->GetContainingTypeLib(&pOurLib, &dummy); + if (FAILED(hr)) return FALSE; + + hr = pOurLib->GetLibAttr (&pOurAttr); + hr = pOtherLib->GetLibAttr (&pOtherAttr); + if (pOurAttr != NULL && pOtherAttr != NULL) + result = (pOurAttr->guid == pOtherAttr->guid); + if (pOurAttr != NULL) + pOtherLib->ReleaseTLibAttr (pOurAttr); + if (pOtherAttr != NULL) + pOtherLib->ReleaseTLibAttr (pOtherAttr); + } + return result; +} + + +/* + *------------------------------------------------------------------------- + * STDMETHODCALLTYPE CComRecordInfoImpl::RecordCreate -- + * Allocates (using the task memory allocator) a new record, and + * initialises it. + * + * Result: + * Pointer to the record structure iff successfull; else NULL. + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ +PVOID STDMETHODCALLTYPE CComRecordInfoImpl::RecordCreate( void) +{ + PVOID prec = CoTaskMemAlloc(m_pta->cbSizeInstance); + if (FAILED(RecordInit(prec))) { + CoTaskMemFree(prec); + prec = NULL; + } + return prec; +} + + +/* + *------------------------------------------------------------------------- + * CComRecordInfoImpl::RecordCreateCopy -- + * Creates a copy of the passed record structure. + * + * Result: + * S_OK iff successfull. + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CComRecordInfoImpl::RecordCreateCopy(PVOID pvSource, PVOID *ppvDest) +{ + *ppvDest = RecordCreate(); + if (*ppvDest == NULL) + return E_FAIL; + return RecordCopy (pvSource, *ppvDest); +} + + +/* + *------------------------------------------------------------------------- + * CComRecordInfoImpl::RecordDestroy -- + * Clears the given record and releases the memory associated with it. + * + * Result: + * S_OK iff all OK. + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CComRecordInfoImpl::RecordDestroy(PVOID pvRecord) +{ + HRESULT hr; + if (pvRecord) { + hr = RecordClear(pvRecord); + CoTaskMemFree(pvRecord); + } + return hr; +} + diff --git a/src/ComRecordInfoImpl.h b/src/ComRecordInfoImpl.h new file mode 100644 index 0000000..78a3798 --- /dev/null +++ b/src/ComRecordInfoImpl.h @@ -0,0 +1,61 @@ + + +/* + *------------------------------------------------------------------------- + * ComRecordInfoImpl.h + * Declares a IRecordInfo, that unlike the one shipped by MS, isn't + * reliant on the presence of a GUID for any structure. + * + * Copyright (C) 2000 Farzad Pezeshkpour + * Email: fuzz@sys.uea.ac.uk + * Date: 6th April 2000 + * + * How-To: 1) Add both this file and ComRecordInfoImpl.cpp to your project + * 2) Include this file where-ever you wish to access a structure + * using IRecordInfo. + * 3) Call GetRecordInfoFromTypeInfo2 instead of + * GetRecordInfoFromTypeInfo to retrieve an IRecordInfo. + * Licence: + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + *------------------------------------------------------------------------- + */ + + + + +#if !defined(AFX_COMRECORDINFOIMPL_H__B3BDEDA0_FB84_11D3_9D8A_DFFCB467E034__INCLUDED_) +#define AFX_COMRECORDINFOIMPL_H__B3BDEDA0_FB84_11D3_9D8A_DFFCB467E034__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +/* + *------------------------------------------------------------------------- + * GetRecordInfoFromTypeInfo2 -- + * This is a replacement for GetRecordInfoFromTypeInfo. It returns an + * instance of the new IRecordInfo. + * + * Result: + * Standard COM result. S_OK iff all ok. + * + * Side Effects: + * Memory allocated for the new object implementing IRecordInfo. + *------------------------------------------------------------------------- + */ +HRESULT GetRecordInfoFromTypeInfo2 (ITypeInfo *pti, IRecordInfo **ppri); + +#endif // !defined(AFX_COMRECORDINFOIMPL_H__B3BDEDA0_FB84_11D3_9D8A_DFFCB467E034__INCLUDED_) diff --git a/src/EventBinding.cpp b/src/EventBinding.cpp index d8a12bd..af64f1a 100644 --- a/src/EventBinding.cpp +++ b/src/EventBinding.cpp @@ -537,7 +537,7 @@ int BindingProps::Eval (OptclObj *pObj, DISPPARAMS *pDispParams, LPVARIANT pVarR for (count = 0; count < pDispParams->cArgs; count++) { TObjPtr param; - if (!var2obj(m_pInterp, pDispParams->rgvarg[pDispParams->cArgs - count - 1], param, ppObjs+count)) + if (!var2obj(m_pInterp, pDispParams->rgvarg[pDispParams->cArgs - count - 1], NULL, param, ppObjs+count)) break; cmd.lappend(param, m_pInterp); } @@ -567,7 +567,7 @@ int BindingProps::Eval (OptclObj *pObj, DISPPARAMS *pDispParams, LPVARIANT pVarR if (result == TCL_ERROR) { - // do we have a exception storage + // do we have an exception storage if (pExcepInfo != NULL) { // fill it in diff --git a/src/FixedSplitter.tcl b/src/FixedSplitter.tcl new file mode 100644 index 0000000..6bed3ae --- /dev/null +++ b/src/FixedSplitter.tcl @@ -0,0 +1,24 @@ + +namespace eval FixedSplitter { + variable properties + proc _getState {w} { + uplevel { + variable properties + } + } + proc create {w args} { + _getState $w + + frame $w -width 200 -height 200 -relief sunken -bd 1 + + set properties($w-orient) horizontal + set properties($w-fixed) A + set properties($w-windowA) {} + set properties($w-windowB) {} + set properties($w-barwidth) 8 + set properties($w-fixedsize) 100 + + return $w + } + +} \ No newline at end of file diff --git a/src/ImageListBox.tcl b/src/ImageListBox.tcl new file mode 100644 index 0000000..3f3921f --- /dev/null +++ b/src/ImageListBox.tcl @@ -0,0 +1,335 @@ +proc ImageListBox {args} { + return [eval ImageListBox::create $args] +} + +namespace eval ImageListBox { + variable properties + array set properties {} + + proc _getState {w} { + uplevel {variable properties} + } + + proc create {w args} { + _getState $w + text $w -bd 0 -relief flat -width 30 -height 15 -state disabled -cursor arrow -wrap none + set properties($w-item) {} + set properties($w-nextId) 0 + set properties($w-active) 0 + set properties($w-anchor) 0 + set properties($w-selectmode) browse + set properties($w-uiselection) 0 + + $w tag configure ILB_Selection -background SystemHighlight -foreground SystemHighlightText + set font [$w cget -font] + $w tag configure ILB_Active -foreground red + + setBindings $w + rename ::$w [namespace current]::$w + proc ::$w {cmd args} "return \[eval [namespace current]::_dispatch $w \$cmd \$args\]" + + eval $w configure $args + return $w + } + + proc setBindings {w} { + foreach binding [bind Text] { + bind $w $binding "break;" + } + + foreach binding [bind Listbox] { + bind $w $binding "[bind Listbox $binding];break;" + } + + # special bindings + bind $w "[namespace current]::OnBeginUISelection $w; [bind Listbox ]; break;" + bind $w "[namespace current]::OnEndUISelection $w; [bind Listbox ]; break;" + return + } + + proc _dispatch {w cmd args} { + _getState $w + set cmds [info commands [namespace current]::$cmd*] + if {$cmds == {}} { + return [eval $w $cmd $args] + } else { + return [eval [lindex $cmds 0] $w $args] + } + } + + + + proc insert {w index args} { + _getState $w + + set bEnd [string match $index end] + if {!$bEnd} { + incr index + } else { + set index [expr int([$w index end])] + } + + $w config -state normal + foreach item $args { + $w image create $index.0 -align center -name _ILB_IMAGE_$properties($w-nextId) + $w insert $index.1 $item\n + $w tag add _ILB_TAG_$properties($w-nextId) $index.0 $index.end + + incr properties($w-nextId) + incr index + } + $w config -state disabled + } + + proc setimage {w index image} { + _getState $w + set index [index $w $index] + if {$index >= [index $w end]} { + set index [expr [index $w end] - 1] + } + set pos [expr $index + 1].0 + $w image configure $pos -image $image + } + + proc getimage {w index} { + _getState $w + set index [index $w $index] + set pos [expr $index + 1].0 + $w image cget $pos -image + } + + proc delete {w first {last {}} } { + _getState $w + + if {$last == {}} { + set last $first + } + set first [index $w $first] + set last [index $w $last] + + incr first + incr last 2 + $w config -state normal + $w delete $first.0 $last.0 + $w config -state disabled + } + + proc size {w} { + _getState $w + return [expr int([$w index end]) - 2] + } + + proc get {w first {last {}} } { + _getState $w + if {$last == {}} { + set last $first + } + set first [index $w $first] + set last [index $w $last] + if { [catch { + incr first + incr last + } ]} { + return {} + } + set result {} + while {$first <= $last} { + lappend result [$w get $first.0 $first.end] + incr first + } + return $result + } + + proc selection {w cmd args} { + _getState $w + switch -- $cmd { + clear { + eval _selectClear $w $args + } + includes { + eval _selectIncludes $w $args + } + set { + eval _selectSet $w $args + } + anchor { + eval _selectAnchor $w $args + } + default {error "unknown selection command: $cmd"} + } + } + + + proc _selectAnchor {w index} { + _getState $w + set properties($w-anchor) [index $w $index] + } + + proc _selectClear {w first {last {}} } { + + if {$last == {}} { + set last $first + } + set first [index $w $first] + set last [index $w $last] + + incr first; + incr last + + while {$first <= $last} { + $w tag remove ILB_Selection $first.0 [incr first].0 + } + } + + proc _selectSet {w args} { + _getState $w + $w tag remove ILB_Selection 1.0 end + + foreach index $args { + set index [index $w $index] + if {$index < [size $w]} { + $w tag add ILB_Selection [incr index].0 [incr index].0 + } + } + + if {!$properties($w-uiselection)} { + event generate $w <> + } + } + + + proc curselection {w} { + _getState $w + set index 0.0 + set result {} + while {[set range [$w tag nextrange ILB_Selection $index]] != {}} { + lappend result [expr int([lindex $range 0]) - 1] + set index [lindex $range 1] + } + return $result + } + + proc nearest {w y} { + set index [$w index @0,$y] + return [expr int($index) - 1] + } + + + proc see {w index} { + set index [index $w $index] + if {![string match $index end]} { + set index [expr $index + 1].0 + } + $w see $index + } + + proc index {w index} { + _getState $w + if {$index == {}} { + error "index can't be an empty string" + } + + switch -regexp -- $index { + {^(-)?[0-9]+$} {} + {^@(-)?[0-9]+,(-)?[0-9]+} { return [expr int([$w index $index]) - 1]} + active {return $properties($w-active)} + anchor {return $properties($w-anchor)} + end {return [size $w]} + default {error "unknown index value: $index"} + } + set size [size $w] + if {$index > $size} { + set index $size + } elseif {$index < 0} { + set index 0 + } + return $index + } + + proc activate {w index} { + _getState $w + set index [index $w $index] + set properties($w-active) $index + return + } + + proc bbox {w index} { + _getState $w + set index [index $w $index] + return [$w bbox $index.0] + } + + proc cget {w option} { + _getState $w + switch -- $option { + -selectmode {return $properties($w-selectmode)} + default {return [$w cget $option]} + } + } + + proc configure {w args} { + _getState $w + if {[llength $args]%2 != 0 && [llength $args] != 1} { + error "configure requires pairs" + } + set def {} + foreach {option value} $args { + switch -- $option { + -selectmode {return [_configSelectMode $w $value]} + default { + if {[llength $args] == 1} { + lappend def $option + } else { + lappend def $option $value + } + } + } + } + if {$def != {}} { + eval [namespace current]::$w configure $def + } + } + + + proc _configSelectMode {w value} { + _getState $w + if {$value == {}} { + return $properties($w-selectmode) + } else { + if {[regexp {^single|browse|multiple|extended$} $value]} { + error "invalid select mode: $value" + } + set properties($w-selectmode) $value + } + } + + proc OnBeginUISelection {w} { + _getState $w + set properties($w-uiselection) 1 + } + + proc OnEndUISelection {w} { + _getState $w + set properties($w-uiselection) 0 + event generate $w <> [namespace code "libs_onselect $w"] + + bind $lb {break;} + bind $lb [namespace code "libs_onkeypress $w %K; continue"] + + bind $lb [namespace code "libs_onenterkey $w"] + + + bind $lb "$closecmd; break" + bind $lb $browsecmd + bind $lb $savecmd + + bind $lb $closecmd + bind $lb $closecmd + bind $w [namespace code "libs_close %W $w"] + + focus $lb + $lb activate 0 + $lb selection set 0 + + wm geometry $w 600x300 + wm minsize $w 600 300 + optcl_utils::center_window $w + libs_update $w + + return $w + } + + proc libs_close {W w} { + if {[string match $w $W]} { + viewlib_clean + } + } + + proc libs_update {w} { + variable libs + set libs($w) {} + + set loaded {} + set notloaded {} + set loadednames {} + set notloadednames {} + $w.liblist.listbox delete 0 end + + foreach lib [array names ::typelib::typelibraries] { + mset {guid maj min} $lib + mset {name path} $typelib::typelibraries($lib) + if {[typelib::isloaded $guid $maj $min] != {}} { + lappend loaded [list $name $guid $maj $min $path] + } else { + lappend notloaded [list $name $guid $maj $min $path] + } + } + + foreach lib [lsort -dictionary -index 0 $loaded ] { + $w.liblist.listbox insert end [lindex $lib 0] + $w.liblist.listbox setimage end ::tlview::select_img + lappend libs($w) $lib + } + + foreach lib [lsort -dictionary -index 0 $notloaded ] { + $w.liblist.listbox insert end [lindex $lib 0] + $w.liblist.listbox setimage end ::tlview::noselect_img + lappend libs($w) $lib + } + $w.liblist.listbox selection set 0 + libs_onselect $w + } + + proc libs_onkeypress {w key} { + set lb $w.liblist.listbox + set key [string tolower $key] + if {![regexp {^[a-z]$} $key]} return + + set currentindex [$lb index active] + + set liblist [$lb get 0 end] + set searchlist [concat [lrange $liblist [expr $currentindex + 1] end] [lrange $liblist 0 $currentindex]] + + set nextindex [lsearch -regexp $searchlist ^($key|[string toupper $key]).*$] + + if {$nextindex>=0} { + if {$nextindex < [expr [llength $liblist] - $currentindex - 1]} { + set nextindex [expr $nextindex + $currentindex + 1] + } else { + set nextindex [expr $nextindex - ([llength $liblist] - $currentindex) + 1] + } + $lb selection clear 0 end + $lb activate $nextindex + $lb selection set $nextindex + $lb see active + } + } + + proc libs_onenterkey {w} { + set lb $w.liblist.listbox + set index [lindex [$lb curselection] 0] + libs_loader $w $index + } + + proc libs_loader {w index} { + variable libs + set lib [lindex $libs($w) $index] + mset {name guid maj min path} $lib + + set lb $w.liblist.listbox + set progname [typelib::isloaded $guid $maj $min] + if {$progname != {}} { + typelib::unload $progname + $lb setimage $index ::tlview::noselect_img + } else { + if {[catch {typelib::load $path} e]} { + tk_messageBox -title "Type Library Error" -message $e -icon error -parent $w -type ok + } else { + $lb setimage $index ::tlview::select_img + } + } + $lb activate $index + $lb selection clear 0 end + $lb selection set $index + } + + proc libs_ondblselect {w x y} { + set lb $w.liblist.listbox + set index [$lb index @$x,$y] + if {$index == {}} return + libs_loader $w $index + } + + proc libs_onselect {w} { + variable libs + set lb $w.liblist.listbox + set index [$lb curselection] + + set lib [lindex $libs($w) $index] + mset {name guid maj min path} $lib + $w.details_label config -text $name + $w.details.path config -text "Path: $path" + } + + + + proc libs_browse {w} { + variable libs + + set types { + {{Type Libraries} {.tlb .olb .dll}} + {{Executable Files} {.exe .dll}} + {{ActiveX Controls} {.ocx}} + {{All Files} {*}} + } + set fname [tk_getOpenFile -filetypes $types -parent $w -title "Add Type Library Reference"] + if {$fname != {}} { + try { + set progname [typelib::load $fname] + mset {guid maj min path fullname} [typelib::loadedlib_details $progname] + libs_update $w + set index [lsearch -exact $libs($w) [list $fullname $guid $maj $min $path]] + puts $index + if {$index >= 0} { + after 50 "$w.liblist.listbox selection set $index; $w.liblist.listbox see $index" + } + } catch {er} { + tk_messageBox -title "Error in loading library" -message $er -type ok -icon error + } + } + } + + + #------------------------------------------------------------------------------ + + + proc viewlib_clean {} { + variable properties + + history_clean + + set loadedlibs [typelib::loadedlibs] + + foreach item [array names properties] { + + if {[regexp -- - $item]} continue + if {![winfo exists $item]} { + array unset properties $item + array unset properties $item-* + continue + } + + if {[lsearch -exact $loadedlibs $properites($item-viewedlibrary)] < 0} { + # library is not loaded ... so revert to the current index of the history + history_current $item + } + } + + } + + proc viewlib_onenter {txt tag} { + $txt config -cursor hand2 + $txt tag configure $tag -underline 1 + } + + proc viewlib_onleave {txt tag} { + $txt config -cursor arrow + $txt tag configure $tag -underline 0 + } + + + proc viewlib_updatenav {w} { + set topbar $w.topbar + if {[history_back? $w]} { + $topbar.back config -state normal + } else { + $topbar.back config -state disabled + } + + if {[history_forward? $w]} { + $topbar.forward config -state normal + } else { + $topbar.forward config -state disabled + } + } + + + + proc viewlib_select {w lib {type {}} {element {}} {raise true}} { + variable properties + + history_lock $w + if {![string match $properties($w-viewedlibrary) $lib]} { + # try to find a window that is already viewing this library + foreach tlviewer [array names properties *-viewedlibrary] { + if {[string match $properties($tlviewer) $lib]} { + set w [lindex [split $tlviewer -] 0]; break + } + } + } + + set types_lb $w.sp1.sp2.types.listbox + set elements_lb $w.sp1.sp2.elements.listbox + + + # raise the window and instruct it to view the library + if {$raise} { + raise $w + } + + viewlib_showlibrary $w $lib + + + if {$type != {}} { + # now find the type + set index [lsearch -exact [$types_lb get 0 end] $type] + if {$index >= 0} { + $types_lb selection set $index + $types_lb see $index + } + } + + if {$type != {} && $element != {}} { + set index [lsearch -regexp [$elements_lb get 0 end] "^($element)( .+)?"] + if {$index >= 0} { + $elements_lb selection set $index + $elements_lb see $index + } + } + history_unlock $w + history_addwindowstate $w + } + + # browse to a specific library + proc viewlib_showlibrary {w lib} { + variable colors + variable properties + + set types_lb $w.sp1.sp2.types.listbox + set elements_lb $w.sp1.sp2.elements.listbox + set description $w.sp1.description.desc.t + + + $elements_lb delete 0 end + #$description config -state normal + $description delete 1.0 end + #$description config -state disabled + + # if the viewed library is being changed, redirect through the + # $w-library property change event handler + if {![string match $properties($w-viewedlibrary) $lib] && $lib != {}} { + set properties($w-viewedlibrary) $lib + return + } elseif {[string match $properties($w-library) $lib] || $lib == {}} { + if {$properties($w-type) != {}} { + set properties($w-type) {} + $types_lb selection clear 0 end + } + return + } + + set properties($w-library) $lib + set properties($w-type) {} + set properties($w-element) {} + + history_addwindowstate $w + + $types_lb delete 0 end + foreach tdesc [lsort [typelib::types $lib]] { + set typetype [lindex $tdesc 0] + set full [lindex $tdesc 1] + set type [lindex [split $full .] 1] + $types_lb insert end $type + + switch -- $typetype { + class {$types_lb setimage end ::tlview::class_img} + dispatch {$types_lb setimage end ::tlview::dispatch_img} + interface {$types_lb setimage end ::tlview::interface_img} + module {$types_lb setimage end ::tlview::module_img} + struct {$types_lb setimage end ::tlview::struct_img} + union {$types_lb setimage end ::tlview::union_img} + enum {$types_lb setimage end ::tlview::enum_img} + typedef {$types_lb setimage end ::tlview::typedef_img} + + } + + } + bind $types_lb <> [namespace code "viewlib_showelement_description_byindex $w $lib $type \[$elements_lb curselection\]"] + } + #$desc config -state disabled + } + + + + proc viewlib_showelement_description_byindex {w lib type elemindex} { + + + set elements_lb $w.sp1.sp2.elements.listbox + if {$elemindex == {}} { + viewlib_showelements $w $lib $type + return + } else { + set element [$elements_lb get $elemindex] + # because we tend to mark up default and source interfaces + # with appended symbols and names, we'll strip these off + set element [lindex [lindex $element 0] 0] + + # but in fact, any implemented type needs not an element + # description, but a jump to that types description + if {[regexp {^.+\..+$} $element]} { + set split [split $element .] + set newlib [lindex $split 0] + set newtype [lindex $split 1] + viewlib_select $w $newlib $newtype + } else { + viewlib_showelement_description $w $lib $type $element + } + } + } + + ### + # retrieves the description for an element + proc viewlib_showelement_description {w lib type elem} { + variable colors + variable properties + + set txt $w.sp1.description.desc.t + #$txt config -state normal + + $txt tag bind element <1> [namespace code "viewlib_select $lib.$type $elem"] + + # if we're not viewing this element already + if {$elem != {} && ![string match $properties($w-element) $elem]} { + $txt delete 1.0 end + set properties($w-element) $elem + history_addwindowstate $w + + set elementdesc [typelib::typeinfo $lib.$type $elem] + set elementkind [lindex $elementdesc 0] + + switch $elementkind { + property { + $txt insert end "property " + + set propertydesc [lindex $elementdesc 1] + # insert the flags + set flags [lindex $propertydesc 0] + if {[lsearch -exact $flags read] < 0} { + set flags {(write only)} + } elseif {[lsearch -exact $flags write] < 0} { + set flags {(read only)} + } elseif {$flags != {}} { + set flags {(read+write)} + } + $txt insert end "$flags\n" FlagDescription + + # the property type + viewlib_writetype $txt [lindex $propertydesc 1] + $txt insert end " " + + # the property name + $txt insert end "[lindex $propertydesc 2]" DescriptionLabel + + # now do the params + set params [lrange $propertydesc 3 end] + + foreach param $params { + $txt insert end "\n\t" + + if {[llength $param] == 3} { + $txt insert end "[lindex $param 0]\t" + set param [lrange $param 1 end] + } + viewlib_writetype $txt [lindex $param 0] + $txt insert end " [lrange $param 1 end]" + } + # the documentation for the property + set documentation [lindex $elementdesc 2] + if {$documentation != {}} { + $txt insert end "\n\n\"$documentation\"" MemberDocumentation + } + } + + method { + set methodesc [lindex $elementdesc 1] + $txt insert end "method\n" + + # the return type + viewlib_writetype $txt [lindex $methodesc 0] + $txt insert end " " + $txt insert end "[lindex $methodesc 1]" DescriptionLabel + set params [lrange $methodesc 2 end] + + foreach param $params { + $txt insert end "\n\t" + + if {[llength $param] == 3} { + $txt insert end "[lindex $param 0]\t" + set param [lrange $param 1 end] + } + viewlib_writetype $txt [lindex $param 0] + $txt insert end " [lrange $param 1 end]" + } + set documentation [lindex $elementdesc 2] + if {$documentation != {}} { + $txt insert end "\n\n\"$documentation\"" MemberDocumentation + } + } + } + } + #$txt config -state disabled + + } + + + proc viewlib_copy {w} { + variable properties + + set str $properties($w-viewedlibrary) + if {$properties($w-type) != {}} { + set str "$str.$properties($w-type)" + if {$properties($w-element)!={}} { + set str "$str $properties($w-element)" + } + } + clipboard clear + clipboard append -format STRING -- $str + } + + #### + # Creates a viewer for library + proc viewlib {{w {}} {lib {}}} { + variable colors + variable properties + + if {$w == {}} { + + # iterate over the current windows to find one that is viewing this library + foreach viewedlib [array names properties *-viewedlibrary] { + if {[string match $properties($viewedlib) $lib]} { + set w [lindex [split $viewedlib -] 0] + break; + } + } + } + + if {$w == {}} { + # make a unique name + set count 0 + + set w ._tlview_$count + while {[winfo exists $w]} { + set w ._tlview_[incr count] + } + } + + + if [winfo exists $w] { + raise $w + return $w + } + + toplevel $w -class TypeLibraryViewer -width 400 -height 300 + wm title $w "Type Library:" + + # top bar - search stuff + set topbar [frame $w.topbar] + pack $topbar -side top -fill x -pady 2 + pack [label $topbar.liblabel -text Library -underline 0 -width 6] -side left -anchor nw + + ::tlview::TlviewCombo::Create $topbar.libs {::typelib::loadedlibs} -textvariable [namespace current]::properties($w-viewedlibrary) + + $topbar.libs.e config -state disabled + pack $topbar.libs -side left -padx 3 + pack [button $topbar.back -image ::tlview::leftarrow_img -bd 1 -height 16 -width 16 -command [namespace code "history_back $w"]] -side left + pack [button $topbar.forward -image ::tlview::rightarrow_img -bd 1 -height 16 -width 16 -command [namespace code "history_forward $w"]] -side left + pack [button $topbar.copy -image ::tlview::copy_img -bd 1 -height 16 -width 16 -command [namespace code "viewlib_copy $w"]] -padx 3 -side left + pack [button $topbar.libselect -image ::tlview::libselect_img -bd 1 -height 16 -width 16 -command [namespace code "libs $w.selectlibs"]] -padx 0 -side left + + TlviewTooltip::Set $topbar.libs "Loaded Libraries" + TlviewTooltip::Set $topbar.back "Previous in History" + TlviewTooltip::Set $topbar.forward "Next in History" + TlviewTooltip::Set $topbar.copy "Copy" + TlviewTooltip::Set $topbar.libselect "Referenced Type Libraries" + + searchbox $w.searchbox + pack $w.searchbox -side top -fill x -pady 2 + + # splitters + set sp1 [Splitter $w.sp1 -orient horizontal -type fixB -position 160 -barwidth 5 -width 460 -height 380] + set sp2 [Splitter $w.sp1.sp2 -orient vertical -type fixA -position 200 -barwidth 5] + pack $sp1 -fill both -expand 1 -side bottom + $sp1 config -windowA $sp2 + + # description frame + set desc [frame $sp1.description] + $sp1 config -windowB $desc + pack [label $desc.label -text Description] -side top -anchor nw + pack [scrltxt $desc.desc] -side top -anchor nw -fill both -expand 1 + $desc.desc.t tag configure DescriptionLabel -foreground $colors(labelcolor) -font tlviewerbold + $desc.desc.t tag configure FlagDescription -font tlvieweritalic + $desc.desc.t tag configure MemberDocumentation -font tlvieweritalic -foreground $colors(labelcolor) + $desc.desc.t config -exportselection 1 -cursor xterm -insertontime 0 -selectforeground SystemHighlightText + bind $desc.desc.t {continue} + bind $desc.desc.t "break;" + + # types frame + set types [::tlview::TlviewScrolledListBox $sp2.types] + $types.listbox config -font {Arial 10 {}} + $sp2 config -windowA $types + $types.label config -text Types + + set elements [::tlview::TlviewScrolledListBox $sp2.elements] + $elements.listbox config -font {Arial 10 {}} + $sp2 config -windowB $elements + $elements.label config -text "Elements" + + if {$lib == {}} { + set lib [lindex [typelib::loadedlibs] 0] + } + + trace vdelete [namespace current]::properties($w-viewedlibrary) w [namespace code viewlib_libchanged] + set properties($w-viewedlibrary) {} + set properties($w-library) {} + set properties($w-type) {} + set properties($w-element) {} + trace variable [namespace current]::properties($w-viewedlibrary) w [namespace code viewlib_libchanged] + + bind $w [namespace code "viewlib_ondestroy %W"] + history_init $w + viewlib_showlibrary $w $lib + + return $w + } + + proc viewlib_ondestroy {w} { + variable properties + + if {[winfo toplevel $w] == $w} { + history_erase $w + array unset properties $w + array unset properties $w-* + } + } + + proc viewlib_libchanged {n1 n2 command} { + variable properties + set lib $properties($n2) + set w [lindex [split $n2 -] 0] + viewlib_showlibrary $w $lib + } + + proc viewtype {fullname {elem {}} {history 1}} { + set split [split $fullname .] + set lib [lindex $split 0] + set type [lindex $split 1] + + viewlib_select $lib $type $elem $history + } + + ### -- Search box code + + + proc searchbox {w} { + variable properties + + destroy $w + + frame $w + set splitter [winfo parent $w] + + frame $w.top + pack [label $w.top.searchlabel -text Search -underline 0 -width 6] -side left -anchor nw + ::tlview::TlviewCombo::Create $w.top.searchterm [namespace code "search_history_getlist $w"] + bind $w.top.searchterm.e [namespace code "searchbox_search $w"] + + button $w.top.search -image ::tlview::find_img -borderwidth 1 -command [namespace code "searchbox_search $w"] + button $w.top.showhide -image ::tlview::show_img -borderwidth 1 -command [namespace code "searchbox_showhide $w"] + pack $w.top.showhide $w.top.search -side right -padx 2 + pack $w.top.searchterm -side left -fill x -expand 1 -padx 3 + + TlviewTooltip::Set $w.top.showhide "Show/Hide Search Results" + TlviewTooltip::Set $w.top.searchterm "Search String" + TlviewTooltip::Set $w.top.search "Search for String" + + scrltxt $w.searchresults + $w.searchresults.t config -height 10 -tabs 5c -state disabled + + grid $w.top -sticky nsew + grid rowconfigure $w 1 -weight 1 + grid columnconfigure $w 0 -weight 1 + update + set properties($w-collapsed) [expr [winfo reqheight $w] + 2] + set properties($w-expanded) 200 + set properties($w-min) 90 + + #$splitter config -windowB $w -type fixB -position $properties($w-collapsed) -min $properties($w-collapsed) -max $properties($w-collapsed) + return $w + } + + proc searchbox_show {w} { + variable properties + if {[lsearch [grid slaves $w] $w.searchresults] >= 0} return + + set toplevel [winfo toplevel $w] + set windowheight [winfo height $toplevel] + set windowheight [expr $windowheight + [winfo reqheight $w.searchresults] + 5] + + grid $w.searchresults -row 1 -column 0 -sticky nsew -pady 5 + wm geometry $toplevel [winfo width $toplevel]x$windowheight + $w.top.showhide config -image ::tlview::hide_img -relief sunken + } + + proc searchbox_search {w} { + variable properties + set query [$w.top.searchterm.e get] + set lib $properties([winfo toplevel $w]-viewedlibrary) + + search_history_add $w $query + search $w $query + $w.top.searchterm.e selection clear + $w.top.searchterm.e selection range 0 end + } + + proc searchbox_hide {w} { + variable properties + + if {[lsearch [grid slaves $w] $w.searchresults] < 0} return + + set textheight [winfo reqheight $w.searchresults] + set toplevel [winfo toplevel $w] + set windowheight [expr [winfo height $toplevel] - $textheight - 5] + grid forget $w.searchresults + + wm geometry $toplevel [winfo width $toplevel]x$windowheight + $w.top.showhide config -image ::tlview::show_img -relief raised + } + + proc searchbox_showhide {w} { + if {[lsearch [grid slaves $w] $w.searchresults] < 0} { + searchbox_show $w + } else { + searchbox_hide $w + } + } + + proc search {w query} { + variable properties + + # ensure that the search window exists + + set w [winfo toplevel $w] + set lib $properties($w-viewedlibrary) + set searchbox $w.searchbox + set sr $searchbox.searchresults.t + + # set up the text box + $sr config -state normal + $sr delete 1.0 end + + searchbox_show $searchbox + + set query [join [list * $query *] {}] + + foreach desc [typelib::types $lib] { + set fulltype [lindex $desc 1] + set reflib [lindex [split $fulltype .] 0] + set reftype [lindex [split $fulltype .] 1] + + # perform search on the type name + if {[string match -nocase $query $reftype]} { + viewlib_writetype $sr $fulltype + $sr insert end "\n" + } + + # now iterate through its members + set typeinfo [typelib::typeinfo $fulltype] + foreach item [lindex $typeinfo 1] { + if {[string match -nocase $query $item]} { + viewlib_writetype $sr $fulltype.$item + $sr insert end "\n" + } + } + + foreach item [lindex $typeinfo 2] { + if {[string match -nocase $query $item]} { + viewlib_writetype $sr $fulltype.$item + $sr insert end "\n" + } + } + } + $sr config -state disabled + } + + proc viewtype {fulltype {element {}}} { + variable properties + set w {} + set split [split $fulltype .] + set lib [lindex $split 0] + set type [lindex $split 1] + + + set w [viewlib {} $lib] + update + viewlib_select $w $lib $type $element + } + + + proc class {obj} { + viewtype [optcl::class $obj] + } + + proc interface {obj} { + viewtype [optcl::interface $obj] + } +} diff --git a/src/Tooltip.tcl b/src/Tooltip.tcl new file mode 100644 index 0000000..8f1ebbc --- /dev/null +++ b/src/Tooltip.tcl @@ -0,0 +1,68 @@ + +# public interface +namespace eval TlviewTooltip { + proc Set {w text} { + variable properties + set properties($w-text) $text + bind $w [namespace code "Pending $w %X %Y"] + bind $w [namespace code "Hide"] + Hide + } + + proc Unset {w} { + bind $w {} + bind $w {} + Hide + } +} + + +# private stuff +namespace eval TlviewTooltip { + variable properties + set properties(window) .__tlview__tooltip + set properties(showbh) 1 + set properties(pending) {} + + + destroy $properties(window) + toplevel $properties(window) -bg SystemInfoText + label $properties(window).l -text "Tooltip" -bg SystemInfoBackground -fg SystemInfoText + pack $properties(window).l -padx 1 -pady 1 + + + wm overrideredirect $properties(window) 1 + wm withdraw $properties(window) + + + proc Pending {w x y} { + variable properties + Cancel + set properties(pending) [after 1000 [namespace code "Show $w $x $y"]] + } + + proc Cancel {} { + variable properties + if {$properties(pending) != {}} { + after cancel $properties(pending) + set properties(pending) {} + } + } + + proc Show {w x y} { + variable properties + + $properties(window).l configure -text $properties($w-text) + wm deiconify $properties(window) + incr x 8 + incr y 8 + wm transient $properties(window) $w + wm geometry $properties(window) +$x+$y + } + + proc Hide {} { + variable properties + Cancel + wm withdraw $properties(window) + } +} diff --git a/src/Utilities.tcl b/src/Utilities.tcl new file mode 100644 index 0000000..7fdcb39 --- /dev/null +++ b/src/Utilities.tcl @@ -0,0 +1,43 @@ + +namespace eval optcl_utils { +namespace export * +# nice and simple error catching +proc try {body catch errvarname catchblock} { + upvar $errvarname errvar + + if {![string match $catch catch]} { + error "invalid syntax - should be: try {body} catch {catchblock}" + } + if { [catch [list uplevel $body] errvar] } { + uplevel $catchblock + } else { + return $errvar + } +} + +proc throw {errmsg} { + uplevel [list error $errmsg] +} + + +proc center_window {w} { + set width [winfo reqwidth $w] + set height [winfo reqheight $w] + set swidth [winfo screenwidth $w] + set sheight [winfo screenheight $w] + + set x [expr ($swidth - $width) /2 ] + set y [expr ($sheight - $height) /2 ] + wm geometry $w +$x+$y +} + +# set multiple variables with the contents of the list +proc mset {vars values} { + foreach var $vars value $values { + if {$var == {}} {error "not enough variables for mset operation"} + upvar $var myvar + set myvar $value + } +} + +} \ No newline at end of file diff --git a/src/optcl.cpp b/src/optcl.cpp index d2fa2e1..941b689 100644 --- a/src/optcl.cpp +++ b/src/optcl.cpp @@ -38,7 +38,7 @@ HINSTANCE ghDll = NULL; CComModule _Module; CComPtr g_pmalloc; - +bool g_bTkInit = false; //---------------------------------------------------------------- // Function declarations @@ -394,7 +394,7 @@ TCL_CMDEF(OptclInvokeLibFunction) CHECKHR_TCL(hr, pInterp, TCL_ERROR); if (FAILED(hr)) return TCL_ERROR; - if (bOk = var2obj(pInterp, varResult, presult)) + if (bOk = var2obj(pInterp, varResult, NULL, presult)) Tcl_SetObjResult (pInterp, presult); VariantClear(&varResult); } @@ -623,6 +623,7 @@ int Optcl_Init (Tcl_Interp *pInterp) // initialise the Tk stubs - failure if (Tk_InitStubs (pInterp, "8.0", 0) == NULL) return TCL_ERROR; + g_bTkInit = true; } #else #error Wrong Tcl version for Stubs @@ -630,11 +631,14 @@ int Optcl_Init (Tcl_Interp *pInterp) #endif // USE_TCL_STUBS HRESULT hr; + Tcl_PkgProvide(pInterp, "optcl", "3.0"); + OleInitialize(NULL); hr = CoGetMalloc(1, &g_pmalloc); CHECKHR_TCL(hr, pInterp, TCL_ERROR); Tcl_CreateExitHandler (Optcl_Exit, NULL); + /* HRSRC hrsrc = FindResource (ghDll, MAKEINTRESOURCE(IDR_TYPELIB), _T("TCL_SCRIPT")); if (hrsrc == NULL) { Tcl_SetResult (pInterp, "failed to locate internal script", TCL_STATIC); @@ -652,6 +656,7 @@ int Optcl_Init (Tcl_Interp *pInterp) ASSERT (szscript != NULL); if (Tcl_GlobalEval (pInterp, szscript) == TCL_ERROR) return TCL_ERROR; + */ Tcl_CreateObjCommand (pInterp, "optcl::new", OptclNewCmd, NULL, NULL); Tcl_CreateObjCommand (pInterp, "optcl::lock", OptclLockCmd, NULL, NULL); diff --git a/src/optcl.dsp b/src/optcl.dsp index c4407bd..bc1dfd3 100644 --- a/src/optcl.dsp +++ b/src/optcl.dsp @@ -4,7 +4,7 @@ # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 -CFG=optcl - Win32 Debug_NoStubs +CFG=optcl - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE @@ -13,14 +13,13 @@ CFG=optcl - Win32 Debug_NoStubs !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE -!MESSAGE NMAKE /f "optcl.mak" CFG="optcl - Win32 Debug_NoStubs" +!MESSAGE NMAKE /f "optcl.mak" CFG="optcl - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "optcl - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "optcl - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "optcl - Win32 Release_NoStubs" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "optcl - Win32 Debug_NoStubs" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "optcl - Win32 Release Static" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project @@ -41,11 +40,11 @@ RSC=rc.exe # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" +# PROP Intermediate_Dir "Release\Objects" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPTCL_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /Ob2 /I "c:\progra~1\tcl\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPTCL_EXPORTS" /D "USE_TCL_STUBS" /D "USE_TK_STUBS" /FR /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MD /W3 /GX /Zi /O1 /Ob2 /I "c:\opt\tcl\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPTCL_EXPORTS" /D "USE_TCL_STUBS" /D "USE_TK_STUBS" /D TCL_THREADS=1 /D USE_THREAD_ALLOC=1 /D _REENTRANT=1 /D _THREAD_SAFE=1 /FR /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x809 /d "NDEBUG" @@ -55,23 +54,24 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tclstub82.lib tkstub82.lib /nologo /dll /machine:I386 /out:"../install/optclstubs.dll" /libpath:"c:\progra~1\tcl\lib" +# ADD LINK32 tclstub84.lib tkstub84.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /dll /debug /machine:I386 /out:"Release/optcl30.dll" /libpath:"c:\opt\tcl\lib" +# SUBTRACT LINK32 /incremental:yes !ELSEIF "$(CFG)" == "optcl - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "optcl___Win32_Debug" -# PROP BASE Intermediate_Dir "optcl___Win32_Debug" +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" +# PROP Intermediate_Dir "Debug\Objects" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPTCL_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /Gi /GX /ZI /Od /I "c:\progra~1\tcl\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPTCL_EXPORTS" /D "USE_TCL_STUBS" /D "USE_TK_STUBS" /FR /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "c:\opt\tcl\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPTCL_EXPORTS" /D "USE_TCL_STUBS" /D "USE_TK_STUBS" /D "ATL_DEBUG_INTERFACES" /FR /YX"stdafx.h" /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x809 /d "_DEBUG" @@ -81,24 +81,22 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tclstub84.lib tkstub84.lib /nologo /dll /debug /machine:I386 /out:"../install/optclstubs.dll" /pdbtype:sept /libpath:"c:\progra~1\tcl\lib" +# ADD LINK32 tclstub84.lib tkstub84.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /dll /debug /machine:I386 /out:"Debug/optcl30g.dll" /pdbtype:sept /libpath:"c:\opt\tcl\lib" -!ELSEIF "$(CFG)" == "optcl - Win32 Release_NoStubs" +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "optcl___Win32_Release_NoStubs" -# PROP BASE Intermediate_Dir "optcl___Win32_Release_NoStubs" -# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release\Static" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release_NoStubs" -# PROP Intermediate_Dir "Release_NoStubs" -# PROP Ignore_Export_Lib 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release\Static" # PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /Ob2 /I "c:\progra~1\tcl\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPTCL_EXPORTS" /D "USE_TCL_STUBS" /D "USE_TK_STUBS" /FR /Yu"stdafx.h" /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /Ob2 /I "c:\progra~1\tcl\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPTCL_EXPORTS" /FR /Yu"stdafx.h" /FD /c +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /Zi /O1 /Ob2 /I "c:\opt\tcl\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_LIB" /D "OPTCL_EXPORTS" /D TCL_THREADS=1 /D USE_THREAD_ALLOC=1 /D _REENTRANT=1 /D _THREAD_SAFE=1 /FR /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x809 /d "NDEBUG" @@ -107,35 +105,8 @@ BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tclstub82.lib tkstub82.lib /nologo /dll /machine:I386 /libpath:"c:\progra~1\tcl\lib" -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tcl80.lib tk80.lib /nologo /dll /machine:I386 /out:"../install/optcl80.dll" /libpath:"c:\progra~1\tcl\lib" - -!ELSEIF "$(CFG)" == "optcl - Win32 Debug_NoStubs" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "optcl___Win32_Debug_NoStubs" -# PROP BASE Intermediate_Dir "optcl___Win32_Debug_NoStubs" -# PROP BASE Ignore_Export_Lib 0 -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug_NoStubs" -# PROP Intermediate_Dir "Debug_NoStubs" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /Gi /GX /ZI /Od /I "c:\progra~1\tcl\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPTCL_EXPORTS" /D "USE_TCL_STUBS" /D "USE_TK_STUBS" /FR /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /Gi /GX /ZI /Od /I "c:\progra~1\tcl\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPTCL_EXPORTS" /FR /Yu"stdafx.h" /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x809 /d "_DEBUG" -# ADD RSC /l 0x809 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tclstub82.lib tkstub82.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"c:\progra~1\tcl\lib" -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tcl80.lib tk80.lib /nologo /dll /debug /machine:I386 /out:"../install/optcl80.dll" /pdbtype:sept /libpath:"c:\progra~1\tcl\lib" +# ADD BASE LINK32 /nologo /machine:IX86 +# ADD LINK32 /nologo /machine:IX86 /out:"Release\optcl30s.lib" /lib !ENDIF @@ -143,27 +114,30 @@ LINK32=link.exe # Name "optcl - Win32 Release" # Name "optcl - Win32 Debug" -# Name "optcl - Win32 Release_NoStubs" -# Name "optcl - Win32 Debug_NoStubs" -# Begin Group "Source" +# Name "optcl - Win32 Release Static" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File -# PROP Default_Filter "cpp" +SOURCE=.\ComRecordInfoImpl.cpp +# End Source File # Begin Source File SOURCE=.\Container.cpp !IF "$(CFG)" == "optcl - Win32 Release" -# ADD CPP /Yu"StdAfx.h" +# ADD CPP /YX"stdafx.h" !ELSEIF "$(CFG)" == "optcl - Win32 Debug" -!ELSEIF "$(CFG)" == "optcl - Win32 Release_NoStubs" +# ADD CPP /YX -# ADD BASE CPP /Yu"StdAfx.h" -# ADD CPP /Yu"StdAfx.h" +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" -!ELSEIF "$(CFG)" == "optcl - Win32 Debug_NoStubs" +# ADD BASE CPP /YX"stdafx.h" +# ADD CPP /YX"stdafx.h" !ENDIF @@ -174,21 +148,16 @@ SOURCE=.\DispParams.cpp !IF "$(CFG)" == "optcl - Win32 Release" -# ADD CPP /Yu"stdafx.h" +# ADD CPP /YX"stdafx.h" !ELSEIF "$(CFG)" == "optcl - Win32 Debug" -# ADD CPP /Yu"StdAfx.h" - -!ELSEIF "$(CFG)" == "optcl - Win32 Release_NoStubs" - -# ADD BASE CPP /Yu"stdafx.h" -# ADD CPP /Yu"stdafx.h" +# ADD CPP /YX -!ELSEIF "$(CFG)" == "optcl - Win32 Debug_NoStubs" +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" -# ADD BASE CPP /Yu"StdAfx.h" -# ADD CPP /Yu"StdAfx.h" +# ADD BASE CPP /YX"stdafx.h" +# ADD CPP /YX"stdafx.h" !ENDIF @@ -199,16 +168,16 @@ SOURCE=.\EventBinding.cpp !IF "$(CFG)" == "optcl - Win32 Release" -# ADD CPP /Yu"stdafx.h" +# ADD CPP /YX"stdafx.h" !ELSEIF "$(CFG)" == "optcl - Win32 Debug" -!ELSEIF "$(CFG)" == "optcl - Win32 Release_NoStubs" +# ADD CPP /YX -# ADD BASE CPP /Yu"stdafx.h" -# ADD CPP /Yu"stdafx.h" +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" -!ELSEIF "$(CFG)" == "optcl - Win32 Debug_NoStubs" +# ADD BASE CPP /YX"stdafx.h" +# ADD CPP /YX"stdafx.h" !ENDIF @@ -216,7 +185,22 @@ SOURCE=.\EventBinding.cpp # Begin Source File SOURCE=.\initonce.cpp -# SUBTRACT CPP /YX /Yc /Yu + +!IF "$(CFG)" == "optcl - Win32 Release" + +# ADD CPP /YX"stdafx.h" + +!ELSEIF "$(CFG)" == "optcl - Win32 Debug" + +# SUBTRACT CPP /YX + +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" + +# ADD BASE CPP /YX"stdafx.h" +# ADD CPP /YX"stdafx.h" + +!ENDIF + # End Source File # Begin Source File @@ -224,21 +208,16 @@ SOURCE=.\ObjMap.cpp !IF "$(CFG)" == "optcl - Win32 Release" -# ADD CPP /Yu"stdafx.h" +# ADD CPP /YX"stdafx.h" !ELSEIF "$(CFG)" == "optcl - Win32 Debug" -# ADD CPP /Yu"StdAfx.h" - -!ELSEIF "$(CFG)" == "optcl - Win32 Release_NoStubs" +# ADD CPP /YX -# ADD BASE CPP /Yu"stdafx.h" -# ADD CPP /Yu"stdafx.h" +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" -!ELSEIF "$(CFG)" == "optcl - Win32 Debug_NoStubs" - -# ADD BASE CPP /Yu"StdAfx.h" -# ADD CPP /Yu"StdAfx.h" +# ADD BASE CPP /YX"stdafx.h" +# ADD CPP /YX"stdafx.h" !ENDIF @@ -249,21 +228,16 @@ SOURCE=.\optcl.cpp !IF "$(CFG)" == "optcl - Win32 Release" -# ADD CPP /Yu"stdafx.h" +# ADD CPP /YX"stdafx.h" !ELSEIF "$(CFG)" == "optcl - Win32 Debug" -# ADD CPP /Yu"StdAfx.h" - -!ELSEIF "$(CFG)" == "optcl - Win32 Release_NoStubs" +# ADD CPP /YX -# ADD BASE CPP /Yu"stdafx.h" -# ADD CPP /Yu"stdafx.h" +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" -!ELSEIF "$(CFG)" == "optcl - Win32 Debug_NoStubs" - -# ADD BASE CPP /Yu"StdAfx.h" -# ADD CPP /Yu"StdAfx.h" +# ADD BASE CPP /YX"stdafx.h" +# ADD CPP /YX"stdafx.h" !ENDIF @@ -271,6 +245,22 @@ SOURCE=.\optcl.cpp # Begin Source File SOURCE=.\OptclBindPtr.cpp + +!IF "$(CFG)" == "optcl - Win32 Release" + +# ADD CPP /YX"stdafx.h" + +!ELSEIF "$(CFG)" == "optcl - Win32 Debug" + +# ADD CPP /YX + +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" + +# ADD BASE CPP /YX"stdafx.h" +# ADD CPP /YX"stdafx.h" + +!ENDIF + # End Source File # Begin Source File @@ -278,48 +268,97 @@ SOURCE=.\OptclObj.cpp !IF "$(CFG)" == "optcl - Win32 Release" -# ADD CPP /Yu"stdafx.h" +# ADD CPP /YX"stdafx.h" !ELSEIF "$(CFG)" == "optcl - Win32 Debug" -# ADD CPP /Yu"StdAfx.h" +# ADD CPP /YX -!ELSEIF "$(CFG)" == "optcl - Win32 Release_NoStubs" +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" -# ADD BASE CPP /Yu"stdafx.h" -# ADD CPP /Yu"stdafx.h" +# ADD BASE CPP /YX"stdafx.h" +# ADD CPP /YX"stdafx.h" -!ELSEIF "$(CFG)" == "optcl - Win32 Debug_NoStubs" +!ENDIF -# ADD BASE CPP /Yu"StdAfx.h" -# ADD CPP /Yu"StdAfx.h" +# End Source File +# Begin Source File + +SOURCE=.\OptclTypeAttr.cpp + +!IF "$(CFG)" == "optcl - Win32 Release" + +# ADD CPP /YX"stdafx.h" + +!ELSEIF "$(CFG)" == "optcl - Win32 Debug" + +# ADD CPP /YX + +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" + +# ADD BASE CPP /YX"stdafx.h" +# ADD CPP /YX"stdafx.h" !ENDIF # End Source File # Begin Source File -SOURCE=.\OptclTypeAttr.cpp +SOURCE=.\resource.rc # End Source File # Begin Source File SOURCE=.\StdAfx.cpp -# ADD CPP /Yc"StdAfx.h" +# ADD CPP /Yc"stdafx.h" # End Source File # Begin Source File SOURCE=.\typelib.cpp -# ADD CPP /Yu"StdAfx.h" + +!IF "$(CFG)" == "optcl - Win32 Release" + +# ADD CPP /YX"stdafx.h" + +!ELSEIF "$(CFG)" == "optcl - Win32 Debug" + +# ADD CPP /YX + +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" + +# ADD BASE CPP /YX"stdafx.h" +# ADD CPP /YX"stdafx.h" + +!ENDIF + # End Source File # Begin Source File SOURCE=.\utility.cpp -# ADD CPP /Yu"StdAfx.h" + +!IF "$(CFG)" == "optcl - Win32 Release" + +# ADD CPP /YX"stdafx.h" + +!ELSEIF "$(CFG)" == "optcl - Win32 Debug" + +# ADD CPP /YX + +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" + +# ADD BASE CPP /YX"stdafx.h" +# ADD CPP /YX"stdafx.h" + +!ENDIF + # End Source File # End Group -# Begin Group "Header" +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File -# PROP Default_Filter "h" +SOURCE=.\ComRecordInfoImpl.h +# End Source File # Begin Source File SOURCE=.\Container.h @@ -373,42 +412,272 @@ SOURCE=.\typelib.h SOURCE=.\utility.h # End Source File # End Group -# Begin Group "Resource" +# Begin Group "Resource Files" -# PROP Default_Filter "" +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # Begin Source File -SOURCE=.\resource.rc +SOURCE=.\ImageListBox.tcl + +!IF "$(CFG)" == "optcl - Win32 Release" + +# Begin Custom Build +InputPath=.\ImageListBox.tcl + +"c:\progra~1\tcl\lib\optcl\scripts\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\scripts\$(InputPath) + +# End Custom Build + +!ELSEIF "$(CFG)" == "optcl - Win32 Debug" + +# Begin Custom Build +InputPath=.\ImageListBox.tcl + +"c:\progra~1\tcl\lib\optcl\scripts\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\scripts\$(InputPath) + +# End Custom Build + +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" + +# Begin Custom Build +InputPath=.\ImageListBox.tcl + +"c:\progra~1\tcl\lib\optcl\scripts\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\scripts\$(InputPath) + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\optcl.tcl + +!IF "$(CFG)" == "optcl - Win32 Release" + +# Begin Custom Build +InputPath=.\optcl.tcl + +"c:\progra~1\tcl\lib\optcl\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\$(InputPath) + +# End Custom Build + +!ELSEIF "$(CFG)" == "optcl - Win32 Debug" + +# Begin Custom Build +InputPath=.\optcl.tcl + +"c:\progra~1\tcl\lib\optcl\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\$(InputPath) + +# End Custom Build + +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" + +# Begin Custom Build +InputPath=.\optcl.tcl + +"c:\progra~1\tcl\lib\optcl\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\$(InputPath) + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\Splitter.tcl + +!IF "$(CFG)" == "optcl - Win32 Release" + +# Begin Custom Build +InputPath=.\Splitter.tcl + +"c:\progra~1\tcl\lib\optcl\scripts\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\scripts\$(InputPath) + +# End Custom Build + +!ELSEIF "$(CFG)" == "optcl - Win32 Debug" + +# Begin Custom Build +InputPath=.\Splitter.tcl + +"c:\progra~1\tcl\lib\optcl\scripts\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\scripts\$(InputPath) + +# End Custom Build + +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" + +# Begin Custom Build +InputPath=.\Splitter.tcl + +"c:\progra~1\tcl\lib\optcl\scripts\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\scripts\$(InputPath) + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\TLView.tcl + +!IF "$(CFG)" == "optcl - Win32 Release" + +# Begin Custom Build +InputPath=.\TLView.tcl + +"c:\progra~1\tcl\lib\optcl\scripts\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\scripts\$(InputPath) + +# End Custom Build + +!ELSEIF "$(CFG)" == "optcl - Win32 Debug" + +# Begin Custom Build +InputPath=.\TLView.tcl + +"c:\progra~1\tcl\lib\optcl\scripts\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\scripts\$(InputPath) + +# End Custom Build + +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" + +# Begin Custom Build +InputPath=.\TLView.tcl + +"c:\progra~1\tcl\lib\optcl\scripts\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\scripts\$(InputPath) + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\Tooltip.tcl + +!IF "$(CFG)" == "optcl - Win32 Release" + +# Begin Custom Build +InputPath=.\Tooltip.tcl + +"c:\progra~1\tcl\lib\optcl\scripts\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\scripts\$(InputPath) + +# End Custom Build + +!ELSEIF "$(CFG)" == "optcl - Win32 Debug" + +# Begin Custom Build +InputPath=.\Tooltip.tcl + +"c:\progra~1\tcl\lib\optcl\scripts\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\scripts\$(InputPath) + +# End Custom Build + +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" + +# Begin Custom Build +InputPath=.\Tooltip.tcl + +"c:\progra~1\tcl\lib\optcl\scripts\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\scripts\$(InputPath) + +# End Custom Build + +!ENDIF + # End Source File # Begin Source File SOURCE=.\typelib.tcl + +!IF "$(CFG)" == "optcl - Win32 Release" + +# Begin Custom Build +InputPath=.\typelib.tcl + +"c:\progra~1\tcl\lib\optcl\scripts\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\scripts\$(InputPath) + +# End Custom Build + +!ELSEIF "$(CFG)" == "optcl - Win32 Debug" + +# Begin Custom Build +InputPath=.\typelib.tcl + +"c:\progra~1\tcl\lib\optcl\scripts\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\scripts\$(InputPath) + +# End Custom Build + +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" + +# Begin Custom Build +InputPath=.\typelib.tcl + +"c:\progra~1\tcl\lib\optcl\scripts\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\scripts\$(InputPath) + +# End Custom Build + +!ENDIF + # End Source File -# End Group # Begin Source File -SOURCE=.\test.tcl +SOURCE=.\Utilities.tcl !IF "$(CFG)" == "optcl - Win32 Release" -# PROP Exclude_From_Build 1 +# Begin Custom Build +InputPath=.\Utilities.tcl + +"c:\progra~1\tcl\lib\optcl\scripts\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\scripts\$(InputPath) + +# End Custom Build !ELSEIF "$(CFG)" == "optcl - Win32 Debug" -# PROP Exclude_From_Build 1 +# Begin Custom Build +InputPath=.\Utilities.tcl + +"c:\progra~1\tcl\lib\optcl\scripts\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\scripts\$(InputPath) -!ELSEIF "$(CFG)" == "optcl - Win32 Release_NoStubs" +# End Custom Build -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 +!ELSEIF "$(CFG)" == "optcl - Win32 Release Static" -!ELSEIF "$(CFG)" == "optcl - Win32 Debug_NoStubs" +# Begin Custom Build +InputPath=.\Utilities.tcl -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 +"c:\progra~1\tcl\lib\optcl\scripts\$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) c:\progra~1\tcl\lib\optcl\scripts\$(InputPath) + +# End Custom Build !ENDIF +# End Source File +# End Group +# Begin Source File + +SOURCE=.\test.tcl # End Source File # End Target # End Project diff --git a/src/optcl.dsw b/src/optcl.dsw new file mode 100644 index 0000000..1b00bbc --- /dev/null +++ b/src/optcl.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "optcl"=.\optcl.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/src/optcl.h b/src/optcl.h index 7e21c66..e50e25e 100644 --- a/src/optcl.h +++ b/src/optcl.h @@ -41,5 +41,5 @@ int TypeLib_Init (Tcl_Interp *pInterp); extern CComPtr g_pmalloc; - +extern bool g_bTkInit; #endif// _OPTCL_H_B229D2A0_616A_11d4_8004_0040055861F2 \ No newline at end of file diff --git a/src/optcl.tcl b/src/optcl.tcl new file mode 100644 index 0000000..c92fd71 --- /dev/null +++ b/src/optcl.tcl @@ -0,0 +1,10 @@ +package provide optcl 3.0 +set env(OPTCL_LIBRARY) [file dirname [info script]] +source [file join $env(OPTCL_LIBRARY) scripts Utilities.tcl] +source [file join $env(OPTCL_LIBRARY) scripts Splitter.tcl] +source [file join $env(OPTCL_LIBRARY) scripts TypeLib.tcl] +source [file join $env(OPTCL_LIBRARY) scripts ImageListBox.tcl] +source [file join $env(OPTCL_LIBRARY) scripts Tooltip.tcl] +if {[info commands tk] != {}} {source [file join $env(OPTCL_LIBRARY) scripts TLView.tcl]} +load [file join $env(OPTCL_LIBRARY) bin optcl.dll] +typelib::updateLibs \ No newline at end of file diff --git a/src/resource.aps b/src/resource.aps deleted file mode 100644 index 28c86bbdf75aa430c38699f694c1c75fd8320e97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50364 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 diff --git a/src/resource.h b/src/resource.h index d253af9..74f1227 100644 --- a/src/resource.h +++ b/src/resource.h @@ -9,7 +9,7 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_RESOURCE_VALUE 104 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 diff --git a/src/resource.rc b/src/resource.rc index 52e366d..54e4d81 100644 --- a/src/resource.rc +++ b/src/resource.rc @@ -21,13 +21,6 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK #pragma code_page(1252) #endif //_WIN32 -///////////////////////////////////////////////////////////////////////////// -// -// TCL_SCRIPT -// - -IDR_TYPELIB TCL_SCRIPT DISCARDABLE "typelib.tcl" - #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // @@ -80,15 +73,15 @@ BEGIN VALUE "Comments", "Requires Tcl/Tk major version 8, minor version >= 1\0" VALUE "CompanyName", "University of East Anglia\0" VALUE "FileDescription", "A Tcl extension for manipulating COM objects.\0" - VALUE "FileVersion", "3,0,0,2\0" + VALUE "FileVersion", "3,0,1,0\0" VALUE "InternalName", "optcl\0" VALUE "LegalCopyright", "Copyright © 1999\0" VALUE "LegalTrademarks", "-\0" VALUE "OriginalFilename", "optcl.dll\0" VALUE "PrivateBuild", "-\0" VALUE "ProductName", "OpTcl\0" - VALUE "ProductVersion", "3,0,0,2\0" - VALUE "SpecialBuild", "-\0" + VALUE "ProductVersion", "3,0,1,0\0" + VALUE "SpecialBuild", "threaded\0" END END BLOCK "VarFileInfo" diff --git a/src/test.tcl b/src/test.tcl index 86b8d60..278d3b3 100644 --- a/src/test.tcl +++ b/src/test.tcl @@ -1,100 +1,8 @@ console show -load optcl +package require optcl - - -proc ie_test {} { - global ie - set ie [optcl::new -window .ie {{8856F961-340A-11D0-A96B-00C04FD705A2}}] - pack .ie - $ie navigate www.wired.com -} - -proc vrml_test {} { - global vrml - set vrml [optcl::new -window .vrml {{4B6E3013-6E45-11D0-9309-0020AFE05CC8}}] - pack .vrml -} - -proc tree_test {} { - global tv - set tv [optcl::new -window .tv {{C74190B6-8589-11D1-B16A-00C0F0283628}}] - pack .tv - set n1 [$tv -with nodes add] - $n1 : text "Node 1" key "1 Node" - optcl::unlock $n1 - set n2 [$tv -with nodes add "1 Node" 4 "2 Node" "Node 2"] - $n2 : text "Node 2.5" - optcl::unlock $n2 -} - -proc dp_test {} { - global dp - destroy .date - set dp [optcl::new -window .date MSComCtl2.DTPicker] - .date config -width 100 -height 20 - pack .date - tlview::viewtype [optcl::class $dp] -} - -proc cal_test {} { - global cal - destroy .cal - set cal [optcl::new -window .cal MSCAL.Calendar] - pack .cal -} - - -proc pb_test {} { - global pb mousedown - - proc PBMouseDown {obj args} { - global mousedown - set mousedown $obj - } - - proc PBMouseUp {args} { - global mousedown - set mousedown {} - } - - proc PBMouseMove {obj button shift x y} { - global mousedown - if {$mousedown == {}} return - if {[string compare $mousedown $obj]==0} { - $obj : value $x - } - } - destroy .pb - set pb [optcl::new -window .pb MSComctlLib.ProgCtrl] - pack .pb - .pb config -width 100 -height 10 - optcl::bind $pb MouseDown PBMouseDown - optcl::bind $pb MouseUp PBMouseUp - optcl::bind $pb MouseMove PBMouseMove -} - - - - -proc word_test {} { - global word - - set word [optcl::new word.application] - $word : visible 1 -} - - -proc tl_test {} { - typelib::load {Microsoft Shell Controls And Automation (Ver 1.0)} - tlview::refview .r - tlview::loadedlibs .l -} - - - -proc cosmo_test {} { - global co - set co [optcl::new -window .co SGI.CosmoPlayer.2] - pack .co -} +set xl [optcl::new Excel.Application] +$xl : visible 1 +$xl -with workbooks add +$xl -with workbooks.item(1).worksheets.item(1).range(a1,d4) : value 16 +set r [$xl -with workbooks.item(1).worksheets.item(1) range a1 d4] diff --git a/src/typelib.cpp b/src/typelib.cpp index 4e2ec52..916ea4b 100644 --- a/src/typelib.cpp +++ b/src/typelib.cpp @@ -32,7 +32,8 @@ #include "typelib.h" #include "objmap.h" #include "optclbindptr.h" - +#include "optcltypeattr.h" +#include //---------------------------------------------------------------- // \/\/\/\/\/\ Declarations /\/\/\/\/\/\/ @@ -63,7 +64,9 @@ TCL_CMDEF(TypeLib_UnloadLib); TCL_CMDEF(TypeLib_IsLibLoaded); TCL_CMDEF(TypeLib_TypesInLib); TCL_CMDEF(TypeLib_TypeInfo); - +TCL_CMDEF(TypeLib_GetRegLibPath); +TCL_CMDEF(TypeLib_GetLoadedLibPath); +TCL_CMDEF(TypeLib_GetDetails); //// TEST CODE //// TCL_CMDEF(TypeLib_ResolveConstantTest); @@ -102,65 +105,35 @@ void TypeLibsTbl::DeleteAll () deltbl(); } - -ITypeLib * TypeLibsTbl::LoadLib (Tcl_Interp *pInterp, const char *fullname) +/* + *------------------------------------------------------------------------- + * TypeLibsTbl::LoadLib -- + * Load a Type Library by it's pathname. + * + * Result: + * Pointer to the TypeLib object iff successful. + * Side Effects: + * Library is added to the cache + *------------------------------------------------------------------------- + */ +TypeLib * TypeLibsTbl::LoadLib (Tcl_Interp *pInterp, const char *pathname) { USES_CONVERSION; CComPtr pLib; - CComPtr pComp; - - TObjPtr cmd, // used to build up a command string - result, // attaches to the result of the above commands' execution - progname; // the programmatic name of the library - GUID guid; - int maj, min; - HRESULT hr; - - Tcl_HashEntry *pEntry = NULL; - TypeLib *ptl; - - if (m_loadedlibs.find(fullname, &pEntry) != NULL) { - ASSERT (pEntry != NULL); - ptl = (TypeLib *)Tcl_GetHashValue (pEntry); - ASSERT (ptl != NULL); - Tcl_SetResult (pInterp, Tcl_GetHashKey (&m_tbl, pEntry), TCL_VOLATILE); - pLib = ptl->m_ptl; - ASSERT (pLib != NULL); - return pLib; - } - - + try { - // get the guid, max and min version numbers - cmd.create(); - cmd = "typelib::libdetail"; - cmd.lappend (fullname); - if (Tcl_GlobalEvalObj (pInterp, cmd) == TCL_ERROR) return NULL; - result.attach(Tcl_GetObjResult(pInterp), false); - if (result.llength() != 3) - throw ("expected three elements in the library description"); - - maj = result.lindex (1); - min = result.lindex (2); - hr = CLSIDFromString (A2OLE(result.lindex(0)), &guid); - if (FAILED(hr)) - throw ("failed to convert identifier"); - - // load the library - hr = LoadRegTypeLib (guid, maj, min, LOCALE_SYSTEM_DEFAULT, &pLib); + CComPtr pComp; + TObjPtr progname, fullname; + Tcl_HashEntry *pEntry = NULL; + HRESULT hr; + + hr = LoadTypeLibEx(A2OLE(pathname), REGKIND_NONE, &pLib); CHECKHR(hr); + ASSERT(pLib != NULL); if (pLib == NULL) throw ("failed to bind to a type library"); - // get the programmatic name of the library - TypeLib_GetName (pLib, NULL, progname); - - hr = pLib->GetTypeComp(&pComp); - if (FAILED(hr)) - throw ("failed to get the compiler interface for library"); - - Cache (progname, fullname, pLib, pComp); - Tcl_SetResult (pInterp, (char*)(const char*)progname, TCL_VOLATILE); + return Cache (pInterp, pLib, pathname); } catch (char *error) { @@ -170,7 +143,7 @@ ITypeLib * TypeLibsTbl::LoadLib (Tcl_Interp *pInterp, const char *fullname) Tcl_SetResult (pInterp, (char*)HRESULT2Str(hr), TCL_DYNAMIC); } - return pLib; + return NULL; } @@ -188,32 +161,107 @@ ITypeLib * TypeLibsTbl::LoadLib (Tcl_Interp *pInterp, const char *fullname) * None. *------------------------------------------------------------------------- */ -TypeLib* TypeLibsTbl::Cache (const char *szname, const char *szfullname, ITypeLib *ptl, ITypeComp *ptc) +TypeLib* TypeLibsTbl::Cache (Tcl_Interp *pInterp, ITypeLib *ptl, const char * path /* = NULL */) { - ASSERT(szname != NULL && szfullname != NULL); - ASSERT (ptl != NULL && ptc != NULL); + TLIBATTR * ptlattr = NULL; + CComPtr ptc; TypeLib *pLib = NULL; Tcl_HashEntry *pEntry = NULL; - pLib = new TypeLib (ptl, ptc); - pEntry = set(szname, pLib); - ASSERT (pEntry != NULL); - m_loadedlibs.set (szfullname, pEntry); + if (FAILED(ptl->GetLibAttr(&ptlattr))) { + if (pInterp) + Tcl_SetResult (pInterp, "couldn't retrieve type library attributes", TCL_STATIC); + return NULL; + } + + ASSERT(ptlattr != NULL); + + TypeLibUniqueID uid (ptlattr->guid, ptlattr->wMajorVerNum, ptlattr->wMinorVerNum); + + + ptl->ReleaseTLibAttr(ptlattr); + + // search for this guid + if (m_loadedlibs.find(&uid, &pEntry) != NULL) { + ASSERT (pEntry != NULL); + pLib = (TypeLib *)Tcl_GetHashValue (pEntry); + return pLib; + } + + // now generate the names, and do a search on the programmatic name + TObjPtr progname, fullname; + GenerateNames(progname, fullname, ptl); + + if (g_libs.find((char*)progname, &pLib) != NULL) { + if (pInterp) + Tcl_SetResult (pInterp, "library already loaded with the same programmatic name", TCL_STATIC); + return NULL; + } + + if (FAILED(ptl->GetTypeComp(&ptc))) { + if (pInterp) + Tcl_SetResult (pInterp, "failed to retrieve the ITypeComp interface", TCL_STATIC); + return NULL; + } + + pLib = new TypeLib (); + if (FAILED(pLib->Init(ptl, ptc, progname, fullname, path))) { + delete pLib; + pLib = NULL; + } else { + pEntry = set(progname, pLib); + ASSERT (pEntry != NULL); + m_loadedlibs.set (&uid, pEntry); + } + return pLib; } -bool TypeLibsTbl::IsLibLoaded (const char *fullname) +TypeLib * TypeLibsTbl::TypeLibFromUID (const GUID &guid, WORD maj, WORD min) { - ASSERT (fullname != NULL); - return (m_loadedlibs.find (fullname) != NULL); + TypeLibUniqueID uid(guid, maj, min); + TypeLib *plib = NULL; + Tcl_HashEntry *pEntry = NULL; + m_loadedlibs.find(&uid, &pEntry); + if (pEntry) + plib = (TypeLib*)Tcl_GetHashValue (pEntry); + return plib; } + +char * TypeLibsTbl::GetFullName (char * szProgName) +{ + ASSERT (szProgName != NULL); + TypeLib * pLib = NULL; + char * result = NULL; + if (find(szProgName, &pLib) != end()) { + ASSERT (pLib != NULL); + result = pLib->m_fullname; + } + return result; +} + + + +GUID * TypeLibsTbl::GetGUID (char * szProgName) +{ + ASSERT (szProgName != NULL); + TypeLib * pLib = NULL; + GUID * result = NULL; + if (find(szProgName, &pLib) != end()) { + ASSERT (pLib != NULL && pLib->m_libattr != NULL); + result = &(pLib->m_libattr->guid); + } + return result; +} + + /* *------------------------------------------------------------------------- * TypeLibsTbl::UnloadLib -- - * Given the fullname of a library, the routine unloads it, if it is + * Given the programmatic name of a library, the routine unloads it, if it is * loaded. * * Result: @@ -223,22 +271,73 @@ bool TypeLibsTbl::IsLibLoaded (const char *fullname) * None. *------------------------------------------------------------------------- */ -void TypeLibsTbl::UnloadLib (Tcl_Interp *pInterp, const char *fullname) +void TypeLibsTbl::UnloadLib (Tcl_Interp *pInterp, const char *szprogname) { Tcl_HashEntry *pEntry = NULL; TypeLib *ptl = NULL; + pEntry = g_libs.find(szprogname, &ptl); - if (!m_loadedlibs.find (fullname, &pEntry)) + if (pEntry == NULL) return; - ASSERT (pEntry != NULL); - ptl = (TypeLib*)Tcl_GetHashValue (pEntry); - ASSERT (ptl != NULL); + ASSERT (ptl != NULL && ptl->m_ptl != NULL); + + TObjPtr progname, fullname; + HRESULT hr = GenerateNames(progname, fullname, ptl->m_ptl); + + if (FAILED(hr)) { + Tcl_SetResult (pInterp, HRESULT2Str(hr), TCL_DYNAMIC); + return; + } + ASSERT (fullname != (Tcl_Obj*)(NULL)); + TypeLibUniqueID uid (ptl->m_libattr->guid, ptl->m_libattr->wMajorVerNum, ptl->m_libattr->wMinorVerNum); + m_loadedlibs.delete_entry(&(uid)); delete ptl; - m_loadedlibs.delete_entry(fullname); Tcl_DeleteHashEntry (pEntry); } +/* + *------------------------------------------------------------------------- + * TypeLibsTbl::GenerateNames -- + * Given a type library, generates the programmatic and full name for the + * library. + * + * Result: + * S_OK iff successful. + * + * Side Effects: + * The objects, progname and username allocate memory to store the + * names. + *------------------------------------------------------------------------- + */ +HRESULT TypeLibsTbl::GenerateNames (TObjPtr &progname, TObjPtr &username, ITypeLib *pLib) +{ + USES_CONVERSION; + ASSERT (pLib != NULL); + CComBSTR bprogname, busername; + HRESULT hr; + hr = pLib->GetDocumentation(-1, &bprogname, &busername, NULL, NULL); + if (FAILED(hr)) return hr; + + TLIBATTR * pattr = NULL; + hr = pLib->GetLibAttr (&pattr); + if (FAILED(hr)) return hr; + + ASSERT (pattr != NULL); + TDString str; + if (busername != NULL) + str << OLE2A(busername); + else + str << OLE2A(bprogname); + str << " (Ver " << pattr->wMajorVerNum << "." << pattr->wMinorVerNum << ")"; + pLib->ReleaseTLibAttr(pattr); + + username.create(); + username = str; + progname.create(); + progname = OLE2A(bprogname); + return hr; +} @@ -256,42 +355,7 @@ void TypeLibsTbl::UnloadLib (Tcl_Interp *pInterp, const char *fullname) */ TypeLib *TypeLibsTbl::EnsureCached (ITypeLib *ptl) { - USES_CONVERSION; - - ASSERT (ptl != NULL); - TDString verfullname; - TypeLib *pLib = NULL; - TLIBATTR *pattr = NULL; - HRESULT hr; - BSTR name = NULL, - fullname = NULL; - char *szname, *szfullname; - Tcl_HashEntry *pEntry = NULL; - CComPtr ptc; - - // get the libraries different names - hr = ptl->GetDocumentation(-1, &name, &fullname, NULL, NULL); - CHECKHR(hr); - szname = W2A(name); - szfullname = W2A(fullname); - FreeBSTR(name); - FreeBSTR(fullname); - if (find(szname, &pLib)) - return pLib; // cached already - - // build the fullname+version string - hr = ptl->GetLibAttr(&pattr); - CHECKHR(hr); - verfullname.set (szfullname) << " (Ver " << short(pattr->wMajorVerNum) << "." << - short(pattr->wMinorVerNum) << ")"; - ptl->ReleaseTLibAttr (pattr); pattr = NULL; - - // get the compiler interface - hr = ptl->GetTypeComp (&ptc); - CHECKHR(hr); - // now cache the lot - pLib = Cache (szname, verfullname, ptl, ptc); - return pLib; + return Cache(NULL, ptl); } @@ -314,7 +378,7 @@ TypeLib *TypeLibsTbl::EnsureCached (ITypeInfo *pInfo) UINT tmp; HRESULT hr; hr = pInfo->GetContainingTypeLib(&pLib, &tmp); - CHECKHR(hr); + if (FAILED(hr)) return NULL; return EnsureCached (pLib); } @@ -329,13 +393,17 @@ int TypeLib_Init (Tcl_Interp *pInterp) { OleInitialize(NULL); Tcl_CreateExitHandler (TypeLib_Exit, NULL); - Tcl_CreateObjCommand (pInterp, "typelib::loaded", TypeLib_LoadedLibs, NULL, NULL); - Tcl_CreateObjCommand (pInterp, "typelib::load", TypeLib_LoadLib, NULL, NULL); + Tcl_CreateObjCommand (pInterp, "typelib::loadedlibs", TypeLib_LoadedLibs, NULL, NULL); + Tcl_CreateObjCommand (pInterp, "typelib::_load", TypeLib_LoadLib, NULL, NULL); Tcl_CreateObjCommand (pInterp, "typelib::unload", TypeLib_UnloadLib, NULL, NULL); Tcl_CreateObjCommand (pInterp, "typelib::types", TypeLib_TypesInLib, NULL, NULL); Tcl_CreateObjCommand (pInterp, "typelib::typeinfo", TypeLib_TypeInfo, NULL, NULL); Tcl_CreateObjCommand (pInterp, "typelib::isloaded", TypeLib_IsLibLoaded, NULL, NULL); + Tcl_CreateObjCommand (pInterp, "typelib::reglib_path", TypeLib_GetRegLibPath, NULL, NULL); + Tcl_CreateObjCommand (pInterp, "typelib::loadedlib_path", TypeLib_GetLoadedLibPath, NULL, NULL); + Tcl_CreateObjCommand (pInterp, "typelib::loadedlib_details", TypeLib_GetDetails, NULL, NULL); + //// TESTS //// Tcl_CreateObjCommand (pInterp, "typelib::resolveconst", TypeLib_ResolveConstantTest, NULL, NULL); @@ -599,6 +667,8 @@ void TypeLib_GetName (ITypeLib *pLib, ITypeInfo *pInfo, TObjPtr &pname) bLibcreate = true; } // get the library programmatic name + + hr = pLib->GetDocumentation (-1, &progname, NULL, NULL, NULL); CHECKHR(hr); @@ -1203,10 +1273,30 @@ int TypeLib_DescribeTypeInfo (Tcl_Interp *pInterp, ITypeInfo *pti) default: presult = "???"; break; } + presult.lappend(methods).lappend(properties).lappend(inherited); - cmdresult = TCL_OK; + + + if (SUCCEEDED(pti->GetDocumentation (MEMBERID_NIL, NULL, &bdoc, NULL, NULL)) && bdoc != NULL) + { + presult.lappend (OLE2A(bdoc)); + SysFreeString (bdoc); + } + else + presult.lappend (""); + + LPOLESTR lpsz; + CHECKHR(StringFromCLSID (pta->guid, &lpsz)); + ASSERT (lpsz != NULL); + if (lpsz != NULL) { + presult.lappend(OLE2A (lpsz)); + CoTaskMemFree (lpsz); lpsz = NULL; + } } + Tcl_SetObjResult (pInterp, presult); + cmdresult = TCL_OK; + ReleaseTypeAttr (pti, pta); } catch (HRESULT hr) { @@ -1218,18 +1308,6 @@ int TypeLib_DescribeTypeInfo (Tcl_Interp *pInterp, ITypeInfo *pti) throw (error); } - if (cmdresult == TCL_OK) { - if (SUCCEEDED(pti->GetDocumentation (MEMBERID_NIL, NULL, &bdoc, NULL, NULL)) && bdoc != NULL) - { - presult.lappend (OLE2A(bdoc)); - SysFreeString (bdoc); - } - else - presult.lappend (""); - - Tcl_SetObjResult (pInterp, presult); - } - return cmdresult; } @@ -1522,7 +1600,7 @@ TCL_CMDEF(TypeLib_LoadedLibs) *------------------------------------------------------------------------- * TypeLib_LoadLib -- * Ensures that a given library is loaded. A library is described in terms - * of its full human-readable name. + * of its filename. * * Result: * TCL_OK iff successful. @@ -1534,14 +1612,16 @@ TCL_CMDEF(TypeLib_LoadedLibs) TCL_CMDEF(TypeLib_LoadLib) { if (objc != 2) { - Tcl_WrongNumArgs (pInterp, 1, objv, "full_libname"); + Tcl_WrongNumArgs (pInterp, 1, objv, "library_path"); return TCL_ERROR; } TObjPtr libname; libname.attach(objv[1], false); - if (g_libs.LoadLib (pInterp, libname) != NULL) + TypeLib * pLib = g_libs.LoadLib (pInterp, libname); + if (pLib) { + Tcl_SetResult (pInterp, pLib->m_progname, TCL_VOLATILE); return TCL_OK; - else + } else return TCL_ERROR; } @@ -1585,16 +1665,34 @@ TCL_CMDEF(TypeLib_UnloadLib) */ TCL_CMDEF(TypeLib_IsLibLoaded) { - if (objc != 2) { - Tcl_WrongNumArgs (pInterp, 1, objv, "fullname_library"); + USES_CONVERSION; + if (objc != 4) { + Tcl_WrongNumArgs (pInterp, 1, objv, "lib_guid majorver minorver"); return TCL_ERROR; } - TObjPtr name; - TObjPtr value; - value.create(false); - name.attach(objv[1]); - value = g_libs.IsLibLoaded(name); - Tcl_SetObjResult (pInterp, value); + GUID guid; + long maj, min; + + char * szguid = Tcl_GetStringFromObj (objv[1], NULL); + ASSERT (szguid != NULL); + if (FAILED(CLSIDFromString(A2OLE(szguid), &guid))) { + Tcl_SetResult (pInterp, "string isn't a guid", TCL_STATIC); + return TCL_ERROR; + } + + if (Tcl_GetLongFromObj(pInterp, objv[2], &maj) == TCL_ERROR) + return TCL_ERROR; + + if (Tcl_GetLongFromObj(pInterp, objv[3], &min) == TCL_ERROR) + return TCL_ERROR; + + TypeLib * pLib = NULL; + + pLib = g_libs.TypeLibFromUID(guid, maj, min); + Tcl_ResetResult (pInterp); + if (pLib) + Tcl_SetObjResult(pInterp, pLib->m_progname); + return TCL_OK; } @@ -1687,7 +1785,62 @@ TCL_CMDEF (TypeLib_TypesInLib) +HRESULT TypeLib_GetDefaultInterface (ITypeInfo *pti, bool bEventSource, ITypeInfo ** ppdefti) { + ASSERT (pti != NULL && ppdefti != NULL); + OptclTypeAttr attr; + attr = pti; + ASSERT (attr.m_pattr != NULL); + if (attr->typekind != TKIND_COCLASS) + return E_FAIL; + HRESULT hr; + WORD selected = -1; + + for (WORD index = 0; index < attr->cImplTypes; index++) { + + INT implflags; + hr = pti->GetImplTypeFlags(index, &implflags); + if (FAILED(hr)) return hr; + + if ( ((implflags & IMPLTYPEFLAG_FDEFAULT) == IMPLTYPEFLAG_FDEFAULT) && + ((bEventSource && (implflags & IMPLTYPEFLAG_FSOURCE) == IMPLTYPEFLAG_FSOURCE) || + (!bEventSource && (implflags & IMPLTYPEFLAG_FSOURCE) != (IMPLTYPEFLAG_FSOURCE))) + ) { + break; + } + } + if (index == attr->cImplTypes) + return E_FAIL; + + CComPtr pimpl; + HREFTYPE hreftype; + + // retrieve the referenced typeinfo + hr = pti->GetRefTypeOfImplType(index, &hreftype); + if (FAILED(hr)) return hr; + + hr = pti->GetRefTypeInfo(hreftype, &pimpl); + if (FAILED(hr)) return hr; + OptclTypeAttr pimplattr; + pimplattr = pimpl; + + // resolve typedefs + while (pimplattr->typekind == TKIND_ALIAS) { + CComPtr pref; + hr = pimpl->GetRefTypeInfo(pimplattr->tdescAlias.hreftype, &pref); + if (FAILED(hr)) return hr; + pimpl = pref; + pimplattr = pimpl; + } + + // if this isn't an interface forget it + if ((pimplattr->typekind != TKIND_DISPATCH) && + (pimplattr->typekind != TKIND_INTERFACE)) + return E_FAIL; + + // okay - return the typeinfo to the caller + return pimpl.CopyTo(ppdefti); +} @@ -1747,6 +1900,102 @@ TCL_CMDEF(TypeLib_TypeInfo) } + + + + + +TCL_CMDEF(TypeLib_GetRegLibPath) +{ + USES_CONVERSION; + if (objc != 4) { + Tcl_WrongNumArgs (pInterp, 1, objv, "lib_id majver minver"); + return TCL_ERROR; + } + + char * szGuid = Tcl_GetStringFromObj (objv[1], NULL); + long maj, min; + + if (Tcl_GetLongFromObj(pInterp, objv[2], &maj) == TCL_ERROR) + return TCL_ERROR; + + if (Tcl_GetLongFromObj(pInterp, objv[3], &min) == TCL_ERROR) + return TCL_ERROR; + + GUID guid; + if (FAILED(CLSIDFromString(A2OLE(szGuid), &guid))) { + Tcl_SetResult (pInterp, "failed to convert to a guid: ", TCL_STATIC); + Tcl_AppendResult (pInterp, szGuid, NULL); + return TCL_ERROR; + } + + CComBSTR path; + HRESULT hr = QueryPathOfRegTypeLib(guid, maj, min, LOCALE_SYSTEM_DEFAULT, &path); + if (FAILED(hr)) { + Tcl_SetResult (pInterp, HRESULT2Str(hr), TCL_DYNAMIC); + return TCL_ERROR; + } + Tcl_SetResult (pInterp, W2A(path), TCL_VOLATILE); + return TCL_OK; +} + +TCL_CMDEF(TypeLib_GetLoadedLibPath) +{ + if (objc != 2) { + Tcl_WrongNumArgs (pInterp, 1, objv, "progname"); + return TCL_ERROR; + } + char * szProgName = Tcl_GetStringFromObj(objv[1], NULL); + ASSERT (szProgName); + + TypeLib * plib = NULL; + g_libs.find(szProgName, &plib); + if (plib==NULL) { + Tcl_SetResult (pInterp, "couldn't find loaded library: ", TCL_STATIC); + Tcl_AppendResult (pInterp, szProgName, NULL); + return TCL_ERROR; + } + Tcl_SetObjResult (pInterp, plib->m_path); + return TCL_OK; +} + + +TCL_CMDEF(TypeLib_GetDetails) +{ + USES_CONVERSION; + if (objc != 2) { + Tcl_WrongNumArgs (pInterp, 1, objv, "progname"); + return TCL_ERROR; + } + char * szProgName = Tcl_GetStringFromObj (objv[1], NULL); + ASSERT(szProgName); + TypeLib * plib = NULL; + g_libs.find(szProgName, &plib); + if (plib == NULL) { + Tcl_SetResult (pInterp, "couldn't find loaded library: ", TCL_STATIC); + Tcl_AppendResult (pInterp, szProgName, NULL); + return TCL_ERROR; + } + TObjPtr obj; + obj.create(); + LPOLESTR pstr; + HRESULT hr; + hr = StringFromCLSID(plib->m_libattr->guid, &pstr); + if (FAILED(hr)) { + Tcl_SetResult (pInterp, HRESULT2Str(hr), TCL_DYNAMIC); + return TCL_ERROR; + } + obj.lappend(OLE2A(pstr)); + CoTaskMemFree(pstr); + obj.lappend(plib->m_libattr->wMajorVerNum); + obj.lappend(plib->m_libattr->wMinorVerNum); + obj.lappend(plib->m_path); + obj.lappend(plib->m_fullname); + Tcl_SetObjResult (pInterp, obj); + return TCL_OK; +} + + /* *------------------------------------------------------------------------- * TypeLib_ResolveName -- @@ -1761,6 +2010,7 @@ TCL_CMDEF(TypeLib_TypeInfo) * *------------------------------------------------------------------------- */ + void TypeLib_ResolveName (const char * lib, const char * type, TypeLib **pptl, ITypeInfo **ppinfo) { @@ -1884,7 +2134,7 @@ bool TypeLib_ResolveConstant (Tcl_Interp *pInterp, ITypeInfo *pti, ASSERT (bp.lpvardesc->lpvarValue != NULL); if (bp.lpvardesc->lpvarValue == NULL) throw ("constant didn't have a associated value!"); - var2obj (pInterp, *(bp.lpvardesc->lpvarValue), pObj); + var2obj (pInterp, *(bp.lpvardesc->lpvarValue), NULL, pObj); pti->ReleaseVarDesc (bp.lpvardesc); return true; } @@ -2006,3 +2256,4 @@ TCL_CMDEF(TypeLib_ResolveConstantTest) return TCL_ERROR; } + diff --git a/src/typelib.h b/src/typelib.h index 907709a..8e1610b 100644 --- a/src/typelib.h +++ b/src/typelib.h @@ -34,14 +34,55 @@ struct TypeLib { CComPtr m_ptl; CComPtr m_ptc; + TLIBATTR * m_libattr; + + TObjPtr m_progname, m_fullname, m_path; + + + TypeLib () { + m_progname.create(); + m_fullname.create(); + m_path.create(); + m_libattr = NULL; + } + + ~TypeLib () { + if (m_libattr != NULL) { + ASSERT (m_ptl != NULL); + m_ptl->ReleaseTLibAttr(m_libattr); + } + } + + HRESULT Init (ITypeLib *ptl, ITypeComp *ptc, const char * progname, + const char * fullname, const char * path) { + ASSERT (progname != NULL && fullname != NULL); - TypeLib (ITypeLib *ptl, ITypeComp *ptc) { m_ptl = ptl; m_ptc = ptc; + + m_progname = progname; + m_fullname = fullname; + if (path) + m_path = path; + else + m_path = "???"; + return ptl->GetLibAttr(&m_libattr); } }; +struct TypeLibUniqueID { + TypeLibUniqueID (const GUID & guid, WORD maj, WORD min) { + m_guid = guid; + m_majorver = maj; + m_minorver = min; + } + + GUID m_guid; + WORD m_majorver; + WORD m_minorver; +}; + // TypeLibsTbl - a hash table mapping library programmatic name to a TypeLib structure // Internally it also holds a mapping from the a libraries human readable name to @@ -51,19 +92,28 @@ class TypeLibsTbl : public THash public: TypeLibsTbl (); virtual ~TypeLibsTbl (); + void DeleteAll (); - ITypeLib* LoadLib (Tcl_Interp *pInterp, const char *fullname); - void UnloadLib (Tcl_Interp *pInterp, const char *fullname); - bool IsLibLoaded (const char *fullname); + + TypeLib* LoadLib (Tcl_Interp *pInterp, const char * fullpath); + void UnloadLib (Tcl_Interp *pInterp, const char * progname); + TypeLib* TypeLibFromUID (const GUID & guid, WORD maj, WORD min); + TypeLib* EnsureCached (ITypeLib *pLib); TypeLib* EnsureCached (ITypeInfo *pInfo); + + char* GetFullName (char * szProgName); + GUID* GetGUID (char * szProgName); + protected: // methods - TypeLib* Cache (const char *szname, const char *szfullname, ITypeLib *ptl, ITypeComp *ptc); + TypeLib* Cache (Tcl_Interp * pInterp, ITypeLib *ptl, const char * path = NULL); + HRESULT GenerateNames (TObjPtr &progname, TObjPtr &username, ITypeLib *pLib); protected: // properties - THash m_loadedlibs; // by name + THash m_loadedlibs; // by unique and full descriptor }; + // globals extern TypeLibsTbl g_libs; @@ -76,6 +126,6 @@ bool TypeLib_ResolveConstant (Tcl_Interp *pInterp, char *fullformatname, TObjPtr &pObj, ITypeInfo *pInfo = NULL); bool TypeLib_ResolveConstant (Tcl_Interp *pInterp, ITypeInfo *pti, const char *member, TObjPtr &pObj); - +HRESULT TypeLib_GetDefaultInterface (ITypeInfo *pti, bool bEventSource, ITypeInfo ** ppdefti); #endif // _TYPELIB_H_62518A80_624A_11d4_8004_0040055861F2 \ No newline at end of file diff --git a/src/typelib.tcl b/src/typelib.tcl index ac19136..7d8b00c 100644 --- a/src/typelib.tcl +++ b/src/typelib.tcl @@ -1,26 +1,78 @@ package require registry -package provide optcl 3.0 namespace eval typelib { - variable syslibs - variable syslibguids - array set syslibs {} - array set syslibguids {} + variable typelibraries + array set typelibraries {} + + + namespace export * + namespace import -force ::optcl_utils::* # ----------------------------------------------------------------------------- - # updatelibs -- called to enumerate and store the system libraries - proc updatelibs {} { - variable syslibs; - catch {unset syslibs} - array set syslibs {} + # latest_typelib_version -- + # For a given registered type library guid, it retrieves the most recent version + # number of the library, and returns a string giving a version qualified string + # description for the library. Returns {} iff failed. + # + proc latest_typelib_version {typelib_guid} { + set typelibpath HKEY_CLASSES_ROOT\\TypeLib\\$typelib_guid + if {[registry keys HKEY_CLASSES_ROOT\\TypeLib $typelib_guid] == {}} { + puts "couldn't find typelib $typelib" + return {} + } + set v [lindex [lsort -decreasing -real [registry keys $typelibpath]] 0] + + if {$v == {}} { + puts "bad typelib version number: $v for $typelib_guid" + set result {} + } else { + set result [makelibname $typelib $v] + } + return $result + } + + # makelibname -- + # standard function for creating a library's human readable name from the + # registered guid. + # + proc makelibname {typelib_guid ver} { + set maj 0 + set min 0 + scan $ver "%d.%d" maj min + return "[registry get HKEY_CLASSES_ROOT\\TypeLib\\$typelib_guid\\$ver {}] (Ver $maj.$min)" + } + + proc path_from_libname {libname} { + variable typelibraries + set r [array get typelibraries $libname] + if {$r == {}} { + error "library does not exist: $libname" + } + set libsettings [lindex $r 1] + return [eval path_from_libid $libsettings] + } + # updateLibs -- called to enumerate and store the system libraries + proc updateLibs {} { + variable typelibraries; + + # enumerate the current type libraries to make sure that they're still there + foreach library [array names typelibraries] { + try { + mset {name path} $typelibraries($library) + if {![file exists $path]} {throw {}} + } catch {er} { + unset typelibraries($library) + } + } + # now iterate over the registered type libraries in the system set root {HKEY_CLASSES_ROOT\TypeLib} foreach id [registry keys $root] { - catch { + try { foreach v [registry keys $root\\$id] { scan $v "%d.%d" maj min; if [catch { @@ -32,60 +84,93 @@ namespace eval typelib { continue; } - set name "[registry get $root\\$id\\$v {}] (Ver $maj.$min)" - set syslibs($name) [list $id $maj $min] + set name [makelibname $id $maj.$min] + set path [typelib::reglib_path $id $maj $min] + addLibrary $name $id $maj $min $path } + } catch {e} { + puts $e } } } - # ----------------------------------------------------------------------------- - # categories -- returns the component categories - proc categories {} { + proc addLibrary {name typelib_id maj min path} { + variable typelibraries + set typelibraries([list [string toupper $typelib_id] $maj $min]) [list $name $path] + } - set alldata {} - set k "HKEY_CLASSES_ROOT\\Component Categories" - set cats [registry keys $k] + proc persistLoaded {} { + set cmd "typelib::loadLibsFromDetails" + lappend cmd [getLoadedLibsDetails] + return $cmd + } - foreach cat $cats { - set values [registry values $k\\$cat] - set data {} - foreach value $values { - lappend data [registry get $k\\$cat $value] - } - lappend alldata $data + # getLoadedLibsDetails -- + # Retrieves a list of descriptors for the current loaded libraries + proc getLoadedLibsDetails {} { + set result {} + foreach progname [typelib::loadedlibs] { + lappend result [typelib::loadedlib_details $progname] } + return $result + } - return $alldata + proc loadLibsFromDetails {details} { + foreach libdetail $details { + loadLibFromDetail $libdetail + } } + proc loadLibFromDetail {libdetail} { + variable typelibraries + mset {guid maj min path fullname} $libdetail + # if the library is already registered, get the path from the registry + mset { _ regpath} [lindex [array get typelibraries [list $guid $maj $min]] 1] + if {$regpath != {}} { + set path $regpath + } + + typelib::load $path + addLibrary $fullname $guid $maj $min $path + } + + proc load {path} { + set progname [typelib::_load $path] + mset {guid maj min path fullname} [typelib::loadedlib_details $progname] + addLibrary $fullname $guid $maj $min $path + return $progname + } # ----------------------------------------------------------------------------- - # libdetail -- returns a the id, maj and min version number - # in a list if it exists, else throws an error + + # libdetail -- + # returns the id, maj and min version numbers and + # the path as a list if they exists, else throws an error. + # proc libdetail {name} { - variable syslibs + variable typelibraries - if {[array names syslibs $name] == {}} { + if {[array names typelibraries $name] == {}} { error "could not find the library '$name'" } - return [lindex [array get syslibs $name] 1] + return [lindex [array get typelibraries $name] 1] } #------------------------------------------------------------------------------ - # alllibs -- returns all the registered libraries by name + # alllibs -- returns all the registered libraries by {guid maj min} identification proc alllibs {} { - variable syslibs - return [array names syslibs] + variable typelibraries + return [array names typelibraries] } + # returns the fully qualified default interface for a com class proc defaultinterface {classtype} { set desc [typelib::typeinfo $classtype] if {[llength $desc] != 3} { @@ -101,522 +186,174 @@ namespace eval typelib { } #------------------------------------------------------------------------------ - updatelibs - } +namespace eval COM { + namespace import -force ::typelib::* -if {[info commands tk] != {}} { - namespace eval tlview { - catch {font delete tlviewertext} - catch {font delete tlviewerhigh} - catch {font delete tlviewerbold} - font create tlviewertext -family Arial -size 9 -weight normal - font create tlviewerhigh -family Arial -size 9 -weight bold - font create tlviewerbold -family Arial -size 9 -weight bold - - variable bgcolor white - variable textcolor black - variable highlightcolor blue - variable selectcolor red - variable labelcolor red - - array set viewedtypes {} - - #------------------------------------------------------------------------------ - proc scrltxt {w {sb {x y}}} { - variable bgcolor; - frame $w -bd 2 -relief sunken; - - text $w.t -bg $bgcolor -bd 0 -relief flat -cursor arrow -width 40 -height 20 - grid $w.t -column 0 -row 0 -sticky nsew; + # categories + # retrieve a list of all category names + proc categories {} { + set alldata {} + set k "HKEY_CLASSES_ROOT\\Component Categories" + set cats [registry keys $k] - if {[lsearch $sb x] >= 0} { - scrollbar $w.x -orient horizontal -command [list $w.t xview] - $w.t config -xscrollcommand [list $w.x set] -wrap none - grid $w.x -column 0 -row 1 -sticky ew; - } - if {[lsearch $sb y] >= 0} { - scrollbar $w.y -orient vertical -command [list $w.t yview] - $w.t config -yscrollcommand [list $w.y set] - grid $w.y -column 1 -row 0 -sticky ns; + foreach cat $cats { + set values [registry values $k\\$cat] + set data {} + foreach value $values { + lappend data [registry get $k\\$cat $value] } - - grid columnconfigure $w 0 -weight 1; - grid rowconfigure $w 0 -weight 1; - } - - - #------------------------------------------------------------------------------ - proc cl_list {w} { - variable bgcolor - frame $w -bd 2 -relief sunken - canvas $w.c -yscrollcommand "$w.v set" -xscrollcommand "$w.h set" -bd 0 -relief flat -cursor arrow -bg $bgcolor -highlightthickness 0 - scrollbar $w.h -orient horizontal -command "$w.c xview" - scrollbar $w.v -orient vertical -command "$w.c yview" - - grid $w.c -column 0 -row 0 -sticky news - grid $w.h -column 0 -row 1 -sticky ew - grid $w.v -column 1 -row 0 -sticky ns - grid columnconfigure $w 0 -weight 1 - grid rowconfigure $w 0 -weight 1 - bind $w.c <1> { focus %W } - bind $w.c { %W yview scroll -1 pages} - bind $w.c { %W yview scroll 1 pages} - return $w + lappend alldata $data } + return $alldata + } - proc cl_list_update {w} { - variable ::typelib::syslibs - variable bgcolor - - if {![winfo exists $w]} { - error "expected to find a TypeLib list widget: $w" - } - - set c $w.c - $c delete all + # collate all the category names under the category clsid (parameter 1) into an + # array passed by name + proc collate_category_names {category arrname} { + upvar $arrname categories - foreach tl [lsort [array names ::typelib::syslibs]] { - cl_list_addlib $w $tl + set ck "HKEY_CLASSES_ROOT\\Component Categories\\$category" + catch { + foreach value [registry values $ck] { + catch {set categories([registry get $ck $value]) ""} } - } - - - - proc cl_list_addlib {w tl} { - variable bgcolor - - set c $w.c - set bbox [$c bbox entry] - if {$bbox == {}} {set bbox {0 0 10 10}} - set bottom [lindex $bbox 3] - set bottom [expr int($bottom) + 3] - set tag [$c create text 10 $bottom -anchor nw -fill black -font tlviewertext -justify left -text $tl -tags entry] - $c bind $tag <1> [namespace code "cl_list_press $w $tag"] - cl_list_updatetag $w $tag + } err + return $err + } - set bbox [$c bbox entry] - set sr [list 0 0 [lindex $bbox 2] [expr $bottom + 20]] - $c config -scrollregion $sr - } + # collates all categories for a given clsid in an array that is passed by name + proc clsid_categories_to_array {clsid arrname} { + upvar $arrname categories + set k "HKEY_CLASSES_ROOT\\CLSID\\$clsid" + + # catch if there aren't any implemented categories - proc cl_list_updatetag {w tag} { - variable textcolor - variable highlightcolor + foreach subkey [registry keys "HKEY_CLASSES_ROOT\\CLSID\\$clsid"] { + switch $subkey { + {Implemented Categories} { + foreach category [registry keys "$k\\$subkey"] { + collate_category_names $category categories + } + } - set c $w.c - set tl [$c itemcget $tag -text] + Programmable { + array set categories {{Automation Objects} {}} + } - if {![typelib::isloaded $tl]} { - $c itemconfig $tag -fill $textcolor -font tlviewertext - } else { - $c itemconfig $tag -fill $highlightcolor -font tlviewerhigh - } - } + Control { + array set categories {Controls {}} + } + DocObject { + array set categories {{Document Objects} {}} + } - proc cl_list_press {w tag} { - set c $w.c - set tl [$c itemcget $tag -text] - set parent [winfo parent $w] - - if {![typelib::isloaded $tl]} { - # loading typelib - if {[catch {typelib::load $tl} progname]} { - puts $progname - $parent.error config -text [string trim $progname] - } else { - puts "loaded $progname" - $parent.error config -text "loaded $progname" - loadedlibs_updateall + Insertable { + array set categories {{Embeddable Objects} {}} + } } - } else { - typelib::unload $tl - puts "unloaded $tl" - $parent.error config -text "unloaded $tl" - loadedlibs_updateall } - - cl_list_updatetag $w $tag - } - - - - proc refview {w} { - toplevel $w - wm title $w "Referenced Type Libraries" - bind $w "destroy $w" - bind $w "$w.close invoke" - bind $w "$w.refresh config -relief sunken; update; $w.refresh invoke; $w.refresh config -relief raised" - button $w.close -text Close -width 7 -command "destroy $w" -underline 0 - button $w.refresh -text Refresh -width 7 -command [namespace code "cl_list_update $w.list"] -underline 0 - label $w.error -bd 1 -relief sunken - - grid [cl_list $w.list] -column 0 -row 0 -columnspan 2 -sticky nsew - grid $w.close -column 0 -row 1 -padx 5 -pady 5 - grid $w.refresh -column 1 -row 1 -padx 5 -pady 5 - grid $w.error -column 0 -row 2 -columnspan 2 -sticky nsew - - grid columnconfig $w 0 -weight 1 - grid columnconfig $w 1 -weight 1 - grid rowconfig $w 0 -weight 1 - - cl_list_update $w.list - return $w - } - - - #------------------------------------------------------------------------------ - - proc loadedlibs_updateall {} { - foreach w [winfo child .] { - if {[string compare [winfo class $w] TLLoadedTypeLibs] == 0} { - loadedlibs_update $w - } - } - } - - proc loadedlibs_update {w} { - variable bgcolor - variable textcolor - variable highlightcolor - - $w.l.t config -state normal - $w.l.t delete 1.0 end - foreach lib [lsort [typelib::loaded]] { - $w.l.t tag configure tag$lib -foreground $highlightcolor -font tlviewertext -underline 0 - $w.l.t insert end "$lib\n" tag$lib - $w.l.t tag bind tag$lib <1> [namespace code "viewlib $lib"] - $w.l.t tag bind tag$lib "$w.l.t config -cursor hand2; $w.l.t tag config tag$lib -underline 1" - $w.l.t tag bind tag$lib "$w.l.t config -cursor arrow; $w.l.t tag config tag$lib -underline 0" - } - $w.l.t config -state disabled - } - - proc loadedlibs {w} { - toplevel $w -class TLLoadedTypeLibs - - wm title $w "Loaded Libraries" - scrltxt $w.l - - grid $w.l -column 0 -row 0 -sticky nsew - grid columnconfig $w 0 -weight 1 - grid rowconfig $w 0 -weight 1 - loadedlibs_update $w - bind $w [namespace code "loadedlibs_update $w"] - } + } - #------------------------------------------------------------------------------ - proc viewlib_onenter {txt tag} { - $txt config -cursor hand2 - $txt tag config $tag -underline 1 - } + # retrieves, as a list, the categories for the given clsid + proc clsid_categories {clsid} { + array set categories {} + clsid_categories_to_array $clsid categories + return [array names categories] + } - proc viewlib_onleave {txt tag} { - $txt config -cursor arrow - $txt tag config $tag -underline 0 - } - proc viewlib_unselect {txt lib} { - variable viewedtypes - variable textcolor - if {[array name viewedtypes $lib] != {}} { - set type $viewedtypes($lib) - $txt tag config tag$type -foreground $textcolor -font tlviewertext - set viewedtypes($lib) {} - } + # retrieves all clsids that match the category name given by the first parameter + proc clsids {{cat {}}} { + array set categories {} + set clsidk "HKEY_CLASSES_ROOT\\CLSID" + if {$cat == {}} { + return [registry keys $clsidk] } + # else ... - - proc viewlib_select {fulltype } { - variable viewedtypes - variable highlightcolor - - puts $fulltype - set sp [split $fulltype .] - if {[llength $sp] != 2} { - return - } - - set lib [lindex $sp 0] - set type [lindex $sp 1] - - set w [viewlib $lib] - set txt $w.types.t - - viewlib_unselect $txt $lib - $txt tag config tag$type -foreground $highlightcolor -font tlviewerhigh - - $txt see [lindex [$txt tag ranges tag$type] 0] - set viewedtypes($lib) $type - viewlib_readelems $w $lib $type; - } + set classes {} - - proc viewlib_selectelem {w fulltype element} { - variable viewedtypes - variable highlightcolor - - puts "$fulltype $element" - set sp [split $fulltype .] - set lib [lindex $sp 0] - set type [lindex $sp 1] - - set txt $w.elems.t - - viewlib_unselect $txt $fulltype - $txt tag config tag$element -foreground $highlightcolor -font tlviewerhigh - $txt see [lindex [$txt tag ranges tag$element] 0] - set viewedtypes($fulltype) $element - viewlib_readdesc $w $lib $type $element - } - - ### - # creates a list of types in some library - proc viewlib_readtypes {w lib} { - variable textcolor - set txt $w.types.t - - $txt config -state normal - $txt del 1.0 end - - foreach tdesc [lsort [typelib::types $lib]] { - $txt insert end "[lindex $tdesc 0]\t" - set full [lindex $tdesc 1] - set type [lindex [split $full .] 1] - $txt tag configure tag$type -foreground $textcolor -font tlviewertext -underline 0 - $txt insert end "$type\n" tag$type - $txt tag bind tag$type <1> [namespace code " - viewlib_select $full; - "] - - $txt tag bind tag$type [namespace code "viewlib_onenter $txt tag$type"] - $txt tag bind tag$type [namespace code "viewlib_onleave $txt tag$type"] - } - $txt config -state disabled - } - - - proc viewlib_writetype {txt fulltype} { - variable highlightcolor - if {[llength [split $fulltype .]] > 1} { - $txt tag configure tag$fulltype -foreground $highlightcolor -font tlviewertext -underline 0 - $txt tag bind tag$fulltype [namespace code "viewlib_onenter $txt tag$fulltype"] - $txt tag bind tag$fulltype [namespace code "viewlib_onleave $txt tag$fulltype"] - $txt tag bind tag$fulltype <1> [namespace code "viewlib_select $fulltype"] - $txt insert end "$fulltype" tag$fulltype - } else { - $txt insert end "$fulltype" + foreach clsid [registry keys $clsidk] { + catch [unset categories] + array set categories {} + clsid_categories_to_array $clsid categories + if {[array names categories $cat]!={}} { + lappend classes $clsid } } + return $classes + } - ### - # displays the elements for a type of some library - proc viewlib_readelems {w lib type} { - variable labelcolor - variable textcolor - variable highlightcolor - - set txt $w.elems.t - $txt config -state normal - $txt del 1.0 end - set elems [typelib::typeinfo $lib.$type] - loadedlibs_updateall - - $txt tag configure label -font tlviewerhigh -underline 1 -foreground $labelcolor - - if {[string compare "typedef" [lindex $elems 0]] == 0} { - # --- we are working with a typedef - set t [lindex $elems 3] - $txt insert end "Typedef\n\t" label - viewlib_writetype $txt $t - } else { - if {[llength [lindex $elems 1]] != 0} { - $txt insert end "Methods\n" label - } - - foreach method [lsort [lindex $elems 1]] { - $txt tag configure tag$method -foreground $textcolor -font tlviewertext -underline 0 - $txt tag bind tag$method [namespace code "viewlib_onenter $txt tag$method"] - $txt tag bind tag$method [namespace code "viewlib_onleave $txt tag$method"] - $txt tag bind tag$method <1> [namespace code "viewlib_selectelem $w $lib.$type $method"] - $txt insert end "\t$method\n" tag$method - } - - if {[llength [lindex $elems 2]] != 0} { - $txt insert end "Properties\n" label - } - - foreach prop [lsort [lindex $elems 2]] { - $txt tag configure tag$prop -foreground $textcolor -font tlviewertext -underline 0 - $txt tag bind tag$prop [namespace code "viewlib_onenter $txt tag$prop"] - $txt tag bind tag$prop [namespace code "viewlib_onleave $txt tag$prop"] - $txt tag bind tag$prop <1> [namespace code "viewlib_selectelem $w $lib.$type $prop"] - $txt insert end "\t$prop\n" tag$prop - } - if {[llength [lindex $elems 3]] != 0} { - $txt insert end "Inherited Types\n" label - } + # provides a description for the clsid + proc describe_clsid {clsid} { + set clsidk "HKEY_CLASSES_ROOT\\CLSID\\$clsid" + return [registry get $clsidk {}] + } - foreach impl [lsort -index 1 [lindex $elems 3]] { - # implemented interfaces - set t [lindex $impl 1] - set flags [lindex $impl 0] - if {[lsearch -exact $flags default] != -1} { - $txt insert end "*" - } - if {[lsearch -exac $flags source] != -1} { - $txt insert end "event" - } - $txt insert end "\t" - - $txt tag configure itag$t -foreground $highlightcolor -font tlviewertext -underline 0 - $txt tag bind itag$t [namespace code "viewlib_onenter $txt itag$t"] - $txt tag bind itag$t [namespace code "viewlib_onleave $txt itag$t"] - $txt tag bind itag$t <1> [namespace code "viewlib_select $t"] - - $txt insert end "$t\n" itag$t - } - } - $txt config -state disabled - viewlib_settypedoc $w [lindex $elems 4] - } - - proc viewlib_settypedoc {w doc} { - set txt $w.desc.t - $txt config -state normal - $txt delete 1.0 end - $txt insert end $doc - $txt config -state disabled + # retrieves a list of clsid descriptor for all clsids that have the category specified by + # parameter one. If parameter is {} then all clsids are returned. + proc describe_all_clsids {{cat {}}} { + set l {} + foreach clsid [categories::all_clsids $cat] { + lappend l [categories::describe_clsid $clsid] } + return [lsort -dictionary $l] + } + # retrieve the programmatics identifier for a clsid. + # If any exist, the result of this procedure is the programmatic identifier for the + # the clsid, followed by an optional version independent identifier + proc progid_from_clsid {clsid} { + set clsidk "HKEY_CLASSES_ROOT\\CLSID\\$clsid" + set progid {} + set verindid {} + catch {set progid [registry get "$clsidk\\ProgID" {}]} + catch {lappend progid [registry get "$clsidk\\VersionIndependentProgID" {}]} + return $progid + } - ### - # retrieves the description for an element - proc viewlib_readdesc {w lib type elem} { - variable labelcolor - - set txt $w.desc.t - $txt config -state normal - $txt delete 1.0 end - - $txt tag configure label -font tlviewerhigh -underline 1 -foreground $labelcolor - $txt tag configure element -font tlviewerbold - $txt tag bind element [namespace code "viewlib_onenter $txt element"] - $txt tag bind element [namespace code "viewlib_onleave $txt element"] - - $txt tag bind element <1> [namespace code "viewlib_select $lib.$type; viewlib_selectelem $w $lib.$type $elem"] - - set desc [typelib::typeinfo $lib.$type $elem] - set kind [lindex $desc 0] - switch $kind { - property { - $txt insert end "Property" label - $txt insert end "\t[lindex $desc 2]\n" - - set p [lindex $desc 1] - # insert the flags - $txt insert end "[lindex $p 0]\t" - viewlib_writetype $txt [lindex $p 1] - $txt insert end " " - $txt insert end "[lindex $p 2]" element - - set params [lrange $p 3 end] - - foreach param $params { - $txt insert end "\n\t" - - if {[llength $param] == 3} { - $txt insert end "[lindex $param 0]\t" - set param [lrange $param 1 end] - } - viewlib_writetype $txt [lindex $param 0] - $txt insert end " [lrange $param 1 end]" - } - } - - method { - set m [lindex $desc 1] - $txt insert end "Method" label - $txt insert end "\t[lindex $desc 2]\n" - viewlib_writetype $txt [lindex $m 0] - $txt insert end " " - $txt insert end "[lindex $m 1]" element - set params [lrange $m 2 end] - - foreach param $params { - $txt insert end "\n\t" - - if {[llength $param] == 3} { - $txt insert end "[lindex $param 0]\t" - set param [lrange $param 1 end] - } - viewlib_writetype $txt [lindex $param 0] - $txt insert end " [lrange $param 1 end]" - } - } - } - puts [lindex $desc 1] - $txt config -state disabled + proc typelib_from_clsid {clsid} { + set clsidk "HKEY_CLASSES_ROOT\\CLSID\\$clsid" + # associated typelib? + + if {[registry keys $clsidk TypeLib] == {}} { + return {} } + set typelib [registry get $clsidk\\TypeLib {}] - - #### - # Creates a viewer for library - proc viewlib {lib} { - set w ._tlview$lib - if [winfo exists $w] { - raise $w - return $w - } - toplevel $w -class tlview_$lib - wm title $w "Type Library: $lib" - - label $w.tl -text Types; - label $w.el -text Elements; - label $w.dl -text Description; - - scrltxt $w.types; - scrltxt $w.elems - scrltxt $w.desc y - $w.desc.t config -height 5 - $w.desc.t config -state disabled - $w.elems.t config -state disabled - $w.types.t config -state disabled - - grid $w.tl -column 0 -row 0 -sticky nw - grid $w.types -column 0 -row 1 -sticky news -padx 2 -pady 2 - grid $w.el -column 1 -row 0 -sticky nw - grid $w.elems -column 1 -row 1 -sticky news -padx 2 -pady 2 - grid $w.dl -column 0 -row 2 -sticky nw - grid $w.desc -column 0 -row 3 -columnspan 2 -sticky news -padx 2 -pady 2 - - grid columnconfigure $w 0 -weight 1 - grid columnconfigure $w 1 -weight 1 - grid rowconfigure $w 1 -weight 1 - #grid rowconfigure $w 3 -weight 1 - - viewlib_readtypes $w $lib - return $w + # does it exist? + if {[registry keys HKEY_CLASSES_ROOT\\TypeLib $typelib] == {}} { + puts "couldn't find typelib $typelib from clsid $clsid" + return {} } - - proc viewtype {fullname} { - viewlib_select $fullname + # do we have a version number?? + if {[registry keys $clsidk Version] != {}} { + set ver [registry get $clsidk\\Version {}] + set result [makelibname $typelib $ver] + } elseif {[registry keys $clsidk VERSION] != {}} { + set ver [registry get $clsidk\\VERSION {}] + set result [makelibname $typelib $ver] + } else { + # get the latest version of the type library + set result [latest_typelib_version $typelib] } + return $result } -} \ No newline at end of file +} diff --git a/src/utility.cpp b/src/utility.cpp index ea4bba6..5c41a1f 100644 --- a/src/utility.cpp +++ b/src/utility.cpp @@ -31,6 +31,10 @@ #include "typelib.h" #include "optclobj.h" #include "optcltypeattr.h" +#include "optclbindptr.h" +#include "comrecordinfoimpl.h" +#include + #ifdef _DEBUG /* @@ -63,6 +67,35 @@ void OptclTrace(LPCTSTR lpszFormat, ...) #endif //_DEBUG + +template +class TCoMem { +public: + TCoMem () : p(NULL) {} + ~TCoMem () { + Free(); + } + + void Free () { + if (p) { + CoTaskMemFree(p); + p = NULL; + } + } + + T* Alloc (ULONG size) { + Free(); + p = (T*)(CoTaskMemAlloc (size)); + return p; + } + + operator T* () { + return p; + } +protected: + T * p; +}; + /* *------------------------------------------------------------------------- * HRESULT2Str -- @@ -317,7 +350,7 @@ void OptclVariantClear (VARIANT *pvar) -bool var2obj_byref (Tcl_Interp *pInterp, VARIANT &var, TObjPtr &presult, OptclObj **ppObj) +bool var2obj_byref (Tcl_Interp *pInterp, VARIANT &var, ITypeInfo *pti, TObjPtr &presult, OptclObj **ppObj) { ASSERT (var.ppunkVal != NULL); @@ -327,7 +360,7 @@ bool var2obj_byref (Tcl_Interp *pInterp, VARIANT &var, TObjPtr &presult, OptclOb BSTR bstr = NULL; HRESULT hr = S_OK; OptclObj * pObj = NULL; - + ULONG size = 0; presult.create(); if (var.ppunkVal == NULL) { @@ -340,7 +373,7 @@ bool var2obj_byref (Tcl_Interp *pInterp, VARIANT &var, TObjPtr &presult, OptclOb case VT_DISPATCH: case VT_UNKNOWN: if (*var.ppunkVal != NULL) { - pObj = g_objmap.Add (pInterp, *var.ppunkVal); + pObj = g_objmap.Add (pInterp, *var.ppunkVal, pti); presult = (const char*)(*pObj); // cast to char* if (ppObj != NULL) *ppObj = pObj; @@ -385,9 +418,12 @@ bool var2obj_byref (Tcl_Interp *pInterp, VARIANT &var, TObjPtr &presult, OptclOb Tcl_SetResult (pInterp, "pointer to null", TCL_STATIC); bOk = false; } else { - bOk = var2obj (pInterp, *var.pvarVal, presult, ppObj); + bOk = var2obj (pInterp, *var.pvarVal, NULL, presult, ppObj); } break; + case VT_RECORD: + return record2obj(pInterp, var, presult); + break; default: presult = "?unhandledtype?"; } @@ -404,6 +440,125 @@ bool var2obj_byref (Tcl_Interp *pInterp, VARIANT &var, TObjPtr &presult, OptclOb } +/* + *------------------------------------------------------------------------- + * record2obj + * Converts a VT_RECORD variant to a Tcl object + * Result: + * true iff successful + * Side Effects: + * Can create new optcl objects, which without reference counting might + * become a nightmare! :-( + *------------------------------------------------------------------------- + */ +bool record2obj (Tcl_Interp *pInterp, VARIANT &var, TObjPtr &result) +{ + USES_CONVERSION; + ASSERT (var.vt == VT_RECORD && var.pRecInfo != NULL); + + ULONG fields = 0, index; + TCoMem fieldnames; + bool bok = true; + + + IRecordInfo *prinfo = var.pRecInfo; + CComPtr pinf; + + try { + CHECKHR(prinfo->GetTypeInfo(&pinf)); + CHECKHR(prinfo->GetFieldNames (&fields, NULL)); + if (fieldnames.Alloc (fields) == NULL) + throw "failed to allocate memory."; + CHECKHR(prinfo->GetFieldNames (&fields, fieldnames)); + + for (index = 0; bok && index < fields; index++) { + CComVariant varValue; + TObjPtr value; + CHECKHR(prinfo->GetField(var.pvRecord, fieldnames[index], &varValue)); + result.lappend(OLE2A(fieldnames[index])); + bok = var2obj (pInterp, varValue, pinf, value, NULL); + if (bok) + result.lappend(value); + } + + } catch (HRESULT hr) { + Tcl_SetResult (pInterp, HRESULT2Str(hr), TCL_DYNAMIC); + bok = false; + } catch (_com_error ce) { + Tcl_SetResult (pInterp, T2A((TCHAR*)ce.ErrorMessage()), TCL_VOLATILE); + bok = false; + } catch (char *err) { + Tcl_SetResult (pInterp, err, TCL_VOLATILE); + bok = false; + } catch (...) { + Tcl_SetResult (pInterp, "An unexpected error type occurred", TCL_STATIC); + bok = false; + } + + if (fieldnames != NULL) { + for (index = 0; index < fields; index++) + SysFreeString(fieldnames[index]); + } + return bok; +} + + + + +bool vararray2obj (Tcl_Interp * pInterp, VARIANT &var, ITypeInfo * pti, TObjPtr &presult) +{ + bool bOk = false; + LONG lbound, ubound; + VARTYPE vt = var.vt & (~VT_ARRAY); // type of elements array + + presult.create(); + + if (var.parray == NULL) { + Tcl_SetResult (pInterp, "invalid pointer to COM safe array", TCL_STATIC); + return false; + } + + + ULONG dims = SafeArrayGetDim (var.parray), // total number of dimensions + dindex; // dimension iterator + auto_array lbounds(dims), ubounds(dims); + + // get the lower and upper bounds of each dimension + for (dindex = 0; dindex < dims; dindex++) { + CHECKHR_TCL(SafeArrayGetLBound(var.parray, dindex, lbounds+dindex), pInterp, false); + CHECKHR_TCL(SafeArrayGetUBound(var.parray, dindex, ubounds+dindex), pInterp, false); + } + + + + CHECKHR_TCL(SafeArrayGetLBound(var.parray, 0, &lbound), pInterp, false); + CHECKHR_TCL(SafeArrayGetUBound(var.parray, 0, &ubound), pInterp, false); + + for (LONG index = lbound; index <= ubound; index++) { + CComVariant varElement; + varElement.vt = vt; + + // WARNING: The following code is *not* solid, as it doesn't handle record structures at all!! + // in order to do this, I'll have to take into account the type info associate with this + // array ... not now I guess. + if (vt == VT_VARIANT) { + CHECKHR_TCL(SafeArrayGetElement(var.parray, &index, &varElement), pInterp, false); + } else { + CHECKHR_TCL(SafeArrayGetElement(var.parray, &index, &(varElement.punkVal)), pInterp, false); + } + TObjPtr element; + // now that we've got the variant, convert it to a tcl object + if (!var2obj (pInterp, varElement, pti, element)) + return false; + // append it to the result + presult += element; + } + + return bOk; +} + + + /* *------------------------------------------------------------------------- * var2obj -- @@ -414,7 +569,7 @@ bool var2obj_byref (Tcl_Interp *pInterp, VARIANT &var, TObjPtr &presult, OptclOb * None. *------------------------------------------------------------------------- */ -bool var2obj (Tcl_Interp *pInterp, VARIANT &var, TObjPtr &presult, OptclObj **ppObj /* = NULL*/) +bool var2obj (Tcl_Interp *pInterp, VARIANT &var, ITypeInfo *pti, TObjPtr &presult, OptclObj **ppObj /* = NULL*/) { USES_CONVERSION; @@ -430,17 +585,16 @@ bool var2obj (Tcl_Interp *pInterp, VARIANT &var, TObjPtr &presult, OptclObj **pp if ((var.vt & VT_ARRAY) || (var.vt & VT_VECTOR)) { - Tcl_SetResult (pInterp, "can't handle arrays or vectors for now", TCL_STATIC); - return false; + return vararray2obj (pInterp, var, pti, presult); } if (var.vt == VT_VARIANT) { ASSERT (var.pvarVal != NULL); - return var2obj (pInterp, *(var.pvarVal), presult, ppObj); + return var2obj (pInterp, *(var.pvarVal), pti, presult, ppObj); } if (var.vt & VT_BYREF) - return var2obj_byref (pInterp, var, presult, ppObj); + return var2obj_byref (pInterp, var, pti, presult, ppObj); presult.create(); @@ -454,6 +608,10 @@ bool var2obj (Tcl_Interp *pInterp, VARIANT &var, TObjPtr &presult, OptclObj **pp presult = (const char*)(*pObj); // cast to char* if (ppObj != NULL) *ppObj = pObj; + if (pti != NULL) { + g_libs.EnsureCached (pti); + pObj->SetInterfaceFromType(pti); + } } else presult = 0; @@ -473,6 +631,9 @@ bool var2obj (Tcl_Interp *pInterp, VARIANT &var, TObjPtr &presult, OptclObj **pp case VT_R8: presult = (double)(var.dblVal); break; + case VT_RECORD: + return record2obj (pInterp, var, presult); + break; default: // standard string conversion required comvar = var; name = comvar; @@ -507,6 +668,7 @@ bool var2obj (Tcl_Interp *pInterp, VARIANT &var, TObjPtr &presult, OptclObj **pp * * Result: * true iff successful, else interpreter holds error string. + * * Side effects: * None. *------------------------------------------------------------------------- @@ -519,7 +681,6 @@ bool obj2var_ti (Tcl_Interp *pInterp, TObjPtr &obj, VARIANT &var, ASSERT (pInterp != NULL); OptclTypeAttr ota; - CComPtr pcurrent; CComPtr ptmpunk; HRESULT hr; TObjPtr ptmp; @@ -527,115 +688,110 @@ bool obj2var_ti (Tcl_Interp *pInterp, TObjPtr &obj, VARIANT &var, OptclObj * pOptclObj = NULL; long lValue; + // if we have no value, set the variant to an empty + if (obj.isnull ()) { + VariantClear(&var); + return true; + } + // if no type description has been provided, do a simple conversion if (pdesc == NULL) { obj2var (obj, var); bOk = true; } - // a simple type - else if (pdesc->vt != VT_USERDEFINED && pdesc->vt != VT_SAFEARRAY) { - if (pdesc->vt != VT_PTR) - return obj2var_vt (pInterp, obj, var, pdesc->vt); - else { - ASSERT (pdesc->lptdesc->vt != VT_PTR && - pdesc->lptdesc->vt != VT_USERDEFINED && - pdesc->lptdesc->vt != VT_SAFEARRAY); - - if (pdesc->lptdesc->vt == VT_PTR || - pdesc->lptdesc->vt == VT_USERDEFINED || - pdesc->lptdesc->vt == VT_SAFEARRAY) - { - Tcl_SetResult (pInterp, "can't convert - optcl doesn't support level of de-referencing", TCL_STATIC); - return false; - } - return obj2var_vt_byref (pInterp, obj, var, pdesc->lptdesc->vt); - } - } - - // arrays - should be easy to do - not enough time right now... else if (pdesc->vt == VT_SAFEARRAY) { // wont do arrays for now. Tcl_SetResult (pInterp, "optcl doesn't currently handle array types", TCL_STATIC); } - else { + else if (pdesc->vt == VT_USERDEFINED) { // type information provided and it refers to a user defined type // resolve the initial type + CComPtr refinfo; + CHECKHR(pInfo->GetRefTypeInfo (pdesc->hreftype, &refinfo)); - hr = pInfo->GetRefTypeInfo (pdesc->hreftype, &ota.m_pti); - CHECKHR(hr); - g_libs.EnsureCached (ota.m_pti); - hr = ota.GetTypeAttr(); - CHECKHR(hr); + if (!TypeInfoResolveAliasing (pInterp, refinfo, &ota.m_pti)) + return false; + CHECKHR(ota.GetTypeAttr()); ASSERT (ota.m_pattr != NULL); - pcurrent = pInfo; - while (ota->typekind == TKIND_ALIAS && - ota->tdescAlias.vt == VT_USERDEFINED) - { - HREFTYPE href = ota->tdescAlias.hreftype; - pcurrent = ota.m_pti; - ota = NULL; // release the type attribute and type info - pcurrent->GetRefTypeInfo (href, &ota.m_pti); - hr = ota.GetTypeAttr(); - CHECKHR(hr); - } - + // we've now climbed back up the alias chain and have one of the following: // enum, record, module, interface, dispatch, coclass, union or alias to a basic type - // The following we can't (currently) do anything useful with: record, union, module. - if (ota.m_pattr->typekind == TKIND_ALIAS) - return obj2var_ti (pInterp, obj, var, pcurrent, &(ota->tdescAlias)); + if (ota.m_pattr->typekind == TKIND_ALIAS && + ota->tdescAlias.vt != VT_USERDEFINED) + return obj2var_ti (pInterp, obj, var, ota.m_pti, &(ota->tdescAlias)); TYPEKIND tk = ota->typekind; // the metaclass GUID intfguid = ota->guid; - switch (tk) { case TKIND_ENUM: if (bOk = (Tcl_GetLongFromObj (NULL, obj, &lValue) == TCL_OK)) obj2var(obj, var); - else if (bOk = TypeLib_ResolveConstant (pInterp, obj, ptmp, ota.m_pti)) + else if (bOk = TypeLib_ResolveConstant(pInterp, obj, ptmp, ota.m_pti)) obj2var (ptmp, var); break; case TKIND_DISPATCH: case TKIND_INTERFACE: // both these case require an object with the correct interface - pOptclObj = g_objmap.Find (obj); - if (pOptclObj != NULL) { - ptmpunk = (IUnknown*)(*pOptclObj); - ASSERT (ptmpunk != NULL); - hr = ptmpunk->QueryInterface (intfguid, (void**)&(var.punkVal)); - CHECKHR(hr); - V_VT(&var) = VT_UNKNOWN; + V_VT(&var) = VT_UNKNOWN; + V_UNKNOWN(&var) = NULL; + + // let's first check for the 'special' cases. + + // images: + // check to see if we have tk installed and we're requested a picture + if (g_bTkInit && IsEqualGUID (ota.m_pattr->guid, __uuidof(IPicture))) { + // create picture variant + bOk = obj2picture(pInterp, obj, var); + } else if (((char*)obj)[0] != 0) { + pOptclObj = g_objmap.Find (obj); + if (pOptclObj != NULL) { + ptmpunk = (IUnknown*)(*pOptclObj); + ASSERT (ptmpunk != NULL); + hr = ptmpunk->QueryInterface (intfguid, (void**)&(var.punkVal)); + CHECKHR(hr); + bOk = true; + } else { + ObjectNotFound (pInterp, obj); + } + } else bOk = true; - } else - ObjectNotFound (pInterp, obj); break; case TKIND_COCLASS: - pOptclObj = g_objmap.Find (obj); - if (pOptclObj != NULL) { - var.punkVal = (IUnknown*)(*pOptclObj); - var.punkVal->AddRef(); - V_VT(&var) = VT_UNKNOWN; - bOk = true; + V_VT(&var) = VT_UNKNOWN; + V_UNKNOWN(&var) = NULL; + + if (obj.isnotnull() && ((char*)obj)[0] != 0) { + pOptclObj = g_objmap.Find (obj); + if (pOptclObj != NULL) { + var.punkVal = (IUnknown*)(*pOptclObj); + var.punkVal->AddRef(); + + bOk = true; + } else + ObjectNotFound (pInterp, obj); } else - ObjectNotFound (pInterp, obj); + bOk = true; break; - case TKIND_ALIAS: ASSERT (FALSE); // should be hanlded above. break; // can't handle these types case TKIND_MODULE: + break; + case TKIND_ALIAS: case TKIND_RECORD: + return obj2record(pInterp, obj, var, ota.m_pti); + break; case TKIND_UNION: obj2var (obj, var); bOk = true; @@ -646,13 +802,196 @@ bool obj2var_ti (Tcl_Interp *pInterp, TObjPtr &obj, VARIANT &var, } } + else if (pdesc->vt == VT_PTR) { + ASSERT (pdesc->lptdesc != NULL); + if (pdesc->lptdesc->vt == VT_USERDEFINED) + return obj2var_ti (pInterp, obj, var, pInfo, pdesc->lptdesc); + + ASSERT (pdesc->lptdesc->vt != VT_USERDEFINED); + return obj2var_vt_byref (pInterp, obj, var, pdesc->lptdesc->vt); + } + + // a simple type + else { + ASSERT (pdesc->vt != VT_ARRAY && pdesc->vt != VT_PTR && pdesc->vt != VT_USERDEFINED); + return obj2var_vt (pInterp, obj, var, pdesc->vt); + } + + // arrays - should be easy to do - not enough time right now... + + return bOk; } +/* + *------------------------------------------------------------------------- + * TypeInfoResolveAliasing + * Resolves a type info to its base referenced type. + * + * Result: + * true iff successful. + * + * Side Effects: + * The pointer referenced by pti is updated to point to the base type. + *------------------------------------------------------------------------- + */ +bool TypeInfoResolveAliasing (Tcl_Interp *pInterp, ITypeInfo * pti, ITypeInfo ** presolved) { + ASSERT (pInterp != NULL && pti != NULL && presolved != NULL); + + bool result = false; + CComPtr currentinfo = pti, temp; + OptclTypeAttr pta; + try { + pta = currentinfo; + while (pta->typekind == TKIND_ALIAS && pta->tdescAlias.vt == VT_USERDEFINED) { + CHECKHR(currentinfo->GetRefTypeInfo (pta->tdescAlias.hreftype, &temp)); + currentinfo = temp; + temp.Release(); + pta = currentinfo; + g_libs.EnsureCached (currentinfo); + } + + CHECKHR(currentinfo.CopyTo(presolved)); + result = true; + } catch (char *er) { + Tcl_SetResult (pInterp, er, TCL_VOLATILE); + } catch (HRESULT hr) { + Tcl_SetResult (pInterp, HRESULT2Str(hr), TCL_DYNAMIC); + } catch (...) { + Tcl_SetResult (pInterp, "unknown error in obj2record", TCL_STATIC); + } + return result; +} + +/* + *------------------------------------------------------------------------- + * obj2record + * + * Result: + * + * Side Effects: + * + *------------------------------------------------------------------------- + */ +bool obj2record (Tcl_Interp *pInterp, TObjPtr &obj, PVOID precord, ITypeInfo *pinf) +{ + USES_CONVERSION; + HRESULT hr; + try{ + CComPtr prinf; + CHECKHR(GetRecordInfoFromTypeInfo2(pinf, &prinf)); + + CComPtr pcmp; + CHECKHR(pinf->GetTypeComp (&pcmp)); + + int length = obj.llength (); + if ((length % 2) != 0) + throw ("record definition must have name value pairs"); + + // iterate over the list of name value pairs + for (int i = 0; (i+1) < length; i += 2) { + OptclBindPtr obp; + + char * name = obj.lindex (i); + LPOLESTR lpoleName = A2OLE(name); + TObjPtr ptr = obj.lindex (i+1); + CComVariant vValue; + + // retrieve the vardesc for this item: + hr = pcmp->Bind (lpoleName, 0, INVOKE_PROPERTYPUT | INVOKE_PROPERTYPUTREF | INVOKE_PROPERTYGET, &obp.m_pti, &obp.m_dk, &obp.m_bp); + if (obp.m_dk == DESCKIND_NONE) { + Tcl_SetResult (pInterp, "record doesn't have member called: ", TCL_STATIC); + Tcl_AppendResult (pInterp, name, NULL); + return false; + } + CHECKHR(hr); + + ASSERT (obp.m_dk == DESCKIND_VARDESC); + + if (obp.m_bp.lpvardesc->elemdescVar.tdesc.vt == VT_USERDEFINED) { + CComPtr inforef, inforesolved; + CHECKHR(pinf->GetRefTypeInfo (obp.m_bp.lpvardesc->elemdescVar.tdesc.hreftype, &inforef)); + if (!TypeInfoResolveAliasing (pInterp, inforef, &inforesolved)) + return false; + OptclTypeAttr pta; + pta = inforesolved; + if (pta->typekind == TKIND_RECORD) { + VARIANT var; + CComPtr peti; + VariantInit(&var); + PVOID pfield = NULL; + HRESULT hr = prinf->GetFieldNoCopy (precord, lpoleName, &var, &pfield); + ASSERT (var.vt & VT_RECORD); + CHECKHR(var.pRecInfo->GetTypeInfo (&peti)); + if (!obj2record (pInterp, ptr, var.pvRecord, peti)) + return false; + } else { + if (!obj2var_ti(pInterp, ptr, vValue, obp.m_pti, &(obp.m_bp.lpvardesc->elemdescVar.tdesc))) + return false; + CHECKHR(prinf->PutField (INVOKE_PROPERTYPUT, precord, lpoleName, &vValue)); + } + } else { + if (!obj2var_ti(pInterp, ptr, vValue, obp.m_pti, &(obp.m_bp.lpvardesc->elemdescVar.tdesc))) + return false; + CHECKHR(prinf->PutField (INVOKE_PROPERTYPUT, precord, lpoleName, &vValue)); + } + } + return true; + } catch (char *er) { + Tcl_SetResult (pInterp, er, TCL_VOLATILE); + } catch (HRESULT hr) { + Tcl_SetResult (pInterp, HRESULT2Str(hr), TCL_DYNAMIC); + } catch (...) { + Tcl_SetResult (pInterp, "unknown error in obj2record", TCL_STATIC); + } + return false; +} +/* + *------------------------------------------------------------------------- + * obj2record + * Converts a Tcl object to a record structure declared by a provided + * type info. + * Result: + * true iff successful. + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ +bool obj2record (Tcl_Interp *pInterp, TObjPtr& obj, VARIANT&var, ITypeInfo *pinf) { + ASSERT(pInterp != NULL && pinf != NULL); + USES_CONVERSION; + CComBSTR name; + try { + CComPtr precinfo; + OptclTypeAttr pta; + pta = pinf; + //ASSERT (pta->typekind == TKIND_RECORD); + + CComPtr prinf; + CHECKHR(GetRecordInfoFromTypeInfo2(pinf, &prinf)); + + CComPtr pcmp; + CHECKHR(pinf->GetTypeComp (&pcmp)); + + VariantClear(&var); + var.pvRecord = prinf->RecordCreate (); + var.vt = VT_RECORD; + CHECKHR(prinf.CopyTo (&(var.pRecInfo))); + prinf->RecordInit (var.pvRecord); + return obj2record (pInterp, obj, var.pvRecord, pinf); + } catch (char *er) { + Tcl_SetResult (pInterp, er, TCL_VOLATILE); + } catch (HRESULT hr) { + Tcl_SetResult (pInterp, HRESULT2Str(hr), TCL_DYNAMIC); + } catch (...) { + Tcl_SetResult (pInterp, "unknown error in obj2record", TCL_STATIC); + } + return false; +} /* @@ -853,15 +1192,22 @@ bool obj2var_vt (Tcl_Interp *pInterp, TObjPtr &obj, VARIANT &var, VARTYPE vt) IUnknown * ptmpunk = NULL; bool bOk = true; HRESULT hr; + OptclObj *pObj = g_objmap.Find (obj); + if (pObj != NULL) { + if (pObj->m_pta->typekind == TKIND_DISPATCH || (pObj->m_pta->wTypeFlags & TYPEFLAG_FDUAL)) + vt = VT_DISPATCH; + else + vt = VT_UNKNOWN; + } switch (vt) { case VT_DISPATCH: case VT_UNKNOWN: V_VT(&var) = vt; - if (obj.isnull()) - var.punkVal = NULL; - else { + V_UNKNOWN(&var) = NULL; + + if (obj.isnotnull() && ( ((char*)obj)[0] != 0) ) { // attempt to cast from an optcl object pOptclObj = g_objmap.Find (obj); @@ -995,7 +1341,7 @@ bool SplitBrackets (Tcl_Interp *pInterp, Tcl_Obj *pObj, if (Tcl_EvalObj (pInterp, pcmd) == TCL_ERROR) return false; - CONST84 char * okstr = Tcl_GetStringResult (pInterp); + const char * okstr = Tcl_GetStringResult (pInterp); if (okstr[0] == '0') { Tcl_SetResult (pInterp, "property format is incorrect: ", TCL_STATIC); Tcl_AppendResult (pInterp, Tcl_GetStringFromObj(pObj, NULL), NULL); @@ -1015,6 +1361,25 @@ bool SplitBrackets (Tcl_Interp *pInterp, Tcl_Obj *pObj, return true; } + + +/* + *------------------------------------------------------------------------- + * obj2picture + * Convert the name of a tk image to an com object supporting IPicture + * + * Result: + * True iff successful. Else, error description in Tcl interpreter. + * + * Side Effects: + * None. + *------------------------------------------------------------------------- + */ +bool obj2picture(Tcl_Interp *pInterp, TObjPtr &obj, VARIANT &var) { + return false; // NOT IMPLEMENTED YET +} + + /// Tests TCL_CMDEF (Obj2VarTest) { diff --git a/src/utility.h b/src/utility.h index 510c692..6ad1903 100644 --- a/src/utility.h +++ b/src/utility.h @@ -43,11 +43,21 @@ void OptclTrace(LPCTSTR lpszFormat, ...); #else # define TRACE -#endif +#endif // _DEBUG + +// TRACE_OPTCLOBJ +// Gives a trace output for an optcl object, in terms of its name, current interface, and reference count +#ifdef _DEBUG +# define TRACE_OPTCLOBJ(obj) {TObjPtr interfacename; obj->InterfaceName(interfacename); OptclTrace("%s %s --> %d\n", (char*)interfacename, obj->m_name.c_str(), obj->m_refcount);} +#else +# define TRACE_OPTCLOBJ +#endif // _DEBUG + + #define TCL_CMDEF(fname) int fname (ClientData cd, Tcl_Interp *pInterp, int objc, Tcl_Obj *CONST objv[]) #define CHECKHR(hr) if (FAILED(hr)) throw(hr) -#define CHECKHR_TCL(hr, i, v) if (FAILED(hr)) {Tcl_SetResult (i, HRESULT2Str(hr), TCL_DYNAMIC); return v;} +#define CHECKHR_TCL(hr, i, v) {HRESULT _hr = (hr); if (FAILED(_hr)) {Tcl_SetResult (i, HRESULT2Str(_hr), TCL_DYNAMIC); return v;}} #define SETDISPPARAMS(dp, numArgs, pvArgs, numNamed, pNamed) \ {\ @@ -62,6 +72,33 @@ void OptclTrace(LPCTSTR lpszFormat, ...); #define _countof(x) (sizeof(x)/sizeof(x[0])) +template +class auto_array { +public: + typedef T* TPTR; + auto_array () : m_ptr(NULL) {} + auto_array(unsigned long items) : m_ptr(NULL) { + Allocate(items); + } + ~auto_array() { ReleaseArray();} + void ReleaseArray () { + if (m_ptr != NULL) { + delete [] m_ptr; + m_ptr = NULL; + } + } + TPTR Allocate(unsigned long items) { + ReleaseArray(); + m_ptr = new T[items]; + return m_ptr; + } + operator TPTR () { + return m_ptr; + } +protected: + TPTR m_ptr; +}; + template void delete_ptr (T* &ptr) { if (ptr != NULL) { @@ -83,11 +120,15 @@ template T* delete_array (T *&ptr) { class OptclObj; -bool var2obj (Tcl_Interp *pInterp, VARIANT &var, TObjPtr &presult, OptclObj **ppObj = NULL); +bool var2obj (Tcl_Interp *pInterp, VARIANT &var, ITypeInfo *pti, TObjPtr &presult, OptclObj **ppObj = NULL); bool obj2var_ti (Tcl_Interp *pInterp, TObjPtr &obj, VARIANT &var, ITypeInfo *pInfo, TYPEDESC *pdesc); bool obj2var_vt (Tcl_Interp *pInterp, TObjPtr &obj, VARIANT &var, VARTYPE vt); bool obj2var_vt_byref (Tcl_Interp *pInterp, TObjPtr &obj, VARIANT &var, VARTYPE vt); void obj2var (TObjPtr &obj, VARIANT &var); +bool record2obj (Tcl_Interp *pInterp, VARIANT &var, TObjPtr &result); +bool obj2record (Tcl_Interp *pInterp, TObjPtr &obj, VARIANT &var, ITypeInfo *pinf); +bool obj2picture(Tcl_Interp *pInterp, TObjPtr &obj, VARIANT &var); + void OptclVariantClear (VARIANT *pvar); @@ -103,8 +144,8 @@ int ObjectNotFound (Tcl_Interp *pInterp, const char *name); void SplitTypedString (char *pstr, char ** ppsecond); bool SplitObject (Tcl_Interp *pInterp, Tcl_Obj *pObj, const char * tokens, Tcl_Obj **ppResult); -bool SplitBrackets (Tcl_Interp *pInterp, Tcl_Obj *pObj, - TObjPtr & result); +bool SplitBrackets (Tcl_Interp *pInterp, Tcl_Obj *pObj, TObjPtr & result); +bool TypeInfoResolveAliasing (Tcl_Interp *pInterp, ITypeInfo * pti, ITypeInfo ** presolved); /// TESTS TCL_CMDEF (Obj2VarTest); diff --git a/temp code/reg.tcl b/temp code/reg.tcl new file mode 100644 index 0000000..09ade01 --- /dev/null +++ b/temp code/reg.tcl @@ -0,0 +1,139 @@ +package require registry + + +namespace eval COM { + + # categories + # retrieve a list of all category names + proc categories {} { + set alldata {} + set k "HKEY_CLASSES_ROOT\\Component Categories" + set cats [registry keys $k] + + foreach cat $cats { + set values [registry values $k\\$cat] + set data {} + foreach value $values { + lappend data [registry get $k\\$cat $value] + } + lappend alldata $data + } + + return $alldata + } + + + # collate all the category names under the category clsid (parameter 1) into an + # array passed by name + proc collate_category_names {category arrname} { + upvar $arrname categories + + set ck "HKEY_CLASSES_ROOT\\Component Categories\\$category" + catch { + foreach value [registry values $ck] { + catch {set categories([registry get $ck $value]) ""} + } + } err + return $err + } + + + # collates all categories for a given clsid in an array that is passed by name + proc clsid_categories_to_array {clsid arrname} { + upvar $arrname categories + set k "HKEY_CLASSES_ROOT\\CLSID\\$clsid" + + # catch if there aren't any implemented categories + + foreach subkey [registry keys "HKEY_CLASSES_ROOT\\CLSID\\$clsid"] { + switch $subkey { + {Implemented Categories} { + foreach category [registry keys "$k\\$subkey"] { + collate_category_names $category categories + } + } + + Programmable { + array set categories {{Automation Objects} {}} + } + + Control { + array set categories {Controls {}} + } + + DocObject { + array set categories {{Document Objects} {}} + } + + Insertable { + array set categories {{Embeddable Objects} {}} + } + } + } + + } + + # retrieves, as a list, the categories for the given clsid + proc clsid_categories {clsid} { + array set categories {} + clsid_categories_to_array $clsid categories + return [array names categories] + } + + + # retrieves all clsids that match the category name given by the first parameter + proc clsids {{cat {}}} { + array set categories {} + set clsidk "HKEY_CLASSES_ROOT\\CLSID" + if {$cat == {}} { + return [registry keys $clsidk] + } + + # else ... + + set classes {} + + foreach clsid [registry keys $clsidk] { + catch [unset categories] + array set categories {} + clsid_categories_to_array $clsid categories + if {[array names categories $cat]!={}} { + lappend classes $clsid + } + } + return $classes + } + + + + # provides a description for the clsid + proc describe_clsid {clsid} { + set clsidk "HKEY_CLASSES_ROOT\\CLSID\\$clsid" + return [registry get $clsidk {}] + } + + + + # retrieves a list of clsid descriptor for all clsids that have the category specified by + # parameter one. If parameter is {} then all clsids are returned. + proc descrive_all_clsids {{cat {}}} { + set l {} + foreach clsid [categories::all_clsids $cat] { + lappend l [categories::describe_clsid $clsid] + } + return [lsort -dictionary $l] + } + + # retrieve the programmatics identifier for a clsid. + # If any exist, the result of this procedure is the programmatic identifier for the + # the clsid, followed by an optional version independent identifier + proc progid_from_clsid {clsid} { + set clsidk "HKEY_CLASSES_ROOT\\CLSID\\$clsid" + set progid {} + set verindid {} + catch {set progid [registry get "$clsidk\\ProgID" {}]} + catch {lappend progid [registry get "$clsidk\\VersionIndependentProgID" {}]} + return $progid + } +} + diff --git a/tests/calendar.tcl b/tests/calendar.tcl index 2ee371b..6543fa4 100644 --- a/tests/calendar.tcl +++ b/tests/calendar.tcl @@ -39,11 +39,11 @@ pack .cal # bind to the calendar AfterUpdate event # routing it to the tcl procedure onupdate # -optcl::bind $cal AfterUpdate onupdate +#optcl::bind $cal AfterUpdate onupdate # get the current value -set currentdate [$cal : value] +#set currentdate [$cal : value] # make a button to view the type information of diff --git a/tests/pdf.tcl b/tests/pdf.tcl index 9304dca..bf11079 100644 --- a/tests/pdf.tcl +++ b/tests/pdf.tcl @@ -4,7 +4,7 @@ package require optcl bind . {console show} wm title . {PDF Document in Tk} -set pdf [optcl::new -window .pdf {d:/program files/adobe/acrobat3/acrobat.pdf}] +set pdf [optcl::new -window .pdf {C:\Program Files\Adobe\Acrobat 4.0\Help\ENU\acrobat.pdf}] .pdf config -width 500 -height 300 pack .pdf -fill both -expand 1 -- 2.23.0