From f867212c1762e156553d039319b904a17f7b563d Mon Sep 17 00:00:00 2001 From: tpearson Date: Fri, 19 Feb 2010 18:17:02 +0000 Subject: [PATCH] Added KDE3 version of knutclient git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/knutclient@1092914 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- AUTHORS | 4 + COPYING | 340 + ChangeLog | 129 + INSTALL | 167 + Makefile.am | 24 + Makefile.cvs | 10 + NEWS | 0 README | 1 + TODO | 0 acinclude.m4 | 11862 ++++++++++++++++++++++++++ config.guess | 1561 ++++ config.h.in | 244 + config.log | 361 + config.sub | 1686 ++++ configure.files | 2 + configure.in | 126 + configure.in.in | 6 + doc/Makefile.am | 6 + doc/cs/Makefile.am | 2 + doc/cs/asetting-cs.png | Bin 0 -> 22228 bytes doc/cs/fsetting-cs.png | Bin 0 -> 23450 bytes doc/cs/index.docbook | 1332 +++ doc/cs/knutclient-cs.png | Bin 0 -> 42103 bytes doc/cs/ksetting-cs.png | Bin 0 -> 21873 bytes doc/cs/mkicker-cs.png | Bin 0 -> 33881 bytes doc/cs/msetting-cs.png | Bin 0 -> 22388 bytes doc/cs/new-cs.png | Bin 0 -> 14626 bytes doc/cs/psetting-cs.png | Bin 0 -> 21681 bytes doc/cs/tkicker-cs.png | Bin 0 -> 11405 bytes doc/cs/usetting-cs.png | Bin 0 -> 17963 bytes doc/cs/variables-cs.png | Bin 0 -> 18185 bytes doc/en/Makefile.am | 2 + doc/en/asetting-en.png | Bin 0 -> 21098 bytes doc/en/fsetting-en.png | Bin 0 -> 22067 bytes doc/en/index.docbook | 1288 +++ doc/en/knutclient-en.png | Bin 0 -> 41328 bytes doc/en/ksetting-en.png | Bin 0 -> 21169 bytes doc/en/mkicker-en.png | Bin 0 -> 38389 bytes doc/en/msetting-en.png | Bin 0 -> 21737 bytes doc/en/new-en.png | Bin 0 -> 14297 bytes doc/en/psetting-en.png | Bin 0 -> 21043 bytes doc/en/tkicker-en.png | Bin 0 -> 13544 bytes doc/en/usetting-en.png | Bin 0 -> 17076 bytes doc/en/variables-en.png | Bin 0 -> 18492 bytes installDeb.sh | 9 + installFedora.sh | 9 + installMandriva.sh | 9 + installMandriva4.sh | 13 + pics/Makefile.am | 8 + pics/knc_analog.png | Bin 0 -> 1495 bytes pics/knc_batt.png | Bin 0 -> 263 bytes pics/knc_conn.png | Bin 0 -> 865 bytes pics/knc_dock.png | Bin 0 -> 704 bytes pics/knc_error.png | Bin 0 -> 521 bytes pics/knc_main.png | Bin 0 -> 731 bytes pics/knc_mpref.png | Bin 0 -> 1333 bytes pics/knc_mset.png | Bin 0 -> 1599 bytes pics/knc_panel.png | Bin 0 -> 1344 bytes pics/knc_ups.png | Bin 0 -> 529 bytes pics/knc_upses.png | Bin 0 -> 943 bytes po/Makefile.am | 3 + po/cs.po | 837 ++ po/de.po | 842 ++ po/es.po | 1029 +++ po/fr.po | 858 ++ po/it.po | 864 ++ po/knutclient.pot | 836 ++ po/pl.po | 837 ++ po/pt_BR.po | 843 ++ po/ru.po | 917 ++ po/uk.po | 918 ++ specs/Makefile.am | 6 + specs/knutclient.spec.fedora.10 | 58 + specs/knutclient.spec.fedora.5 | 56 + specs/knutclient.spec.fedora.8 | 60 + specs/knutclient.spec.fedora.9 | 60 + specs/knutclient.spec.mandrake.10.1 | 100 + specs/knutclient.spec.mandriva.2006 | 111 + specs/knutclient.spec.mandriva.2009 | 124 + src/Makefile.am | 41 + src/hi16-app-knutclient.png | Bin 0 -> 313 bytes src/hi16-app-knutclientconn.png | Bin 0 -> 865 bytes src/hi16-app-knutclienterr.png | Bin 0 -> 521 bytes src/hi32-app-knutclient.png | Bin 0 -> 523 bytes src/hi48-app-knutclient.png | Bin 0 -> 962 bytes src/knutanalog.cpp | 911 ++ src/knutanalog.h | 452 + src/knutclient.cpp | 1237 +++ src/knutclient.desktop | 20 + src/knutclient.h | 210 + src/knutclientui.rc | 24 + src/knutconst.h | 58 + src/knutdock.cpp | 976 +++ src/knutdock.h | 525 ++ src/knutfrontpanel.cpp | 676 ++ src/knutfrontpanel.h | 333 + src/knutinstcomms.cpp | 137 + src/knutinstcomms.h | 97 + src/knutmainwindow.cpp | 813 ++ src/knutmainwindow.h | 346 + src/knutmessage.cpp | 95 + src/knutmessage.h | 126 + src/knutmessagemanager.cpp | 121 + src/knutmessagemanager.h | 131 + src/knutnet.cpp | 1941 +++++ src/knutnet.h | 869 ++ src/knutnewupsdlg.cpp | 294 + src/knutnewupsdlg.h | 160 + src/knutpanelmeter.cpp | 353 + src/knutpanelmeter.h | 210 + src/knutprefdlg.cpp | 979 +++ src/knutprefdlg.h | 359 + src/knutprintupsvar.cpp | 210 + src/knutprintupsvar.h | 160 + src/knutrwvar.cpp | 217 + src/knutrwvar.h | 140 + src/knutupsdata.cpp | 78 + src/knutupsdata.h | 161 + src/knutvardata.cpp | 242 + src/knutvardata.h | 261 + src/lo16-app-knutclient.png | Bin 0 -> 167 bytes src/lo16-app-knutclientconn.png | Bin 0 -> 648 bytes src/lo16-app-knutclienterr.png | Bin 0 -> 262 bytes src/lo32-app-knutclient.png | Bin 0 -> 330 bytes src/main.cpp | 78 + stamp-h.in | 0 126 files changed, 42601 insertions(+) create mode 100755 AUTHORS create mode 100755 COPYING create mode 100755 ChangeLog create mode 100755 INSTALL create mode 100644 Makefile.am create mode 100644 Makefile.cvs create mode 100644 NEWS create mode 100755 README create mode 100755 TODO create mode 100644 acinclude.m4 create mode 100644 config.guess create mode 100755 config.h.in create mode 100644 config.log create mode 100644 config.sub create mode 100644 configure.files create mode 100644 configure.in create mode 100755 configure.in.in create mode 100755 doc/Makefile.am create mode 100755 doc/cs/Makefile.am create mode 100755 doc/cs/asetting-cs.png create mode 100755 doc/cs/fsetting-cs.png create mode 100755 doc/cs/index.docbook create mode 100755 doc/cs/knutclient-cs.png create mode 100644 doc/cs/ksetting-cs.png create mode 100644 doc/cs/mkicker-cs.png create mode 100755 doc/cs/msetting-cs.png create mode 100755 doc/cs/new-cs.png create mode 100755 doc/cs/psetting-cs.png create mode 100644 doc/cs/tkicker-cs.png create mode 100755 doc/cs/usetting-cs.png create mode 100644 doc/cs/variables-cs.png create mode 100755 doc/en/Makefile.am create mode 100755 doc/en/asetting-en.png create mode 100755 doc/en/fsetting-en.png create mode 100755 doc/en/index.docbook create mode 100755 doc/en/knutclient-en.png create mode 100644 doc/en/ksetting-en.png create mode 100644 doc/en/mkicker-en.png create mode 100755 doc/en/msetting-en.png create mode 100755 doc/en/new-en.png create mode 100755 doc/en/psetting-en.png create mode 100644 doc/en/tkicker-en.png create mode 100755 doc/en/usetting-en.png create mode 100644 doc/en/variables-en.png create mode 100755 installDeb.sh create mode 100755 installFedora.sh create mode 100755 installMandriva.sh create mode 100755 installMandriva4.sh create mode 100644 pics/Makefile.am create mode 100644 pics/knc_analog.png create mode 100644 pics/knc_batt.png create mode 100644 pics/knc_conn.png create mode 100644 pics/knc_dock.png create mode 100644 pics/knc_error.png create mode 100644 pics/knc_main.png create mode 100644 pics/knc_mpref.png create mode 100644 pics/knc_mset.png create mode 100644 pics/knc_panel.png create mode 100644 pics/knc_ups.png create mode 100644 pics/knc_upses.png create mode 100644 po/Makefile.am create mode 100644 po/cs.po create mode 100644 po/de.po create mode 100644 po/es.po create mode 100644 po/fr.po create mode 100644 po/it.po create mode 100644 po/knutclient.pot create mode 100644 po/pl.po create mode 100644 po/pt_BR.po create mode 100644 po/ru.po create mode 100644 po/uk.po create mode 100644 specs/Makefile.am create mode 100644 specs/knutclient.spec.fedora.10 create mode 100644 specs/knutclient.spec.fedora.5 create mode 100644 specs/knutclient.spec.fedora.8 create mode 100644 specs/knutclient.spec.fedora.9 create mode 100644 specs/knutclient.spec.mandrake.10.1 create mode 100644 specs/knutclient.spec.mandriva.2006 create mode 100755 specs/knutclient.spec.mandriva.2009 create mode 100644 src/Makefile.am create mode 100644 src/hi16-app-knutclient.png create mode 100755 src/hi16-app-knutclientconn.png create mode 100644 src/hi16-app-knutclienterr.png create mode 100644 src/hi32-app-knutclient.png create mode 100644 src/hi48-app-knutclient.png create mode 100644 src/knutanalog.cpp create mode 100644 src/knutanalog.h create mode 100755 src/knutclient.cpp create mode 100644 src/knutclient.desktop create mode 100755 src/knutclient.h create mode 100644 src/knutclientui.rc create mode 100755 src/knutconst.h create mode 100755 src/knutdock.cpp create mode 100755 src/knutdock.h create mode 100755 src/knutfrontpanel.cpp create mode 100755 src/knutfrontpanel.h create mode 100755 src/knutinstcomms.cpp create mode 100755 src/knutinstcomms.h create mode 100644 src/knutmainwindow.cpp create mode 100644 src/knutmainwindow.h create mode 100644 src/knutmessage.cpp create mode 100644 src/knutmessage.h create mode 100644 src/knutmessagemanager.cpp create mode 100644 src/knutmessagemanager.h create mode 100755 src/knutnet.cpp create mode 100755 src/knutnet.h create mode 100644 src/knutnewupsdlg.cpp create mode 100644 src/knutnewupsdlg.h create mode 100644 src/knutpanelmeter.cpp create mode 100644 src/knutpanelmeter.h create mode 100644 src/knutprefdlg.cpp create mode 100644 src/knutprefdlg.h create mode 100644 src/knutprintupsvar.cpp create mode 100755 src/knutprintupsvar.h create mode 100755 src/knutrwvar.cpp create mode 100755 src/knutrwvar.h create mode 100644 src/knutupsdata.cpp create mode 100644 src/knutupsdata.h create mode 100755 src/knutvardata.cpp create mode 100755 src/knutvardata.h create mode 100644 src/lo16-app-knutclient.png create mode 100644 src/lo16-app-knutclientconn.png create mode 100644 src/lo16-app-knutclienterr.png create mode 100644 src/lo32-app-knutclient.png create mode 100644 src/main.cpp create mode 100755 stamp-h.in diff --git a/AUTHORS b/AUTHORS new file mode 100755 index 0000000..93a78fa --- /dev/null +++ b/AUTHORS @@ -0,0 +1,4 @@ +Daniel Prynych + + + diff --git a/COPYING b/COPYING new file mode 100755 index 0000000..c13faf0 --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog new file mode 100755 index 0000000..8956f4b --- /dev/null +++ b/ChangeLog @@ -0,0 +1,129 @@ +0.1 First version + +0.2 Switched preferences in style KDE 2.2 + Added save/load configuration file + +0.3 Added OUTPUT CURRENT + Added RUNTIME on panel + Added switch 230/120V and 50/60Hz + Added read XFER from UPS + Added more members on main (front) panel + +0.3.2 Added German localization - Crissi + Added Italian localization - Andrea + Added Tool Tip in main (front) panel + +0.4.0 Added setting font for main (front) a analog panels + Added BATT_CURRENT + Added BATT_TEMP + +0.4.1 First revision for KDE 3 + +0.5.0 Added autorange for output current, battery current and battery voltage + Added new UPS dialog (autosizing) + Added view of all UPS(NUT) variables + Added French localization + Cleaning code + +0.6.0 Added change color for background of main panel + Added change color for background of main window + Added change color of analog panels (background, finger, font ...) + Changes in knutnet. I started clean code in knutnet. + First version of manual, now in Czech language only. Sorry. + Changed in view if all UPS(NUT) variables + Added running instant commands + Added setting RW variables + +0.6.1 Added list of error to statusbar. + New (faster) version of KNutNet class. + First version of manual in English language. + +0.7.0 Added support for new protocol client-sever and new versions of variables. + New version window for showing variables. + New version of core. Core were divided on two parts, the core and the main window. + Added Russian localization. - Oleg Shevchenko + Added Ukrainian localization. - Oleg Shevchenko + Added quicker return from lost connection to data OK. + Added correct for connection on bad line, when protocol UDP is used. + Changed in preferences window. Main protocol is TCP now. + Corrected a few small mistakes. + +0.7.1 Correct dead-lock of knutclient when upsd crashed + +0.7.2 New version of Handbook (only Czech language). + New showing runtime. + Corrected problem witch Handbook for KDE 3.1.x. + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=210962 + New Handbook for Czech language. + Changed for add/delete the first ups. + +0.7.3 New version of Handbook. + Corrected frequence/frequency error + +0.8.0 New showing of runtime, when connection is down (-:--) + Small changes in code. + Zeroing analog panels when connection is down. + Corrected knutnet.h for FreeBSD + (Carlos Fernando Assis Paniago) + New icons + Corrected "save properties" for KDE Logout + +0.8.1 New look + Added shortcut, dialog for configuring key settings. + (Laurent Montel) + +0.8.2 Changed code for KDE 3.2.x, correct QPallete problem + Corrected connect (...) in KNutMessageManager class + +0.8.2.1 Corrected for gcc-3.4 + (Andrea Joachens) + +0.8.3 Corrected version number for Debian + Corrected French localization + +0.8.4 Added refresh connection (reconnect) + +0.8.5 Corrected maximum values for battery voltage, battery current and output current + when big UPS (Powerware 9305, ......) is used. + +0.8.6 Correct German localization + +0.9.0 Made new net layer. + Connecting is asynchrone now. + End of supporting UDP protocol. + KDE older then 3.0.0 already is not supported. + +0.9.1 Added checkbox for turn on/off of error message window +0.9.2 Added support for automake 1.8 and 1.9 + Added Spanish localization. + (Sir Mad) + New categories for knutclient are 'Qt;KDE;System;Monitor;' + (Sir Mad) +0.9.3 Corrected error for x86_64 environment + (Alexey Sidorov) +0.9.4 Made facelift of analog pointers + Added: click on dock makes or activates main window + Added: Show message when KNC is connected on NUT server again. + Added New error message AlreadySetUsername + Added: New analog panel "Output frequency". + Added: New error message NoListVars. + Corrected: All message window have timeout now and use message manager. + Corrected: Icon in dock has transparent background now. + Corrected: New message window rewrites older message window when has same priority + Corrected: Corrected problem with logon when was switched on other NUT server + Corrected: Corrected problem when values of status was "WAIT" + Corrected: Corrected error in knutdock.h + (Sunil) +0.9.5 + Added Polish localization - Tomasz Walach + Added: Into comboBox, for setting main window, was added values "Auto". + Added: New icons for preference window. + Changed: KNC is running on KDE 4 /on distribution which uses KDE4 a has + support for aplication from KDE3 / a little better. + Changed: Window for select of UPS values was changed. + Changed: Index file for czech language uses UTF8, older versions use iso-8859-2 + Corrected: Font for analog meter's values is changed/repainted immediately. + + + + diff --git a/INSTALL b/INSTALL new file mode 100755 index 0000000..02a4a07 --- /dev/null +++ b/INSTALL @@ -0,0 +1,167 @@ +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes a while. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Type `make install' to install the programs and any data files and + documentation. + + 4. You can remove the program binaries and object files from the + source code directory by typing `make clean'. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..195d5b6 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,24 @@ +SUBDIRS = $(TOPSUBDIRS) + +$(top_srcdir)/configure.in: configure.in.in $(top_srcdir)/subdirs + cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common configure.in ; + +$(top_srcdir)/subdirs: + cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common subdirs + +$(top_srcdir)/acinclude.m4: $(top_srcdir)/admin/acinclude.m4.in $(top_srcdir)/admin/libtool.m4.in + @cd $(top_srcdir) && cat admin/acinclude.m4.in admin/libtool.m4.in > acinclude.m4 + +MAINTAINERCLEANFILES = subdirs configure.in acinclude.m4 configure.files + +package-messages: + cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common package-messages + $(MAKE) -C po merge + +EXTRA_DIST = admin COPYING configure.in.in + +dist-hook: + cd $(top_distdir) && perl admin/am_edit -padmin + cd $(top_distdir) && $(MAKE) -f admin/Makefile.common subdirs +noinst_HEADERS = Makefile.cvs installDeb.sh installFedora.sh installMandriva.sh \ + installMandriva4.sh diff --git a/Makefile.cvs b/Makefile.cvs new file mode 100644 index 0000000..4c0afd1 --- /dev/null +++ b/Makefile.cvs @@ -0,0 +1,10 @@ +all: + @echo "This Makefile is only for the CVS repository" + @echo "This will be deleted before making the distribution" + @echo "" + $(MAKE) -f admin/Makefile.common cvs + +dist: + $(MAKE) -f admin/Makefile.common dist + +.SILENT: diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/README b/README new file mode 100755 index 0000000..3051dc1 --- /dev/null +++ b/README @@ -0,0 +1 @@ +Knutclient is GUI client for UPS system NUT. \ No newline at end of file diff --git a/TODO b/TODO new file mode 100755 index 0000000..e69de29 diff --git a/acinclude.m4 b/acinclude.m4 new file mode 100644 index 0000000..094ebf5 --- /dev/null +++ b/acinclude.m4 @@ -0,0 +1,11862 @@ +## -*- autoconf -*- + +dnl This file is part of the KDE libraries/packages +dnl Copyright (C) 1997 Janos Farkas (chexum@shadow.banki.hu) +dnl (C) 1997,98,99 Stephan Kulow (coolo@kde.org) + +dnl This file is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Library General Public +dnl License as published by the Free Software Foundation; either +dnl version 2 of the License, or (at your option) any later version. + +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Library General Public License for more details. + +dnl You should have received a copy of the GNU Library General Public License +dnl along with this library; see the file COPYING.LIB. If not, write to +dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +dnl Boston, MA 02110-1301, USA. + +dnl IMPORTANT NOTE: +dnl Please do not modify this file unless you expect your modifications to be +dnl carried into every other module in the repository. +dnl +dnl Single-module modifications are best placed in configure.in for kdelibs +dnl and kdebase or configure.in.in if present. + +# KDE_PATH_X_DIRECT +dnl Internal subroutine of AC_PATH_X. +dnl Set ac_x_includes and/or ac_x_libraries. +AC_DEFUN([KDE_PATH_X_DIRECT], +[ +AC_REQUIRE([KDE_CHECK_LIB64]) + +if test "$ac_x_includes" = NO; then + # Guess where to find include files, by looking for this one X11 .h file. + test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h + + # First, try using that file with no special directory specified. +AC_TRY_CPP([#include <$x_direct_test_include>], +[# We can compile using X headers with no special include directory. +ac_x_includes=], +[# Look for the header file in a standard set of common directories. +# Check X11 before X11Rn because it is often a symlink to the current release. + for ac_dir in \ + /usr/X11/include \ + /usr/X11R6/include \ + /usr/X11R5/include \ + /usr/X11R4/include \ + \ + /usr/include/X11 \ + /usr/include/X11R6 \ + /usr/include/X11R5 \ + /usr/include/X11R4 \ + \ + /usr/local/X11/include \ + /usr/local/X11R6/include \ + /usr/local/X11R5/include \ + /usr/local/X11R4/include \ + \ + /usr/local/include/X11 \ + /usr/local/include/X11R6 \ + /usr/local/include/X11R5 \ + /usr/local/include/X11R4 \ + \ + /usr/X386/include \ + /usr/x386/include \ + /usr/XFree86/include/X11 \ + \ + /usr/include \ + /usr/local/include \ + /usr/unsupported/include \ + /usr/athena/include \ + /usr/local/x11r5/include \ + /usr/lpp/Xamples/include \ + \ + /usr/openwin/include \ + /usr/openwin/share/include \ + ; \ + do + if test -r "$ac_dir/$x_direct_test_include"; then + ac_x_includes=$ac_dir + break + fi + done]) +fi # $ac_x_includes = NO + +if test "$ac_x_libraries" = NO; then + # Check for the libraries. + + test -z "$x_direct_test_library" && x_direct_test_library=Xt + test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc + + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS="$LIBS" + LIBS="-l$x_direct_test_library $LIBS" +AC_TRY_LINK([#include ], [${x_direct_test_function}(1)], +[LIBS="$ac_save_LIBS" +# We can link X programs with no special library path. +ac_x_libraries=], +[LIBS="$ac_save_LIBS" +# First see if replacing the include by lib works. +# Check X11 before X11Rn because it is often a symlink to the current release. +for ac_dir in `echo "$ac_x_includes" | sed s/include/lib${kdelibsuff}/` \ + /usr/X11/lib${kdelibsuff} \ + /usr/X11R6/lib${kdelibsuff} \ + /usr/X11R5/lib${kdelibsuff} \ + /usr/X11R4/lib${kdelibsuff} \ + \ + /usr/lib${kdelibsuff}/X11 \ + /usr/lib${kdelibsuff}/X11R6 \ + /usr/lib${kdelibsuff}/X11R5 \ + /usr/lib${kdelibsuff}/X11R4 \ + \ + /usr/local/X11/lib${kdelibsuff} \ + /usr/local/X11R6/lib${kdelibsuff} \ + /usr/local/X11R5/lib${kdelibsuff} \ + /usr/local/X11R4/lib${kdelibsuff} \ + \ + /usr/local/lib${kdelibsuff}/X11 \ + /usr/local/lib${kdelibsuff}/X11R6 \ + /usr/local/lib${kdelibsuff}/X11R5 \ + /usr/local/lib${kdelibsuff}/X11R4 \ + \ + /usr/X386/lib${kdelibsuff} \ + /usr/x386/lib${kdelibsuff} \ + /usr/XFree86/lib${kdelibsuff}/X11 \ + \ + /usr/lib${kdelibsuff} \ + /usr/local/lib${kdelibsuff} \ + /usr/unsupported/lib${kdelibsuff} \ + /usr/athena/lib${kdelibsuff} \ + /usr/local/x11r5/lib${kdelibsuff} \ + /usr/lpp/Xamples/lib${kdelibsuff} \ + /lib/usr/lib${kdelibsuff}/X11 \ + \ + /usr/openwin/lib${kdelibsuff} \ + /usr/openwin/share/lib${kdelibsuff} \ + ; \ +do +dnl Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl; do + if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done]) +fi # $ac_x_libraries = NO +]) + + +dnl ------------------------------------------------------------------------ +dnl Find a file (or one of more files in a list of dirs) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_FIND_FILE], +[ +$3=NO +for i in $2; +do + for j in $1; + do + echo "configure: __oline__: $i/$j" >&AC_FD_CC + if test -r "$i/$j"; then + echo "taking that" >&AC_FD_CC + $3=$i + break 2 + fi + done +done +]) + +dnl KDE_FIND_PATH(program-name, variable-name, list-of-dirs, +dnl if-not-found, test-parameter, prepend-path) +dnl +dnl Look for program-name in list-of-dirs+$PATH. +dnl If prepend-path is set, look in $PATH+list-of-dirs instead. +dnl If found, $variable-name is set. If not, if-not-found is evaluated. +dnl test-parameter: if set, the program is executed with this arg, +dnl and only a successful exit code is required. +AC_DEFUN([KDE_FIND_PATH], +[ + AC_MSG_CHECKING([for $1]) + if test -n "$$2"; then + kde_cv_path="$$2"; + else + kde_cache=`echo $1 | sed 'y%./+-%__p_%'` + + AC_CACHE_VAL(kde_cv_path_$kde_cache, + [ + kde_cv_path="NONE" + kde_save_IFS=$IFS + IFS=':' + dirs="" + for dir in $PATH; do + dirs="$dirs $dir" + done + if test -z "$6"; then dnl Append dirs in PATH (default) + dirs="$3 $dirs" + else dnl Prepend dirs in PATH (if 6th arg is set) + dirs="$dirs $3" + fi + IFS=$kde_save_IFS + + for dir in $dirs; do + if test -x "$dir/$1"; then + if test -n "$5" + then + evalstr="$dir/$1 $5 2>&1 " + if eval $evalstr; then + kde_cv_path="$dir/$1" + break + fi + else + kde_cv_path="$dir/$1" + break + fi + fi + done + + eval "kde_cv_path_$kde_cache=$kde_cv_path" + + ]) + + eval "kde_cv_path=\"`echo '$kde_cv_path_'$kde_cache`\"" + + fi + + if test -z "$kde_cv_path" || test "$kde_cv_path" = NONE; then + AC_MSG_RESULT(not found) + $4 + else + AC_MSG_RESULT($kde_cv_path) + $2=$kde_cv_path + + fi +]) + +AC_DEFUN([KDE_MOC_ERROR_MESSAGE], +[ + AC_MSG_ERROR([No Qt meta object compiler (moc) found! +Please check whether you installed Qt correctly. +You need to have a running moc binary. +configure tried to run $ac_cv_path_moc and the test didn't +succeed. If configure shouldn't have tried this one, set +the environment variable MOC to the right one before running +configure. +]) +]) + +AC_DEFUN([KDE_UIC_ERROR_MESSAGE], +[ + AC_MSG_WARN([No Qt ui compiler (uic) found! +Please check whether you installed Qt correctly. +You need to have a running uic binary. +configure tried to run $ac_cv_path_uic and the test didn't +succeed. If configure shouldn't have tried this one, set +the environment variable UIC to the right one before running +configure. +]) +]) + + +AC_DEFUN([KDE_CHECK_UIC_FLAG], +[ + AC_MSG_CHECKING([whether uic supports -$1 ]) + kde_cache=`echo $1 | sed 'y% .=/+-%____p_%'` + AC_CACHE_VAL(kde_cv_prog_uic_$kde_cache, + [ + cat >conftest.ui < +EOT + ac_uic_testrun="$UIC_PATH -$1 $2 conftest.ui >/dev/null" + if AC_TRY_EVAL(ac_uic_testrun); then + eval "kde_cv_prog_uic_$kde_cache=yes" + else + eval "kde_cv_prog_uic_$kde_cache=no" + fi + rm -f conftest* + ]) + + if eval "test \"`echo '$kde_cv_prog_uic_'$kde_cache`\" = yes"; then + AC_MSG_RESULT([yes]) + : + $3 + else + AC_MSG_RESULT([no]) + : + $4 + fi +]) + + +dnl ------------------------------------------------------------------------ +dnl Find the meta object compiler and the ui compiler in the PATH, +dnl in $QTDIR/bin, and some more usual places +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_PATH_QT_MOC_UIC], +[ + AC_REQUIRE([KDE_CHECK_PERL]) + qt_bindirs="" + for dir in $kde_qt_dirs; do + qt_bindirs="$qt_bindirs $dir/bin $dir/src/moc" + done + qt_bindirs="$qt_bindirs /usr/bin /usr/X11R6/bin /usr/local/qt/bin" + if test ! "$ac_qt_bindir" = "NO"; then + qt_bindirs="$ac_qt_bindir $qt_bindirs" + fi + + KDE_FIND_PATH(moc, MOC, [$qt_bindirs], [KDE_MOC_ERROR_MESSAGE]) + if test -z "$UIC_NOT_NEEDED"; then + KDE_FIND_PATH(uic, UIC_PATH, [$qt_bindirs], [UIC_PATH=""]) + if test -z "$UIC_PATH" ; then + KDE_UIC_ERROR_MESSAGE + exit 1 + else + UIC=$UIC_PATH + + if test $kde_qtver = 3; then + KDE_CHECK_UIC_FLAG(L,[/nonexistent],ac_uic_supports_libpath=yes,ac_uic_supports_libpath=no) + KDE_CHECK_UIC_FLAG(nounload,,ac_uic_supports_nounload=yes,ac_uic_supports_nounload=no) + + if test x$ac_uic_supports_libpath = xyes; then + UIC="$UIC -L \$(kde_widgetdir)" + fi + if test x$ac_uic_supports_nounload = xyes; then + UIC="$UIC -nounload" + fi + fi + fi + else + UIC="echo uic not available: " + fi + + AC_SUBST(MOC) + AC_SUBST(UIC) + + UIC_TR="i18n" + if test $kde_qtver = 3; then + UIC_TR="tr2i18n" + fi + + AC_SUBST(UIC_TR) +]) + +AC_DEFUN([KDE_1_CHECK_PATHS], +[ + KDE_1_CHECK_PATH_HEADERS + + KDE_TEST_RPATH= + + if test -n "$USE_RPATH"; then + + if test -n "$kde_libraries"; then + KDE_TEST_RPATH="-R $kde_libraries" + fi + + if test -n "$qt_libraries"; then + KDE_TEST_RPATH="$KDE_TEST_RPATH -R $qt_libraries" + fi + + if test -n "$x_libraries"; then + KDE_TEST_RPATH="$KDE_TEST_RPATH -R $x_libraries" + fi + + KDE_TEST_RPATH="$KDE_TEST_RPATH $KDE_EXTRA_RPATH" + fi + +AC_MSG_CHECKING([for KDE libraries installed]) +ac_link='$LIBTOOL_SHELL --silent --mode=link ${CXX-g++} -o conftest $CXXFLAGS $all_includes $CPPFLAGS $LDFLAGS $all_libraries conftest.$ac_ext $LIBS -lkdecore $LIBQT $KDE_TEST_RPATH 1>&5' + +if AC_TRY_EVAL(ac_link) && test -s conftest; then + AC_MSG_RESULT(yes) +else + AC_MSG_ERROR([your system fails at linking a small KDE application! +Check, if your compiler is installed correctly and if you have used the +same compiler to compile Qt and kdelibs as you did use now. +For more details about this problem, look at the end of config.log.]) +fi + +if eval `KDEDIR= ./conftest 2>&5`; then + kde_result=done +else + kde_result=problems +fi + +KDEDIR= ./conftest 2> /dev/null >&5 # make an echo for config.log +kde_have_all_paths=yes + +KDE_SET_PATHS($kde_result) + +]) + +AC_DEFUN([KDE_SET_PATHS], +[ + kde_cv_all_paths="kde_have_all_paths=\"yes\" \ + kde_htmldir=\"$kde_htmldir\" \ + kde_appsdir=\"$kde_appsdir\" \ + kde_icondir=\"$kde_icondir\" \ + kde_sounddir=\"$kde_sounddir\" \ + kde_datadir=\"$kde_datadir\" \ + kde_locale=\"$kde_locale\" \ + kde_cgidir=\"$kde_cgidir\" \ + kde_confdir=\"$kde_confdir\" \ + kde_kcfgdir=\"$kde_kcfgdir\" \ + kde_mimedir=\"$kde_mimedir\" \ + kde_toolbardir=\"$kde_toolbardir\" \ + kde_wallpaperdir=\"$kde_wallpaperdir\" \ + kde_templatesdir=\"$kde_templatesdir\" \ + kde_bindir=\"$kde_bindir\" \ + kde_servicesdir=\"$kde_servicesdir\" \ + kde_servicetypesdir=\"$kde_servicetypesdir\" \ + kde_moduledir=\"$kde_moduledir\" \ + kde_styledir=\"$kde_styledir\" \ + kde_widgetdir=\"$kde_widgetdir\" \ + xdg_appsdir=\"$xdg_appsdir\" \ + xdg_menudir=\"$xdg_menudir\" \ + xdg_directorydir=\"$xdg_directorydir\" \ + kde_result=$1" +]) + +AC_DEFUN([KDE_SET_DEFAULT_PATHS], +[ +if test "$1" = "default"; then + + if test -z "$kde_htmldir"; then + kde_htmldir='\${datadir}/doc/kde/HTML' + fi + if test -z "$kde_appsdir"; then + kde_appsdir='\${datadir}/applnk' + fi + if test -z "$kde_icondir"; then + kde_icondir='\${datadir}/icons' + fi + if test -z "$kde_sounddir"; then + kde_sounddir='\${datadir}/sounds' + fi + if test -z "$kde_datadir"; then + kde_datadir='\${datadir}/apps' + fi + if test -z "$kde_locale"; then + kde_locale='\${datadir}/locale' + fi + if test -z "$kde_cgidir"; then + kde_cgidir='\${exec_prefix}/cgi-bin' + fi + if test -z "$kde_confdir"; then + kde_confdir='\${datadir}/config' + fi + if test -z "$kde_kcfgdir"; then + kde_kcfgdir='\${datadir}/config.kcfg' + fi + if test -z "$kde_mimedir"; then + kde_mimedir='\${datadir}/mimelnk' + fi + if test -z "$kde_toolbardir"; then + kde_toolbardir='\${datadir}/toolbar' + fi + if test -z "$kde_wallpaperdir"; then + kde_wallpaperdir='\${datadir}/wallpapers' + fi + if test -z "$kde_templatesdir"; then + kde_templatesdir='\${datadir}/templates' + fi + if test -z "$kde_bindir"; then + kde_bindir='\${exec_prefix}/bin' + fi + if test -z "$kde_servicesdir"; then + kde_servicesdir='\${datadir}/services' + fi + if test -z "$kde_servicetypesdir"; then + kde_servicetypesdir='\${datadir}/servicetypes' + fi + if test -z "$kde_moduledir"; then + if test "$kde_qtver" = "2"; then + kde_moduledir='\${libdir}/kde2' + else + kde_moduledir='\${libdir}/kde3' + fi + fi + if test -z "$kde_styledir"; then + kde_styledir='\${libdir}/kde3/plugins/styles' + fi + if test -z "$kde_widgetdir"; then + kde_widgetdir='\${libdir}/kde3/plugins/designer' + fi + if test -z "$xdg_appsdir"; then + xdg_appsdir='\${datadir}/applications/kde' + fi + if test -z "$xdg_menudir"; then + xdg_menudir='\${sysconfdir}/xdg/menus' + fi + if test -z "$xdg_directorydir"; then + xdg_directorydir='\${datadir}/desktop-directories' + fi + + KDE_SET_PATHS(defaults) + +else + + if test $kde_qtver = 1; then + AC_MSG_RESULT([compiling]) + KDE_1_CHECK_PATHS + else + AC_MSG_ERROR([path checking not yet supported for KDE 2]) + fi + +fi +]) + +AC_DEFUN([KDE_CHECK_PATHS_FOR_COMPLETENESS], +[ if test -z "$kde_htmldir" || test -z "$kde_appsdir" || + test -z "$kde_icondir" || test -z "$kde_sounddir" || + test -z "$kde_datadir" || test -z "$kde_locale" || + test -z "$kde_cgidir" || test -z "$kde_confdir" || + test -z "$kde_kcfgdir" || + test -z "$kde_mimedir" || test -z "$kde_toolbardir" || + test -z "$kde_wallpaperdir" || test -z "$kde_templatesdir" || + test -z "$kde_bindir" || test -z "$kde_servicesdir" || + test -z "$kde_servicetypesdir" || test -z "$kde_moduledir" || + test -z "$kde_styledir" || test -z "kde_widgetdir" || + test -z "$xdg_appsdir" || test -z "$xdg_menudir" || test -z "$xdg_directorydir" || + test "x$kde_have_all_paths" != "xyes"; then + kde_have_all_paths=no + fi +]) + +AC_DEFUN([KDE_MISSING_PROG_ERROR], +[ + AC_MSG_ERROR([The important program $1 was not found! +Please check whether you installed KDE correctly. +]) +]) + +AC_DEFUN([KDE_MISSING_ARTS_ERROR], +[ + AC_MSG_ERROR([The important program $1 was not found! +Please check whether you installed aRts correctly or use +--without-arts to compile without aRts support (this will remove functionality). +]) +]) + +AC_DEFUN([KDE_SET_DEFAULT_BINDIRS], +[ + kde_default_bindirs="/usr/bin /usr/local/bin /opt/local/bin /usr/X11R6/bin /opt/kde/bin /opt/kde3/bin /usr/kde/bin /usr/local/kde/bin" + test -n "$KDEDIR" && kde_default_bindirs="$KDEDIR/bin $kde_default_bindirs" + if test -n "$KDEDIRS"; then + kde_save_IFS=$IFS + IFS=: + for dir in $KDEDIRS; do + kde_default_bindirs="$dir/bin $kde_default_bindirs " + done + IFS=$kde_save_IFS + fi +]) + +AC_DEFUN([KDE_SUBST_PROGRAMS], +[ + AC_ARG_WITH(arts, + AC_HELP_STRING([--without-arts],[build without aRts [default=no]]), + [build_arts=$withval], + [build_arts=yes] + ) + AM_CONDITIONAL(include_ARTS, test "$build_arts" '!=' "no") + if test "$build_arts" = "no"; then + AC_DEFINE(WITHOUT_ARTS, 1, [Defined if compiling without arts]) + fi + + KDE_SET_DEFAULT_BINDIRS + kde_default_bindirs="$exec_prefix/bin $prefix/bin $kde_libs_prefix/bin $kde_default_bindirs" + KDE_FIND_PATH(dcopidl, DCOPIDL, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl)]) + KDE_FIND_PATH(dcopidl2cpp, DCOPIDL2CPP, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl2cpp)]) + if test "$build_arts" '!=' "no"; then + KDE_FIND_PATH(mcopidl, MCOPIDL, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(mcopidl)]) + KDE_FIND_PATH(artsc-config, ARTSCCONFIG, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(artsc-config)]) + fi + KDE_FIND_PATH(meinproc, MEINPROC, [$kde_default_bindirs]) + + kde32ornewer=1 + kde33ornewer=1 + if test -n "$kde_qtver" && test "$kde_qtver" -lt 3; then + kde32ornewer= + kde33ornewer= + else + if test "$kde_qtver" = "3"; then + if test "$kde_qtsubver" -le 1; then + kde32ornewer= + fi + if test "$kde_qtsubver" -le 2; then + kde33ornewer= + fi + if test "$KDECONFIG" != "compiled"; then + if test `$KDECONFIG --version | grep KDE | sed 's/KDE: \(...\).*/\1/'` = 3.2; then + kde33ornewer= + fi + fi + fi + fi + + if test -n "$kde32ornewer"; then + KDE_FIND_PATH(kconfig_compiler, KCONFIG_COMPILER, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kconfig_compiler)]) + KDE_FIND_PATH(dcopidlng, DCOPIDLNG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidlng)]) + fi + if test -n "$kde33ornewer"; then + KDE_FIND_PATH(makekdewidgets, MAKEKDEWIDGETS, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(makekdewidgets)]) + AC_SUBST(MAKEKDEWIDGETS) + fi + KDE_FIND_PATH(xmllint, XMLLINT, [${prefix}/bin ${exec_prefix}/bin], [XMLLINT=""]) + + if test -n "$MEINPROC" -a "$MEINPROC" != "compiled"; then + kde_sharedirs="/usr/share/kde /usr/local/share /usr/share /opt/kde3/share /opt/kde/share $prefix/share" + test -n "$KDEDIR" && kde_sharedirs="$KDEDIR/share $kde_sharedirs" + AC_FIND_FILE(apps/ksgmltools2/customization/kde-chunk.xsl, $kde_sharedirs, KDE_XSL_STYLESHEET) + if test "$KDE_XSL_STYLESHEET" = "NO"; then + KDE_XSL_STYLESHEET="" + else + KDE_XSL_STYLESHEET="$KDE_XSL_STYLESHEET/apps/ksgmltools2/customization/kde-chunk.xsl" + fi + fi + + DCOP_DEPENDENCIES='$(DCOPIDL)' + if test -n "$kde32ornewer"; then + KCFG_DEPENDENCIES='$(KCONFIG_COMPILER)' + DCOP_DEPENDENCIES='$(DCOPIDL) $(DCOPIDLNG)' + AC_SUBST(KCONFIG_COMPILER) + AC_SUBST(KCFG_DEPENDENCIES) + AC_SUBST(DCOPIDLNG) + fi + AC_SUBST(DCOPIDL) + AC_SUBST(DCOPIDL2CPP) + AC_SUBST(DCOP_DEPENDENCIES) + AC_SUBST(MCOPIDL) + AC_SUBST(ARTSCCONFIG) + AC_SUBST(MEINPROC) + AC_SUBST(KDE_XSL_STYLESHEET) + AC_SUBST(XMLLINT) +])dnl + +AC_DEFUN([AC_CREATE_KFSSTND], +[ +AC_REQUIRE([AC_CHECK_RPATH]) + +AC_MSG_CHECKING([for KDE paths]) +kde_result="" +kde_cached_paths=yes +AC_CACHE_VAL(kde_cv_all_paths, +[ + KDE_SET_DEFAULT_PATHS($1) + kde_cached_paths=no +]) +eval "$kde_cv_all_paths" +KDE_CHECK_PATHS_FOR_COMPLETENESS +if test "$kde_have_all_paths" = "no" && test "$kde_cached_paths" = "yes"; then + # wrong values were cached, may be, we can set better ones + kde_result= + kde_htmldir= kde_appsdir= kde_icondir= kde_sounddir= + kde_datadir= kde_locale= kde_cgidir= kde_confdir= kde_kcfgdir= + kde_mimedir= kde_toolbardir= kde_wallpaperdir= kde_templatesdir= + kde_bindir= kde_servicesdir= kde_servicetypesdir= kde_moduledir= + kde_have_all_paths= + kde_styledir= + kde_widgetdir= + xdg_appsdir = xdg_menudir= xdg_directorydir= + KDE_SET_DEFAULT_PATHS($1) + eval "$kde_cv_all_paths" + KDE_CHECK_PATHS_FOR_COMPLETENESS + kde_result="$kde_result (cache overridden)" +fi +if test "$kde_have_all_paths" = "no"; then + AC_MSG_ERROR([configure could not run a little KDE program to test the environment. +Since it had compiled and linked before, it must be a strange problem on your system. +Look at config.log for details. If you are not able to fix this, look at +http://www.kde.org/faq/installation.html or any www.kde.org mirror. +(If you're using an egcs version on Linux, you may update binutils!) +]) +else + rm -f conftest* + AC_MSG_RESULT($kde_result) +fi + +bindir=$kde_bindir + +KDE_SUBST_PROGRAMS + +]) + +AC_DEFUN([AC_SUBST_KFSSTND], +[ +AC_SUBST(kde_htmldir) +AC_SUBST(kde_appsdir) +AC_SUBST(kde_icondir) +AC_SUBST(kde_sounddir) +AC_SUBST(kde_datadir) +AC_SUBST(kde_locale) +AC_SUBST(kde_confdir) +AC_SUBST(kde_kcfgdir) +AC_SUBST(kde_mimedir) +AC_SUBST(kde_wallpaperdir) +AC_SUBST(kde_bindir) +dnl X Desktop Group standards +AC_SUBST(xdg_appsdir) +AC_SUBST(xdg_menudir) +AC_SUBST(xdg_directorydir) +dnl for KDE 2 +AC_SUBST(kde_templatesdir) +AC_SUBST(kde_servicesdir) +AC_SUBST(kde_servicetypesdir) +AC_SUBST(kde_moduledir) +AC_SUBST(kdeinitdir, '$(kde_moduledir)') +AC_SUBST(kde_styledir) +AC_SUBST(kde_widgetdir) +if test "$kde_qtver" = 1; then + kde_minidir="$kde_icondir/mini" +else +# for KDE 1 - this breaks KDE2 apps using minidir, but +# that's the plan ;-/ + kde_minidir="/dev/null" +fi +dnl AC_SUBST(kde_minidir) +dnl AC_SUBST(kde_cgidir) +dnl AC_SUBST(kde_toolbardir) +]) + +AC_DEFUN([KDE_MISC_TESTS], +[ + dnl Checks for libraries. + AC_CHECK_LIB(util, main, [LIBUTIL="-lutil"]) dnl for *BSD + AC_SUBST(LIBUTIL) + AC_CHECK_LIB(compat, main, [LIBCOMPAT="-lcompat"]) dnl for *BSD + AC_SUBST(LIBCOMPAT) + kde_have_crypt= + AC_CHECK_LIB(crypt, crypt, [LIBCRYPT="-lcrypt"; kde_have_crypt=yes], + AC_CHECK_LIB(c, crypt, [kde_have_crypt=yes], [ + AC_MSG_WARN([you have no crypt in either libcrypt or libc. +You should install libcrypt from another source or configure with PAM +support]) + kde_have_crypt=no + ])) + AC_SUBST(LIBCRYPT) + if test $kde_have_crypt = yes; then + AC_DEFINE_UNQUOTED(HAVE_CRYPT, 1, [Defines if your system has the crypt function]) + fi + AC_CHECK_SOCKLEN_T + AC_CHECK_LIB(dnet, dnet_ntoa, [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"]) + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + AC_CHECK_LIB(dnet_stub, dnet_ntoa, + [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"]) + fi + AC_CHECK_FUNC(inet_ntoa) + if test $ac_cv_func_inet_ntoa = no; then + AC_CHECK_LIB(nsl, inet_ntoa, X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl") + fi + AC_CHECK_FUNC(connect) + if test $ac_cv_func_connect = no; then + AC_CHECK_LIB(socket, connect, X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS", , + $X_EXTRA_LIBS) + fi + + AC_CHECK_FUNC(remove) + if test $ac_cv_func_remove = no; then + AC_CHECK_LIB(posix, remove, X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix") + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + AC_CHECK_FUNC(shmat, , + AC_CHECK_LIB(ipc, shmat, X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc")) + + # more headers that need to be explicitly included on darwin + AC_CHECK_HEADERS(sys/types.h stdint.h) + + # sys/bitypes.h is needed for uint32_t and friends on Tru64 + AC_CHECK_HEADERS(sys/bitypes.h) + + # darwin requires a poll emulation library + AC_CHECK_LIB(poll, poll, LIB_POLL="-lpoll") + + # for some image handling on Mac OS X + AC_CHECK_HEADERS(Carbon/Carbon.h) + + # CoreAudio framework + AC_CHECK_HEADER(CoreAudio/CoreAudio.h, [ + AC_DEFINE(HAVE_COREAUDIO, 1, [Define if you have the CoreAudio API]) + FRAMEWORK_COREAUDIO="-Wl,-framework,CoreAudio" + ]) + + AC_CHECK_RES_INIT + AC_SUBST(LIB_POLL) + AC_SUBST(FRAMEWORK_COREAUDIO) + LIBSOCKET="$X_EXTRA_LIBS" + AC_SUBST(LIBSOCKET) + AC_SUBST(X_EXTRA_LIBS) + AC_CHECK_LIB(ucb, killpg, [LIBUCB="-lucb"]) dnl for Solaris2.4 + AC_SUBST(LIBUCB) + + case $host in dnl this *is* LynxOS specific + *-*-lynxos* ) + AC_MSG_CHECKING([LynxOS header file wrappers]) + [CFLAGS="$CFLAGS -D__NO_INCLUDE_WARN__"] + AC_MSG_RESULT(disabled) + AC_CHECK_LIB(bsd, gethostbyname, [LIBSOCKET="-lbsd"]) dnl for LynxOS + ;; + esac + + KDE_CHECK_TYPES + KDE_CHECK_LIBDL + KDE_CHECK_STRLCPY + KDE_CHECK_PIE_SUPPORT + +# darwin needs this to initialize the environment +AC_CHECK_HEADERS(crt_externs.h) +AC_CHECK_FUNC(_NSGetEnviron, [AC_DEFINE(HAVE_NSGETENVIRON, 1, [Define if your system needs _NSGetEnviron to set up the environment])]) + +AH_VERBATIM(_DARWIN_ENVIRON, +[ +#if defined(HAVE_NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H) +# include +# include +# define environ (*_NSGetEnviron()) +#endif +]) + +AH_VERBATIM(_AIX_STRINGS_H_BZERO, +[ +/* + * AIX defines FD_SET in terms of bzero, but fails to include + * that defines bzero. + */ + +#if defined(_AIX) +#include +#endif +]) + +AC_CHECK_FUNCS([vsnprintf snprintf]) + +AH_VERBATIM(_TRU64,[ +/* + * On HP-UX, the declaration of vsnprintf() is needed every time ! + */ + +#if !defined(HAVE_VSNPRINTF) || defined(hpux) +#if __STDC__ +#include +#include +#else +#include +#endif +#ifdef __cplusplus +extern "C" +#endif +int vsnprintf(char *str, size_t n, char const *fmt, va_list ap); +#ifdef __cplusplus +extern "C" +#endif +int snprintf(char *str, size_t n, char const *fmt, ...); +#endif +]) + +]) + +dnl ------------------------------------------------------------------------ +dnl Find the header files and libraries for X-Windows. Extended the +dnl macro AC_PATH_X +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([K_PATH_X], +[ +AC_REQUIRE([KDE_MISC_TESTS])dnl +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_ARG_ENABLE( + embedded, + AC_HELP_STRING([--enable-embedded],[link to Qt-embedded, don't use X]), + kde_use_qt_emb=$enableval, + kde_use_qt_emb=no +) + +AC_ARG_ENABLE( + qtopia, + AC_HELP_STRING([--enable-qtopia],[link to Qt-embedded, link to the Qtopia Environment]), + kde_use_qt_emb_palm=$enableval, + kde_use_qt_emb_palm=no +) + +AC_ARG_ENABLE( + mac, + AC_HELP_STRING([--enable-mac],[link to Qt/Mac (don't use X)]), + kde_use_qt_mac=$enableval, + kde_use_qt_mac=no +) + +# used to disable x11-specific stuff on special platforms +AM_CONDITIONAL(include_x11, test "$kde_use_qt_emb" = "no" && test "$kde_use_qt_mac" = "no") + +if test "$kde_use_qt_emb" = "no" && test "$kde_use_qt_mac" = "no"; then + +AC_MSG_CHECKING(for X) + +AC_CACHE_VAL(kde_cv_have_x, +[# One or both of the vars are not set, and there is no cached value. +if test "{$x_includes+set}" = set || test "$x_includes" = NONE; then + kde_x_includes=NO +else + kde_x_includes=$x_includes +fi +if test "{$x_libraries+set}" = set || test "$x_libraries" = NONE; then + kde_x_libraries=NO +else + kde_x_libraries=$x_libraries +fi + +# below we use the standard autoconf calls +ac_x_libraries=$kde_x_libraries +ac_x_includes=$kde_x_includes + +KDE_PATH_X_DIRECT +dnl AC_PATH_X_XMKMF picks /usr/lib as the path for the X libraries. +dnl Unfortunately, if compiling with the N32 ABI, this is not the correct +dnl location. The correct location is /usr/lib32 or an undefined value +dnl (the linker is smart enough to pick the correct default library). +dnl Things work just fine if you use just AC_PATH_X_DIRECT. +dnl Solaris has a similar problem. AC_PATH_X_XMKMF forces x_includes to +dnl /usr/openwin/include, which doesn't work. /usr/include does work, so +dnl x_includes should be left alone. +case "$host" in +mips-sgi-irix6*) + ;; +*-*-solaris*) + ;; +*) + _AC_PATH_X_XMKMF + if test -z "$ac_x_includes"; then + ac_x_includes="." + fi + if test -z "$ac_x_libraries"; then + ac_x_libraries="/usr/lib${kdelibsuff}" + fi +esac +#from now on we use our own again + +# when the user already gave --x-includes, we ignore +# what the standard autoconf macros told us. +if test "$kde_x_includes" = NO; then + kde_x_includes=$ac_x_includes +fi + +# for --x-libraries too +if test "$kde_x_libraries" = NO; then + kde_x_libraries=$ac_x_libraries +fi + +if test "$kde_x_includes" = NO; then + AC_MSG_ERROR([Can't find X includes. Please check your installation and add the correct paths!]) +fi + +if test "$kde_x_libraries" = NO; then + AC_MSG_ERROR([Can't find X libraries. Please check your installation and add the correct paths!]) +fi + +# Record where we found X for the cache. +kde_cv_have_x="have_x=yes \ + kde_x_includes=$kde_x_includes kde_x_libraries=$kde_x_libraries" +])dnl + +eval "$kde_cv_have_x" + +if test "$have_x" != yes; then + AC_MSG_RESULT($have_x) + no_x=yes +else + AC_MSG_RESULT([libraries $kde_x_libraries, headers $kde_x_includes]) +fi + +if test -z "$kde_x_includes" || test "x$kde_x_includes" = xNONE; then + X_INCLUDES="" + x_includes="."; dnl better than nothing :- + else + x_includes=$kde_x_includes + X_INCLUDES="-I$x_includes" +fi + +if test -z "$kde_x_libraries" || test "x$kde_x_libraries" = xNONE; then + X_LDFLAGS="" + x_libraries="/usr/lib"; dnl better than nothing :- + else + x_libraries=$kde_x_libraries + X_LDFLAGS="-L$x_libraries" +fi +all_includes="$X_INCLUDES" +all_libraries="$X_LDFLAGS $LDFLAGS_AS_NEEDED $LDFLAGS_NEW_DTAGS" + +# Check for libraries that X11R6 Xt/Xaw programs need. +ac_save_LDFLAGS="$LDFLAGS" +LDFLAGS="$LDFLAGS $X_LDFLAGS" +# SM needs ICE to (dynamically) link under SunOS 4.x (so we have to +# check for ICE first), but we must link in the order -lSM -lICE or +# we get undefined symbols. So assume we have SM if we have ICE. +# These have to be linked with before -lX11, unlike the other +# libraries we check for below, so use a different variable. +# --interran@uluru.Stanford.EDU, kb@cs.umb.edu. +AC_CHECK_LIB(ICE, IceConnectionNumber, + [LIBSM="-lSM -lICE"], , $X_EXTRA_LIBS) +LDFLAGS="$ac_save_LDFLAGS" + +LIB_X11='-lX11 $(LIBSOCKET)' + +AC_MSG_CHECKING(for libXext) +AC_CACHE_VAL(kde_cv_have_libXext, +[ +kde_ldflags_safe="$LDFLAGS" +kde_libs_safe="$LIBS" + +LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS" +LIBS="-lXext -lX11 $LIBSOCKET" + +AC_TRY_LINK([ +#include +#ifdef STDC_HEADERS +# include +#endif +], +[ +printf("hello Xext\n"); +], +kde_cv_have_libXext=yes, +kde_cv_have_libXext=no +) + +LDFLAGS=$kde_ldflags_safe +LIBS=$kde_libs_safe +]) + +AC_MSG_RESULT($kde_cv_have_libXext) + +if test "$kde_cv_have_libXext" = "no"; then + AC_MSG_ERROR([We need a working libXext to proceed. Since configure +can't find it itself, we stop here assuming that make wouldn't find +them either.]) +fi + +LIB_XEXT="-lXext" +QTE_NORTTI="" + +elif test "$kde_use_qt_emb" = "yes"; then + dnl We're using QT Embedded + CPPFLAGS=-DQWS + CXXFLAGS="$CXXFLAGS -fno-rtti" + QTE_NORTTI="-fno-rtti -DQWS" + X_PRE_LIBS="" + LIB_X11="" + LIB_XEXT="" + LIB_XRENDER="" + LIBSM="" + X_INCLUDES="" + X_LDFLAGS="" + x_includes="" + x_libraries="" +elif test "$kde_use_qt_mac" = "yes"; then + dnl We're using QT/Mac (I use QT_MAC so that qglobal.h doesn't *have* to + dnl be included to get the information) --Sam + CXXFLAGS="$CXXFLAGS -DQT_MAC -no-cpp-precomp" + CFLAGS="$CFLAGS -DQT_MAC -no-cpp-precomp" + X_PRE_LIBS="" + LIB_X11="" + LIB_XEXT="" + LIB_XRENDER="" + LIBSM="" + X_INCLUDES="" + X_LDFLAGS="" + x_includes="" + x_libraries="" +fi +AC_SUBST(X_PRE_LIBS) +AC_SUBST(LIB_X11) +AC_SUBST(LIB_XRENDER) +AC_SUBST(LIBSM) +AC_SUBST(X_INCLUDES) +AC_SUBST(X_LDFLAGS) +AC_SUBST(x_includes) +AC_SUBST(x_libraries) +AC_SUBST(QTE_NORTTI) +AC_SUBST(LIB_XEXT) + +]) + +AC_DEFUN([KDE_PRINT_QT_PROGRAM], +[ +AC_REQUIRE([KDE_USE_QT]) +cat > conftest.$ac_ext < +#include +EOF +if test "$kde_qtver" = "2"; then +cat >> conftest.$ac_ext < +#include +#include +EOF + +if test $kde_qtsubver -gt 0; then +cat >> conftest.$ac_ext <> conftest.$ac_ext < +#include +#include +EOF +fi + +echo "#if ! ($kde_qt_verstring)" >> conftest.$ac_ext +cat >> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <&AC_FD_CC + cat conftest.$ac_ext >&AC_FD_CC +fi + +rm -f conftest* +CXXFLAGS="$ac_cxxflags_safe" +LDFLAGS="$ac_ldflags_safe" +LIBS="$ac_libs_safe" + +LD_LIBRARY_PATH="$ac_LD_LIBRARY_PATH_safe" +export LD_LIBRARY_PATH +LIBRARY_PATH="$ac_LIBRARY_PATH" +export LIBRARY_PATH +AC_LANG_RESTORE +]) + +if test "$kde_cv_qt_direct" = "yes"; then + AC_MSG_RESULT(yes) + $1 +else + AC_MSG_RESULT(no) + $2 +fi +]) + +dnl ------------------------------------------------------------------------ +dnl Try to find the Qt headers and libraries. +dnl $(QT_LDFLAGS) will be -Lqtliblocation (if needed) +dnl and $(QT_INCLUDES) will be -Iqthdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_PATH_QT_1_3], +[ +AC_REQUIRE([K_PATH_X]) +AC_REQUIRE([KDE_USE_QT]) +AC_REQUIRE([KDE_CHECK_LIB64]) + +dnl ------------------------------------------------------------------------ +dnl Add configure flag to enable linking to MT version of Qt library. +dnl ------------------------------------------------------------------------ + +AC_ARG_ENABLE( + mt, + AC_HELP_STRING([--disable-mt],[link to non-threaded Qt (deprecated)]), + kde_use_qt_mt=$enableval, + [ + if test $kde_qtver = 3; then + kde_use_qt_mt=yes + else + kde_use_qt_mt=no + fi + ] +) + +USING_QT_MT="" + +dnl ------------------------------------------------------------------------ +dnl If we not get --disable-qt-mt then adjust some vars for the host. +dnl ------------------------------------------------------------------------ + +KDE_MT_LDFLAGS= +KDE_MT_LIBS= +if test "x$kde_use_qt_mt" = "xyes"; then + KDE_CHECK_THREADING + if test "x$kde_use_threading" = "xyes"; then + CPPFLAGS="$USE_THREADS -DQT_THREAD_SUPPORT $CPPFLAGS" + KDE_MT_LDFLAGS="$USE_THREADS" + KDE_MT_LIBS="$LIBPTHREAD" + else + kde_use_qt_mt=no + fi +fi +AC_SUBST(KDE_MT_LDFLAGS) +AC_SUBST(KDE_MT_LIBS) + +kde_qt_was_given=yes + +dnl ------------------------------------------------------------------------ +dnl If we haven't been told how to link to Qt, we work it out for ourselves. +dnl ------------------------------------------------------------------------ +if test -z "$LIBQT_GLOB"; then + if test "x$kde_use_qt_emb" = "xyes"; then + LIBQT_GLOB="libqte.*" + else + LIBQT_GLOB="libqt.*" + fi +fi + +dnl ------------------------------------------------------------ +dnl If we got --enable-embedded then adjust the Qt library name. +dnl ------------------------------------------------------------ +if test "x$kde_use_qt_emb" = "xyes"; then + qtlib="qte" +else + qtlib="qt" +fi + +kde_int_qt="-l$qtlib" + +if test -z "$LIBQPE"; then +dnl ------------------------------------------------------------ +dnl If we got --enable-palmtop then add -lqpe to the link line +dnl ------------------------------------------------------------ + if test "x$kde_use_qt_emb" = "xyes"; then + if test "x$kde_use_qt_emb_palm" = "xyes"; then + LIB_QPE="-lqpe" + else + LIB_QPE="" + fi + else + LIB_QPE="" + fi +fi + +dnl ------------------------------------------------------------------------ +dnl If we got --enable-qt-mt then adjust the Qt library name for the host. +dnl ------------------------------------------------------------------------ + +if test "x$kde_use_qt_mt" = "xyes"; then + LIBQT="-l$qtlib-mt" + kde_int_qt="-l$qtlib-mt" + LIBQT_GLOB="lib$qtlib-mt.*" + USING_QT_MT="using -mt" +else + LIBQT="-l$qtlib" +fi + +if test $kde_qtver != 1; then + + AC_REQUIRE([AC_FIND_PNG]) + AC_REQUIRE([AC_FIND_JPEG]) + LIBQT="$LIBQT $LIBPNG $LIBJPEG" +fi + +if test $kde_qtver = 3; then + AC_REQUIRE([KDE_CHECK_LIBDL]) + LIBQT="$LIBQT $LIBDL" +fi + +AC_MSG_CHECKING([for Qt]) + +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIBQT="$LIBQT $X_PRE_LIBS -lXext -lX11 $LIBSM $LIBSOCKET" +fi +ac_qt_includes=NO ac_qt_libraries=NO ac_qt_bindir=NO +qt_libraries="" +qt_includes="" +AC_ARG_WITH(qt-dir, + AC_HELP_STRING([--with-qt-dir=DIR],[where the root of Qt is installed ]), + [ ac_qt_includes="$withval"/include + ac_qt_libraries="$withval"/lib${kdelibsuff} + ac_qt_bindir="$withval"/bin + ]) + +AC_ARG_WITH(qt-includes, + AC_HELP_STRING([--with-qt-includes=DIR],[where the Qt includes are. ]), + [ + ac_qt_includes="$withval" + ]) + +kde_qt_libs_given=no + +AC_ARG_WITH(qt-libraries, + AC_HELP_STRING([--with-qt-libraries=DIR],[where the Qt library is installed.]), + [ ac_qt_libraries="$withval" + kde_qt_libs_given=yes + ]) + +AC_CACHE_VAL(ac_cv_have_qt, +[#try to guess Qt locations + +qt_incdirs="" +for dir in $kde_qt_dirs; do + qt_incdirs="$qt_incdirs $dir/include $dir" +done +qt_incdirs="$QTINC $qt_incdirs /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/X11R6/include/qt2 /usr/include/qt3 $x_includes" +if test ! "$ac_qt_includes" = "NO"; then + qt_incdirs="$ac_qt_includes $qt_incdirs" +fi + +if test "$kde_qtver" != "1"; then + kde_qt_header=qstyle.h +else + kde_qt_header=qglobal.h +fi + +AC_FIND_FILE($kde_qt_header, $qt_incdirs, qt_incdir) +ac_qt_includes="$qt_incdir" + +qt_libdirs="" +for dir in $kde_qt_dirs; do + qt_libdirs="$qt_libdirs $dir/lib${kdelibsuff} $dir" +done +qt_libdirs="$QTLIB $qt_libdirs /usr/X11R6/lib /usr/lib /usr/local/qt/lib $x_libraries" +if test ! "$ac_qt_libraries" = "NO"; then + qt_libdir=$ac_qt_libraries +else + qt_libdirs="$ac_qt_libraries $qt_libdirs" + # if the Qt was given, the chance is too big that libqt.* doesn't exist + qt_libdir=NONE + for dir in $qt_libdirs; do + try="ls -1 $dir/${LIBQT_GLOB}" + if test -n "`$try 2> /dev/null`"; then qt_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi + done +fi +for a in $qt_libdir/lib`echo ${kde_int_qt} | sed 's,^-l,,'`_incremental.*; do + if test -e "$a"; then + LIBQT="$LIBQT ${kde_int_qt}_incremental" + break + fi +done + +ac_qt_libraries="$qt_libdir" + +AC_LANG_SAVE +AC_LANG_CPLUSPLUS + +ac_cxxflags_safe="$CXXFLAGS" +ac_ldflags_safe="$LDFLAGS" +ac_libs_safe="$LIBS" + +CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes" +LDFLAGS="$LDFLAGS -L$qt_libdir $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" +LIBS="$LIBS $LIBQT $KDE_MT_LIBS" + +KDE_PRINT_QT_PROGRAM + +if AC_TRY_EVAL(ac_link) && test -s conftest; then + rm -f conftest* +else + echo "configure: failed program was:" >&AC_FD_CC + cat conftest.$ac_ext >&AC_FD_CC + ac_qt_libraries="NO" +fi +rm -f conftest* +CXXFLAGS="$ac_cxxflags_safe" +LDFLAGS="$ac_ldflags_safe" +LIBS="$ac_libs_safe" + +AC_LANG_RESTORE +if test "$ac_qt_includes" = NO || test "$ac_qt_libraries" = NO; then + ac_cv_have_qt="have_qt=no" + ac_qt_notfound="" + missing_qt_mt="" + if test "$ac_qt_includes" = NO; then + if test "$ac_qt_libraries" = NO; then + ac_qt_notfound="(headers and libraries)"; + else + ac_qt_notfound="(headers)"; + fi + else + if test "x$kde_use_qt_mt" = "xyes"; then + missing_qt_mt=" +Make sure that you have compiled Qt with thread support!" + ac_qt_notfound="(library $qtlib-mt)"; + else + ac_qt_notfound="(library $qtlib)"; + fi + fi + + AC_MSG_ERROR([Qt ($kde_qt_minversion) $ac_qt_notfound not found. Please check your installation! +For more details about this problem, look at the end of config.log.$missing_qt_mt]) +else + have_qt="yes" +fi +]) + +eval "$ac_cv_have_qt" + +if test "$have_qt" != yes; then + AC_MSG_RESULT([$have_qt]); +else + ac_cv_have_qt="have_qt=yes \ + ac_qt_includes=$ac_qt_includes ac_qt_libraries=$ac_qt_libraries" + AC_MSG_RESULT([libraries $ac_qt_libraries, headers $ac_qt_includes $USING_QT_MT]) + + qt_libraries="$ac_qt_libraries" + qt_includes="$ac_qt_includes" +fi + +if test ! "$kde_qt_libs_given" = "yes" && test ! "$kde_qtver" = 3; then + KDE_CHECK_QT_DIRECT(qt_libraries= ,[]) +fi + +AC_SUBST(qt_libraries) +AC_SUBST(qt_includes) + +if test "$qt_includes" = "$x_includes" || test -z "$qt_includes"; then + QT_INCLUDES="" +else + QT_INCLUDES="-I$qt_includes" + all_includes="$QT_INCLUDES $all_includes" +fi + +if test "$qt_libraries" = "$x_libraries" || test -z "$qt_libraries"; then + QT_LDFLAGS="" +else + QT_LDFLAGS="-L$qt_libraries" + all_libraries="$QT_LDFLAGS $all_libraries" +fi +test -z "$KDE_MT_LDFLAGS" || all_libraries="$all_libraries $KDE_MT_LDFLAGS" + +AC_SUBST(QT_INCLUDES) +AC_SUBST(QT_LDFLAGS) +AC_PATH_QT_MOC_UIC + +KDE_CHECK_QT_JPEG + +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBZ) $(LIBPNG) -lXext $(LIB_X11) $(LIBSM)' +else +LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBZ) $(LIBPNG)' +fi +test -z "$KDE_MT_LIBS" || LIB_QT="$LIB_QT $KDE_MT_LIBS" +for a in $qt_libdir/lib`echo ${kde_int_qt} | sed 's,^-l,,'`_incremental.*; do + if test -e "$a"; then + LIB_QT="$LIB_QT ${kde_int_qt}_incremental" + break + fi +done + +AC_SUBST(LIB_QT) +AC_SUBST(LIB_QPE) + +AC_SUBST(kde_qtver) +]) + +AC_DEFUN([AC_PATH_QT], +[ +AC_PATH_QT_1_3 +]) + +AC_DEFUN([KDE_CHECK_UIC_PLUGINS], +[ +AC_REQUIRE([AC_PATH_QT_MOC_UIC]) + +if test x$ac_uic_supports_libpath = xyes; then + +AC_MSG_CHECKING([if UIC has KDE plugins available]) +AC_CACHE_VAL(kde_cv_uic_plugins, +[ +cat > actest.ui << EOF + +NewConnectionDialog + + + + testInput + + + + +EOF + + + +kde_cv_uic_plugins=no +kde_line="$UIC_PATH -L $kde_widgetdir" +if test x$ac_uic_supports_nounload = xyes; then + kde_line="$kde_line -nounload" +fi +kde_line="$kde_line -impl actest.h actest.ui > actest.cpp" +if AC_TRY_EVAL(kde_line); then + # if you're trying to debug this check and think it's incorrect, + # better check your installation. The check _is_ correct - your + # installation is not. + if test -f actest.cpp && grep klineedit actest.cpp > /dev/null; then + kde_cv_uic_plugins=yes + fi +fi +rm -f actest.ui actest.cpp +]) + +AC_MSG_RESULT([$kde_cv_uic_plugins]) +if test "$kde_cv_uic_plugins" != yes; then + AC_MSG_ERROR([ +you need to install kdelibs first. + +If you did install kdelibs, then the Qt version that is picked up by +this configure is not the same version you used to compile kdelibs. +The Qt Plugin installed by kdelibs is *ONLY* loadable if it is the +_same Qt version_, compiled with the _same compiler_ and the same Qt +configuration settings. +]) +fi +fi +]) + +AC_DEFUN([KDE_CHECK_FINAL], +[ + AC_ARG_ENABLE(final, + AC_HELP_STRING([--enable-final], + [build size optimized apps (experimental - needs lots of memory)]), + kde_use_final=$enableval, kde_use_final=no) + + if test "x$kde_use_final" = "xyes"; then + KDE_USE_FINAL_TRUE="" + KDE_USE_FINAL_FALSE="#" + else + KDE_USE_FINAL_TRUE="#" + KDE_USE_FINAL_FALSE="" + fi + AC_SUBST(KDE_USE_FINAL_TRUE) + AC_SUBST(KDE_USE_FINAL_FALSE) +]) + +AC_DEFUN([KDE_CHECK_CLOSURE], +[ + AC_ARG_ENABLE(closure, + AC_HELP_STRING([--enable-closure],[delay template instantiation]), + kde_use_closure=$enableval, kde_use_closure=no) + + KDE_NO_UNDEFINED="" + if test "x$kde_use_closure" = "xyes"; then + KDE_USE_CLOSURE_TRUE="" + KDE_USE_CLOSURE_FALSE="#" +# CXXFLAGS="$CXXFLAGS $REPO" + else + KDE_USE_CLOSURE_TRUE="#" + KDE_USE_CLOSURE_FALSE="" + KDE_NO_UNDEFINED="" + case $host in + *-*-linux-gnu) + KDE_CHECK_COMPILER_FLAG([Wl,--no-undefined], + [KDE_CHECK_COMPILER_FLAG([Wl,--allow-shlib-undefined], + [KDE_NO_UNDEFINED="-Wl,--no-undefined -Wl,--allow-shlib-undefined"], + [KDE_NO_UNDEFINED=""])], + [KDE_NO_UNDEFINED=""]) + ;; + esac + fi + AC_SUBST(KDE_USE_CLOSURE_TRUE) + AC_SUBST(KDE_USE_CLOSURE_FALSE) + AC_SUBST(KDE_NO_UNDEFINED) +]) + +dnl Check if the linker supports --enable-new-dtags and --as-needed +AC_DEFUN([KDE_CHECK_NEW_LDFLAGS], +[ + AC_ARG_ENABLE(new_ldflags, + AC_HELP_STRING([--enable-new-ldflags], + [enable the new linker flags]), + kde_use_new_ldflags=$enableval, + kde_use_new_ldflags=no) + + LDFLAGS_AS_NEEDED="" + LDFLAGS_NEW_DTAGS="" + if test "x$kde_use_new_ldflags" = "xyes"; then + LDFLAGS_NEW_DTAGS="" + KDE_CHECK_COMPILER_FLAG([Wl,--enable-new-dtags], + [LDFLAGS_NEW_DTAGS="-Wl,--enable-new-dtags"],) + + KDE_CHECK_COMPILER_FLAG([Wl,--as-needed], + [LDFLAGS_AS_NEEDED="-Wl,--as-needed"],) + fi + AC_SUBST(LDFLAGS_AS_NEEDED) + AC_SUBST(LDFLAGS_NEW_DTAGS) +]) + +AC_DEFUN([KDE_CHECK_NMCHECK], +[ + AC_ARG_ENABLE(nmcheck,AC_HELP_STRING([--enable-nmcheck],[enable automatic namespace cleanness check]), + kde_use_nmcheck=$enableval, kde_use_nmcheck=no) + + if test "$kde_use_nmcheck" = "yes"; then + KDE_USE_NMCHECK_TRUE="" + KDE_USE_NMCHECK_FALSE="#" + else + KDE_USE_NMCHECK_TRUE="#" + KDE_USE_NMCHECK_FALSE="" + fi + AC_SUBST(KDE_USE_NMCHECK_TRUE) + AC_SUBST(KDE_USE_NMCHECK_FALSE) +]) + +AC_DEFUN([KDE_EXPAND_MAKEVAR], [ +savex=$exec_prefix +test "x$exec_prefix" = xNONE && exec_prefix=$prefix +tmp=$$2 +while $1=`eval echo "$tmp"`; test "x$$1" != "x$tmp"; do tmp=$$1; done +exec_prefix=$savex +]) + +dnl ------------------------------------------------------------------------ +dnl Now, the same with KDE +dnl $(KDE_LDFLAGS) will be the kdeliblocation (if needed) +dnl and $(kde_includes) will be the kdehdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_BASE_PATH_KDE], +[ +AC_REQUIRE([KDE_CHECK_STL]) +AC_REQUIRE([AC_PATH_QT])dnl +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_CHECK_RPATH +AC_MSG_CHECKING([for KDE]) + +if test "${prefix}" != NONE; then + kde_includes=${includedir} + KDE_EXPAND_MAKEVAR(ac_kde_includes, includedir) + + kde_libraries=${libdir} + KDE_EXPAND_MAKEVAR(ac_kde_libraries, libdir) + +else + ac_kde_includes= + ac_kde_libraries= + kde_libraries="" + kde_includes="" +fi + +AC_CACHE_VAL(ac_cv_have_kde, +[#try to guess kde locations + +if test "$kde_qtver" = 1; then + kde_check_header="ksock.h" + kde_check_lib="libkdecore.la" +else + kde_check_header="ksharedptr.h" + kde_check_lib="libkio.la" +fi + +if test -z "$1"; then + +kde_incdirs="$kde_libs_prefix/include /opt/kde3/include/kde /usr/lib/kde/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde3/include /opt/kde/include $x_includes $qt_includes" +test -n "$KDEDIR" && kde_incdirs="$KDEDIR/include $KDEDIR/include/kde $KDEDIR $kde_incdirs" +kde_incdirs="$ac_kde_includes $kde_incdirs" +AC_FIND_FILE($kde_check_header, $kde_incdirs, kde_incdir) +ac_kde_includes="$kde_incdir" + +if test -n "$ac_kde_includes" && test ! -r "$ac_kde_includes/$kde_check_header"; then + AC_MSG_ERROR([ +in the prefix, you've chosen, are no KDE headers installed. This will fail. +So, check this please and use another prefix!]) +fi + +kde_libdirs="$kde_libs_prefix/lib${kdelibsuff} /usr/lib/kde/lib${kdelibsuff} /usr/local/kde/lib${kdelibsuff} /usr/kde/lib${kdelibsuff} /usr/lib${kdelibsuff}/kde /usr/lib${kdelibsuff}/kde3 /usr/lib${kdelibsuff} /usr/X11R6/lib${kdelibsuff} /usr/local/lib${kdelibsuff} /opt/kde3/lib${kdelibsuff} /opt/kde/lib${kdelibsuff} /usr/X11R6/kde/lib${kdelibsuff}" +test -n "$KDEDIR" && kde_libdirs="$KDEDIR/lib${kdelibsuff} $KDEDIR $kde_libdirs" +kde_libdirs="$ac_kde_libraries $libdir $kde_libdirs" +AC_FIND_FILE($kde_check_lib, $kde_libdirs, kde_libdir) +ac_kde_libraries="$kde_libdir" + +kde_widgetdir=NO +dnl this might be somewhere else +AC_FIND_FILE("kde3/plugins/designer/kdewidgets.la", $kde_libdirs, kde_widgetdir) + +if test -n "$ac_kde_libraries" && test ! -r "$ac_kde_libraries/$kde_check_lib"; then +AC_MSG_ERROR([ +in the prefix, you've chosen, are no KDE libraries installed. This will fail. +So, check this please and use another prefix!]) +fi + +if test -n "$kde_widgetdir" && test ! -r "$kde_widgetdir/kde3/plugins/designer/kdewidgets.la"; then +AC_MSG_ERROR([ +I can't find the designer plugins. These are required and should have been installed +by kdelibs]) +fi + +if test -n "$kde_widgetdir"; then + kde_widgetdir="$kde_widgetdir/kde3/plugins/designer" +fi + + +if test "$ac_kde_includes" = NO || test "$ac_kde_libraries" = NO || test "$kde_widgetdir" = NO; then + ac_cv_have_kde="have_kde=no" +else + ac_cv_have_kde="have_kde=yes \ + ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries" +fi + +else dnl test -z $1, e.g. from kdelibs + + ac_cv_have_kde="have_kde=no" + +fi +])dnl + +eval "$ac_cv_have_kde" + +if test "$have_kde" != "yes"; then + if test "${prefix}" = NONE; then + ac_kde_prefix="$ac_default_prefix" + else + ac_kde_prefix="$prefix" + fi + if test "$exec_prefix" = NONE; then + ac_kde_exec_prefix="$ac_kde_prefix" + AC_MSG_RESULT([will be installed in $ac_kde_prefix]) + else + ac_kde_exec_prefix="$exec_prefix" + AC_MSG_RESULT([will be installed in $ac_kde_prefix and $ac_kde_exec_prefix]) + fi + + kde_libraries="${libdir}" + kde_includes="${includedir}" + +else + ac_cv_have_kde="have_kde=yes \ + ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries" + AC_MSG_RESULT([libraries $ac_kde_libraries, headers $ac_kde_includes]) + + kde_libraries="$ac_kde_libraries" + kde_includes="$ac_kde_includes" +fi +AC_SUBST(kde_libraries) +AC_SUBST(kde_includes) + +if test "$kde_includes" = "$x_includes" || test "$kde_includes" = "$qt_includes" || test "$kde_includes" = "/usr/include"; then + KDE_INCLUDES="" +else + KDE_INCLUDES="-I$kde_includes" + all_includes="$KDE_INCLUDES $all_includes" +fi + +KDE_DEFAULT_CXXFLAGS="-DQT_CLEAN_NAMESPACE -DQT_NO_ASCII_CAST -DQT_NO_STL -DQT_NO_COMPAT -DQT_NO_TRANSLATION" + +KDE_LDFLAGS="-L$kde_libraries" +if test ! "$kde_libraries" = "$x_libraries" && test ! "$kde_libraries" = "$qt_libraries" ; then + all_libraries="$KDE_LDFLAGS $all_libraries" +fi + +AC_SUBST(KDE_LDFLAGS) +AC_SUBST(KDE_INCLUDES) + +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + +all_libraries="$all_libraries $USER_LDFLAGS" +all_includes="$all_includes $USER_INCLUDES" +AC_SUBST(all_includes) +AC_SUBST(all_libraries) + +if test -z "$1"; then +KDE_CHECK_UIC_PLUGINS +fi + +ac_kde_libraries="$kde_libdir" + +AC_SUBST(AUTODIRS) + + +]) + +AC_DEFUN([KDE_CHECK_EXTRA_LIBS], +[ +AC_MSG_CHECKING(for extra includes) +AC_ARG_WITH(extra-includes,AC_HELP_STRING([--with-extra-includes=DIR],[adds non standard include paths]), + kde_use_extra_includes="$withval", + kde_use_extra_includes=NONE +) +kde_extra_includes= +if test -n "$kde_use_extra_includes" && \ + test "$kde_use_extra_includes" != "NONE"; then + + ac_save_ifs=$IFS + IFS=':' + for dir in $kde_use_extra_includes; do + kde_extra_includes="$kde_extra_includes $dir" + USER_INCLUDES="$USER_INCLUDES -I$dir" + done + IFS=$ac_save_ifs + kde_use_extra_includes="added" +else + kde_use_extra_includes="no" +fi +AC_SUBST(USER_INCLUDES) + +AC_MSG_RESULT($kde_use_extra_includes) + +kde_extra_libs= +AC_MSG_CHECKING(for extra libs) +AC_ARG_WITH(extra-libs,AC_HELP_STRING([--with-extra-libs=DIR],[adds non standard library paths]), + kde_use_extra_libs=$withval, + kde_use_extra_libs=NONE +) +if test -n "$kde_use_extra_libs" && \ + test "$kde_use_extra_libs" != "NONE"; then + + ac_save_ifs=$IFS + IFS=':' + for dir in $kde_use_extra_libs; do + kde_extra_libs="$kde_extra_libs $dir" + KDE_EXTRA_RPATH="$KDE_EXTRA_RPATH -R $dir" + USER_LDFLAGS="$USER_LDFLAGS -L$dir" + done + IFS=$ac_save_ifs + kde_use_extra_libs="added" +else + kde_use_extra_libs="no" +fi + +AC_SUBST(USER_LDFLAGS) + +AC_MSG_RESULT($kde_use_extra_libs) + +]) + +AC_DEFUN([KDE_1_CHECK_PATH_HEADERS], +[ + AC_MSG_CHECKING([for KDE headers installed]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS +cat > conftest.$ac_ext < +#endif +#include +#include "confdefs.h" +#include + +int main() { + printf("kde_htmldir=\\"%s\\"\n", KApplication::kde_htmldir().data()); + printf("kde_appsdir=\\"%s\\"\n", KApplication::kde_appsdir().data()); + printf("kde_icondir=\\"%s\\"\n", KApplication::kde_icondir().data()); + printf("kde_sounddir=\\"%s\\"\n", KApplication::kde_sounddir().data()); + printf("kde_datadir=\\"%s\\"\n", KApplication::kde_datadir().data()); + printf("kde_locale=\\"%s\\"\n", KApplication::kde_localedir().data()); + printf("kde_cgidir=\\"%s\\"\n", KApplication::kde_cgidir().data()); + printf("kde_confdir=\\"%s\\"\n", KApplication::kde_configdir().data()); + printf("kde_mimedir=\\"%s\\"\n", KApplication::kde_mimedir().data()); + printf("kde_toolbardir=\\"%s\\"\n", KApplication::kde_toolbardir().data()); + printf("kde_wallpaperdir=\\"%s\\"\n", + KApplication::kde_wallpaperdir().data()); + printf("kde_bindir=\\"%s\\"\n", KApplication::kde_bindir().data()); + printf("kde_partsdir=\\"%s\\"\n", KApplication::kde_partsdir().data()); + printf("kde_servicesdir=\\"/tmp/dummy\\"\n"); + printf("kde_servicetypesdir=\\"/tmp/dummy\\"\n"); + printf("kde_moduledir=\\"/tmp/dummy\\"\n"); + printf("kde_styledir=\\"/tmp/dummy\\"\n"); + printf("kde_widgetdir=\\"/tmp/dummy\\"\n"); + printf("xdg_appsdir=\\"/tmp/dummy\\"\n"); + printf("xdg_menudir=\\"/tmp/dummy\\"\n"); + printf("xdg_directorydir=\\"/tmp/dummy\\"\n"); + printf("kde_kcfgdir=\\"/tmp/dummy\\"\n"); + return 0; + } +EOF + + ac_save_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$all_includes $CPPFLAGS" + if AC_TRY_EVAL(ac_compile); then + AC_MSG_RESULT(yes) + else + AC_MSG_ERROR([your system is not able to compile a small KDE application! +Check, if you installed the KDE header files correctly. +For more details about this problem, look at the end of config.log.]) + fi + CPPFLAGS=$ac_save_CPPFLAGS + + AC_LANG_RESTORE +]) + +AC_DEFUN([KDE_CHECK_KDEQTADDON], +[ +AC_MSG_CHECKING(for kde-qt-addon) +AC_CACHE_VAL(kde_cv_have_kdeqtaddon, +[ + kde_ldflags_safe="$LDFLAGS" + kde_libs_safe="$LIBS" + kde_cxxflags_safe="$CXXFLAGS" + + LIBS="-lkde-qt-addon $LIBQT $LIBS" + CXXFLAGS="$CXXFLAGS -I$prefix/include -I$prefix/include/kde $all_includes" + LDFLAGS="$LDFLAGS $all_libraries $USER_LDFLAGS" + + AC_TRY_LINK([ + #include + ], + [ + QDomDocument doc; + ], + kde_cv_have_kdeqtaddon=yes, + kde_cv_have_kdeqtaddon=no + ) + + LDFLAGS=$kde_ldflags_safe + LIBS=$kde_libs_safe + CXXFLAGS=$kde_cxxflags_safe +]) + +AC_MSG_RESULT($kde_cv_have_kdeqtaddon) + +if test "$kde_cv_have_kdeqtaddon" = "no"; then + AC_MSG_ERROR([Can't find libkde-qt-addon. You need to install it first. +It is a separate package (and CVS module) named kde-qt-addon.]) +fi +]) + +AC_DEFUN([KDE_CREATE_LIBS_ALIASES], +[ + AC_REQUIRE([KDE_MISC_TESTS]) + AC_REQUIRE([KDE_CHECK_LIBDL]) + AC_REQUIRE([K_PATH_X]) + +if test $kde_qtver = 3; then + case $host in + *cygwin*) lib_kded="-lkdeinit_kded" ;; + *) lib_kded="" ;; + esac + AC_SUBST(LIB_KDED, $lib_kded) + AC_SUBST(LIB_KDECORE, "-lkdecore") + AC_SUBST(LIB_KDEUI, "-lkdeui") + AC_SUBST(LIB_KIO, "-lkio") + AC_SUBST(LIB_KJS, "-lkjs") + AC_SUBST(LIB_SMB, "-lsmb") + AC_SUBST(LIB_KAB, "-lkab") + AC_SUBST(LIB_KABC, "-lkabc") + AC_SUBST(LIB_KHTML, "-lkhtml") + AC_SUBST(LIB_KSPELL, "-lkspell") + AC_SUBST(LIB_KPARTS, "-lkparts") + AC_SUBST(LIB_KDEPRINT, "-lkdeprint") + AC_SUBST(LIB_KUTILS, "-lkutils") + AC_SUBST(LIB_KDEPIM, "-lkdepim") + AC_SUBST(LIB_KIMPROXY, "-lkimproxy") + AC_SUBST(LIB_KNEWSTUFF, "-lknewstuff") + AC_SUBST(LIB_KDNSSD, "-lkdnssd") + AC_SUBST(LIB_KUNITTEST, "-lkunittest") +# these are for backward compatibility + AC_SUBST(LIB_KSYCOCA, "-lkio") + AC_SUBST(LIB_KFILE, "-lkio") +elif test $kde_qtver = 2; then + AC_SUBST(LIB_KDECORE, "-lkdecore") + AC_SUBST(LIB_KDEUI, "-lkdeui") + AC_SUBST(LIB_KIO, "-lkio") + AC_SUBST(LIB_KSYCOCA, "-lksycoca") + AC_SUBST(LIB_SMB, "-lsmb") + AC_SUBST(LIB_KFILE, "-lkfile") + AC_SUBST(LIB_KAB, "-lkab") + AC_SUBST(LIB_KHTML, "-lkhtml") + AC_SUBST(LIB_KSPELL, "-lkspell") + AC_SUBST(LIB_KPARTS, "-lkparts") + AC_SUBST(LIB_KDEPRINT, "-lkdeprint") +else + AC_SUBST(LIB_KDECORE, "-lkdecore -lXext $(LIB_QT)") + AC_SUBST(LIB_KDEUI, "-lkdeui $(LIB_KDECORE)") + AC_SUBST(LIB_KFM, "-lkfm $(LIB_KDECORE)") + AC_SUBST(LIB_KFILE, "-lkfile $(LIB_KFM) $(LIB_KDEUI)") + AC_SUBST(LIB_KAB, "-lkab $(LIB_KIMGIO) $(LIB_KDECORE)") +fi +]) + +AC_DEFUN([AC_PATH_KDE], +[ + AC_BASE_PATH_KDE + AC_ARG_ENABLE(path-check,AC_HELP_STRING([--disable-path-check],[don't try to find out, where to install]), + [ + if test "$enableval" = "no"; + then ac_use_path_checking="default" + else ac_use_path_checking="" + fi + ], + [ + if test "$kde_qtver" = 1; + then ac_use_path_checking="" + else ac_use_path_checking="default" + fi + ] + ) + + AC_CREATE_KFSSTND($ac_use_path_checking) + + AC_SUBST_KFSSTND + KDE_CREATE_LIBS_ALIASES +]) + +dnl KDE_CHECK_FUNC_EXT(, [headers], [sample-use], [C prototype], [autoheader define], [call if found]) +AC_DEFUN([KDE_CHECK_FUNC_EXT], +[ +AC_MSG_CHECKING(for $1) +AC_CACHE_VAL(kde_cv_func_$1, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +save_CXXFLAGS="$CXXFLAGS" +kde_safe_LIBS="$LIBS" +LIBS="$LIBS $X_EXTRA_LIBS" +if test "$GXX" = "yes"; then +CXXFLAGS="$CXXFLAGS -pedantic-errors" +fi +AC_TRY_COMPILE([ +$2 +], +[ +$3 +], +kde_cv_func_$1=yes, +kde_cv_func_$1=no) +CXXFLAGS="$save_CXXFLAGS" +LIBS="$kde_safe_LIBS" +AC_LANG_RESTORE +]) + +AC_MSG_RESULT($kde_cv_func_$1) + +AC_MSG_CHECKING([if $1 needs custom prototype]) +AC_CACHE_VAL(kde_cv_proto_$1, +[ +if test "x$kde_cv_func_$1" = xyes; then + kde_cv_proto_$1=no +else + case "$1" in + setenv|unsetenv|usleep|random|srandom|seteuid|mkstemps|mkstemp|revoke|vsnprintf|strlcpy|strlcat) + kde_cv_proto_$1="yes - in libkdefakes" + ;; + *) + kde_cv_proto_$1=unknown + ;; + esac +fi + +if test "x$kde_cv_proto_$1" = xunknown; then + +AC_LANG_SAVE +AC_LANG_CPLUSPLUS + kde_safe_libs=$LIBS + LIBS="$LIBS $X_EXTRA_LIBS" + AC_TRY_LINK([ +$2 + +extern "C" $4; +], +[ +$3 +], +[ kde_cv_func_$1=yes + kde_cv_proto_$1=yes ], + [kde_cv_proto_$1="$1 unavailable"] +) +LIBS=$kde_safe_libs +AC_LANG_RESTORE +fi +]) +AC_MSG_RESULT($kde_cv_proto_$1) + +if test "x$kde_cv_func_$1" = xyes; then + AC_DEFINE(HAVE_$5, 1, [Define if you have $1]) + $6 +fi +if test "x$kde_cv_proto_$1" = xno; then + AC_DEFINE(HAVE_$5_PROTO, 1, + [Define if you have the $1 prototype]) +fi + +AH_VERBATIM([_HAVE_$5_PROTO], +[ +#if !defined(HAVE_$5_PROTO) +#ifdef __cplusplus +extern "C" { +#endif +$4; +#ifdef __cplusplus +} +#endif +#endif +]) +]) + +AC_DEFUN([AC_CHECK_SETENV], +[ + KDE_CHECK_FUNC_EXT(setenv, [ +#include +], + [setenv("VAR", "VALUE", 1);], + [int setenv (const char *, const char *, int)], + [SETENV]) +]) + +AC_DEFUN([AC_CHECK_UNSETENV], +[ + KDE_CHECK_FUNC_EXT(unsetenv, [ +#include +], + [unsetenv("VAR");], + [void unsetenv (const char *)], + [UNSETENV]) +]) + +AC_DEFUN([AC_CHECK_GETDOMAINNAME], +[ + KDE_CHECK_FUNC_EXT(getdomainname, [ +#include +#include +#include +], + [ +char buffer[200]; +getdomainname(buffer, 200); +], + [#include + int getdomainname (char *, size_t)], + [GETDOMAINNAME]) +]) + +AC_DEFUN([AC_CHECK_GETHOSTNAME], +[ + KDE_CHECK_FUNC_EXT(gethostname, [ +#include +#include +], + [ +char buffer[200]; +gethostname(buffer, 200); +], + [int gethostname (char *, unsigned int)], + [GETHOSTNAME]) +]) + +AC_DEFUN([AC_CHECK_USLEEP], +[ + KDE_CHECK_FUNC_EXT(usleep, [ +#include +], + [ +usleep(200); +], + [int usleep (unsigned int)], + [USLEEP]) +]) + + +AC_DEFUN([AC_CHECK_RANDOM], +[ + KDE_CHECK_FUNC_EXT(random, [ +#include +], + [ +random(); +], + [long int random(void)], + [RANDOM]) + + KDE_CHECK_FUNC_EXT(srandom, [ +#include +], + [ +srandom(27); +], + [void srandom(unsigned int)], + [SRANDOM]) + +]) + +AC_DEFUN([AC_CHECK_INITGROUPS], +[ + KDE_CHECK_FUNC_EXT(initgroups, [ +#include +#include +#include +], + [ +char buffer[200]; +initgroups(buffer, 27); +], + [int initgroups(const char *, gid_t)], + [INITGROUPS]) +]) + +AC_DEFUN([AC_CHECK_MKSTEMPS], +[ + KDE_CHECK_FUNC_EXT(mkstemps, [ +#include +#include +], + [ +mkstemps("/tmp/aaaXXXXXX", 6); +], + [int mkstemps(char *, int)], + [MKSTEMPS]) +]) + +AC_DEFUN([AC_CHECK_MKSTEMP], +[ + KDE_CHECK_FUNC_EXT(mkstemp, [ +#include +#include +], + [ +mkstemp("/tmp/aaaXXXXXX"); +], + [int mkstemp(char *)], + [MKSTEMP]) +]) + +AC_DEFUN([AC_CHECK_MKDTEMP], +[ + KDE_CHECK_FUNC_EXT(mkdtemp, [ +#include +#include +], + [ +mkdtemp("/tmp/aaaXXXXXX"); +], + [char *mkdtemp(char *)], + [MKDTEMP]) +]) + + +AC_DEFUN([AC_CHECK_RES_INIT], +[ + AC_MSG_CHECKING([if res_init needs -lresolv]) + kde_libs_safe="$LIBS" + LIBS="$LIBS $X_EXTRA_LIBS -lresolv" + AC_TRY_LINK( + [ +#include +#include +#include +#include + ], + [ + res_init(); + ], + [ + LIBRESOLV="-lresolv" + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_RES_INIT, 1, [Define if you have the res_init function]) + ], + [ AC_MSG_RESULT(no) ] + ) + LIBS=$kde_libs_safe + AC_SUBST(LIBRESOLV) + + KDE_CHECK_FUNC_EXT(res_init, + [ +#include +#include +#include +#include + ], + [res_init()], + [int res_init(void)], + [RES_INIT]) +]) + +AC_DEFUN([AC_CHECK_STRLCPY], +[ + KDE_CHECK_FUNC_EXT(strlcpy, [ +#include +], +[ char buf[20]; + strlcpy(buf, "KDE function test", sizeof(buf)); +], + [unsigned long strlcpy(char*, const char*, unsigned long)], + [STRLCPY]) +]) + +AC_DEFUN([AC_CHECK_STRLCAT], +[ + KDE_CHECK_FUNC_EXT(strlcat, [ +#include +], +[ char buf[20]; + buf[0]='\0'; + strlcat(buf, "KDE function test", sizeof(buf)); +], + [unsigned long strlcat(char*, const char*, unsigned long)], + [STRLCAT]) +]) + +AC_DEFUN([AC_CHECK_RES_QUERY], +[ + KDE_CHECK_FUNC_EXT(res_query, [ +#include +#include +#include +#include +#include +], +[ +res_query(NULL, 0, 0, NULL, 0); +], + [int res_query(const char *, int, int, unsigned char *, int)], + [RES_QUERY]) +]) + +AC_DEFUN([AC_CHECK_DN_SKIPNAME], +[ + KDE_CHECK_FUNC_EXT(dn_skipname, [ +#include +#include +#include +#include +], +[ +dn_skipname (NULL, NULL); +], + [int dn_skipname (unsigned char *, unsigned char *)], + [DN_SKIPNAME]) +]) + + +AC_DEFUN([AC_FIND_GIF], + [AC_MSG_CHECKING([for giflib]) +AC_CACHE_VAL(ac_cv_lib_gif, +[ac_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIBS="$all_libraries -lgif -lX11 $LIBSOCKET" +else +LIBS="$all_libraries -lgif" +fi +AC_TRY_LINK(dnl +[ +#ifdef __cplusplus +extern "C" { +#endif +int GifLastError(void); +#ifdef __cplusplus +} +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +], + [return GifLastError();], + eval "ac_cv_lib_gif=yes", + eval "ac_cv_lib_gif=no") +LIBS="$ac_save_LIBS" +])dnl +if eval "test \"`echo $ac_cv_lib_gif`\" = yes"; then + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_LIBGIF, 1, [Define if you have libgif]) +else + AC_MSG_ERROR(You need giflib30. Please install the kdesupport package) +fi +]) + +AC_DEFUN([KDE_FIND_JPEG_HELPER], +[ +AC_MSG_CHECKING([for libjpeg$2]) +AC_CACHE_VAL(ac_cv_lib_jpeg_$1, +[ +ac_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -ljpeg$2 -lm" +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK( +[ +#ifdef __cplusplus +extern "C" { +#endif +void jpeg_CreateDecompress(); +#ifdef __cplusplus +} +#endif +], +[jpeg_CreateDecompress();], + eval "ac_cv_lib_jpeg_$1=-ljpeg$2", + eval "ac_cv_lib_jpeg_$1=no") +LIBS="$ac_save_LIBS" +CFLAGS="$ac_save_CFLAGS" +]) + +if eval "test ! \"`echo $ac_cv_lib_jpeg_$1`\" = no"; then + LIBJPEG="$ac_cv_lib_jpeg_$1" + AC_MSG_RESULT($ac_cv_lib_jpeg_$1) +else + AC_MSG_RESULT(no) + $3 +fi + +]) + +AC_DEFUN([AC_FIND_JPEG], +[ +dnl first look for libraries +KDE_FIND_JPEG_HELPER(6b, 6b, + KDE_FIND_JPEG_HELPER(normal, [], + [ + LIBJPEG= + ] + ) +) + +dnl then search the headers (can't use simply AC_TRY_xxx, as jpeglib.h +dnl requires system dependent includes loaded before it) +jpeg_incdirs="$includedir /usr/include /usr/local/include $kde_extra_includes" +AC_FIND_FILE(jpeglib.h, $jpeg_incdirs, jpeg_incdir) +test "x$jpeg_incdir" = xNO && jpeg_incdir= + +dnl if headers _and_ libraries are missing, this is no error, and we +dnl continue with a warning (the user will get no jpeg support in khtml) +dnl if only one is missing, it means a configuration error, but we still +dnl only warn +if test -n "$jpeg_incdir" && test -n "$LIBJPEG" ; then + AC_DEFINE_UNQUOTED(HAVE_LIBJPEG, 1, [Define if you have libjpeg]) +else + if test -n "$jpeg_incdir" || test -n "$LIBJPEG" ; then + AC_MSG_WARN([ +There is an installation error in jpeg support. You seem to have only one +of either the headers _or_ the libraries installed. You may need to either +provide correct --with-extra-... options, or the development package of +libjpeg6b. You can get a source package of libjpeg from http://www.ijg.org/ +Disabling JPEG support. +]) + else + AC_MSG_WARN([libjpeg not found. disable JPEG support.]) + fi + jpeg_incdir= + LIBJPEG= +fi + +AC_SUBST(LIBJPEG) +AH_VERBATIM(_AC_CHECK_JPEG, +[/* + * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system + * headers and I'm too lazy to write a configure test as long as only + * unixware is related + */ +#ifdef _UNIXWARE +#define HAVE_BOOLEAN +#endif +]) +]) + +AC_DEFUN([KDE_CHECK_QT_JPEG], +[ +if test -n "$LIBJPEG"; then +AC_MSG_CHECKING([if Qt needs $LIBJPEG]) +AC_CACHE_VAL(kde_cv_qt_jpeg, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +ac_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS $LIBQT" +LIBS=`echo $LIBS | sed "s/$LIBJPEG//"` +ac_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK( +[#include ], + [ + int argc; + char** argv; + QApplication app(argc, argv);], + eval "kde_cv_qt_jpeg=no", + eval "kde_cv_qt_jpeg=yes") +LIBS="$ac_save_LIBS" +CXXFLAGS="$ac_save_CXXFLAGS" +AC_LANG_RESTORE +fi +]) + +if eval "test ! \"`echo $kde_cv_qt_jpeg`\" = no"; then + AC_MSG_RESULT(yes) + LIBJPEG_QT='$(LIBJPEG)' +else + AC_MSG_RESULT(no) + LIBJPEG_QT= +fi + +]) + +AC_DEFUN([AC_FIND_ZLIB], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_MSG_CHECKING([for libz]) +AC_CACHE_VAL(ac_cv_lib_z, +[ +kde_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -lz $LIBSOCKET" +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK(dnl +[ +#include +], +[ + char buf[42]; + gzFile f = (gzFile) 0; + /* this would segfault.. but we only link, don't run */ + (void) gzgets(f, buf, sizeof(buf)); + + return (zlibVersion() == ZLIB_VERSION); +], + eval "ac_cv_lib_z='-lz'", + eval "ac_cv_lib_z=no") +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if test ! "$ac_cv_lib_z" = no; then + AC_DEFINE_UNQUOTED(HAVE_LIBZ, 1, [Define if you have libz]) + LIBZ="$ac_cv_lib_z" + AC_MSG_RESULT($ac_cv_lib_z) +else + AC_MSG_ERROR(not found. + Possibly configure picks up an outdated version + installed by XFree86. Remove it from your system. + + Check your installation and look into config.log) + LIBZ="" +fi +AC_SUBST(LIBZ) +]) + +AC_DEFUN([KDE_TRY_TIFFLIB], +[ +AC_MSG_CHECKING([for libtiff $1]) + +AC_CACHE_VAL(kde_cv_libtiff_$1, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +kde_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lX11 $LIBSOCKET -lm" +else +LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lm" +fi +kde_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" + +AC_TRY_LINK(dnl +[ +#include +], + [return (TIFFOpen( "", "r") == 0); ], +[ + kde_cv_libtiff_$1="-l$1 $LIBJPEG $LIBZ" +], [ + kde_cv_libtiff_$1=no +]) + +LIBS="$kde_save_LIBS" +CXXFLAGS="$kde_save_CXXFLAGS" +AC_LANG_RESTORE +]) + +if test "$kde_cv_libtiff_$1" = "no"; then + AC_MSG_RESULT(no) + LIBTIFF="" + $3 +else + LIBTIFF="$kde_cv_libtiff_$1" + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_LIBTIFF, 1, [Define if you have libtiff]) + $2 +fi + +]) + +AC_DEFUN([AC_FIND_TIFF], +[ +AC_REQUIRE([K_PATH_X]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_REQUIRE([AC_FIND_JPEG]) +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + +KDE_TRY_TIFFLIB(tiff, [], + KDE_TRY_TIFFLIB(tiff34)) + +AC_SUBST(LIBTIFF) +]) + +AC_DEFUN([KDE_FIND_LIBEXR], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_CACHE_VAL(ac_cv_libexr, +[ + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + + AC_MSG_CHECKING([for OpenEXR libraries]) + + if test "$PKG_CONFIG" = "no" ; then + AC_MSG_RESULT(no) + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + if !(`$PKG_CONFIG --exists OpenEXR`) ; then + AC_MSG_RESULT(no) + EXRSTATUS=no + else + if !(`$PKG_CONFIG --atleast-version="1.1.1" OpenEXR`) ; then + AC_MSG_RESULT(no) + EXRSTATUS=old + else + kde_save_LIBS="$LIBS" + LIBS="$LIBS $all_libraries $USER_LDFLAGS `pkg-config --libs OpenEXR` $LIBZ" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + kde_save_CXXFLAGS="$CXXFLAGS" + EXR_FLAGS=`$PKG_CONFIG --cflags OpenEXR` + CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES $EXR_FLAGS" + + AC_TRY_LINK(dnl + [ + #include + ], + [ + using namespace Imf; + RgbaInputFile file ("dummy"); + return 0; + ], + eval "ac_cv_libexr='`pkg-config --libs OpenEXR`'", + eval "ac_cv_libexr=no" + ) + LIBS="$kde_save_LIBS" + CXXFLAGS="$kde_save_CXXFLAGS" + AC_LANG_RESTORE + ])dnl + if eval "test ! \"`echo $ac_cv_libexr`\" = no"; then + AC_DEFINE_UNQUOTED(HAVE_EXR, 1, [Define if you have OpenEXR]) + LIB_EXR="$ac_cv_libexr" + AC_MSG_RESULT($ac_cv_libexr) + else + AC_MSG_RESULT(no) + LIB_EXR="" + fi + fi + fi + fi + AC_SUBST(LIB_EXR) + AC_SUBST(EXR_FLAGS) +]) + + + +AC_DEFUN([AC_FIND_PNG], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_MSG_CHECKING([for libpng]) +AC_CACHE_VAL(ac_cv_lib_png, +[ +kde_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm -lX11 $LIBSOCKET" +else +LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm" +fi +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" + +AC_TRY_LINK(dnl + [ + #include + ], + [ + png_structp png_ptr = png_create_read_struct( /* image ptr */ + PNG_LIBPNG_VER_STRING, 0, 0, 0 ); + return( png_ptr != 0 ); + ], + eval "ac_cv_lib_png='-lpng $LIBZ -lm'", + eval "ac_cv_lib_png=no" +) +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if eval "test ! \"`echo $ac_cv_lib_png`\" = no"; then + AC_DEFINE_UNQUOTED(HAVE_LIBPNG, 1, [Define if you have libpng]) + LIBPNG="$ac_cv_lib_png" + AC_SUBST(LIBPNG) + AC_MSG_RESULT($ac_cv_lib_png) +else + AC_MSG_RESULT(no) + LIBPNG="" + AC_SUBST(LIBPNG) +fi +]) + + +AC_DEFUN([AC_FIND_JASPER], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_REQUIRE([AC_FIND_JPEG]) +AC_MSG_CHECKING([for jasper]) +AC_CACHE_VAL(ac_cv_jasper, +[ +kde_save_LIBS="$LIBS" +LIBS="$LIBS $all_libraries $USER_LDFLAGS -ljasper $LIBJPEG -lm" +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" + +AC_TRY_LINK(dnl + [ + #include + ], + [ + return( jas_init() ); + ], + eval "ac_cv_jasper='-ljasper $LIBJPEG -lm'", + eval "ac_cv_jasper=no" +) +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if eval "test ! \"`echo $ac_cv_jasper`\" = no"; then + AC_DEFINE_UNQUOTED(HAVE_JASPER, 1, [Define if you have jasper]) + LIB_JASPER="$ac_cv_jasper" + AC_MSG_RESULT($ac_cv_jasper) +else + AC_MSG_RESULT(no) + LIB_JASPER="" +fi +AC_SUBST(LIB_JASPER) +]) + +AC_DEFUN([AC_CHECK_BOOL], +[ + AC_DEFINE_UNQUOTED(HAVE_BOOL, 1, [You _must_ have bool]) +]) + +AC_DEFUN([AC_CHECK_GNU_EXTENSIONS], +[ +AC_MSG_CHECKING(if you need GNU extensions) +AC_CACHE_VAL(ac_cv_gnu_extensions, +[ +cat > conftest.c << EOF +#include + +#ifdef __GNU_LIBRARY__ +yes +#endif +EOF + +if (eval "$ac_cpp conftest.c") 2>&5 | + egrep "yes" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_gnu_extensions=yes +else + ac_cv_gnu_extensions=no +fi +]) + +AC_MSG_RESULT($ac_cv_gnu_extensions) +if test "$ac_cv_gnu_extensions" = "yes"; then + AC_DEFINE_UNQUOTED(_GNU_SOURCE, 1, [Define if you need to use the GNU extensions]) +fi +]) + +AC_DEFUN([KDE_CHECK_COMPILER_FLAG], +[ +AC_MSG_CHECKING([whether $CXX supports -$1]) +kde_cache=`echo $1 | sed 'y% .=/+-,%____p__%'` +AC_CACHE_VAL(kde_cv_prog_cxx_$kde_cache, +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -$1" + AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cxx_$kde_cache=yes"], []) + CXXFLAGS="$save_CXXFLAGS" + AC_LANG_RESTORE +]) +if eval "test \"`echo '$kde_cv_prog_cxx_'$kde_cache`\" = yes"; then + AC_MSG_RESULT(yes) + : + $2 +else + AC_MSG_RESULT(no) + : + $3 +fi +]) + +AC_DEFUN([KDE_CHECK_C_COMPILER_FLAG], +[ +AC_MSG_CHECKING([whether $CC supports -$1]) +kde_cache=`echo $1 | sed 'y% .=/+-,%____p__%'` +AC_CACHE_VAL(kde_cv_prog_cc_$kde_cache, +[ + AC_LANG_SAVE + AC_LANG_C + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -$1" + AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cc_$kde_cache=yes"], []) + CFLAGS="$save_CFLAGS" + AC_LANG_RESTORE +]) +if eval "test \"`echo '$kde_cv_prog_cc_'$kde_cache`\" = yes"; then + AC_MSG_RESULT(yes) + : + $2 +else + AC_MSG_RESULT(no) + : + $3 +fi +]) + + +dnl AC_REMOVE_FORBIDDEN removes forbidden arguments from variables +dnl use: AC_REMOVE_FORBIDDEN(CC, [-forbid -bad-option whatever]) +dnl it's all white-space separated +AC_DEFUN([AC_REMOVE_FORBIDDEN], +[ __val=$$1 + __forbid=" $2 " + if test -n "$__val"; then + __new="" + ac_save_IFS=$IFS + IFS=" " + for i in $__val; do + case "$__forbid" in + *" $i "*) AC_MSG_WARN([found forbidden $i in $1, removing it]) ;; + *) # Careful to not add spaces, where there were none, because otherwise + # libtool gets confused, if we change e.g. CXX + if test -z "$__new" ; then __new=$i ; else __new="$__new $i" ; fi ;; + esac + done + IFS=$ac_save_IFS + $1=$__new + fi +]) + + +AC_DEFUN([KDE_CHECK_FOR_BAD_COMPILER], +[ + AC_MSG_CHECKING([whether $CC is blacklisted]) + + dnl In theory we have tu run this test against $CC and $CXX + dnl in C and in C++ mode, because its perfectly legal for + dnl the user to mix compiler versions, since C has a defined + dnl ABI. + dnl + dnl For now, we assume the user is not on crack. + + AC_TRY_COMPILE([ +#ifdef __GNUC__ +#if __GNUC__ == 4 && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ == 0 +choke me +#endif +#endif +], , + kde_bad_compiler=no, + kde_bad_compiler=yes +) + + AC_MSG_RESULT($kde_bad_compiler) + +if test "$kde_bad_compiler" = "yes"; then + AC_MSG_ERROR([ + +This particular compiler version is blacklisted because it +is known to miscompile KDE. Please use a newer version, or +if that is not yet available, choose an older version. + +Please do not report a bug or bother us reporting this +configure error. We know about it, and we introduced +it by intention to avoid untraceable bugs or crashes in KDE. + +]) +fi + +]) + + +AC_DEFUN([KDE_CHECK_FOR_OPT_NOINLINE_MATCH], +[ + AC_CACHE_CHECK([whether system headers can cope with -O2 -fno-inline], + kde_cv_opt_noinline_match, + [ + kde_cv_opt_noinline_match=irrelevant + dnl if we don't use both -O2 and -fno-inline, this check is moot + if echo "$CFLAGS" | grep -e -O2 >/dev/null 2>/dev/null \ + && echo "$CFLAGS" | grep -e -fno-inline >/dev/null 2>/dev/null ; then + + ac_cflags_save="$CFLAGS" + CFLAGS="$CFLAGS -D_USE_GNU" + + AC_TRY_LINK([ + #include +], [ const char *pt, *et; + et = __extension__ ({ char __a0, __a1, __a2; (__builtin_constant_p ( ";," ) && ((size_t)(const void *)(( ";," )+ 1) - (size_t)(const void *)( ";," ) == 1) ? ((__a0 =((__const char *) ( ";," ))[0], __a0 == '\0') ? ((void) ( pt ),((void *)0) ) : ((__a1 = ((__const char *) ( ";," ))[1], __a1== '\0') ? (__extension__ (__builtin_constant_p ( __a0 ) && ( __a0 ) == '\0' ? (char *) __rawmemchr ( pt , __a0) : strchr( pt , __a0 ))) : ((__a2 = ((__const char *) ( ";," ))[2], __a2 == '\0') ? __strpbrk_c2 ( pt , __a0, __a1) :(((__const char *) ( ";," ))[3] == '\0' ? __strpbrk_c3 ( pt ,__a0, __a1, __a2): strpbrk ( pt , ";," ))))) : strpbrk ( pt , ";," )); }) ; +], + kde_cv_opt_noinline_match=yes, + kde_cv_opt_noinline_match=no + ) + + CFLAGS="$ac_cflags_save" + fi + ]) +]) + + +dnl AC_VALIDIFY_CXXFLAGS checks for forbidden flags the user may have given +AC_DEFUN([AC_VALIDIFY_CXXFLAGS], +[dnl +if test "x$kde_use_qt_emb" != "xyes"; then + AC_REMOVE_FORBIDDEN(CXX, [-fno-rtti -rpath]) + AC_REMOVE_FORBIDDEN(CXXFLAGS, [-fno-rtti -rpath]) +else + AC_REMOVE_FORBIDDEN(CXX, [-rpath]) + AC_REMOVE_FORBIDDEN(CXXFLAGS, [-rpath]) +fi +]) + +AC_DEFUN([AC_CHECK_COMPILERS], +[ + AC_ARG_ENABLE(debug, + AC_HELP_STRING([--enable-debug=ARG],[enables debug symbols (yes|no|full) [default=no]]), + [ + case $enableval in + yes) + kde_use_debug_code="yes" + kde_use_debug_define=no + ;; + full) + kde_use_debug_code="full" + kde_use_debug_define=no + ;; + *) + kde_use_debug_code="no" + kde_use_debug_define=yes + ;; + esac + ], + [kde_use_debug_code="no" + kde_use_debug_define=no + ]) + + dnl Just for configure --help + AC_ARG_ENABLE(dummyoption, + AC_HELP_STRING([--disable-debug], + [disables debug output and debug symbols [default=no]]), + [],[]) + + AC_ARG_ENABLE(strict, + AC_HELP_STRING([--enable-strict], + [compiles with strict compiler options (may not work!)]), + [ + if test $enableval = "no"; then + kde_use_strict_options="no" + else + kde_use_strict_options="yes" + fi + ], [kde_use_strict_options="no"]) + + AC_ARG_ENABLE(warnings,AC_HELP_STRING([--disable-warnings],[disables compilation with -Wall and similar]), + [ + if test $enableval = "no"; then + kde_use_warnings="no" + else + kde_use_warnings="yes" + fi + ], [kde_use_warnings="yes"]) + + dnl enable warnings for debug build + if test "$kde_use_debug_code" != "no"; then + kde_use_warnings=yes + fi + + AC_ARG_ENABLE(profile,AC_HELP_STRING([--enable-profile],[creates profiling infos [default=no]]), + [kde_use_profiling=$enableval], + [kde_use_profiling="no"] + ) + + dnl this prevents stupid AC_PROG_CC to add "-g" to the default CFLAGS + CFLAGS=" $CFLAGS" + + AC_PROG_CC + + AC_PROG_CPP + + if test "$GCC" = "yes"; then + if test "$kde_use_debug_code" != "no"; then + if test $kde_use_debug_code = "full"; then + CFLAGS="-g3 -fno-inline $CFLAGS" + else + CFLAGS="-g -O2 -fno-schedule-insns -fno-inline $CFLAGS" + fi + else + CFLAGS="-O2 $CFLAGS" + fi + fi + + if test "$kde_use_debug_define" = "yes"; then + CFLAGS="-DNDEBUG $CFLAGS" + fi + + + case "$host" in + *-*-sysv4.2uw*) CFLAGS="-D_UNIXWARE $CFLAGS";; + *-*-sysv5uw7*) CFLAGS="-D_UNIXWARE7 $CFLAGS";; + esac + + if test -z "$LDFLAGS" && test "$kde_use_debug_code" = "no" && test "$GCC" = "yes"; then + LDFLAGS="" + fi + + CXXFLAGS=" $CXXFLAGS" + + AC_PROG_CXX + + KDE_CHECK_FOR_BAD_COMPILER + + if test "$GXX" = "yes" || test "$CXX" = "KCC"; then + if test "$kde_use_debug_code" != "no"; then + if test "$CXX" = "KCC"; then + CXXFLAGS="+K0 -Wall -pedantic -W -Wpointer-arith -Wwrite-strings $CXXFLAGS" + else + if test "$kde_use_debug_code" = "full"; then + CXXFLAGS="-g3 -fno-inline $CXXFLAGS" + else + CXXFLAGS="-g -O2 -fno-schedule-insns -fno-inline $CXXFLAGS" + fi + fi + KDE_CHECK_COMPILER_FLAG(fno-builtin,[CXXFLAGS="-fno-builtin $CXXFLAGS"]) + + dnl convenience compiler flags + KDE_CHECK_COMPILER_FLAG(Woverloaded-virtual, [WOVERLOADED_VIRTUAL="-Woverloaded-virtual"], [WOVERLOADED_VRITUAL=""]) + AC_SUBST(WOVERLOADED_VIRTUAL) + else + if test "$CXX" = "KCC"; then + CXXFLAGS="+K3 $CXXFLAGS" + else + CXXFLAGS="-O2 $CXXFLAGS" + fi + fi + fi + + if test "$kde_use_debug_define" = "yes"; then + CXXFLAGS="-DNDEBUG -DNO_DEBUG $CXXFLAGS" + fi + + if test "$kde_use_profiling" = "yes"; then + KDE_CHECK_COMPILER_FLAG(pg, + [ + CFLAGS="-pg $CFLAGS" + CXXFLAGS="-pg $CXXFLAGS" + ]) + fi + + if test "$kde_use_warnings" = "yes"; then + if test "$GCC" = "yes"; then + CXXFLAGS="-Wall -W -Wpointer-arith $CXXFLAGS" + case $host in + *-*-linux-gnu) + CFLAGS="-std=iso9899:1990 -W -Wall -Wchar-subscripts -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -D_XOPEN_SOURCE=500 -D_BSD_SOURCE $CFLAGS" + CXXFLAGS="-ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wconversion -Wchar-subscripts $CXXFLAGS" + KDE_CHECK_COMPILER_FLAG(Wmissing-format-attribute, [CXXFLAGS="$CXXFLAGS -Wformat-security -Wmissing-format-attribute"]) + KDE_CHECK_C_COMPILER_FLAG(Wmissing-format-attribute, [CFLAGS="$CFLAGS -Wformat-security -Wmissing-format-attribute"]) + ;; + esac + KDE_CHECK_COMPILER_FLAG(Wundef,[CXXFLAGS="-Wundef $CXXFLAGS"]) + KDE_CHECK_COMPILER_FLAG(Wno-long-long,[CXXFLAGS="-Wno-long-long $CXXFLAGS"]) + dnl ### FIXME: revert for KDE 4 + KDE_CHECK_COMPILER_FLAG(Wno-non-virtual-dtor,[CXXFLAGS="$CXXFLAGS -Wno-non-virtual-dtor"]) + fi + fi + + if test "$GXX" = "yes" && test "$kde_use_strict_options" = "yes"; then + CXXFLAGS="-Wcast-qual -Wshadow -Wcast-align $CXXFLAGS" + fi + + AC_ARG_ENABLE(pch, + AC_HELP_STRING([--enable-pch], + [enables precompiled header support (currently only KCC or gcc >=3.4+unsermake) [default=no]]), + [ kde_use_pch=$enableval ],[ kde_use_pch=no ]) + + HAVE_GCC_VISIBILITY=0 + AC_SUBST([HAVE_GCC_VISIBILITY]) + + if test "$GXX" = "yes"; then + gcc_no_reorder_blocks=NO + KDE_CHECK_COMPILER_FLAG(fno-reorder-blocks,[gcc_no_reorder_blocks=YES]) + if test $kde_use_debug_code != "no" && \ + test $kde_use_debug_code != "full" && \ + test "YES" = "$gcc_no_reorder_blocks" ; then + CXXFLAGS="$CXXFLAGS -fno-reorder-blocks" + CFLAGS="$CFLAGS -fno-reorder-blocks" + fi + KDE_CHECK_COMPILER_FLAG(fno-exceptions,[CXXFLAGS="$CXXFLAGS -fno-exceptions"]) + KDE_CHECK_COMPILER_FLAG(fno-check-new, [CXXFLAGS="$CXXFLAGS -fno-check-new"]) + KDE_CHECK_COMPILER_FLAG(fno-common, [CXXFLAGS="$CXXFLAGS -fno-common"]) + KDE_CHECK_COMPILER_FLAG(fexceptions, [USE_EXCEPTIONS="-fexceptions"], USE_EXCEPTIONS= ) + ENABLE_PERMISSIVE_FLAG="-fpermissive" + + if test "$kde_use_pch" = "yes"; then + AC_MSG_CHECKING(whether gcc supports precompiling c header files) + echo >conftest.h + if $CC -x c-header conftest.h >/dev/null 2>/dev/null; then + kde_gcc_supports_pch=yes + AC_MSG_RESULT(yes) + else + kde_gcc_supports_pch=no + AC_MSG_RESULT(no) + fi + if test "$kde_gcc_supports_pch" = "yes"; then + AC_MSG_CHECKING(whether gcc supports precompiling c++ header files) + if $CXX -x c++-header conftest.h >/dev/null 2>/dev/null; then + kde_gcc_supports_pch=yes + AC_MSG_RESULT(yes) + else + kde_gcc_supports_pch=no + AC_MSG_RESULT(no) + fi + fi + rm -f conftest.h conftest.h.gch + fi + + KDE_CHECK_FOR_OPT_NOINLINE_MATCH + if test "x$kde_cv_opt_noinline_match" = "xno" ; then + CFLAGS="`echo "$CFLAGS" | sed "s/ -fno-inline//"`" + fi + fi + AM_CONDITIONAL(unsermake_enable_pch, test "$kde_use_pch" = "yes" && test "$kde_gcc_supports_pch" = "yes") + if test "$CXX" = "KCC"; then + dnl unfortunately we currently cannot disable exception support in KCC + dnl because doing so is binary incompatible and Qt by default links with exceptions :-( + dnl KDE_CHECK_COMPILER_FLAG(-no_exceptions,[CXXFLAGS="$CXXFLAGS --no_exceptions"]) + dnl KDE_CHECK_COMPILER_FLAG(-exceptions, [USE_EXCEPTIONS="--exceptions"], USE_EXCEPTIONS= ) + + if test "$kde_use_pch" = "yes"; then + dnl TODO: support --pch-dir! + KDE_CHECK_COMPILER_FLAG(-pch,[CXXFLAGS="$CXXFLAGS --pch"]) + dnl the below works (but the dir must exist), but it's + dnl useless for a whole package. + dnl The are precompiled headers for each source file, so when compiling + dnl from scratch, it doesn't make a difference, and they take up + dnl around ~5Mb _per_ sourcefile. + dnl KDE_CHECK_COMPILER_FLAG(-pch_dir /tmp, + dnl [CXXFLAGS="$CXXFLAGS --pch_dir `pwd`/pcheaders"]) + fi + dnl this flag controls inlining. by default KCC inlines in optimisation mode + dnl all implementations that are defined inside the class {} declaration. + dnl because of templates-compatibility with broken gcc compilers, this + dnl can cause excessive inlining. This flag limits it to a sane level + KDE_CHECK_COMPILER_FLAG(-inline_keyword_space_time=6,[CXXFLAGS="$CXXFLAGS --inline_keyword_space_time=6"]) + KDE_CHECK_COMPILER_FLAG(-inline_auto_space_time=2,[CXXFLAGS="$CXXFLAGS --inline_auto_space_time=2"]) + KDE_CHECK_COMPILER_FLAG(-inline_implicit_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_implicit_space_time=2.0"]) + KDE_CHECK_COMPILER_FLAG(-inline_generated_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_generated_space_time=2.0"]) + dnl Some source files are shared between multiple executables + dnl (or libraries) and some of those need template instantiations. + dnl In that case KCC needs to compile those sources with + dnl --one_instantiation_per_object. To make it easy for us we compile + dnl _all_ objects with that flag (--one_per is a shorthand). + KDE_CHECK_COMPILER_FLAG(-one_per, [CXXFLAGS="$CXXFLAGS --one_per"]) + fi + AC_SUBST(USE_EXCEPTIONS) + dnl obsolete macro - provided to keep things going + USE_RTTI= + AC_SUBST(USE_RTTI) + + case "$host" in + *-*-irix*) test "$GXX" = yes && CXXFLAGS="-D_LANGUAGE_C_PLUS_PLUS -D__LANGUAGE_C_PLUS_PLUS $CXXFLAGS" ;; + *-*-sysv4.2uw*) CXXFLAGS="-D_UNIXWARE $CXXFLAGS";; + *-*-sysv5uw7*) CXXFLAGS="-D_UNIXWARE7 $CXXFLAGS";; + *-*-solaris*) + if test "$GXX" = yes; then + libstdcpp=`$CXX -print-file-name=libstdc++.so` + if test ! -f $libstdcpp; then + AC_MSG_ERROR([You've compiled gcc without --enable-shared. This doesn't work with KDE. Please recompile gcc with --enable-shared to receive a libstdc++.so]) + fi + fi + ;; + esac + + AC_VALIDIFY_CXXFLAGS + + AC_PROG_CXXCPP + + if test "$GCC" = yes; then + NOOPT_CFLAGS=-O0 + fi + KDE_CHECK_COMPILER_FLAG(O0,[NOOPT_CXXFLAGS=-O0]) + + AC_ARG_ENABLE(coverage, + AC_HELP_STRING([--enable-coverage],[use gcc coverage testing]), [ + if test "$am_cv_CC_dependencies_compiler_type" = "gcc3"; then + ac_coverage_compiler="-fprofile-arcs -ftest-coverage" + ac_coverage_linker="-lgcc" + elif test "$am_cv_CC_dependencies_compiler_type" = "gcc"; then + ac_coverage_compiler="-fprofile-arcs -ftest-coverage" + ac_coverage_linker="" + else + AC_MSG_ERROR([coverage with your compiler is not supported]) + fi + CFLAGS="$CFLAGS $ac_coverage_compiler" + CXXFLAGS="$CXXFLAGS $ac_coverage_compiler" + LDFLAGS="$LDFLAGS $ac_coverage_linker" + ]) + + AC_SUBST(NOOPT_CXXFLAGS) + AC_SUBST(NOOPT_CFLAGS) + AC_SUBST(ENABLE_PERMISSIVE_FLAG) + + KDE_CHECK_NEW_LDFLAGS + KDE_CHECK_FINAL + KDE_CHECK_CLOSURE + KDE_CHECK_NMCHECK + + ifdef([AM_DEPENDENCIES], AC_REQUIRE([KDE_ADD_DEPENDENCIES]), []) +]) + +AC_DEFUN([KDE_CHECK_VISIBILITY_GCC_BUG], + [ + AC_CACHE_CHECK([for gcc -fvisibility-inlines-hidden bug], kde_cv_val_gcc_visibility_bug, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + safe_CXXFLAGS=$CXXFLAGS + safe_LDFLAGS=$LDFLAGS + CXXFLAGS="$CXXFLAGS -fPIC -fvisibility-inlines-hidden -O0" + LDFLAGS="$LDFLAGS -shared -fPIC" + + AC_TRY_LINK( + [ + /* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19664 */ + #include + int some_function( void ) __attribute__ ((visibility("default"))); + int some_function( void ) + { + std::string s("blafasel"); + return 0; + } + ], [/* elvis is alive */], + kde_cv_val_gcc_visibility_bug=no, kde_cv_val_gcc_visibility_bug=yes) + + CXXFLAGS=$safe_CXXFLAGS + LDFLAGS=$safe_LDFLAGS + AC_LANG_RESTORE + ] + ) + + if test x$kde_cv_val_gcc_visibility_bug = xno; then + CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden" + fi + ] +) + +AC_DEFUN([KDE_ENABLE_HIDDEN_VISIBILITY], +[ + AC_BEFORE([AC_PATH_QT_1_3], [KDE_ENABLE_HIDDEN_VISIBILITY]) + + AC_MSG_CHECKING([grepping for visibility push/pop in headers]) + + if test "x$GXX" = "xyes"; then + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_EGREP_CPP( + [GCC visibility push], + [ #include + ], + [ + AC_MSG_RESULT(yes) + kde_stdc_visibility_patched=yes ], + [ + AC_MSG_RESULT(no) + AC_MSG_WARN([Your libstdc++ doesn't appear to be patched for + visibility support. Disabling -fvisibility=hidden]) + + kde_stdc_visibility_patched=no ]) + + AC_LANG_RESTORE + + kde_have_gcc_visibility=no + KDE_CHECK_COMPILER_FLAG(fvisibility=hidden, + [ + kde_have_gcc_visibility=yes + dnl the whole toolchain is just a mess, gcc is just too buggy + dnl to handle STL with visibility enabled. Lets reconsider + dnl when gcc 4.2 is out or when things get fixed in the compiler. + dnl Contact mueller@kde.org for details. + AC_ARG_ENABLE(gcc-hidden-visibility, + AC_HELP_STRING([--enable-gcc-hidden-visibility],[toolchain hidden visibility [default=no]]), + [kde_have_gcc_visibility=$enableval], + [kde_have_gcc_visibility=no]) + + AC_CACHE_CHECK([if Qt is patched for -fvisibility], kde_cv_val_qt_gcc_visibility_patched, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + safe_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $all_includes" + + AC_TRY_COMPILE( + [ +#include +#if Q_EXPORT - 0 != 0 +/* if this compiles, then Q_EXPORT is undefined */ +/* if Q_EXPORT is nonempty, this will break compilation */ +#endif + ], [/* elvis is alive */], + kde_cv_val_qt_gcc_visibility_patched=no, kde_cv_val_qt_gcc_visibility_patched=yes) + + CXXFLAGS=$safe_CXXFLAGS + AC_LANG_RESTORE + ] + ) + + if test x$kde_have_gcc_visibility = "xyes" && test x$kde_stdc_visibility_patched = "xyes" && test x$kde_cv_val_qt_gcc_visibility_patched = "xyes"; then + CXXFLAGS="$CXXFLAGS -fvisibility=hidden" + KDE_CHECK_VISIBILITY_GCC_BUG + HAVE_GCC_VISIBILITY=1 + AC_DEFINE_UNQUOTED(__KDE_HAVE_GCC_VISIBILITY, "$HAVE_GCC_VISIBILITY", [define to 1 if -fvisibility is supported]) + fi + ]) + fi +]) + +AC_DEFUN([KDE_ADD_DEPENDENCIES], +[ + [A]M_DEPENDENCIES(CC) + [A]M_DEPENDENCIES(CXX) +]) + +dnl just a wrapper to clean up configure.in +AC_DEFUN([KDE_PROG_LIBTOOL], +[ +AC_REQUIRE([AC_CHECK_COMPILERS]) +AC_REQUIRE([AC_ENABLE_SHARED]) +AC_REQUIRE([AC_ENABLE_STATIC]) + +AC_REQUIRE([AC_LIBTOOL_DLOPEN]) +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_OBJEXT +AC_EXEEXT + +AM_PROG_LIBTOOL +AC_LIBTOOL_CXX + +LIBTOOL_SHELL="/bin/sh ./libtool" +# LIBTOOL="$LIBTOOL --silent" +KDE_PLUGIN="-avoid-version -module -no-undefined \$(KDE_NO_UNDEFINED) \$(KDE_RPATH) \$(KDE_MT_LDFLAGS)" +AC_SUBST(KDE_PLUGIN) + +# This hack ensures that libtool creates shared libs for kunittest plugins. By default check_LTLIBRARIES makes static libs. +KDE_CHECK_PLUGIN="\$(KDE_PLUGIN) -rpath \$(libdir)" +AC_SUBST(KDE_CHECK_PLUGIN) + +# we patch configure quite some so we better keep that consistent for incremental runs +AC_SUBST(AUTOCONF,'$(SHELL) $(top_srcdir)/admin/cvs.sh configure || touch configure') +]) + +AC_DEFUN([KDE_CHECK_LIB64], +[ + AC_ARG_ENABLE(libsuffix, + AC_HELP_STRING([--enable-libsuffix], + [/lib directory suffix (64,32,none,auto[=default])]), + kdelibsuff=$enableval, kdelibsuff="auto") + + if test "$kdelibsuff" = "auto"; then + +cat > conftest.c << EOF +#include +int main() { + return 0; +} +EOF + kdelibsuff=`$CC conftest.c -o conftest.out; ldd conftest.out |sed -ne '/libc.so/{ + s,.*/lib\([[^\/]]*\)/.*,\1, + p +}'` + rm -rf conftest.* + fi + + if test "$kdelibsuff" = "no" || test "$kdelibsuff" = "none"; then + kdelibsuff= + fi + if test -z "$kdelibsuff"; then + AC_MSG_RESULT([not using lib directory suffix]) + AC_DEFINE(KDELIBSUFF, [""], Suffix for lib directories) + else + if test "$libdir" = '${exec_prefix}/lib'; then + libdir="$libdir${kdelibsuff}" + AC_SUBST([libdir], ["$libdir"]) dnl ugly hack for lib64 platforms + fi + AC_DEFINE_UNQUOTED(KDELIBSUFF, ["${kdelibsuff}"], Suffix for lib directories) + AC_MSG_RESULT([using lib directory suffix $kdelibsuff]) + fi +]) + +AC_DEFUN([KDE_CHECK_TYPES], +[ AC_CHECK_SIZEOF(int, 4)dnl + AC_CHECK_SIZEOF(short)dnl + AC_CHECK_SIZEOF(long, 4)dnl + AC_CHECK_SIZEOF(char *, 4)dnl +])dnl + +dnl Not used - kept for compat only? +AC_DEFUN([KDE_DO_IT_ALL], +[ +AC_CANONICAL_SYSTEM +AC_ARG_PROGRAM +AM_INIT_AUTOMAKE($1, $2) +AM_DISABLE_LIBRARIES +AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde}) +AC_CHECK_COMPILERS +KDE_PROG_LIBTOOL +AM_KDE_WITH_NLS +AC_PATH_KDE +]) + +AC_DEFUN([AC_CHECK_RPATH], +[ +AC_MSG_CHECKING(for rpath) +AC_ARG_ENABLE(rpath, + AC_HELP_STRING([--disable-rpath],[do not use the rpath feature of ld]), + USE_RPATH=$enableval, USE_RPATH=yes) + +if test -z "$KDE_RPATH" && test "$USE_RPATH" = "yes"; then + + KDE_RPATH="-R \$(libdir)" + + if test "$kde_libraries" != "$libdir"; then + KDE_RPATH="$KDE_RPATH -R \$(kde_libraries)" + fi + + if test -n "$qt_libraries"; then + KDE_RPATH="$KDE_RPATH -R \$(qt_libraries)" + fi + dnl $x_libraries is set to /usr/lib in case + if test -n "$X_LDFLAGS"; then + X_RPATH="-R \$(x_libraries)" + KDE_RPATH="$KDE_RPATH $X_RPATH" + fi + if test -n "$KDE_EXTRA_RPATH"; then + KDE_RPATH="$KDE_RPATH \$(KDE_EXTRA_RPATH)" + fi +fi +AC_SUBST(KDE_EXTRA_RPATH) +AC_SUBST(KDE_RPATH) +AC_SUBST(X_RPATH) +AC_MSG_RESULT($USE_RPATH) +]) + +dnl Check for the type of the third argument of getsockname +AC_DEFUN([AC_CHECK_SOCKLEN_T], +[ + AC_MSG_CHECKING(for socklen_t) + AC_CACHE_VAL(kde_cv_socklen_t, + [ + AC_LANG_PUSH(C++) + kde_cv_socklen_t=no + AC_TRY_COMPILE([ + #include + #include + ], + [ + socklen_t len; + getpeername(0,0,&len); + ], + [ + kde_cv_socklen_t=yes + kde_cv_socklen_t_equiv=socklen_t + ]) + AC_LANG_POP(C++) + ]) + AC_MSG_RESULT($kde_cv_socklen_t) + if test $kde_cv_socklen_t = no; then + AC_MSG_CHECKING([for socklen_t equivalent for socket functions]) + AC_CACHE_VAL(kde_cv_socklen_t_equiv, + [ + kde_cv_socklen_t_equiv=int + AC_LANG_PUSH(C++) + for t in int size_t unsigned long "unsigned long"; do + AC_TRY_COMPILE([ + #include + #include + ], + [ + $t len; + getpeername(0,0,&len); + ], + [ + kde_cv_socklen_t_equiv="$t" + break + ]) + done + AC_LANG_POP(C++) + ]) + AC_MSG_RESULT($kde_cv_socklen_t_equiv) + fi + AC_DEFINE_UNQUOTED(kde_socklen_t, $kde_cv_socklen_t_equiv, + [type to use in place of socklen_t if not defined]) + AC_DEFINE_UNQUOTED(ksize_t, $kde_cv_socklen_t_equiv, + [type to use in place of socklen_t if not defined (deprecated, use kde_socklen_t)]) +]) + +dnl This is a merge of some macros out of the gettext aclocal.m4 +dnl since we don't need anything, I took the things we need +dnl the copyright for them is: +dnl > +dnl Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. +dnl This Makefile.in is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. +dnl > +dnl for this file it is relicensed under LGPL + +AC_DEFUN([AM_KDE_WITH_NLS], + [ + dnl If we use NLS figure out what method + + AM_PATH_PROG_WITH_TEST_KDE(MSGFMT, msgfmt, + [test -n "`$ac_dir/$ac_word --version 2>&1 | grep 'GNU gettext'`"], msgfmt) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + if test -z "`$GMSGFMT --version 2>&1 | grep 'GNU gettext'`"; then + AC_MSG_RESULT([found msgfmt program is not GNU msgfmt; ignore it]) + GMSGFMT=":" + fi + MSGFMT=$GMSGFMT + AC_SUBST(GMSGFMT) + AC_SUBST(MSGFMT) + + AM_PATH_PROG_WITH_TEST_KDE(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + AC_MSG_RESULT( + [found xgettext programs is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + fi + AC_SUBST(XGETTEXT) + + ]) + +# Search path for a program which passes the given test. +# Ulrich Drepper , 1996. + +# serial 1 +# Stephan Kulow: I appended a _KDE against name conflicts + +dnl AM_PATH_PROG_WITH_TEST_KDE(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN([AM_PATH_PROG_WITH_TEST_KDE], +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test -n "[$]$1"; then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) + + +# Check whether LC_MESSAGES is available in . +# Ulrich Drepper , 1995. + +# serial 1 + +AC_DEFUN([AM_LC_MESSAGES], + [if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your locale.h file contains LC_MESSAGES]) + fi + fi]) + +dnl From Jim Meyering. +dnl FIXME: migrate into libit. + +AC_DEFUN([AM_FUNC_OBSTACK], +[AC_CACHE_CHECK([for obstacks], am_cv_func_obstack, + [AC_TRY_LINK([#include "obstack.h"], + [struct obstack *mem;obstack_free(mem,(char *) 0)], + am_cv_func_obstack=yes, + am_cv_func_obstack=no)]) + if test $am_cv_func_obstack = yes; then + AC_DEFINE(HAVE_OBSTACK) + else + LIBOBJS="$LIBOBJS obstack.o" + fi +]) + +dnl From Jim Meyering. Use this if you use the GNU error.[ch]. +dnl FIXME: Migrate into libit + +AC_DEFUN([AM_FUNC_ERROR_AT_LINE], +[AC_CACHE_CHECK([for error_at_line], am_cv_lib_error_at_line, + [AC_TRY_LINK([],[error_at_line(0, 0, "", 0, "");], + am_cv_lib_error_at_line=yes, + am_cv_lib_error_at_line=no)]) + if test $am_cv_lib_error_at_line = no; then + LIBOBJS="$LIBOBJS error.o" + fi + AC_SUBST(LIBOBJS)dnl +]) + +# Macro to add for using GNU gettext. +# Ulrich Drepper , 1995. + +# serial 1 +# Stephan Kulow: I put a KDE in it to avoid name conflicts + +AC_DEFUN([AM_KDE_GNU_GETTEXT], + [AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + AC_REQUIRE([AM_KDE_WITH_NLS])dnl + AC_CHECK_HEADERS([limits.h locale.h nl_types.h string.h values.h alloca.h]) + AC_CHECK_FUNCS([getcwd munmap putenv setlocale strchr strcasecmp \ +__argz_count __argz_stringify __argz_next]) + + AC_MSG_CHECKING(for stpcpy) + AC_CACHE_VAL(kde_cv_func_stpcpy, + [ + kde_safe_cxxflags=$CXXFLAGS + CXXFLAGS="-Werror" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([ + #include + ], + [ + char buffer[200]; + stpcpy(buffer, buffer); + ], + kde_cv_func_stpcpy=yes, + kde_cv_func_stpcpy=no) + AC_LANG_RESTORE + CXXFLAGS=$kde_safe_cxxflags + ]) + AC_MSG_RESULT($kde_cv_func_stpcpy) + if eval "test \"`echo $kde_cv_func_stpcpy`\" = yes"; then + AC_DEFINE(HAVE_STPCPY, 1, [Define if you have stpcpy]) + fi + + AM_LC_MESSAGES + + if test "x$CATOBJEXT" != "x"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + AC_MSG_CHECKING(for catalogs to be installed) + NEW_LINGUAS= + for lang in ${LINGUAS=$ALL_LINGUAS}; do + case "$ALL_LINGUAS" in + *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; + esac + done + LINGUAS=$NEW_LINGUAS + AC_MSG_RESULT($LINGUAS) + fi + + dnl Construct list of names of catalog files to be constructed. + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + ]) + +AC_DEFUN([AC_HAVE_XPM], + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$XPM_LDFLAGS" && XPM_LDFLAGS= + test -z "$XPM_INCLUDE" && XPM_INCLUDE= + + AC_ARG_WITH(xpm,AC_HELP_STRING([--without-xpm],[disable color pixmap XPM tests]), + xpm_test=$withval, xpm_test="yes") + if test "x$xpm_test" = xno; then + ac_cv_have_xpm=no + else + AC_MSG_CHECKING(for XPM) + AC_CACHE_VAL(ac_cv_have_xpm, + [ + ac_save_ldflags="$LDFLAGS" + ac_save_cflags="$CFLAGS" + if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then + LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm -lX11 -lXext $LIBZ $LIBSOCKET" + else + LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm $LIBZ $LIBSOCKET" + fi + CFLAGS="$CFLAGS $X_INCLUDES $USER_INCLUDES" + test -n "$XPM_INCLUDE" && CFLAGS="-I$XPM_INCLUDE $CFLAGS" + AC_TRY_LINK([#include ],[], + ac_cv_have_xpm="yes",ac_cv_have_xpm="no") + LDFLAGS="$ac_save_ldflags" + CFLAGS="$ac_save_cflags" + ])dnl + + if test "$ac_cv_have_xpm" = no; then + AC_MSG_RESULT(no) + XPM_LDFLAGS="" + XPMINC="" + $2 + else + AC_DEFINE(HAVE_XPM, 1, [Define if you have XPM support]) + if test "$XPM_LDFLAGS" = ""; then + XPMLIB='-lXpm $(LIB_X11)' + else + XPMLIB="-L$XPM_LDFLAGS -lXpm "'$(LIB_X11)' + fi + if test "$XPM_INCLUDE" = ""; then + XPMINC="" + else + XPMINC="-I$XPM_INCLUDE" + fi + AC_MSG_RESULT(yes) + $1 + fi + fi + AC_SUBST(XPMINC) + AC_SUBST(XPMLIB) +]) + +AC_DEFUN([AC_HAVE_DPMS], + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$DPMS_LDFLAGS" && DPMS_LDFLAGS= + test -z "$DPMS_INCLUDE" && DPMS_INCLUDE= + DPMS_LIB= + + AC_ARG_WITH(dpms,AC_HELP_STRING([--without-dpms],[disable DPMS power saving]), + dpms_test=$withval, dpms_test="yes") + if test "x$dpms_test" = xno; then + ac_cv_have_dpms=no + else + AC_MSG_CHECKING(for DPMS) + dnl Note: ac_cv_have_dpms can be no, yes, or -lXdpms. + dnl 'yes' means DPMS_LIB="", '-lXdpms' means DPMS_LIB="-lXdpms". + AC_CACHE_VAL(ac_cv_have_dpms, + [ + if test "x$kde_use_qt_emb" = "xyes" || test "x$kde_use_qt_mac" = "xyes"; then + AC_MSG_RESULT(no) + ac_cv_have_dpms="no" + else + ac_save_ldflags="$LDFLAGS" + ac_save_cflags="$CFLAGS" + ac_save_libs="$LIBS" + LDFLAGS="$LDFLAGS $DPMS_LDFLAGS $all_libraries" + LIBS="-lX11 -lXext $LIBSOCKET" + CFLAGS="$CFLAGS $X_INCLUDES" + test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS" + AC_TRY_LINK([ + #include + #include + #include + #include + int foo_test_dpms() + { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[], + ac_cv_have_dpms="yes", [ + LIBS="-lXdpms $LIBS" + AC_TRY_LINK([ + #include + #include + #include + #include + int foo_test_dpms() + { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[], + [ + ac_cv_have_dpms="-lXdpms" + ],ac_cv_have_dpms="no") + ]) + LDFLAGS="$ac_save_ldflags" + CFLAGS="$ac_save_cflags" + LIBS="$ac_save_libs" + fi + ])dnl + + if test "$ac_cv_have_dpms" = no; then + AC_MSG_RESULT(no) + DPMS_LDFLAGS="" + DPMSINC="" + $2 + else + AC_DEFINE(HAVE_DPMS, 1, [Define if you have DPMS support]) + if test "$ac_cv_have_dpms" = "-lXdpms"; then + DPMS_LIB="-lXdpms" + fi + if test "$DPMS_LDFLAGS" = ""; then + DPMSLIB="$DPMS_LIB "'$(LIB_X11)' + else + DPMSLIB="$DPMS_LDFLAGS $DPMS_LIB "'$(LIB_X11)' + fi + if test "$DPMS_INCLUDE" = ""; then + DPMSINC="" + else + DPMSINC="-I$DPMS_INCLUDE" + fi + AC_MSG_RESULT(yes) + $1 + fi + fi + ac_save_cflags="$CFLAGS" + CFLAGS="$CFLAGS $X_INCLUDES" + test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS" + AH_TEMPLATE(HAVE_DPMSCAPABLE_PROTO, + [Define if you have the DPMSCapable prototype in ]) + AC_CHECK_DECL(DPMSCapable, + AC_DEFINE(HAVE_DPMSCAPABLE_PROTO),, + [#include + #include ]) + AH_TEMPLATE(HAVE_DPMSINFO_PROTO, + [Define if you have the DPMSInfo prototype in ]) + AC_CHECK_DECL(DPMSInfo, + AC_DEFINE(HAVE_DPMSINFO_PROTO),, + [#include + #include ]) + CFLAGS="$ac_save_cflags" + AC_SUBST(DPMSINC) + AC_SUBST(DPMSLIB) +]) + +AC_DEFUN([AC_HAVE_GL], + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$GL_LDFLAGS" && GL_LDFLAGS= + test -z "$GL_INCLUDE" && GL_INCLUDE= + + AC_ARG_WITH(gl,AC_HELP_STRING([--without-gl],[disable 3D GL modes]), + gl_test=$withval, gl_test="yes") + if test "x$kde_use_qt_emb" = "xyes"; then + # GL and Qt Embedded is a no-go for now. + ac_cv_have_gl=no + elif test "x$gl_test" = xno; then + ac_cv_have_gl=no + else + AC_MSG_CHECKING(for GL) + AC_CACHE_VAL(ac_cv_have_gl, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_ldflags=$LDFLAGS + ac_save_cxxflags=$CXXFLAGS + ac_save_libs=$LIBS + LDFLAGS="$LDFLAGS $GL_LDFLAGS $X_LDFLAGS $all_libraries" + LIBS="$LIBS -lGL -lGLU" + test "x$kde_use_qt_mac" != xyes && test "x$kde_use_qt_emb" != xyes && LIBS="$LIBS -lX11" + LIBS="$LIBS $LIB_XEXT -lm $LIBSOCKET" + CXXFLAGS="$CFLAGS $X_INCLUDES" + test -n "$GL_INCLUDE" && CFLAGS="-I$GL_INCLUDE $CFLAGS" + AC_TRY_LINK([#include +#include +], [], + ac_cv_have_gl="yes", ac_cv_have_gl="no") + AC_LANG_RESTORE + LDFLAGS=$ac_save_ldflags + CXXFLAGS=$ac_save_cxxflags + LIBS=$ac_save_libs + ])dnl + + if test "$ac_cv_have_gl" = "no"; then + AC_MSG_RESULT(no) + GL_LDFLAGS="" + GLINC="" + $2 + else + AC_DEFINE(HAVE_GL, 1, [Defines if you have GL (Mesa, OpenGL, ...)]) + if test "$GL_LDFLAGS" = ""; then + GLLIB='-lGLU -lGL $(LIB_X11)' + else + GLLIB="$GL_LDFLAGS -lGLU -lGL "'$(LIB_X11)' + fi + if test "$GL_INCLUDE" = ""; then + GLINC="" + else + GLINC="-I$GL_INCLUDE" + fi + AC_MSG_RESULT($ac_cv_have_gl) + $1 + fi + fi + AC_SUBST(GLINC) + AC_SUBST(GLLIB) +]) + + + dnl shadow password and PAM magic - maintained by ossi@kde.org + +AC_DEFUN([KDE_PAM], [ + AC_REQUIRE([KDE_CHECK_LIBDL]) + + want_pam= + AC_ARG_WITH(pam, + AC_HELP_STRING([--with-pam[=ARG]],[enable support for PAM: ARG=[yes|no|service name]]), + [ if test "x$withval" = "xyes"; then + want_pam=yes + pam_service=kde + elif test "x$withval" = "xno"; then + want_pam=no + else + want_pam=yes + pam_service=$withval + fi + ], [ pam_service=kde ]) + + use_pam= + PAMLIBS= + if test "x$want_pam" != xno; then + AC_CHECK_LIB(pam, pam_start, [ + AC_CHECK_HEADER(security/pam_appl.h, + [ pam_header=security/pam_appl.h ], + [ AC_CHECK_HEADER(pam/pam_appl.h, + [ pam_header=pam/pam_appl.h ], + [ + AC_MSG_WARN([PAM detected, but no headers found! +Make sure you have the necessary development packages installed.]) + ] + ) + ] + ) + ], , $LIBDL) + if test -z "$pam_header"; then + if test "x$want_pam" = xyes; then + AC_MSG_ERROR([--with-pam was specified, but cannot compile with PAM!]) + fi + else + AC_DEFINE(HAVE_PAM, 1, [Defines if you have PAM (Pluggable Authentication Modules)]) + PAMLIBS="$PAM_MISC_LIB -lpam $LIBDL" + use_pam=yes + + dnl darwin claims to be something special + if test "$pam_header" = "pam/pam_appl.h"; then + AC_DEFINE(HAVE_PAM_PAM_APPL_H, 1, [Define if your PAM headers are in pam/ instead of security/]) + fi + + dnl test whether struct pam_message is const (Linux) or not (Sun) + AC_MSG_CHECKING(for const pam_message) + AC_EGREP_HEADER([struct pam_message], $pam_header, + [ AC_EGREP_HEADER([const struct pam_message], $pam_header, + [AC_MSG_RESULT([const: Linux-type PAM])], + [AC_MSG_RESULT([nonconst: Sun-type PAM]) + AC_DEFINE(PAM_MESSAGE_NONCONST, 1, [Define if your PAM support takes non-const arguments (Solaris)])] + )], + [AC_MSG_RESULT([not found - assume const, Linux-type PAM])]) + fi + fi + + AC_SUBST(PAMLIBS) +]) + +dnl DEF_PAM_SERVICE(arg name, full name, define name) +AC_DEFUN([DEF_PAM_SERVICE], [ + AC_ARG_WITH($1-pam, + AC_HELP_STRING([--with-$1-pam=[val]],[override PAM service from --with-pam for $2]), + [ if test "x$use_pam" = xyes; then + $3_PAM_SERVICE=$withval + else + AC_MSG_ERROR([Cannot use use --with-$1-pam, as no PAM was detected. +You may want to enforce it by using --with-pam.]) + fi + ], + [ if test "x$use_pam" = xyes; then + $3_PAM_SERVICE="$pam_service" + fi + ]) + if test -n "$$3_PAM_SERVICE"; then + AC_MSG_RESULT([The PAM service used by $2 will be $$3_PAM_SERVICE]) + AC_DEFINE_UNQUOTED($3_PAM_SERVICE, "$$3_PAM_SERVICE", [The PAM service to be used by $2]) + fi + AC_SUBST($3_PAM_SERVICE) +]) + +AC_DEFUN([KDE_SHADOWPASSWD], [ + AC_REQUIRE([KDE_PAM]) + + AC_CHECK_LIB(shadow, getspent, + [ LIBSHADOW="-lshadow" + ac_use_shadow=yes + ], + [ dnl for UnixWare + AC_CHECK_LIB(gen, getspent, + [ LIBGEN="-lgen" + ac_use_shadow=yes + ], + [ AC_CHECK_FUNC(getspent, + [ ac_use_shadow=yes ], + [ ac_use_shadow=no ]) + ]) + ]) + AC_SUBST(LIBSHADOW) + AC_SUBST(LIBGEN) + + AC_MSG_CHECKING([for shadow passwords]) + + AC_ARG_WITH(shadow, + AC_HELP_STRING([--with-shadow],[If you want shadow password support]), + [ if test "x$withval" != "xno"; then + use_shadow=yes + else + use_shadow=no + fi + ], [ + use_shadow="$ac_use_shadow" + ]) + + if test "x$use_shadow" = xyes; then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_SHADOW, 1, [Define if you use shadow passwords]) + else + AC_MSG_RESULT(no) + LIBSHADOW= + LIBGEN= + fi + + dnl finally make the relevant binaries setuid root, if we have shadow passwds. + dnl this still applies, if we could use it indirectly through pam. + if test "x$use_shadow" = xyes || + ( test "x$use_pam" = xyes && test "x$ac_use_shadow" = xyes ); then + case $host in + *-*-freebsd* | *-*-netbsd* | *-*-openbsd*) + SETUIDFLAGS="-m 4755 -o root";; + *) + SETUIDFLAGS="-m 4755";; + esac + fi + AC_SUBST(SETUIDFLAGS) + +]) + +AC_DEFUN([KDE_PASSWDLIBS], [ + AC_REQUIRE([KDE_MISC_TESTS]) dnl for LIBCRYPT + AC_REQUIRE([KDE_PAM]) + AC_REQUIRE([KDE_SHADOWPASSWD]) + + if test "x$use_pam" = "xyes"; then + PASSWDLIBS="$PAMLIBS" + else + PASSWDLIBS="$LIBCRYPT $LIBSHADOW $LIBGEN" + fi + + dnl FreeBSD uses a shadow-like setup, where /etc/passwd holds the users, but + dnl /etc/master.passwd holds the actual passwords. /etc/master.passwd requires + dnl root to read, so kcheckpass needs to be root (even when using pam, since pam + dnl may need to read /etc/master.passwd). + case $host in + *-*-freebsd*) + SETUIDFLAGS="-m 4755 -o root" + ;; + *) + ;; + esac + + AC_SUBST(PASSWDLIBS) +]) + +AC_DEFUN([KDE_CHECK_LIBDL], +[ +AC_CHECK_LIB(dl, dlopen, [ +LIBDL="-ldl" +ac_cv_have_dlfcn=yes +]) + +AC_CHECK_LIB(dld, shl_unload, [ +LIBDL="-ldld" +ac_cv_have_shload=yes +]) + +AC_SUBST(LIBDL) +]) + +AC_DEFUN([KDE_CHECK_DLOPEN], +[ +KDE_CHECK_LIBDL +AC_CHECK_HEADERS(dlfcn.h dl.h) +if test "$ac_cv_header_dlfcn_h" = "no"; then + ac_cv_have_dlfcn=no +fi + +if test "$ac_cv_header_dl_h" = "no"; then + ac_cv_have_shload=no +fi + +dnl XXX why change enable_dlopen? its already set by autoconf's AC_ARG_ENABLE +dnl (MM) +AC_ARG_ENABLE(dlopen, +AC_HELP_STRING([--disable-dlopen],[link statically [default=no]]), +enable_dlopen=$enableval, +enable_dlopen=yes) + +# override the user's opinion, if we know it better ;) +if test "$ac_cv_have_dlfcn" = "no" && test "$ac_cv_have_shload" = "no"; then + enable_dlopen=no +fi + +if test "$ac_cv_have_dlfcn" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_DLFCN, 1, [Define if you have dlfcn]) +fi + +if test "$ac_cv_have_shload" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_SHLOAD, 1, [Define if you have shload]) +fi + +if test "$enable_dlopen" = no ; then + test -n "$1" && eval $1 +else + test -n "$2" && eval $2 +fi + +]) + +AC_DEFUN([KDE_CHECK_DYNAMIC_LOADING], +[ +KDE_CHECK_DLOPEN(libtool_enable_shared=yes, libtool_enable_static=no) +KDE_PROG_LIBTOOL +AC_MSG_CHECKING([dynamic loading]) +eval "`egrep '^build_libtool_libs=' libtool`" +if test "$build_libtool_libs" = "yes" && test "$enable_dlopen" = "yes"; then + dynamic_loading=yes + AC_DEFINE_UNQUOTED(HAVE_DYNAMIC_LOADING) +else + dynamic_loading=no +fi +AC_MSG_RESULT($dynamic_loading) +if test "$dynamic_loading" = "yes"; then + $1 +else + $2 +fi +]) + +AC_DEFUN([KDE_ADD_INCLUDES], +[ +if test -z "$1"; then + test_include="Pix.h" +else + test_include="$1" +fi + +AC_MSG_CHECKING([for libg++ ($test_include)]) + +AC_CACHE_VAL(kde_cv_libgpp_includes, +[ +kde_cv_libgpp_includes=no + + for ac_dir in \ + \ + /usr/include/g++ \ + /usr/include \ + /usr/unsupported/include \ + /opt/include \ + $extra_include \ + ; \ + do + if test -r "$ac_dir/$test_include"; then + kde_cv_libgpp_includes=$ac_dir + break + fi + done +]) + +AC_MSG_RESULT($kde_cv_libgpp_includes) +if test "$kde_cv_libgpp_includes" != "no"; then + all_includes="-I$kde_cv_libgpp_includes $all_includes $USER_INCLUDES" +fi +]) +]) + +AC_DEFUN([KDE_CHECK_LIBPTHREAD], +[ + dnl This code is here specifically to handle the + dnl various flavors of threading library on FreeBSD + dnl 4-, 5-, and 6-, and the (weird) rules around it. + dnl There may be an environment PTHREAD_LIBS that + dnl specifies what to use; otherwise, search for it. + dnl -pthread is special cased and unsets LIBPTHREAD + dnl below if found. + LIBPTHREAD="" + + if test -n "$PTHREAD_LIBS"; then + if test "x$PTHREAD_LIBS" = "x-pthread" ; then + LIBPTHREAD="PTHREAD" + else + PTHREAD_LIBS_save="$PTHREAD_LIBS" + PTHREAD_LIBS=`echo "$PTHREAD_LIBS_save" | sed -e 's,^-l,,g'` + AC_MSG_CHECKING([for pthread_create in $PTHREAD_LIBS]) + KDE_CHECK_LIB($PTHREAD_LIBS, pthread_create, [ + LIBPTHREAD="$PTHREAD_LIBS_save"]) + PTHREAD_LIBS="$PTHREAD_LIBS_save" + fi + fi + + dnl Is this test really needed, in the face of the Tru64 test below? + if test -z "$LIBPTHREAD"; then + AC_CHECK_LIB(pthread, pthread_create, [LIBPTHREAD="-lpthread"]) + fi + + dnl This is a special Tru64 check, see BR 76171 issue #18. + if test -z "$LIBPTHREAD" ; then + AC_MSG_CHECKING([for pthread_create in -lpthread]) + kde_safe_libs=$LIBS + LIBS="$LIBS -lpthread" + AC_TRY_LINK([#include ],[(void)pthread_create(0,0,0,0);],[ + AC_MSG_RESULT(yes) + LIBPTHREAD="-lpthread"],[ + AC_MSG_RESULT(no)]) + LIBS=$kde_safe_libs + fi + + dnl Un-special-case for FreeBSD. + if test "x$LIBPTHREAD" = "xPTHREAD" ; then + LIBPTHREAD="" + fi + + AC_SUBST(LIBPTHREAD) +]) + +AC_DEFUN([KDE_CHECK_PTHREAD_OPTION], +[ + USE_THREADS="" + if test -z "$LIBPTHREAD"; then + KDE_CHECK_COMPILER_FLAG(pthread, [USE_THREADS="-D_THREAD_SAFE -pthread"]) + fi + + AH_VERBATIM(__svr_define, [ +#if defined(__SVR4) && !defined(__svr4__) +#define __svr4__ 1 +#endif +]) + case $host_os in + solaris*) + KDE_CHECK_COMPILER_FLAG(mt, [USE_THREADS="-mt"]) + CPPFLAGS="$CPPFLAGS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_SOLARIS -DSVR4" + ;; + freebsd*) + CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE $PTHREAD_CFLAGS" + ;; + aix*) + CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" + LIBPTHREAD="$LIBPTHREAD -lc_r" + ;; + linux*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" + if test "$CXX" = "KCC"; then + CXXFLAGS="$CXXFLAGS --thread_safe" + NOOPT_CXXFLAGS="$NOOPT_CXXFLAGS --thread_safe" + fi + ;; + *) + ;; + esac + AC_SUBST(USE_THREADS) + AC_SUBST(LIBPTHREAD) +]) + +AC_DEFUN([KDE_CHECK_THREADING], +[ + AC_REQUIRE([KDE_CHECK_LIBPTHREAD]) + AC_REQUIRE([KDE_CHECK_PTHREAD_OPTION]) + dnl default is yes if libpthread is found and no if no libpthread is available + if test -z "$LIBPTHREAD"; then + if test -z "$USE_THREADS"; then + kde_check_threading_default=no + else + kde_check_threading_default=yes + fi + else + kde_check_threading_default=yes + fi + AC_ARG_ENABLE(threading,AC_HELP_STRING([--disable-threading],[disables threading even if libpthread found]), + kde_use_threading=$enableval, kde_use_threading=$kde_check_threading_default) + if test "x$kde_use_threading" = "xyes"; then + AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if you have a working libpthread (will enable threaded code)]) + fi +]) + +AC_DEFUN([KDE_TRY_LINK_PYTHON], +[ +if test "$kde_python_link_found" = no; then + +if test "$1" = normal; then + AC_MSG_CHECKING(if a Python application links) +else + AC_MSG_CHECKING(if Python depends on $2) +fi + +AC_CACHE_VAL(kde_cv_try_link_python_$1, +[ +kde_save_cflags="$CFLAGS" +CFLAGS="$CFLAGS $PYTHONINC" +kde_save_libs="$LIBS" +LIBS="$LIBS $LIBPYTHON $2 $LIBDL $LIBSOCKET" +kde_save_ldflags="$LDFLAGS" +LDFLAGS="$LDFLAGS $PYTHONLIB" + +AC_TRY_LINK( +[ +#include +],[ + PySys_SetArgv(1, 0); +], + [kde_cv_try_link_python_$1=yes], + [kde_cv_try_link_python_$1=no] +) +CFLAGS="$kde_save_cflags" +LIBS="$kde_save_libs" +LDFLAGS="$kde_save_ldflags" +]) + +if test "$kde_cv_try_link_python_$1" = "yes"; then + AC_MSG_RESULT(yes) + kde_python_link_found=yes + if test ! "$1" = normal; then + LIBPYTHON="$LIBPYTHON $2" + fi + $3 +else + AC_MSG_RESULT(no) + $4 +fi + +fi + +]) + +AC_DEFUN([KDE_CHECK_PYTHON_DIR], +[ +AC_MSG_CHECKING([for Python directory]) + +AC_CACHE_VAL(kde_cv_pythondir, +[ + if test -z "$PYTHONDIR"; then + kde_cv_pythondir=/usr/local + else + kde_cv_pythondir="$PYTHONDIR" + fi +]) + +AC_ARG_WITH(pythondir, +AC_HELP_STRING([--with-pythondir=pythondir],[use python installed in pythondir]), +[ + ac_python_dir=$withval +], ac_python_dir=$kde_cv_pythondir +) + +AC_MSG_RESULT($ac_python_dir) +]) + +AC_DEFUN([KDE_CHECK_PYTHON_INTERN], +[ +AC_REQUIRE([KDE_CHECK_LIBDL]) +AC_REQUIRE([KDE_CHECK_LIBPTHREAD]) +AC_REQUIRE([KDE_CHECK_PYTHON_DIR]) + +if test -z "$1"; then + version="1.5" +else + version="$1" +fi + +AC_MSG_CHECKING([for Python$version]) + +python_incdirs="$ac_python_dir/include /usr/include /usr/local/include/ $kde_extra_includes" +AC_FIND_FILE(Python.h, $python_incdirs, python_incdir) +if test ! -r $python_incdir/Python.h; then + AC_FIND_FILE(python$version/Python.h, $python_incdirs, python_incdir) + python_incdir=$python_incdir/python$version + if test ! -r $python_incdir/Python.h; then + python_incdir=no + fi +fi + +PYTHONINC=-I$python_incdir + +python_libdirs="$ac_python_dir/lib$kdelibsuff /usr/lib$kdelibsuff /usr/local /usr/lib$kdelibsuff $kde_extra_libs" +AC_FIND_FILE(libpython$version.so, $python_libdirs, python_libdir) +if test ! -r $python_libdir/libpython$version.so; then + AC_FIND_FILE(libpython$version.a, $python_libdirs, python_libdir) + if test ! -r $python_libdir/libpython$version.a; then + AC_FIND_FILE(python$version/config/libpython$version.a, $python_libdirs, python_libdir) + python_libdir=$python_libdir/python$version/config + if test ! -r $python_libdir/libpython$version.a; then + python_libdir=no + fi + fi +fi + +PYTHONLIB=-L$python_libdir +kde_orig_LIBPYTHON=$LIBPYTHON +if test -z "$LIBPYTHON"; then + LIBPYTHON=-lpython$version +fi + +AC_FIND_FILE(python$version/copy.py, $python_libdirs, python_moddir) +python_moddir=$python_moddir/python$version +if test ! -r $python_moddir/copy.py; then + python_moddir=no +fi + +PYTHONMODDIR=$python_moddir + +AC_MSG_RESULT(header $python_incdir library $python_libdir modules $python_moddir) + +if test x$python_incdir = xno || test x$python_libdir = xno || test x$python_moddir = xno; then + LIBPYTHON=$kde_orig_LIBPYTHON + test "x$PYTHONLIB" = "x-Lno" && PYTHONLIB="" + test "x$PYTHONINC" = "x-Ino" && PYTHONINC="" + $2 +else + dnl Note: this test is very weak + kde_python_link_found=no + KDE_TRY_LINK_PYTHON(normal) + KDE_TRY_LINK_PYTHON(m, -lm) + KDE_TRY_LINK_PYTHON(pthread, $LIBPTHREAD) + KDE_TRY_LINK_PYTHON(tcl, -ltcl) + KDE_TRY_LINK_PYTHON(db2, -ldb2) + KDE_TRY_LINK_PYTHON(m_and_thread, [$LIBPTHREAD -lm]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_util, [$LIBPTHREAD -lm -lutil]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db3, [$LIBPTHREAD -lm -ldb-3 -lutil]) + KDE_TRY_LINK_PYTHON(pthread_and_db3, [$LIBPTHREAD -ldb-3]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db, [$LIBPTHREAD -lm -ldb -ltermcap -lutil]) + KDE_TRY_LINK_PYTHON(pthread_and_dl, [$LIBPTHREAD $LIBDL -lutil -lreadline -lncurses -lm]) + KDE_TRY_LINK_PYTHON(pthread_and_panel_curses, [$LIBPTHREAD $LIBDL -lm -lpanel -lcurses]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db_special, [$LIBPTHREAD -lm -ldb -lutil], [], + [AC_MSG_WARN([it seems, Python depends on another library. + Please set LIBPYTHON to '-lpython$version -lotherlib' before calling configure to fix this + and contact the authors to let them know about this problem]) + ]) + + LIBPYTHON="$LIBPYTHON $LIBDL $LIBSOCKET" + AC_SUBST(PYTHONINC) + AC_SUBST(PYTHONLIB) + AC_SUBST(LIBPYTHON) + AC_SUBST(PYTHONMODDIR) + AC_DEFINE(HAVE_PYTHON, 1, [Define if you have the development files for python]) +fi + +]) + + +AC_DEFUN([KDE_CHECK_PYTHON], +[ + KDE_CHECK_PYTHON_INTERN("2.5", + [KDE_CHECK_PYTHON_INTERN("2.4", + [KDE_CHECK_PYTHON_INTERN("2.3", + [KDE_CHECK_PYTHON_INTERN("2.2", + [KDE_CHECK_PYTHON_INTERN("2.1", + [KDE_CHECK_PYTHON_INTERN("2.0", + [KDE_CHECK_PYTHON_INTERN($1, $2) ]) + ]) + ]) + ]) + ]) + ]) +]) + +AC_DEFUN([KDE_CHECK_STL], +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="`echo $CXXFLAGS | sed s/-fno-exceptions//`" + + AC_MSG_CHECKING([if C++ programs can be compiled]) + AC_CACHE_VAL(kde_cv_stl_works, + [ + AC_TRY_COMPILE([ +#include +using namespace std; +],[ + string astring="Hallo Welt."; + astring.erase(0, 6); // now astring is "Welt" + return 0; +], kde_cv_stl_works=yes, + kde_cv_stl_works=no) +]) + + AC_MSG_RESULT($kde_cv_stl_works) + + if test "$kde_cv_stl_works" = "yes"; then + # back compatible + AC_DEFINE_UNQUOTED(HAVE_SGI_STL, 1, [Define if you have a STL implementation by SGI]) + else + AC_MSG_ERROR([Your Installation isn't able to compile simple C++ programs. +Check config.log for details - if you're using a Linux distribution you might miss +a package named similar to libstdc++-dev.]) + fi + + CXXFLAGS="$ac_save_CXXFLAGS" + AC_LANG_RESTORE +]) + +AC_DEFUN([AC_FIND_QIMGIO], + [AC_REQUIRE([AC_FIND_JPEG]) +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_MSG_CHECKING([for qimgio]) +AC_CACHE_VAL(ac_cv_lib_qimgio, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +ac_save_LIBS="$LIBS" +ac_save_CXXFLAGS="$CXXFLAGS" +LIBS="$all_libraries -lqimgio -lpng -lz $LIBJPEG $LIBQT" +CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes" +AC_TRY_RUN(dnl +[ +#include +#include +int main() { + QString t = "hallo"; + t.fill('t'); + qInitImageIO(); +} +], + ac_cv_lib_qimgio=yes, + ac_cv_lib_qimgio=no, + ac_cv_lib_qimgio=no) +LIBS="$ac_save_LIBS" +CXXFLAGS="$ac_save_CXXFLAGS" +AC_LANG_RESTORE +])dnl +if eval "test \"`echo $ac_cv_lib_qimgio`\" = yes"; then + LIBQIMGIO="-lqimgio -lpng -lz $LIBJPEG" + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_QIMGIO, 1, [Define if you have the Qt extension qimgio available]) + AC_SUBST(LIBQIMGIO) +else + AC_MSG_RESULT(not found) +fi +]) + +AC_DEFUN([AM_DISABLE_LIBRARIES], +[ + AC_PROVIDE([AM_ENABLE_STATIC]) + AC_PROVIDE([AM_ENABLE_SHARED]) + enable_static=no + enable_shared=yes +]) + + +AC_DEFUN([AC_CHECK_UTMP_FILE], +[ + AC_MSG_CHECKING([for utmp file]) + + AC_CACHE_VAL(kde_cv_utmp_file, + [ + kde_cv_utmp_file=no + + for ac_file in \ + \ + /var/run/utmp \ + /var/adm/utmp \ + /etc/utmp \ + ; \ + do + if test -r "$ac_file"; then + kde_cv_utmp_file=$ac_file + break + fi + done + ]) + + if test "$kde_cv_utmp_file" != "no"; then + AC_DEFINE_UNQUOTED(UTMP, "$kde_cv_utmp_file", [Define the file for utmp entries]) + $1 + AC_MSG_RESULT($kde_cv_utmp_file) + else + $2 + AC_MSG_RESULT([non found]) + fi +]) + + +AC_DEFUN([KDE_CREATE_SUBDIRSLIST], +[ + +DO_NOT_COMPILE="$DO_NOT_COMPILE CVS debian bsd-port admin" +TOPSUBDIRS="" + +if test ! -s $srcdir/subdirs; then + dnl Note: Makefile.common creates subdirs, so this is just a fallback + files=`cd $srcdir && ls -1` + dirs=`for i in $files; do if test -d $i; then echo $i; fi; done` + for i in $dirs; do + echo $i >> $srcdir/subdirs + done +fi + +ac_topsubdirs= +if test -s $srcdir/inst-apps; then + ac_topsubdirs="`cat $srcdir/inst-apps`" +elif test -s $srcdir/subdirs; then + ac_topsubdirs="`cat $srcdir/subdirs`" +fi + +for i in $ac_topsubdirs; do + AC_MSG_CHECKING([if $i should be compiled]) + if test -d $srcdir/$i; then + install_it="yes" + for j in $DO_NOT_COMPILE; do + if test $i = $j; then + install_it="no" + fi + done + else + install_it="no" + fi + AC_MSG_RESULT($install_it) + vari=`echo $i | sed -e 's,[[-+.@]],_,g'` + if test $install_it = "yes"; then + TOPSUBDIRS="$TOPSUBDIRS $i" + eval "$vari""_SUBDIR_included=yes" + else + eval "$vari""_SUBDIR_included=no" + fi +done + +AC_SUBST(TOPSUBDIRS) +]) + +AC_DEFUN([KDE_CHECK_NAMESPACES], +[ +AC_MSG_CHECKING(whether C++ compiler supports namespaces) +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +AC_TRY_COMPILE([ +], +[ +namespace Foo { + extern int i; + namespace Bar { + extern int i; + } +} + +int Foo::i = 0; +int Foo::Bar::i = 1; +],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_NAMESPACES) +], [ +AC_MSG_RESULT(no) +]) +AC_LANG_RESTORE +]) + +dnl ------------------------------------------------------------------------ +dnl Check for S_ISSOCK macro. Doesn't exist on Unix SCO. faure@kde.org +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_CHECK_S_ISSOCK], +[ +AC_MSG_CHECKING(for S_ISSOCK) +AC_CACHE_VAL(ac_cv_have_s_issock, +[ +AC_TRY_LINK( +[ +#include +], +[ +struct stat buff; +int b = S_ISSOCK( buff.st_mode ); +], +ac_cv_have_s_issock=yes, +ac_cv_have_s_issock=no) +]) +AC_MSG_RESULT($ac_cv_have_s_issock) +if test "$ac_cv_have_s_issock" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_S_ISSOCK, 1, [Define if sys/stat.h declares S_ISSOCK.]) +fi + +AH_VERBATIM(_ISSOCK, +[ +#ifndef HAVE_S_ISSOCK +#define HAVE_S_ISSOCK +#define S_ISSOCK(mode) (1==0) +#endif +]) + +]) + +dnl ------------------------------------------------------------------------ +dnl Check for MAXPATHLEN macro, defines KDEMAXPATHLEN. faure@kde.org +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_CHECK_KDEMAXPATHLEN], +[ +AC_MSG_CHECKING(for MAXPATHLEN) +AC_CACHE_VAL(ac_cv_maxpathlen, +[ +cat > conftest.$ac_ext < +#endif +#include +#include +#ifndef MAXPATHLEN +#define MAXPATHLEN 1024 +#endif + +KDE_HELLO MAXPATHLEN + +EOF + +ac_try="$ac_cpp conftest.$ac_ext 2>/dev/null | grep '^KDE_HELLO' >conftest.out" + +if AC_TRY_EVAL(ac_try) && test -s conftest.out; then + ac_cv_maxpathlen=`sed 's#KDE_HELLO ##' conftest.out` +else + ac_cv_maxpathlen=1024 +fi + +rm conftest.* + +]) +AC_MSG_RESULT($ac_cv_maxpathlen) +AC_DEFINE_UNQUOTED(KDEMAXPATHLEN,$ac_cv_maxpathlen, [Define a safe value for MAXPATHLEN] ) +]) + +AC_DEFUN([KDE_CHECK_HEADER], +[ + kde_safe_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $all_includes" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_CHECK_HEADER([$1], [$2], [$3], [$4]) + AC_LANG_RESTORE + CPPFLAGS=$kde_safe_cppflags +]) + +AC_DEFUN([KDE_CHECK_HEADERS], +[ + AH_CHECK_HEADERS([$1]) + AC_LANG_SAVE + kde_safe_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $all_includes" + AC_LANG_CPLUSPLUS + AC_CHECK_HEADERS([$1], [$2], [$3], [$4]) + CPPFLAGS=$kde_safe_cppflags + AC_LANG_RESTORE +]) + +AC_DEFUN([KDE_FAST_CONFIGURE], +[ + dnl makes configure fast (needs perl) + AC_ARG_ENABLE(fast-perl, AC_HELP_STRING([--disable-fast-perl],[disable fast Makefile generation (needs perl)]), + with_fast_perl=$enableval, with_fast_perl=yes) +]) + +AC_DEFUN([KDE_CONF_FILES], +[ + val= + if test -f $srcdir/configure.files ; then + val=`sed -e 's%^%\$(top_srcdir)/%' $srcdir/configure.files` + fi + CONF_FILES= + if test -n "$val" ; then + for i in $val ; do + CONF_FILES="$CONF_FILES $i" + done + fi + AC_SUBST(CONF_FILES) +])dnl + +dnl This sets the prefix, for arts and kdelibs +dnl Do NOT use in any other module. +dnl It only looks at --prefix, KDEDIR and falls back to /usr/local/kde +AC_DEFUN([KDE_SET_PREFIX_CORE], +[ + unset CDPATH + dnl make $KDEDIR the default for the installation + AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde}) + + if test "x$prefix" = "xNONE"; then + prefix=$ac_default_prefix + ac_configure_args="$ac_configure_args --prefix=$prefix" + fi + # And delete superfluous '/' to make compares easier + prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + + kde_libs_prefix='$(prefix)' + kde_libs_htmldir='$(kde_htmldir)' + AC_SUBST(kde_libs_prefix) + AC_SUBST(kde_libs_htmldir) + KDE_FAST_CONFIGURE + KDE_CONF_FILES +]) + + +AC_DEFUN([KDE_SET_PREFIX], +[ + unset CDPATH + dnl We can't give real code to that macro, only a value. + dnl It only matters for --help, since we set the prefix in this function anyway. + AC_PREFIX_DEFAULT(${KDEDIR:-the kde prefix}) + + KDE_SET_DEFAULT_BINDIRS + if test "x$prefix" = "xNONE"; then + dnl no prefix given: look for kde-config in the PATH and deduce the prefix from it + KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kde-config)], [], prepend) + else + dnl prefix given: look for kde-config, preferrably in prefix, otherwise in PATH + kde_save_PATH="$PATH" + PATH="$exec_prefix/bin:$prefix/bin:$PATH" + KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kde-config)], [], prepend) + PATH="$kde_save_PATH" + fi + + kde_libs_prefix=`$KDECONFIG --prefix` + if test -z "$kde_libs_prefix" || test ! -x "$kde_libs_prefix"; then + AC_MSG_ERROR([$KDECONFIG --prefix outputed the non existant prefix '$kde_libs_prefix' for kdelibs. + This means it has been moved since you installed it. + This won't work. Please recompile kdelibs for the new prefix. + ]) + fi + kde_libs_htmldir=`$KDECONFIG --install html --expandvars` + + AC_MSG_CHECKING([where to install]) + if test "x$prefix" = "xNONE"; then + prefix=$kde_libs_prefix + AC_MSG_RESULT([$prefix (as returned by kde-config)]) + else + dnl --prefix was given. Compare prefixes and warn (in configure.in.bot.end) if different + given_prefix=$prefix + AC_MSG_RESULT([$prefix (as requested)]) + fi + + # And delete superfluous '/' to make compares easier + prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + given_prefix=`echo "$given_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + + AC_SUBST(KDECONFIG) + AC_SUBST(kde_libs_prefix) + AC_SUBST(kde_libs_htmldir) + + KDE_FAST_CONFIGURE + KDE_CONF_FILES +]) + +pushdef([AC_PROG_INSTALL], +[ + dnl our own version, testing for a -p flag + popdef([AC_PROG_INSTALL]) + dnl as AC_PROG_INSTALL works as it works we first have + dnl to save if the user didn't specify INSTALL, as the + dnl autoconf one overwrites INSTALL and we have no chance to find + dnl out afterwards + test -n "$INSTALL" && kde_save_INSTALL_given=$INSTALL + test -n "$INSTALL_PROGRAM" && kde_save_INSTALL_PROGRAM_given=$INSTALL_PROGRAM + test -n "$INSTALL_SCRIPT" && kde_save_INSTALL_SCRIPT_given=$INSTALL_SCRIPT + AC_PROG_INSTALL + + if test -z "$kde_save_INSTALL_given" ; then + # OK, user hasn't given any INSTALL, autoconf found one for us + # now we test, if it supports the -p flag + AC_MSG_CHECKING(for -p flag to install) + rm -f confinst.$$.* > /dev/null 2>&1 + echo "Testtest" > confinst.$$.orig + ac_res=no + if ${INSTALL} -p confinst.$$.orig confinst.$$.new > /dev/null 2>&1 ; then + if test -f confinst.$$.new ; then + # OK, -p seems to do no harm to install + INSTALL="${INSTALL} -p" + ac_res=yes + fi + fi + rm -f confinst.$$.* + AC_MSG_RESULT($ac_res) + fi + dnl the following tries to resolve some signs and wonders coming up + dnl with different autoconf/automake versions + dnl e.g.: + dnl *automake 1.4 install-strip sets A_M_INSTALL_PROGRAM_FLAGS to -s + dnl and has INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(A_M_INSTALL_PROGRAM_FLAGS) + dnl it header-vars.am, so there the actual INSTALL_PROGRAM gets the -s + dnl *automake 1.4a (and above) use INSTALL_STRIP_FLAG and only has + dnl INSTALL_PROGRAM = @INSTALL_PROGRAM@ there, but changes the + dnl install-@DIR@PROGRAMS targets to explicitly use that flag + dnl *autoconf 2.13 is dumb, and thinks it can use INSTALL_PROGRAM as + dnl INSTALL_SCRIPT, which breaks with automake <= 1.4 + dnl *autoconf >2.13 (since 10.Apr 1999) has not that failure + dnl *sometimes KDE does not use the install-@DIR@PROGRAM targets from + dnl automake (due to broken Makefile.am or whatever) to install programs, + dnl and so does not see the -s flag in automake > 1.4 + dnl to clean up that mess we: + dnl +set INSTALL_PROGRAM to use INSTALL_STRIP_FLAG + dnl which cleans KDE's program with automake > 1.4; + dnl +set INSTALL_SCRIPT to only use INSTALL, to clean up autoconf's problems + dnl with automake<=1.4 + dnl note that dues to this sometimes two '-s' flags are used (if KDE + dnl properly uses install-@DIR@PROGRAMS, but I don't care + dnl + dnl And to all this comes, that I even can't write in comments variable + dnl names used by automake, because it is so stupid to think I wanted to + dnl _use_ them, therefor I have written A_M_... instead of AM_ + dnl hmm, I wanted to say something ... ahh yes: Arghhh. + + if test -z "$kde_save_INSTALL_PROGRAM_given" ; then + INSTALL_PROGRAM='${INSTALL} $(INSTALL_STRIP_FLAG)' + fi + if test -z "$kde_save_INSTALL_SCRIPT_given" ; then + INSTALL_SCRIPT='${INSTALL}' + fi +])dnl + +AC_DEFUN([KDE_LANG_CPLUSPLUS], +[AC_LANG_CPLUSPLUS +ac_link='rm -rf SunWS_cache; ${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&AC_FD_CC' +pushdef([AC_LANG_CPLUSPLUS], [popdef([AC_LANG_CPLUSPLUS]) KDE_LANG_CPLUSPLUS]) +]) + +pushdef([AC_LANG_CPLUSPLUS], +[popdef([AC_LANG_CPLUSPLUS]) +KDE_LANG_CPLUSPLUS +]) + +AC_DEFUN([KDE_CHECK_LONG_LONG], +[ +AC_MSG_CHECKING(for long long) +AC_CACHE_VAL(kde_cv_c_long_long, +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_LINK([], [ + long long foo = 0; + foo = foo+1; + ], + kde_cv_c_long_long=yes, kde_cv_c_long_long=no) + AC_LANG_RESTORE +]) +AC_MSG_RESULT($kde_cv_c_long_long) +if test "$kde_cv_c_long_long" = yes; then + AC_DEFINE(HAVE_LONG_LONG, 1, [Define if you have long long as datatype]) +fi +]) + +AC_DEFUN([KDE_CHECK_LIB], +[ + kde_save_LDFLAGS="$LDFLAGS" + dnl AC_CHECK_LIB modifies LIBS, so save it here + kde_save_LIBS="$LIBS" + LDFLAGS="$LDFLAGS $all_libraries" + case $host_os in + aix*) LDFLAGS="-brtl $LDFLAGS" + test "$GCC" = yes && LDFLAGS="-Wl,$LDFLAGS" + ;; + esac + AC_CHECK_LIB($1, $2, $3, $4, $5) + LDFLAGS="$kde_save_LDFLAGS" + LIBS="$kde_save_LIBS" +]) + +AC_DEFUN([KDE_JAVA_PREFIX], +[ + dir=`dirname "$1"` + base=`basename "$1"` + list=`ls -1 $dir 2> /dev/null` + for entry in $list; do + if test -d $dir/$entry/bin; then + case $entry in + $base) + javadirs="$javadirs $dir/$entry/bin" + ;; + esac + elif test -d $dir/$entry/jre/bin; then + case $entry in + $base) + javadirs="$javadirs $dir/$entry/jre/bin" + ;; + esac + fi + done +]) + +dnl KDE_CHEC_JAVA_DIR(onlyjre) +AC_DEFUN([KDE_CHECK_JAVA_DIR], +[ + +AC_ARG_WITH(java, +AC_HELP_STRING([--with-java=javadir],[use java installed in javadir, --without-java disables]), +[ ac_java_dir=$withval +], ac_java_dir="" +) + +AC_MSG_CHECKING([for Java]) + +dnl at this point ac_java_dir is either a dir, 'no' to disable, or '' to say look in $PATH +if test "x$ac_java_dir" = "xno"; then + kde_java_bindir=no + kde_java_includedir=no + kde_java_libjvmdir=no + kde_java_libgcjdir=no + kde_java_libhpidir=no +else + if test "x$ac_java_dir" = "x"; then + + + dnl No option set -> collect list of candidate paths + if test -n "$JAVA_HOME"; then + KDE_JAVA_PREFIX($JAVA_HOME) + fi + KDE_JAVA_PREFIX(/usr/j2se) + KDE_JAVA_PREFIX(/usr/lib/j2se) + KDE_JAVA_PREFIX(/usr/j*dk*) + KDE_JAVA_PREFIX(/usr/lib/j*dk*) + KDE_JAVA_PREFIX(/opt/j*sdk*) + KDE_JAVA_PREFIX(/usr/lib/java*) + KDE_JAVA_PREFIX(/usr/java*) + KDE_JAVA_PREFIX(/usr/java/j*dk*) + KDE_JAVA_PREFIX(/usr/java/j*re*) + KDE_JAVA_PREFIX(/usr/lib/SunJava2*) + KDE_JAVA_PREFIX(/usr/lib/SunJava*) + KDE_JAVA_PREFIX(/usr/lib/IBMJava2*) + KDE_JAVA_PREFIX(/usr/lib/IBMJava*) + KDE_JAVA_PREFIX(/opt/java*) + + kde_cv_path="NONE" + kde_save_IFS=$IFS + IFS=':' + for dir in $PATH; do + if test -d "$dir"; then + javadirs="$javadirs $dir" + fi + done + IFS=$kde_save_IFS + jredirs= + + dnl Now javadirs contains a list of paths that exist, all ending with bin/ + for dir in $javadirs; do + dnl Check for the java executable + if test -x "$dir/java"; then + dnl And also check for a libjvm.so somewhere under there + dnl Since we have to go to the parent dir, /usr/bin is excluded, /usr is too big. + if test "$dir" != "/usr/bin"; then + libjvmdir=`find $dir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1` + if test ! -f $libjvmdir/libjvm.so; then continue; fi + jredirs="$jredirs $dir" + fi + fi + done + + dnl Now jredirs contains a reduced list, of paths where both java and ../**/libjvm.so was found + JAVAC= + JAVA= + kde_java_bindir=no + for dir in $jredirs; do + JAVA="$dir/java" + kde_java_bindir=$dir + if test -x "$dir/javac"; then + JAVAC="$dir/javac" + break + fi + done + + if test -n "$JAVAC"; then + dnl this substitution might not work - well, we test for jni.h below + kde_java_includedir=`echo $JAVAC | sed -e 's,bin/javac$,include/,'` + else + kde_java_includedir=no + fi + else + dnl config option set + kde_java_bindir=$ac_java_dir/bin + if test -x $ac_java_dir/bin/java && test ! -x $ac_java_dir/bin/javac; then + kde_java_includedir=no + else + kde_java_includedir=$ac_java_dir/include + fi + fi +fi + +dnl At this point kde_java_bindir and kde_java_includedir are either set or "no" +if test "x$kde_java_bindir" != "xno"; then + + dnl Look for libjvm.so + kde_java_libjvmdir=`find $kde_java_bindir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1` + dnl Look for libgcj.so + kde_java_libgcjdir=`find $kde_java_bindir/.. -name libgcj.so | sed 's,libgcj.so,,'|head -n 1` + dnl Look for libhpi.so and avoid green threads + kde_java_libhpidir=`find $kde_java_bindir/.. -name libhpi.so | grep -v green | sed 's,libhpi.so,,' | head -n 1` + + dnl Now check everything's fine under there + dnl the include dir is our flag for having the JDK + if test -d "$kde_java_includedir"; then + if test ! -x "$kde_java_bindir/javac"; then + AC_MSG_ERROR([javac not found under $kde_java_bindir - it seems you passed a wrong --with-java.]) + fi + if test ! -x "$kde_java_bindir/javah"; then + AC_MSG_ERROR([javah not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + if test ! -x "$kde_java_bindir/jar"; then + AC_MSG_ERROR([jar not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + if test ! -r "$kde_java_includedir/jni.h"; then + AC_MSG_ERROR([jni.h not found under $kde_java_includedir. Use --with-java or --without-java.]) + fi + + jni_includes="-I$kde_java_includedir" + dnl Strange thing, jni.h requires jni_md.h which is under genunix here.. + dnl and under linux here.. + + dnl not needed for gcj + + if test "x$kde_java_libgcjdir" = "x"; then + test -d "$kde_java_includedir/linux" && jni_includes="$jni_includes -I$kde_java_includedir/linux" + test -d "$kde_java_includedir/solaris" && jni_includes="$jni_includes -I$kde_java_includedir/solaris" + test -d "$kde_java_includedir/genunix" && jni_includes="$jni_includes -I$kde_java_includedir/genunix" + fi + + else + JAVAC= + jni_includes= + fi + + if test "x$kde_java_libgcjdir" = "x"; then + if test ! -r "$kde_java_libjvmdir/libjvm.so"; then + AC_MSG_ERROR([libjvm.so not found under $kde_java_libjvmdir. Use --without-java.]) + fi + else + if test ! -r "$kde_java_libgcjdir/libgcj.so"; then + AC_MSG_ERROR([libgcj.so not found under $kde_java_libgcjdir. Use --without-java.]) + fi + fi + + if test ! -x "$kde_java_bindir/java"; then + AC_MSG_ERROR([java not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + + dnl not needed for gcj compile + + if test "x$kde_java_libgcjdir" = "x"; then + if test ! -r "$kde_java_libhpidir/libhpi.so"; then + AC_MSG_ERROR([libhpi.so not found under $kde_java_libhpidir. Use --without-java.]) + fi + fi + + if test -n "$jni_includes"; then + dnl Check for JNI version + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_cxxflags_safe="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS $all_includes $jni_includes" + + AC_TRY_COMPILE([ + #include + ], + [ + #ifndef JNI_VERSION_1_2 + Syntax Error + #endif + ],[ kde_jni_works=yes ], + [ kde_jni_works=no ]) + + if test $kde_jni_works = no; then + AC_MSG_ERROR([Incorrect version of $kde_java_includedir/jni.h. + You need to have Java Development Kit (JDK) version 1.2. + + Use --with-java to specify another location. + Use --without-java to configure without java support. + Or download a newer JDK and try again. + See e.g. http://java.sun.com/products/jdk/1.2 ]) + fi + + CXXFLAGS="$ac_cxxflags_safe" + AC_LANG_RESTORE + + dnl All tests ok, inform and subst the variables + + JAVAC=$kde_java_bindir/javac + JAVAH=$kde_java_bindir/javah + JAR=$kde_java_bindir/jar + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + if test "x$kde_java_libgcjdir" = "x"; then + JVMLIBS="-L$kde_java_libjvmdir -ljvm -L$kde_java_libhpidir -lhpi" + else + JVMLIBS="-L$kde_java_libgcjdir -lgcj" + fi + AC_MSG_RESULT([java JDK in $kde_java_bindir]) + + else + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + AC_MSG_RESULT([java JRE in $kde_java_bindir]) + fi +elif test -d "/Library/Java/Home"; then + kde_java_bindir="/Library/Java/Home/bin" + jni_includes="-I/Library/Java/Home/include" + + JAVAC=$kde_java_bindir/javac + JAVAH=$kde_java_bindir/javah + JAR=$kde_java_bindir/jar + JVMLIBS="-Wl,-framework,JavaVM" + + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + AC_MSG_RESULT([Apple Java Framework]) +else + AC_MSG_RESULT([none found]) +fi + +AC_SUBST(JAVAC) +AC_SUBST(JAVAH) +AC_SUBST(JAR) +AC_SUBST(JVMLIBS) +AC_SUBST(jni_includes) + +# for backward compat +kde_cv_java_includedir=$kde_java_includedir +kde_cv_java_bindir=$kde_java_bindir +]) + +dnl this is a redefinition of autoconf 2.5x's AC_FOREACH. +dnl When the argument list becomes big, as in KDE for AC_OUTPUT in +dnl big packages, m4_foreach is dog-slow. So use our own version of +dnl it. (matz@kde.org) +m4_define([mm_foreach], +[m4_pushdef([$1])_mm_foreach($@)m4_popdef([$1])]) +m4_define([mm_car], [[$1]]) +m4_define([mm_car2], [[$@]]) +m4_define([_mm_foreach], +[m4_if(m4_quote($2), [], [], + [m4_define([$1], mm_car($2))$3[]_mm_foreach([$1], + mm_car2(m4_shift($2)), + [$3])])]) +m4_define([AC_FOREACH], +[mm_foreach([$1], m4_split(m4_normalize([$2])), [$3])]) + +AC_DEFUN([KDE_NEED_FLEX], +[ +kde_libs_safe=$LIBS +LIBS="$LIBS $USER_LDFLAGS" +AM_PROG_LEX +LIBS=$kde_libs_safe +if test -z "$LEXLIB"; then + AC_MSG_ERROR([You need to have flex installed.]) +fi +AC_SUBST(LEXLIB) +]) + +AC_DEFUN([AC_PATH_QTOPIA], +[ + dnl TODO: use AC_CACHE_VAL + + if test -z "$1"; then + qtopia_minver_maj=1 + qtopia_minver_min=5 + qtopia_minver_pat=0 + else + qtopia_minver_maj=`echo "$1" | sed -e "s/^\(.*\)\..*\..*$/\1/"` + qtopia_minver_min=`echo "$1" | sed -e "s/^.*\.\(.*\)\..*$/\1/"` + qtopia_minver_pat=`echo "$1" | sed -e "s/^.*\..*\.\(.*\)$/\1/"` + fi + + qtopia_minver="$qtopia_minver_maj$qtopia_minver_min$qtopia_minver_pat" + qtopia_minverstr="$qtopia_minver_maj.$qtopia_minver_min.$qtopia_minver_pat" + + AC_REQUIRE([AC_PATH_QT]) + + AC_MSG_CHECKING([for Qtopia]) + + LIB_QTOPIA="-lqpe" + AC_SUBST(LIB_QTOPIA) + + kde_qtopia_dirs="$QPEDIR /opt/Qtopia" + + ac_qtopia_incdir=NO + + AC_ARG_WITH(qtopia-dir, + AC_HELP_STRING([--with-qtopia-dir=DIR],[where the root of Qtopia is installed]), + [ ac_qtopia_incdir="$withval"/include] ) + + qtopia_incdirs="" + for dir in $kde_qtopia_dirs; do + qtopia_incdirs="$qtopia_incdirs $dir/include" + done + + if test ! "$ac_qtopia_incdir" = "NO"; then + qtopia_incdirs="$ac_qtopia_incdir $qtopia_incdirs" + fi + + qtopia_incdir="" + AC_FIND_FILE(qpe/qpeapplication.h, $qtopia_incdirs, qtopia_incdir) + ac_qtopia_incdir="$qtopia_incdir" + + if test -z "$qtopia_incdir"; then + AC_MSG_ERROR([Cannot find Qtopia headers. Please check your installation.]) + fi + + qtopia_ver_maj=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION "\(.*\)\..*\..*".*,\1,p'`; + qtopia_ver_min=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\.\(.*\)\..*".*,\1,p'`; + qtopia_ver_pat=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\..*\.\(.*\)".*,\1,p'`; + + qtopia_ver="$qtopia_ver_maj$qtopia_ver_min$qtopia_ver_pat" + qtopia_verstr="$qtopia_ver_maj.$qtopia_ver_min.$qtopia_ver_pat" + if test "$qtopia_ver" -lt "$qtopia_minver"; then + AC_MSG_ERROR([found Qtopia version $qtopia_verstr but version $qtopia_minverstr +is required.]) + fi + + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + ac_cxxflags_safe="$CXXFLAGS" + ac_ldflags_safe="$LDFLAGS" + ac_libs_safe="$LIBS" + + CXXFLAGS="$CXXFLAGS -I$qtopia_incdir $all_includes" + LDFLAGS="$LDFLAGS $QT_LDFLAGS $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" + LIBS="$LIBS $LIB_QTOPIA $LIBQT" + + cat > conftest.$ac_ext < +#include + +int main( int argc, char **argv ) +{ + QPEApplication app( argc, argv ); + return 0; +} +EOF + + if AC_TRY_EVAL(ac_link) && test -s conftest; then + rm -f conftest* + else + rm -f conftest* + AC_MSG_ERROR([Cannot link small Qtopia Application. For more details look at +the end of config.log]) + fi + + CXXFLAGS="$ac_cxxflags_safe" + LDFLAGS="$ac_ldflags_safe" + LIBS="$ac_libs_safe" + + AC_LANG_RESTORE + + QTOPIA_INCLUDES="-I$qtopia_incdir" + AC_SUBST(QTOPIA_INCLUDES) + + AC_MSG_RESULT([found version $qtopia_verstr with headers at $qtopia_incdir]) +]) + + +AC_DEFUN([KDE_INIT_DOXYGEN], +[ +AC_MSG_CHECKING([for Qt docs]) +kde_qtdir= +if test "${with_qt_dir+set}" = set; then + kde_qtdir="$with_qt_dir" +fi + +AC_FIND_FILE(qsql.html, [ $kde_qtdir/doc/html $QTDIR/doc/html /usr/share/doc/packages/qt3/html /usr/lib/qt/doc /usr/lib/qt3/doc /usr/lib/qt3/doc/html /usr/doc/qt3/html /usr/doc/qt3 /usr/share/doc/qt3-doc /usr/share/qt3/doc/html /usr/X11R6/share/doc/qt/html ], QTDOCDIR) +AC_MSG_RESULT($QTDOCDIR) + +AC_SUBST(QTDOCDIR) + +KDE_FIND_PATH(dot, DOT, [], []) +if test -n "$DOT"; then + KDE_HAVE_DOT="YES" +else + KDE_HAVE_DOT="NO" +fi +AC_SUBST(KDE_HAVE_DOT) +KDE_FIND_PATH(doxygen, DOXYGEN, [], []) +AC_SUBST(DOXYGEN) + +DOXYGEN_PROJECT_NAME="$1" +DOXYGEN_PROJECT_NUMBER="$2" +AC_SUBST(DOXYGEN_PROJECT_NAME) +AC_SUBST(DOXYGEN_PROJECT_NUMBER) + +KDE_HAS_DOXYGEN=no +if test -n "$DOXYGEN" && test -x "$DOXYGEN" && test -f $QTDOCDIR/qsql.html; then + KDE_HAS_DOXYGEN=yes +fi +AC_SUBST(KDE_HAS_DOXYGEN) + +]) + + +AC_DEFUN([AC_FIND_BZIP2], +[ +AC_MSG_CHECKING([for bzDecompress in libbz2]) +AC_CACHE_VAL(ac_cv_lib_bzip2, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +kde_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -lbz2 $LIBSOCKET" +kde_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK(dnl +[ +#define BZ_NO_STDIO +#include +], + [ bz_stream s; (void) bzDecompress(&s); ], + eval "ac_cv_lib_bzip2='-lbz2'", + eval "ac_cv_lib_bzip2=no") +LIBS="$kde_save_LIBS" +CXXFLAGS="$kde_save_CXXFLAGS" +AC_LANG_RESTORE +])dnl +AC_MSG_RESULT($ac_cv_lib_bzip2) + +if test ! "$ac_cv_lib_bzip2" = no; then + BZIP2DIR=bzip2 + + LIBBZ2="$ac_cv_lib_bzip2" + AC_SUBST(LIBBZ2) + +else + + cxx_shared_flag= + ld_shared_flag= + KDE_CHECK_COMPILER_FLAG(shared, [ + ld_shared_flag="-shared" + ]) + KDE_CHECK_COMPILER_FLAG(fPIC, [ + cxx_shared_flag="-fPIC" + ]) + + AC_MSG_CHECKING([for BZ2_bzDecompress in (shared) libbz2]) + AC_CACHE_VAL(ac_cv_lib_bzip2_prefix, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + kde_save_LIBS="$LIBS" + LIBS="$all_libraries $USER_LDFLAGS $ld_shared_flag -lbz2 $LIBSOCKET" + kde_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CFLAGS $cxx_shared_flag $all_includes $USER_INCLUDES" + + AC_TRY_LINK(dnl + [ + #define BZ_NO_STDIO + #include + ], + [ bz_stream s; (void) BZ2_bzDecompress(&s); ], + eval "ac_cv_lib_bzip2_prefix='-lbz2'", + eval "ac_cv_lib_bzip2_prefix=no") + LIBS="$kde_save_LIBS" + CXXFLAGS="$kde_save_CXXFLAGS" + AC_LANG_RESTORE + ])dnl + + AC_MSG_RESULT($ac_cv_lib_bzip2_prefix) + + if test ! "$ac_cv_lib_bzip2_prefix" = no; then + BZIP2DIR=bzip2 + + LIBBZ2="$ac_cv_lib_bzip2_prefix" + AC_SUBST(LIBBZ2) + + AC_DEFINE(NEED_BZ2_PREFIX, 1, [Define if the libbz2 functions need the BZ2_ prefix]) + dnl else, we just ignore this + fi + +fi +AM_CONDITIONAL(include_BZIP2, test -n "$BZIP2DIR") +]) + +dnl ------------------------------------------------------------------------ +dnl Try to find the SSL headers and libraries. +dnl $(SSL_LDFLAGS) will be -Lsslliblocation (if needed) +dnl and $(SSL_INCLUDES) will be -Isslhdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([KDE_CHECK_SSL], +[ +LIBSSL="-lssl -lcrypto" +AC_REQUIRE([KDE_CHECK_LIB64]) + +ac_ssl_includes=NO ac_ssl_libraries=NO +ssl_libraries="" +ssl_includes="" +AC_ARG_WITH(ssl-dir, + AC_HELP_STRING([--with-ssl-dir=DIR],[where the root of OpenSSL is installed]), + [ ac_ssl_includes="$withval"/include + ac_ssl_libraries="$withval"/lib$kdelibsuff + ]) + +want_ssl=yes +AC_ARG_WITH(ssl, + AC_HELP_STRING([--without-ssl],[disable SSL checks]), + [want_ssl=$withval]) + +if test $want_ssl = yes; then + +AC_MSG_CHECKING(for OpenSSL) + +AC_CACHE_VAL(ac_cv_have_ssl, +[#try to guess OpenSSL locations + + ssl_incdirs="/usr/include /usr/local/include /usr/ssl/include /usr/local/ssl/include $prefix/include $kde_extra_includes" + ssl_incdirs="$ac_ssl_includes $ssl_incdirs" + AC_FIND_FILE(openssl/ssl.h, $ssl_incdirs, ssl_incdir) + ac_ssl_includes="$ssl_incdir" + + ssl_libdirs="/usr/lib$kdelibsuff /usr/local/lib$kdelibsuff /usr/ssl/lib$kdelibsuff /usr/local/ssl/lib$kdelibsuff $libdir $prefix/lib$kdelibsuff $exec_prefix/lib$kdelibsuff $kde_extra_libs" + if test ! "$ac_ssl_libraries" = "NO"; then + ssl_libdirs="$ac_ssl_libraries $ssl_libdirs" + fi + + test=NONE + ssl_libdir=NONE + for dir in $ssl_libdirs; do + try="ls -1 $dir/libssl*" + if test=`eval $try 2> /dev/null`; then ssl_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi + done + + ac_ssl_libraries="$ssl_libdir" + + ac_ldflags_safe="$LDFLAGS" + ac_libs_safe="$LIBS" + + LDFLAGS="$LDFLAGS -L$ssl_libdir $all_libraries" + LIBS="$LIBS $LIBSSL -lRSAglue -lrsaref" + + AC_TRY_LINK(,void RSAPrivateEncrypt(void);RSAPrivateEncrypt();, + ac_ssl_rsaref="yes" + , + ac_ssl_rsaref="no" + ) + + LDFLAGS="$ac_ldflags_safe" + LIBS="$ac_libs_safe" + + if test "$ac_ssl_includes" = NO || test "$ac_ssl_libraries" = NO; then + have_ssl=no + else + have_ssl=yes; + fi + + ]) + + eval "$ac_cv_have_ssl" + + AC_MSG_RESULT([libraries $ac_ssl_libraries, headers $ac_ssl_includes]) + + AC_MSG_CHECKING([whether OpenSSL uses rsaref]) + AC_MSG_RESULT($ac_ssl_rsaref) + + AC_MSG_CHECKING([for easter eggs]) + AC_MSG_RESULT([none found]) + +else + have_ssl=no +fi + +if test "$have_ssl" = yes; then + AC_MSG_CHECKING(for OpenSSL version) + dnl Check for SSL version + AC_CACHE_VAL(ac_cv_ssl_version, + [ + + cat >conftest.$ac_ext < +#include + int main() { + +#ifndef OPENSSL_VERSION_NUMBER + printf("ssl_version=\\"error\\"\n"); +#else + if (OPENSSL_VERSION_NUMBER < 0x00906000) + printf("ssl_version=\\"old\\"\n"); + else + printf("ssl_version=\\"ok\\"\n"); +#endif + return (0); + } +EOF + + ac_save_CPPFLAGS=$CPPFLAGS + if test "$ac_ssl_includes" != "/usr/include"; then + CPPFLAGS="$CPPFLAGS -I$ac_ssl_includes" + fi + + if AC_TRY_EVAL(ac_link); then + + if eval `./conftest 2>&5`; then + if test $ssl_version = error; then + AC_MSG_ERROR([$ssl_incdir/openssl/opensslv.h doesn't define OPENSSL_VERSION_NUMBER !]) + else + if test $ssl_version = old; then + AC_MSG_WARN([OpenSSL version too old. Upgrade to 0.9.6 at least, see http://www.openssl.org. SSL support disabled.]) + have_ssl=no + fi + fi + ac_cv_ssl_version="ssl_version=$ssl_version" + else + AC_MSG_ERROR([Your system couldn't run a small SSL test program. + Check config.log, and if you can't figure it out, send a mail to + David Faure , attaching your config.log]) + fi + + else + AC_MSG_ERROR([Your system couldn't link a small SSL test program. + Check config.log, and if you can't figure it out, send a mail to + David Faure , attaching your config.log]) + fi + CPPFLAGS=$ac_save_CPPFLAGS + + ]) + + eval "$ac_cv_ssl_version" + AC_MSG_RESULT($ssl_version) +fi + +if test "$have_ssl" != yes; then + LIBSSL=""; +else + AC_DEFINE(HAVE_SSL, 1, [If we are going to use OpenSSL]) + ac_cv_have_ssl="have_ssl=yes \ + ac_ssl_includes=$ac_ssl_includes ac_ssl_libraries=$ac_ssl_libraries ac_ssl_rsaref=$ac_ssl_rsaref" + + + ssl_libraries="$ac_ssl_libraries" + ssl_includes="$ac_ssl_includes" + + if test "$ac_ssl_rsaref" = yes; then + LIBSSL="-lssl -lcrypto -lRSAglue -lrsaref" + fi + + if test $ssl_version = "old"; then + AC_DEFINE(HAVE_OLD_SSL_API, 1, [Define if you have OpenSSL < 0.9.6]) + fi +fi + +SSL_INCLUDES= + +if test "$ssl_includes" = "/usr/include"; then + if test -f /usr/kerberos/include/krb5.h; then + SSL_INCLUDES="-I/usr/kerberos/include" + fi +elif test "$ssl_includes" != "/usr/local/include" && test -n "$ssl_includes"; then + SSL_INCLUDES="-I$ssl_includes" +fi + +if test "$ssl_libraries" = "/usr/lib" || test "$ssl_libraries" = "/usr/local/lib" || test -z "$ssl_libraries" || test "$ssl_libraries" = "NONE"; then + SSL_LDFLAGS="" +else + SSL_LDFLAGS="-L$ssl_libraries -R$ssl_libraries" +fi + +AC_SUBST(SSL_INCLUDES) +AC_SUBST(SSL_LDFLAGS) +AC_SUBST(LIBSSL) +]) + +AC_DEFUN([KDE_CHECK_STRLCPY], +[ + AC_REQUIRE([AC_CHECK_STRLCAT]) + AC_REQUIRE([AC_CHECK_STRLCPY]) + AC_CHECK_SIZEOF(size_t) + AC_CHECK_SIZEOF(unsigned long) + + AC_MSG_CHECKING([sizeof size_t == sizeof unsigned long]) + AC_TRY_COMPILE(,[ + #if SIZEOF_SIZE_T != SIZEOF_UNSIGNED_LONG + choke me + #endif + ],AC_MSG_RESULT([yes]),[ + AC_MSG_RESULT(no) + AC_MSG_ERROR([ + Apparently on your system our assumption sizeof size_t == sizeof unsigned long + does not apply. Please mail kde-devel@kde.org with a description of your system! + ]) + ]) +]) + +AC_DEFUN([KDE_CHECK_BINUTILS], +[ + AC_MSG_CHECKING([if ld supports unversioned version maps]) + + kde_save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" + echo "{ local: extern \"C++\" { foo }; };" > conftest.map + AC_TRY_LINK([int foo;], +[ +#ifdef __INTEL_COMPILER +icc apparently does not support libtools version-info and version-script +at the same time. Dunno where the bug is, but until somebody figured out, +better disable the optional version scripts. +#endif + + foo = 42; +], kde_supports_versionmaps=yes, kde_supports_versionmaps=no) + LDFLAGS="$kde_save_LDFLAGS" + rm -f conftest.map + AM_CONDITIONAL(include_VERSION_SCRIPT, + [test "$kde_supports_versionmaps" = "yes" && test "$kde_use_debug_code" = "no"]) + + AC_MSG_RESULT($kde_supports_versionmaps) +]) + +AC_DEFUN([AM_PROG_OBJC],[ +AC_CHECK_PROGS(OBJC, gcc, gcc) +test -z "$OBJC" && AC_MSG_ERROR([no acceptable objective-c gcc found in \$PATH]) +if test "x${OBJCFLAGS-unset}" = xunset; then + OBJCFLAGS="-g -O2" +fi +AC_SUBST(OBJCFLAGS) +_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES(OBJC)]) +]) + +AC_DEFUN([KDE_CHECK_PERL], +[ + KDE_FIND_PATH(perl, PERL, [$bindir $exec_prefix/bin $prefix/bin], [ + AC_MSG_ERROR([No Perl found in your $PATH. +We need perl to generate some code.]) + ]) + AC_SUBST(PERL) +]) + +AC_DEFUN([KDE_CHECK_LARGEFILE], +[ +AC_SYS_LARGEFILE +if test "$ac_cv_sys_file_offset_bits" != no; then + CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" +fi + +if test "x$ac_cv_sys_large_files" != "xno"; then + CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=1" +fi + +]) + +dnl A small extension to PKG_CHECK_MODULES (defined in pkg.m4.in) +dnl which allows to search for libs that get installed into the KDE prefix. +dnl +dnl Syntax: KDE_PKG_CHECK_MODULES(KSTUFF, libkexif >= 0.2 glib = 1.3.4, action-if, action-not) +dnl defines KSTUFF_LIBS, KSTUFF_CFLAGS, see pkg-config man page +dnl also defines KSTUFF_PKG_ERRORS on error +AC_DEFUN([KDE_PKG_CHECK_MODULES], [ + + PKG_CONFIG_PATH="$prefix/lib${kdelibsuff}/pkgconfig:$PKG_CONFIG_PATH" + if test "$prefix" != "$kde_libs_prefix"; then + PKG_CONFIG_PATH="$kde_libs_prefix/lib${kdelibsuff}/pkgconfig:$PKG_CONFIG_PATH" + fi + export PKG_CONFIG_PATH + PKG_CHECK_MODULES([$1],[$2],[$3],[$4]) +]) + + +dnl Check for PIE support in the compiler and linker +AC_DEFUN([KDE_CHECK_PIE_SUPPORT], +[ + AC_CACHE_CHECK([for PIE support], kde_cv_val_pie_support, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + safe_CXXFLAGS=$CXXFLAGS + safe_LDFLAGS=$LDFLAGS + CXXFLAGS="$CXXFLAGS -fPIE" + LDFLAGS="$LDFLAGS -pie" + + AC_TRY_LINK([int foo;], [], [kde_cv_val_pie_support=yes], [kde_cv_val_pie_support=no]) + + CXXFLAGS=$safe_CXXFLAGS + LDFLAGS=$safe_LDFLAGS + AC_LANG_RESTORE + ]) + + AC_MSG_CHECKING(if enabling -pie/fPIE support) + + AC_ARG_ENABLE(pie, + AC_HELP_STRING([--enable-pie],[platform supports PIE linking [default=detect]]), + [kde_has_pie_support=$enableval], + [kde_has_pie_support=detect]) + + if test "$kde_has_pie_support" = "detect"; then + kde_has_pie_support=$kde_cv_val_pie_support + fi + + AC_MSG_RESULT([$kde_has_pie_support]) + + KDE_USE_FPIE="" + KDE_USE_PIE="" + + AC_SUBST([KDE_USE_FPIE]) + AC_SUBST([KDE_USE_PIE]) + + if test "$kde_has_pie_support" = "yes"; then + KDE_USE_FPIE="-fPIE" + KDE_USE_PIE="-pie" + fi +]) +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +## Copyright 1996, 1997, 1998, 1999, 2000, 2001 +## Free Software Foundation, Inc. +## Originally by Gordon Matzigkeit , 1996 +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +## +## As a special exception to the GNU General Public License, if you +## distribute this file as part of a program that contains a +## configuration script generated by Autoconf, you may include it under +## the same distribution terms that you use for the rest of that program. + +# serial 47 AC_PROG_LIBTOOL + + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool --silent' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl + +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP + + +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_AC_SYS_COMPILER + + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[_LT_AC_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +])])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + LINUX_64_MODE="32" + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + LINUX_64_MODE="64" + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) +AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + $2=yes + fi + fi + $rm conftest* +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + else + $2=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + testring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$testring" 2>/dev/null` \ + = "XX$testring") >/dev/null 2>&1 && + new_result=`expr "X$testring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + testring=$testring$testring + done + testring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# -------------------- +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ------------------------------------------------------------------ +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_unknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + # According to Tom Tromey, Ian Lance Taylor reported there are C compilers + # that will create temporary files in the current directory regardless of + # the output directory. Thus, making CWD read-only will cause this test + # to fail, enabling locking or at least warning the user not to do parallel + # builds. + chmod -w . + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . + $rm conftest* out/* + rmdir out + cd .. + rmdir conftest + $rm conftest* +]) +])# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + libsuff= + if test "x$LINUX_64_MODE" = x64; then + # Some platforms are per default 64-bit, so there's no /lib64 + if test -d /lib64; then + libsuff=64 + fi + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" + sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && test "X$CXX" != "Xno"; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 dll's +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +#- set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case "$host_cpu" in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + irix5* | nonstopux*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1" + ;; + esac + lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + case $host_cpu in + alpha* | hppa* | i*86 | ia64* | m68* | mips* | powerpc* | sparc* | s390* | sh* | x86_64* ) + lt_cv_deplibs_check_method=pass_all ;; + # the debian people say, arm and glibc 2.3.1 works for them with pass_all + arm* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' + lt_cv_file_magic_test_file=/shlib/libc.so + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + lt_cv_file_magic_test_file=/lib/libc.so + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + esac + fi + done + IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will +# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided and an installed libltdl is not found, it is +# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' +# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single +# quotes!). If your package is not flat and you're not using automake, +# define top_builddir and top_srcdir appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# -------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + +_LT_AC_SYS_COMPILER + +# +# Check for any special shared library compilation flags. +# +_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' + ;; + esac +fi +if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then + AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$]_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) + _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +# Report which librarie types wil actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + darwin* | rhapsody*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,dynamic_lookup' + ;; + esac + fi + ;; + esac + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= + +# Source file extension for C++ test sources. +ac_ext=cc + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # KDE requires run time linking. Make it the default. + aix_use_runtimelinking=yes + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='-qmkshrobj ${wl}-G' + else + shared_flag='-qmkshrobj' + fi + fi + fi + + # Let the compiler handle the export list. + _LT_AC_TAGVAR(always_export_symbols, $1)=no + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '" $shared_flag" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=no + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs' + + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | egrep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case "$host_cpu" in + ia64*|hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc) + # Intel C++ + with_gnu_ld=yes + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + cxx) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sco*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext='$shrext' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + test -f Makefile && make "$ltmain" +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris* | sysv5*) + symcode='[[BDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGISTW]]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=no + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $compiler_flags $libobjs $deplibs -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + + # KDE requires run time linking. Make it the default. + aix_use_runtimelinking=yes + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='-qmkshrobj ${wl}-G' + else + shared_flag='-qmkshrobj' + fi + fi + fi + + # Let the compiler handle the export list. + _LT_AC_TAGVAR(always_export_symbols, $1)=no + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '" $shared_flag" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi4*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=no + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $compiler_flags $libobjs `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $compiler_flags $libobjs $deplibs' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $compiler_flags $libobjs $deplibs~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $compiler_flags $libobjs $deplibs' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $compiler_flags $libobjs $deplibs' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $compiler_flags $libobjs $deplibs' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $compiler_flags $libobjs $deplibs$output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $libobjs $deplibs ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $libobjs $deplibs ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs~$rm $lib.exp' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $compiler_flags $libobjs $deplibs' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4.2uw2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs' + fi + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv5*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) + + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) +]) + +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) +]) + +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && break + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_MSG_RESULT([$SED]) +]) diff --git a/config.guess b/config.guess new file mode 100644 index 0000000..da83314 --- /dev/null +++ b/config.guess @@ -0,0 +1,1561 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. + +timestamp='2009-04-27' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[456]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:[3456]*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + EM64T | authenticamd | genuineintel) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^LIBC/{ + s: ::g + p + }'`" + test x"${LIBC}" != x && { + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit + } + test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.h.in b/config.h.in new file mode 100755 index 0000000..055c089 --- /dev/null +++ b/config.h.in @@ -0,0 +1,244 @@ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef HAVE_CARBON_CARBON_H + +/* Define if you have the CoreAudio API */ +#undef HAVE_COREAUDIO + +/* Define to 1 if you have the header file. */ +#undef HAVE_CRT_EXTERNS_H + +/* Defines if your system has the crypt function */ +#undef HAVE_CRYPT + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define if you have libjpeg */ +#undef HAVE_LIBJPEG + +/* Define if you have libpng */ +#undef HAVE_LIBPNG + +/* Define if you have a working libpthread (will enable threaded code) */ +#undef HAVE_LIBPTHREAD + +/* Define if you have libz */ +#undef HAVE_LIBZ + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define if your system needs _NSGetEnviron to set up the environment */ +#undef HAVE_NSGETENVIRON + +/* Define if you have res_init */ +#undef HAVE_RES_INIT + +/* Define if you have the res_init prototype */ +#undef HAVE_RES_INIT_PROTO + +/* Define if you have a STL implementation by SGI */ +#undef HAVE_SGI_STL + +/* Define to 1 if you have the `snprintf' function. */ +#undef HAVE_SNPRINTF + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define if you have strlcat */ +#undef HAVE_STRLCAT + +/* Define if you have the strlcat prototype */ +#undef HAVE_STRLCAT_PROTO + +/* Define if you have strlcpy */ +#undef HAVE_STRLCPY + +/* Define if you have the strlcpy prototype */ +#undef HAVE_STRLCPY_PROTO + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_BITYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the `vsnprintf' function. */ +#undef HAVE_VSNPRINTF + +/* Suffix for lib directories */ +#undef KDELIBSUFF + +/* Define a safe value for MAXPATHLEN */ +#undef KDEMAXPATHLEN + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* The size of `char *', as computed by sizeof. */ +#undef SIZEOF_CHAR_P + +/* The size of `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* The size of `long', as computed by sizeof. */ +#undef SIZEOF_LONG + +/* The size of `short', as computed by sizeof. */ +#undef SIZEOF_SHORT + +/* The size of `size_t', as computed by sizeof. */ +#undef SIZEOF_SIZE_T + +/* The size of `unsigned long', as computed by sizeof. */ +#undef SIZEOF_UNSIGNED_LONG + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* Defined if compiling without arts */ +#undef WITHOUT_ARTS + +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ +#undef WORDS_BIGENDIAN + +/* + * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system + * headers and I'm too lazy to write a configure test as long as only + * unixware is related + */ +#ifdef _UNIXWARE +#define HAVE_BOOLEAN +#endif + + + +/* + * AIX defines FD_SET in terms of bzero, but fails to include + * that defines bzero. + */ + +#if defined(_AIX) +#include +#endif + + + +#if defined(HAVE_NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H) +# include +# include +# define environ (*_NSGetEnviron()) +#endif + + + +#if !defined(HAVE_RES_INIT_PROTO) +#ifdef __cplusplus +extern "C" { +#endif +int res_init(void); +#ifdef __cplusplus +} +#endif +#endif + + + +#if !defined(HAVE_STRLCAT_PROTO) +#ifdef __cplusplus +extern "C" { +#endif +unsigned long strlcat(char*, const char*, unsigned long); +#ifdef __cplusplus +} +#endif +#endif + + + +#if !defined(HAVE_STRLCPY_PROTO) +#ifdef __cplusplus +extern "C" { +#endif +unsigned long strlcpy(char*, const char*, unsigned long); +#ifdef __cplusplus +} +#endif +#endif + + + +/* + * On HP-UX, the declaration of vsnprintf() is needed every time ! + */ + +#if !defined(HAVE_VSNPRINTF) || defined(hpux) +#if __STDC__ +#include +#include +#else +#include +#endif +#ifdef __cplusplus +extern "C" +#endif +int vsnprintf(char *str, size_t n, char const *fmt, va_list ap); +#ifdef __cplusplus +extern "C" +#endif +int snprintf(char *str, size_t n, char const *fmt, ...); +#endif + + + +#if defined(__SVR4) && !defined(__svr4__) +#define __svr4__ 1 +#endif + + +/* type to use in place of socklen_t if not defined */ +#undef kde_socklen_t + +/* type to use in place of socklen_t if not defined (deprecated, use + kde_socklen_t) */ +#undef ksize_t diff --git a/config.log b/config.log new file mode 100644 index 0000000..67ab620 --- /dev/null +++ b/config.log @@ -0,0 +1,361 @@ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by configure, which was +generated by GNU Autoconf 2.61. Invocation command line was + + $ ./configure --host=x86_64-linux-gnu --build=x86_64-linux-gnu --prefix=/opt/kde3 --mandir=${prefix}/share/man --infodir=${prefix}/share/info --with-qt-includes=/usr/include/qt3/ --with-qt-libraries=/usr/lib/qt3/ --enable-mt --disable-rpath + +## --------- ## +## Platform. ## +## --------- ## + +hostname = argus4 +uname -m = x86_64 +uname -r = 2.6.31-16-generic +uname -s = Linux +uname -v = #53-Ubuntu SMP Tue Dec 8 04:02:15 UTC 2009 + +/usr/bin/uname -p = unknown +/bin/uname -X = unknown + +/bin/arch = unknown +/usr/bin/arch -k = unknown +/usr/convex/getsysinfo = unknown +/usr/bin/hostinfo = unknown +/bin/machine = unknown +/usr/bin/oslevel = unknown +/bin/universe = unknown + +PATH: /opt/kde3/bin +PATH: /opt/kde3/games +PATH: /opt/kde3/bin +PATH: /home/eldarion/bin +PATH: /usr/local/sbin +PATH: /usr/local/bin +PATH: /usr/sbin +PATH: /usr/bin +PATH: /sbin +PATH: /bin +PATH: /usr/games + + +## ----------- ## +## Core tests. ## +## ----------- ## + +configure:2136: checking build system type +configure:2154: result: x86_64-pc-linux-gnu +configure:2176: checking host system type +configure:2191: result: x86_64-pc-linux-gnu +configure:2213: checking target system type +configure:2228: result: x86_64-pc-linux-gnu +configure:2289: checking for a BSD-compatible install +configure:2345: result: /usr/bin/install -c +configure:2360: checking for -p flag to install +configure:2373: result: yes +configure:2384: checking whether build environment is sane + +## ---------------- ## +## Cache variables. ## +## ---------------- ## + +ac_cv_build=x86_64-pc-linux-gnu +ac_cv_env_CCC_set= +ac_cv_env_CCC_value= +ac_cv_env_CC_set= +ac_cv_env_CC_value= +ac_cv_env_CFLAGS_set=set +ac_cv_env_CFLAGS_value='-Wall -g -O2' +ac_cv_env_CPPFLAGS_set=set +ac_cv_env_CPPFLAGS_value= +ac_cv_env_CPP_set= +ac_cv_env_CPP_value= +ac_cv_env_CXXCPP_set= +ac_cv_env_CXXCPP_value= +ac_cv_env_CXXFLAGS_set=set +ac_cv_env_CXXFLAGS_value='-g -O2' +ac_cv_env_CXX_set= +ac_cv_env_CXX_value= +ac_cv_env_F77_set= +ac_cv_env_F77_value= +ac_cv_env_FFLAGS_set=set +ac_cv_env_FFLAGS_value='-g -O2' +ac_cv_env_LDFLAGS_set=set +ac_cv_env_LDFLAGS_value=-Wl,-Bsymbolic-functions +ac_cv_env_LIBS_set= +ac_cv_env_LIBS_value= +ac_cv_env_XMKMF_set= +ac_cv_env_XMKMF_value= +ac_cv_env_build_alias_set=set +ac_cv_env_build_alias_value=x86_64-linux-gnu +ac_cv_env_host_alias_set=set +ac_cv_env_host_alias_value=x86_64-linux-gnu +ac_cv_env_target_alias_set= +ac_cv_env_target_alias_value= +ac_cv_host=x86_64-pc-linux-gnu +ac_cv_path_install='/usr/bin/install -c' +ac_cv_target=x86_64-pc-linux-gnu + +## ----------------- ## +## Output variables. ## +## ----------------- ## + +ACLOCAL='' +AMDEPBACKSLASH='' +AMDEP_FALSE='' +AMDEP_TRUE='' +AMTAR='' +AR='' +ARTSCCONFIG='' +AUTOCONF='' +AUTODIRS='' +AUTOHEADER='' +AUTOMAKE='' +AWK='' +CC='' +CCDEPMODE='' +CFLAGS='-Wall -g -O2' +CONF_FILES='' +CPP='' +CPPFLAGS='' +CXX='' +CXXCPP='' +CXXDEPMODE='' +CXXFLAGS='-g -O2' +CYGPATH_W='' +DCOPIDL2CPP='' +DCOPIDL='' +DCOPIDLNG='' +DCOP_DEPENDENCIES='' +DEFS='' +DEPDIR='' +ECHO='echo' +ECHO_C='' +ECHO_N='-n' +ECHO_T='' +EGREP='' +ENABLE_PERMISSIVE_FLAG='' +EXEEXT='' +F77='' +FFLAGS='-g -O2' +FRAMEWORK_COREAUDIO='' +GMSGFMT='' +GREP='' +HAVE_GCC_VISIBILITY='' +INSTALL_DATA='${INSTALL} -m 644' +INSTALL_PROGRAM='${INSTALL} $(INSTALL_STRIP_FLAG)' +INSTALL_SCRIPT='${INSTALL}' +INSTALL_STRIP_PROGRAM='' +KCFG_DEPENDENCIES='' +KCONFIG_COMPILER='' +KDECONFIG='' +KDE_CHECK_PLUGIN='' +KDE_EXTRA_RPATH='' +KDE_INCLUDES='' +KDE_LDFLAGS='' +KDE_MT_LDFLAGS='' +KDE_MT_LIBS='' +KDE_NO_UNDEFINED='' +KDE_PLUGIN='' +KDE_RPATH='' +KDE_USE_CLOSURE_FALSE='' +KDE_USE_CLOSURE_TRUE='' +KDE_USE_FINAL_FALSE='' +KDE_USE_FINAL_TRUE='' +KDE_USE_FPIE='' +KDE_USE_NMCHECK_FALSE='' +KDE_USE_NMCHECK_TRUE='' +KDE_USE_PIE='' +KDE_XSL_STYLESHEET='' +LDFLAGS='-Wl,-Bsymbolic-functions' +LDFLAGS_AS_NEEDED='' +LDFLAGS_NEW_DTAGS='' +LIBCOMPAT='' +LIBCRYPT='' +LIBDL='' +LIBJPEG='' +LIBOBJS='' +LIBPNG='' +LIBPTHREAD='' +LIBRESOLV='' +LIBS='' +LIBSM='' +LIBSOCKET='' +LIBTOOL='' +LIBUCB='' +LIBUTIL='' +LIBZ='' +LIB_KAB='' +LIB_KABC='' +LIB_KDECORE='' +LIB_KDED='' +LIB_KDEPIM='' +LIB_KDEPRINT='' +LIB_KDEUI='' +LIB_KDNSSD='' +LIB_KFILE='' +LIB_KFM='' +LIB_KHTML='' +LIB_KIMPROXY='' +LIB_KIO='' +LIB_KJS='' +LIB_KNEWSTUFF='' +LIB_KPARTS='' +LIB_KSPELL='' +LIB_KSYCOCA='' +LIB_KUNITTEST='' +LIB_KUTILS='' +LIB_POLL='' +LIB_QPE='' +LIB_QT='' +LIB_SMB='' +LIB_X11='' +LIB_XEXT='' +LIB_XRENDER='' +LN_S='' +LTLIBOBJS='' +MAKEINFO='' +MAKEKDEWIDGETS='' +MCOPIDL='' +MEINPROC='' +MOC='' +MSGFMT='' +NOOPT_CFLAGS='' +NOOPT_CXXFLAGS='' +OBJEXT='' +PACKAGE='' +PACKAGE_BUGREPORT='' +PACKAGE_NAME='' +PACKAGE_STRING='' +PACKAGE_TARNAME='' +PACKAGE_VERSION='' +PATH_SEPARATOR=':' +PERL='' +QTE_NORTTI='' +QT_INCLUDES='' +QT_LDFLAGS='' +RANLIB='' +SET_MAKE='' +SHELL='/bin/bash' +STRIP='' +TOPSUBDIRS='' +UIC='' +UIC_TR='' +USER_INCLUDES='' +USER_LDFLAGS='' +USE_EXCEPTIONS='' +USE_RTTI='' +USE_THREADS='' +VERSION='' +WOVERLOADED_VIRTUAL='' +XGETTEXT='' +XMKMF='' +XMLLINT='' +X_EXTRA_LIBS='' +X_INCLUDES='' +X_LDFLAGS='' +X_PRE_LIBS='' +X_RPATH='' +ac_ct_CC='' +ac_ct_CXX='' +ac_ct_F77='' +all_includes='' +all_libraries='' +am__fastdepCC_FALSE='' +am__fastdepCC_TRUE='' +am__fastdepCXX_FALSE='' +am__fastdepCXX_TRUE='' +am__include='' +am__leading_dot='' +am__quote='' +am__tar='' +am__untar='' +bindir='${exec_prefix}/bin' +build='x86_64-pc-linux-gnu' +build_alias='x86_64-linux-gnu' +build_cpu='x86_64' +build_os='linux-gnu' +build_vendor='pc' +datadir='${datarootdir}' +datarootdir='${prefix}/share' +docdir='${datarootdir}/doc/${PACKAGE}' +dvidir='${docdir}' +exec_prefix='NONE' +host='x86_64-pc-linux-gnu' +host_alias='x86_64-linux-gnu' +host_cpu='x86_64' +host_os='linux-gnu' +host_vendor='pc' +htmldir='${docdir}' +include_ARTS_FALSE='' +include_ARTS_TRUE='' +include_x11_FALSE='' +include_x11_TRUE='' +includedir='${prefix}/include' +infodir='${prefix}/share/info' +install_sh='' +kde_appsdir='' +kde_bindir='' +kde_confdir='' +kde_datadir='' +kde_htmldir='' +kde_icondir='' +kde_includes='' +kde_kcfgdir='' +kde_libraries='' +kde_libs_htmldir='' +kde_libs_prefix='' +kde_locale='' +kde_mimedir='' +kde_moduledir='' +kde_qtver='' +kde_servicesdir='' +kde_servicetypesdir='' +kde_sounddir='' +kde_styledir='' +kde_templatesdir='' +kde_wallpaperdir='' +kde_widgetdir='' +kdeinitdir='' +libdir='${exec_prefix}/lib' +libexecdir='${exec_prefix}/libexec' +localedir='${datarootdir}/locale' +localstatedir='${prefix}/var' +mandir='${prefix}/share/man' +mkdir_p='' +oldincludedir='/usr/include' +pdfdir='${docdir}' +prefix='/opt/kde3' +program_transform_name='s,x,x,' +psdir='${docdir}' +qt_includes='' +qt_libraries='' +sbindir='${exec_prefix}/sbin' +sharedstatedir='${prefix}/com' +sysconfdir='${prefix}/etc' +target='x86_64-pc-linux-gnu' +target_alias='' +target_cpu='x86_64' +target_os='linux-gnu' +target_vendor='pc' +unsermake_enable_pch_FALSE='' +unsermake_enable_pch_TRUE='' +x_includes='NONE' +x_libraries='NONE' +xdg_appsdir='' +xdg_directorydir='' +xdg_menudir='' + +## ----------- ## +## confdefs.h. ## +## ----------- ## + +#define PACKAGE_NAME "" +#define PACKAGE_TARNAME "" +#define PACKAGE_VERSION "" +#define PACKAGE_STRING "" +#define PACKAGE_BUGREPORT "" + +configure: caught signal 2 +configure: exit 1 diff --git a/config.sub b/config.sub new file mode 100644 index 0000000..a39437d --- /dev/null +++ b/config.sub @@ -0,0 +1,1686 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. + +timestamp='2009-04-17' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/configure.files b/configure.files new file mode 100644 index 0000000..030bce8 --- /dev/null +++ b/configure.files @@ -0,0 +1,2 @@ +./admin/configure.in.min +configure.in.in diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..82b365a --- /dev/null +++ b/configure.in @@ -0,0 +1,126 @@ +dnl ======================================================= +dnl FILE: ./admin/configure.in.min +dnl ======================================================= + +dnl This file is part of the KDE libraries/packages +dnl Copyright (C) 2001 Stephan Kulow (coolo@kde.org) + +dnl This file is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Library General Public +dnl License as published by the Free Software Foundation; either +dnl version 2 of the License, or (at your option) any later version. + +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Library General Public License for more details. + +dnl You should have received a copy of the GNU Library General Public License +dnl along with this library; see the file COPYING.LIB. If not, write to +dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +dnl Boston, MA 02110-1301, USA. + +# Original Author was Kalle@kde.org +# I lifted it in some mater. (Stephan Kulow) +# I used much code from Janos Farkas + +dnl Process this file with autoconf to produce a configure script. + +AC_INIT(acinclude.m4) dnl a source file from your sub dir + +dnl This is so we can use kde-common +AC_CONFIG_AUX_DIR(admin) + +dnl This ksh/zsh feature conflicts with `cd blah ; pwd` +unset CDPATH + +dnl Checking host/target/build systems, for make, install etc. +AC_CANONICAL_SYSTEM +dnl Perform program name transformation +AC_ARG_PROGRAM + +dnl Automake doc recommends to do this only here. (Janos) +AM_INIT_AUTOMAKE(knutclient, 0.9.5) dnl searches for some needed programs + +KDE_SET_PREFIX + +dnl generate the config header +AM_CONFIG_HEADER(config.h) dnl at the distribution this done + +dnl Checks for programs. +AC_CHECK_COMPILERS +AC_ENABLE_SHARED(yes) +AC_ENABLE_STATIC(no) +KDE_PROG_LIBTOOL + +dnl for NLS support. Call them in this order! +dnl WITH_NLS is for the po files +AM_KDE_WITH_NLS + +KDE_USE_QT(3.2.0) +AC_PATH_KDE +dnl ======================================================= +dnl FILE: configure.in.in +dnl ======================================================= + +#MIN_CONFIG(3.2.0) + +dnl PACKAGE set before +AC_C_BIGENDIAN +AC_CHECK_KDEMAXPATHLEN + +KDE_CREATE_SUBDIRSLIST +AC_CONFIG_FILES([ Makefile ]) +AC_CONFIG_FILES([ doc/Makefile ]) +AC_CONFIG_FILES([ doc/cs/Makefile ]) +AC_CONFIG_FILES([ doc/en/Makefile ]) +AC_CONFIG_FILES([ pics/Makefile ]) +AC_CONFIG_FILES([ po/Makefile ]) +AC_CONFIG_FILES([ specs/Makefile ]) +AC_CONFIG_FILES([ src/Makefile ]) +AC_OUTPUT +# Check if KDE_SET_PREFIX was called, and --prefix was passed to configure +if test -n "$kde_libs_prefix" -a -n "$given_prefix"; then + # And if so, warn when they don't match + if test "$kde_libs_prefix" != "$given_prefix"; then + # And if kde doesn't know about the prefix yet + echo ":"`kde-config --path exe`":" | grep ":$given_prefix/bin/:" 2>&1 >/dev/null + if test $? -ne 0; then + echo "" + echo "Warning: you chose to install this package in $given_prefix," + echo "but KDE was found in $kde_libs_prefix." + echo "For this to work, you will need to tell KDE about the new prefix, by ensuring" + echo "that KDEDIRS contains it, e.g. export KDEDIRS=$given_prefix:$kde_libs_prefix" + echo "Then restart KDE." + echo "" + fi + fi +fi + +if test x$GXX = "xyes" -a x$kde_have_gcc_visibility = "xyes" -a x$kde_cv_val_qt_gcc_visibility_patched = "xno"; then + echo "" + echo "Your GCC supports symbol visibility, but the patch for Qt supporting visibility" + echo "was not included. Therefore, GCC symbol visibility support remains disabled." + echo "" + echo "For better performance, consider including the Qt visibility supporting patch" + echo "located at:" + echo "" + echo "http://bugs.kde.org/show_bug.cgi?id=109386" + echo "" + echo "and recompile all of Qt and KDE. Note, this is entirely optional and" + echo "everything will continue to work just fine without it." + echo "" +fi + +if test "$all_tests" = "bad"; then + if test ! "$cache_file" = "/dev/null"; then + echo "" + echo "Please remove the file $cache_file after changing your setup" + echo "so that configure will find the changes next time." + echo "" + fi +else + echo "" + echo "Good - your configure finished. Start make now" + echo "" +fi diff --git a/configure.in.in b/configure.in.in new file mode 100755 index 0000000..0853047 --- /dev/null +++ b/configure.in.in @@ -0,0 +1,6 @@ +#MIN_CONFIG(3.2.0) + +AM_INIT_AUTOMAKE(knutclient, 0.9.5) +AC_C_BIGENDIAN +AC_CHECK_KDEMAXPATHLEN + diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100755 index 0000000..6663b4e --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,6 @@ +# the SUBDIRS is filled automatically by am_edit. If files are +# in this directory they are installed into the english dir + +KDE_LANG = en +KDE_DOCS = knutclient +SUBDIRS = $(AUTODIRS) diff --git a/doc/cs/Makefile.am b/doc/cs/Makefile.am new file mode 100755 index 0000000..f097f05 --- /dev/null +++ b/doc/cs/Makefile.am @@ -0,0 +1,2 @@ +KDE_DOCS = knutclient +KDE_LANG = cs diff --git a/doc/cs/asetting-cs.png b/doc/cs/asetting-cs.png new file mode 100755 index 0000000000000000000000000000000000000000..896194727e4af24b3c43309fef2525df27d225c3 GIT binary patch literal 22228 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 literal 0 HcmV?d00001 diff --git a/doc/cs/fsetting-cs.png b/doc/cs/fsetting-cs.png new file mode 100755 index 0000000000000000000000000000000000000000..28c3966baf5522cf292eabdf5f69014987716df9 GIT binary patch literal 23450 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 +KNutClient'> + + + + + +]> + + + + + + + + + + +Příručka pro &knutclient; + + + +Daniel + +Prynych + +

Daniel@prynych.cz
+ + + + + + +2001 +2002 +2003 +2004 +2006 +2007 +2008 +2009 +Daniel Prynych + + + +&FDLNotice; + + + +3/2/2008 +0.12.01 + + + + + +&knutclient; je grafická klientská aplikace pro UPS systém NUT. + + +Tento dokument popisuje aplikaci &knutclient; verze 0.9.5 + + + + +KDE +kdeutils +KNutClient +NUT +UPS + + + + + + +Úvod + + +&knutclient; je program který umožňuje sledovat stav UPS-ek systému NUT. + + + + +Použití &knutclient; + + + +Hlavní okno aplikace &knutclient; + +&knutclient; je klientská grafická aplikace pro systém NUT +"Network UPS Tools". Umožňuje sledovat stav UPS-ek a zobrazovat +hodnoty proměnných které vybraná UPS-ka a její ovladač podporuje. + + + +Od verze 0.6.0 &knutclient; podporuje spouštění okamžitých příkazů, +a možnost změny RW proměnných. + + +Od verze 0.9.0 nepodporuje &knutclient; protokol UDP. + + + + +Hlavní okno aplikace &knutclient; + + + + + + + + +Hlavní okno programu je rozděleno na dvě části. + + +Levé část "Hlavní panel" obsahuje následující údaje indikující stav vybrané +UPS-ky. +Provoz na síť, provoz na baterie, přetížení, nutnost vyměnit +baterii, vybití baterie, kalibraci baterie, údaj o dobu běhu +po odpojení sítě (RUNTIME) a pod. Déle jsou zde neměnné údaje, to jsou údaje +které se za provozu nemění a jsou proto přečteny jen jednou při výběru UPS-ky, +například jméno UPS-ky, její sériové číslo, výrobce a pod. + +Pravá část obsahuje analogové panely (měřáky), které udávají hodnotu +proměnných +veličin jako je vstupní napětí, zatížení UPS-ky, kapacitu baterie, teplotu +UPS-ky, +napětí baterie apod. + + +&knutclient; obsahuje nástrojovou lištu (toolbar) ze standardními tlačítky a +tlačítko pro výběr sledované UPS-ky. + + + + + + +&knutclient; a panel KDE + + + +&knutclient; a panel KDE + + + + + + + + +Od verze 0.8.0 &knutclient; dokuje v panelu KDE. Jeho icona je proměnná a zobrazuje +informace o zatížení UPS, runtime a a kapacitě baterie, podle toho který typ icony je vybrán. +Po přesunu ukazatele myši na ikonu se zobrazí informační okno "ToolTip" které obsahuje více +informací o UPS, Nazev, Jméno, Adresu, Stav, Runtime ... + + + + + +Více o vlastnostech &knutclient; + + +Pro spojení se serverovou části NUT-u (upsd) používá &knutclient; +protokol, TCP.Po vybraní UPS-ky v nástrojové liště se +&knutclient; pokusí přečíst data, pokud se mu to nepodaří, pokus opakuje +a to maximálně 2 krát. &knutclient; poté čte data v pravidelných +intervalech. Při prvním čtení čte všechny vybrané proměnné, v dalších +již jen proměnné které zobrazují analogové panely, RUNTIME a stav +UPS-ky. Proměnné zobrazující jméno UPS-ky, výrobce, sériové číslo a pod +se tedy čtou jen jednou protože se nepředpokládá jejich změna. + + +Novější verze upsd (od verze 1.3), již nepodporují protokol UDP. + + + +Chyby vznikající za běhu programu se zobrazují ve stavové lište. Do stavové +lišty +je vnořen seznam (ComboBox), ktery obsahuje hlašení chyb, a to včetne datumu, +času a nazvy UPS-ky. Maximální délka seznamu je 50 řádek. + + +Chyby vznikající jako odezva na činnost uživatele jsou zobrazeny ve +zvláštním okně. + + + + + +Popis příkazů + + + + +Hlavní okno aplikace &knutclient; + + + + +Menu Soubor + + + + + Soubor + Zobrazení Ups proměnných a příkazů + + Vypíše Ups proměnné pro zvolenou +UPS-ku + + + + Soubor + Spuštění okamžitých příkazů + + Provede na UPS daný okamžitý +příkaz + + + + Soubor + Nastavení UPS RW proměnných + + + Provede změnu UPS RW proměnné + + + + + Ctrlq + + Soubor + Ukončit + + Ukončí činnost programu + + + + + + + +Menu Spojení + + + + + + F1 + + Spojení + Obnovit Spojeni + + Obnoví spojení s UPS serverem (upsd). + + + + + + + + + +Menu Nastavení + + + + + Nastavení + Zobrazovat nástrojovou lištu + + Zapne/Vypne zobrazení nástrojové lišty +(Toolbar) + + + + + Nastavení + Zobrazovat stavovou lištu + + Zapne/Vypne zobrazování nástrojové +lišty + + + + + + Nastavení + Nastavení klávesových zkratek... + + + Otevře konfigurační dialog pro přiřazení klávesy k akci. + + + + + + + Nastavení + Nastavit &knutclient; + + + Otevře hlavni konfigurační dialog + + + + + + Nastavení + Použít popis + + + Zapne/Vypne používání bublinové nápovědi (ToolTip) při + zobrazení UPS proměnných a příkazů. + + + + + + + + + + + +Icona v panelu KDE + + + +Menu icony v KDE panelu + + + + + + + + + + + + + +Menu + + + + + UPS + + Slouží pro výběr UPS-ky + + + + + + + Zobrazení Ups proměnných a příkazů + + Vypíše Ups proměnné pro zvolenou +UPS-ku + + + + + Spuštění okamžitých příkazů + + Provede na UPS daný okamžitý +příkaz + + + + + Nastavení UPS RW proměnných + + + Provede změnu UPS RW proměnné + + + + + Obnovit Spojeni + + + Obnoví spojení s UPS serverem (upsd) + + + + + Nastavení + Nastavit &knutclient; + + + Aktivuje konfigurační dialog + + + + + + O aplikaci &knutclient; + + + Zobrazí informace o aplikaci &knutclient; + + + + + Minimalizovat + + + Zavře hlavní okno + + + + + Konec + + Ukončí činnost programu + + + + + + + + + +Zobrazení proměnných + +Toto okno zobrazý seznam všech proměnných a okamžitých příkazů, které existují pro zvolenou UPS-ku. + + +Okno proměnných a okamžitých příkazů + + + + + + + + + + + + Okamžité příkazy + + Okamžité příkazy jsou vykonávány přímo na na UPS-ce, NUT server + předává požadavek na příkaz příslušnému ovladači (driveru) a ten + pak příkaz vyvolá na UPS-ce. Okno pro ovládaní Vám nabízí ty + příkazy, které příslušný ovladač (driver) podporuje. + + + + + OK + + Tlačítko OK provede vybraný příkaz. + + + + Zrušit + + Tlačítko zrušit zavře okno. + + + + Příkaz + + Zde je možno vybrat příkaz který je pak následně vykonán + + + + + + + + Uživatelsky měnitelné (RW) proměnné + Uživatelsky měnitelné (RW) proměnné jsou skupinou + proměnných které muže měnit přímo uživatel, většina z nich je + přímo ekvivalentní nastavení příslušné UPS-ky. Uživatelsky + měnitelné proměnné jsou dvojího typu znakové (CHAR) a výčtové (ENUM). + Znakové proměnné jsou prostý řetězec znaků o definované maximální + délce. Výčtové proměnné je seznam povolených hodnot na které muže + být proměnná nastavená. + + + Uživatelsky měnitelné proměnná není změněna na serveru NUT-u + (upsd) ale sever pouze dá příslušnému ovladači (driveru) příkaz ke změně, + ten ihned provede změnu nastavení UPS-ky. Tato činnost není okamžitá a + může trvat i několik sekund. + + + + + OK + + Tlačítkem OK je změna proměnné provedena. + + + + Zrušit + + Tlačítkem Zrušit je okno zavřeno. + + + + Implicitní + + Tlačítkem Implicitní mužeme obnovit současnou hodnotu proměnné. + + + + Proměnná + + Zde je možno vybrat proměnnou která bude změněna + + + + Hodnota + + Zde je možno u znakové proměnné zadat, nebo u + výčtové proměnné vybrat její hodnotu. Nabídkové pole se automaticky mění + podle typu proměnné. + + + + + + + + + +Nastavení aplikace &knutclient; + +Okno pro nastavení má pět částí Nastavení, UPS, Panel Písma a Analog. + + + Nastavení + + Část NASTAVENÍ slouží pro nastavení počtu sloupců analogových panelů, barvy +pozadí hlavního okna, + vstupního napětí (120/230)V, frekvence vstupního napětí (50/60)Hz a povolení +použití hodnot + Xfer (LowXfer a HighXfer) + + + + &knutclient; + + + + + + + + + + + Počet sloupců + + Určuje maximální počet sloupců pro analogové panely + + + + Použít vlastní barvu pozadí + + Dovoluje zvolit vlastní barvu pozadí pro základní okno. + + + + + Barva pozadí + + Umožňuje zvolit barvu pozadí + + + + Použít dialog "Jste si jistý" + + Při aktivaci, se při ukončení programu objeví + dialog "Jste si jistý" který vyžaduje potvrzení, jinak + se program neukončí. + + + + + Použít hlavní okno když program startuje + + Nastaví zobrazení hlavního okna při startu programu. + + + + + + Zobrazit okno zpráv, když program hlásí chybu. + + Povoli zobrazení okna zpráv, kde je zobrazen popis chyby. Má význam jen, když není zakázáno dokování programu. + + + + + + + Vstupní napětí + + Umožňuje vybrat vstupní napětí 230/120V. Položka + nemá význam pokud je zároveň zvolena + položka Použít High-Low XFER. + + + + Vstupní frekvence + + Umožňuje vybrat vstupní frekvenci + 50/60Hz. Položka nemá význam pokud je zároveň zvolena + položka Použít High-Low + XFER. + + + + Použít High-Low XFER + + Nastaví vstupní napětí a vstupní frekvenci na + základě hodnot v proměnných NUT-u LOWXFER a + HIGHXFER. Tyto proměnné udávají rozpětí hodnot vstupního + napětí, které muže UPS-ka ještě bezpečně zpracovat. Na + základě těchto hodnot &knutclient; nastaví vstupní + napětí a vstupní frekvenci pro panely které je + používají. Například vstupní napětí, vstupní frekvence + apod. + + + + + + + + UPS + + Část UPS slouží pro nastavení seznamu UPS-ek a jejich + parametrů. Levá část obsahuje seznam UPS-ek. Pravá část tlačítka pro + přidávání, změnu parametrů a smazání záznamu o UPS-kách. + + + + &knutclient; + + + + + + + + + + + Přidat + + Přidá do seznamu další UPS-ku a nastaví její parametry. + + + + + Úpravy + + Změní parametry vybrané UPS-ky + + + + Smazat + Smaže UPS-ku v seznamu + + + + + + Nastavení parametrů + + Toto okno slouží k nastavení parametrů UPS-ky. + + + + + + + + + + + + + + Název + + Určuje jméno UPS-ky pro program &knutclient; + + + + Adresa UPS + + Určuje adresu počítače ke kterému je UPS připojena. + Tedy adresu UPS v síti. + Příklad : ns.alo.cz, localhost, 192.168.1.12. + + + + Jméno UPS + + Určuje jméno UPS tak jak je definuje NUT. + Pokud není ups definováno, je automaticky použita první ups v seznamu + systému NUT daného pc. To platí jen za předpokladu že minimalní + verze upsd je 1.3. Blíže v dokumentaci k systému NUT. + Příklad : victron, myups, apc700 + + + + Zpoždění (ms) + + Určuje interval mezi dvěma přenosy dat (čteni dat) ze + systému NUT. + + + + Port + + + Nastaví port na který se &knutclient; připojí. + + + + + Uživatelské jméno + + Určuje uživatelské jméno (USERNAME) které + &knutclient; použije při prokázaní totožnosti uživatele + serveru to jest, programu upsd + + + + Heslo + + Určuje heslo (PASSWORD) pro pro prokázaní + totožnosti uživatele. + + + + Store NUT password in configuration file. + + + Při zvolení této volby bude heslo uloženo do + konfiguračního souboru. V konfiguračním souboru je + heslo uloženo nezašifrovaně. Pokud nebude tato volba + zvolena bude heslo po ukončení programu zapomenuto. + + + + + UPS Proměnné + + Umožňuje vybrat proměnné které budou zobrazeny + na analogových panelech v pravé části hlavního + okna. + + + + + Parametry Uživatelské jméno a Heslo mají význam jen + pri použití okamžitých příkazů a změnách RW proměnných, při + sledování stavu UPS-ky není uživatelské jméno a heslo + potřebné. Heslo (PASSWORD) a uživatelské jméno (USERNAME) + mají své ekvivalenty v systému NUT v souboru upsd.users. + + + + + + + + Panel + + Část PANEL slouží pro určení které informační části hlavního panelu budou +zobrazené + + + + + &knutclient; + + + + + + + + + + + + + Přetížení + + + Povoluje/zakazuje zobrazení přetížení. + + + + + + Baterie je vybitá + + + Povoluje/zakazuje zobrazení vybití baterie. + + + + + + + Vyměnit baterie + + + Povoluje/zakazuje zobrazení nutnosti výměny baterie. + + + + + + Kalibrace UPS + + + Povoluje/zakazuje zobrazení kalibrace UPS. + + + + + + Výrobce + Model + + + Povoluje/zakazuje zobrazení výrobce a modelu UPS-ky. + + + + + + Výrobce + + + Povoluje/zakazuje zobrazení výrobce UPS-ky. + + + + + + Model + + + Povoluje/zakazuje zobrazení modelu UPS-ky. + + + + + + Sériové č. + + + Povoluje/zakazuje zobrazení sériového čísla UPS-ky. + + + + + + Verze Firmvare + + + Povoluje/zakazuje zobrazení verze firmware UPS-ky. + + + + + + Runtime + + + Povoluje/zakazuje zobrazení doby po kterou je UPS-ka schopna po výpadku + napájení dodávat el. proud. + + + + + + Použít vlastní barvu pozadí + + Dovoluje zvolit vlastní barvu pozadí pro hlavní panel. + + + + + Barva pozadí + + Umožňuje zvolit barvu pozadí pro hlavní panel. + + + + + + + + + + Písma + + Část PÍSMA slouží pro výběr používaných písmen. + + + + &knutclient; + + + + + + + + + + + + Použít vlastní písma + + + Povoluje/zakazuje možnost vybrat vlastní písma pro Hlavni panel a Analogové +panely. + + + + + Hlavní panel / Analogové panely + + Určuje pro který panel se bude vybírat písmo. + + + + Požadované písmo + + Vybírá písma pro zadaný typ panelu. Má význam + jen tehdy pokud je vybrána položka Použít + vlastní písmo. + + + + + + + + + Analog + + Část Analog slouží pro nastavení barev na analogových panelech. + + + + &knutclient; + + + + + + + + + + + + + Použít vlastní barvu pozadí + + Dovoluje zvolit vlastní barvu pozadí pro analogový panel. + + + + + Barva pozadí + + Umožňuje zvolit barvu pozadí pro analogový panel. + + + + + + Použít vlastní barvy + + Dovoluje zvolit vlastní barvy pro následující části analogového panelu. + + + + + + Barva ručičky + + + Umožňuje zvolit barvu ručičky pro analogový panel. Standardní barva + je černá. + + + + + + + Barva OK rozsahu + + + Umožňuje zvolit barvu podbarvení stupnice pro rozsah správných (OK) + hodnot. Standardní barva je zelená. + + + + + Barva rozsahu varování + + + Umožňuje zvolit barvu podbarvení stupnice pro rozsah varovaní. + Standardní barva je žlutá. + + + + + + + Barva rozsahu chyby + + + Umožňuje zvolit barvu podbarvení stupnice pro rozsah chyby. + Standardní barva je červená. + + + + + + Barva stupnice + + + Umožňuje zvolit barvu stupnice pro analogový panel. + Standardní barva je černá. + + + + + + Barva písma + + + Umožňuje zvolit barvu písma pro analogový panel. + Standardní barva je černá. + + + + + + + Vylepšení zpracování ručičky + + + Umožňuje vybrat grafický způsob zpracování ručičky. + + + + + + + + + + + + Dokovaní + + Část DOCK slouží pro nastavení parametrů "dokovaní" programu. + + + + &knutclient; + + + + + + + + + + Typ zobrazení v doku. (Dokem je míněn panel KDE.) + + + + + + + + Obrázkové + + + Nastavuje obrazkový typ icony. + + + + + + + Obrázkové + + + Nastavuje souhrny typ icony, pouze pro specialisty. + + + + + + + + + Prvky ToolTipu. (ToolTipem je míněna "bublinova" napověda.) + + + + + + Výrobce + + + Povoluje/zakazuje zobrazení výrobce UPS-ky. + + + + + + Model + + + Povoluje/zakazuje zobrazení modelu UPS-ky. + + + + + + Sériové č. + + + Povoluje/zakazuje zobrazení sériového čísla UPS-ky. + + + + + + Verze Firmvare + + + Povoluje/zakazuje zobrazení verze firmware UPS-ky. + + + + + + Runtime + + + Povoluje/zakazuje zobrazení doby po kterou je UPS-ka schopna po výpadku + napájení dodávat el. proud. + + + + + + Kapacita baterie + + + Povoluje/zakazuje zobrazení kapacity baterie. + + + + + + + Zatížení UPS + + + Povoluje/zakazuje zobrazení zatížení UPS. + + + + + + + Použít vlastní barvu pozadí + + Dovoluje zvolit vlastní barvu pozadí pro iconu v KDE panelu, když typ zobrazení icony v panelu je obrázkový. + + + + + Barva pozadí + + Umožnuje zvolit barvu pozadí. + + + + + + + + + + + + + +Otázky a odpovědi + +&reporting.bugs; +&updating.documentation; + + + + +&knutclient; nepracuje ale program upsc ano. Co mam dělat ? + + + Zkontrolujte nastaveni čísla portu. Od ver. 0.5 (NUT) je změněno číslo +portu 3493. +Klikněte na odkaz pro další +údaje. + + + + + + + + +Credits and License + +&knutclient; + + +Program copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008 Daniel Prynych Daniel@prynych.cz + + +Documentation copyright 2003, 2004, 2005, 2006, 2007, 2008 Daniel Prynych +Daniel@prynych.cz + + +Translations done by: + + +Daniel Prynych Daniel@prynych.cz Čeština + + + + +&underFDL; +&underGPL; + + + + +Instalace + +Jak získat &knutclient; + +&knutclient; není částí KDE projektu +http://www.kde.org. +&knutclient; může být nalezen na +ftp://ftp.buzuluk.cz/pub/alo/knutclient/ + + + + +Požadavky + + +Pro úspěšné použití &knutclient; potřebujete KDE 3.x.x + + + +Seznam změn můžete najít na +http://www.knut.noveradsl.cz/knutclient/. + + + + +Překlad a instalace + + +Pro překlad a instalaci &knutclient; napište následující příkazy v základním adresáři +Vaší &knutclient; aplikace. + + +% ./configure +% make +% make install + + + + +Od doby kdy KDE aplikace používají autoconf a automake, +nemůžete mít žádné problémy při překladu. Jestliže přesto vzniknou +nějaké problémy hlaste je prosím do KDE konference. + + + +&documentation.index; + + diff --git a/doc/cs/knutclient-cs.png b/doc/cs/knutclient-cs.png new file mode 100755 index 0000000000000000000000000000000000000000..cb36d295678ed389b77b5c98d3a71be01e1d8ef1 GIT binary patch literal 42103 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 PfFJ`sV_l-QW5oXeDLgz; literal 0 HcmV?d00001 diff --git a/doc/cs/ksetting-cs.png b/doc/cs/ksetting-cs.png new file mode 100644 index 0000000000000000000000000000000000000000..ae4e047745e18ef9f64fae03ad9b14839c3bd39a GIT binary patch literal 21873 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 S0uxmT#M;~rUS@Xr-hTis2_6Rk literal 0 HcmV?d00001 diff --git a/doc/cs/mkicker-cs.png b/doc/cs/mkicker-cs.png new file mode 100644 index 0000000000000000000000000000000000000000..8c7f0c1d12097506146b8197a29b3a53e3116580 GIT binary patch literal 33881 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%0AB2viFNAk5=p22M*NvSC+idCtx{SryW`@e1vk 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 PqYKPH+|sSqz90T?tU*Xa literal 0 HcmV?d00001 diff --git a/doc/cs/new-cs.png b/doc/cs/new-cs.png new file mode 100755 index 0000000000000000000000000000000000000000..3324d179182763e969b23866935a8380aabd6819 GIT binary patch literal 14626 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 literal 0 HcmV?d00001 diff --git a/doc/cs/tkicker-cs.png b/doc/cs/tkicker-cs.png new file mode 100644 index 0000000000000000000000000000000000000000..e6628399d7b28ba1ce66d8b90d528623c9a4f0a2 GIT binary patch literal 11405 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 bjP3segu{6k-x9F`00000NkvXXu0mjfPIk?; literal 0 HcmV?d00001 diff --git a/doc/cs/usetting-cs.png b/doc/cs/usetting-cs.png new file mode 100755 index 0000000000000000000000000000000000000000..c53b8dc6fbc7aad7398bf8dd9aca7ff17b55e562 GIT binary patch literal 17963 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 literal 0 HcmV?d00001 diff --git a/doc/cs/variables-cs.png b/doc/cs/variables-cs.png new file mode 100644 index 0000000000000000000000000000000000000000..da3a27408f7d74e871819eb284ebe3c094094ca0 GIT binary patch literal 18185 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 M?1*-#`_7;GFRR$r9RL6T literal 0 HcmV?d00001 diff --git a/doc/en/fsetting-en.png b/doc/en/fsetting-en.png new file mode 100755 index 0000000000000000000000000000000000000000..e90e3390a511714624206e7ac9601a169ae38797 GIT binary patch literal 22067 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 wL%1RMTxV;!Nr&ywPuY#zau98;feir=A_S +KNutClient'> + + + + + +]> + + + + + + + + + + + +The KNutClient Handbook + + + +Daniel + +Prynych + +
Daniel@prynych.cz
+
+
+
+ + + +2001 +2002 +2003 +2004 +2006 +2007 +2008 +2009 +Daniel Prynych + + + + +&FDLNotice; + + + +15/01/2008 +0.12.01 + + + + + +&knutclient; is GUI client for UPS system NUT. + + +This document describes &knutclient; version 0.9.5 + + + + + +KDE +kdeutils +KNutClient +NUT +UPS + + +
+ + + +Introduction + + +The &knutclient; is the application that watches state of UPS for system NUT. + + + + +Using KNutClient + + +Main window &knutclient; + + + + +Main window applications &knutclient; + + +The &knutclient; is the client graphics application for system NUT +"Network Ups Tools". It enables to watch the state of UPS and to show +values of variables which the choice UPS a its driver are supporting. + + + +From version 0.6.0 &knutclient; supports the running of instant command and +enables the change of RW variables. + + +From version 0.9.0 &knutclient; doesn't support protocol UDP. + + + + +Main window &knutclient; + + + + + + + + + +Main window is divided in two parts. + + +The left part "Main panel" includes next dates which show the state of the UPS choice. +On line, on battery, overload,replace battery,battery low, calibration,runtime. +There are unchangeable dates in this panel, name of UPS, serial number, +manufactured. This dates are reading only once, when you UPS choose. + + +The right part includes analog panels. These panels show values of variables like +input voltage, load UPS, battery charge, UPS temperature, battery voltage. + + +&knutclient; includes toolbar, with standard buttons and button for the UPS choice. + + + + +&knutclient; and KDE panel + + + +&knutclient; and KDE panel + + + + + + + + + +From 0.8.0 version &knutclient; docks in KDE panel. His icon is variable and shows +information about UPS load, runtime and the charge of battery, depending on type of icons is selected. + +After moving the pointer of the mouse on the icon, information window "ToolTip" is showes up, +which includes more information about UPS, Name, UPS name ,Address, State, Runtime .. + + + + + +More KNutClient features + +For connecting with server side of NUT (upsd), &knutclient; uses protocol TCP. +When UPS is selected in toolbar, &knutclient; tries to read the data. When +reading fails, reading is repeated. The maximum count of repetitions is five. +Afterwards &knutclient; reads data in periodical sequences. The first reading +reads all variables, next reading reads variables that analog panels, +RUNTIME a state of UPS show only. Variables show UPS name, manufacturer, serial +number ... are read only once, because their changes aren't probable. + + + +Errors which arise like answer from user actions are show in their own window. + + + + + + + +Command Reference + + + +The main KNutClient window + + + +The File Menu + + + + + File + Showing Ups variables and commands + + Shows Ups variables for selected Ups + + + + + + File + Running instant command + + Runs selected instant command for selected UPS + + + + + File + Setting RW variables + + + Changes selected UPS RW variable + + + + + + + + Ctrlq + + File + Quit + + Quits program + + + + + + + +Menu Connection + + + + + + F1 + + Connection + Reconnect + + Restore connection (reconnect) to UPS server(upsd). + + + + + + + + + +Menu Settings + + + + + Settings + Show Toolbar + + Shows/Hides toolbar. + + + + + Settings + Show Statusbar + + Shows/Hides statusbar. + + + + + Settings + Configure Shortcuts... + + + Opens dialog panels for configuration key/action associations. + + + + + + + + Settings + Configure &knutclient; + + + Opens main configuration dialog panels. + + + + + + + Settings + Using description + + + Shows/Hides tooltip for showing UPS variables and commands. + + + + + + + + + + +Icon in KDE panel + + + +Menu of KDE panel's icon + + + + + + + + + + +Menu + + + + + UPS + + Using for select Ups. + + + + + Showing Ups variables and commands + + Shows Ups variables for selected Ups. + + + + + + + Running instant command + + Runs selected instant command for selected UPS. + + + + + Setting RW variables + + + Changes selected UPS RW variable. + + + + + + + Reconnect + + Restore connection (reconnect) to UPS server(upsd). + + + + + + + Setting &knutclient; + + + Opens configuration dialog panels. + + + + + + + About &knutclient; + + + Shows information about aplication &knutclient;. + + + + + Minimalize + + + Closes main window. + + + + + Quit + + Quits program. + + + + + + + + + +Showing variables + +This window shows list of all variables and instant commands, when exist for selected UPS. + +Window of variables and instant commands + + + + + + + + + + + + + Instant commands + + Instant commands run in UPS, the NUT server puts the command selected driver and + driver will run the command in UPS. The control window offers commands, which + the driver supports. + + + + + OK + + The button OK runs the selected commands. + + + + Cancel + + The Button Cancel closes the window. + + + + Command + + The command for running is selected here. + + + + + + + + User changed (RW) variables + + User changed variables are group of variables which can be changed by the user. + Majority of them are equal to setting of UPS. There are two types of user + changed variables, char or enumerated variables. Char variables are a string of + chars with maximal length. Enumerated variables are a list of right values + for setting these variables. + + + User changed variable is not changed on server NUT (upsd) but the server + puts command for change to driver, it changes the setting immediately. This + activity is not instant and it can wait a few seconds. + + + + + OK + + ButtonOK changes variable. + + + + Cancel + + Button Cancel close window. + + + + Default + + Button Default sets default values +this variable. + + + + Variable + + Variable for changed is selected here. + + + + + Value + + Values for selected variable are selected here. + Array for changed of value is changes on base type of variable. + + + + + + + + + +Setting &knutclient; + + +The window for setting has got five parts Setting, UPS, Panel, Fonts and Analog. + + + Setting + + Part Setting is used for setting number of rows, analog panels, background color of the main window, + input voltage (120/230)V, frequency of input voltage (50/60)Hz and allowing of Xfer's values (LowXfer and HighXfer) + + + + &knutclient; + + + + + + + + + + + Number of columns + + This sets the maximum number of columns for analog panels + + + + Use custom background color + + This allows to use the custom background color of the main window. + + + + + Color of Background + + This selects the background color. + + + + Use dialog "Are you sure" + + + This switches on dialog "Are you sure" when you want to end the program. + When you don't acknowledge dialog "Are you sure", program doesn't stop. + + + + + + Use Main window when program started + + Sets showing main window, when program started. + + + + + Show message window, when program reports error + + Permits showing message window, what shows description of error. It's useful when docking of program isn't forbided. + + + + + + Nominal Input Voltage + + This selects nominal input voltage from 230V or 120V. The selection isn't + useless of "Use High-Low XFER" is switched on. + + + + + Nominal Input Frequency + + This selects nominal input frequency from 50Hz or 60Hz. The selection isn't + useless of"Use High-Low XFER" is switched on. + + + + + Use High-Low XFER + + This sets nominal input voltage and nominal input frequency on based values in variables of NUT LOWXFER and HIGHXFER. + These variables determine the range of value input voltage, which UPS can work with. + On the basis of thise values &knutclient; sets input voltage and input frequency for analog panels which use them. + These panels are input voltage, input frequency and etc. + + + + + + + + + UPS + + The part UPS is used for setting the list of UPS and their parameters + The left part includes list of UPS. The right part includes buttons for + adding, changed parameters and deleting the record of UPS. + + + + &knutclient; + + + + + + + + + + + Add + + This adds into the list another UPS and sets its parameters. + + + + Change + + This changes parametric selected UPS. + + + + Delete + This deletes UPS from list. + + + + + + Setting of parameters + + This windows is used for setting parameters of UPS. + + + + + + + + + + + + + + Name + + This sets the name of UPS for the &knutclient; program. + + + + UPS address + + + This sets name of PC. UPS is connected with this PC. + This name is UPS address on net. + Examples: ns.alo.cz, localhost, 192.168.1.12. + + + + + + + UPS name + + + This sets name of UPS as it is defined in NUT. When name is not defined + program uses the first name of NUT system list on this PC. + This is true when minimal version of upsd is 1.3. Look into NUT documentacion. + Examples: victron, myups, apc700. + + + + + + Delay (ms) + + + This sets the interval between two transmitions of data (reading data) from the NUT system. + + + + + Password + + This sets the password for the authorization of the user. + + + + Store NUT password in configuration file + + + When you select this selection, the password will be saved into the configuration file. + Password saved in configuration file not crypt. When you don't select this selection, + the password will be forgotten, when the program is ended. + + + + UPS Variables + + This selects variables which will show in analog panels + in the right part main window. + + + + + + + Parameters User Name and Password are used for instant command or change of RW variables only. + For watching the state of UPS the User name and the Password aren't needed. + The Password and The User name have got their equivalents in file upsd.users of the NUT system. + + + + + + Panel + + The part Panel is used for selecting which information's parts of the main panel will show. + + + + &knutclient; + + + + + + + + + + + + Overloading + + + Shows/Hides showing overloading + + + + + + UPS Battery low + + + Shows/Hides showing battery low. + + + + + + Replace battery + + + Shows/Hides showing that battery needs to be replaced + + + + + + Ups calibration + + + Shows/Hides showing UPS calibration. + + + + + + Manufac. + Model + + + Shows/Hides showing Manufacturer and Model of UPS + + + + + + Manufacturer + + + Shows/Hides showing Manufacturer of UPS. + + + + + + Model + + + Shows/Hides showing Model of UPS. + + + + + + Serial + + + Shows/Hides showing serial number. + + + + + + Firm. rev. + + + Shows/Hides showing firmware's revision. + + + + + + Runtime + + + Shows/Hides show the time of the runtime on battery without power. + + + + + + Use custom background color + + This allows to use the custom background color of the main panel. + + + + + + Color of background + + This selects the background color. + + + + + + + + + Fonts + + The part Fonts is used for selecting used fonts. + + + + &knutclient; + + + + + + + + + + + Use custom font + + + Shows/Hides allows to select custom fonts for the main panel and the analog panels. + + + + + Main panel / Analog panels + + This selects the panel for which the font is selected. + + + + Font + + This selects the font for the selection panel. + This is used when select Use custom font is selected. + + + + + + + + + + + + Analog + + The part Analog is used for setting color for the analog panels. + + + + + &knutclient; + + + + + + + + + + + + + Use custom background color + + This allows to use custom background color for the analog panel. + + + + + + Color of background + + This selects the background color of analog panel. + + + + + Use custom other colors + + This allows to select custom color of the analog panel's other parts. + + + + + + Color of pointer + + + This is used for selecting the color of analog panel's pointer (finger). Default color is black. + + + + + + Color of OK range + + + This is used for selecting color of range OK for analog panel. Default color is green. + + + + + + Color of warning range + + + This is used for selecting color of range warning for analog panel. Default color is yellow. + + + + + + Color of error range + + + This is used for selecting color of range error for analog panel. Default color is red. + + + + + + Color of scale + + + This is used for selecting color of scale for analog panel. Default color is black. + + + + + + Color of font + + + This is used for selecting color of font for analog panel. Default color is black. + + + + + + + + Digital processing of pointers + + + This is used for selecting type of graphics proccessing of pointers. + + + + + + + + + + + Docking + + The part DOCK is used for setting parameters of docking program. + + + + &knutclient; + + + + + + + + + + Type of dock's showing (Dock is KDE panel). + + + + + + + Picture + + + Sets picture type of icon. + + + + + + General + + + Sets general type of icon, for specialist only. + + + + + + + + + Items of ToolTip. (ToolTip is bubble help.) + + + + + + Manufacturer + + + Shows/Hides showing Manufacturer of UPS. + + + + + + Model + + + Shows/Hides showing Model of UPS. + + + + + + + Serial + + + Shows/Hides showing serial number. + + + + + + Firm. rev. + + + Shows/Hides showing firmware's revision. + + + + + + Runtime + + + Shows/Hides showing the time of the runtime on battery without power. + + + + + + + Battery Charge + + + Shows/Hides showing the Battery Charge. + + + + + + Load UPS + + + Shows/Hides showing the Load of UPS. + + + + + + + + Use custom background color + + This allows to use the custom background color of KDE panel's icon, when type of icon in KDE panel is picture. + + + + + + Color of background + + This selects the background color. + + + + + + + + + + + + +Questions and Answers + +&reporting.bugs; +&updating.documentation; + + + + + +The &knutclient; isn't working, but the upsc is. What shall I do ? + + + + +See the setting number of port. From version 0.5 (NUT) the number of port is changed. + + + + + + + + +Credits and License + + +&knutclient; + + +Program copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008 Daniel Prynych Daniel@prynych.cz + + +Documentation copyright 2003, 2004, 2005, 2006, 2007, 2008 Daniel Prynych Daniel@prynych.cz + + +Translations done by: + + +Daniel Prynych Daniel@prynych.cz Eng + + + + +&underFDL; +&underGPL; + + + + +Installation + + +How to obtain KNutClient + + +&knutclient; is not part of the KDE project +http://www.kde.org. +&knutclient; can be found on +ftp://ftp.buzuluk.cz/pub/alo/knutclient/, the +main ftp site of the A.L.O. + + + +Requirements + + +In order to successfully use &knutclient;, you need KDE 3.x + + + +You can find a list of changes at http://www.knut.noveradsl.cz/knutclient/. + + + + +Compilation and installation + + +In order to compile and install &knutclient; on your system, type the following +in the base +directory of. + +% ./configure +% make +% make install + + + +Since KApp uses autoconf and automake you should have not trouble +compiling it. +Should you run into problems please report them to the KDE mailing lists. + + + +&documentation.index; +
+ diff --git a/doc/en/knutclient-en.png b/doc/en/knutclient-en.png new file mode 100755 index 0000000000000000000000000000000000000000..44c2e263c3876d5a396d206760900c51b78324f8 GIT binary patch literal 41328 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

B8A9BYojz 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 literal 0 HcmV?d00001 diff --git a/doc/en/ksetting-en.png b/doc/en/ksetting-en.png new file mode 100644 index 0000000000000000000000000000000000000000..751d49cffe408f47a22f94664d3ddde917a574c4 GIT binary patch literal 21169 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�C5;qlq`9 zgyXX^|4V-0N$XA_Z7PFZTpay#Bwd;KqW|sSD7j+HR}y~Me1dW;|L)fJ6>Dz-zV?G+ zy%BGIgmkEcAu(yGiANMKPm(gAd+nW;Q$)9Gb#++N3U6&t zES`_{LN!bKBOXNr#Q7_%2LASdfV8z3=s^Caik!+4wW^RI4aNSy?>P+AewdcJ^{Gjq z2IvX)*O(A7%nW{D=n<#^s+_mc#Rqu^ffPqqbU!osYeC zdfSq&7Hp;ort+k-(wfDO_p1#`FTNhM6#m;Wgo8TeT|1Lic=OSx{LF`UzT`V(@_TMR z>QP_!a4I2^*KdlR%8OGAuG9XQewseGTDqC=DR1A>K3aun+{-4WfE2Ovurq8C=3!tp zZ?YWgVep|)*yUs>ZiBFd6@ za__{JO}fuGC_PF+tECegNL3I_a>2n0LVvXeF zLuN|Ro@*Pf7_b+1N%(&Gmy)(bU?!ghXm%ZJM z)AQyWyDIY$ywlQRrfJ%_-Ziy}*pC`ISRtM-h7%LNnRxbNeUD+ITJ^6X-c^VZW2+1sliWNA0}(NG)gc zpnN}^zJq63_N84uG8Oe6ww)BVGQ4-DCUz=2w_&1}R|qGzDqt~OlH%xHl$$hy+&`Jt zM3R>}FWD5rH(yj653g$ngy&YY>2yA{n&527KN&MVv=S{3CAOFPC?=C!K56LbjU4DD zhg#WNio$@s6$8#3;zls`tL~-KYGZVFNs%|ptE{fdU+z%BKH7Y|V_H)n39pV8vC!WL zCp**BF7ur0+%>d~J8K2(&%H{62Z1YPdbUYEea!eC?(g>!TaXBRJl$LA^uu?xGgkOS zBQPT;&ssvb=0O(+pYY4n7+Ut(N8J!tGV&XQZouubv{d)g+k&5C`?VZtAgw5Ym*Cjx+HZ;sICD+^UKxO&BxB zCSS`R3vUG19CV!q36JV>z{(0@mB;JdxVDsg0yA%jL(uB*A&rZ*b zGdsdt$jX&tm@N1Iq_(~@7(8__a(K>;$`3qeXVLx9n_aBTwW~$X?`b^_ZPX3_jZkwy z@%|Q4<+Z}wnxhW+)&U?}=2TYMJkq>ibke|;xvVNs&=S#}ArG1Vs?}0D5lI2L62Q36 zJ}$aUd!r>Q4DaPxYk@G?|vaLVi-1g?*aB-ca z%sV-Ly_(Y#mwQ4$QyLMb2Gf(vzMqm<8u%75V*X`xOQzyXOzfd>l?9jJN5}G5!MDtE z7Ro=+TVv)9iFrMCYG~W5*btSZ8fgL~pu{EQNK&U$P{H#Fot9rz^!_4OztaIxTOmf9 z?m!?v>^6Wvto~t9`?O%@QQ)8p6!J|!7h`L*t!iWHYNGW?NXNGMkP-47e7%pCUtF6% z&QBlms$4y%cGrPq9kYNye7*$>vmIvf^uDu6qdE{(P_ysZ^GV4$WfcA>FI@+siE3YrgQmdpSE literal 0 HcmV?d00001 diff --git a/doc/en/mkicker-en.png b/doc/en/mkicker-en.png new file mode 100644 index 0000000000000000000000000000000000000000..8a5328fc6b6d28e778ef0a4729f06db5e6347957 GIT binary patch literal 38389 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 N002ovPDHLkV1n9=F%|#- literal 0 HcmV?d00001 diff --git a/doc/en/msetting-en.png b/doc/en/msetting-en.png new file mode 100755 index 0000000000000000000000000000000000000000..003142305dc7c539d342813ee0f5ba8e9e9ce578 GIT binary patch literal 21737 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 literal 0 HcmV?d00001 diff --git a/doc/en/new-en.png b/doc/en/new-en.png new file mode 100755 index 0000000000000000000000000000000000000000..3814a636fc7c2f01d1b3573b4f56f84e929f8ff6 GIT binary patch literal 14297 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 Zd8cJx`hLG1{GUBQT~%A9?B3&${{h7M@74eS literal 0 HcmV?d00001 diff --git a/doc/en/psetting-en.png b/doc/en/psetting-en.png new file mode 100755 index 0000000000000000000000000000000000000000..79fdae291ea84c9fc43d25e366110ce35b9519cc GIT binary patch literal 21043 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 )C*hZe22qDfQT7XTrXSaZF`3k6Nc>QeN94lPj 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�KgdYFN}z)t`h;Y(#R1xB5;y~!b)`aCOW$p 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 NDy1k{^wKEse*r45!7u;- literal 0 HcmV?d00001 diff --git a/doc/en/variables-en.png b/doc/en/variables-en.png new file mode 100644 index 0000000000000000000000000000000000000000..c54950db6447413b9efabffb29ca8bf8f71accea GIT binary patch literal 18492 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 r;Qjf|o0i8HKRz7Z1) literal 0 HcmV?d00001 diff --git a/installDeb.sh b/installDeb.sh new file mode 100755 index 0000000..a4e70f3 --- /dev/null +++ b/installDeb.sh @@ -0,0 +1,9 @@ +#!/bin/sh +make -f Makefile.cvs + +[ ! -f Makefile ] || make clean +export kde_htmldir=/usr/share/doc/kde/HTML +./configure --prefix=/usr + +make +make install diff --git a/installFedora.sh b/installFedora.sh new file mode 100755 index 0000000..8412d92 --- /dev/null +++ b/installFedora.sh @@ -0,0 +1,9 @@ +#!/bin/sh +make -f Makefile.cvs + +[ ! -f Makefile ] || make clean +export kde_htmldir=/usr/share/doc/HTML +./configure --prefix=/usr + +make +make install diff --git a/installMandriva.sh b/installMandriva.sh new file mode 100755 index 0000000..8412d92 --- /dev/null +++ b/installMandriva.sh @@ -0,0 +1,9 @@ +#!/bin/sh +make -f Makefile.cvs + +[ ! -f Makefile ] || make clean +export kde_htmldir=/usr/share/doc/HTML +./configure --prefix=/usr + +make +make install diff --git a/installMandriva4.sh b/installMandriva4.sh new file mode 100755 index 0000000..7ac078b --- /dev/null +++ b/installMandriva4.sh @@ -0,0 +1,13 @@ +#!/bin/sh +make -f Makefile.cvs + +[ ! -f Makefile ] || make clean +export kde_htmldir=/opt/kde3/usr/share/doc/HTML +export KDEDIRS=/usr:/opt/kde3 +sh ./configure --prefix=/opt/kde3 + +make +make install + +mv /opt/kde3/share/applnk/Utilities/knutclient.desktop /opt/kde3/share/applications/kde/ + diff --git a/pics/Makefile.am b/pics/Makefile.am new file mode 100644 index 0000000..973f792 --- /dev/null +++ b/pics/Makefile.am @@ -0,0 +1,8 @@ + +METASOURCES = AUTO +kncpicsdir = $(kde_datadir)/knutclient/pics + + +kncpics_HEADERS = knc_conn.png knc_error.png knc_main.png knc_ups.png \ + knc_batt.png knc_mpref.png knc_panel.png knc_mset.png knc_upses.png knc_analog.png \ + knc_dock.png diff --git a/pics/knc_analog.png b/pics/knc_analog.png new file mode 100644 index 0000000000000000000000000000000000000000..259a5f65da3924c417ecd8f556e97e2bd5d1a3fc GIT binary patch literal 1495 zcmV;|1t|K7P)56G6V}5r2qg0Wl2Oq zR9M5smtAO6XBdE=b53%apEhmUCd*Re?9z}~#&8yKbpBL(Bi;>mQRaorF+@8Y3~$DE zSH{?_Sk!s5Yo}feCIfY_3+G*JirwlMS&Zh;{GOBKoYU0gB)gam9%8kdqrMRM$oGBk z_wfE7;r#h;0b0Bq5gb74`0&(y3lS-v6|%37k$RgM)(%4-ZqT)yQNrM59r>UT?=8%d!XtgWS7!kA3_0p(qM{ zeSHXm@b3YD_9L<^xBuI^b?Y;o>ht;9XNHG|pBn^@jYdnO)gU8f_)YqaKea!}59FyB z6{vzQCHO04>WxoS(;a`7+-dKXdH6zi5aJJZTT!SG~B( zE-c-mF4fT$ot2>#98Cx3k8a~g_av+DzfWVw4n#@%mjI0h&Yyn5I&+3U=H?jd?d6?A zd-$e$oVUfDY1Q%9?7{4nzaAAI})%hhG>H0RjU`~~^aCH}a0kzBIGzt6Ei9mX@ddB{`YYm_Z&EpR3T=9t!GQrjYylRm<&Mkm!te8w$ztttV@uyOBA3jX&+&QqU zP78QG`GotIE+N179(?^Zoi>RuKWm%L; zB@&4QgM))~b#<}4yi6n#VR&ka)yYX#KmQ!_%P;9)Sb*tiy9MMcR~VX^p?To~tw7)( zcSsV!U=Y(ZsZ=V+vP?RirdTYZ>pHnyj%YMWsZ_%2^|sF^lSvdsL6W3)k!l43G%s8r zG&6&IUWPovQ& z(P;F!xxeMuF^a{a9YE7Gve_)AX;LbcD3{9|Ja~{$DD+Ha`FtKh5Y{cXwOWm9*RIju z-%qt#rK_t8x7&^1@3+T5Bod+3YSC;q*|lpI;c)nwO=L}$mzV$XaqH|F zJdUcWcsw3NQS6KXm&-*g7Q?bEd_Et=VsS&Y{K10W~vzkeTqdcBUzQ*))K1x!hixrn&h5s;aiv zhGA?zKt7*;VSsiaN~KaHlSv#72TrGxxw$!x967?m!UBRIuy^m?juHIHA!H)}xm*sz zFv#cgcsw3EfMFPnjg6sc8i_=LSS&`lTt-@Fpp+zu>FH?#fdHziGBq{zT!3IO$knS? z86O{~P$<{|+-^6DqTqBonV6U$l}gdu+lwsA>vlR(6gTwnlXBp|0sMY{C%{@1Tb4yS xokkQzn~B#h{2!9ZWNa}Y0IkKv-(Sk-`QJjCS3gtuuTKB~002ovPDHLkV1lX0(EtDd literal 0 HcmV?d00001 diff --git a/pics/knc_batt.png b/pics/knc_batt.png new file mode 100644 index 0000000000000000000000000000000000000000..e8ff202eec67445a519624a0d98620afcdf45098 GIT binary patch literal 263 zcmeAS@N?&q;$mQ6;Pv!y2?Ej*Ak4uABp;O9{s2;JN#5=*4F5rJ!QSPQfg+p*9+AZi z4BSE>%y{W;-5;PJdx@v7EBg&5elBj^-OI}N0EMP{x;Tb-9Dh5-o9nQGh^xPs;^e;D zxjO{JA6|-S;Vyh}A@g8hrnQ#JWHlF+BSOyV?;AL#|Gp<$ukdH~JL~<8au%kqelzKv zZa8SUJ#y*RW!KEV+W9AWX&Or=Z@4CQbgSJ1zB|tvB$6NASj-qM_3o#ZJ6p{rV-7`; zK3k~|C-No+WfgngtIn$JzW3Q$LaJ|hjbW3*p935dGCaiB?Uy%R+00(qQO+^RR0T>G`F~r1&CjbBf?@2^K zR5;6hlS^ovWfX>=^L_tJlbOt~Thl(tc+4)7%1}0XilnWn!{&dJPe%?--DxJVl=|6m>BV%CaS34(~!YV+qs^x_@2U;cXb%H0NZ(R|Da(Nz5jDbib z0)TU1&$dx2M>?aO?N7yh_S7x+^JuV!*=m(@%UsC^My!g6iijo>NwwChoJ(oo1I_$$ zP*1bo--xykg!OZ+ilZZd#$f)ELgtl~!8jV&o2#Wf|`T?DI4*g*_daRB8%l{%+ z>|0eGAXKYWKoKz*6QZ?xdYg|hH49;$ebzF-3g~|&Dq_@_RSK$^4X^272l`PvFRipF r{11n_lJQ%8I9O9o?iu00N;CfeS&~jO^ZZRg+7F)_f2(46bBnzenRrLo!k?2sd^ErSuVxg)!RHB8i;4Y<0q70s(#SBhm zlMpMRl84lBhhQmAa@e`X$-tAWv+vILe(!(p?sULox0v@*E+4tGa=N?wKIW?^myg_8 zo98<*2=e>JocR8@0{|ModMKtEbO5@pug+?<`lZ!_bymcMtRR_WMgTl>z|bqOw!TJgRAk_7 zztr}A_?oi3;QOwd#@Hd4AONvYfGCRN8)XIf)-Mg??}$Uib)mQ}KK~>yus{HgCgI-NV1rum=( z_ngxQux%Ry8y8UlmSv&==(O9o)-*_x1WA&J3Or3m1Yj5@nvF)F0)mi;20+uUpsH%% zK)KvvG-tv2_j3S1tyX)m-|J#>R3PuP&ja-vgAQQ-@BsUV2NOp&ycNTwRDjk$Qp00(qQO+^RO3?30H1VOR+y8r+Imq|oH zRCt`FlRZcrK^(<@=S6X05g}p{Q3<&tT3D0+10 zLM%f-5F4x8N{%#Fh}wus0*VlFMN$Zg&ti7(du<#T9?ZP={_j5@@W2rR5a=_ktiUbs z7-+QHJC`v23-}3~LF_u<8z37C^rT^1pi#I0{sIL%CD2KLFGI2Hf+B&sI7ORo*3W@@TbNk?+IC4SeV?15(5l}RVz(w0<-i^0{w339E&>47nDUWnQX{- zYZ7Sj$+vZe^fbz#nTp;^CIaCj(%-+*ua0VALx5LN&H!d^4GsqHqd>jt_{bz}3-djn zHtQt_$Mb5j2@laN$hcb)Xur8{GRojBa2Sd+-Q98=$M&Ag3m;{srhnXbjjN+@8Hzp6 zlk2+01R(L@csbWK@V?rl0U!+nyU?Bj_L`b1t^c=LJWbrZp3P-}6p*b*QvUiJ$C2y0 zipS$B-sCf#^GYLp)T4lJWck5w0uN}d?aT+>K!Ph;I3OSUSIxKsHrd-7Arg!!00000 LNkvXXu0mjf9OvHK literal 0 HcmV?d00001 diff --git a/pics/knc_main.png b/pics/knc_main.png new file mode 100644 index 0000000000000000000000000000000000000000..d4af4ac6918813ec68b37cabed8781a89a2c2be7 GIT binary patch literal 731 zcmV<10wn#3P)SlkL)P`XmYw%{M2pa>ByC5_dEf>=?+mT0k|rcD}~mr3Sb7jH(N z&CGiX4_xNnnRCxQ_sq=q^1l#DpG0l_3N~Q?)oh%hic<;o1glskYIa((r)}mK_TxTm z!%&-elV}dV<42q#%oDA56CT5R*|i_FY_V)dQ4sa62-YxZpUmeNfIMTlPe=(^Q zSV^k|&IjZ3!Nb#maLK0dgrHch&2fUoZ2JWW^epiFhwS}`b31RfedJ!V;VjW_W#TZ3 zllZgHaWxL!pA42pgGMcw-5s1f`l`pnNSR=qT^I4GR(>0i#(Xfv>An21m18gP`J<_W zO23ReiUz*N(gsF^W`!>fQmgae1jnZsHt4{$fle{x&hNx&g)gr+sD2#?tyXOWqigTl z7j}0NgeETFdLgU2#@qYY^({AFSxNcqS%$W-73aG!SYbLe$8Ut#DnFTcp)6U!d*SGOoO;}Hy(M)A_eB)e#&O#Q$EeM{c3 z+)a28b!;i7MO?i*x6i^hE{P2^x>mOuZqIKvn?)rc`*&ikGp5gF<9!=TzzxDFu4zTG znx?6lnVB|PE$>wHO5EcYv2R4tQdyzTg@4AL%uo3V36Y>`6?2_ve*-O9&lq`l8PNa$ N002ovPDHLkV1oIJUTOdU literal 0 HcmV?d00001 diff --git a/pics/knc_mpref.png b/pics/knc_mpref.png new file mode 100644 index 0000000000000000000000000000000000000000..a9e2bc1438cb1e5160f4c2ec2a5e071b2d2128f2 GIT binary patch literal 1333 zcmV-51$Qp00(qQO+^RT2^b7A3)#F~egFUj!%0Lz zR9M5smwRkeRT#j3r|;d-J=mDGgD?YZq=OEG0*MkOCMLwCU;-*6B!mF-5y^a!Nk|+9 zhzf~_AqM|Y6914mi8`F17&CQ(Y$h<2NfDV0w$j)r8>ZmgRdp{vF(`Et)a z_uPEH`#sKgu3%zW2-tvZpkQb&8~78X1_VHSL53ny#`DmzMo3XAr7RsXZXf?OIXvhB zyg(0d95@H!hsnaoJ69h50KOmh`dYyJ^`-tKg&;doP__V#zMu8$9wCmAK~+Q3=?J02s{IE5Hk%EH!@G#91aIlvkk1+@-hIyNSrLA0kd($ z=LH3KF=P5v*fn_%=*F9DZ*QlqtqsprA2V~z0CYz+d?6KIze-Tm@b#-0_3-?Y>v$r( zZ_)r_qSJ=Ubl6u@KHr6Vc`3{0O(WYNXz@l+EGBFwc;nz#qAdR z{eD_nS_n5Dpt-4m`tL7u;aUIymra3z0lb=#?c1uzn^s8C@(nWGD!Ah#)i6Zeso%KT z*#|&b?jVtvidTgl&pm}}k(1JuRWhA@pg5fj4mTd)L}Vkm%2qa2&c&=K6k8K?hE%+k zWH|P|`40JOtEDyDg0Huq#g19Lzo%ME1TZJvI*vCV;V2t{Bt-5|xeh}-y?HYO@hH}u zZ1S@VT=V=wsA{+T`0!3K3P4IZTL@7$nayM@ghg*e(I-DLswki+1b~1FCC){>zH|u& zt63i1|B^7IB;bc*4JZY^t0~zG9#=q>fq>8IbrxF#GO2wmiNXzrRPO zhQOZsE0$V<>Ey&Qs@Gd$3q z0cw|(Wbw^cb>vx$QJNzHD~Odc00000NkvXXu0mjf1+Q<) literal 0 HcmV?d00001 diff --git a/pics/knc_mset.png b/pics/knc_mset.png new file mode 100644 index 0000000000000000000000000000000000000000..45f3e63429f8b26816a1408d60ceb0bd2adb55b8 GIT binary patch literal 1599 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 literal 0 HcmV?d00001 diff --git a/pics/knc_upses.png b/pics/knc_upses.png new file mode 100644 index 0000000000000000000000000000000000000000..69eebbadd0878cd86f75a4458f0a344ec08d975b GIT binary patch literal 943 zcmV;g15o^lP)ww1`?pi=c%&U%U3zGW%GB z&_Wp6SfOLkLW+VSX^KqjYii0Q8-0#7r^S6U&YQ2EzKPD`aL)Zc?|<(-=Uhc0tpn$v3P{SHJm8dom=>T>EJAe&^-6f+u1zrH}fI(mi)Q{B~A?{fO zmCj)ikh>sO z2t3w@=>L!bECR2A4p$?(Wf}hN?5$|>YREa)TTq;by=(!%gzFKeDkk@M*#dyH>&5$R z|K*fhF*yUQg@z@VwSZ5+N8mG%0QIZf)J?9pz$_uNeHt?k>jx?w1Gx!O9--deUc=)V zC^Vquxn^Vmh)VM|8Cf>2i$B(aC6 zJUu&AqmJAM2X%4e7!VnS!_NU9^e=)L2c7{BSB}7i5_er z#b&GfcW1yEzag^&n9$s%)v8py0D*8gT(E2;5^;|Jz`+qXdkHS~LEl9e;j|>8x?$cN)qR%<|Q~@

^okv%r!qh4Z7ge&L?VG@Svo6o&^&M6j03S^!=D;n z7Kb@fsbNy7QQ&8eE6z|_;8hIf?gQWQqXuwQt#ak|(pT3J3)1$ZXQEV6`UgpfvpDT9 Rz-|Bl002ovPDHLkV1n#Kq%8md literal 0 HcmV?d00001 diff --git a/po/Makefile.am b/po/Makefile.am new file mode 100644 index 0000000..5ab765c --- /dev/null +++ b/po/Makefile.am @@ -0,0 +1,3 @@ +POFILES = AUTO +noinst_HEADERS = cs.po de.po es.po fr.po it.po knutclient.pot pt_BR.po \ + ru.po uk.po pl.po diff --git a/po/cs.po b/po/cs.po new file mode 100644 index 0000000..0bbef63 --- /dev/null +++ b/po/cs.po @@ -0,0 +1,837 @@ +# translation of cs.po to +# Daniel Prynych , 2003, 2004, 2006, 2009. +# Daniel Prynych , 2008. +# Daniel Prynych , 2008, 2009. +msgid "" +msgstr "" +"Project-Id-Version: cs\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-02-21 12:13+0100\n" +"PO-Revision-Date: 2009-02-21 12:24+0100\n" +"Last-Translator: Daniel Prynych \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" + +#: _translatorinfo.cpp:1 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "Daniel Prynych" + +#: _translatorinfo.cpp:3 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "Daniel@prynych.cz" + +#: knutclient.cpp:86 +msgid "Ready." +msgstr "Připraven." + +#: knutclient.cpp:218 knutclient.cpp:219 +msgid "The connection was renewed." +msgstr "SpojenĂ­ bylo obnoveno." + +#: knutclient.cpp:285 +msgid "The connection failed. The next connection will make after %1 sec." +msgstr "SpojenĂ­ bylo chybnĂŠ. NĂĄsledujĂ­cĂ­ spojenĂ­ bude za %1 sekund." + +#: knutclient.cpp:546 +msgid "upsd > 1.2 doesn't support UDP. Connection is switched to TCP" +msgstr "upsd > 1.2 nepodporuje UDP. SpojenĂ­ je přepnuto na TCP." + +#: knutclient.cpp:688 knutclient.cpp:689 +msgid "Data OK" +msgstr "Data v pořádku" + +#: knutclient.cpp:781 knutclient.cpp:782 +msgid "The connection was closed by the second side (upsd)." +msgstr "SpojenĂ­ bylo uzavřeno druhou stranou (upsd)." + +#: knutclient.cpp:798 knutclient.cpp:799 +msgid "UPS is off." +msgstr "UPS je vypnuta." + +#: knutclient.cpp:802 knutclient.cpp:803 +msgid "UPS is back on." +msgstr "UPS je připojena." + +#: knutclient.cpp:808 knutclient.cpp:809 +msgid "Power is back online." +msgstr "SĂ­ĹĽovĂŠ napĂĄjenĂ­ obnoveno." + +#: knutclient.cpp:814 knutclient.cpp:815 +msgid "UPS is on battery." +msgstr "UPS běží na baterie." + +#: knutclient.cpp:820 knutclient.cpp:821 +msgid "UPS battery is low." +msgstr "Baterie je vybita." + +#: knutclient.cpp:824 knutclient.cpp:825 +msgid "UPS battery is OK." +msgstr "UPS baterie je v pořádku." + +#: knutclient.cpp:830 knutclient.cpp:831 +msgid "UPS battery is bad and needs be replaced." +msgstr "UPS baterie je ĹĄpatnĂĄ a je jĂ­ potřeba vyměnit." + +#: knutclient.cpp:836 knutclient.cpp:837 +msgid "UPS is overloaded." +msgstr "UPS je přetĂ­Ĺžena." + +#: knutclient.cpp:840 knutclient.cpp:841 +msgid "UPS isn't overloaded." +msgstr "UPS nenĂ­ přetĂ­Ĺžena." + +#: knutclient.cpp:846 knutclient.cpp:847 knutdock.cpp:449 +msgid "UPS is performing calibration" +msgstr "UPS provĂĄdĂ­ kalibraci." + +#: knutclient.cpp:850 knutclient.cpp:851 +msgid "Calibration of UPS is ended." +msgstr "Kalibrace UPS je ukončena." + +#: knutclient.cpp:856 knutclient.cpp:857 +msgid "UPS is boosting incoming voltage." +msgstr "UPS navyĹĄuje vstupnĂ­ napětĂ­." + +#: knutclient.cpp:860 knutclient.cpp:861 +msgid "Boosting of UPS is ended." +msgstr "NavyĹĄovanĂ­ napětĂ­ je ukončeno." + +#: knutclient.cpp:866 knutclient.cpp:867 +msgid "UPS is trimming incoming voltage." +msgstr "UPS uřezĂĄvĂĄ vstupnĂ­ napětĂ­." + +#: knutclient.cpp:870 knutclient.cpp:871 +msgid "Trimming of UPS is ended." +msgstr "OřezĂĄvanĂ­ napětĂ­ je ukončeno." + +#: knutclient.cpp:887 knutclient.cpp:954 knutclient.cpp:963 +msgid "Switched" +msgstr "Přepnuto" + +#: knutclient.cpp:1103 knutdock.cpp:640 knutmainwindow.cpp:781 +msgid "Reconnect" +msgstr "Obnovit spojenĂ­" + +#: knutdock.cpp:419 knutdock.cpp:469 knutfrontpanel.cpp:192 +#: knutnewupsdlg.cpp:69 knutprintupsvar.cpp:78 +msgid "Name" +msgstr "NĂĄzev" + +#: knutdock.cpp:420 knutnewupsdlg.cpp:83 +msgid "UPS name" +msgstr "JmĂŠno UPS" + +#: knutdock.cpp:421 knutnewupsdlg.cpp:77 +msgid "UPS address" +msgstr "Adresa UPS" + +#: knutdock.cpp:422 knutdock.cpp:443 knutdock.cpp:446 knutdock.cpp:449 +#: knutdock.cpp:452 knutdock.cpp:455 knutdock.cpp:458 +msgid "Status : " +msgstr "Stav : " + +#: knutdock.cpp:425 knutvardata.cpp:209 +msgid "Connection doesn't exist." +msgstr "SpojenĂ­ neexistuje." + +#: knutdock.cpp:429 knutfrontpanel.cpp:80 +msgid "UPS On line" +msgstr "Provoz na sĂ­t" + +#: knutdock.cpp:433 knutfrontpanel.cpp:95 +msgid "UPS On battery" +msgstr "Provoz na baterie" + +#: knutdock.cpp:437 +msgid "UPS Of line" +msgstr "Provoz na sĂ­t " + +#: knutdock.cpp:443 +msgid "UPS Battery is low" +msgstr "Baterie je vybita." + +#: knutdock.cpp:446 knutfrontpanel.cpp:138 +msgid "Replace battery" +msgstr "Vyměnit baterie" + +#: knutdock.cpp:452 +msgid "UPS is Overload" +msgstr "UPS je přetĂ­Ĺžena" + +#: knutdock.cpp:455 +msgid "UPS is trimming voltage" +msgstr "UPS uřezĂĄvĂĄ vstupnĂ­ napětĂ­" + +#: knutdock.cpp:458 +msgid "UPS is boosting voltage" +msgstr "UPS navyĹĄuje vstupnĂ­ napětĂ­" + +#: knutdock.cpp:464 +msgid "Error : " +msgstr "Chyba : " + +#: knutdock.cpp:467 knutfrontpanel.cpp:182 +msgid "Manufac. : " +msgstr "VĂ˝robce : " + +#: knutdock.cpp:471 +msgid "Serial" +msgstr "SĂŠriovĂŠ č." + +#: knutdock.cpp:473 +msgid "Firmware" +msgstr "Verze Firmware" + +#: knutdock.cpp:477 knutfrontpanel.cpp:233 +msgid "Runtime" +msgstr "Runtime" + +#: knutdock.cpp:477 +msgid " : %1:%2 min" +msgstr " : %1:%2 min" + +#: knutdock.cpp:482 knutvardata.cpp:45 +msgid "Battery Charge" +msgstr "Kapacita baterie" + +#: knutdock.cpp:487 knutvardata.cpp:48 +msgid "UPS Load" +msgstr "ZatĂ­ĹženĂ­ UPS" + +#: knutdock.cpp:513 knutmainwindow.cpp:663 +msgid "Are you sure ?" +msgstr "Jste si jistĂ˝ ?" + +#: knutdock.cpp:636 knutmainwindow.cpp:748 +msgid "&Showing UPS variables and commands" +msgstr "&ZobrazenĂ­ UPS proměnnĂ˝ch a příkazĹŻ" + +#: knutdock.cpp:637 knutmainwindow.cpp:749 +msgid "&Running instant commands" +msgstr "&SpuĹĄtěnĂ­ okamĹžitĂ˝ch příkazĹŻ" + +#: knutdock.cpp:638 knutmainwindow.cpp:750 +msgid "Setting R&W variables" +msgstr "&NastavenĂ­ UPS RW proměnnĂ˝ch" + +#: knutdock.cpp:642 +msgid "&Preferences" +msgstr "N&astavenĂ­" + +#: knutdock.cpp:644 +msgid "&About KNutClient" +msgstr "&O aplikaci KNutClient" + +#: knutdock.cpp:646 +msgid "&Minimize" +msgstr "&Minimalizovat" + +#: knutdock.cpp:648 +msgid "&Exit" +msgstr "&Konec" + +#: knutfrontpanel.cpp:110 +msgid "UPS Overload" +msgstr "PřetĂ­ĹženĂ­" + +#: knutfrontpanel.cpp:124 +msgid "UPS Battery low" +msgstr "Baterie je vybita" + +#: knutfrontpanel.cpp:152 +msgid "UPS calibration" +msgstr "Kalibrace UPS" + +#: knutfrontpanel.cpp:202 +msgid "Serial : " +msgstr "SĂŠriovĂŠ č. : " + +#: knutfrontpanel.cpp:212 +msgid "Firm. rev. : " +msgstr "Ver. firmware : " + +#: knutinstcomms.cpp:33 +msgid "Instant commands" +msgstr "OkamĹžitĂŠ příkazy" + +#: knutinstcomms.cpp:45 +msgid "RUN INSTANT COMMAND" +msgstr "Spustit stĂĄlĂ˝ příkaz" + +#: knutinstcomms.cpp:49 +msgid "Command:" +msgstr "Příkaz:" + +#: knutinstcomms.cpp:53 knutnewupsdlg.cpp:102 knutrwvar.cpp:70 +msgid "User name:" +msgstr "UĹživatelskĂŠ jmĂŠno:" + +#: knutinstcomms.cpp:54 knutnewupsdlg.cpp:109 knutrwvar.cpp:71 +msgid "Password:" +msgstr "Heslo:" + +#: knutmainwindow.cpp:59 +msgid "test of conection from 5" +msgstr "test připojenĂ­ z " + +#: knutmainwindow.cpp:745 +msgid "Quits the application" +msgstr "Ukončí program" + +#: knutmainwindow.cpp:778 +msgid "&Using descriptions" +msgstr "&PouŞít popis" + +#: knutnewupsdlg.cpp:39 +msgid "New Ups" +msgstr "NovĂĄ UPS" + +#: knutnewupsdlg.cpp:89 +msgid "Delay (ms):" +msgstr "ZpoĹžděnĂ­ (ms):" + +#: knutnewupsdlg.cpp:96 +msgid "Port:" +msgstr "Port:" + +#: knutnewupsdlg.cpp:116 +msgid "Store NUT password in configuration file" +msgstr "UloĹžit NUT heslo do konfiguračnĂ­ho souboru" + +#: knutnewupsdlg.cpp:123 +msgid "Availabled UPS values" +msgstr "DostupnĂŠ UPS proměnnĂŠ" + +#: knutnewupsdlg.cpp:124 +msgid "Selected UPS values" +msgstr "VybranĂŠ UPS proměnnĂŠ" + +#: knutnewupsdlg.cpp:134 +msgid "UPS Variables" +msgstr "UPS ProměnnĂŠ" + +#: knutnewupsdlg.cpp:255 +msgid "No Name or UPS address" +msgstr "NezadanĂŠ jmĂŠno nebo adresa UPS" + +#: knutnewupsdlg.cpp:263 +msgid "This Name exist" +msgstr "Toto jmĂŠno jiĹž existuje" + +#: knutnewupsdlg.cpp:270 +msgid "Delay must be number" +msgstr "ZpoĹžděnĂ­ musĂ­ bĂ˝t číslo" + +#: knutnewupsdlg.cpp:276 +msgid "Port must be number" +msgstr "Port musĂ­ byt číslo" + +#: knutnewupsdlg.cpp:281 +msgid "Port must be from 1025 until 65535" +msgstr "Port musĂ­ bĂ˝t v rozsahu od 1025 do 65535" + +#: knutnewupsdlg.cpp:286 +msgid "Delay is too small" +msgstr "ZpoĹžděnĂ­ je příliĹĄ malĂŠ" + +#: knutprefdlg.cpp:45 +msgid "Preferences" +msgstr "NastavenĂ­ UPS" + +#: knutprefdlg.cpp:508 +msgid "Setting" +msgstr "NastavenĂ­" + +#: knutprefdlg.cpp:508 +msgid "Main Setting" +msgstr "HlavnĂ­ nastavenĂ­" + +#: knutprefdlg.cpp:516 +msgid "Voltage/Frequency" +msgstr "NapětĂ­/Frekvence" + +#: knutprefdlg.cpp:519 +msgid "&Use High-Low XFER" +msgstr "&PouŞít High-Low XFER" + +#: knutprefdlg.cpp:521 +msgid "Number of columns :" +msgstr "Počet sloupcĹŻ :" + +#: knutprefdlg.cpp:524 knutprefdlg.cpp:815 knutprefdlg.cpp:894 +msgid "Use custom background color" +msgstr "PouŞít vlastnĂ­ barvu pozadĂ­" + +#: knutprefdlg.cpp:528 knutprefdlg.cpp:818 knutprefdlg.cpp:896 +msgid "Color of background :" +msgstr "Barva pozadĂ­ :" + +#: knutprefdlg.cpp:532 +msgid "Use dialog \"Are you sure\"" +msgstr "PouŞít dialog \"Jste si jistĂ˝\"" + +#: knutprefdlg.cpp:535 +msgid "Use Main window when program is started" +msgstr "PouŞít hlavnĂ­ okno kdyĹž program startuje" + +#: knutprefdlg.cpp:538 +msgid "Show message window, when program reports error" +msgstr "Zobrazit okno zprĂĄv, kdyĹž program hlĂĄsĂ­ chybu" + +#: knutprefdlg.cpp:543 +msgid "Auto" +msgstr "Automaticky" + +#: knutprefdlg.cpp:547 +msgid "Nominal Input Voltage" +msgstr "VstupnĂ­ napětĂ­" + +#: knutprefdlg.cpp:550 +msgid "&230 V" +msgstr "&230 V" + +#: knutprefdlg.cpp:551 +msgid "&120 V" +msgstr "&120 V" + +#: knutprefdlg.cpp:553 +msgid "Nominal Input Frequency" +msgstr "VstupnĂ­ frekvence" + +#: knutprefdlg.cpp:556 +msgid "&50 Hz" +msgstr "&50 Hz" + +#: knutprefdlg.cpp:557 +msgid "&60 Hz" +msgstr "&60 Hz" + +#: knutprefdlg.cpp:628 +msgid "UPS" +msgstr "UPS" + +#: knutprefdlg.cpp:628 +msgid "UPS Setting" +msgstr "NastavenĂ­ UPS" + +#: knutprefdlg.cpp:646 +msgid "&Add" +msgstr "Př&idat" + +#: knutprefdlg.cpp:667 +msgid "Dock bar" +msgstr "DokovacĂ­ liĹĄta" + +#: knutprefdlg.cpp:667 +msgid "Docking Setting" +msgstr "NastavenĂ­ dokovanĂ­" + +#: knutprefdlg.cpp:671 +msgid "Type of dock's showing" +msgstr "Typ zobrazenĂ­ v doku" + +#: knutprefdlg.cpp:676 +msgid "Items of tooltip" +msgstr "Prvky ToolTipu" + +#: knutprefdlg.cpp:684 +msgid "&Picture" +msgstr "&ObrĂĄzkovĂŠ" + +#: knutprefdlg.cpp:685 +msgid "&General" +msgstr "&SouhrnnĂŠ" + +#: knutprefdlg.cpp:688 knutprefdlg.cpp:799 +msgid "M&anufacturer" +msgstr "VĂ˝r&obce" + +#: knutprefdlg.cpp:691 knutprefdlg.cpp:802 +msgid "M&odel" +msgstr "&Model" + +#: knutprefdlg.cpp:694 knutprefdlg.cpp:805 +msgid "&Serial" +msgstr "&SĂŠriovĂŠ č." + +#: knutprefdlg.cpp:697 knutprefdlg.cpp:808 +msgid "&Firm. rev." +msgstr "Verze &Firmware" + +#: knutprefdlg.cpp:700 knutprefdlg.cpp:811 +msgid "&Runtime" +msgstr "&Runtime" + +#: knutprefdlg.cpp:703 +msgid "&Battery Charge" +msgstr "&Kapacita baterie" + +#: knutprefdlg.cpp:706 +msgid "&UPS Load" +msgstr "&ZatĂ­ĹženĂ­ UPS" + +#: knutprefdlg.cpp:710 +msgid "Use custom icon's background color" +msgstr "PouŞít vlastnĂ­ barvu pozadĂ­" + +#: knutprefdlg.cpp:713 +msgid "Color of icon's background :" +msgstr "Barva pozadĂ­ pro ikonu :" + +#: knutprefdlg.cpp:769 +msgid "Panel" +msgstr "Panel" + +#: knutprefdlg.cpp:769 +msgid "Panel Setting" +msgstr "NastavenĂ­ hlavnĂ­ho panelu" + +#: knutprefdlg.cpp:784 +msgid "UPS &Overload" +msgstr "&PřetĂ­ĹženĂ­" + +#: knutprefdlg.cpp:787 +msgid "UPS &Battery low" +msgstr "&Baterie je vybita" + +#: knutprefdlg.cpp:790 +msgid "R&eplace battery" +msgstr "&Vyměnit baterie" + +#: knutprefdlg.cpp:793 +msgid "Ups &calibration" +msgstr "&Kalibrace UPS" + +#: knutprefdlg.cpp:796 +msgid "&Manufac. + Model" +msgstr "VĂ˝robce + M&odel" + +#: knutprefdlg.cpp:851 +msgid "Setting Fonts" +msgstr "NastavenĂ­ pĂ­sma" + +#: knutprefdlg.cpp:858 +msgid "&Use custom font" +msgstr "&PouŞít vlastnĂ­ pĂ­sma" + +#: knutprefdlg.cpp:863 +msgid "Main panel" +msgstr "HlavnĂ­ panel" + +#: knutprefdlg.cpp:864 +msgid "Analog panels" +msgstr "AnalogovĂŠ panely" + +#: knutprefdlg.cpp:887 +msgid "Analog" +msgstr "Analog" + +#: knutprefdlg.cpp:887 +msgid "Setting Analog panel" +msgstr "NastavenĂ­ analogovĂ˝ch panelĹŻ" + +#: knutprefdlg.cpp:898 +msgid "Use custom other colors" +msgstr "PouŞít vlastnĂ­ barvy" + +#: knutprefdlg.cpp:900 +msgid "Color of pointer :" +msgstr "Barva ručičky :" + +#: knutprefdlg.cpp:902 +msgid "Color of OK range :" +msgstr "Barva OK rozsahu :" + +#: knutprefdlg.cpp:904 +msgid "Color of warning range :" +msgstr "Barva rozsahu varovanĂ­ :" + +#: knutprefdlg.cpp:906 +msgid "Color of error range :" +msgstr "Barva rozsahu chyby :" + +#: knutprefdlg.cpp:908 +msgid "Color of scale :" +msgstr "Barva stupnice :" + +#: knutprefdlg.cpp:910 +msgid "Color of font :" +msgstr "Barva pĂ­sma :" + +#: knutprefdlg.cpp:913 +msgid "Digital processing of pointers :" +msgstr "VylepĹĄenĂ­ zpracovanĂ­ ručičky :" + +#: knutprefdlg.cpp:964 +msgid "Nothing processing" +msgstr "ŽådnĂŠ" + +#: knutprefdlg.cpp:965 +msgid "Fast antialiasing" +msgstr "RychlĂŠ" + +#: knutprefdlg.cpp:966 +msgid "Fine antialiasing" +msgstr "VylepĹĄenĂŠ" + +#: knutprefdlg.cpp:967 +msgid "Fast antialiasing and blur motion" +msgstr "RychlĂŠ a rozostřenĂ­ okrajĹŻ" + +#: knutprefdlg.cpp:968 +msgid "Fine antialiasing and blur motion" +msgstr "VylepĹĄenĂŠ a rozostřenĂ­ okrajĹŻ" + +#: knutprintupsvar.cpp:41 +msgid "Variables" +msgstr "UPS ProměnnĂŠ" + +#: knutprintupsvar.cpp:50 +msgid "Reload Vars" +msgstr "Obnovit" + +#: knutprintupsvar.cpp:52 +msgid "UPS variables" +msgstr "UPS proměnnĂŠ" + +#: knutprintupsvar.cpp:79 +msgid "Value" +msgstr "Hodnota" + +#: knutprintupsvar.cpp:81 +msgid "Description" +msgstr "Popis" + +#: knutprintupsvar.cpp:90 +msgid "Instant Commands" +msgstr "OkamĹžitĂŠ příkazy" + +#: knutprintupsvar.cpp:103 +msgid "Read/Write Variables" +msgstr "MěnitelnĂŠ hodnoty" + +#: knutprintupsvar.cpp:121 +msgid "Read Only Variables" +msgstr "StĂĄlĂŠ hodnoty" + +#: knutrwvar.cpp:40 +msgid "RW variables" +msgstr "UPS RW ProměnnĂŠ" + +#: knutrwvar.cpp:56 +msgid "SET RW VARIABLE" +msgstr "NASTAVIT RW PROMĚNOU" + +#: knutrwvar.cpp:61 +msgid "Variable:" +msgstr "ProměnnĂĄ" + +#: knutrwvar.cpp:64 +msgid "Value:" +msgstr "Hodnota" + +#: knutvardata.cpp:43 +msgid "None" +msgstr "ŽådnĂ˝ vĂ˝běr" + +#: knutvardata.cpp:44 +msgid "Input Voltage" +msgstr "VstupnĂ­ napětĂ­" + +#: knutvardata.cpp:46 +msgid "UPS Temperature" +msgstr "Teplota UPS" + +#: knutvardata.cpp:47 +msgid "Input Frequency" +msgstr "VstupnĂ­ frekvence" + +#: knutvardata.cpp:49 +msgid "Outside Temperature" +msgstr "VnějĹĄĂ­ teplota" + +#: knutvardata.cpp:50 +msgid "Outside Humidity" +msgstr "VnějĹĄĂ­ vlhkost" + +#: knutvardata.cpp:51 +msgid "Battery Voltage" +msgstr "NapětĂ­ baterie" + +#: knutvardata.cpp:52 +msgid "Output Voltage" +msgstr "VĂ˝stupnĂ­ napětĂ­" + +#: knutvardata.cpp:53 +msgid "Output Current" +msgstr "VĂ˝stupnĂ­ proud" + +#: knutvardata.cpp:54 +msgid "Output Frequency" +msgstr "VĂ˝stupnĂ­ frekvence" + +#: knutvardata.cpp:55 +msgid "Battery Temperature" +msgstr "Teplota baterie" + +#: knutvardata.cpp:56 +msgid "Battery Current" +msgstr "Proud baterie" + +#: knutvardata.cpp:186 +#, fuzzy +msgid "No memory." +msgstr "NenĂ­ dostatek paměti" + +#: knutvardata.cpp:187 +msgid "No address." +msgstr "NezadanĂĄ adresa" + +#: knutvardata.cpp:188 +msgid "Unknown address." +msgstr "NeznĂĄmĂĄ adresa" + +#: knutvardata.cpp:191 +msgid "Error of connection." +msgstr "Chyba spojenĂ­" + +#: knutvardata.cpp:194 +msgid "No connection with server." +msgstr "Neexistuje spojeni se serverem." + +#: knutvardata.cpp:196 +msgid "Server-client protocol or variables of NUT are unknown." +msgstr "Protokol server-klient nebo nebo proměnnĂŠ NUT-u jsou neznĂĄmĂŠ." + +#: knutvardata.cpp:197 +msgid "No UPS on this address." +msgstr "NezadanĂĄ adresa" + +#: knutvardata.cpp:198 +msgid "Connection was refused by server." +msgstr "Spojeni bylo serverem odmĂ­tnuto." + +#: knutvardata.cpp:200 +msgid "Server doesn't receive data." +msgstr "Server nepřijĂ­mĂĄ data." + +#: knutvardata.cpp:201 +msgid "Server doesn't send data." +msgstr "Server neposĂ­lĂĄ data." + +#: knutvardata.cpp:202 +msgid "Server doesn't answer." +msgstr "Server neodpovĂ­dĂĄ." + +#: knutvardata.cpp:204 +msgid "Server returns data with unknown format." +msgstr "Server vracĂ­ data v neznĂĄmĂŠm formĂĄtu." + +#: knutvardata.cpp:205 +msgid "Server returns unknown data." +msgstr "Server vracĂ­ neznĂĄmĂĄ data." + +#: knutvardata.cpp:206 +msgid "Command VER returns data with unknown format." +msgstr "Příkaz VER vracĂ­ data v neznĂĄmĂŠm formĂĄtu." + +#: knutvardata.cpp:208 +msgid "No data." +msgstr "ŽådnĂĄ data" + +#: knutvardata.cpp:212 +msgid "Access denied. Failed password ?" +msgstr "Přístup odmĂ­tnut. Ĺ patnĂŠ heslo ?" + +#: knutvardata.cpp:213 +msgid "UPS doesn't sent data to server (Data Stale)." +msgstr "UPS nemĹŻĹže poslat data na server. (Data se neměnĂ­)" + +#: knutvardata.cpp:214 +msgid "Server doesn't know this command." +msgstr "Server neznĂĄ tento příkaz." + +#: knutvardata.cpp:217 +msgid "UPS's driver isn't connected." +msgstr "Ovladač pro UPS nenĂ­ připojen." + +#: knutvardata.cpp:219 +msgid "Server required password." +msgstr "Server poĹžaduje heslo." + +#: knutvardata.cpp:220 +msgid "Incorrect password." +msgstr "NesprĂĄvnĂŠ heslo." + +#: knutvardata.cpp:221 +msgid "UPS doesn't response." +msgstr "UPS neodpovĂ­dĂĄ." + +#: knutvardata.cpp:222 +msgid "Command failed." +msgstr "Ĺ patnĂ˝ příkaz." + +#: knutvardata.cpp:223 +msgid "UPS doesn't know this instant command." +msgstr "UPS neznĂĄ tento okamĹžitĂ˝ příkaz." + +#: knutvardata.cpp:224 +msgid "UPS doesn't support this instant command." +msgstr "UPS nepodporuje tento okamĹžitĂ˝ příkaz." + +#: knutvardata.cpp:225 +msgid "UPS doesn't known this variable." +msgstr "UPS neznĂĄ tuto proměnou." + +#: knutvardata.cpp:226 +msgid "UPS doesn't support this variable." +msgstr "UPS nepodporuje tuto proměnou." + +#: knutvardata.cpp:227 +msgid "UPS doesn't support this value in this variable." +msgstr "UPS nepodporuje tuto hodnotu v tĂŠto proměnnĂŠ." + +#: knutvardata.cpp:228 +msgid "Name of UPS is unknown." +msgstr "JmĂŠno UPS-ky je neznĂĄmĂŠ ." + +#: knutvardata.cpp:230 +msgid "Username has been already entered." +msgstr "UĹživatelskĂŠ jmĂŠno jiĹž byla zadĂĄno." + +#: knutvardata.cpp:231 +msgid "Password has been already entered." +msgstr "Heslo jiĹž bylo zadĂĄno." + +#: knutvardata.cpp:233 +msgid "Server doesn't send list of variables." +msgstr "Server neposĂ­lĂĄ seznam proměnnĂ˝ch." + +#: knutvardata.cpp:236 +msgid "Unknown error." +msgstr "NeznĂĄmĂĄ chyba" + +#: main.cpp:31 +msgid "Client for Network UPS Tool" +msgstr "Klient pro UPS systĂŠm NUT" + +#: main.cpp:37 +msgid "Don't dock in Kicker" +msgstr "NeumĂ­stit do doku (Kicker)" + +#: main.cpp:47 +msgid "KNutClient" +msgstr "KNutClient" + +#. i18n: file ./knutclientui.rc line 13 +#: rc.cpp:9 +#, no-c-format +msgid "&Connection" +msgstr "SpojenĂ­" diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..24300a2 --- /dev/null +++ b/po/de.po @@ -0,0 +1,842 @@ +# translation of de.po to +# Copyright (C) 2002,2003, 2004, 2005, 2006, 2008 Free Software Foundation, Inc. +# +# Christoph Thielecke , 2002,2003, 2004, 2008. +# Daniel Prynych , 2003, 2005. +# Christoph Thielecke , 2006. +msgid "" +msgstr "" +"Project-Id-Version: de\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-02-21 12:13+0100\n" +"PO-Revision-Date: 2008-05-26 07:18+0200\n" +"Last-Translator: Christoph Thielecke \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" + +#: _translatorinfo.cpp:1 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "Christoph Thielecke" + +#: _translatorinfo.cpp:3 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "crissi99@gmx.de" + +#: knutclient.cpp:86 +msgid "Ready." +msgstr "Bereit." + +#: knutclient.cpp:218 knutclient.cpp:219 +msgid "The connection was renewed." +msgstr "Die Verbindung wurde erneuert." + +#: knutclient.cpp:285 +msgid "The connection failed. The next connection will make after %1 sec." +msgstr "" +"Die Verbindung ist fehlgeschlagen. Die nächste Verbindung wir nach %1s " +"aufgebaut." + +#: knutclient.cpp:546 +msgid "upsd > 1.2 doesn't support UDP. Connection is switched to TCP" +msgstr "upsd > 1.2 unterstĂźtzt kien UDP. Verbindung mit TCP geschaltet." + +#: knutclient.cpp:688 knutclient.cpp:689 +msgid "Data OK" +msgstr "Daten OK" + +#: knutclient.cpp:781 knutclient.cpp:782 +msgid "The connection was closed by the second side (upsd)." +msgstr "Die Verbindung wurde von der anderen Seite (upsd) geschlossen." + +#: knutclient.cpp:798 knutclient.cpp:799 +msgid "UPS is off." +msgstr "USV ist aus." + +#: knutclient.cpp:802 knutclient.cpp:803 +msgid "UPS is back on." +msgstr "USV wieder an." + +#: knutclient.cpp:808 knutclient.cpp:809 +msgid "Power is back online." +msgstr "Netzspannung ist wieder verfĂźgbar." + +#: knutclient.cpp:814 knutclient.cpp:815 +msgid "UPS is on battery." +msgstr "USV ist im Akkubetrieb." + +#: knutclient.cpp:820 knutclient.cpp:821 +msgid "UPS battery is low." +msgstr "USV hat niedrigeren Akkustand." + +#: knutclient.cpp:824 knutclient.cpp:825 +msgid "UPS battery is OK." +msgstr "USV Akkustand ist OK." + +#: knutclient.cpp:830 knutclient.cpp:831 +msgid "UPS battery is bad and needs be replaced." +msgstr "USV Akku ist in schlechter Verfassung und muss ausgewechselt werden." + +#: knutclient.cpp:836 knutclient.cpp:837 +msgid "UPS is overloaded." +msgstr "USV ist Ăźberlastet." + +#: knutclient.cpp:840 knutclient.cpp:841 +msgid "UPS isn't overloaded." +msgstr "USV ist nicht Ăźberlastet." + +#: knutclient.cpp:846 knutclient.cpp:847 knutdock.cpp:449 +msgid "UPS is performing calibration" +msgstr "USV wird gerade kalibriert" + +#: knutclient.cpp:850 knutclient.cpp:851 +msgid "Calibration of UPS is ended." +msgstr "Kalibration der USV ist beendet." + +#: knutclient.cpp:856 knutclient.cpp:857 +msgid "UPS is boosting incoming voltage." +msgstr "USV verstärkt eingehende Spannung." + +#: knutclient.cpp:860 knutclient.cpp:861 +msgid "Boosting of UPS is ended." +msgstr "Verstärkung der USV ist beendet." + +#: knutclient.cpp:866 knutclient.cpp:867 +msgid "UPS is trimming incoming voltage." +msgstr "USV beschränkt eingehende Spannung." + +#: knutclient.cpp:870 knutclient.cpp:871 +msgid "Trimming of UPS is ended." +msgstr "Beschränkung der USV ist beendet." + +#: knutclient.cpp:887 knutclient.cpp:954 knutclient.cpp:963 +msgid "Switched" +msgstr "Geschaltet" + +#: knutclient.cpp:1103 knutdock.cpp:640 knutmainwindow.cpp:781 +msgid "Reconnect" +msgstr "Erneut verbinden" + +#: knutdock.cpp:419 knutdock.cpp:469 knutfrontpanel.cpp:192 +#: knutnewupsdlg.cpp:69 knutprintupsvar.cpp:78 +msgid "Name" +msgstr "Name" + +#: knutdock.cpp:420 knutnewupsdlg.cpp:83 +msgid "UPS name" +msgstr "Benutzername" + +#: knutdock.cpp:421 knutnewupsdlg.cpp:77 +msgid "UPS address" +msgstr "USV-Adresse" + +#: knutdock.cpp:422 knutdock.cpp:443 knutdock.cpp:446 knutdock.cpp:449 +#: knutdock.cpp:452 knutdock.cpp:455 knutdock.cpp:458 +msgid "Status : " +msgstr "Status : " + +#: knutdock.cpp:425 knutvardata.cpp:209 +msgid "Connection doesn't exist." +msgstr "Verbindung existiert nicht." + +#: knutdock.cpp:429 knutfrontpanel.cpp:80 +msgid "UPS On line" +msgstr "USV-Netzbetrieb" + +#: knutdock.cpp:433 knutfrontpanel.cpp:95 +msgid "UPS On battery" +msgstr "USV-Akkubetrieb" + +#: knutdock.cpp:437 +msgid "UPS Of line" +msgstr "USV offline" + +#: knutdock.cpp:443 +msgid "UPS Battery is low" +msgstr "USV-Akkustand niedrig" + +#: knutdock.cpp:446 knutfrontpanel.cpp:138 +msgid "Replace battery" +msgstr "Akku ersetzen" + +#: knutdock.cpp:452 +msgid "UPS is Overload" +msgstr "USV Ăźberlastet" + +#: knutdock.cpp:455 +msgid "UPS is trimming voltage" +msgstr "USV beschränkt Spannung" + +#: knutdock.cpp:458 +msgid "UPS is boosting voltage" +msgstr "USV erhĂśht Spannung" + +#: knutdock.cpp:464 +msgid "Error : " +msgstr "Fehler :" + +#: knutdock.cpp:467 knutfrontpanel.cpp:182 +msgid "Manufac. : " +msgstr "Hersteller: " + +#: knutdock.cpp:471 +msgid "Serial" +msgstr "Seriell" + +#: knutdock.cpp:473 +msgid "Firmware" +msgstr "Firmware" + +#: knutdock.cpp:477 knutfrontpanel.cpp:233 +msgid "Runtime" +msgstr "Laufzeit" + +#: knutdock.cpp:477 +msgid " : %1:%2 min" +msgstr " : %1:%2 min" + +#: knutdock.cpp:482 knutvardata.cpp:45 +msgid "Battery Charge" +msgstr "Akkustand" + +#: knutdock.cpp:487 knutvardata.cpp:48 +msgid "UPS Load" +msgstr "USV-Auslastung" + +#: knutdock.cpp:513 knutmainwindow.cpp:663 +msgid "Are you sure ?" +msgstr "Sind Sie Sicher?" + +#: knutdock.cpp:636 knutmainwindow.cpp:748 +msgid "&Showing UPS variables and commands" +msgstr "USV-Variablen und Kommandos werden ange&zeigt" + +#: knutdock.cpp:637 knutmainwindow.cpp:749 +msgid "&Running instant commands" +msgstr "Sofort-Kommandos werden ausge&fĂźhrt" + +#: knutdock.cpp:638 knutmainwindow.cpp:750 +msgid "Setting R&W variables" +msgstr "&RW-Variablen werden gesetzt" + +#: knutdock.cpp:642 +msgid "&Preferences" +msgstr "&Einstellungen" + +#: knutdock.cpp:644 +msgid "&About KNutClient" +msgstr "&Über KNutClient" + +#: knutdock.cpp:646 +msgid "&Minimize" +msgstr "&Minimieren" + +#: knutdock.cpp:648 +msgid "&Exit" +msgstr "&Beenden" + +#: knutfrontpanel.cpp:110 +msgid "UPS Overload" +msgstr "USV-Überlastung" + +#: knutfrontpanel.cpp:124 +msgid "UPS Battery low" +msgstr "USV niedriger Akkustand" + +#: knutfrontpanel.cpp:152 +msgid "UPS calibration" +msgstr "USV-Kalibration" + +#: knutfrontpanel.cpp:202 +msgid "Serial : " +msgstr "Seriennr.: " + +#: knutfrontpanel.cpp:212 +msgid "Firm. rev. : " +msgstr "Firmw.-Rev.: " + +#: knutinstcomms.cpp:33 +msgid "Instant commands" +msgstr "Sofortkommandos" + +#: knutinstcomms.cpp:45 +msgid "RUN INSTANT COMMAND" +msgstr "SOFORTKOMMANDO STARTEN" + +#: knutinstcomms.cpp:49 +msgid "Command:" +msgstr "Kommando:" + +#: knutinstcomms.cpp:53 knutnewupsdlg.cpp:102 knutrwvar.cpp:70 +msgid "User name:" +msgstr "Benutzername:" + +#: knutinstcomms.cpp:54 knutnewupsdlg.cpp:109 knutrwvar.cpp:71 +msgid "Password:" +msgstr "Passwort:" + +#: knutmainwindow.cpp:59 +msgid "test of conection from 5" +msgstr "Test der Verbindung von 5" + +#: knutmainwindow.cpp:745 +msgid "Quits the application" +msgstr "Beendet das Programm." + +#: knutmainwindow.cpp:778 +msgid "&Using descriptions" +msgstr "Beschreibungen werden &verwendet" + +#: knutnewupsdlg.cpp:39 +msgid "New Ups" +msgstr "Neue USV" + +#: knutnewupsdlg.cpp:89 +msgid "Delay (ms):" +msgstr "VerzĂśgerung (ms):" + +#: knutnewupsdlg.cpp:96 +msgid "Port:" +msgstr "Port:" + +#: knutnewupsdlg.cpp:116 +msgid "Store NUT password in configuration file" +msgstr "NUT-Passwort in Konfigurationsdatei speichern" + +#: knutnewupsdlg.cpp:123 +msgid "Availabled UPS values" +msgstr "" + +#: knutnewupsdlg.cpp:124 +msgid "Selected UPS values" +msgstr "" + +#: knutnewupsdlg.cpp:134 +msgid "UPS Variables" +msgstr "USV-Variablen" + +#: knutnewupsdlg.cpp:255 +msgid "No Name or UPS address" +msgstr "Kein Name oder USV-Adresse" + +#: knutnewupsdlg.cpp:263 +msgid "This Name exist" +msgstr "Dieser Name existiert bereits" + +#: knutnewupsdlg.cpp:270 +msgid "Delay must be number" +msgstr "Die VerzĂśgerung muss eine Zahl sein" + +#: knutnewupsdlg.cpp:276 +msgid "Port must be number" +msgstr "Der Port muss eine Zahl sein" + +#: knutnewupsdlg.cpp:281 +msgid "Port must be from 1025 until 65535" +msgstr "Der Port muss zwischen 1025 und 65535 liegen" + +#: knutnewupsdlg.cpp:286 +msgid "Delay is too small" +msgstr "VerzĂśgerung ist zu klein" + +#: knutprefdlg.cpp:45 +msgid "Preferences" +msgstr "Einstellungen" + +#: knutprefdlg.cpp:508 +msgid "Setting" +msgstr "Einstellung" + +#: knutprefdlg.cpp:508 +msgid "Main Setting" +msgstr "Haupteinstellung" + +#: knutprefdlg.cpp:516 +msgid "Voltage/Frequency" +msgstr "Spannung/Frequenz" + +#: knutprefdlg.cpp:519 +msgid "&Use High-Low XFER" +msgstr "Hoch-Niedrig-XFER &benutzen" + +#: knutprefdlg.cpp:521 +msgid "Number of columns :" +msgstr "Anzahl der Zeilen:" + +#: knutprefdlg.cpp:524 knutprefdlg.cpp:815 knutprefdlg.cpp:894 +msgid "Use custom background color" +msgstr "Benutzerdefinierte Hintergrundfarbe benutzen:" + +#: knutprefdlg.cpp:528 knutprefdlg.cpp:818 knutprefdlg.cpp:896 +msgid "Color of background :" +msgstr "Hintergrundfarbe:" + +#: knutprefdlg.cpp:532 +msgid "Use dialog \"Are you sure\"" +msgstr "\"Sind Sie sicher\"?-Dialog benutzen" + +#: knutprefdlg.cpp:535 +msgid "Use Main window when program is started" +msgstr "Wenn Programm gestartet, Hauptfenster benutzen" + +#: knutprefdlg.cpp:538 +msgid "Show message window, when program reports error" +msgstr "Wenn Programm Fehler meldet, Nachrichtenfenster anzeigen" + +#: knutprefdlg.cpp:543 +msgid "Auto" +msgstr "" + +#: knutprefdlg.cpp:547 +msgid "Nominal Input Voltage" +msgstr "Nominelle Eingangsspannung" + +#: knutprefdlg.cpp:550 +msgid "&230 V" +msgstr "&230 V" + +#: knutprefdlg.cpp:551 +msgid "&120 V" +msgstr "&120 V" + +#: knutprefdlg.cpp:553 +msgid "Nominal Input Frequency" +msgstr "Nominelle Eingangsfrequenz" + +#: knutprefdlg.cpp:556 +msgid "&50 Hz" +msgstr "&50 Hz" + +#: knutprefdlg.cpp:557 +msgid "&60 Hz" +msgstr "&60 Hz" + +#: knutprefdlg.cpp:628 +msgid "UPS" +msgstr "USV" + +#: knutprefdlg.cpp:628 +msgid "UPS Setting" +msgstr "USV-Einstellung" + +#: knutprefdlg.cpp:646 +msgid "&Add" +msgstr "&HinzufĂźgen" + +#: knutprefdlg.cpp:667 +#, fuzzy +msgid "Dock bar" +msgstr "Andocken" + +#: knutprefdlg.cpp:667 +msgid "Docking Setting" +msgstr "Einstellung des Docking" + +#: knutprefdlg.cpp:671 +msgid "Type of dock's showing" +msgstr "Typ der Dockanzeige" + +#: knutprefdlg.cpp:676 +msgid "Items of tooltip" +msgstr "Elemente des Kurztipps" + +#: knutprefdlg.cpp:684 +msgid "&Picture" +msgstr "&Bild" + +#: knutprefdlg.cpp:685 +msgid "&General" +msgstr "&Allgemein" + +#: knutprefdlg.cpp:688 knutprefdlg.cpp:799 +msgid "M&anufacturer" +msgstr "&Hersteller" + +#: knutprefdlg.cpp:691 knutprefdlg.cpp:802 +msgid "M&odel" +msgstr "M&odell" + +#: knutprefdlg.cpp:694 knutprefdlg.cpp:805 +msgid "&Serial" +msgstr "&Serien-Nr." + +#: knutprefdlg.cpp:697 knutprefdlg.cpp:808 +msgid "&Firm. rev." +msgstr "&Firmw-Rev." + +#: knutprefdlg.cpp:700 knutprefdlg.cpp:811 +msgid "&Runtime" +msgstr "&Laufzeit" + +#: knutprefdlg.cpp:703 +msgid "&Battery Charge" +msgstr "&Akkuladung" + +#: knutprefdlg.cpp:706 +msgid "&UPS Load" +msgstr "&USV-Auslastung" + +#: knutprefdlg.cpp:710 +msgid "Use custom icon's background color" +msgstr "Benutzerdefinierte Hintergrundfarbe fĂźr Symbol benutzen" + +#: knutprefdlg.cpp:713 +msgid "Color of icon's background :" +msgstr "Hintergrundfarbe des Symbols:" + +#: knutprefdlg.cpp:769 +msgid "Panel" +msgstr "Kontrollleiste" + +#: knutprefdlg.cpp:769 +msgid "Panel Setting" +msgstr "Kontrollleisteneinstellung" + +#: knutprefdlg.cpp:784 +msgid "UPS &Overload" +msgstr "USV-Über&lastung" + +#: knutprefdlg.cpp:787 +msgid "UPS &Battery low" +msgstr "USV niedriger &Batteriestand" + +#: knutprefdlg.cpp:790 +msgid "R&eplace battery" +msgstr "Akku ers&etzen" + +#: knutprefdlg.cpp:793 +msgid "Ups &calibration" +msgstr "USV-&Kalibration" + +#: knutprefdlg.cpp:796 +msgid "&Manufac. + Model" +msgstr "Hersteller + &Modell" + +#: knutprefdlg.cpp:851 +msgid "Setting Fonts" +msgstr "Schriftarten einstellen" + +#: knutprefdlg.cpp:858 +msgid "&Use custom font" +msgstr "Benutzerdefinierte Schriftart &benutzen" + +#: knutprefdlg.cpp:863 +msgid "Main panel" +msgstr "Hauptkontrollleiste" + +#: knutprefdlg.cpp:864 +msgid "Analog panels" +msgstr "Analoge Bedienfläche" + +#: knutprefdlg.cpp:887 +msgid "Analog" +msgstr "Analog" + +#: knutprefdlg.cpp:887 +msgid "Setting Analog panel" +msgstr "Analoges Bedienfeld setzen" + +#: knutprefdlg.cpp:898 +msgid "Use custom other colors" +msgstr "Benutzerdefinierte andere Farben benutzen" + +#: knutprefdlg.cpp:900 +msgid "Color of pointer :" +msgstr "Farbe des Zeigers:" + +#: knutprefdlg.cpp:902 +msgid "Color of OK range :" +msgstr "Farbe des OK-Bereiches:" + +#: knutprefdlg.cpp:904 +msgid "Color of warning range :" +msgstr "Farbe des Warnung-Bereiches:" + +#: knutprefdlg.cpp:906 +msgid "Color of error range :" +msgstr "Farbe des Fehler-Bereiches:" + +#: knutprefdlg.cpp:908 +msgid "Color of scale :" +msgstr "Farbe der Skalierung:" + +#: knutprefdlg.cpp:910 +msgid "Color of font :" +msgstr "Schriftfarbe:" + +#: knutprefdlg.cpp:913 +msgid "Digital processing of pointers :" +msgstr "Digitalverarbeitung der Zeiger:" + +#: knutprefdlg.cpp:964 +msgid "Nothing processing" +msgstr "Keine Verarbeitung" + +#: knutprefdlg.cpp:965 +msgid "Fast antialiasing" +msgstr "Schnelle Kantenglättung" + +#: knutprefdlg.cpp:966 +msgid "Fine antialiasing" +msgstr "Feine Kantenglättung" + +#: knutprefdlg.cpp:967 +msgid "Fast antialiasing and blur motion" +msgstr "Schnelle Kantenglättung und verschwommene Bewegung" + +#: knutprefdlg.cpp:968 +msgid "Fine antialiasing and blur motion" +msgstr "Feine Kantenglättung und verschwommene Bewegung" + +#: knutprintupsvar.cpp:41 +msgid "Variables" +msgstr "Variablen" + +#: knutprintupsvar.cpp:50 +msgid "Reload Vars" +msgstr "Neugeladene Variablen" + +#: knutprintupsvar.cpp:52 +msgid "UPS variables" +msgstr "USV-Variablen" + +#: knutprintupsvar.cpp:79 +msgid "Value" +msgstr "Wert:" + +#: knutprintupsvar.cpp:81 +msgid "Description" +msgstr "Beschreibung" + +#: knutprintupsvar.cpp:90 +msgid "Instant Commands" +msgstr "Sofortkommandos" + +#: knutprintupsvar.cpp:103 +msgid "Read/Write Variables" +msgstr "Lesen/Schreiben-Variablen" + +#: knutprintupsvar.cpp:121 +msgid "Read Only Variables" +msgstr "Nur lesbare Variablen" + +#: knutrwvar.cpp:40 +msgid "RW variables" +msgstr "RW-Variablen" + +#: knutrwvar.cpp:56 +msgid "SET RW VARIABLE" +msgstr "RW-VARIABLE SETZEN" + +#: knutrwvar.cpp:61 +msgid "Variable:" +msgstr "Variable:" + +#: knutrwvar.cpp:64 +msgid "Value:" +msgstr "Wert:" + +#: knutvardata.cpp:43 +msgid "None" +msgstr "Keine" + +#: knutvardata.cpp:44 +msgid "Input Voltage" +msgstr "Eingangsspannung" + +#: knutvardata.cpp:46 +msgid "UPS Temperature" +msgstr "USV-Temperatur" + +#: knutvardata.cpp:47 +msgid "Input Frequency" +msgstr "Eingangsfrequenz" + +#: knutvardata.cpp:49 +msgid "Outside Temperature" +msgstr "USV-Aussentemperatur" + +#: knutvardata.cpp:50 +msgid "Outside Humidity" +msgstr "Aussenfeuchtigkeit" + +#: knutvardata.cpp:51 +msgid "Battery Voltage" +msgstr "Akkuspannung" + +#: knutvardata.cpp:52 +msgid "Output Voltage" +msgstr "Ausgangsspannung" + +#: knutvardata.cpp:53 +msgid "Output Current" +msgstr "Aktuelle Ausgabe" + +#: knutvardata.cpp:54 +msgid "Output Frequency" +msgstr "Ausgangsfrequenz" + +#: knutvardata.cpp:55 +msgid "Battery Temperature" +msgstr "Batterietemperatur" + +#: knutvardata.cpp:56 +msgid "Battery Current" +msgstr "Batterie aktuell" + +#: knutvardata.cpp:186 +#, fuzzy +msgid "No memory." +msgstr "Kein Speicher." + +#: knutvardata.cpp:187 +msgid "No address." +msgstr "Keine Adresse." + +#: knutvardata.cpp:188 +msgid "Unknown address." +msgstr "Unbekannte Adresse." + +#: knutvardata.cpp:191 +msgid "Error of connection." +msgstr "Fehler bei der Verbindung" + +#: knutvardata.cpp:194 +msgid "No connection with server." +msgstr "Keine Verbindung zum Server." + +#: knutvardata.cpp:196 +msgid "Server-client protocol or variables of NUT are unknown." +msgstr "Server-Client-Protokoll oder Variablen von NUT unbekannt" + +#: knutvardata.cpp:197 +msgid "No UPS on this address." +msgstr "Keine USV an dieser Adresse." + +#: knutvardata.cpp:198 +msgid "Connection was refused by server." +msgstr "Verbindung wurde vom Server abgelehnt." + +#: knutvardata.cpp:200 +msgid "Server doesn't receive data." +msgstr "Der Server emfängt keine Daten." + +#: knutvardata.cpp:201 +msgid "Server doesn't send data." +msgstr "Der Server sendet keine Daten." + +#: knutvardata.cpp:202 +msgid "Server doesn't answer." +msgstr "Der Server antwortet nicht." + +#: knutvardata.cpp:204 +msgid "Server returns data with unknown format." +msgstr "Server gab Daten in unbekanntem Vormat zurĂźck." + +#: knutvardata.cpp:205 +msgid "Server returns unknown data." +msgstr "Server gab unbekannte Daten zurĂźck." + +#: knutvardata.cpp:206 +msgid "Command VER returns data with unknown format." +msgstr "Kommando VER gab Daten in unbekanntem Format zurĂźck." + +#: knutvardata.cpp:208 +msgid "No data." +msgstr "Keine Daten." + +#: knutvardata.cpp:212 +msgid "Access denied. Failed password ?" +msgstr "Zugriff verweigert. Falsches Passwort?" + +#: knutvardata.cpp:213 +msgid "UPS doesn't sent data to server (Data Stale)." +msgstr "Die USV sendet keine Daten zum Server (Daten gestohlen)." + +#: knutvardata.cpp:214 +msgid "Server doesn't know this command." +msgstr "Server kennt dieses Kommando nicht." + +#: knutvardata.cpp:217 +msgid "UPS's driver isn't connected." +msgstr "USV-Treiber ist nicht verbunden." + +#: knutvardata.cpp:219 +msgid "Server required password." +msgstr "Server erfordert Passwort." + +#: knutvardata.cpp:220 +msgid "Incorrect password." +msgstr "Fehlerhaftes Passwort." + +#: knutvardata.cpp:221 +msgid "UPS doesn't response." +msgstr "USV reagiert nicht." + +#: knutvardata.cpp:222 +msgid "Command failed." +msgstr "Kammando fehlgeschlagen." + +#: knutvardata.cpp:223 +msgid "UPS doesn't know this instant command." +msgstr "USV kennt dieses Sofortkommando nicht." + +#: knutvardata.cpp:224 +msgid "UPS doesn't support this instant command." +msgstr "USV unterstĂźtzt dieses Sofortkommando nicht." + +#: knutvardata.cpp:225 +msgid "UPS doesn't known this variable." +msgstr "USV kennt diese Variable nicht." + +#: knutvardata.cpp:226 +msgid "UPS doesn't support this variable." +msgstr "USV unterstĂźtzt diese Variable nicht." + +#: knutvardata.cpp:227 +msgid "UPS doesn't support this value in this variable." +msgstr "USV unterstĂźtzt diese Wert in dieser Variable nicht." + +#: knutvardata.cpp:228 +msgid "Name of UPS is unknown." +msgstr "Name der USV unbekannt." + +#: knutvardata.cpp:230 +msgid "Username has been already entered." +msgstr "Der Benutzername wurde bereits eingegeben." + +#: knutvardata.cpp:231 +msgid "Password has been already entered." +msgstr "Das Passwort wurde bereits eingegeben." + +#: knutvardata.cpp:233 +msgid "Server doesn't send list of variables." +msgstr "Der Server sendet keine Liste von Variablen." + +#: knutvardata.cpp:236 +msgid "Unknown error." +msgstr "Unbekannter Fehler." + +#: main.cpp:31 +msgid "Client for Network UPS Tool" +msgstr "Klient fĂźr das Netzwerk-USV-Werkzeug" + +#: main.cpp:37 +msgid "Don't dock in Kicker" +msgstr "Nicht ein Kontrollleiste einbinden" + +#: main.cpp:47 +msgid "KNutClient" +msgstr "KNutClient" + +#. i18n: file ./knutclientui.rc line 13 +#: rc.cpp:9 +#, no-c-format +msgid "&Connection" +msgstr "&Verbindung" diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..b1505c9 --- /dev/null +++ b/po/es.po @@ -0,0 +1,1029 @@ +# translation of es.po to Spanish +# tradução de knutclient.po para Brazilian Portuguese +# Copyright (C) 2004, 2008 Free Software Foundation, Inc. +# +# Wellington Terumi Uemura , 2006. +# Lisiane Sztoltz Teixeira , 2004. +# Daniel Prynych , 2004. +# Mad-Soft , 2008. +msgid "" +msgstr "" +"Project-Id-Version: es\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-02-21 12:13+0100\n" +"PO-Revision-Date: 2009-02-22 23:12+0100\n" +"Last-Translator: Mad-Soft \n" +"Language-Team: Spanish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +# _translatorinfo.cpp:1 +#: _translatorinfo.cpp:1 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "Mad-Soft" + +# _translatorinfo.cpp:3 +#: _translatorinfo.cpp:3 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "mad.soft@gmail.com" + +# knutclient.cpp:74 +#: knutclient.cpp:86 +msgid "Ready." +msgstr "Listo." + +#: knutclient.cpp:218 knutclient.cpp:219 +msgid "The connection was renewed." +msgstr "La conexiĂłn se renovĂł." + +#: knutclient.cpp:285 +msgid "The connection failed. The next connection will make after %1 sec." +msgstr "La conexiĂłn ha fallado. La reconexiĂłn se harĂĄ despues de %1 segundos." + +# knutclient.cpp:328 +#: knutclient.cpp:546 +msgid "upsd > 1.2 doesn't support UDP. Connection is switched to TCP" +msgstr "upsd > 1.2 no soporta UDP. La conexiĂłn se ha cambiado a TCP" + +# knutclient.cpp:462 knutclient.cpp:463 +#: knutclient.cpp:688 knutclient.cpp:689 +msgid "Data OK" +msgstr "Datos OK" + +#: knutclient.cpp:781 knutclient.cpp:782 +msgid "The connection was closed by the second side (upsd)." +msgstr "La conexiĂłn fuĂŠ cerrado por otra instancia (upsd)." + +# knutclient.cpp:526 knutclient.cpp:527 +#: knutclient.cpp:798 knutclient.cpp:799 +msgid "UPS is off." +msgstr "SAI estĂĄ apagado." + +# knutclient.cpp:530 knutclient.cpp:531 +#: knutclient.cpp:802 knutclient.cpp:803 +msgid "UPS is back on." +msgstr "SAI ha vuelto." + +# knutclient.cpp:536 knutclient.cpp:537 +#: knutclient.cpp:808 knutclient.cpp:809 +msgid "Power is back online." +msgstr "Ha vuelto la corriente." + +# knutclient.cpp:542 knutclient.cpp:543 +#: knutclient.cpp:814 knutclient.cpp:815 +msgid "UPS is on battery." +msgstr "SAI funciona con baterĂ­a." + +# knutclient.cpp:548 knutclient.cpp:549 +#: knutclient.cpp:820 knutclient.cpp:821 +msgid "UPS battery is low." +msgstr "BaterĂ­a baja del SAI" + +# knutclient.cpp:552 knutclient.cpp:553 +#: knutclient.cpp:824 knutclient.cpp:825 +msgid "UPS battery is OK." +msgstr "La baterĂ­a del SAI esta OK." + +# knutclient.cpp:558 knutclient.cpp:559 +#: knutclient.cpp:830 knutclient.cpp:831 +msgid "UPS battery is bad and needs be replaced." +msgstr "La baterĂ­a del SAI estĂĄ mal y necesita ser reemplazada." + +# knutclient.cpp:564 knutclient.cpp:565 +#: knutclient.cpp:836 knutclient.cpp:837 +msgid "UPS is overloaded." +msgstr "SAI estĂĄ sobrecargado." + +# knutclient.cpp:568 knutclient.cpp:569 +#: knutclient.cpp:840 knutclient.cpp:841 +msgid "UPS isn't overloaded." +msgstr "SAI no estĂĄ sobrecargado." + +# knutclient.cpp:574 knutclient.cpp:575 knutdock.cpp:322 +#: knutclient.cpp:846 knutclient.cpp:847 knutdock.cpp:449 +msgid "UPS is performing calibration" +msgstr "SAI estĂĄ siendo calibrado." + +# knutclient.cpp:578 knutclient.cpp:579 +#: knutclient.cpp:850 knutclient.cpp:851 +msgid "Calibration of UPS is ended." +msgstr "La calibraciĂłn del SAI ha finalizado." + +# knutclient.cpp:584 knutclient.cpp:585 +#: knutclient.cpp:856 knutclient.cpp:857 +msgid "UPS is boosting incoming voltage." +msgstr "SAI estĂĄ aumentando el voltaje de entrada." + +# knutclient.cpp:588 knutclient.cpp:589 +#: knutclient.cpp:860 knutclient.cpp:861 +msgid "Boosting of UPS is ended." +msgstr "FinalizĂł el aumento de voltaje del SAI." + +# knutclient.cpp:594 knutclient.cpp:595 +#: knutclient.cpp:866 knutclient.cpp:867 +msgid "UPS is trimming incoming voltage." +msgstr "SAI estĂĄ ajustando el voltaje de entrada." + +# knutclient.cpp:598 knutclient.cpp:599 +#: knutclient.cpp:870 knutclient.cpp:871 +msgid "Trimming of UPS is ended." +msgstr "FinalizĂł el ajuste de voltaje del SAI." + +# knutclient.cpp:615 knutclient.cpp:672 knutclient.cpp:679 +#: knutclient.cpp:887 knutclient.cpp:954 knutclient.cpp:963 +msgid "Switched" +msgstr "Cambiado." + +#: knutclient.cpp:1103 knutdock.cpp:640 knutmainwindow.cpp:781 +msgid "Reconnect" +msgstr "Reconectar" + +# knutdock.cpp:292 knutdock.cpp:342 knutfrontpanel.cpp:164 +# knutnewupsdlg.cpp:64 knutprintupsvar.cpp:75 +#: knutdock.cpp:419 knutdock.cpp:469 knutfrontpanel.cpp:192 +#: knutnewupsdlg.cpp:69 knutprintupsvar.cpp:78 +msgid "Name" +msgstr "Nombre" + +# knutdock.cpp:293 knutnewupsdlg.cpp:76 +#: knutdock.cpp:420 knutnewupsdlg.cpp:83 +msgid "UPS name" +msgstr "Nombre del SAI" + +# knutdock.cpp:294 knutnewupsdlg.cpp:70 +#: knutdock.cpp:421 knutnewupsdlg.cpp:77 +msgid "UPS address" +msgstr "DirecciĂłn del SAI" + +# knutdock.cpp:295 knutdock.cpp:316 knutdock.cpp:319 knutdock.cpp:322 +# knutdock.cpp:325 knutdock.cpp:328 knutdock.cpp:331 +#: knutdock.cpp:422 knutdock.cpp:443 knutdock.cpp:446 knutdock.cpp:449 +#: knutdock.cpp:452 knutdock.cpp:455 knutdock.cpp:458 +msgid "Status : " +msgstr "Estado :" + +# knutdock.cpp:298 knutvardata.cpp:192 +#: knutdock.cpp:425 knutvardata.cpp:209 +msgid "Connection doesn't exist." +msgstr "La conexiĂłn no existe." + +# knutdock.cpp:302 knutfrontpanel.cpp:70 +#: knutdock.cpp:429 knutfrontpanel.cpp:80 +msgid "UPS On line" +msgstr "SAI activo." + +# knutdock.cpp:306 knutfrontpanel.cpp:83 +#: knutdock.cpp:433 knutfrontpanel.cpp:95 +msgid "UPS On battery" +msgstr "SAI en baterĂ­a" + +# knutdock.cpp:310 +#: knutdock.cpp:437 +msgid "UPS Of line" +msgstr "SAI inactivo" + +# knutdock.cpp:316 +#: knutdock.cpp:443 +msgid "UPS Battery is low" +msgstr "SAI baterĂ­a baja" + +# knutdock.cpp:319 knutfrontpanel.cpp:122 +#: knutdock.cpp:446 knutfrontpanel.cpp:138 +msgid "Replace battery" +msgstr "Cambia la baterĂ­a" + +# knutdock.cpp:325 +#: knutdock.cpp:452 +msgid "UPS is Overload" +msgstr "SAI estĂĄ sobrecargado" + +# knutdock.cpp:328 +#: knutdock.cpp:455 +msgid "UPS is trimming voltage" +msgstr "SAI estĂĄ ajustando el voltaje" + +# knutdock.cpp:331 +#: knutdock.cpp:458 +msgid "UPS is boosting voltage" +msgstr "SAI estĂĄ aumentando el voltaje" + +# knutdock.cpp:337 +#: knutdock.cpp:464 +msgid "Error : " +msgstr "Error :" + +# knutdock.cpp:340 knutfrontpanel.cpp:154 +#: knutdock.cpp:467 knutfrontpanel.cpp:182 +msgid "Manufac. : " +msgstr "Fabricante :" + +# knutdock.cpp:344 +#: knutdock.cpp:471 +msgid "Serial" +msgstr "NÂş Serie" + +# knutdock.cpp:346 +#: knutdock.cpp:473 +msgid "Firmware" +msgstr "Firmware" + +# knutdock.cpp:350 knutfrontpanel.cpp:194 +#: knutdock.cpp:477 knutfrontpanel.cpp:233 +msgid "Runtime" +msgstr "En EjecuciĂłn" + +# knutdock.cpp:350 +#: knutdock.cpp:477 +msgid " : %1:%2 min" +msgstr " : %1:%2 min" + +# knutdock.cpp:357 knutvardata.cpp:43 +#: knutdock.cpp:482 knutvardata.cpp:45 +msgid "Battery Charge" +msgstr "Carga baterĂ­a" + +# knutdock.cpp:364 knutvardata.cpp:46 +#: knutdock.cpp:487 knutvardata.cpp:48 +msgid "UPS Load" +msgstr "Carga del SAI" + +# knutdock.cpp:427 knutmainwindow.cpp:377 +#: knutdock.cpp:513 knutmainwindow.cpp:663 +msgid "Are you sure ?" +msgstr "ÂżEstĂĄs seguro?" + +# knutdock.cpp:402 knutmainwindow.cpp:639 +#: knutdock.cpp:636 knutmainwindow.cpp:748 +msgid "&Showing UPS variables and commands" +msgstr "&Mostrar comandos y variables del SAI" + +# knutdock.cpp:403 knutmainwindow.cpp:640 +#: knutdock.cpp:637 knutmainwindow.cpp:749 +msgid "&Running instant commands" +msgstr "&Ejecutar comandos instantaneos" + +# knutdock.cpp:404 knutmainwindow.cpp:641 +#: knutdock.cpp:638 knutmainwindow.cpp:750 +msgid "Setting R&W variables" +msgstr "Definir variables de &Lect/Esc." + +# knutdock.cpp:406 +#: knutdock.cpp:642 +msgid "&Preferences" +msgstr "&Opciones" + +# knutdock.cpp:408 +#: knutdock.cpp:644 +msgid "&About KNutClient" +msgstr "&Acerca de KNutClient" + +# knutdock.cpp:410 +#: knutdock.cpp:646 +msgid "&Minimize" +msgstr "&Minimizar" + +# knutdock.cpp:412 +#: knutdock.cpp:648 +msgid "&Exit" +msgstr "&Salir" + +# knutfrontpanel.cpp:96 +#: knutfrontpanel.cpp:110 +msgid "UPS Overload" +msgstr "SAI Sobrecarga" + +# knutfrontpanel.cpp:109 +#: knutfrontpanel.cpp:124 +msgid "UPS Battery low" +msgstr "SAI BaterĂ­a baja" + +# knutfrontpanel.cpp:135 +#: knutfrontpanel.cpp:152 +msgid "UPS calibration" +msgstr "SAI calibraciĂłn" + +# knutfrontpanel.cpp:174 +#: knutfrontpanel.cpp:202 +msgid "Serial : " +msgstr "NÂş Serie : " + +# knutfrontpanel.cpp:184 +#: knutfrontpanel.cpp:212 +msgid "Firm. rev. : " +msgstr "Firm. rev. : " + +# knutinstcomms.cpp:33 +#: knutinstcomms.cpp:33 +msgid "Instant commands" +msgstr "Comandos instantaneos" + +# knutinstcomms.cpp:48 +#: knutinstcomms.cpp:45 +msgid "RUN INSTANT COMMAND" +msgstr "EJECUTAR COMANDO INSTANTANEO" + +# knutinstcomms.cpp:52 +#: knutinstcomms.cpp:49 +msgid "Command:" +msgstr "Comando:" + +# knutinstcomms.cpp:56 knutnewupsdlg.cpp:95 knutrwvar.cpp:70 +#: knutinstcomms.cpp:53 knutnewupsdlg.cpp:102 knutrwvar.cpp:70 +msgid "User name:" +msgstr "Nombre de usuario:" + +# knutinstcomms.cpp:57 knutnewupsdlg.cpp:102 knutrwvar.cpp:71 +#: knutinstcomms.cpp:54 knutnewupsdlg.cpp:109 knutrwvar.cpp:71 +msgid "Password:" +msgstr "ContraseĂąa:" + +#: knutmainwindow.cpp:59 +msgid "test of conection from 5" +msgstr "test de conexiĂłn desde 5" + +# knutmainwindow.cpp:636 +#: knutmainwindow.cpp:745 +msgid "Quits the application" +msgstr "Salir de la aplicaciĂłn" + +# knutmainwindow.cpp:644 +#: knutmainwindow.cpp:778 +msgid "&Using descriptions" +msgstr "&Usar descripciones" + +# knutnewupsdlg.cpp:35 +#: knutnewupsdlg.cpp:39 +msgid "New Ups" +msgstr "Nuevo SAI" + +# knutnewupsdlg.cpp:82 +#: knutnewupsdlg.cpp:89 +msgid "Delay (ms):" +msgstr "Retraso (ms):" + +# knutnewupsdlg.cpp:89 +#: knutnewupsdlg.cpp:96 +msgid "Port:" +msgstr "Puerto:" + +# knutnewupsdlg.cpp:109 +#: knutnewupsdlg.cpp:116 +msgid "Store NUT password in configuration file" +msgstr "Guardar contraseĂąa de NUT en el archivo de configuraciĂłn" + +#: knutnewupsdlg.cpp:123 +msgid "Availabled UPS values" +msgstr "Valores UPS Disponibles" + +#: knutnewupsdlg.cpp:124 +msgid "Selected UPS values" +msgstr "Valores UPS Seleccionados" + +# knutnewupsdlg.cpp:123 +#: knutnewupsdlg.cpp:134 +msgid "UPS Variables" +msgstr "Variables del SAI" + +# knutnewupsdlg.cpp:227 +#: knutnewupsdlg.cpp:255 +msgid "No Name or UPS address" +msgstr "Sin nombre o direccion del SAI" + +# knutnewupsdlg.cpp:234 +#: knutnewupsdlg.cpp:263 +msgid "This Name exist" +msgstr "El nombre ya existe" + +# knutnewupsdlg.cpp:241 +#: knutnewupsdlg.cpp:270 +msgid "Delay must be number" +msgstr "Retraso debe ser numĂŠrico" + +# knutnewupsdlg.cpp:247 +#: knutnewupsdlg.cpp:276 +msgid "Port must be number" +msgstr "Puerto debe ser numĂŠrico" + +# knutnewupsdlg.cpp:252 +#: knutnewupsdlg.cpp:281 +msgid "Port must be from 1025 until 65535" +msgstr "Puerto debe estar entre 1025 y 65535" + +# knutnewupsdlg.cpp:257 +#: knutnewupsdlg.cpp:286 +msgid "Delay is too small" +msgstr "Retraso demasiado pequeĂąo" + +# knutprefdlg.cpp:464 +#: knutprefdlg.cpp:45 +msgid "Preferences" +msgstr "Opciones" + +# knutprefdlg.cpp:42 +#: knutprefdlg.cpp:508 +msgid "Setting" +msgstr "ConfiguraciĂłn" + +# knutprefdlg.cpp:42 +#: knutprefdlg.cpp:508 +msgid "Main Setting" +msgstr "ConfiguraciĂłn Principal" + +# knutprefdlg.cpp:50 +#: knutprefdlg.cpp:516 +msgid "Voltage/Frequency" +msgstr "Voltaje/Frecuencia" + +# knutprefdlg.cpp:53 +#: knutprefdlg.cpp:519 +msgid "&Use High-Low XFER" +msgstr "&Usar Alto-Bajo XFER" + +# knutprefdlg.cpp:55 +#: knutprefdlg.cpp:521 +msgid "Number of columns :" +msgstr "NĂşmero de columnas:" + +# knutprefdlg.cpp:58 knutprefdlg.cpp:317 knutprefdlg.cpp:394 +#: knutprefdlg.cpp:524 knutprefdlg.cpp:815 knutprefdlg.cpp:894 +msgid "Use custom background color" +msgstr "Usar color de fondo personalizado" + +# knutprefdlg.cpp:62 knutprefdlg.cpp:320 knutprefdlg.cpp:396 +#: knutprefdlg.cpp:528 knutprefdlg.cpp:818 knutprefdlg.cpp:896 +msgid "Color of background :" +msgstr "Color de fondo :" + +# knutprefdlg.cpp:66 +#: knutprefdlg.cpp:532 +msgid "Use dialog \"Are you sure\"" +msgstr "Usar diĂĄlogo \"ÂżEstĂĄs seguro?\"" + +# knutprefdlg.cpp:70 +#: knutprefdlg.cpp:535 +msgid "Use Main window when program is started" +msgstr "Mostrar ventana principal cuando el programa se inicie" + +# knutprefdlg.cpp:70 +#: knutprefdlg.cpp:538 +msgid "Show message window, when program reports error" +msgstr "Mostrar ventana de mensaje, cuando el programa de un error" + +#: knutprefdlg.cpp:543 +msgid "Auto" +msgstr "Auto" + +# knutprefdlg.cpp:75 +#: knutprefdlg.cpp:547 +msgid "Nominal Input Voltage" +msgstr "Voltaje de entrada Nominal" + +# knutprefdlg.cpp:78 +#: knutprefdlg.cpp:550 +msgid "&230 V" +msgstr "&220 V" + +# knutprefdlg.cpp:79 +#: knutprefdlg.cpp:551 +msgid "&120 V" +msgstr "&120 V" + +# knutprefdlg.cpp:81 +#: knutprefdlg.cpp:553 +msgid "Nominal Input Frequency" +msgstr "Frecuencia de entrada nominal" + +# knutprefdlg.cpp:84 +#: knutprefdlg.cpp:556 +msgid "&50 Hz" +msgstr "&50 Hz" + +# knutprefdlg.cpp:85 +#: knutprefdlg.cpp:557 +msgid "&60 Hz" +msgstr "&60 Hz" + +# knutprefdlg.cpp:153 +#: knutprefdlg.cpp:628 +msgid "UPS" +msgstr "SAI" + +# knutprefdlg.cpp:153 +#: knutprefdlg.cpp:628 +msgid "UPS Setting" +msgstr "ConfiguraciĂłn SAI" + +# knutprefdlg.cpp:171 +#: knutprefdlg.cpp:646 +msgid "&Add" +msgstr "&AĂąadir" + +# knutprefdlg.cpp:189 +#: knutprefdlg.cpp:667 +msgid "Dock bar" +msgstr "Barra de anclaje" + +# knutprefdlg.cpp:189 +#: knutprefdlg.cpp:667 +msgid "Docking Setting" +msgstr "ConfiguraciĂłn del icono de sistema" + +# knutprefdlg.cpp:192 +#: knutprefdlg.cpp:671 +msgid "Type of dock's showing" +msgstr "Tipo de icono de sistema" + +# knutprefdlg.cpp:197 +#: knutprefdlg.cpp:676 +msgid "Items of tooltip" +msgstr "Objetos del mensaje emergente" + +# knutprefdlg.cpp:205 +#: knutprefdlg.cpp:684 +msgid "&Picture" +msgstr "&Figura" + +# knutprefdlg.cpp:206 +#: knutprefdlg.cpp:685 +msgid "&General" +msgstr "&General" + +# knutprefdlg.cpp:209 knutprefdlg.cpp:301 +#: knutprefdlg.cpp:688 knutprefdlg.cpp:799 +msgid "M&anufacturer" +msgstr "F&abricante" + +# knutprefdlg.cpp:212 knutprefdlg.cpp:304 +#: knutprefdlg.cpp:691 knutprefdlg.cpp:802 +msgid "M&odel" +msgstr "M&odelo" + +# knutprefdlg.cpp:215 knutprefdlg.cpp:307 +#: knutprefdlg.cpp:694 knutprefdlg.cpp:805 +msgid "&Serial" +msgstr "NÂş de &Serie" + +# knutprefdlg.cpp:218 knutprefdlg.cpp:310 +#: knutprefdlg.cpp:697 knutprefdlg.cpp:808 +msgid "&Firm. rev." +msgstr "&Firm. rev." + +# knutprefdlg.cpp:221 knutprefdlg.cpp:313 +#: knutprefdlg.cpp:700 knutprefdlg.cpp:811 +msgid "&Runtime" +msgstr "En E&jecuciĂłn" + +# knutprefdlg.cpp:224 +#: knutprefdlg.cpp:703 +msgid "&Battery Charge" +msgstr "Carga de &BaterĂ­a" + +# knutprefdlg.cpp:227 +#: knutprefdlg.cpp:706 +msgid "&UPS Load" +msgstr "&SAI Carga" + +# knutprefdlg.cpp:231 +#: knutprefdlg.cpp:710 +msgid "Use custom icon's background color" +msgstr "Usar color personalizado de fondo de los iconos" + +# knutprefdlg.cpp:234 +#: knutprefdlg.cpp:713 +msgid "Color of icon's background :" +msgstr "Color de fondo de los iconos :" + +# knutprefdlg.cpp:273 +#: knutprefdlg.cpp:769 +msgid "Panel" +msgstr "Panel" + +# knutprefdlg.cpp:273 +#: knutprefdlg.cpp:769 +msgid "Panel Setting" +msgstr "ConfiguraciĂłn del panel" + +# knutprefdlg.cpp:286 +#: knutprefdlg.cpp:784 +msgid "UPS &Overload" +msgstr "SAI &Sobrecarga" + +# knutprefdlg.cpp:289 +#: knutprefdlg.cpp:787 +msgid "UPS &Battery low" +msgstr "SAI &BaterĂ­a baja" + +# knutprefdlg.cpp:292 +#: knutprefdlg.cpp:790 +msgid "R&eplace battery" +msgstr "R&emplaza baterĂ­a" + +# knutprefdlg.cpp:295 +#: knutprefdlg.cpp:793 +msgid "Ups &calibration" +msgstr "&CalibraciĂłn del SAI" + +# knutprefdlg.cpp:298 +#: knutprefdlg.cpp:796 +msgid "&Manufac. + Model" +msgstr "Fabricante + &Modelo" + +# knutprefdlg.cpp:353 +#: knutprefdlg.cpp:851 +msgid "Setting Fonts" +msgstr "ConfiguraciĂłn de Fuentes" + +# knutprefdlg.cpp:360 +#: knutprefdlg.cpp:858 +msgid "&Use custom font" +msgstr "&Utilizar fuente personalizada" + +# knutprefdlg.cpp:365 +#: knutprefdlg.cpp:863 +msgid "Main panel" +msgstr "Panel principal" + +# knutprefdlg.cpp:366 +#: knutprefdlg.cpp:864 +msgid "Analog panels" +msgstr "Panel analĂłgico" + +# knutprefdlg.cpp:388 +#: knutprefdlg.cpp:887 +msgid "Analog" +msgstr "AnalĂłgico" + +# knutprefdlg.cpp:388 +#: knutprefdlg.cpp:887 +msgid "Setting Analog panel" +msgstr "ConfiguraciĂłn del panel analĂłgico" + +# knutprefdlg.cpp:398 +#: knutprefdlg.cpp:898 +msgid "Use custom other colors" +msgstr "Usar otros colores personalizados" + +# knutprefdlg.cpp:400 +#: knutprefdlg.cpp:900 +msgid "Color of pointer :" +msgstr "Color del puntero:" + +# knutprefdlg.cpp:402 +#: knutprefdlg.cpp:902 +msgid "Color of OK range :" +msgstr "Color del limite OK:" + +# knutprefdlg.cpp:404 +#: knutprefdlg.cpp:904 +msgid "Color of warning range :" +msgstr "Color del limite de aviso:" + +# knutprefdlg.cpp:406 +#: knutprefdlg.cpp:906 +msgid "Color of error range :" +msgstr "Color del limite de error:" + +# knutprefdlg.cpp:408 +#: knutprefdlg.cpp:908 +msgid "Color of scale :" +msgstr "Color de la escala:" + +# knutprefdlg.cpp:410 +#: knutprefdlg.cpp:910 +msgid "Color of font :" +msgstr "Color de la fuente :" + +# knutprefdlg.cpp:400 +#: knutprefdlg.cpp:913 +msgid "Digital processing of pointers :" +msgstr "Procesamiento digital de los punteros:" + +#: knutprefdlg.cpp:964 +msgid "Nothing processing" +msgstr "Nada se esta procesando" + +#: knutprefdlg.cpp:965 +msgid "Fast antialiasing" +msgstr "Antialiasing rĂĄpido" + +#: knutprefdlg.cpp:966 +msgid "Fine antialiasing" +msgstr "Antialiasing bueno" + +#: knutprefdlg.cpp:967 +msgid "Fast antialiasing and blur motion" +msgstr "Antialiasing rĂĄpido y blur motion" + +#: knutprefdlg.cpp:968 +msgid "Fine antialiasing and blur motion" +msgstr "Antialiasing bueno y blur motion" + +# knutprintupsvar.cpp:41 +#: knutprintupsvar.cpp:41 +msgid "Variables" +msgstr "Variables" + +# knutprintupsvar.cpp:48 +#: knutprintupsvar.cpp:50 +msgid "Reload Vars" +msgstr "Recargar Variables" + +# knutprintupsvar.cpp:50 +#: knutprintupsvar.cpp:52 +msgid "UPS variables" +msgstr "Variables del SAI" + +# knutprintupsvar.cpp:76 +#: knutprintupsvar.cpp:79 +msgid "Value" +msgstr "Valor" + +# knutprintupsvar.cpp:78 +#: knutprintupsvar.cpp:81 +msgid "Description" +msgstr "DescripciĂłn" + +# knutprintupsvar.cpp:97 knutprintupsvar.cpp:99 knutprintupsvar.cpp:102 +#: knutprintupsvar.cpp:90 +msgid "Instant Commands" +msgstr "Comandos InstantĂĄneos" + +# knutprintupsvar.cpp:118 knutprintupsvar.cpp:120 knutprintupsvar.cpp:123 +#: knutprintupsvar.cpp:103 +msgid "Read/Write Variables" +msgstr "Variables de Lectura/Escritura" + +# knutprintupsvar.cpp:152 knutprintupsvar.cpp:154 knutprintupsvar.cpp:157 +#: knutprintupsvar.cpp:121 +msgid "Read Only Variables" +msgstr "Variables de Solo Lectura" + +# knutrwvar.cpp:40 +#: knutrwvar.cpp:40 +msgid "RW variables" +msgstr "Variables de Lect/Escr." + +# knutrwvar.cpp:56 +#: knutrwvar.cpp:56 +msgid "SET RW VARIABLE" +msgstr "DEFINIR VARIABLE DE LECT/ESCR." + +# knutrwvar.cpp:61 +#: knutrwvar.cpp:61 +msgid "Variable:" +msgstr "Variable:" + +# knutrwvar.cpp:64 +#: knutrwvar.cpp:64 +msgid "Value:" +msgstr "Valor:" + +# knutvardata.cpp:41 +#: knutvardata.cpp:43 +msgid "None" +msgstr "Nada" + +# knutvardata.cpp:42 +#: knutvardata.cpp:44 +msgid "Input Voltage" +msgstr "Voltaje de Entrada" + +# knutvardata.cpp:44 +#: knutvardata.cpp:46 +msgid "UPS Temperature" +msgstr "Temperatura del SAI" + +# knutvardata.cpp:45 +#: knutvardata.cpp:47 +msgid "Input Frequency" +msgstr "Frecuencia de Entrada" + +# knutvardata.cpp:47 +#: knutvardata.cpp:49 +msgid "Outside Temperature" +msgstr "Temperatura Exterior" + +# knutvardata.cpp:48 +#: knutvardata.cpp:50 +msgid "Outside Humidity" +msgstr "Humedad Exterior" + +# knutvardata.cpp:49 +#: knutvardata.cpp:51 +msgid "Battery Voltage" +msgstr "Voltaje de la BaterĂ­a" + +# knutvardata.cpp:50 +#: knutvardata.cpp:52 +msgid "Output Voltage" +msgstr "Voltaje de Salida" + +# knutvardata.cpp:51 +#: knutvardata.cpp:53 +msgid "Output Current" +msgstr "Salida Actual" + +# knutvardata.cpp:45 +#: knutvardata.cpp:54 +msgid "Output Frequency" +msgstr "Frecuencia de Salida" + +# knutvardata.cpp:52 +#: knutvardata.cpp:55 +msgid "Battery Temperature" +msgstr "Temperatura de la BaterĂ­a" + +# knutvardata.cpp:53 +#: knutvardata.cpp:56 +msgid "Battery Current" +msgstr "BaterĂ­a Actual" + +# knutvardata.cpp:170 +#: knutvardata.cpp:186 +msgid "No memory." +msgstr "Sin memoria." + +# knutvardata.cpp:171 +#: knutvardata.cpp:187 +msgid "No address." +msgstr "Sin direcciĂłn." + +# knutvardata.cpp:172 +#: knutvardata.cpp:188 +msgid "Unknown address." +msgstr "DirecciĂłn desconocida." + +#: knutvardata.cpp:191 +msgid "Error of connection." +msgstr "Error de conexiĂłn." + +# knutvardata.cpp:177 +#: knutvardata.cpp:194 +msgid "No connection with server." +msgstr "Sin conectar al servidor." + +# knutvardata.cpp:179 +#: knutvardata.cpp:196 +msgid "Server-client protocol or variables of NUT are unknown." +msgstr "Protocolo cliente-servidor o las variables del NUT son desconocidas." + +# knutvardata.cpp:180 +#: knutvardata.cpp:197 +msgid "No UPS on this address." +msgstr "No hay SAI en esa direcciĂłn." + +# knutvardata.cpp:177 +#: knutvardata.cpp:198 +msgid "Connection was refused by server." +msgstr "La conexiĂłn fue rechazada por el servidor." + +# knutvardata.cpp:181 +#: knutvardata.cpp:200 +msgid "Server doesn't receive data." +msgstr "El Servidor no recibe datos." + +# knutvardata.cpp:182 +#: knutvardata.cpp:201 +msgid "Server doesn't send data." +msgstr "El Servidor no envĂ­a datos." + +# knutvardata.cpp:183 +#: knutvardata.cpp:202 +msgid "Server doesn't answer." +msgstr "El Servidor no responde." + +# knutvardata.cpp:185 +#: knutvardata.cpp:204 +msgid "Server returns data with unknown format." +msgstr "El Servidor devuelve datos con un formato desconocido." + +# knutvardata.cpp:186 +#: knutvardata.cpp:205 +msgid "Server returns unknown data." +msgstr "El Servidor devuelve datos desconocidos." + +# knutvardata.cpp:187 +#: knutvardata.cpp:206 +msgid "Command VER returns data with unknown format." +msgstr "El comando VER devuelve datos con un formato desconocido." + +# knutvardata.cpp:190 +#: knutvardata.cpp:208 +msgid "No data." +msgstr "Sin datos." + +# knutvardata.cpp:196 +#: knutvardata.cpp:212 +msgid "Access denied. Failed password ?" +msgstr "Acceso denegado. ContraseĂąa erronea ?" + +# knutvardata.cpp:197 +#: knutvardata.cpp:213 +msgid "UPS doesn't sent data to server (Data Stale)." +msgstr "SAI no envĂ­a datos al servidor (Datos perdidos)." + +# knutvardata.cpp:198 +#: knutvardata.cpp:214 +msgid "Server doesn't know this command." +msgstr "El servidor no conoce este comando." + +# knutvardata.cpp:201 +#: knutvardata.cpp:217 +msgid "UPS's driver isn't connected." +msgstr "El driver del SAI no estĂĄ conectado." + +# knutvardata.cpp:203 +#: knutvardata.cpp:219 +msgid "Server required password." +msgstr "Servidor requiere contraseĂąa." + +# knutvardata.cpp:204 +#: knutvardata.cpp:220 +msgid "Incorrect password." +msgstr "ContraseĂąa incorrecta." + +# knutvardata.cpp:205 +#: knutvardata.cpp:221 +msgid "UPS doesn't response." +msgstr "SAI no responde." + +# knutvardata.cpp:206 +#: knutvardata.cpp:222 +msgid "Command failed." +msgstr "Comando fallido." + +# knutvardata.cpp:207 +#: knutvardata.cpp:223 +msgid "UPS doesn't know this instant command." +msgstr "SAI no conoce este comando instantĂĄneo." + +# knutvardata.cpp:208 +#: knutvardata.cpp:224 +msgid "UPS doesn't support this instant command." +msgstr "SAI no soporta este comando instantĂĄneo." + +# knutvardata.cpp:209 +#: knutvardata.cpp:225 +msgid "UPS doesn't known this variable." +msgstr "SAI no conoce esta variable." + +# knutvardata.cpp:210 +#: knutvardata.cpp:226 +msgid "UPS doesn't support this variable." +msgstr "SAI no soporta esta variable." + +# knutvardata.cpp:211 +#: knutvardata.cpp:227 +msgid "UPS doesn't support this value in this variable." +msgstr "SAI no soporta este valor en esta variable." + +# knutvardata.cpp:212 +#: knutvardata.cpp:228 +msgid "Name of UPS is unknown." +msgstr "Nombre desconocido del SAI." + +#: knutvardata.cpp:230 +msgid "Username has been already entered." +msgstr "El nombre de usuario ya ha sido introducido." + +#: knutvardata.cpp:231 +msgid "Password has been already entered." +msgstr "La contraseĂąa ya ha sido introducida." + +# knutvardata.cpp:182 +#: knutvardata.cpp:233 +msgid "Server doesn't send list of variables." +msgstr "El Servidor no envĂ­a la lista de variables." + +# knutvardata.cpp:215 +#: knutvardata.cpp:236 +msgid "Unknown error." +msgstr "Erro dessconocido." + +# main.cpp:31 +#: main.cpp:31 +msgid "Client for Network UPS Tool" +msgstr "Cliente para Network UPS Tool" + +# main.cpp:37 +#: main.cpp:37 +msgid "Don't dock in Kicker" +msgstr "Sin icono en Kicker" + +# main.cpp:47 +#: main.cpp:47 +msgid "KNutClient" +msgstr "KNutClient" + +#. i18n: file ./knutclientui.rc line 13 +#: rc.cpp:9 +#, no-c-format +msgid "&Connection" +msgstr "&ConexiĂłn" diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..4f1ca34 --- /dev/null +++ b/po/fr.po @@ -0,0 +1,858 @@ +# translation of fr.po to Français +# translation of fr.po to +# translation of fr.po to Czech +# translation of fr.po to français +# Copyright (C) 2003, 2004 Free Software Foundation, Inc. +# Arnaud Quette , 2003, 2004. +# Daniel Prynych , 2003, 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: fr\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-02-21 12:13+0100\n" +"PO-Revision-Date: 2009-02-22 21:44+0100\n" +"Last-Translator: Arnaud Quette \n" +"Language-Team: French \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: _translatorinfo.cpp:1 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "Arnaud de Lorbeau,Arnaud Quette" + +#: _translatorinfo.cpp:3 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "adelorbeau@mandrakesoft.com,arnaud.quette@free.fr" + +#: knutclient.cpp:86 +msgid "Ready." +msgstr "PrĂŞt." + +#: knutclient.cpp:218 knutclient.cpp:219 +msgid "The connection was renewed." +msgstr "La connexion a ĂŠtĂŠ renouvelĂŠ." + +#: knutclient.cpp:285 +msgid "The connection failed. The next connection will make after %1 sec." +msgstr "La connexion a ĂŠchouĂŠ. Nouvelle tentative dans %1¡sec." + +#: knutclient.cpp:546 +msgid "upsd > 1.2 doesn't support UDP. Connection is switched to TCP" +msgstr "upsd > 1.2 ne supporte pas UDP. La connexion est basculÊ en TCP" + +#: knutclient.cpp:688 knutclient.cpp:689 +msgid "Data OK" +msgstr "DonnĂŠes OK" + +#: knutclient.cpp:781 knutclient.cpp:782 +msgid "The connection was closed by the second side (upsd)." +msgstr "La connexion a ĂŠtĂŠ fermĂŠ par la seconde partie (upsd)." + +#: knutclient.cpp:798 knutclient.cpp:799 +msgid "UPS is off." +msgstr "Onduleur arrĂŞtĂŠ" + +#: knutclient.cpp:802 knutclient.cpp:803 +msgid "UPS is back on." +msgstr "Onduleur dĂŠmarrĂŠ" + +#: knutclient.cpp:808 knutclient.cpp:809 +msgid "Power is back online." +msgstr "Retour secteur" + +#: knutclient.cpp:814 knutclient.cpp:815 +msgid "UPS is on battery." +msgstr "Onduleur sur batterie" + +#: knutclient.cpp:820 knutclient.cpp:821 +msgid "UPS battery is low." +msgstr "Onduleur Batterie basse" + +#: knutclient.cpp:824 knutclient.cpp:825 +msgid "UPS battery is OK." +msgstr "Batterie OK" + +#: knutclient.cpp:830 knutclient.cpp:831 +msgid "UPS battery is bad and needs be replaced." +msgstr "La batterie doit ĂŞtre remplacĂŠe." + +#: knutclient.cpp:836 knutclient.cpp:837 +msgid "UPS is overloaded." +msgstr "L'onduleur est en surcharge." + +#: knutclient.cpp:840 knutclient.cpp:841 +msgid "UPS isn't overloaded." +msgstr "L'onduleur n'est pas en surcharge." + +#: knutclient.cpp:846 knutclient.cpp:847 knutdock.cpp:449 +msgid "UPS is performing calibration" +msgstr "Calibrage onduleur en cours" + +#: knutclient.cpp:850 knutclient.cpp:851 +msgid "Calibration of UPS is ended." +msgstr "Calibrage onduleur terminĂŠ." + +#: knutclient.cpp:856 knutclient.cpp:857 +msgid "UPS is boosting incoming voltage." +msgstr "L'onduleur est en redressement de la tension d'entrĂŠe." + +#: knutclient.cpp:860 knutclient.cpp:861 +msgid "Boosting of UPS is ended." +msgstr "Redressement de la tension d'entrĂŠe terminĂŠ." + +#: knutclient.cpp:866 knutclient.cpp:867 +msgid "UPS is trimming incoming voltage." +msgstr "L'onduleur est en rabaissement de la tension d'entrĂŠe." + +#: knutclient.cpp:870 knutclient.cpp:871 +msgid "Trimming of UPS is ended." +msgstr "Rabaissement de la tension d'entrĂŠe terminĂŠ." + +#: knutclient.cpp:887 knutclient.cpp:954 knutclient.cpp:963 +msgid "Switched" +msgstr "BasculĂŠ" + +#: knutclient.cpp:1103 knutdock.cpp:640 knutmainwindow.cpp:781 +msgid "Reconnect" +msgstr "Reconnexion" + +#: knutdock.cpp:419 knutdock.cpp:469 knutfrontpanel.cpp:192 +#: knutnewupsdlg.cpp:69 knutprintupsvar.cpp:78 +msgid "Name" +msgstr "Nom" + +#: knutdock.cpp:420 knutnewupsdlg.cpp:83 +msgid "UPS name" +msgstr "Onduleur" + +#: knutdock.cpp:421 knutnewupsdlg.cpp:77 +msgid "UPS address" +msgstr "Adresse Onduleur" + +#: knutdock.cpp:422 knutdock.cpp:443 knutdock.cpp:446 knutdock.cpp:449 +#: knutdock.cpp:452 knutdock.cpp:455 knutdock.cpp:458 +msgid "Status : " +msgstr "Statut : " + +#: knutdock.cpp:425 knutvardata.cpp:209 +msgid "Connection doesn't exist." +msgstr "Cette connexion n'existe pas." + +#: knutdock.cpp:429 knutfrontpanel.cpp:80 +msgid "UPS On line" +msgstr "Sur secteur" + +#: knutdock.cpp:433 knutfrontpanel.cpp:95 +msgid "UPS On battery" +msgstr "Sur batterie" + +#: knutdock.cpp:437 +msgid "UPS Of line" +msgstr "Onduleur arrĂŞtĂŠ" + +#: knutdock.cpp:443 +msgid "UPS Battery is low" +msgstr "Niveau batterie basse" + +#: knutdock.cpp:446 knutfrontpanel.cpp:138 +msgid "Replace battery" +msgstr "Remplacer la batterie" + +#: knutdock.cpp:452 +msgid "UPS is Overload" +msgstr "En surcharge" + +#: knutdock.cpp:455 +msgid "UPS is trimming voltage" +msgstr "L'onduleur rabaisse la tension" + +#: knutdock.cpp:458 +msgid "UPS is boosting voltage" +msgstr "L'onduleur redresse la tension" + +#: knutdock.cpp:464 +msgid "Error : " +msgstr "Erreur : " + +#: knutdock.cpp:467 knutfrontpanel.cpp:182 +msgid "Manufac. : " +msgstr "Fabricant : " + +#: knutdock.cpp:471 +msgid "Serial" +msgstr "N° de sĂŠrie" + +#: knutdock.cpp:473 +msgid "Firmware" +msgstr "Vers. Fw." + +#: knutdock.cpp:477 knutfrontpanel.cpp:233 +msgid "Runtime" +msgstr "Autonomie" + +#: knutdock.cpp:477 +msgid " : %1:%2 min" +msgstr " : %1:%2 min" + +#: knutdock.cpp:482 knutvardata.cpp:45 +msgid "Battery Charge" +msgstr "Charge de la batterie" + +#: knutdock.cpp:487 knutvardata.cpp:48 +msgid "UPS Load" +msgstr "Charge de l'onduleur" + +#: knutdock.cpp:513 knutmainwindow.cpp:663 +msgid "Are you sure ?" +msgstr "Êtes vous sĂťr ?" + +#: knutdock.cpp:636 knutmainwindow.cpp:748 +msgid "&Showing UPS variables and commands" +msgstr "&Voir les variables et commandes onduleurs" + +#: knutdock.cpp:637 knutmainwindow.cpp:749 +msgid "&Running instant commands" +msgstr "Commandes &instantanĂŠes" + +#: knutdock.cpp:638 knutmainwindow.cpp:750 +msgid "Setting R&W variables" +msgstr "Configurer les &variables de l'onduleur" + +#: knutdock.cpp:642 +msgid "&Preferences" +msgstr "&PrĂŠfĂŠrences" + +#: knutdock.cpp:644 +msgid "&About KNutClient" +msgstr "&A propos de KNutClient" + +#: knutdock.cpp:646 +msgid "&Minimize" +msgstr "&RĂŠduire" + +#: knutdock.cpp:648 +msgid "&Exit" +msgstr "&Sortir" + +#: knutfrontpanel.cpp:110 +msgid "UPS Overload" +msgstr "En surcharge" + +#: knutfrontpanel.cpp:124 +msgid "UPS Battery low" +msgstr "Niveau batterie bas" + +#: knutfrontpanel.cpp:152 +msgid "UPS calibration" +msgstr "Calibrage onduleur" + +#: knutfrontpanel.cpp:202 +msgid "Serial : " +msgstr "N° sĂŠrie : " + +#: knutfrontpanel.cpp:212 +msgid "Firm. rev. : " +msgstr "Vers. Fw. : " + +#: knutinstcomms.cpp:33 +msgid "Instant commands" +msgstr "Commandes directes" + +#: knutinstcomms.cpp:45 +msgid "RUN INSTANT COMMAND" +msgstr "Lancer Commande Directe" + +#: knutinstcomms.cpp:49 +msgid "Command:" +msgstr "Commande :" + +#: knutinstcomms.cpp:53 knutnewupsdlg.cpp:102 knutrwvar.cpp:70 +msgid "User name:" +msgstr "Utilisateur :" + +#: knutinstcomms.cpp:54 knutnewupsdlg.cpp:109 knutrwvar.cpp:71 +msgid "Password:" +msgstr "Mot de passe :" + +#: knutmainwindow.cpp:59 +msgid "test of conection from 5" +msgstr "test de connexion depuis 5" + +#: knutmainwindow.cpp:745 +msgid "Quits the application" +msgstr "Quitter l'application." + +#: knutmainwindow.cpp:778 +msgid "&Using descriptions" +msgstr "&Utiliser les descriptions" + +#: knutnewupsdlg.cpp:39 +msgid "New Ups" +msgstr "Nouvel Onduleur" + +#: knutnewupsdlg.cpp:89 +msgid "Delay (ms):" +msgstr "DĂŠlai (ms):" + +#: knutnewupsdlg.cpp:96 +msgid "Port:" +msgstr "Port :" + +#: knutnewupsdlg.cpp:116 +msgid "Store NUT password in configuration file" +msgstr "Stocker le mot de passe NUT dans le fichier de configuration" + +#: knutnewupsdlg.cpp:123 +msgid "Availabled UPS values" +msgstr "Valeurs disponibles" + +#: knutnewupsdlg.cpp:124 +msgid "Selected UPS values" +msgstr "Valeurs sĂŠlectionnĂŠes" + +#: knutnewupsdlg.cpp:134 +msgid "UPS Variables" +msgstr "Variables de l'onduleur" + +#: knutnewupsdlg.cpp:255 +msgid "No Name or UPS address" +msgstr "Pas de nom ou d'adresse pour l'onduleur" + +#: knutnewupsdlg.cpp:263 +msgid "This Name exist" +msgstr "Ce nom existe" + +#: knutnewupsdlg.cpp:270 +msgid "Delay must be number" +msgstr "Le dĂŠlai doit ĂŞtre un nombre" + +#: knutnewupsdlg.cpp:276 +msgid "Port must be number" +msgstr "Le port doit ĂŞtre un nombre" + +#: knutnewupsdlg.cpp:281 +msgid "Port must be from 1025 until 65535" +msgstr "Le port doit valoir de 1025 Ă  65535" + +#: knutnewupsdlg.cpp:286 +msgid "Delay is too small" +msgstr "Le dĂŠlai est trop faible" + +#: knutprefdlg.cpp:45 +msgid "Preferences" +msgstr "PrĂŠfĂŠrences" + +#: knutprefdlg.cpp:508 +msgid "Setting" +msgstr "Paramètres" + +#: knutprefdlg.cpp:508 +msgid "Main Setting" +msgstr "Paramètres principaux" + +#: knutprefdlg.cpp:516 +msgid "Voltage/Frequency" +msgstr "Tension/FrĂŠquence" + +#: knutprefdlg.cpp:519 +msgid "&Use High-Low XFER" +msgstr "&Utiliser Niveau Transfert Haut-Bas" + +#: knutprefdlg.cpp:521 +msgid "Number of columns :" +msgstr "Nombre de colonnes :" + +#: knutprefdlg.cpp:524 knutprefdlg.cpp:815 knutprefdlg.cpp:894 +msgid "Use custom background color" +msgstr "Utiliser une couleur de fond personnalisĂŠe :" + +#: knutprefdlg.cpp:528 knutprefdlg.cpp:818 knutprefdlg.cpp:896 +msgid "Color of background :" +msgstr "Couleur de fond :" + +#: knutprefdlg.cpp:532 +msgid "Use dialog \"Are you sure\"" +msgstr "Utiliser la boite de dialogue \"Êtes vous sĂťr\"" + +#: knutprefdlg.cpp:535 +msgid "Use Main window when program is started" +msgstr "Utiliser la FenĂŞtre Principale au dĂŠmarrage du programme" + +#: knutprefdlg.cpp:538 +msgid "Show message window, when program reports error" +msgstr "" +"Afficher la fenĂŞtre de message, lorsque le programme rapporte une erreur" + +#: knutprefdlg.cpp:543 +msgid "Auto" +msgstr "Auto" + +#: knutprefdlg.cpp:547 +msgid "Nominal Input Voltage" +msgstr "Tension d'entrĂŠe nominale" + +#: knutprefdlg.cpp:550 +msgid "&230 V" +msgstr "&230 V" + +#: knutprefdlg.cpp:551 +msgid "&120 V" +msgstr "&120 V" + +#: knutprefdlg.cpp:553 +msgid "Nominal Input Frequency" +msgstr "FrĂŠquence d'entrĂŠe nominale" + +#: knutprefdlg.cpp:556 +msgid "&50 Hz" +msgstr "&50 Hz" + +#: knutprefdlg.cpp:557 +msgid "&60 Hz" +msgstr "&60 Hz" + +#: knutprefdlg.cpp:628 +msgid "UPS" +msgstr "Onduleur" + +#: knutprefdlg.cpp:628 +msgid "UPS Setting" +msgstr "Paramètres de l'onduleur" + +#: knutprefdlg.cpp:646 +msgid "&Add" +msgstr "&Ajouter" + +#: knutprefdlg.cpp:667 +msgid "Dock bar" +msgstr "Dock" + +#: knutprefdlg.cpp:667 +msgid "Docking Setting" +msgstr "Paramètres du dock" + +#: knutprefdlg.cpp:671 +msgid "Type of dock's showing" +msgstr "Type d'affichage du dock" + +#: knutprefdlg.cpp:676 +msgid "Items of tooltip" +msgstr "ElĂŠments de l'aide contextuelle" + +#: knutprefdlg.cpp:684 +msgid "&Picture" +msgstr "&Image" + +#: knutprefdlg.cpp:685 +msgid "&General" +msgstr "&GĂŠnĂŠral" + +#: knutprefdlg.cpp:688 knutprefdlg.cpp:799 +msgid "M&anufacturer" +msgstr "F&abricant" + +#: knutprefdlg.cpp:691 knutprefdlg.cpp:802 +msgid "M&odel" +msgstr "M&odèle" + +#: knutprefdlg.cpp:694 knutprefdlg.cpp:805 +msgid "&Serial" +msgstr "N°&SĂŠrie" + +#: knutprefdlg.cpp:697 knutprefdlg.cpp:808 +msgid "&Firm. rev." +msgstr "&Vers. Fw." + +#: knutprefdlg.cpp:700 knutprefdlg.cpp:811 +msgid "&Runtime" +msgstr "&Autonomie" + +#: knutprefdlg.cpp:703 +msgid "&Battery Charge" +msgstr "&Charge de la batterie" + +#: knutprefdlg.cpp:706 +msgid "&UPS Load" +msgstr "Charge de l'&onduleur" + +#: knutprefdlg.cpp:710 +msgid "Use custom icon's background color" +msgstr "Utiliser une couleur de fond personnalisĂŠe pour les icones :" + +#: knutprefdlg.cpp:713 +msgid "Color of icon's background :" +msgstr "Couleur de fond des icones :" + +#: knutprefdlg.cpp:769 +msgid "Panel" +msgstr "Panneau" + +#: knutprefdlg.cpp:769 +msgid "Panel Setting" +msgstr "Paramètres du panneau" + +#: knutprefdlg.cpp:784 +msgid "UPS &Overload" +msgstr "En &Surcharge" + +#: knutprefdlg.cpp:787 +msgid "UPS &Battery low" +msgstr "&Batterie faible" + +#: knutprefdlg.cpp:790 +msgid "R&eplace battery" +msgstr "R&emplacer la batterie" + +#: knutprefdlg.cpp:793 +msgid "Ups &calibration" +msgstr "&Calibration de l'onduleur" + +#: knutprefdlg.cpp:796 +msgid "&Manufac. + Model" +msgstr "&Fabricant. + Modèle" + +#: knutprefdlg.cpp:851 +msgid "Setting Fonts" +msgstr "Paramètres des Polices" + +#: knutprefdlg.cpp:858 +msgid "&Use custom font" +msgstr "&Utiliser les polices personnalisĂŠes" + +#: knutprefdlg.cpp:863 +msgid "Main panel" +msgstr "Panneau principal" + +#: knutprefdlg.cpp:864 +msgid "Analog panels" +msgstr "Panneau analogique" + +#: knutprefdlg.cpp:887 +msgid "Analog" +msgstr "Analogique" + +#: knutprefdlg.cpp:887 +msgid "Setting Analog panel" +msgstr "Paramètres du panneau analogique" + +#: knutprefdlg.cpp:898 +msgid "Use custom other colors" +msgstr "Utiliser d'autres couleurs personnalisĂŠes" + +#: knutprefdlg.cpp:900 +msgid "Color of pointer :" +msgstr "Couleur du pointeur :" + +#: knutprefdlg.cpp:902 +msgid "Color of OK range :" +msgstr "Couleur pour \"OK\" :" + +#: knutprefdlg.cpp:904 +msgid "Color of warning range :" +msgstr "Couleur des avertissements :" + +#: knutprefdlg.cpp:906 +msgid "Color of error range :" +msgstr "Couleur des erreurs :" + +#: knutprefdlg.cpp:908 +msgid "Color of scale :" +msgstr "Couleur de l'ĂŠchelle :" + +#: knutprefdlg.cpp:910 +msgid "Color of font :" +msgstr "Couleur des polices :" + +#: knutprefdlg.cpp:913 +msgid "Digital processing of pointers :" +msgstr "Traitement numĂŠrique des pointeurs :" + +#: knutprefdlg.cpp:964 +msgid "Nothing processing" +msgstr "Aucun traitement" + +#: knutprefdlg.cpp:965 +msgid "Fast antialiasing" +msgstr "Anti crĂŠnelage rapide" + +#: knutprefdlg.cpp:966 +msgid "Fine antialiasing" +msgstr "Anti crĂŠnelage fin" + +#: knutprefdlg.cpp:967 +msgid "Fast antialiasing and blur motion" +msgstr "Anti crĂŠnelage rapide et fondu animĂŠ" + +#: knutprefdlg.cpp:968 +msgid "Fine antialiasing and blur motion" +msgstr "Anti crĂŠnelage fin et fondu animĂŠ" + +#: knutprintupsvar.cpp:41 +msgid "Variables" +msgstr "Variables" + +#: knutprintupsvar.cpp:50 +msgid "Reload Vars" +msgstr "Recharger les variables" + +#: knutprintupsvar.cpp:52 +msgid "UPS variables" +msgstr "Variables de l'onduleur" + +#: knutprintupsvar.cpp:79 +msgid "Value" +msgstr "Valeur" + +#: knutprintupsvar.cpp:81 +msgid "Description" +msgstr "Descriptions" + +#: knutprintupsvar.cpp:90 +msgid "Instant Commands" +msgstr "Commandes directes" + +#: knutprintupsvar.cpp:103 +msgid "Read/Write Variables" +msgstr "Variables en lecture/ĂŠcriture" + +#: knutprintupsvar.cpp:121 +msgid "Read Only Variables" +msgstr "Variables en lecture seule" + +#: knutrwvar.cpp:40 +msgid "RW variables" +msgstr "Variables en lecture/ĂŠcriture" + +#: knutrwvar.cpp:56 +msgid "SET RW VARIABLE" +msgstr "Affecter une variable" + +#: knutrwvar.cpp:61 +msgid "Variable:" +msgstr "Variables :" + +#: knutrwvar.cpp:64 +msgid "Value:" +msgstr "Valeur" + +#: knutvardata.cpp:43 +msgid "None" +msgstr "Aucun" + +#: knutvardata.cpp:44 +msgid "Input Voltage" +msgstr "Tension d'entrĂŠe" + +#: knutvardata.cpp:46 +msgid "UPS Temperature" +msgstr "TempĂŠrature de l'onduleur" + +#: knutvardata.cpp:47 +msgid "Input Frequency" +msgstr "FrĂŠquence d'entrĂŠe" + +#: knutvardata.cpp:49 +msgid "Outside Temperature" +msgstr "TempĂŠrature extĂŠrieure" + +#: knutvardata.cpp:50 +msgid "Outside Humidity" +msgstr "HumiditĂŠ extĂŠrieure" + +#: knutvardata.cpp:51 +msgid "Battery Voltage" +msgstr "Tension de la batterie" + +#: knutvardata.cpp:52 +msgid "Output Voltage" +msgstr "Tension de sortie" + +#: knutvardata.cpp:53 +msgid "Output Current" +msgstr "Courant de sortie" + +#: knutvardata.cpp:54 +msgid "Output Frequency" +msgstr "FrĂŠquence de Sortie" + +#: knutvardata.cpp:55 +msgid "Battery Temperature" +msgstr "TempĂŠrature de la batterie" + +#: knutvardata.cpp:56 +msgid "Battery Current" +msgstr "Courant de la batterie" + +#: knutvardata.cpp:186 +msgid "No memory." +msgstr "Pas de mĂŠmoire." + +#: knutvardata.cpp:187 +msgid "No address." +msgstr "Pas d'adresse." + +#: knutvardata.cpp:188 +msgid "Unknown address." +msgstr "Adresse inconnue." + +#: knutvardata.cpp:191 +msgid "Error of connection." +msgstr "Erreur de connexion." + +#: knutvardata.cpp:194 +msgid "No connection with server." +msgstr "Pas de connexion avec le serveur." + +#: knutvardata.cpp:196 +msgid "Server-client protocol or variables of NUT are unknown." +msgstr "Le protocole Client-Server ou les variables NUT sont inconnues." + +#: knutvardata.cpp:197 +msgid "No UPS on this address." +msgstr "Pas d'onduleur à cette adresse." + +#: knutvardata.cpp:198 +msgid "Connection was refused by server." +msgstr "La connexion a ĂŠtĂŠ refusĂŠe par le serveur." + +#: knutvardata.cpp:200 +msgid "Server doesn't receive data." +msgstr "Le serveur n'a pas reçu les donnĂŠes." + +#: knutvardata.cpp:201 +msgid "Server doesn't send data." +msgstr "Le serveur n'a pas renvoyĂŠ de donnĂŠes." + +#: knutvardata.cpp:202 +msgid "Server doesn't answer." +msgstr "Le serveur ne rĂŠponds pas." + +#: knutvardata.cpp:204 +msgid "Server returns data with unknown format." +msgstr "Le serveur a retournÊ des donnÊes dans un format inconnu." + +#: knutvardata.cpp:205 +msgid "Server returns unknown data." +msgstr "Le serveur a retournĂŠ des donnĂŠes inconnues." + +#: knutvardata.cpp:206 +msgid "Command VER returns data with unknown format." +msgstr "La commande VER a retournÊ des donnÊes dans un format inconnu." + +#: knutvardata.cpp:208 +msgid "No data." +msgstr "Pas de donnĂŠes" + +#: knutvardata.cpp:212 +msgid "Access denied. Failed password ?" +msgstr "Accès refusĂŠ : mot de passe invalide ?" + +#: knutvardata.cpp:213 +msgid "UPS doesn't sent data to server (Data Stale)." +msgstr "L'onduleur ne communique pas avec le serveur (DonnĂŠes PĂŠrimĂŠes)" + +#: knutvardata.cpp:214 +msgid "Server doesn't know this command." +msgstr "Le serveur ne connaĂŽt pas cette commande." + +#: knutvardata.cpp:217 +msgid "UPS's driver isn't connected." +msgstr "Le pilote de cet onduleur n'est pas connectĂŠ." + +#: knutvardata.cpp:219 +msgid "Server required password." +msgstr "Le serveur requiert un mot de passe." + +#: knutvardata.cpp:220 +msgid "Incorrect password." +msgstr "Mot de passe incorrect." + +#: knutvardata.cpp:221 +msgid "UPS doesn't response." +msgstr "L'onduleur ne rĂŠponds pas." + +#: knutvardata.cpp:222 +msgid "Command failed." +msgstr "La commande a ĂŠchouĂŠ." + +#: knutvardata.cpp:223 +msgid "UPS doesn't know this instant command." +msgstr "L'onduleur ne connaĂŽt pas cette commande directe." + +#: knutvardata.cpp:224 +msgid "UPS doesn't support this instant command." +msgstr "L'onduleur ne supporte pas cette commande directe." + +#: knutvardata.cpp:225 +msgid "UPS doesn't known this variable." +msgstr "L'onduleur ne connaĂŽt pas cette variable." + +#: knutvardata.cpp:226 +msgid "UPS doesn't support this variable." +msgstr "L'onduleur ne supporte pas cette variable." + +#: knutvardata.cpp:227 +msgid "UPS doesn't support this value in this variable." +msgstr "L'onduleur ne supporte pas cette valeur pour cette variable." + +#: knutvardata.cpp:228 +msgid "Name of UPS is unknown." +msgstr "Cette onduleur est inconnu." + +#: knutvardata.cpp:230 +msgid "Username has been already entered." +msgstr "Le nom d'utilisateur a dĂŠjĂ  ĂŠtĂŠ entrĂŠ." + +#: knutvardata.cpp:231 +msgid "Password has been already entered." +msgstr "Le mot de passe a dĂŠjĂ  ĂŠtĂŠ entrĂŠ." + +#: knutvardata.cpp:233 +msgid "Server doesn't send list of variables." +msgstr "Le serveur n'a pas renvoyĂŠ la liste de variables." + +#: knutvardata.cpp:236 +msgid "Unknown error." +msgstr "Erreur inconnue." + +#: main.cpp:31 +msgid "Client for Network UPS Tool" +msgstr "Client pour Network UPS Tools" + +#: main.cpp:37 +msgid "Don't dock in Kicker" +msgstr "Ne pas docker dans le Kicker" + +#: main.cpp:47 +msgid "KNutClient" +msgstr "KNutClient" + +#. i18n: file ./knutclientui.rc line 13 +#: rc.cpp:9 +#, no-c-format +msgid "&Connection" +msgstr "&Connection" + +#~ msgid "Toggle the toolbar..." +#~ msgstr "Afficher la barre d'outils..." + +#~ msgid "Toggle the statusbar..." +#~ msgstr "Afficher la barre d'ĂŠtat..." + +#~ msgid "Protocol" +#~ msgstr "Protocole" + +#~ msgid "UDP" +#~ msgstr "UDP" + +#~ msgid "TCP" +#~ msgstr "TCP" + +#~ msgid "&Settings" +#~ msgstr "&Paramètres" diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000..dbba5c4 --- /dev/null +++ b/po/it.po @@ -0,0 +1,864 @@ +# translation of it.po to +# Daniel Prynych , 2003, 2008. +msgid "" +msgstr "" +"Project-Id-Version: it\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-02-21 12:13+0100\n" +"PO-Revision-Date: 2008-06-11 20:56+0200\n" +"Last-Translator: Daniel Prynych \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" + +#: _translatorinfo.cpp:1 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "Andrea Pesarini" + +#: _translatorinfo.cpp:3 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "andreapes72@yahoo.it" + +#: knutclient.cpp:86 +msgid "Ready." +msgstr "Pronto." + +#: knutclient.cpp:218 knutclient.cpp:219 +msgid "The connection was renewed." +msgstr "La connessione e' stata rinnovata" + +#: knutclient.cpp:285 +msgid "The connection failed. The next connection will make after %1 sec." +msgstr "" +"La connessione non e' riuscita.La prossima connessione verra' fatta dopo %1 " +"sec." + +#: knutclient.cpp:546 +msgid "upsd > 1.2 doesn't support UDP. Connection is switched to TCP" +msgstr "upsd > 1.2 non supporta UDP. Connessione spostata su TCP" + +#: knutclient.cpp:688 knutclient.cpp:689 +msgid "Data OK" +msgstr "Dati OK" + +#: knutclient.cpp:781 knutclient.cpp:782 +msgid "The connection was closed by the second side (upsd)." +msgstr "La connessione e' stata chiusa da un altro lato (upsd)." + +#: knutclient.cpp:798 knutclient.cpp:799 +msgid "UPS is off." +msgstr "UPS e' off." + +#: knutclient.cpp:802 knutclient.cpp:803 +msgid "UPS is back on." +msgstr "UPS e' tornato in linea." + +#: knutclient.cpp:808 knutclient.cpp:809 +msgid "Power is back online." +msgstr "Power e' tornato in linea." + +#: knutclient.cpp:814 knutclient.cpp:815 +msgid "UPS is on battery." +msgstr "UPS in modalita' batteria." + +#: knutclient.cpp:820 knutclient.cpp:821 +msgid "UPS battery is low." +msgstr "Batteria UPS scarica" + +#: knutclient.cpp:824 knutclient.cpp:825 +msgid "UPS battery is OK." +msgstr "Batteria UPS e' carica" + +#: knutclient.cpp:830 knutclient.cpp:831 +msgid "UPS battery is bad and needs be replaced." +msgstr "UPS ha le batterie rovinate, e' consigliato sostituirle." + +#: knutclient.cpp:836 knutclient.cpp:837 +msgid "UPS is overloaded." +msgstr "UPS in sovraccarico" + +#: knutclient.cpp:840 knutclient.cpp:841 +msgid "UPS isn't overloaded." +msgstr "UPS non e' in sovraccarico" + +#: knutclient.cpp:846 knutclient.cpp:847 knutdock.cpp:449 +#, fuzzy +msgid "UPS is performing calibration" +msgstr "Calibrazione UPS" + +#: knutclient.cpp:850 knutclient.cpp:851 +msgid "Calibration of UPS is ended." +msgstr "Calibrazione UPS completata" + +#: knutclient.cpp:856 knutclient.cpp:857 +msgid "UPS is boosting incoming voltage." +msgstr "UPS sta prendendo la tensione in entrata." + +#: knutclient.cpp:860 knutclient.cpp:861 +msgid "Boosting of UPS is ended." +msgstr "UPS ha finito." + +#: knutclient.cpp:866 knutclient.cpp:867 +msgid "UPS is trimming incoming voltage." +msgstr "UPS is trimming incoming voltage." + +#: knutclient.cpp:870 knutclient.cpp:871 +msgid "Trimming of UPS is ended." +msgstr "Trimming of UPS is ended." + +#: knutclient.cpp:887 knutclient.cpp:954 knutclient.cpp:963 +msgid "Switched" +msgstr "Selezionare" + +#: knutclient.cpp:1103 knutdock.cpp:640 knutmainwindow.cpp:781 +msgid "Reconnect" +msgstr "Riconnettere" + +#: knutdock.cpp:419 knutdock.cpp:469 knutfrontpanel.cpp:192 +#: knutnewupsdlg.cpp:69 knutprintupsvar.cpp:78 +msgid "Name" +msgstr "Nome:" + +#: knutdock.cpp:420 knutnewupsdlg.cpp:83 +msgid "UPS name" +msgstr "Nome UPS" + +#: knutdock.cpp:421 knutnewupsdlg.cpp:77 +msgid "UPS address" +msgstr "Indirizzo UPS" + +#: knutdock.cpp:422 knutdock.cpp:443 knutdock.cpp:446 knutdock.cpp:449 +#: knutdock.cpp:452 knutdock.cpp:455 knutdock.cpp:458 +msgid "Status : " +msgstr "Stato : " + +#: knutdock.cpp:425 knutvardata.cpp:209 +msgid "Connection doesn't exist." +msgstr "Connessione non esiste." + +#: knutdock.cpp:429 knutfrontpanel.cpp:80 +msgid "UPS On line" +msgstr "UPS in linea" + +#: knutdock.cpp:433 knutfrontpanel.cpp:95 +msgid "UPS On battery" +msgstr "UPS in modalita batteria" + +#: knutdock.cpp:437 +#, fuzzy +msgid "UPS Of line" +msgstr "UPS non in linea" + +#: knutdock.cpp:443 +msgid "UPS Battery is low" +msgstr "Batteria UPS scarica" + +#: knutdock.cpp:446 knutfrontpanel.cpp:138 +msgid "Replace battery" +msgstr "Sostituire batterie" + +#: knutdock.cpp:452 +msgid "UPS is Overload" +msgstr "UPS in sovraccarico" + +#: knutdock.cpp:455 +#, fuzzy +msgid "UPS is trimming voltage" +msgstr "UPS is trimming voltage" + +#: knutdock.cpp:458 +#, fuzzy +msgid "UPS is boosting voltage" +msgstr "Calibrazione UPS" + +#: knutdock.cpp:464 +msgid "Error : " +msgstr "Errore : " + +#: knutdock.cpp:467 knutfrontpanel.cpp:182 +msgid "Manufac. : " +msgstr "Manufac. : " + +#: knutdock.cpp:471 +#, fuzzy +msgid "Serial" +msgstr "Seriale" + +#: knutdock.cpp:473 +#, fuzzy +msgid "Firmware" +msgstr "Firmware" + +#: knutdock.cpp:477 knutfrontpanel.cpp:233 +msgid "Runtime" +msgstr "Runtime" + +#: knutdock.cpp:477 +msgid " : %1:%2 min" +msgstr " : %1:%2 min" + +#: knutdock.cpp:482 knutvardata.cpp:45 +msgid "Battery Charge" +msgstr "Capacita batterie" + +#: knutdock.cpp:487 knutvardata.cpp:48 +msgid "UPS Load" +msgstr "UPS carico" + +#: knutdock.cpp:513 knutmainwindow.cpp:663 +msgid "Are you sure ?" +msgstr "Sei sicuro ?" + +#: knutdock.cpp:636 knutmainwindow.cpp:748 +#, fuzzy +msgid "&Showing UPS variables and commands" +msgstr "Mostrando variabili e comandi UPS" + +#: knutdock.cpp:637 knutmainwindow.cpp:749 +#, fuzzy +msgid "&Running instant commands" +msgstr "Partenza comandi istantanei" + +#: knutdock.cpp:638 knutmainwindow.cpp:750 +#, fuzzy +msgid "Setting R&W variables" +msgstr "Variabili UPS" + +#: knutdock.cpp:642 +#, fuzzy +msgid "&Preferences" +msgstr "Preferenze" + +#: knutdock.cpp:644 +#, fuzzy +msgid "&About KNutClient" +msgstr "&About KNutClient" + +#: knutdock.cpp:646 +msgid "&Minimize" +msgstr "Minimizza" + +#: knutdock.cpp:648 +msgid "&Exit" +msgstr "&Exit" + +#: knutfrontpanel.cpp:110 +msgid "UPS Overload" +msgstr "UPS in sovraccarico" + +#: knutfrontpanel.cpp:124 +msgid "UPS Battery low" +msgstr "Batteria UPS scarica" + +#: knutfrontpanel.cpp:152 +msgid "UPS calibration" +msgstr "Calibrazione UPS" + +#: knutfrontpanel.cpp:202 +msgid "Serial : " +msgstr "Seriale: " + +#: knutfrontpanel.cpp:212 +msgid "Firm. rev. : " +msgstr "Ver. firmware : " + +#: knutinstcomms.cpp:33 +msgid "Instant commands" +msgstr "Comando istantaneo" + +#: knutinstcomms.cpp:45 +msgid "RUN INSTANT COMMAND" +msgstr "avvio comando instantaneo" + +#: knutinstcomms.cpp:49 +msgid "Command:" +msgstr "Comando:" + +#: knutinstcomms.cpp:53 knutnewupsdlg.cpp:102 knutrwvar.cpp:70 +msgid "User name:" +msgstr "User name:" + +#: knutinstcomms.cpp:54 knutnewupsdlg.cpp:109 knutrwvar.cpp:71 +msgid "Password:" +msgstr "Password:" + +#: knutmainwindow.cpp:59 +msgid "test of conection from 5" +msgstr "test di connessione dal 5" + +#: knutmainwindow.cpp:745 +msgid "Quits the application" +msgstr "Chiude l'applicazione" + +#: knutmainwindow.cpp:778 +#, fuzzy +msgid "&Using descriptions" +msgstr "&Descrizione usata" + +#: knutnewupsdlg.cpp:39 +msgid "New Ups" +msgstr "Nuovo UPS" + +#: knutnewupsdlg.cpp:89 +msgid "Delay (ms):" +msgstr "Ritardo (ms):" + +#: knutnewupsdlg.cpp:96 +msgid "Port:" +msgstr "Porta:" + +#: knutnewupsdlg.cpp:116 +msgid "Store NUT password in configuration file" +msgstr "Registra password di NUT nel file di configurazione" + +#: knutnewupsdlg.cpp:123 +msgid "Availabled UPS values" +msgstr "" + +#: knutnewupsdlg.cpp:124 +msgid "Selected UPS values" +msgstr "" + +#: knutnewupsdlg.cpp:134 +msgid "UPS Variables" +msgstr "Variabili UPS" + +#: knutnewupsdlg.cpp:255 +msgid "No Name or UPS address" +msgstr "Nessun nome o indirizzo UPS" + +#: knutnewupsdlg.cpp:263 +msgid "This Name exist" +msgstr "Questo nome esiste" + +#: knutnewupsdlg.cpp:270 +msgid "Delay must be number" +msgstr "Ritardo deve essere maggiore" + +#: knutnewupsdlg.cpp:276 +msgid "Port must be number" +msgstr "Porta deve essere un numero" + +#: knutnewupsdlg.cpp:281 +msgid "Port must be from 1025 until 65535" +msgstr "Porta puo variare da 1025 a 65535" + +#: knutnewupsdlg.cpp:286 +msgid "Delay is too small" +msgstr "Ritardo troppo piccolo" + +#: knutprefdlg.cpp:45 +msgid "Preferences" +msgstr "Preferenze" + +#: knutprefdlg.cpp:508 +msgid "Setting" +msgstr "Settaggi" + +#: knutprefdlg.cpp:508 +msgid "Main Setting" +msgstr "Settaggi principali" + +#: knutprefdlg.cpp:516 +msgid "Voltage/Frequency" +msgstr "Tensione/Frequenza" + +#: knutprefdlg.cpp:519 +msgid "&Use High-Low XFER" +msgstr "&Use High-Low XFER" + +#: knutprefdlg.cpp:521 +msgid "Number of columns :" +msgstr "Number of rows :" + +#: knutprefdlg.cpp:524 knutprefdlg.cpp:815 knutprefdlg.cpp:894 +msgid "Use custom background color" +msgstr "Colore di sfondo custom:" + +#: knutprefdlg.cpp:528 knutprefdlg.cpp:818 knutprefdlg.cpp:896 +msgid "Color of background :" +msgstr "Colore di sfondo :" + +#: knutprefdlg.cpp:532 +#, fuzzy +msgid "Use dialog \"Are you sure\"" +msgstr "Usare dialogo \"Sei sicuro\"" + +#: knutprefdlg.cpp:535 +msgid "Use Main window when program is started" +msgstr "Usa Schermata Principale quando il programma caricato" + +#: knutprefdlg.cpp:538 +msgid "Show message window, when program reports error" +msgstr "Apri finestra , quando programma riporta errori" + +#: knutprefdlg.cpp:543 +msgid "Auto" +msgstr "" + +#: knutprefdlg.cpp:547 +msgid "Nominal Input Voltage" +msgstr "Tensione di Ingresso" + +#: knutprefdlg.cpp:550 +msgid "&230 V" +msgstr "&230 V" + +#: knutprefdlg.cpp:551 +msgid "&120 V" +msgstr "&120 V" + +#: knutprefdlg.cpp:553 +msgid "Nominal Input Frequency" +msgstr "Frequenza di ingresso" + +#: knutprefdlg.cpp:556 +msgid "&50 Hz" +msgstr "&50 Hz" + +#: knutprefdlg.cpp:557 +msgid "&60 Hz" +msgstr "&60 Hz" + +#: knutprefdlg.cpp:628 +msgid "UPS" +msgstr "UPS" + +#: knutprefdlg.cpp:628 +msgid "UPS Setting" +msgstr "Settaggi UPS" + +#: knutprefdlg.cpp:646 +msgid "&Add" +msgstr "&Add" + +#: knutprefdlg.cpp:667 +#, fuzzy +msgid "Dock bar" +msgstr "Dock" + +#: knutprefdlg.cpp:667 +#, fuzzy +msgid "Docking Setting" +msgstr "Docking Setting" + +#: knutprefdlg.cpp:671 +msgid "Type of dock's showing" +msgstr "Type of dock's showing" + +#: knutprefdlg.cpp:676 +msgid "Items of tooltip" +msgstr "Items of tooltip" + +#: knutprefdlg.cpp:684 +msgid "&Picture" +msgstr "&Picture" + +#: knutprefdlg.cpp:685 +#, fuzzy +msgid "&General" +msgstr "&Generale" + +#: knutprefdlg.cpp:688 knutprefdlg.cpp:799 +msgid "M&anufacturer" +msgstr "M&anufacturer" + +#: knutprefdlg.cpp:691 knutprefdlg.cpp:802 +msgid "M&odel" +msgstr "&Modello" + +#: knutprefdlg.cpp:694 knutprefdlg.cpp:805 +msgid "&Serial" +msgstr "&Seriale" + +#: knutprefdlg.cpp:697 knutprefdlg.cpp:808 +msgid "&Firm. rev." +msgstr "&Firm. rev." + +#: knutprefdlg.cpp:700 knutprefdlg.cpp:811 +msgid "&Runtime" +msgstr "&Runtime" + +#: knutprefdlg.cpp:703 +#, fuzzy +msgid "&Battery Charge" +msgstr "Capacita batterie" + +#: knutprefdlg.cpp:706 +#, fuzzy +msgid "&UPS Load" +msgstr "UPS carico" + +#: knutprefdlg.cpp:710 +#, fuzzy +msgid "Use custom icon's background color" +msgstr "Colore di sfondo custom:" + +#: knutprefdlg.cpp:713 +#, fuzzy +msgid "Color of icon's background :" +msgstr "Colore di sfondo :" + +#: knutprefdlg.cpp:769 +msgid "Panel" +msgstr "Pannello" + +#: knutprefdlg.cpp:769 +msgid "Panel Setting" +msgstr "Settaggi pannello" + +#: knutprefdlg.cpp:784 +msgid "UPS &Overload" +msgstr "UPS &Sovraccarico" + +#: knutprefdlg.cpp:787 +msgid "UPS &Battery low" +msgstr "UPS &Batterie scariche" + +#: knutprefdlg.cpp:790 +msgid "R&eplace battery" +msgstr "R&impiazzare batterie" + +#: knutprefdlg.cpp:793 +msgid "Ups &calibration" +msgstr "UPS &calibrazione" + +#: knutprefdlg.cpp:796 +msgid "&Manufac. + Model" +msgstr "&Manufac. + Modello" + +#: knutprefdlg.cpp:851 +msgid "Setting Fonts" +msgstr "Settaggio Fonts" + +#: knutprefdlg.cpp:858 +msgid "&Use custom font" +msgstr "&Usare custom font" + +#: knutprefdlg.cpp:863 +msgid "Main panel" +msgstr "Pannello principale" + +#: knutprefdlg.cpp:864 +msgid "Analog panels" +msgstr "Pannello analogico" + +#: knutprefdlg.cpp:887 +msgid "Analog" +msgstr "Analogico" + +#: knutprefdlg.cpp:887 +msgid "Setting Analog panel" +msgstr "Settaggi Pannello Analogico" + +#: knutprefdlg.cpp:898 +msgid "Use custom other colors" +msgstr "Usare altri custom colori" + +#: knutprefdlg.cpp:900 +msgid "Color of pointer :" +msgstr "Colore del puntatore :" + +#: knutprefdlg.cpp:902 +msgid "Color of OK range :" +msgstr "Colore di OK range :" + +#: knutprefdlg.cpp:904 +msgid "Color of warning range :" +msgstr "Colore di warning range :" + +#: knutprefdlg.cpp:906 +msgid "Color of error range :" +msgstr "Colore di error range :" + +#: knutprefdlg.cpp:908 +msgid "Color of scale :" +msgstr "Colore di scala :" + +#: knutprefdlg.cpp:910 +msgid "Color of font :" +msgstr "Colore del font :" + +#: knutprefdlg.cpp:913 +#, fuzzy +msgid "Digital processing of pointers :" +msgstr "Digital processing of pointers :" + +#: knutprefdlg.cpp:964 +msgid "Nothing processing" +msgstr "Nothing processing" + +#: knutprefdlg.cpp:965 +msgid "Fast antialiasing" +msgstr "Fast antialiasing" + +#: knutprefdlg.cpp:966 +msgid "Fine antialiasing" +msgstr "Fine antialiasing" + +#: knutprefdlg.cpp:967 +msgid "Fast antialiasing and blur motion" +msgstr "Fast antialiasing and blur motion" + +#: knutprefdlg.cpp:968 +msgid "Fine antialiasing and blur motion" +msgstr "Fine antialiasing and blur motion" + +#: knutprintupsvar.cpp:41 +msgid "Variables" +msgstr "Variabili" + +#: knutprintupsvar.cpp:50 +msgid "Reload Vars" +msgstr "Ricarica Variabili" + +#: knutprintupsvar.cpp:52 +msgid "UPS variables" +msgstr "Variabili UPS" + +#: knutprintupsvar.cpp:79 +msgid "Value" +msgstr "Valore" + +#: knutprintupsvar.cpp:81 +msgid "Description" +msgstr "Descrizione" + +#: knutprintupsvar.cpp:90 +msgid "Instant Commands" +msgstr "Comandi Istantanei" + +#: knutprintupsvar.cpp:103 +msgid "Read/Write Variables" +msgstr "Variabili di lettura/scrittura" + +#: knutprintupsvar.cpp:121 +msgid "Read Only Variables" +msgstr "Variabili di sola lettura" + +#: knutrwvar.cpp:40 +msgid "RW variables" +msgstr "Variabili RW" + +#: knutrwvar.cpp:56 +msgid "SET RW VARIABLE" +msgstr "Settare Variabile RW" + +#: knutrwvar.cpp:61 +msgid "Variable:" +msgstr "Variabile:" + +#: knutrwvar.cpp:64 +msgid "Value:" +msgstr "Valore:" + +#: knutvardata.cpp:43 +msgid "None" +msgstr "Nessuno" + +#: knutvardata.cpp:44 +msgid "Input Voltage" +msgstr "Tensione di Ingresso" + +#: knutvardata.cpp:46 +msgid "UPS Temperature" +msgstr "Temperatura UPS" + +#: knutvardata.cpp:47 +msgid "Input Frequency" +msgstr "Frequenza di ingresso" + +#: knutvardata.cpp:49 +msgid "Outside Temperature" +msgstr "Temperatura esterna" + +#: knutvardata.cpp:50 +msgid "Outside Humidity" +msgstr "Umidita esterna" + +#: knutvardata.cpp:51 +msgid "Battery Voltage" +msgstr "Tensione delle batterie" + +#: knutvardata.cpp:52 +msgid "Output Voltage" +msgstr "Tensione in uscita" + +#: knutvardata.cpp:53 +msgid "Output Current" +msgstr "Corrente in uscita" + +#: knutvardata.cpp:54 +#, fuzzy +msgid "Output Frequency" +msgstr "Frequenza di uscita" + +#: knutvardata.cpp:55 +msgid "Battery Temperature" +msgstr "Temperatura Batterie" + +#: knutvardata.cpp:56 +msgid "Battery Current" +msgstr "Corrente Batterie" + +#: knutvardata.cpp:186 +#, fuzzy +msgid "No memory." +msgstr "Non c'e' memoria" + +#: knutvardata.cpp:187 +msgid "No address." +msgstr "Non c'e' indirizzo" + +#: knutvardata.cpp:188 +msgid "Unknown address." +msgstr "Indirizzo sconosciuto " + +#: knutvardata.cpp:191 +msgid "Error of connection." +msgstr "Errore di connessione" + +#: knutvardata.cpp:194 +#, fuzzy +msgid "No connection with server." +msgstr "Non connesso con il server." + +#: knutvardata.cpp:196 +msgid "Server-client protocol or variables of NUT are unknown." +msgstr "Il protocollo del Server-client o della varibile di NUT e' sconosciuta" + +#: knutvardata.cpp:197 +msgid "No UPS on this address." +msgstr "Nessun UPS a questo indirizzo" + +#: knutvardata.cpp:198 +#, fuzzy +msgid "Connection was refused by server." +msgstr "Non connesso con il server." + +#: knutvardata.cpp:200 +msgid "Server doesn't receive data." +msgstr "Il server non riceve le informazioni." + +#: knutvardata.cpp:201 +msgid "Server doesn't send data." +msgstr "Il server non manda le informazioni." + +#: knutvardata.cpp:202 +msgid "Server doesn't answer." +msgstr "Il Server non risponde." + +#: knutvardata.cpp:204 +msgid "Server returns data with unknown format." +msgstr "Il Server riporta dati con formato sconosciuto." + +#: knutvardata.cpp:205 +#, fuzzy +msgid "Server returns unknown data." +msgstr "Il Server riporta dati sconosciuti." + +#: knutvardata.cpp:206 +msgid "Command VER returns data with unknown format." +msgstr "Command VER riporta dati con formato sconosciuto." + +#: knutvardata.cpp:208 +msgid "No data." +msgstr "Nessun dato." + +#: knutvardata.cpp:212 +msgid "Access denied. Failed password ?" +msgstr "Accesso negato. Password sbagliata ?" + +#: knutvardata.cpp:213 +msgid "UPS doesn't sent data to server (Data Stale)." +msgstr "L'UPS non riesce a mandare le informazioni al server." + +#: knutvardata.cpp:214 +msgid "Server doesn't know this command." +msgstr "Il server non conosce questo comando." + +#: knutvardata.cpp:217 +#, fuzzy +msgid "UPS's driver isn't connected." +msgstr "UPS's driver non e' connesso." + +#: knutvardata.cpp:219 +msgid "Server required password." +msgstr "Il Server richiede la password." + +#: knutvardata.cpp:220 +msgid "Incorrect password." +msgstr "Password non corretta." + +#: knutvardata.cpp:221 +msgid "UPS doesn't response." +msgstr "Ups non risponde." + +#: knutvardata.cpp:222 +msgid "Command failed." +msgstr "Comando fallito." + +#: knutvardata.cpp:223 +msgid "UPS doesn't know this instant command." +msgstr "Ups non riconosce questo comando istantaneo." + +#: knutvardata.cpp:224 +msgid "UPS doesn't support this instant command." +msgstr "Ups non supporta questo comando istantaneo." + +#: knutvardata.cpp:225 +msgid "UPS doesn't known this variable." +msgstr "Ups non conosce questa variabile." + +#: knutvardata.cpp:226 +msgid "UPS doesn't support this variable." +msgstr "Ups non supporta questa variabile." + +#: knutvardata.cpp:227 +msgid "UPS doesn't support this value in this variable." +msgstr "Ups non supporta questo valore in questa variabile." + +#: knutvardata.cpp:228 +msgid "Name of UPS is unknown." +msgstr "Nome dell'UPS sconosciuto." + +#: knutvardata.cpp:230 +msgid "Username has been already entered." +msgstr "Username e' stata gia inserito." + +#: knutvardata.cpp:231 +msgid "Password has been already entered." +msgstr "Password e' stata gia inserita." + +#: knutvardata.cpp:233 +#, fuzzy +msgid "Server doesn't send list of variables." +msgstr "Server non manda lista di variabili." + +#: knutvardata.cpp:236 +msgid "Unknown error." +msgstr "Errore sconosciuto." + +#: main.cpp:31 +msgid "Client for Network UPS Tool" +msgstr "Client for Network UPS Tool" + +#: main.cpp:37 +msgid "Don't dock in Kicker" +msgstr "Don't dock in Kicker" + +#: main.cpp:47 +msgid "KNutClient" +msgstr "KNutClient" + +#. i18n: file ./knutclientui.rc line 13 +#: rc.cpp:9 +#, no-c-format +msgid "&Connection" +msgstr "&Connection" diff --git a/po/knutclient.pot b/po/knutclient.pot new file mode 100644 index 0000000..3c9886e --- /dev/null +++ b/po/knutclient.pot @@ -0,0 +1,836 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-02-21 12:13+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: _translatorinfo.cpp:1 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "" + +#: _translatorinfo.cpp:3 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "" + +#: knutclient.cpp:86 +msgid "Ready." +msgstr "" + +#: knutclient.cpp:218 knutclient.cpp:219 +msgid "The connection was renewed." +msgstr "" + +#: knutclient.cpp:285 +msgid "The connection failed. The next connection will make after %1 sec." +msgstr "" + +#: knutclient.cpp:546 +msgid "upsd > 1.2 doesn't support UDP. Connection is switched to TCP" +msgstr "" + +#: knutclient.cpp:688 knutclient.cpp:689 +msgid "Data OK" +msgstr "" + +#: knutclient.cpp:781 knutclient.cpp:782 +msgid "The connection was closed by the second side (upsd)." +msgstr "" + +#: knutclient.cpp:798 knutclient.cpp:799 +msgid "UPS is off." +msgstr "" + +#: knutclient.cpp:802 knutclient.cpp:803 +msgid "UPS is back on." +msgstr "" + +#: knutclient.cpp:808 knutclient.cpp:809 +msgid "Power is back online." +msgstr "" + +#: knutclient.cpp:814 knutclient.cpp:815 +msgid "UPS is on battery." +msgstr "" + +#: knutclient.cpp:820 knutclient.cpp:821 +msgid "UPS battery is low." +msgstr "" + +#: knutclient.cpp:824 knutclient.cpp:825 +msgid "UPS battery is OK." +msgstr "" + +#: knutclient.cpp:830 knutclient.cpp:831 +msgid "UPS battery is bad and needs be replaced." +msgstr "" + +#: knutclient.cpp:836 knutclient.cpp:837 +msgid "UPS is overloaded." +msgstr "" + +#: knutclient.cpp:840 knutclient.cpp:841 +msgid "UPS isn't overloaded." +msgstr "" + +#: knutclient.cpp:846 knutclient.cpp:847 knutdock.cpp:449 +msgid "UPS is performing calibration" +msgstr "" + +#: knutclient.cpp:850 knutclient.cpp:851 +msgid "Calibration of UPS is ended." +msgstr "" + +#: knutclient.cpp:856 knutclient.cpp:857 +msgid "UPS is boosting incoming voltage." +msgstr "" + +#: knutclient.cpp:860 knutclient.cpp:861 +msgid "Boosting of UPS is ended." +msgstr "" + +#: knutclient.cpp:866 knutclient.cpp:867 +msgid "UPS is trimming incoming voltage." +msgstr "" + +#: knutclient.cpp:870 knutclient.cpp:871 +msgid "Trimming of UPS is ended." +msgstr "" + +#: knutclient.cpp:887 knutclient.cpp:954 knutclient.cpp:963 +msgid "Switched" +msgstr "" + +#: knutclient.cpp:1103 knutdock.cpp:640 knutmainwindow.cpp:781 +msgid "Reconnect" +msgstr "" + +#: knutdock.cpp:419 knutdock.cpp:469 knutfrontpanel.cpp:192 +#: knutnewupsdlg.cpp:69 knutprintupsvar.cpp:78 +msgid "Name" +msgstr "" + +#: knutdock.cpp:420 knutnewupsdlg.cpp:83 +msgid "UPS name" +msgstr "" + +#: knutdock.cpp:421 knutnewupsdlg.cpp:77 +msgid "UPS address" +msgstr "" + +#: knutdock.cpp:422 knutdock.cpp:443 knutdock.cpp:446 knutdock.cpp:449 +#: knutdock.cpp:452 knutdock.cpp:455 knutdock.cpp:458 +msgid "Status : " +msgstr "" + +#: knutdock.cpp:425 knutvardata.cpp:209 +msgid "Connection doesn't exist." +msgstr "" + +#: knutdock.cpp:429 knutfrontpanel.cpp:80 +msgid "UPS On line" +msgstr "" + +#: knutdock.cpp:433 knutfrontpanel.cpp:95 +msgid "UPS On battery" +msgstr "" + +#: knutdock.cpp:437 +msgid "UPS Of line" +msgstr "" + +#: knutdock.cpp:443 +msgid "UPS Battery is low" +msgstr "" + +#: knutdock.cpp:446 knutfrontpanel.cpp:138 +msgid "Replace battery" +msgstr "" + +#: knutdock.cpp:452 +msgid "UPS is Overload" +msgstr "" + +#: knutdock.cpp:455 +msgid "UPS is trimming voltage" +msgstr "" + +#: knutdock.cpp:458 +msgid "UPS is boosting voltage" +msgstr "" + +#: knutdock.cpp:464 +msgid "Error : " +msgstr "" + +#: knutdock.cpp:467 knutfrontpanel.cpp:182 +msgid "Manufac. : " +msgstr "" + +#: knutdock.cpp:471 +msgid "Serial" +msgstr "" + +#: knutdock.cpp:473 +msgid "Firmware" +msgstr "" + +#: knutdock.cpp:477 knutfrontpanel.cpp:233 +msgid "Runtime" +msgstr "" + +#: knutdock.cpp:477 +msgid " : %1:%2 min" +msgstr "" + +#: knutdock.cpp:482 knutvardata.cpp:45 +msgid "Battery Charge" +msgstr "" + +#: knutdock.cpp:487 knutvardata.cpp:48 +msgid "UPS Load" +msgstr "" + +#: knutdock.cpp:513 knutmainwindow.cpp:663 +msgid "Are you sure ?" +msgstr "" + +#: knutdock.cpp:636 knutmainwindow.cpp:748 +msgid "&Showing UPS variables and commands" +msgstr "" + +#: knutdock.cpp:637 knutmainwindow.cpp:749 +msgid "&Running instant commands" +msgstr "" + +#: knutdock.cpp:638 knutmainwindow.cpp:750 +msgid "Setting R&W variables" +msgstr "" + +#: knutdock.cpp:642 +msgid "&Preferences" +msgstr "" + +#: knutdock.cpp:644 +msgid "&About KNutClient" +msgstr "" + +#: knutdock.cpp:646 +msgid "&Minimize" +msgstr "" + +#: knutdock.cpp:648 +msgid "&Exit" +msgstr "" + +#: knutfrontpanel.cpp:110 +msgid "UPS Overload" +msgstr "" + +#: knutfrontpanel.cpp:124 +msgid "UPS Battery low" +msgstr "" + +#: knutfrontpanel.cpp:152 +msgid "UPS calibration" +msgstr "" + +#: knutfrontpanel.cpp:202 +msgid "Serial : " +msgstr "" + +#: knutfrontpanel.cpp:212 +msgid "Firm. rev. : " +msgstr "" + +#: knutinstcomms.cpp:33 +msgid "Instant commands" +msgstr "" + +#: knutinstcomms.cpp:45 +msgid "RUN INSTANT COMMAND" +msgstr "" + +#: knutinstcomms.cpp:49 +msgid "Command:" +msgstr "" + +#: knutinstcomms.cpp:53 knutnewupsdlg.cpp:102 knutrwvar.cpp:70 +msgid "User name:" +msgstr "" + +#: knutinstcomms.cpp:54 knutnewupsdlg.cpp:109 knutrwvar.cpp:71 +msgid "Password:" +msgstr "" + +#: knutmainwindow.cpp:59 +msgid "test of conection from 5" +msgstr "" + +#: knutmainwindow.cpp:745 +msgid "Quits the application" +msgstr "" + +#: knutmainwindow.cpp:778 +msgid "&Using descriptions" +msgstr "" + +#: knutnewupsdlg.cpp:39 +msgid "New Ups" +msgstr "" + +#: knutnewupsdlg.cpp:89 +msgid "Delay (ms):" +msgstr "" + +#: knutnewupsdlg.cpp:96 +msgid "Port:" +msgstr "" + +#: knutnewupsdlg.cpp:116 +msgid "Store NUT password in configuration file" +msgstr "" + +#: knutnewupsdlg.cpp:123 +msgid "Availabled UPS values" +msgstr "" + +#: knutnewupsdlg.cpp:124 +msgid "Selected UPS values" +msgstr "" + +#: knutnewupsdlg.cpp:134 +msgid "UPS Variables" +msgstr "" + +#: knutnewupsdlg.cpp:255 +msgid "No Name or UPS address" +msgstr "" + +#: knutnewupsdlg.cpp:263 +msgid "This Name exist" +msgstr "" + +#: knutnewupsdlg.cpp:270 +msgid "Delay must be number" +msgstr "" + +#: knutnewupsdlg.cpp:276 +msgid "Port must be number" +msgstr "" + +#: knutnewupsdlg.cpp:281 +msgid "Port must be from 1025 until 65535" +msgstr "" + +#: knutnewupsdlg.cpp:286 +msgid "Delay is too small" +msgstr "" + +#: knutprefdlg.cpp:45 +msgid "Preferences" +msgstr "" + +#: knutprefdlg.cpp:508 +msgid "Setting" +msgstr "" + +#: knutprefdlg.cpp:508 +msgid "Main Setting" +msgstr "" + +#: knutprefdlg.cpp:516 +msgid "Voltage/Frequency" +msgstr "" + +#: knutprefdlg.cpp:519 +msgid "&Use High-Low XFER" +msgstr "" + +#: knutprefdlg.cpp:521 +msgid "Number of columns :" +msgstr "" + +#: knutprefdlg.cpp:524 knutprefdlg.cpp:815 knutprefdlg.cpp:894 +msgid "Use custom background color" +msgstr "" + +#: knutprefdlg.cpp:528 knutprefdlg.cpp:818 knutprefdlg.cpp:896 +msgid "Color of background :" +msgstr "" + +#: knutprefdlg.cpp:532 +msgid "Use dialog \"Are you sure\"" +msgstr "" + +#: knutprefdlg.cpp:535 +msgid "Use Main window when program is started" +msgstr "" + +#: knutprefdlg.cpp:538 +msgid "Show message window, when program reports error" +msgstr "" + +#: knutprefdlg.cpp:543 +msgid "Auto" +msgstr "" + +#: knutprefdlg.cpp:547 +msgid "Nominal Input Voltage" +msgstr "" + +#: knutprefdlg.cpp:550 +msgid "&230 V" +msgstr "" + +#: knutprefdlg.cpp:551 +msgid "&120 V" +msgstr "" + +#: knutprefdlg.cpp:553 +msgid "Nominal Input Frequency" +msgstr "" + +#: knutprefdlg.cpp:556 +msgid "&50 Hz" +msgstr "" + +#: knutprefdlg.cpp:557 +msgid "&60 Hz" +msgstr "" + +#: knutprefdlg.cpp:628 +msgid "UPS" +msgstr "" + +#: knutprefdlg.cpp:628 +msgid "UPS Setting" +msgstr "" + +#: knutprefdlg.cpp:646 +msgid "&Add" +msgstr "" + +#: knutprefdlg.cpp:667 +msgid "Dock bar" +msgstr "" + +#: knutprefdlg.cpp:667 +msgid "Docking Setting" +msgstr "" + +#: knutprefdlg.cpp:671 +msgid "Type of dock's showing" +msgstr "" + +#: knutprefdlg.cpp:676 +msgid "Items of tooltip" +msgstr "" + +#: knutprefdlg.cpp:684 +msgid "&Picture" +msgstr "" + +#: knutprefdlg.cpp:685 +msgid "&General" +msgstr "" + +#: knutprefdlg.cpp:688 knutprefdlg.cpp:799 +msgid "M&anufacturer" +msgstr "" + +#: knutprefdlg.cpp:691 knutprefdlg.cpp:802 +msgid "M&odel" +msgstr "" + +#: knutprefdlg.cpp:694 knutprefdlg.cpp:805 +msgid "&Serial" +msgstr "" + +#: knutprefdlg.cpp:697 knutprefdlg.cpp:808 +msgid "&Firm. rev." +msgstr "" + +#: knutprefdlg.cpp:700 knutprefdlg.cpp:811 +msgid "&Runtime" +msgstr "" + +#: knutprefdlg.cpp:703 +msgid "&Battery Charge" +msgstr "" + +#: knutprefdlg.cpp:706 +msgid "&UPS Load" +msgstr "" + +#: knutprefdlg.cpp:710 +msgid "Use custom icon's background color" +msgstr "" + +#: knutprefdlg.cpp:713 +msgid "Color of icon's background :" +msgstr "" + +#: knutprefdlg.cpp:769 +msgid "Panel" +msgstr "" + +#: knutprefdlg.cpp:769 +msgid "Panel Setting" +msgstr "" + +#: knutprefdlg.cpp:784 +msgid "UPS &Overload" +msgstr "" + +#: knutprefdlg.cpp:787 +msgid "UPS &Battery low" +msgstr "" + +#: knutprefdlg.cpp:790 +msgid "R&eplace battery" +msgstr "" + +#: knutprefdlg.cpp:793 +msgid "Ups &calibration" +msgstr "" + +#: knutprefdlg.cpp:796 +msgid "&Manufac. + Model" +msgstr "" + +#: knutprefdlg.cpp:851 +msgid "Setting Fonts" +msgstr "" + +#: knutprefdlg.cpp:858 +msgid "&Use custom font" +msgstr "" + +#: knutprefdlg.cpp:863 +msgid "Main panel" +msgstr "" + +#: knutprefdlg.cpp:864 +msgid "Analog panels" +msgstr "" + +#: knutprefdlg.cpp:887 +msgid "Analog" +msgstr "" + +#: knutprefdlg.cpp:887 +msgid "Setting Analog panel" +msgstr "" + +#: knutprefdlg.cpp:898 +msgid "Use custom other colors" +msgstr "" + +#: knutprefdlg.cpp:900 +msgid "Color of pointer :" +msgstr "" + +#: knutprefdlg.cpp:902 +msgid "Color of OK range :" +msgstr "" + +#: knutprefdlg.cpp:904 +msgid "Color of warning range :" +msgstr "" + +#: knutprefdlg.cpp:906 +msgid "Color of error range :" +msgstr "" + +#: knutprefdlg.cpp:908 +msgid "Color of scale :" +msgstr "" + +#: knutprefdlg.cpp:910 +msgid "Color of font :" +msgstr "" + +#: knutprefdlg.cpp:913 +msgid "Digital processing of pointers :" +msgstr "" + +#: knutprefdlg.cpp:964 +msgid "Nothing processing" +msgstr "" + +#: knutprefdlg.cpp:965 +msgid "Fast antialiasing" +msgstr "" + +#: knutprefdlg.cpp:966 +msgid "Fine antialiasing" +msgstr "" + +#: knutprefdlg.cpp:967 +msgid "Fast antialiasing and blur motion" +msgstr "" + +#: knutprefdlg.cpp:968 +msgid "Fine antialiasing and blur motion" +msgstr "" + +#: knutprintupsvar.cpp:41 +msgid "Variables" +msgstr "" + +#: knutprintupsvar.cpp:50 +msgid "Reload Vars" +msgstr "" + +#: knutprintupsvar.cpp:52 +msgid "UPS variables" +msgstr "" + +#: knutprintupsvar.cpp:79 +msgid "Value" +msgstr "" + +#: knutprintupsvar.cpp:81 +msgid "Description" +msgstr "" + +#: knutprintupsvar.cpp:90 +msgid "Instant Commands" +msgstr "" + +#: knutprintupsvar.cpp:103 +msgid "Read/Write Variables" +msgstr "" + +#: knutprintupsvar.cpp:121 +msgid "Read Only Variables" +msgstr "" + +#: knutrwvar.cpp:40 +msgid "RW variables" +msgstr "" + +#: knutrwvar.cpp:56 +msgid "SET RW VARIABLE" +msgstr "" + +#: knutrwvar.cpp:61 +msgid "Variable:" +msgstr "" + +#: knutrwvar.cpp:64 +msgid "Value:" +msgstr "" + +#: knutvardata.cpp:43 +msgid "None" +msgstr "" + +#: knutvardata.cpp:44 +msgid "Input Voltage" +msgstr "" + +#: knutvardata.cpp:46 +msgid "UPS Temperature" +msgstr "" + +#: knutvardata.cpp:47 +msgid "Input Frequency" +msgstr "" + +#: knutvardata.cpp:49 +msgid "Outside Temperature" +msgstr "" + +#: knutvardata.cpp:50 +msgid "Outside Humidity" +msgstr "" + +#: knutvardata.cpp:51 +msgid "Battery Voltage" +msgstr "" + +#: knutvardata.cpp:52 +msgid "Output Voltage" +msgstr "" + +#: knutvardata.cpp:53 +msgid "Output Current" +msgstr "" + +#: knutvardata.cpp:54 +msgid "Output Frequency" +msgstr "" + +#: knutvardata.cpp:55 +msgid "Battery Temperature" +msgstr "" + +#: knutvardata.cpp:56 +msgid "Battery Current" +msgstr "" + +#: knutvardata.cpp:186 +msgid "No memory." +msgstr "" + +#: knutvardata.cpp:187 +msgid "No address." +msgstr "" + +#: knutvardata.cpp:188 +msgid "Unknown address." +msgstr "" + +#: knutvardata.cpp:191 +msgid "Error of connection." +msgstr "" + +#: knutvardata.cpp:194 +msgid "No connection with server." +msgstr "" + +#: knutvardata.cpp:196 +msgid "Server-client protocol or variables of NUT are unknown." +msgstr "" + +#: knutvardata.cpp:197 +msgid "No UPS on this address." +msgstr "" + +#: knutvardata.cpp:198 +msgid "Connection was refused by server." +msgstr "" + +#: knutvardata.cpp:200 +msgid "Server doesn't receive data." +msgstr "" + +#: knutvardata.cpp:201 +msgid "Server doesn't send data." +msgstr "" + +#: knutvardata.cpp:202 +msgid "Server doesn't answer." +msgstr "" + +#: knutvardata.cpp:204 +msgid "Server returns data with unknown format." +msgstr "" + +#: knutvardata.cpp:205 +msgid "Server returns unknown data." +msgstr "" + +#: knutvardata.cpp:206 +msgid "Command VER returns data with unknown format." +msgstr "" + +#: knutvardata.cpp:208 +msgid "No data." +msgstr "" + +#: knutvardata.cpp:212 +msgid "Access denied. Failed password ?" +msgstr "" + +#: knutvardata.cpp:213 +msgid "UPS doesn't sent data to server (Data Stale)." +msgstr "" + +#: knutvardata.cpp:214 +msgid "Server doesn't know this command." +msgstr "" + +#: knutvardata.cpp:217 +msgid "UPS's driver isn't connected." +msgstr "" + +#: knutvardata.cpp:219 +msgid "Server required password." +msgstr "" + +#: knutvardata.cpp:220 +msgid "Incorrect password." +msgstr "" + +#: knutvardata.cpp:221 +msgid "UPS doesn't response." +msgstr "" + +#: knutvardata.cpp:222 +msgid "Command failed." +msgstr "" + +#: knutvardata.cpp:223 +msgid "UPS doesn't know this instant command." +msgstr "" + +#: knutvardata.cpp:224 +msgid "UPS doesn't support this instant command." +msgstr "" + +#: knutvardata.cpp:225 +msgid "UPS doesn't known this variable." +msgstr "" + +#: knutvardata.cpp:226 +msgid "UPS doesn't support this variable." +msgstr "" + +#: knutvardata.cpp:227 +msgid "UPS doesn't support this value in this variable." +msgstr "" + +#: knutvardata.cpp:228 +msgid "Name of UPS is unknown." +msgstr "" + +#: knutvardata.cpp:230 +msgid "Username has been already entered." +msgstr "" + +#: knutvardata.cpp:231 +msgid "Password has been already entered." +msgstr "" + +#: knutvardata.cpp:233 +msgid "Server doesn't send list of variables." +msgstr "" + +#: knutvardata.cpp:236 +msgid "Unknown error." +msgstr "" + +#: main.cpp:31 +msgid "Client for Network UPS Tool" +msgstr "" + +#: main.cpp:37 +msgid "Don't dock in Kicker" +msgstr "" + +#: main.cpp:47 +msgid "KNutClient" +msgstr "" + +#. i18n: file ./knutclientui.rc line 13 +#: rc.cpp:9 +#, no-c-format +msgid "&Connection" +msgstr "" diff --git a/po/pl.po b/po/pl.po new file mode 100644 index 0000000..23b88a1 --- /dev/null +++ b/po/pl.po @@ -0,0 +1,837 @@ +# This file is put in the public domain. +# +# Tomasz Walach , 2009. +msgid "" +msgstr "" +"Project-Id-Version: knutclient\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-02-21 12:13+0100\n" +"PO-Revision-Date: 2009-02-24 21:21+0100\n" +"Last-Translator: Tomasz Walach \n" +"Language-Team: Polish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 0.3\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" + +#: _translatorinfo.cpp:1 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "Tomasz Walach" + +#: _translatorinfo.cpp:3 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "tomasz_rysz@o2.pl" + +#: knutclient.cpp:86 +msgid "Ready." +msgstr "Gotowy." + +#: knutclient.cpp:218 knutclient.cpp:219 +msgid "The connection was renewed." +msgstr "Połączenie odnowione." + +#: knutclient.cpp:285 +msgid "The connection failed. The next connection will make after %1 sec." +msgstr "Błąd połączenia. Następne połączenie będzie za %1 sek." + +#: knutclient.cpp:546 +msgid "upsd > 1.2 doesn't support UDP. Connection is switched to TCP" +msgstr "upsd > 1.2 nie obsługuje UDP. Połączenie przełączone na TCP" + +#: knutclient.cpp:688 knutclient.cpp:689 +msgid "Data OK" +msgstr "Dane poprawne" + +#: knutclient.cpp:781 knutclient.cpp:782 +msgid "The connection was closed by the second side (upsd)." +msgstr "Połączenie zamknięte przez drugą stronę (upsd)." + +#: knutclient.cpp:798 knutclient.cpp:799 +msgid "UPS is off." +msgstr "UPS jest wyłączony." + +#: knutclient.cpp:802 knutclient.cpp:803 +msgid "UPS is back on." +msgstr "UPS jest włączony." + +#: knutclient.cpp:808 knutclient.cpp:809 +msgid "Power is back online." +msgstr "PrzywrĂłcono zasilanie." + +#: knutclient.cpp:814 knutclient.cpp:815 +msgid "UPS is on battery." +msgstr "UPS na zasilaniu z akumulatora(Ăłw)." + +#: knutclient.cpp:820 knutclient.cpp:821 +msgid "UPS battery is low." +msgstr "Akumulator(y) UPS'a na wyczerpaniu." + +#: knutclient.cpp:824 knutclient.cpp:825 +msgid "UPS battery is OK." +msgstr "Akumulator(y) UPS'a w porządku." + +#: knutclient.cpp:830 knutclient.cpp:831 +msgid "UPS battery is bad and needs be replaced." +msgstr "Akumulator UPS'a jest uszkodzony i wymaga wymiany." + +#: knutclient.cpp:836 knutclient.cpp:837 +msgid "UPS is overloaded." +msgstr "UPS jest przeciążony." + +#: knutclient.cpp:840 knutclient.cpp:841 +msgid "UPS isn't overloaded." +msgstr "UPS nie jest przeciążony." + +#: knutclient.cpp:846 knutclient.cpp:847 knutdock.cpp:449 +msgid "UPS is performing calibration" +msgstr "Kalibracja ustawień UPS'a" + +#: knutclient.cpp:850 knutclient.cpp:851 +msgid "Calibration of UPS is ended." +msgstr "Kalibracja UPS'a zakończona." + +#: knutclient.cpp:856 knutclient.cpp:857 +msgid "UPS is boosting incoming voltage." +msgstr "UPS zwiększa napięcie wejściowe." + +#: knutclient.cpp:860 knutclient.cpp:861 +msgid "Boosting of UPS is ended." +msgstr "Zwiększanie napięcia przez UPS zakończone." + +#: knutclient.cpp:866 knutclient.cpp:867 +msgid "UPS is trimming incoming voltage." +msgstr "UPS obniĹźa napięcie wejściowe." + +#: knutclient.cpp:870 knutclient.cpp:871 +msgid "Trimming of UPS is ended." +msgstr "ObniĹźanie napięcia przez UPS zakończone." + +#: knutclient.cpp:887 knutclient.cpp:954 knutclient.cpp:963 +msgid "Switched" +msgstr "Przełączony" + +#: knutclient.cpp:1103 knutdock.cpp:640 knutmainwindow.cpp:781 +msgid "Reconnect" +msgstr "Połącz ponownie" + +#: knutdock.cpp:419 knutdock.cpp:469 knutfrontpanel.cpp:192 +#: knutnewupsdlg.cpp:69 knutprintupsvar.cpp:78 +msgid "Name" +msgstr "Nazwa" + +#: knutdock.cpp:420 knutnewupsdlg.cpp:83 +msgid "UPS name" +msgstr "Nazwa UPS'a" + +#: knutdock.cpp:421 knutnewupsdlg.cpp:77 +msgid "UPS address" +msgstr "Adres UPS'a" + +#: knutdock.cpp:422 knutdock.cpp:443 knutdock.cpp:446 knutdock.cpp:449 +#: knutdock.cpp:452 knutdock.cpp:455 knutdock.cpp:458 +msgid "Status : " +msgstr "Status : " + +#: knutdock.cpp:425 knutvardata.cpp:209 +msgid "Connection doesn't exist." +msgstr "Połączenie nie istnieje." + +#: knutdock.cpp:429 knutfrontpanel.cpp:80 +msgid "UPS On line" +msgstr "UPS zasilanie sieciowe" + +#: knutdock.cpp:433 knutfrontpanel.cpp:95 +msgid "UPS On battery" +msgstr "UPS zasilanie akumulatorowe" + +#: knutdock.cpp:437 +msgid "UPS Of line" +msgstr "UPS odłączony od zasilania sieciowego" + +#: knutdock.cpp:443 +msgid "UPS Battery is low" +msgstr "UPS niski poziom akumulatora(Ăłw)" + +#: knutdock.cpp:446 knutfrontpanel.cpp:138 +msgid "Replace battery" +msgstr "Wymień akumulator(y)" + +#: knutdock.cpp:452 +msgid "UPS is Overload" +msgstr "UPS jest przeciążony" + +#: knutdock.cpp:455 +msgid "UPS is trimming voltage" +msgstr "UPS obniĹźa napięcie" + +#: knutdock.cpp:458 +msgid "UPS is boosting voltage" +msgstr "UPS podwyĹźsza napięcie" + +#: knutdock.cpp:464 +msgid "Error : " +msgstr "Błąd : " + +#: knutdock.cpp:467 knutfrontpanel.cpp:182 +msgid "Manufac. : " +msgstr "Producent : " + +#: knutdock.cpp:471 +msgid "Serial" +msgstr "Oznaczenie" + +#: knutdock.cpp:473 +msgid "Firmware" +msgstr "Firmware" + +#: knutdock.cpp:477 knutfrontpanel.cpp:233 +msgid "Runtime" +msgstr "Czas pracy" + +#: knutdock.cpp:477 +msgid " : %1:%2 min" +msgstr " : %1:%2 min" + +#: knutdock.cpp:482 knutvardata.cpp:45 +msgid "Battery Charge" +msgstr "Naładowanie akumulatora" + +#: knutdock.cpp:487 knutvardata.cpp:48 +msgid "UPS Load" +msgstr "Obciążenie UPS'a" + +#: knutdock.cpp:513 knutmainwindow.cpp:663 +msgid "Are you sure ?" +msgstr "Czy jesteś pewien ?" + +#: knutdock.cpp:636 knutmainwindow.cpp:748 +msgid "&Showing UPS variables and commands" +msgstr "Do&stępne zmienne i polecenia UPS'a" + +#: knutdock.cpp:637 knutmainwindow.cpp:749 +msgid "&Running instant commands" +msgstr "U&ruchomienie poleceń" + +#: knutdock.cpp:638 knutmainwindow.cpp:750 +msgid "Setting R&W variables" +msgstr "Ustawienie zmiennych R&W" + +#: knutdock.cpp:642 +msgid "&Preferences" +msgstr "&Ustawienia" + +#: knutdock.cpp:644 +msgid "&About KNutClient" +msgstr "&O KNutClient" + +#: knutdock.cpp:646 +msgid "&Minimize" +msgstr "&Minimalizuj" + +#: knutdock.cpp:648 +msgid "&Exit" +msgstr "&Zakończ" + +#: knutfrontpanel.cpp:110 +msgid "UPS Overload" +msgstr "UPS przeciążenie" + +#: knutfrontpanel.cpp:124 +msgid "UPS Battery low" +msgstr "UPS niski poziom akumulatora(Ăłw)" + +#: knutfrontpanel.cpp:152 +msgid "UPS calibration" +msgstr "UPS kalibracja" + +#: knutfrontpanel.cpp:202 +msgid "Serial : " +msgstr "Nr seryjny : " + +#: knutfrontpanel.cpp:212 +msgid "Firm. rev. : " +msgstr "Wersja Firmware : " + +#: knutinstcomms.cpp:33 +msgid "Instant commands" +msgstr "Polecenia" + +#: knutinstcomms.cpp:45 +msgid "RUN INSTANT COMMAND" +msgstr "Wykonaj polecenie" + +#: knutinstcomms.cpp:49 +msgid "Command:" +msgstr "Polecenie:" + +#: knutinstcomms.cpp:53 knutnewupsdlg.cpp:102 knutrwvar.cpp:70 +msgid "User name:" +msgstr "Nazwa uĹźytkownika:" + +#: knutinstcomms.cpp:54 knutnewupsdlg.cpp:109 knutrwvar.cpp:71 +msgid "Password:" +msgstr "Hasło:" + +#: knutmainwindow.cpp:59 +msgid "test of conection from 5" +msgstr "test połączenia za 5" + +#: knutmainwindow.cpp:745 +msgid "Quits the application" +msgstr "Zakończ" + +#: knutmainwindow.cpp:778 +msgid "&Using descriptions" +msgstr "&Stosuj opisy" + +#: knutnewupsdlg.cpp:39 +msgid "New Ups" +msgstr "Nowy Ups" + +#: knutnewupsdlg.cpp:89 +msgid "Delay (ms):" +msgstr "Opóźnienie (ms):" + +#: knutnewupsdlg.cpp:96 +msgid "Port:" +msgstr "Port:" + +#: knutnewupsdlg.cpp:116 +msgid "Store NUT password in configuration file" +msgstr "Zapisz hasło NUT'a w pliku konfiguracyjnym" + +#: knutnewupsdlg.cpp:123 +msgid "Availabled UPS values" +msgstr "Dostępne zmienne UPS'a" + +#: knutnewupsdlg.cpp:124 +msgid "Selected UPS values" +msgstr "Wybrane zmienne UPS'a" + +#: knutnewupsdlg.cpp:134 +msgid "UPS Variables" +msgstr "UPS Zmienne" + +#: knutnewupsdlg.cpp:255 +msgid "No Name or UPS address" +msgstr "Brak nazwy lub adresu UPS'a" + +#: knutnewupsdlg.cpp:263 +msgid "This Name exist" +msgstr "Nazwa istnieje" + +#: knutnewupsdlg.cpp:270 +msgid "Delay must be number" +msgstr "Opóźnienie musi być liczbą" + +#: knutnewupsdlg.cpp:276 +msgid "Port must be number" +msgstr "Port musi być liczbą" + +#: knutnewupsdlg.cpp:281 +msgid "Port must be from 1025 until 65535" +msgstr "Numer portu musi być z przedziału 1025 do 65535" + +#: knutnewupsdlg.cpp:286 +msgid "Delay is too small" +msgstr "Wartość opóźnienia jest za mała" + +#: knutprefdlg.cpp:45 +msgid "Preferences" +msgstr "Preferencje" + +#: knutprefdlg.cpp:508 +msgid "Setting" +msgstr "Ustawienia" + +#: knutprefdlg.cpp:508 +msgid "Main Setting" +msgstr "Główne ustawiania" + +#: knutprefdlg.cpp:516 +msgid "Voltage/Frequency" +msgstr "Napięcie/Częstotliwość" + +#: knutprefdlg.cpp:519 +msgid "&Use High-Low XFER" +msgstr "&Zastosuj High-Low XFER" + +#: knutprefdlg.cpp:521 +msgid "Number of columns :" +msgstr "Liczba kolumn :" + +#: knutprefdlg.cpp:524 knutprefdlg.cpp:815 knutprefdlg.cpp:894 +msgid "Use custom background color" +msgstr "Stosuj wybrany kolor tła" + +#: knutprefdlg.cpp:528 knutprefdlg.cpp:818 knutprefdlg.cpp:896 +msgid "Color of background :" +msgstr "Kolor tła :" + +#: knutprefdlg.cpp:532 +msgid "Use dialog \"Are you sure\"" +msgstr "Stosuj dialog \"Czy jesteś pewien\"" + +#: knutprefdlg.cpp:535 +msgid "Use Main window when program is started" +msgstr "Wyświetl Główne okno po uruchomieniu" + +#: knutprefdlg.cpp:538 +msgid "Show message window, when program reports error" +msgstr "PokaĹź okno wiadomości, gdy program zgłasza błędy" + +#: knutprefdlg.cpp:543 +msgid "Auto" +msgstr "Automatycznie" + +#: knutprefdlg.cpp:547 +msgid "Nominal Input Voltage" +msgstr "Nominalne napięcie wejściowe" + +#: knutprefdlg.cpp:550 +msgid "&230 V" +msgstr "&230 V" + +#: knutprefdlg.cpp:551 +msgid "&120 V" +msgstr "&120 V" + +#: knutprefdlg.cpp:553 +msgid "Nominal Input Frequency" +msgstr "Nominalna częstotliwość wejściowa" + +#: knutprefdlg.cpp:556 +msgid "&50 Hz" +msgstr "&50 Hz" + +#: knutprefdlg.cpp:557 +msgid "&60 Hz" +msgstr "&60 Hz" + +#: knutprefdlg.cpp:628 +msgid "UPS" +msgstr "UPS" + +#: knutprefdlg.cpp:628 +msgid "UPS Setting" +msgstr "Ustawienia UPS'a" + +#: knutprefdlg.cpp:646 +msgid "&Add" +msgstr "Dod&aj" + +#: knutprefdlg.cpp:667 +msgid "Dock bar" +msgstr "Tacka" + +#: knutprefdlg.cpp:667 +msgid "Docking Setting" +msgstr "Ustawienia tacki systemowej" + +#: knutprefdlg.cpp:671 +msgid "Type of dock's showing" +msgstr "Typ prezentacji w tace systemowej" + +#: knutprefdlg.cpp:676 +msgid "Items of tooltip" +msgstr "Informacje w dymku" + +#: knutprefdlg.cpp:684 +msgid "&Picture" +msgstr "&Graficzna" + +#: knutprefdlg.cpp:685 +msgid "&General" +msgstr "&Opisowa" + +#: knutprefdlg.cpp:688 knutprefdlg.cpp:799 +msgid "M&anufacturer" +msgstr "P&roducent" + +#: knutprefdlg.cpp:691 knutprefdlg.cpp:802 +msgid "M&odel" +msgstr "M&odel" + +#: knutprefdlg.cpp:694 knutprefdlg.cpp:805 +msgid "&Serial" +msgstr "Nr &seryjny" + +#: knutprefdlg.cpp:697 knutprefdlg.cpp:808 +msgid "&Firm. rev." +msgstr "Wersja &Firmware" + +#: knutprefdlg.cpp:700 knutprefdlg.cpp:811 +msgid "&Runtime" +msgstr "Czas p&racy" + +#: knutprefdlg.cpp:703 +msgid "&Battery Charge" +msgstr "&Naładowanie akumulatora" + +#: knutprefdlg.cpp:706 +msgid "&UPS Load" +msgstr "Obciążenie &UPS'a" + +#: knutprefdlg.cpp:710 +msgid "Use custom icon's background color" +msgstr "Stosuj kolor tła ikon" + +#: knutprefdlg.cpp:713 +msgid "Color of icon's background :" +msgstr "Kolor tła ikony :" + +#: knutprefdlg.cpp:769 +msgid "Panel" +msgstr "Panel" + +#: knutprefdlg.cpp:769 +msgid "Panel Setting" +msgstr "Ustawienia panela" + +#: knutprefdlg.cpp:784 +msgid "UPS &Overload" +msgstr "UPS &przeciążenie" + +#: knutprefdlg.cpp:787 +msgid "UPS &Battery low" +msgstr "UPS &niski poziom akumulatora(Ăłw)" + +#: knutprefdlg.cpp:790 +msgid "R&eplace battery" +msgstr "&Wymień akumulator(y)" + +#: knutprefdlg.cpp:793 +msgid "Ups &calibration" +msgstr "UPS &kalibracja " + +#: knutprefdlg.cpp:796 +msgid "&Manufac. + Model" +msgstr "Producent + &Model" + +#: knutprefdlg.cpp:851 +msgid "Setting Fonts" +msgstr "Ustawienia czcionek" + +#: knutprefdlg.cpp:858 +msgid "&Use custom font" +msgstr "&Stosuj czcionki uĹźytkownika" + +#: knutprefdlg.cpp:863 +msgid "Main panel" +msgstr "Panel główny" + +#: knutprefdlg.cpp:864 +msgid "Analog panels" +msgstr "Panel analogowy" + +#: knutprefdlg.cpp:887 +msgid "Analog" +msgstr "Analogowy" + +#: knutprefdlg.cpp:887 +msgid "Setting Analog panel" +msgstr "Ustawienia panelu analogowego" + +#: knutprefdlg.cpp:898 +msgid "Use custom other colors" +msgstr "Stosuj inne kolory uĹźytkownika" + +#: knutprefdlg.cpp:900 +msgid "Color of pointer :" +msgstr "Kolor wskaĹşnika :" + +#: knutprefdlg.cpp:902 +msgid "Color of OK range :" +msgstr "Kolor prawidłowego zakresu :" + +#: knutprefdlg.cpp:904 +msgid "Color of warning range :" +msgstr "Kolor ostrzegawczego zakresu :" + +#: knutprefdlg.cpp:906 +msgid "Color of error range :" +msgstr "Kolor zakresu nieprawidłowego :" + +#: knutprefdlg.cpp:908 +msgid "Color of scale :" +msgstr "Kolor podziałki :" + +#: knutprefdlg.cpp:910 +msgid "Color of font :" +msgstr "Kolor czcionki :" + +#: knutprefdlg.cpp:913 +msgid "Digital processing of pointers :" +msgstr "ObrĂłbka cyfrowa wskaĹşnika :" + +#: knutprefdlg.cpp:964 +msgid "Nothing processing" +msgstr "Nic nie obrabiaj" + +#: knutprefdlg.cpp:965 +msgid "Fast antialiasing" +msgstr "Szybki antyaliasing" + +#: knutprefdlg.cpp:966 +msgid "Fine antialiasing" +msgstr "Dokładny antyaliasing" + +#: knutprefdlg.cpp:967 +msgid "Fast antialiasing and blur motion" +msgstr "Szybki antyaliasing i rozmycie" + +#: knutprefdlg.cpp:968 +msgid "Fine antialiasing and blur motion" +msgstr "Dokładny antyaliasing i rozmycie" + +#: knutprintupsvar.cpp:41 +msgid "Variables" +msgstr "Zmienne" + +#: knutprintupsvar.cpp:50 +msgid "Reload Vars" +msgstr "Przeładuj zmienne" + +#: knutprintupsvar.cpp:52 +msgid "UPS variables" +msgstr "Zmienne UPS'a" + +#: knutprintupsvar.cpp:79 +msgid "Value" +msgstr "Wartość" + +#: knutprintupsvar.cpp:81 +msgid "Description" +msgstr "Opis" + +#: knutprintupsvar.cpp:90 +msgid "Instant Commands" +msgstr "Polecenia " + +#: knutprintupsvar.cpp:103 +msgid "Read/Write Variables" +msgstr "Odczyt/zapis zmiennych" + +#: knutprintupsvar.cpp:121 +msgid "Read Only Variables" +msgstr "Zmienne tylko do odczytu" + +#: knutrwvar.cpp:40 +msgid "RW variables" +msgstr "Zmienne RW" + +#: knutrwvar.cpp:56 +msgid "SET RW VARIABLE" +msgstr "USTAW ZMIENNĄ RW" + +#: knutrwvar.cpp:61 +msgid "Variable:" +msgstr "Zmienna:" + +#: knutrwvar.cpp:64 +msgid "Value:" +msgstr "Wartość:" + +#: knutvardata.cpp:43 +msgid "None" +msgstr "Nic" + +#: knutvardata.cpp:44 +msgid "Input Voltage" +msgstr "Napięcie wejściowe" + +#: knutvardata.cpp:46 +msgid "UPS Temperature" +msgstr "Temperatura UPS'a" + +#: knutvardata.cpp:47 +msgid "Input Frequency" +msgstr "Częstotliwość wejściowa" + +#: knutvardata.cpp:49 +msgid "Outside Temperature" +msgstr "Temperatura zewnętrzna" + +#: knutvardata.cpp:50 +msgid "Outside Humidity" +msgstr "Wilgotność zewnętrzna" + +#: knutvardata.cpp:51 +msgid "Battery Voltage" +msgstr "Napięcie akumulatora(Ăłw)" + +#: knutvardata.cpp:52 +msgid "Output Voltage" +msgstr "Napięcie wyjściowe" + +#: knutvardata.cpp:53 +msgid "Output Current" +msgstr "Prąd wyjściowy" + +#: knutvardata.cpp:54 +msgid "Output Frequency" +msgstr "Częstotliwość wyjściowa" + +#: knutvardata.cpp:55 +msgid "Battery Temperature" +msgstr "Temperatura akumulatora(Ăłw)" + +#: knutvardata.cpp:56 +msgid "Battery Current" +msgstr "Prąd akumulatora(Ăłw)" + +#: knutvardata.cpp:186 +msgid "No memory." +msgstr "Brak pamięci." + +#: knutvardata.cpp:187 +msgid "No address." +msgstr "Brak adresu." + +#: knutvardata.cpp:188 +msgid "Unknown address." +msgstr "Nieznany adres." + +#: knutvardata.cpp:191 +msgid "Error of connection." +msgstr "Błąd połączenia." + +#: knutvardata.cpp:194 +msgid "No connection with server." +msgstr "Brak połączenia z serwerem." + +#: knutvardata.cpp:196 +msgid "Server-client protocol or variables of NUT are unknown." +msgstr "Protokół serwer-klient lub zmienne NUT'a są niezrozumiałe." + +#: knutvardata.cpp:197 +msgid "No UPS on this address." +msgstr "Brak UPS'a pod tym adresem." + +#: knutvardata.cpp:198 +msgid "Connection was refused by server." +msgstr "Połączenie odrzucone przez serwer." + +#: knutvardata.cpp:200 +msgid "Server doesn't receive data." +msgstr "Serwer nie przyjmuje danych." + +#: knutvardata.cpp:201 +msgid "Server doesn't send data." +msgstr "Serwer nie wysyła danych." + +#: knutvardata.cpp:202 +msgid "Server doesn't answer." +msgstr "Serwer nie odpowiada." + +#: knutvardata.cpp:204 +msgid "Server returns data with unknown format." +msgstr "Serwer zwrĂłcił dane w nieznanym formacie." + +#: knutvardata.cpp:205 +msgid "Server returns unknown data." +msgstr "Serwer zwrĂłcił nieznane dane." + +#: knutvardata.cpp:206 +msgid "Command VER returns data with unknown format." +msgstr "Polecenie VER zwraca dane w nieznanym formacie." + +#: knutvardata.cpp:208 +msgid "No data." +msgstr "Brak danych." + +#: knutvardata.cpp:212 +msgid "Access denied. Failed password ?" +msgstr "Brak dostępu. Błędne hasło ?" + +#: knutvardata.cpp:213 +msgid "UPS doesn't sent data to server (Data Stale)." +msgstr "UPS nie przesyła danych do serwera (Dane nieaktualne)." + +#: knutvardata.cpp:214 +msgid "Server doesn't know this command." +msgstr "Serwer nie zna tego polecenia." + +#: knutvardata.cpp:217 +msgid "UPS's driver isn't connected." +msgstr "Sterownik UPS'a nie jest podłączony." + +#: knutvardata.cpp:219 +msgid "Server required password." +msgstr "Serwer wymaga hasła." + +#: knutvardata.cpp:220 +msgid "Incorrect password." +msgstr "Nieprawidłowe hasło." + +#: knutvardata.cpp:221 +msgid "UPS doesn't response." +msgstr "UPS nie odpowiada." + +#: knutvardata.cpp:222 +msgid "Command failed." +msgstr "Polecenie nie wykonane." + +#: knutvardata.cpp:223 +msgid "UPS doesn't know this instant command." +msgstr "UPS nie zna tego polecenia." + +#: knutvardata.cpp:224 +msgid "UPS doesn't support this instant command." +msgstr "UPS nie wspiera tego polecenia." + +#: knutvardata.cpp:225 +msgid "UPS doesn't known this variable." +msgstr "UPS nie rozpoznaje zmiennej." + +#: knutvardata.cpp:226 +msgid "UPS doesn't support this variable." +msgstr "UPS nie wspiera tej zmiennej." + +#: knutvardata.cpp:227 +msgid "UPS doesn't support this value in this variable." +msgstr "UPS nie wspiera tej wartości zmiennej." + +#: knutvardata.cpp:228 +msgid "Name of UPS is unknown." +msgstr "Nieznana nazwa UPS'a." + +#: knutvardata.cpp:230 +msgid "Username has been already entered." +msgstr "Nazwa uĹźytkownika była juĹź wprowadzona." + +#: knutvardata.cpp:231 +msgid "Password has been already entered." +msgstr "Hasło było juĹź wprowadzone." + +#: knutvardata.cpp:233 +msgid "Server doesn't send list of variables." +msgstr "Serwer nie przesyła listy zmiennych." + +#: knutvardata.cpp:236 +msgid "Unknown error." +msgstr "Nieznany błąd." + +#: main.cpp:31 +msgid "Client for Network UPS Tool" +msgstr "Klient dla Network UPS Tool" + +#: main.cpp:37 +msgid "Don't dock in Kicker" +msgstr "Nie umieszczaj w tacce systemowej" + +#: main.cpp:47 +msgid "KNutClient" +msgstr "KNutClient" + +#. i18n: file ./knutclientui.rc line 13 +#: rc.cpp:9 +#, no-c-format +msgid "&Connection" +msgstr "&Połączenie" diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 0000000..4b06303 --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,843 @@ +# translation of pt_BR.po to Czech +# tradução de knutclient.po para Brazilian Portuguese +# translation of pt_BR.po to Brazilian Portuguese +# translation of knutclient.po to Brazilian Portuguese +# Copyright (C) 2008 Free Software Foundation, Inc. +# Wellington Terumi Uemura , 2008. +# Lisiane Sztoltz Teixeira , 2004. +# Daniel Prynych , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: pt_BR\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-02-21 12:13+0100\n" +"PO-Revision-Date: 2008-05-29 14:32+0200\n" +"Last-Translator: Wellington Terumi Uemura \n" +"Language-Team: Czech \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: gedit 2.22.0\n" + +#: _translatorinfo.cpp:1 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "Wellington Terumi Uemura" + +#: _translatorinfo.cpp:3 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "wellingtonuemura@gmail.com" + +#: knutclient.cpp:86 +msgid "Ready." +msgstr "Pronto." + +#: knutclient.cpp:218 knutclient.cpp:219 +msgid "The connection was renewed." +msgstr "A conexĂŁo foi fechada pelo no-break (upsd)." + +#: knutclient.cpp:285 +msgid "The connection failed. The next connection will make after %1 sec." +msgstr "A conexĂŁo falhou. Uma nova conexĂŁo serĂĄ feita depois de %1 segundos." + +#: knutclient.cpp:546 +msgid "upsd > 1.2 doesn't support UDP. Connection is switched to TCP" +msgstr "upsd > 1.2 nĂŁo tem suporte para UDP. A conexĂŁo foi alternada para TCP" + +#: knutclient.cpp:688 knutclient.cpp:689 +msgid "Data OK" +msgstr "Dados OK" + +#: knutclient.cpp:781 knutclient.cpp:782 +msgid "The connection was closed by the second side (upsd)." +msgstr "A conexĂŁo foi fechada pelo no-break (upsd)" + +#: knutclient.cpp:798 knutclient.cpp:799 +msgid "UPS is off." +msgstr "O no-break estĂĄ desligado." + +#: knutclient.cpp:802 knutclient.cpp:803 +msgid "UPS is back on." +msgstr "O no-break estĂĄ ligado." + +#: knutclient.cpp:808 knutclient.cpp:809 +msgid "Power is back online." +msgstr "A força retornou." + +#: knutclient.cpp:814 knutclient.cpp:815 +msgid "UPS is on battery." +msgstr "O no-break estĂĄ funcionado com bateria." + +#: knutclient.cpp:820 knutclient.cpp:821 +msgid "UPS battery is low." +msgstr "A bateria do no-break estĂĄ fraca." + +#: knutclient.cpp:824 knutclient.cpp:825 +msgid "UPS battery is OK." +msgstr "A bateria do no-break estĂĄ OK." + +#: knutclient.cpp:830 knutclient.cpp:831 +msgid "UPS battery is bad and needs be replaced." +msgstr "A bateria do no-break estĂĄ com problemas e precisa ser trocada." + +#: knutclient.cpp:836 knutclient.cpp:837 +msgid "UPS is overloaded." +msgstr "O no-break estĂĄ sobrecarregado." + +#: knutclient.cpp:840 knutclient.cpp:841 +msgid "UPS isn't overloaded." +msgstr "O no-break nĂŁo estĂĄ sobrecarregado." + +#: knutclient.cpp:846 knutclient.cpp:847 knutdock.cpp:449 +msgid "UPS is performing calibration" +msgstr "O no-break estĂĄ sendo calibrado" + +#: knutclient.cpp:850 knutclient.cpp:851 +msgid "Calibration of UPS is ended." +msgstr "A calibração do no-break foi finalizada." + +#: knutclient.cpp:856 knutclient.cpp:857 +msgid "UPS is boosting incoming voltage." +msgstr "O no-break estĂĄ aumentando a voltagem de entrada." + +#: knutclient.cpp:860 knutclient.cpp:861 +msgid "Boosting of UPS is ended." +msgstr "O aumento de voltagem de entrada do no-break terminou." + +#: knutclient.cpp:866 knutclient.cpp:867 +msgid "UPS is trimming incoming voltage." +msgstr "O no-break estĂĄ ajustando a voltagem de entrada." + +#: knutclient.cpp:870 knutclient.cpp:871 +msgid "Trimming of UPS is ended." +msgstr "O ajuste da entrada da voltagem do no-break terminou." + +#: knutclient.cpp:887 knutclient.cpp:954 knutclient.cpp:963 +msgid "Switched" +msgstr "Comutado" + +#: knutclient.cpp:1103 knutdock.cpp:640 knutmainwindow.cpp:781 +msgid "Reconnect" +msgstr "Reconectar" + +#: knutdock.cpp:419 knutdock.cpp:469 knutfrontpanel.cpp:192 +#: knutnewupsdlg.cpp:69 knutprintupsvar.cpp:78 +msgid "Name" +msgstr "Nome" + +#: knutdock.cpp:420 knutnewupsdlg.cpp:83 +msgid "UPS name" +msgstr "Nome do No-break" + +#: knutdock.cpp:421 knutnewupsdlg.cpp:77 +msgid "UPS address" +msgstr "Endereço do No-break" + +#: knutdock.cpp:422 knutdock.cpp:443 knutdock.cpp:446 knutdock.cpp:449 +#: knutdock.cpp:452 knutdock.cpp:455 knutdock.cpp:458 +msgid "Status : " +msgstr "Status :" + +#: knutdock.cpp:425 knutvardata.cpp:209 +msgid "Connection doesn't exist." +msgstr "A conexĂŁo nĂŁo existe." + +#: knutdock.cpp:429 knutfrontpanel.cpp:80 +msgid "UPS On line" +msgstr "No-break Ativo" + +#: knutdock.cpp:433 knutfrontpanel.cpp:95 +msgid "UPS On battery" +msgstr "No-break Usando Bateria" + +#: knutdock.cpp:437 +msgid "UPS Of line" +msgstr "No-break desconectado" + +#: knutdock.cpp:443 +msgid "UPS Battery is low" +msgstr "A bateria do no-break estĂĄ fraca" + +#: knutdock.cpp:446 knutfrontpanel.cpp:138 +msgid "Replace battery" +msgstr "Troque a bateria" + +#: knutdock.cpp:452 +msgid "UPS is Overload" +msgstr "O no-break estĂĄ sobrecarregado" + +#: knutdock.cpp:455 +msgid "UPS is trimming voltage" +msgstr "O no-break estĂĄ ajustando a voltagem" + +#: knutdock.cpp:458 +msgid "UPS is boosting voltage" +msgstr "O no-break estĂĄ aumentando a voltagem" + +#: knutdock.cpp:464 +msgid "Error : " +msgstr "Erro : " + +#: knutdock.cpp:467 knutfrontpanel.cpp:182 +msgid "Manufac. : " +msgstr "Fabric. : " + +#: knutdock.cpp:471 +msgid "Serial" +msgstr "No. de sĂŠrie" + +#: knutdock.cpp:473 +msgid "Firmware" +msgstr "Firmware" + +#: knutdock.cpp:477 knutfrontpanel.cpp:233 +msgid "Runtime" +msgstr "Em Execução" + +#: knutdock.cpp:477 +msgid " : %1:%2 min" +msgstr " : %1:%2 min" + +#: knutdock.cpp:482 knutvardata.cpp:45 +msgid "Battery Charge" +msgstr "Carga da Bateria" + +#: knutdock.cpp:487 knutvardata.cpp:48 +msgid "UPS Load" +msgstr "Carga do No-break" + +#: knutdock.cpp:513 knutmainwindow.cpp:663 +msgid "Are you sure ?" +msgstr "VocĂŞ tem certeza?" + +#: knutdock.cpp:636 knutmainwindow.cpp:748 +msgid "&Showing UPS variables and commands" +msgstr "&Mostrar os comandos e variĂĄveis do no-break" + +#: knutdock.cpp:637 knutmainwindow.cpp:749 +msgid "&Running instant commands" +msgstr "&Executar comandos instantâneos" + +#: knutdock.cpp:638 knutmainwindow.cpp:750 +msgid "Setting R&W variables" +msgstr "Definir variĂĄveis de &Leit./Escr." + +#: knutdock.cpp:642 +msgid "&Preferences" +msgstr "&Configuraçþes" + +#: knutdock.cpp:644 +msgid "&About KNutClient" +msgstr "&Sobre o KNutClient" + +#: knutdock.cpp:646 +msgid "&Minimize" +msgstr "&Minimizar" + +#: knutdock.cpp:648 +msgid "&Exit" +msgstr "S&air" + +#: knutfrontpanel.cpp:110 +msgid "UPS Overload" +msgstr "Sobrecarga do No-break" + +#: knutfrontpanel.cpp:124 +msgid "UPS Battery low" +msgstr "No-break com Bateria Fraca" + +#: knutfrontpanel.cpp:152 +msgid "UPS calibration" +msgstr "Calibragem do No-break" + +#: knutfrontpanel.cpp:202 +msgid "Serial : " +msgstr "Serial : " + +#: knutfrontpanel.cpp:212 +msgid "Firm. rev. : " +msgstr "Vers. do Firm.:" + +#: knutinstcomms.cpp:33 +msgid "Instant commands" +msgstr "Comandos instantâneos" + +#: knutinstcomms.cpp:45 +msgid "RUN INSTANT COMMAND" +msgstr "EXECUTAR COMANDO INSTANTÂNEO" + +#: knutinstcomms.cpp:49 +msgid "Command:" +msgstr "Comando:" + +#: knutinstcomms.cpp:53 knutnewupsdlg.cpp:102 knutrwvar.cpp:70 +msgid "User name:" +msgstr "Nome do usuĂĄrio:" + +#: knutinstcomms.cpp:54 knutnewupsdlg.cpp:109 knutrwvar.cpp:71 +msgid "Password:" +msgstr "Senha:" + +#: knutmainwindow.cpp:59 +msgid "test of conection from 5" +msgstr "teste de conexĂŁo Ă  partir de 5" + +#: knutmainwindow.cpp:745 +msgid "Quits the application" +msgstr "Finalizar o aplicação" + +#: knutmainwindow.cpp:778 +msgid "&Using descriptions" +msgstr "&Usar descriçþes" + +#: knutnewupsdlg.cpp:39 +msgid "New Ups" +msgstr "Novo No-break" + +#: knutnewupsdlg.cpp:89 +msgid "Delay (ms):" +msgstr "Atraso (ms):" + +#: knutnewupsdlg.cpp:96 +msgid "Port:" +msgstr "Porta: " + +#: knutnewupsdlg.cpp:116 +msgid "Store NUT password in configuration file" +msgstr "Armazenar a senha do NUT no arquivo de configuração" + +#: knutnewupsdlg.cpp:123 +msgid "Availabled UPS values" +msgstr "" + +#: knutnewupsdlg.cpp:124 +msgid "Selected UPS values" +msgstr "" + +#: knutnewupsdlg.cpp:134 +msgid "UPS Variables" +msgstr "VariĂĄveis do No-break" + +#: knutnewupsdlg.cpp:255 +msgid "No Name or UPS address" +msgstr "Sem Nome ou Endereço do No-break" + +#: knutnewupsdlg.cpp:263 +msgid "This Name exist" +msgstr "Este nome jĂĄ existe" + +#: knutnewupsdlg.cpp:270 +msgid "Delay must be number" +msgstr "O valor de Atraso deve ser numĂŠrico" + +#: knutnewupsdlg.cpp:276 +msgid "Port must be number" +msgstr "O valor da Porta deve ser numĂŠrico" + +#: knutnewupsdlg.cpp:281 +msgid "Port must be from 1025 until 65535" +msgstr "O valor da Porta deve conter um valor de 1025 atĂŠ 65535" + +#: knutnewupsdlg.cpp:286 +msgid "Delay is too small" +msgstr "O Atraso ĂŠ muito pequeno" + +#: knutprefdlg.cpp:45 +msgid "Preferences" +msgstr "PreferĂŞncias" + +#: knutprefdlg.cpp:508 +msgid "Setting" +msgstr "Configuração" + +#: knutprefdlg.cpp:508 +msgid "Main Setting" +msgstr "Configuração Principal" + +#: knutprefdlg.cpp:516 +msgid "Voltage/Frequency" +msgstr "Voltagem/Freqßência" + +#: knutprefdlg.cpp:519 +msgid "&Use High-Low XFER" +msgstr "&Usar XFER Baixo/Alto" + +#: knutprefdlg.cpp:521 +msgid "Number of columns :" +msgstr "Quantidade de colunas:" + +#: knutprefdlg.cpp:524 knutprefdlg.cpp:815 knutprefdlg.cpp:894 +msgid "Use custom background color" +msgstr "Utilizar cor do plano de fundo personalizado" + +#: knutprefdlg.cpp:528 knutprefdlg.cpp:818 knutprefdlg.cpp:896 +msgid "Color of background :" +msgstr "Cor do plano de fundo:" + +#: knutprefdlg.cpp:532 +msgid "Use dialog \"Are you sure\"" +msgstr "Usar diĂĄlogo \"VocĂŞ tem certeza?\" :" + +#: knutprefdlg.cpp:535 +msgid "Use Main window when program is started" +msgstr "Usar janela principal quando o programa iniciar" + +#: knutprefdlg.cpp:538 +msgid "Show message window, when program reports error" +msgstr "Mostrar janela de mensagem quando o programa reportar um erro" + +#: knutprefdlg.cpp:543 +msgid "Auto" +msgstr "" + +#: knutprefdlg.cpp:547 +msgid "Nominal Input Voltage" +msgstr "Entrada de Voltagem Nominal" + +#: knutprefdlg.cpp:550 +msgid "&230 V" +msgstr "&230 V" + +#: knutprefdlg.cpp:551 +msgid "&120 V" +msgstr "&120 V" + +#: knutprefdlg.cpp:553 +msgid "Nominal Input Frequency" +msgstr "Freqßência de entrada nominal" + +#: knutprefdlg.cpp:556 +msgid "&50 Hz" +msgstr "&50 Hz" + +#: knutprefdlg.cpp:557 +msgid "&60 Hz" +msgstr "&60 Hz" + +#: knutprefdlg.cpp:628 +msgid "UPS" +msgstr "No-break" + +#: knutprefdlg.cpp:628 +msgid "UPS Setting" +msgstr "Configuração do No-break" + +#: knutprefdlg.cpp:646 +msgid "&Add" +msgstr "&Adicionar" + +#: knutprefdlg.cpp:667 +#, fuzzy +msgid "Dock bar" +msgstr "Encaixar" + +#: knutprefdlg.cpp:667 +msgid "Docking Setting" +msgstr "Configuração do encaixe" + +#: knutprefdlg.cpp:671 +msgid "Type of dock's showing" +msgstr "Mostrar os tipos de encaixe" + +#: knutprefdlg.cpp:676 +msgid "Items of tooltip" +msgstr "Itens da ferramenta de dicas" + +#: knutprefdlg.cpp:684 +msgid "&Picture" +msgstr "&Figura" + +#: knutprefdlg.cpp:685 +msgid "&General" +msgstr "&Geral" + +#: knutprefdlg.cpp:688 knutprefdlg.cpp:799 +msgid "M&anufacturer" +msgstr "F&abricante" + +#: knutprefdlg.cpp:691 knutprefdlg.cpp:802 +msgid "M&odel" +msgstr "M&odelo" + +#: knutprefdlg.cpp:694 knutprefdlg.cpp:805 +msgid "&Serial" +msgstr "No de &sĂŠrie" + +#: knutprefdlg.cpp:697 knutprefdlg.cpp:808 +msgid "&Firm. rev." +msgstr "&Ver. do Firm.: " + +#: knutprefdlg.cpp:700 knutprefdlg.cpp:811 +msgid "&Runtime" +msgstr "Em E&xecução" + +#: knutprefdlg.cpp:703 +msgid "&Battery Charge" +msgstr "Carga da &Bateria" + +#: knutprefdlg.cpp:706 +msgid "&UPS Load" +msgstr "Carga do &No-break" + +#: knutprefdlg.cpp:710 +msgid "Use custom icon's background color" +msgstr "Utilizar Ă­cones com cor do plano de fundo personalizado" + +#: knutprefdlg.cpp:713 +msgid "Color of icon's background :" +msgstr "Cor de plano de fundo do Ă­cone:" + +#: knutprefdlg.cpp:769 +msgid "Panel" +msgstr "Painel" + +#: knutprefdlg.cpp:769 +msgid "Panel Setting" +msgstr "Configuração do painel" + +#: knutprefdlg.cpp:784 +msgid "UPS &Overload" +msgstr "&Carga do No-break" + +#: knutprefdlg.cpp:787 +msgid "UPS &Battery low" +msgstr "&Bateria do No-break com pouca carga" + +#: knutprefdlg.cpp:790 +msgid "R&eplace battery" +msgstr "Tro&que a bateria" + +#: knutprefdlg.cpp:793 +msgid "Ups &calibration" +msgstr "&Calibragem do No-break" + +#: knutprefdlg.cpp:796 +msgid "&Manufac. + Model" +msgstr "Fabricante + &Modelo" + +#: knutprefdlg.cpp:851 +msgid "Setting Fonts" +msgstr "Configuração de Fontes" + +#: knutprefdlg.cpp:858 +msgid "&Use custom font" +msgstr "&Utilizar fonte personalizada" + +#: knutprefdlg.cpp:863 +msgid "Main panel" +msgstr "Painel principal" + +#: knutprefdlg.cpp:864 +msgid "Analog panels" +msgstr "Painel analĂłgico" + +#: knutprefdlg.cpp:887 +msgid "Analog" +msgstr "AnalĂłgico" + +#: knutprefdlg.cpp:887 +msgid "Setting Analog panel" +msgstr "Configuração do painel analĂłgico" + +#: knutprefdlg.cpp:898 +msgid "Use custom other colors" +msgstr "Utilizar outras cores personalizadas" + +#: knutprefdlg.cpp:900 +msgid "Color of pointer :" +msgstr "Cor do ponteiro:" + +#: knutprefdlg.cpp:902 +msgid "Color of OK range :" +msgstr "Cor do limite OK:" + +#: knutprefdlg.cpp:904 +msgid "Color of warning range :" +msgstr "Cor do limite de aviso:" + +#: knutprefdlg.cpp:906 +msgid "Color of error range :" +msgstr "Cor do limite de erro:" + +#: knutprefdlg.cpp:908 +msgid "Color of scale :" +msgstr "Cor da escala :" + +#: knutprefdlg.cpp:910 +msgid "Color of font :" +msgstr "Cor da fonte :" + +#: knutprefdlg.cpp:913 +msgid "Digital processing of pointers :" +msgstr "Cor do ponteiro:" + +#: knutprefdlg.cpp:964 +msgid "Nothing processing" +msgstr "Nada sendo processado" + +#: knutprefdlg.cpp:965 +msgid "Fast antialiasing" +msgstr "Suavização rĂĄpida de amostra" + +#: knutprefdlg.cpp:966 +msgid "Fine antialiasing" +msgstr "Suavização fina de amostra" + +#: knutprefdlg.cpp:967 +msgid "Fast antialiasing and blur motion" +msgstr "Suavização rĂĄpida de amostra e desfoque gaussiano" + +#: knutprefdlg.cpp:968 +msgid "Fine antialiasing and blur motion" +msgstr "Suavização fina de amostra e desfoque gaussiano" + +#: knutprintupsvar.cpp:41 +msgid "Variables" +msgstr "VariĂĄveis" + +#: knutprintupsvar.cpp:50 +msgid "Reload Vars" +msgstr "Recarregar variĂĄveis" + +#: knutprintupsvar.cpp:52 +msgid "UPS variables" +msgstr "VariĂĄveis do No-break" + +#: knutprintupsvar.cpp:79 +msgid "Value" +msgstr "Valor" + +#: knutprintupsvar.cpp:81 +msgid "Description" +msgstr "Descrição" + +#: knutprintupsvar.cpp:90 +msgid "Instant Commands" +msgstr "Comandos Instantâneos" + +#: knutprintupsvar.cpp:103 +msgid "Read/Write Variables" +msgstr "VariĂĄveis de Leitura/Escrita" + +#: knutprintupsvar.cpp:121 +msgid "Read Only Variables" +msgstr "VariĂĄveis Apenas de Leitura" + +#: knutrwvar.cpp:40 +msgid "RW variables" +msgstr "VariĂĄveis de Leit./Escr." + +#: knutrwvar.cpp:56 +msgid "SET RW VARIABLE" +msgstr "DEFINIR VARIÁVEL DE LEIT./ESCR." + +#: knutrwvar.cpp:61 +msgid "Variable:" +msgstr "VariĂĄvel:" + +#: knutrwvar.cpp:64 +msgid "Value:" +msgstr "Valor:" + +#: knutvardata.cpp:43 +msgid "None" +msgstr "Nenhum" + +#: knutvardata.cpp:44 +msgid "Input Voltage" +msgstr "Voltagem de Entrada" + +#: knutvardata.cpp:46 +msgid "UPS Temperature" +msgstr "Temperatura do No-break" + +#: knutvardata.cpp:47 +msgid "Input Frequency" +msgstr "Freqßência de Entrada" + +#: knutvardata.cpp:49 +msgid "Outside Temperature" +msgstr "Temperatura Exterior" + +#: knutvardata.cpp:50 +msgid "Outside Humidity" +msgstr "Umidade Exterior" + +#: knutvardata.cpp:51 +msgid "Battery Voltage" +msgstr "Voltagem da Bateria" + +#: knutvardata.cpp:52 +msgid "Output Voltage" +msgstr "Voltagem de SaĂ­da" + +#: knutvardata.cpp:53 +msgid "Output Current" +msgstr "Corrente de SaĂ­da" + +#: knutvardata.cpp:54 +msgid "Output Frequency" +msgstr "Freqßência de SaĂ­da" + +#: knutvardata.cpp:55 +msgid "Battery Temperature" +msgstr "Temperatura da Bateria" + +#: knutvardata.cpp:56 +msgid "Battery Current" +msgstr "Corrente da Bateria" + +#: knutvardata.cpp:186 +#, fuzzy +msgid "No memory." +msgstr "Sem MemĂłria." + +#: knutvardata.cpp:187 +msgid "No address." +msgstr "Sem endereço." + +#: knutvardata.cpp:188 +msgid "Unknown address." +msgstr "Endereço desconhecido." + +#: knutvardata.cpp:191 +msgid "Error of connection." +msgstr "Erro de ConexĂŁo." + +#: knutvardata.cpp:194 +msgid "No connection with server." +msgstr "Sem conexĂŁo com o servidor." + +#: knutvardata.cpp:196 +msgid "Server-client protocol or variables of NUT are unknown." +msgstr "Protocolo cliente-servidor ou variĂĄveis do NUT sĂŁo desconhecidas." + +#: knutvardata.cpp:197 +msgid "No UPS on this address." +msgstr "NĂŁo hĂĄ nenhum no-break neste endereço." + +#: knutvardata.cpp:198 +msgid "Connection was refused by server." +msgstr "ConexĂŁo foi recusada pelo servidor." + +#: knutvardata.cpp:200 +msgid "Server doesn't receive data." +msgstr "O servidor nĂŁo estĂĄ recebendo dados." + +#: knutvardata.cpp:201 +msgid "Server doesn't send data." +msgstr "O servidor nĂŁo estĂĄ enviando dados." + +#: knutvardata.cpp:202 +msgid "Server doesn't answer." +msgstr "O servidor nĂŁo estĂĄ respondendo." + +#: knutvardata.cpp:204 +msgid "Server returns data with unknown format." +msgstr "O servidor retornou dados com um formato desconhecido." + +#: knutvardata.cpp:205 +msgid "Server returns unknown data." +msgstr "O servidor retornou dados desconhecidos." + +#: knutvardata.cpp:206 +msgid "Command VER returns data with unknown format." +msgstr "O comando VER retornou dados com um formato desconhecido." + +#: knutvardata.cpp:208 +msgid "No data." +msgstr "Sem dados." + +#: knutvardata.cpp:212 +msgid "Access denied. Failed password ?" +msgstr "Acesso negado. Senha errada?" + +#: knutvardata.cpp:213 +msgid "UPS doesn't sent data to server (Data Stale)." +msgstr "O no-break nĂŁo consegue enviar dados para o servidor (pane de dados)." + +#: knutvardata.cpp:214 +msgid "Server doesn't know this command." +msgstr "O servidor desconhece este comando." + +#: knutvardata.cpp:217 +msgid "UPS's driver isn't connected." +msgstr "O driver do no-break nĂŁo estĂĄ conectado." + +#: knutvardata.cpp:219 +msgid "Server required password." +msgstr "O servidor precisa de uma senha." + +#: knutvardata.cpp:220 +msgid "Incorrect password." +msgstr "Senha incorreta." + +#: knutvardata.cpp:221 +msgid "UPS doesn't response." +msgstr "O no-break nĂŁo responde." + +#: knutvardata.cpp:222 +msgid "Command failed." +msgstr "O comando falhou." + +#: knutvardata.cpp:223 +msgid "UPS doesn't know this instant command." +msgstr "O no-break desconhece este comando instantâneo." + +#: knutvardata.cpp:224 +msgid "UPS doesn't support this instant command." +msgstr "O no-break nĂŁo tem suporte para este comando instantâneo." + +#: knutvardata.cpp:225 +msgid "UPS doesn't known this variable." +msgstr "O no-break desconhece esta variĂĄvel." + +#: knutvardata.cpp:226 +msgid "UPS doesn't support this variable." +msgstr "O no-break nĂŁo tem suporte para esta variĂĄvel." + +#: knutvardata.cpp:227 +msgid "UPS doesn't support this value in this variable." +msgstr "O no-break nĂŁo tem suporte para este valor nesta variĂĄvel." + +#: knutvardata.cpp:228 +msgid "Name of UPS is unknown." +msgstr "O nome do no-break ĂŠ desconhecido." + +#: knutvardata.cpp:230 +msgid "Username has been already entered." +msgstr "O nome de usuĂĄrio jĂĄ foi alterado." + +#: knutvardata.cpp:231 +msgid "Password has been already entered." +msgstr "A senha jĂĄ foi informada." + +#: knutvardata.cpp:233 +msgid "Server doesn't send list of variables." +msgstr "O servidor nĂŁo envia a lista de variĂĄveis." + +#: knutvardata.cpp:236 +msgid "Unknown error." +msgstr "Erro desconhecido." + +#: main.cpp:31 +msgid "Client for Network UPS Tool" +msgstr "Cliente para No-break de Rede" + +#: main.cpp:37 +msgid "Don't dock in Kicker" +msgstr "NĂŁo encaixar no painel" + +#: main.cpp:47 +msgid "KNutClient" +msgstr "KNutClient" + +#. i18n: file ./knutclientui.rc line 13 +#: rc.cpp:9 +#, no-c-format +msgid "&Connection" +msgstr "&ConexĂŁo" diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 0000000..111d20a --- /dev/null +++ b/po/ru.po @@ -0,0 +1,917 @@ +# translation of ru.po to Czech +# translation of ru.po to Russian +# Copyright (C) 2003,2004 Free Software Foundation, Inc. +# Oleg Shevchenko , 2003,2004. +# Daniel Prynych , 2003, 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: ru\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-02-21 12:13+0100\n" +"PO-Revision-Date: 2004-02-17 19:01+0100\n" +"Last-Translator: Daniel Prynych \n" +"Language-Team: Czech \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.0.2\n" + +#: _translatorinfo.cpp:1 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "Oleg Shevchenko" + +#: _translatorinfo.cpp:3 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "oleg@kpgaz.chernigov.ua" + +#: knutclient.cpp:86 +msgid "Ready." +msgstr "Готов." + +#: knutclient.cpp:218 knutclient.cpp:219 +msgid "The connection was renewed." +msgstr "" + +#: knutclient.cpp:285 +msgid "The connection failed. The next connection will make after %1 sec." +msgstr "" + +#: knutclient.cpp:546 +msgid "upsd > 1.2 doesn't support UDP. Connection is switched to TCP" +msgstr "upsd > 1.2 но поддерживает UDP. ХОодинонио переключено на TCP" + +#: knutclient.cpp:688 knutclient.cpp:689 +msgid "Data OK" +msgstr "Данные OK" + +#: knutclient.cpp:781 knutclient.cpp:782 +msgid "The connection was closed by the second side (upsd)." +msgstr "" + +#: knutclient.cpp:798 knutclient.cpp:799 +msgid "UPS is off." +msgstr "UPS выкл." + +#: knutclient.cpp:802 knutclient.cpp:803 +msgid "UPS is back on." +msgstr "UPS вкН." + +#: knutclient.cpp:808 knutclient.cpp:809 +msgid "Power is back online." +msgstr "Питание возвращено." + +#: knutclient.cpp:814 knutclient.cpp:815 +msgid "UPS is on battery." +msgstr "UPS на батарее." + +#: knutclient.cpp:820 knutclient.cpp:821 +msgid "UPS battery is low." +msgstr "UPS батарея разряженная." + +#: knutclient.cpp:824 knutclient.cpp:825 +msgid "UPS battery is OK." +msgstr "UPS батарея OK." + +#: knutclient.cpp:830 knutclient.cpp:831 +msgid "UPS battery is bad and needs be replaced." +msgstr "UPS батарея плохая и требует замены." + +#: knutclient.cpp:836 knutclient.cpp:837 +msgid "UPS is overloaded." +msgstr "UPS перегружен." + +#: knutclient.cpp:840 knutclient.cpp:841 +msgid "UPS isn't overloaded." +msgstr "UPS но перегружен." + +#: knutclient.cpp:846 knutclient.cpp:847 knutdock.cpp:449 +msgid "UPS is performing calibration" +msgstr "UPS выполняю калибровку" + +#: knutclient.cpp:850 knutclient.cpp:851 +msgid "Calibration of UPS is ended." +msgstr "Калибровка UPS завершена." + +#: knutclient.cpp:856 knutclient.cpp:857 +msgid "UPS is boosting incoming voltage." +msgstr "UPS повышаю входное напряжение." + +#: knutclient.cpp:860 knutclient.cpp:861 +msgid "Boosting of UPS is ended." +msgstr "Повышение напряжения завершено." + +#: knutclient.cpp:866 knutclient.cpp:867 +msgid "UPS is trimming incoming voltage." +msgstr "UPS подстройка входного напряжения." + +#: knutclient.cpp:870 knutclient.cpp:871 +msgid "Trimming of UPS is ended." +msgstr "Подстройка напряжения завершена." + +#: knutclient.cpp:887 knutclient.cpp:954 knutclient.cpp:963 +msgid "Switched" +msgstr "Переключить" + +#: knutclient.cpp:1103 knutdock.cpp:640 knutmainwindow.cpp:781 +msgid "Reconnect" +msgstr "" + +#: knutdock.cpp:419 knutdock.cpp:469 knutfrontpanel.cpp:192 +#: knutnewupsdlg.cpp:69 knutprintupsvar.cpp:78 +msgid "Name" +msgstr "Имя" + +#: knutdock.cpp:420 knutnewupsdlg.cpp:83 +msgid "UPS name" +msgstr "UPS имя" + +#: knutdock.cpp:421 knutnewupsdlg.cpp:77 +msgid "UPS address" +msgstr "UPS адрес" + +#: knutdock.cpp:422 knutdock.cpp:443 knutdock.cpp:446 knutdock.cpp:449 +#: knutdock.cpp:452 knutdock.cpp:455 knutdock.cpp:458 +msgid "Status : " +msgstr "Статус : " + +#: knutdock.cpp:425 knutvardata.cpp:209 +msgid "Connection doesn't exist." +msgstr "ХОодинонио но установлено." + +#: knutdock.cpp:429 knutfrontpanel.cpp:80 +msgid "UPS On line" +msgstr "UPS на Нинии" + +#: knutdock.cpp:433 knutfrontpanel.cpp:95 +msgid "UPS On battery" +msgstr "UPS на батарее" + +#: knutdock.cpp:437 +msgid "UPS Of line" +msgstr "UPS на Нинии" + +#: knutdock.cpp:443 +msgid "UPS Battery is low" +msgstr "UPS батарея разряженая." + +#: knutdock.cpp:446 knutfrontpanel.cpp:138 +msgid "Replace battery" +msgstr "Заменить батарею" + +#: knutdock.cpp:452 +msgid "UPS is Overload" +msgstr "UPS Перегрузка" + +#: knutdock.cpp:455 +msgid "UPS is trimming voltage" +msgstr "UPS подстройка напряжения" + +#: knutdock.cpp:458 +msgid "UPS is boosting voltage" +msgstr "UPS повышение напряжения" + +#: knutdock.cpp:464 +msgid "Error : " +msgstr "Ошибка : " + +#: knutdock.cpp:467 knutfrontpanel.cpp:182 +msgid "Manufac. : " +msgstr "Производитель : " + +#: knutdock.cpp:471 +msgid "Serial" +msgstr "Порт" + +#: knutdock.cpp:473 +msgid "Firmware" +msgstr "Firmware" + +#: knutdock.cpp:477 knutfrontpanel.cpp:233 +msgid "Runtime" +msgstr "Время работы" + +#: knutdock.cpp:477 +msgid " : %1:%2 min" +msgstr " : %1:%2 Пин" + +#: knutdock.cpp:482 knutvardata.cpp:45 +msgid "Battery Charge" +msgstr "Зарядка батареи" + +#: knutdock.cpp:487 knutvardata.cpp:48 +msgid "UPS Load" +msgstr "UPS Загрузка" + +#: knutdock.cpp:513 knutmainwindow.cpp:663 +msgid "Are you sure ?" +msgstr "Вы уверенны?" + +#: knutdock.cpp:636 knutmainwindow.cpp:748 +msgid "&Showing UPS variables and commands" +msgstr "П&оказать UPS переменные и команды" + +#: knutdock.cpp:637 knutmainwindow.cpp:749 +msgid "&Running instant commands" +msgstr "Запуск &прямых кОПанд" + +#: knutdock.cpp:638 knutmainwindow.cpp:750 +msgid "Setting R&W variables" +msgstr "&Установка переменных RW" + +#: knutdock.cpp:642 +msgid "&Preferences" +msgstr "Предпочтени&я" + +#: knutdock.cpp:644 +msgid "&About KNutClient" +msgstr "&О программе KNutClient" + +#: knutdock.cpp:646 +msgid "&Minimize" +msgstr "&Минимизация" + +#: knutdock.cpp:648 +msgid "&Exit" +msgstr "&Выход" + +#: knutfrontpanel.cpp:110 +msgid "UPS Overload" +msgstr "UPS Перегрузка" + +#: knutfrontpanel.cpp:124 +msgid "UPS Battery low" +msgstr "UPS Батарея разряженная" + +#: knutfrontpanel.cpp:152 +msgid "UPS calibration" +msgstr "UPS калибровка" + +#: knutfrontpanel.cpp:202 +msgid "Serial : " +msgstr "Serial : " + +#: knutfrontpanel.cpp:212 +msgid "Firm. rev. : " +msgstr "Firm. rev. : " + +#: knutinstcomms.cpp:33 +msgid "Instant commands" +msgstr "Прямые команды" + +#: knutinstcomms.cpp:45 +msgid "RUN INSTANT COMMAND" +msgstr "ВЫПОЛНИТЬ ПРЯМУЮ КОМАНДУ" + +#: knutinstcomms.cpp:49 +msgid "Command:" +msgstr "Команда:" + +#: knutinstcomms.cpp:53 knutnewupsdlg.cpp:102 knutrwvar.cpp:70 +msgid "User name:" +msgstr "Имя пользователя:" + +#: knutinstcomms.cpp:54 knutnewupsdlg.cpp:109 knutrwvar.cpp:71 +msgid "Password:" +msgstr "Пароль:" + +#: knutmainwindow.cpp:59 +msgid "test of conection from 5" +msgstr "" + +#: knutmainwindow.cpp:745 +msgid "Quits the application" +msgstr "Выйти иС приложения" + +#: knutmainwindow.cpp:778 +msgid "&Using descriptions" +msgstr "Использую &описания" + +#: knutnewupsdlg.cpp:39 +msgid "New Ups" +msgstr "Новый UPS" + +#: knutnewupsdlg.cpp:89 +msgid "Delay (ms):" +msgstr "Задержка (Пс):" + +#: knutnewupsdlg.cpp:96 +msgid "Port:" +msgstr "Порт:" + +#: knutnewupsdlg.cpp:116 +msgid "Store NUT password in configuration file" +msgstr "Хранить NUT пароль в конфигурационном файле" + +#: knutnewupsdlg.cpp:123 +msgid "Availabled UPS values" +msgstr "" + +#: knutnewupsdlg.cpp:124 +msgid "Selected UPS values" +msgstr "" + +#: knutnewupsdlg.cpp:134 +msgid "UPS Variables" +msgstr "UPS переменные" + +#: knutnewupsdlg.cpp:255 +msgid "No Name or UPS address" +msgstr "Отсутствует Имя иНи UPS адрес" + +#: knutnewupsdlg.cpp:263 +msgid "This Name exist" +msgstr "ТакОо Имя уМо существует" + +#: knutnewupsdlg.cpp:270 +msgid "Delay must be number" +msgstr "Задержка дОНМна быть числовой" + +#: knutnewupsdlg.cpp:276 +msgid "Port must be number" +msgstr "Порт дОНМон быть числовой" + +#: knutnewupsdlg.cpp:281 +msgid "Port must be from 1025 until 65535" +msgstr "Порт дОНМон быть в диапаСОно 1025 - 65535" + +#: knutnewupsdlg.cpp:286 +msgid "Delay is too small" +msgstr "Задержка сНишкОП маленькая" + +#: knutprefdlg.cpp:45 +msgid "Preferences" +msgstr "Предпочтения" + +#: knutprefdlg.cpp:508 +msgid "Setting" +msgstr "Настройки" + +#: knutprefdlg.cpp:508 +msgid "Main Setting" +msgstr "Основные настройки" + +#: knutprefdlg.cpp:516 +msgid "Voltage/Frequency" +msgstr "Напряжение/Частота" + +#: knutprefdlg.cpp:519 +msgid "&Use High-Low XFER" +msgstr "&Использовать Высокий Низкий XFER" + +#: knutprefdlg.cpp:521 +msgid "Number of columns :" +msgstr "Количество кОНОнОк :" + +#: knutprefdlg.cpp:524 knutprefdlg.cpp:815 knutprefdlg.cpp:894 +msgid "Use custom background color" +msgstr "Использовать выбранный цвет фона" + +#: knutprefdlg.cpp:528 knutprefdlg.cpp:818 knutprefdlg.cpp:896 +msgid "Color of background :" +msgstr "Цвет фона :" + +#: knutprefdlg.cpp:532 +#, fuzzy +msgid "Use dialog \"Are you sure\"" +msgstr "Использовать диаНОг \"Вы уверенны\" :" + +#: knutprefdlg.cpp:535 +#, fuzzy +msgid "Use Main window when program is started" +msgstr "Использовать гНавнОо ОкнО при старте :" + +#: knutprefdlg.cpp:538 +#, fuzzy +msgid "Show message window, when program reports error" +msgstr "Использовать гНавнОо ОкнО при старте :" + +#: knutprefdlg.cpp:543 +msgid "Auto" +msgstr "" + +#: knutprefdlg.cpp:547 +msgid "Nominal Input Voltage" +msgstr "Номинальное входное напряжение" + +#: knutprefdlg.cpp:550 +msgid "&230 V" +msgstr "&230 В" + +#: knutprefdlg.cpp:551 +msgid "&120 V" +msgstr "&120 В" + +#: knutprefdlg.cpp:553 +msgid "Nominal Input Frequency" +msgstr "Номинальная входная частота" + +#: knutprefdlg.cpp:556 +msgid "&50 Hz" +msgstr "&50 Гц" + +#: knutprefdlg.cpp:557 +msgid "&60 Hz" +msgstr "&60 Гц" + +#: knutprefdlg.cpp:628 +msgid "UPS" +msgstr "UPS" + +#: knutprefdlg.cpp:628 +msgid "UPS Setting" +msgstr "UPS Настройки" + +#: knutprefdlg.cpp:646 +msgid "&Add" +msgstr "&Добавить" + +#: knutprefdlg.cpp:667 +#, fuzzy +msgid "Dock bar" +msgstr "Dock" + +#: knutprefdlg.cpp:667 +msgid "Docking Setting" +msgstr "Dock настройки" + +#: knutprefdlg.cpp:671 +msgid "Type of dock's showing" +msgstr "Тип показаных dock's" + +#: knutprefdlg.cpp:676 +msgid "Items of tooltip" +msgstr "Пункты пОдскаСки" + +#: knutprefdlg.cpp:684 +msgid "&Picture" +msgstr "&Картина" + +#: knutprefdlg.cpp:685 +msgid "&General" +msgstr "&Основной" + +#: knutprefdlg.cpp:688 knutprefdlg.cpp:799 +msgid "M&anufacturer" +msgstr "Пр&оизводитель" + +#: knutprefdlg.cpp:691 knutprefdlg.cpp:802 +msgid "M&odel" +msgstr "&Модель" + +#: knutprefdlg.cpp:694 knutprefdlg.cpp:805 +msgid "&Serial" +msgstr "Пор&т" + +#: knutprefdlg.cpp:697 knutprefdlg.cpp:808 +msgid "&Firm. rev." +msgstr "&Firm. rev." + +#: knutprefdlg.cpp:700 knutprefdlg.cpp:811 +msgid "&Runtime" +msgstr "&Время работы" + +#: knutprefdlg.cpp:703 +msgid "&Battery Charge" +msgstr "&Зарядка батареи" + +#: knutprefdlg.cpp:706 +msgid "&UPS Load" +msgstr "UPS З&агрузка" + +#: knutprefdlg.cpp:710 +msgid "Use custom icon's background color" +msgstr "Использовать выбранный цвет фона для икОнОк" + +#: knutprefdlg.cpp:713 +msgid "Color of icon's background :" +msgstr "Цвет фона для икОнОк:" + +#: knutprefdlg.cpp:769 +msgid "Panel" +msgstr "Панель" + +#: knutprefdlg.cpp:769 +msgid "Panel Setting" +msgstr "Настройка паноНи" + +#: knutprefdlg.cpp:784 +msgid "UPS &Overload" +msgstr "UPS &Перегрузка" + +#: knutprefdlg.cpp:787 +msgid "UPS &Battery low" +msgstr "UPS &Батарея разряженная" + +#: knutprefdlg.cpp:790 +msgid "R&eplace battery" +msgstr "&Заменить батарею" + +#: knutprefdlg.cpp:793 +msgid "Ups &calibration" +msgstr "UPS &Калибровка" + +#: knutprefdlg.cpp:796 +msgid "&Manufac. + Model" +msgstr "П&роизводитель + Модель" + +#: knutprefdlg.cpp:851 +msgid "Setting Fonts" +msgstr "Настройка шрифтов" + +#: knutprefdlg.cpp:858 +msgid "&Use custom font" +msgstr "И&спользовать выбранный шрифт" + +#: knutprefdlg.cpp:863 +msgid "Main panel" +msgstr "Основная панель" + +#: knutprefdlg.cpp:864 +msgid "Analog panels" +msgstr "Аналоговая панель" + +#: knutprefdlg.cpp:887 +msgid "Analog" +msgstr "АнаНОг" + +#: knutprefdlg.cpp:887 +msgid "Setting Analog panel" +msgstr "Настройка анаНОгОвОК паноНи" + +#: knutprefdlg.cpp:898 +msgid "Use custom other colors" +msgstr "Использовать выбранные цвета" + +#: knutprefdlg.cpp:900 +msgid "Color of pointer :" +msgstr "Цвет точки :" + +#: knutprefdlg.cpp:902 +msgid "Color of OK range :" +msgstr "Цвет области OK :" + +#: knutprefdlg.cpp:904 +msgid "Color of warning range :" +msgstr "Цвет области предупреждения :" + +#: knutprefdlg.cpp:906 +msgid "Color of error range :" +msgstr "Цвет области Ошибка:" + +#: knutprefdlg.cpp:908 +msgid "Color of scale :" +msgstr "Цвет масштаба :" + +#: knutprefdlg.cpp:910 +msgid "Color of font :" +msgstr "Цвет шрифта :" + +#: knutprefdlg.cpp:913 +#, fuzzy +msgid "Digital processing of pointers :" +msgstr "Цвет точки :" + +#: knutprefdlg.cpp:964 +msgid "Nothing processing" +msgstr "" + +#: knutprefdlg.cpp:965 +msgid "Fast antialiasing" +msgstr "" + +#: knutprefdlg.cpp:966 +msgid "Fine antialiasing" +msgstr "" + +#: knutprefdlg.cpp:967 +msgid "Fast antialiasing and blur motion" +msgstr "" + +#: knutprefdlg.cpp:968 +msgid "Fine antialiasing and blur motion" +msgstr "" + +#: knutprintupsvar.cpp:41 +msgid "Variables" +msgstr "Переменные" + +#: knutprintupsvar.cpp:50 +msgid "Reload Vars" +msgstr "Перечитать переменные" + +#: knutprintupsvar.cpp:52 +msgid "UPS variables" +msgstr "UPS переменные" + +#: knutprintupsvar.cpp:79 +msgid "Value" +msgstr "Значение" + +#: knutprintupsvar.cpp:81 +msgid "Description" +msgstr "Описание" + +#: knutprintupsvar.cpp:90 +msgid "Instant Commands" +msgstr "Прямые команды" + +#: knutprintupsvar.cpp:103 +msgid "Read/Write Variables" +msgstr "Переменные R/W" + +#: knutprintupsvar.cpp:121 +msgid "Read Only Variables" +msgstr "Переменные R/O" + +#: knutrwvar.cpp:40 +msgid "RW variables" +msgstr "RW переменные" + +#: knutrwvar.cpp:56 +msgid "SET RW VARIABLE" +msgstr "УСТАНОВКА ПЕРЕМЕННЫХ RW" + +#: knutrwvar.cpp:61 +msgid "Variable:" +msgstr "Переменная:" + +#: knutrwvar.cpp:64 +msgid "Value:" +msgstr "Значение:" + +#: knutvardata.cpp:43 +msgid "None" +msgstr "Нет" + +#: knutvardata.cpp:44 +msgid "Input Voltage" +msgstr "Входное напряжение" + +#: knutvardata.cpp:46 +msgid "UPS Temperature" +msgstr "UPS Температура" + +#: knutvardata.cpp:47 +msgid "Input Frequency" +msgstr "Входная частота" + +#: knutvardata.cpp:49 +msgid "Outside Temperature" +msgstr "Окружающая температура" + +#: knutvardata.cpp:50 +msgid "Outside Humidity" +msgstr "Окружающая влажность" + +#: knutvardata.cpp:51 +msgid "Battery Voltage" +msgstr "Напряжение батареи" + +#: knutvardata.cpp:52 +msgid "Output Voltage" +msgstr "Выходное напряжение" + +#: knutvardata.cpp:53 +msgid "Output Current" +msgstr "Выходное текущее" + +#: knutvardata.cpp:54 +#, fuzzy +msgid "Output Frequency" +msgstr "Входная частота" + +#: knutvardata.cpp:55 +msgid "Battery Temperature" +msgstr "Температура батареи" + +#: knutvardata.cpp:56 +msgid "Battery Current" +msgstr "Батарея текущая" + +#: knutvardata.cpp:186 +#, fuzzy +msgid "No memory." +msgstr "Нет памяти." + +#: knutvardata.cpp:187 +msgid "No address." +msgstr "Нет адреса." + +#: knutvardata.cpp:188 +msgid "Unknown address." +msgstr "Неизвестный адрес." + +#: knutvardata.cpp:191 +msgid "Error of connection." +msgstr "" + +#: knutvardata.cpp:194 +#, fuzzy +msgid "No connection with server." +msgstr "Нет связи с сервером." + +#: knutvardata.cpp:196 +msgid "Server-client protocol or variables of NUT are unknown." +msgstr "Сервер-клиент протокол иНи переменные для NUT неизвестны." + +#: knutvardata.cpp:197 +msgid "No UPS on this address." +msgstr "UPS отсутствует на даннОП адресе." + +#: knutvardata.cpp:198 +#, fuzzy +msgid "Connection was refused by server." +msgstr "Нет связи с сервером." + +#: knutvardata.cpp:200 +msgid "Server doesn't receive data." +msgstr "Сервер но принимает данных." + +#: knutvardata.cpp:201 +msgid "Server doesn't send data." +msgstr "Сервер но пересылает данные." + +#: knutvardata.cpp:202 +msgid "Server doesn't answer." +msgstr "Сервер но отвечает." + +#: knutvardata.cpp:204 +msgid "Server returns data with unknown format." +msgstr "Сервер возвращает данные в неизвестном формате." + +#: knutvardata.cpp:205 +msgid "Server returns unknown data." +msgstr "Сервер возвращает неизвестные данные." + +#: knutvardata.cpp:206 +msgid "Command VER returns data with unknown format." +msgstr "Команда VER возвращает данные в неизвестном формате." + +#: knutvardata.cpp:208 +msgid "No data." +msgstr "Нет данных." + +#: knutvardata.cpp:212 +msgid "Access denied. Failed password ?" +msgstr "Доступ запрещен. Неправильный пароль ?" + +#: knutvardata.cpp:213 +msgid "UPS doesn't sent data to server (Data Stale)." +msgstr "UPS но пересылает данные на сервер (Данные устаревшие)." + +#: knutvardata.cpp:214 +msgid "Server doesn't know this command." +msgstr "Сервер но знает кОПанду." + +#: knutvardata.cpp:217 +msgid "UPS's driver isn't connected." +msgstr "UPS но ПОгу соединиться с драйвером." + +#: knutvardata.cpp:219 +msgid "Server required password." +msgstr "Сервер требует пароль." + +#: knutvardata.cpp:220 +msgid "Incorrect password." +msgstr "Неправильный пароль." + +#: knutvardata.cpp:221 +msgid "UPS doesn't response." +msgstr "UPS но отвечает." + +#: knutvardata.cpp:222 +msgid "Command failed." +msgstr "Неверная кОПанда." + +#: knutvardata.cpp:223 +msgid "UPS doesn't know this instant command." +msgstr "UPS но знает кОПанду." + +#: knutvardata.cpp:224 +msgid "UPS doesn't support this instant command." +msgstr "UPS но поддерживает кОПанду." + +#: knutvardata.cpp:225 +msgid "UPS doesn't known this variable." +msgstr "UPS но знает переменную." + +#: knutvardata.cpp:226 +msgid "UPS doesn't support this variable." +msgstr "UPS но поддерживает переменную." + +#: knutvardata.cpp:227 +msgid "UPS doesn't support this value in this variable." +msgstr "UPS но поддерживает это значение для даннОК переменной." + +#: knutvardata.cpp:228 +msgid "Name of UPS is unknown." +msgstr "Имя UPS неизвестное." + +#: knutvardata.cpp:230 +msgid "Username has been already entered." +msgstr "" + +#: knutvardata.cpp:231 +msgid "Password has been already entered." +msgstr "" + +#: knutvardata.cpp:233 +#, fuzzy +msgid "Server doesn't send list of variables." +msgstr "Сервер но пересылает данные." + +#: knutvardata.cpp:236 +msgid "Unknown error." +msgstr "Неизвестная Ошийка." + +#: main.cpp:31 +msgid "Client for Network UPS Tool" +msgstr "Клиент для Network UPS Tool" + +#: main.cpp:37 +msgid "Don't dock in Kicker" +msgstr "Отсутствует Dock при ударе" + +#: main.cpp:47 +msgid "KNutClient" +msgstr "KNutClient" + +#. i18n: file ./knutclientui.rc line 13 +#: rc.cpp:9 +#, no-c-format +msgid "&Connection" +msgstr "" + +#~ msgid "Toggle the toolbar..." +#~ msgstr "Переключатель toolbar" + +#~ msgid "Toggle the statusbar..." +#~ msgstr "Переключатель статусной строки" + +#~ msgid "Protocol" +#~ msgstr "Протокол" + +#~ msgid "UDP" +#~ msgstr "UDP" + +#~ msgid "TCP" +#~ msgstr "TCP" + +#, fuzzy +#~ msgid "&Settings" +#~ msgstr "Настройки" + +#~ msgid "KNutRWVar" +#~ msgstr "KNutRWVar" + +#~ msgid "KNutNet" +#~ msgstr "KNutNet" + +#~ msgid "KNutFrontPanel" +#~ msgstr "KNutFrontPanel" + +#~ msgid "KNutMainWindow" +#~ msgstr "KNutMainWindow" + +#~ msgid "KAnalog" +#~ msgstr "KAnalog" + +#~ msgid "KNutNewUpsDlg" +#~ msgstr "KNutNewUpsDlg" + +#~ msgid "KNutPrefDlg" +#~ msgstr "KNutPrefDlg" + +#~ msgid "KNutPrintUpsVar" +#~ msgstr "KNutPrintUpsVar" + +#, fuzzy +#~ msgid "Unknown Error" +#~ msgstr "Неизвестная Ошийка." + +#, fuzzy +#~ msgid "UPS is performing calibration." +#~ msgstr "UPS калибровка" + +#~ msgid "Showing UPS variables and commands" +#~ msgstr "Показать UPS переменные и команды" + +#~ msgid "Running instant commands" +#~ msgstr "Запуск прямых кОПанд" + +#~ msgid "Setting RW variables" +#~ msgstr "Установка переменных RW" + +#~ msgid "Name : " +#~ msgstr "Имя : " + +#~ msgid "Runtime : " +#~ msgstr "Время работы : " + +#~ msgid "Name:" +#~ msgstr "Имя:" diff --git a/po/uk.po b/po/uk.po new file mode 100644 index 0000000..474c57d --- /dev/null +++ b/po/uk.po @@ -0,0 +1,918 @@ +# translation of uk.po to Czech +# translation of uk.po to Russian +# translation of ru.po to Russian +# Copyright (C) 2003,2004 Free Software Foundation, Inc. +# Oleg Shevchenko , 2003,2004. +# Daniel Prynych , 2003, 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: uk\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-02-21 12:13+0100\n" +"PO-Revision-Date: 2004-02-17 19:03+0100\n" +"Last-Translator: Daniel Prynych \n" +"Language-Team: Czech \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.0.2\n" + +#: _translatorinfo.cpp:1 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "Oleg Shevchenko" + +#: _translatorinfo.cpp:3 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "oleg@kpgaz.chernigov.ua" + +#: knutclient.cpp:86 +msgid "Ready." +msgstr "Готовий." + +#: knutclient.cpp:218 knutclient.cpp:219 +msgid "The connection was renewed." +msgstr "" + +#: knutclient.cpp:285 +msgid "The connection failed. The next connection will make after %1 sec." +msgstr "" + +#: knutclient.cpp:546 +msgid "upsd > 1.2 doesn't support UDP. Connection is switched to TCP" +msgstr "upsd > 1.2 но підтримуєт UDP. З'єднання переключено на TCP" + +#: knutclient.cpp:688 knutclient.cpp:689 +msgid "Data OK" +msgstr "Дані OK" + +#: knutclient.cpp:781 knutclient.cpp:782 +msgid "The connection was closed by the second side (upsd)." +msgstr "" + +#: knutclient.cpp:798 knutclient.cpp:799 +msgid "UPS is off." +msgstr "UPS викН." + +#: knutclient.cpp:802 knutclient.cpp:803 +msgid "UPS is back on." +msgstr "UPS вкН." + +#: knutclient.cpp:808 knutclient.cpp:809 +msgid "Power is back online." +msgstr "Напругу повернуто." + +#: knutclient.cpp:814 knutclient.cpp:815 +msgid "UPS is on battery." +msgstr "UPS на батареї." + +#: knutclient.cpp:820 knutclient.cpp:821 +msgid "UPS battery is low." +msgstr "UPS батарея розряжена." + +#: knutclient.cpp:824 knutclient.cpp:825 +msgid "UPS battery is OK." +msgstr "UPS батарея OK." + +#: knutclient.cpp:830 knutclient.cpp:831 +msgid "UPS battery is bad and needs be replaced." +msgstr "UPS батарея пОгана і потребує заміни." + +#: knutclient.cpp:836 knutclient.cpp:837 +msgid "UPS is overloaded." +msgstr "UPS перевантажений." + +#: knutclient.cpp:840 knutclient.cpp:841 +msgid "UPS isn't overloaded." +msgstr "UPS но перевантажений." + +#: knutclient.cpp:846 knutclient.cpp:847 knutdock.cpp:449 +msgid "UPS is performing calibration" +msgstr "UPS починаю калібровку" + +#: knutclient.cpp:850 knutclient.cpp:851 +msgid "Calibration of UPS is ended." +msgstr "Калібровку UPS закінчено." + +#: knutclient.cpp:856 knutclient.cpp:857 +msgid "UPS is boosting incoming voltage." +msgstr "UPS підняття вхідної напруги." + +#: knutclient.cpp:860 knutclient.cpp:861 +msgid "Boosting of UPS is ended." +msgstr "Підняття напруги закінчено." + +#: knutclient.cpp:866 knutclient.cpp:867 +msgid "UPS is trimming incoming voltage." +msgstr "UPS підстройка вхідної нагруги." + +#: knutclient.cpp:870 knutclient.cpp:871 +msgid "Trimming of UPS is ended." +msgstr "Підстройка вхідної напруги закінчено." + +#: knutclient.cpp:887 knutclient.cpp:954 knutclient.cpp:963 +msgid "Switched" +msgstr "Переключити" + +#: knutclient.cpp:1103 knutdock.cpp:640 knutmainwindow.cpp:781 +msgid "Reconnect" +msgstr "" + +#: knutdock.cpp:419 knutdock.cpp:469 knutfrontpanel.cpp:192 +#: knutnewupsdlg.cpp:69 knutprintupsvar.cpp:78 +msgid "Name" +msgstr "Ім'я" + +#: knutdock.cpp:420 knutnewupsdlg.cpp:83 +msgid "UPS name" +msgstr "UPS ім'я" + +#: knutdock.cpp:421 knutnewupsdlg.cpp:77 +msgid "UPS address" +msgstr "UPS адреса" + +#: knutdock.cpp:422 knutdock.cpp:443 knutdock.cpp:446 knutdock.cpp:449 +#: knutdock.cpp:452 knutdock.cpp:455 knutdock.cpp:458 +msgid "Status : " +msgstr "Статус : " + +#: knutdock.cpp:425 knutvardata.cpp:209 +msgid "Connection doesn't exist." +msgstr "Зв'язок но встановлено." + +#: knutdock.cpp:429 knutfrontpanel.cpp:80 +msgid "UPS On line" +msgstr "UPS на лінії" + +#: knutdock.cpp:433 knutfrontpanel.cpp:95 +msgid "UPS On battery" +msgstr "UPS на батареї" + +#: knutdock.cpp:437 +msgid "UPS Of line" +msgstr "UPS на лінії" + +#: knutdock.cpp:443 +msgid "UPS Battery is low" +msgstr "UPS батарея розряжена" + +#: knutdock.cpp:446 knutfrontpanel.cpp:138 +msgid "Replace battery" +msgstr "Замінити батарею" + +#: knutdock.cpp:452 +msgid "UPS is Overload" +msgstr "UPS Переватаження" + +#: knutdock.cpp:455 +msgid "UPS is trimming voltage" +msgstr "UPS підстройка напруги" + +#: knutdock.cpp:458 +msgid "UPS is boosting voltage" +msgstr "UPS підняття напруги" + +#: knutdock.cpp:464 +msgid "Error : " +msgstr "Помилка : " + +#: knutdock.cpp:467 knutfrontpanel.cpp:182 +msgid "Manufac. : " +msgstr "Виробник : " + +#: knutdock.cpp:471 +msgid "Serial" +msgstr "Порт" + +#: knutdock.cpp:473 +msgid "Firmware" +msgstr "Firmware" + +#: knutdock.cpp:477 knutfrontpanel.cpp:233 +msgid "Runtime" +msgstr "Час роботи" + +#: knutdock.cpp:477 +msgid " : %1:%2 min" +msgstr " : %1:%2 мін" + +#: knutdock.cpp:482 knutvardata.cpp:45 +msgid "Battery Charge" +msgstr "Зарядка батареї" + +#: knutdock.cpp:487 knutvardata.cpp:48 +msgid "UPS Load" +msgstr "UPS Завантаження" + +#: knutdock.cpp:513 knutmainwindow.cpp:663 +msgid "Are you sure ?" +msgstr "Ви впевнені?" + +#: knutdock.cpp:636 knutmainwindow.cpp:748 +msgid "&Showing UPS variables and commands" +msgstr "Показа&ти UPS змінні та кОПанди" + +#: knutdock.cpp:637 knutmainwindow.cpp:749 +msgid "&Running instant commands" +msgstr "Запуск прями&х кОПанд" + +#: knutdock.cpp:638 knutmainwindow.cpp:750 +msgid "Setting R&W variables" +msgstr "Установка змін&них RW" + +#: knutdock.cpp:642 +msgid "&Preferences" +msgstr "Перева&ги" + +#: knutdock.cpp:644 +msgid "&About KNutClient" +msgstr "П&ро KNutClient" + +#: knutdock.cpp:646 +msgid "&Minimize" +msgstr "&Мінімізація" + +#: knutdock.cpp:648 +msgid "&Exit" +msgstr "Вихі&Đ´" + +#: knutfrontpanel.cpp:110 +msgid "UPS Overload" +msgstr "UPS Переватаження" + +#: knutfrontpanel.cpp:124 +msgid "UPS Battery low" +msgstr "UPS Батарея розряжена" + +#: knutfrontpanel.cpp:152 +msgid "UPS calibration" +msgstr "UPS калібровка" + +#: knutfrontpanel.cpp:202 +msgid "Serial : " +msgstr "Serial : " + +#: knutfrontpanel.cpp:212 +msgid "Firm. rev. : " +msgstr "Firm. rev. : " + +#: knutinstcomms.cpp:33 +msgid "Instant commands" +msgstr "Прямі кОПанди" + +#: knutinstcomms.cpp:45 +msgid "RUN INSTANT COMMAND" +msgstr "ВИКОНАТИ ПРЯМУ КОМАНДУ" + +#: knutinstcomms.cpp:49 +msgid "Command:" +msgstr "Команда:" + +#: knutinstcomms.cpp:53 knutnewupsdlg.cpp:102 knutrwvar.cpp:70 +msgid "User name:" +msgstr "Ім'я користувача:" + +#: knutinstcomms.cpp:54 knutnewupsdlg.cpp:109 knutrwvar.cpp:71 +msgid "Password:" +msgstr "Пароль:" + +#: knutmainwindow.cpp:59 +msgid "test of conection from 5" +msgstr "" + +#: knutmainwindow.cpp:745 +msgid "Quits the application" +msgstr "Вийти С програми" + +#: knutmainwindow.cpp:778 +msgid "&Using descriptions" +msgstr "Вико&ристовую описання" + +#: knutnewupsdlg.cpp:39 +msgid "New Ups" +msgstr "Новий UPS" + +#: knutnewupsdlg.cpp:89 +msgid "Delay (ms):" +msgstr "Затримка (Пс):" + +#: knutnewupsdlg.cpp:96 +msgid "Port:" +msgstr "Порт:" + +#: knutnewupsdlg.cpp:116 +msgid "Store NUT password in configuration file" +msgstr "Зберігати NUT пароль в конфігураційному файлі" + +#: knutnewupsdlg.cpp:123 +msgid "Availabled UPS values" +msgstr "" + +#: knutnewupsdlg.cpp:124 +msgid "Selected UPS values" +msgstr "" + +#: knutnewupsdlg.cpp:134 +msgid "UPS Variables" +msgstr "UPS змінні" + +#: knutnewupsdlg.cpp:255 +msgid "No Name or UPS address" +msgstr "Відсутнє Ім'я айО UPS адреса" + +#: knutnewupsdlg.cpp:263 +msgid "This Name exist" +msgstr "Тако Ім'я вМо існує" + +#: knutnewupsdlg.cpp:270 +msgid "Delay must be number" +msgstr "Затримка пОвинна бути числовою" + +#: knutnewupsdlg.cpp:276 +msgid "Port must be number" +msgstr "Порт пОвинон бути числовим" + +#: knutnewupsdlg.cpp:281 +msgid "Port must be from 1025 until 65535" +msgstr "Порт пОвинон бути в діапазоні 1025 - 65535" + +#: knutnewupsdlg.cpp:286 +msgid "Delay is too small" +msgstr "Затримка дуМо ПаНа" + +#: knutprefdlg.cpp:45 +msgid "Preferences" +msgstr "Переваги" + +#: knutprefdlg.cpp:508 +msgid "Setting" +msgstr "Налаштування" + +#: knutprefdlg.cpp:508 +msgid "Main Setting" +msgstr "Основні налаштування" + +#: knutprefdlg.cpp:516 +msgid "Voltage/Frequency" +msgstr "Напруга/Частота" + +#: knutprefdlg.cpp:519 +msgid "&Use High-Low XFER" +msgstr "&Використовувати Високий Низький XFER" + +#: knutprefdlg.cpp:521 +msgid "Number of columns :" +msgstr "Кількість стовбчиків :" + +#: knutprefdlg.cpp:524 knutprefdlg.cpp:815 knutprefdlg.cpp:894 +msgid "Use custom background color" +msgstr "Використовувати вкаСаниК колір фону" + +#: knutprefdlg.cpp:528 knutprefdlg.cpp:818 knutprefdlg.cpp:896 +msgid "Color of background :" +msgstr "Колір фону :" + +#: knutprefdlg.cpp:532 +#, fuzzy +msgid "Use dialog \"Are you sure\"" +msgstr "Використовувати діалог \"Ви впевнені\" :" + +#: knutprefdlg.cpp:535 +#, fuzzy +msgid "Use Main window when program is started" +msgstr "Використовувати гОНОвно вікно при старті :" + +#: knutprefdlg.cpp:538 +#, fuzzy +msgid "Show message window, when program reports error" +msgstr "Використовувати гОНОвно вікно при старті :" + +#: knutprefdlg.cpp:543 +msgid "Auto" +msgstr "" + +#: knutprefdlg.cpp:547 +msgid "Nominal Input Voltage" +msgstr "Номінальна Вхідна Напруга" + +#: knutprefdlg.cpp:550 +msgid "&230 V" +msgstr "&230 В" + +#: knutprefdlg.cpp:551 +msgid "&120 V" +msgstr "&120 В" + +#: knutprefdlg.cpp:553 +msgid "Nominal Input Frequency" +msgstr "Номінальна Вхідна Частота" + +#: knutprefdlg.cpp:556 +msgid "&50 Hz" +msgstr "&50 Гц" + +#: knutprefdlg.cpp:557 +msgid "&60 Hz" +msgstr "&60 Гц" + +#: knutprefdlg.cpp:628 +msgid "UPS" +msgstr "UPS" + +#: knutprefdlg.cpp:628 +msgid "UPS Setting" +msgstr "UPS Налаштування" + +#: knutprefdlg.cpp:646 +msgid "&Add" +msgstr "&Додати" + +#: knutprefdlg.cpp:667 +#, fuzzy +msgid "Dock bar" +msgstr "Dock" + +#: knutprefdlg.cpp:667 +msgid "Docking Setting" +msgstr "Dock налаштування" + +#: knutprefdlg.cpp:671 +msgid "Type of dock's showing" +msgstr "Тип показаних dock's" + +#: knutprefdlg.cpp:676 +msgid "Items of tooltip" +msgstr "Пункти підсказки" + +#: knutprefdlg.cpp:684 +msgid "&Picture" +msgstr "&Картина" + +#: knutprefdlg.cpp:685 +msgid "&General" +msgstr "&Основний" + +#: knutprefdlg.cpp:688 knutprefdlg.cpp:799 +msgid "M&anufacturer" +msgstr "Ви&робник" + +#: knutprefdlg.cpp:691 knutprefdlg.cpp:802 +msgid "M&odel" +msgstr "&Модель" + +#: knutprefdlg.cpp:694 knutprefdlg.cpp:805 +msgid "&Serial" +msgstr "Пор&т" + +#: knutprefdlg.cpp:697 knutprefdlg.cpp:808 +msgid "&Firm. rev." +msgstr "&Firm. rev." + +#: knutprefdlg.cpp:700 knutprefdlg.cpp:811 +msgid "&Runtime" +msgstr "&Час роботи" + +#: knutprefdlg.cpp:703 +msgid "&Battery Charge" +msgstr "З&арядка батареї" + +#: knutprefdlg.cpp:706 +msgid "&UPS Load" +msgstr "UPS &Завантаження" + +#: knutprefdlg.cpp:710 +msgid "Use custom icon's background color" +msgstr "Використовувати вкаСаниК колір фону для іконок" + +#: knutprefdlg.cpp:713 +msgid "Color of icon's background :" +msgstr "Колір фону для іконок :" + +#: knutprefdlg.cpp:769 +msgid "Panel" +msgstr "Панель" + +#: knutprefdlg.cpp:769 +msgid "Panel Setting" +msgstr "Налаштування панелі" + +#: knutprefdlg.cpp:784 +msgid "UPS &Overload" +msgstr "UPS &Перевантаження" + +#: knutprefdlg.cpp:787 +msgid "UPS &Battery low" +msgstr "UPS &Батарея розряжена" + +#: knutprefdlg.cpp:790 +msgid "R&eplace battery" +msgstr "&Замінити батарею" + +#: knutprefdlg.cpp:793 +msgid "Ups &calibration" +msgstr "UPS &Калібровка" + +#: knutprefdlg.cpp:796 +msgid "&Manufac. + Model" +msgstr "В&иробник + Модель" + +#: knutprefdlg.cpp:851 +msgid "Setting Fonts" +msgstr "Налаштування шрифтів" + +#: knutprefdlg.cpp:858 +msgid "&Use custom font" +msgstr "В&икористовувати вкаСаниК шрифт" + +#: knutprefdlg.cpp:863 +msgid "Main panel" +msgstr "Основна панель" + +#: knutprefdlg.cpp:864 +msgid "Analog panels" +msgstr "АнаНОгОва панель" + +#: knutprefdlg.cpp:887 +msgid "Analog" +msgstr "АнаНОг" + +#: knutprefdlg.cpp:887 +msgid "Setting Analog panel" +msgstr "Налаштування аналогової панелі" + +#: knutprefdlg.cpp:898 +msgid "Use custom other colors" +msgstr "Використовувати вказані кольори" + +#: knutprefdlg.cpp:900 +msgid "Color of pointer :" +msgstr "Колір крапки :" + +#: knutprefdlg.cpp:902 +msgid "Color of OK range :" +msgstr "Колір області OK :" + +#: knutprefdlg.cpp:904 +msgid "Color of warning range :" +msgstr "Колір області попередження :" + +#: knutprefdlg.cpp:906 +msgid "Color of error range :" +msgstr "Колір області Помилка:" + +#: knutprefdlg.cpp:908 +msgid "Color of scale :" +msgstr "Колір масштабу :" + +#: knutprefdlg.cpp:910 +msgid "Color of font :" +msgstr "Колір шрифту :" + +#: knutprefdlg.cpp:913 +#, fuzzy +msgid "Digital processing of pointers :" +msgstr "Колір крапки :" + +#: knutprefdlg.cpp:964 +msgid "Nothing processing" +msgstr "" + +#: knutprefdlg.cpp:965 +msgid "Fast antialiasing" +msgstr "" + +#: knutprefdlg.cpp:966 +msgid "Fine antialiasing" +msgstr "" + +#: knutprefdlg.cpp:967 +msgid "Fast antialiasing and blur motion" +msgstr "" + +#: knutprefdlg.cpp:968 +msgid "Fine antialiasing and blur motion" +msgstr "" + +#: knutprintupsvar.cpp:41 +msgid "Variables" +msgstr "Змінні" + +#: knutprintupsvar.cpp:50 +msgid "Reload Vars" +msgstr "Перечитати змінні" + +#: knutprintupsvar.cpp:52 +msgid "UPS variables" +msgstr "UPS змінні" + +#: knutprintupsvar.cpp:79 +msgid "Value" +msgstr "Значенння" + +#: knutprintupsvar.cpp:81 +msgid "Description" +msgstr "Описанння" + +#: knutprintupsvar.cpp:90 +msgid "Instant Commands" +msgstr "Прямі кОПанди" + +#: knutprintupsvar.cpp:103 +msgid "Read/Write Variables" +msgstr "Змінні R/W" + +#: knutprintupsvar.cpp:121 +msgid "Read Only Variables" +msgstr "Змінні R/O" + +#: knutrwvar.cpp:40 +msgid "RW variables" +msgstr "RW змінні" + +#: knutrwvar.cpp:56 +msgid "SET RW VARIABLE" +msgstr "УСТАНОВКА ЗМІННИХ RW" + +#: knutrwvar.cpp:61 +msgid "Variable:" +msgstr "Змінна:" + +#: knutrwvar.cpp:64 +msgid "Value:" +msgstr "Значення:" + +#: knutvardata.cpp:43 +msgid "None" +msgstr "Ні" + +#: knutvardata.cpp:44 +msgid "Input Voltage" +msgstr "Вхідна напруга" + +#: knutvardata.cpp:46 +msgid "UPS Temperature" +msgstr "UPS Температура" + +#: knutvardata.cpp:47 +msgid "Input Frequency" +msgstr "Вхідная частота" + +#: knutvardata.cpp:49 +msgid "Outside Temperature" +msgstr "Навколишня температура" + +#: knutvardata.cpp:50 +msgid "Outside Humidity" +msgstr "Навколишня вологість" + +#: knutvardata.cpp:51 +msgid "Battery Voltage" +msgstr "Напруга батареї" + +#: knutvardata.cpp:52 +msgid "Output Voltage" +msgstr "Вихідна напруга" + +#: knutvardata.cpp:53 +msgid "Output Current" +msgstr "Вихідне поточне" + +#: knutvardata.cpp:54 +#, fuzzy +msgid "Output Frequency" +msgstr "Вхідная частота" + +#: knutvardata.cpp:55 +msgid "Battery Temperature" +msgstr "Температура батареї" + +#: knutvardata.cpp:56 +msgid "Battery Current" +msgstr "Батарея поточна" + +#: knutvardata.cpp:186 +#, fuzzy +msgid "No memory." +msgstr "Недостатньо паП'яті." + +#: knutvardata.cpp:187 +msgid "No address." +msgstr "Адрес відсутній." + +#: knutvardata.cpp:188 +msgid "Unknown address." +msgstr "Невідомий адрес." + +#: knutvardata.cpp:191 +msgid "Error of connection." +msgstr "" + +#: knutvardata.cpp:194 +#, fuzzy +msgid "No connection with server." +msgstr "Зв'язок із сервером відсутній." + +#: knutvardata.cpp:196 +msgid "Server-client protocol or variables of NUT are unknown." +msgstr "Сервер-клієнт протокол айО змінні для NUT невідомі." + +#: knutvardata.cpp:197 +msgid "No UPS on this address." +msgstr "UPS відсутній на данОПу адресі." + +#: knutvardata.cpp:198 +#, fuzzy +msgid "Connection was refused by server." +msgstr "Зв'язок із сервером відсутній." + +#: knutvardata.cpp:200 +msgid "Server doesn't receive data." +msgstr "Сервер но приймає данні." + +#: knutvardata.cpp:201 +msgid "Server doesn't send data." +msgstr "Сервер но пересилає дані." + +#: knutvardata.cpp:202 +msgid "Server doesn't answer." +msgstr "Сервер но відповідає." + +#: knutvardata.cpp:204 +msgid "Server returns data with unknown format." +msgstr "Сервер повертає данні в невідомому форматі." + +#: knutvardata.cpp:205 +msgid "Server returns unknown data." +msgstr "Сервер повертає невідомі данні." + +#: knutvardata.cpp:206 +msgid "Command VER returns data with unknown format." +msgstr "Команда VER повертає данні в невідомому форматі." + +#: knutvardata.cpp:208 +msgid "No data." +msgstr "Дані відсутні." + +#: knutvardata.cpp:212 +msgid "Access denied. Failed password ?" +msgstr "Доступ заборонено. Невірний пароль ?" + +#: knutvardata.cpp:213 +msgid "UPS doesn't sent data to server (Data Stale)." +msgstr "UPS но пересилає дані на сервер (Дані застарілі)." + +#: knutvardata.cpp:214 +msgid "Server doesn't know this command." +msgstr "Сервер но знає кОПанду." + +#: knutvardata.cpp:217 +msgid "UPS's driver isn't connected." +msgstr "UPS но ПОМу приєднатися Đ´Đž драйверу." + +#: knutvardata.cpp:219 +msgid "Server required password." +msgstr "Сервер потребує пароль." + +#: knutvardata.cpp:220 +msgid "Incorrect password." +msgstr "Невірний пароль." + +#: knutvardata.cpp:221 +msgid "UPS doesn't response." +msgstr "UPS но відповідає." + +#: knutvardata.cpp:222 +msgid "Command failed." +msgstr "Невірна кОПанда." + +#: knutvardata.cpp:223 +msgid "UPS doesn't know this instant command." +msgstr "UPS но знає таку кОПанду." + +#: knutvardata.cpp:224 +msgid "UPS doesn't support this instant command." +msgstr "UPS но підтримує кОПанду." + +#: knutvardata.cpp:225 +msgid "UPS doesn't known this variable." +msgstr "UPS но знає таку змінну." + +#: knutvardata.cpp:226 +msgid "UPS doesn't support this variable." +msgstr "UPS но підтримує змінну." + +#: knutvardata.cpp:227 +msgid "UPS doesn't support this value in this variable." +msgstr "UPS но підтримує таке значення для даної змінної." + +#: knutvardata.cpp:228 +msgid "Name of UPS is unknown." +msgstr "Ім'я UPS невідоме." + +#: knutvardata.cpp:230 +msgid "Username has been already entered." +msgstr "" + +#: knutvardata.cpp:231 +msgid "Password has been already entered." +msgstr "" + +#: knutvardata.cpp:233 +#, fuzzy +msgid "Server doesn't send list of variables." +msgstr "Сервер но пересилає дані." + +#: knutvardata.cpp:236 +msgid "Unknown error." +msgstr "Невідома пОПиНка." + +#: main.cpp:31 +msgid "Client for Network UPS Tool" +msgstr "Клієнт для Network UPS Tool" + +#: main.cpp:37 +msgid "Don't dock in Kicker" +msgstr "Відсутній dock при ударі" + +#: main.cpp:47 +msgid "KNutClient" +msgstr "KNutClient" + +#. i18n: file ./knutclientui.rc line 13 +#: rc.cpp:9 +#, no-c-format +msgid "&Connection" +msgstr "" + +#~ msgid "Toggle the toolbar..." +#~ msgstr "Перемикач toolbar..." + +#~ msgid "Toggle the statusbar..." +#~ msgstr "Перемикач статусної стрічки..." + +#~ msgid "Protocol" +#~ msgstr "Протокол" + +#~ msgid "UDP" +#~ msgstr "UDP" + +#~ msgid "TCP" +#~ msgstr "TCP" + +#, fuzzy +#~ msgid "&Settings" +#~ msgstr "Налаштування" + +#~ msgid "KNutRWVar" +#~ msgstr "KNutRWVar" + +#~ msgid "KNutNet" +#~ msgstr "KNutNet" + +#~ msgid "KNutFrontPanel" +#~ msgstr "KNutFrontPanel" + +#~ msgid "KNutMainWindow" +#~ msgstr "KNutMainWindow" + +#~ msgid "KAnalog" +#~ msgstr "KAnalog" + +#~ msgid "KNutNewUpsDlg" +#~ msgstr "KNutNewUpsDlg" + +#~ msgid "KNutPrefDlg" +#~ msgstr "KNutPrefDlg" + +#~ msgid "KNutPrintUpsVar" +#~ msgstr "KNutPrintUpsVar" + +#, fuzzy +#~ msgid "Unknown Error" +#~ msgstr "Невідома пОПиНка." + +#, fuzzy +#~ msgid "UPS is performing calibration." +#~ msgstr "UPS калібровка" + +#~ msgid "Showing UPS variables and commands" +#~ msgstr "Показати UPS змінні та кОПанди" + +#~ msgid "Running instant commands" +#~ msgstr "Запуск прямих кОПанд" + +#~ msgid "Setting RW variables" +#~ msgstr "Установка змінних RW" + +#~ msgid "Name : " +#~ msgstr "Ім'я : " + +#~ msgid "Runtime : " +#~ msgstr "Час работи : " + +#~ msgid "Name:" +#~ msgstr "Ім'я:" diff --git a/specs/Makefile.am b/specs/Makefile.am new file mode 100644 index 0000000..ec594c1 --- /dev/null +++ b/specs/Makefile.am @@ -0,0 +1,6 @@ + +METASOURCES = AUTO +kncdatadir = specs +noinst_HEADERS = knutclient.spec.fedora.10 knutclient.spec.fedora.5 \ + knutclient.spec.fedora.8 knutclient.spec.fedora.9 knutclient.spec.mandrake.10.1 \ + knutclient.spec.mandriva.2006 knutclient.spec.mandriva.2009 diff --git a/specs/knutclient.spec.fedora.10 b/specs/knutclient.spec.fedora.10 new file mode 100644 index 0000000..f5b8f47 --- /dev/null +++ b/specs/knutclient.spec.fedora.10 @@ -0,0 +1,58 @@ +Summary: NUT GUI Interface +Name: knutclient +Version: 0.9.5 +Release: 1 +License: GPL +Vendor: Daniel Prynych +Url: http://www.knut.noveradsl.cz/knutclient +Packager: Daniel Prynych +Group: Applications/System +Prefix: /usr +Source: knutclient-0.9.5.tar.gz +BuildRoot: %{_tmppath}/build-root-%{name} + +%description +Knutclient is a GUI interface for UPS system NUT + +%prep +%setup +make -f Makefile.cvs +CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{prefix} $LOCALFLAGS + +%build +# Setup for parallel builds +numprocs=`egrep -c ^cpu[0-9]+ /proc/stat || :` +if [ "$numprocs" = "0" ]; then + numprocs=1 +fi + +make -j$numprocs + +%install +export QA_RPATHS=$[ 0x0001|0x0010 ] +make install-strip DESTDIR=$RPM_BUILD_ROOT + +cd $RPM_BUILD_ROOT + +#mkdir -p usr/share/applications/ +#cp -a usr/share/applnk/Applications/knutclient.desktop usr/share/applications/ +#rm -rf usr/share/applnk + +# as defattr point to root,root this will not work +#chown desktop.desktop kde-knutclient.desktop + +cd $RPM_BUILD_ROOT + +find . -type d | sed '1,2d;s,^\.,\%attr(-\,root\,root) \%dir ,' > $RPM_BUILD_DIR/file.list.%{name} +find . -type f | sed 's,^\.,\%attr(-\,root\,root) ,' >> $RPM_BUILD_DIR/file.list.%{name} +find . -type l | sed 's,^\.,\%attr(-\,root\,root) ,' >> $RPM_BUILD_DIR/file.list.%{name} + +%clean +rm -rf $RPM_BUILD_ROOT/* +rm -rf $RPM_BUILD_DIR/%{name} +rm -rf ../file.list.%{name} + + +%files -f ../file.list.%{name} +%defattr(-,root,root,0755) + diff --git a/specs/knutclient.spec.fedora.5 b/specs/knutclient.spec.fedora.5 new file mode 100644 index 0000000..35a89e9 --- /dev/null +++ b/specs/knutclient.spec.fedora.5 @@ -0,0 +1,56 @@ +Summary: NUT GUI Interface +Name: knutclient +Version: 0.9.5 +Release: 1 +License: GPL +Vendor: Daniel Prynych +Url: http://www.knut.noveradsl.cz/knutclient +Packager: Daniel Prynych +Group: Applications/System +Prefix: /usr +Source: knutclient-0.9.5.tar.gz +BuildRoot: %{_tmppath}/build-root-%{name} + +%description +Knutclient is a GUI interface for UPS system NUT + +%prep +%setup +CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{prefix} $LOCALFLAGS + +%build +# Setup for parallel builds +numprocs=`egrep -c ^cpu[0-9]+ /proc/stat || :` +if [ "$numprocs" = "0" ]; then + numprocs=1 +fi + +make -j$numprocs + +%install +make install-strip DESTDIR=$RPM_BUILD_ROOT + +cd $RPM_BUILD_ROOT + +#mkdir -p usr/share/applications/ +#cp -a usr/share/applnk/Applications/knutclient.desktop usr/share/applications/ +#rm -rf usr/share/applnk + +# as defattr point to root,root this will not work +#chown desktop.desktop kde-knutclient.desktop + +cd $RPM_BUILD_ROOT + +find . -type d | sed '1,2d;s,^\.,\%attr(-\,root\,root) \%dir ,' > $RPM_BUILD_DIR/file.list.%{name} +find . -type f | sed 's,^\.,\%attr(-\,root\,root) ,' >> $RPM_BUILD_DIR/file.list.%{name} +find . -type l | sed 's,^\.,\%attr(-\,root\,root) ,' >> $RPM_BUILD_DIR/file.list.%{name} + +%clean +rm -rf $RPM_BUILD_ROOT/* +rm -rf $RPM_BUILD_DIR/%{name} +rm -rf ../file.list.%{name} + + +%files -f ../file.list.%{name} +%defattr(-,root,root,0755) + diff --git a/specs/knutclient.spec.fedora.8 b/specs/knutclient.spec.fedora.8 new file mode 100644 index 0000000..9603e05 --- /dev/null +++ b/specs/knutclient.spec.fedora.8 @@ -0,0 +1,60 @@ +Summary: NUT GUI Interface +Name: knutclient +Version: 0.9.5 +Release: 1 +License: GNU GPL +Vendor: Daniel Prynych +Url: http://www.knut.noveradsl.cz/knutclient +Packager: Daniel Prynych +Group: Applications/System +Prefix: /usr +Source: knutclient-0.9.5.tar.gz +BuildRoot: %{_tmppath}/build-root-%{name} + +%description +Knutclient is a GUI interface for UPS system NUT + +%prep +%setup +make -f Makefile.cvs +CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{prefix} $LOCALFLAGS + +%build +# Setup for parallel builds +numprocs=`egrep -c ^cpu[0-9]+ /proc/stat || :` +if [ "$numprocs" = "0" ]; then + numprocs=1 +fi + +make -j$numprocs + +%install +make install-strip DESTDIR=$RPM_BUILD_ROOT + +cd $RPM_BUILD_ROOT + +#mkdir -p var/lib/menu/kde/Applications/Extras/Accessories/ +#mkdir -p usr/share/applications/ +#cp -a usr/share/applnk/Utilities/knutclient.desktop usr/share/applications/ +#rm -rf usr/share/applnk + +#cd var/lib/menu/kde/Applications/Extras/Accessories/ +#ln -s /usr/share/applications/knutclient.desktop kde-knutclient.desktop +# as defattr point to root,root this will not work +#chown desktop.desktop kde-knutclient.desktop + +cd $RPM_BUILD_ROOT + +find . -type d | sed '1,2d;s,^\.,\%attr(-\,root\,root) \%dir ,' > $RPM_BUILD_DIR/file.list.%{name} +find . -type f | sed 's,^\.,\%attr(-\,root\,root) ,' >> $RPM_BUILD_DIR/file.list.%{name} +find . -type l | sed 's,^\.,\%attr(-\,root\,root) ,' >> $RPM_BUILD_DIR/file.list.%{name} + +%clean +rm -rf $RPM_BUILD_ROOT/* +rm -rf $RPM_BUILD_DIR/%{name} +rm -rf ../file.list.%{name} + + +%files -f ../file.list.%{name} +%defattr(-,root,root,0755) + diff --git a/specs/knutclient.spec.fedora.9 b/specs/knutclient.spec.fedora.9 new file mode 100644 index 0000000..9603e05 --- /dev/null +++ b/specs/knutclient.spec.fedora.9 @@ -0,0 +1,60 @@ +Summary: NUT GUI Interface +Name: knutclient +Version: 0.9.5 +Release: 1 +License: GNU GPL +Vendor: Daniel Prynych +Url: http://www.knut.noveradsl.cz/knutclient +Packager: Daniel Prynych +Group: Applications/System +Prefix: /usr +Source: knutclient-0.9.5.tar.gz +BuildRoot: %{_tmppath}/build-root-%{name} + +%description +Knutclient is a GUI interface for UPS system NUT + +%prep +%setup +make -f Makefile.cvs +CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{prefix} $LOCALFLAGS + +%build +# Setup for parallel builds +numprocs=`egrep -c ^cpu[0-9]+ /proc/stat || :` +if [ "$numprocs" = "0" ]; then + numprocs=1 +fi + +make -j$numprocs + +%install +make install-strip DESTDIR=$RPM_BUILD_ROOT + +cd $RPM_BUILD_ROOT + +#mkdir -p var/lib/menu/kde/Applications/Extras/Accessories/ +#mkdir -p usr/share/applications/ +#cp -a usr/share/applnk/Utilities/knutclient.desktop usr/share/applications/ +#rm -rf usr/share/applnk + +#cd var/lib/menu/kde/Applications/Extras/Accessories/ +#ln -s /usr/share/applications/knutclient.desktop kde-knutclient.desktop +# as defattr point to root,root this will not work +#chown desktop.desktop kde-knutclient.desktop + +cd $RPM_BUILD_ROOT + +find . -type d | sed '1,2d;s,^\.,\%attr(-\,root\,root) \%dir ,' > $RPM_BUILD_DIR/file.list.%{name} +find . -type f | sed 's,^\.,\%attr(-\,root\,root) ,' >> $RPM_BUILD_DIR/file.list.%{name} +find . -type l | sed 's,^\.,\%attr(-\,root\,root) ,' >> $RPM_BUILD_DIR/file.list.%{name} + +%clean +rm -rf $RPM_BUILD_ROOT/* +rm -rf $RPM_BUILD_DIR/%{name} +rm -rf ../file.list.%{name} + + +%files -f ../file.list.%{name} +%defattr(-,root,root,0755) + diff --git a/specs/knutclient.spec.mandrake.10.1 b/specs/knutclient.spec.mandrake.10.1 new file mode 100644 index 0000000..804dd3d --- /dev/null +++ b/specs/knutclient.spec.mandrake.10.1 @@ -0,0 +1,100 @@ +Summary: NUT GUI Interface +Name: knutclient +Version: 0.9.5 +Release: 1 +License: GPL +Url: http://www.alo.cz/knutclient +Group: Monitoring +Source0: ftp://ftp.buzuluk.cz/pub/alo/knutclient/stable/%{name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot + +%description +Knutclient is a GUI interface for UPS system NUT + +%prep +%setup +sh admin/cvs.sh cvs + +%build +CFLAGS="$RPM_OPT_FLAGS" \ +CXXFLAGS="$RPM_OPT_FLAGS" \ +./configure --prefix=%{_prefix} \ + --libdir=%{_libdir} \ + --enable-mt \ + --disable-rpath +%make + +%install +make install-strip DESTDIR=%buildroot +install -d %buildroot/%_menudir +cat > %buildroot/%_menudir/%{name} < 0.7.4-1mdk +- New release + +* Mon Nov 10 2003 Arnaud de Lorbeau 0.7.3-3mdk +- Correction changelog + +* Mon Nov 10 2003 Arnaud de Lorbeau 0.7.3-2mdk +- Correction Buildrequires + +* Fri Nov 07 2003 Thierry Vignaud 0.7.3-1mdk +- new release + +* Fri Jul 25 2003 Arnaud de Lorbeau 0.6.3-1mdk +- New release + +* Fri Jul 18 2003 Laurent MONTEL 0.6.0-3mdk +- Rebuild + +* Wed Apr 30 2003 Lenny Cartier 0.6.0-2mdk +- buildrequires + +* Wed Jan 08 2003 Lenny Cartier 0.6.0-1mdk +- 0.6.0 + +* Tue Aug 27 2002 Arnaud de Lorbeau 0.5.0-2mdk +- New release + +* Mon Aug 19 2002 Laurent Culioli 0.4.1-4mdk +- rebuild with gcc3.2 + +* Sat Jul 27 2002 Arnaud de Lorbeau 0.4.1-3mdk +- Mandrake adaptions +- Creation of patch for qt3 detection in configure +- Creation of french po file diff --git a/specs/knutclient.spec.mandriva.2006 b/specs/knutclient.spec.mandriva.2006 new file mode 100644 index 0000000..50a922b --- /dev/null +++ b/specs/knutclient.spec.mandriva.2006 @@ -0,0 +1,111 @@ +Summary: NUT GUI Interface +Name: knutclient +Version: 0.9.5 +Release: 1 +License: GPL +Url: http://www.knut.noveradsl.cz/knutclient +Group: Monitoring +Source0: ftp://ftp.buzuluk.cz/pub/alo/knutclient/stable/%{name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot + +%description +Knutclient is a GUI interface for UPS system NUT + +%prep +%setup +sh admin/cvs.sh cvs + +%build +CFLAGS="$RPM_OPT_FLAGS" \ +CXXFLAGS="$RPM_OPT_FLAGS" \ +kde_htmldir=/usr/share/doc/HTML \ +./configure --prefix=%{_prefix} \ + --libdir=%{_libdir} \ + --enable-mt \ + --disable-rpath +%make + +%install +make install-strip DESTDIR=%buildroot +install -d %buildroot/%_menudir +cat > %buildroot/%_menudir/%{name} < 0.7.4-1mdk +- New release + +* Mon Nov 10 2003 Arnaud de Lorbeau 0.7.3-3mdk +- Correction changelog + +* Mon Nov 10 2003 Arnaud de Lorbeau 0.7.3-2mdk +- Correction Buildrequires + +* Fri Nov 07 2003 Thierry Vignaud 0.7.3-1mdk +- new release + +* Fri Jul 25 2003 Arnaud de Lorbeau 0.6.3-1mdk +- New release + +* Fri Jul 18 2003 Laurent MONTEL 0.6.0-3mdk +- Rebuild + +* Wed Apr 30 2003 Lenny Cartier 0.6.0-2mdk +- buildrequires + +* Wed Jan 08 2003 Lenny Cartier 0.6.0-1mdk +- 0.6.0 + +* Tue Aug 27 2002 Arnaud de Lorbeau 0.5.0-2mdk +- New release + +* Mon Aug 19 2002 Laurent Culioli 0.4.1-4mdk +- rebuild with gcc3.2 + +* Sat Jul 27 2002 Arnaud de Lorbeau 0.4.1-3mdk +- Mandrake adaptions +- Creation of patch for qt3 detection in configure +- Creation of french po file diff --git a/specs/knutclient.spec.mandriva.2009 b/specs/knutclient.spec.mandriva.2009 new file mode 100755 index 0000000..ef26a1e --- /dev/null +++ b/specs/knutclient.spec.mandriva.2009 @@ -0,0 +1,124 @@ +Summary: NUT GUI Interface +Name: knutclient +Version: 0.9.5 +Release: 1 +License: GPL +Url: http://www.knut.noveradsl.cz/knutclient +Group: Monitoring +Source0: ftp://ftp.buzuluk.cz/pub/alo/knutclient/stable/%{name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot + +%description +Knutclient is a GUI interface for UPS system NUT + +%prep +%setup +sh admin/cvs.sh cvs + +%build +CFLAGS="$RPM_OPT_FLAGS" \ +CXXFLAGS="$RPM_OPT_FLAGS" \ +export kde_htmldir=/opt/kde3/share/doc/HTML \ +export KDEDIRS=/usr:/opt/kde3 +./configure --prefix=/opt/kde3 \ + --libdir=%{_libdir} \ + --enable-mt \ + --disable-rpath +%make + + +%install + +make install-strip DESTDIR=%buildroot +install -d %buildroot/%_menudir +cat > %buildroot/%_menudir/%{name} < 0.9.5-1 +- changed part files + +* Fri Dec 19 2003 Arnaud de Lorbeau 0.7.4-1mdk +- New release + +* Mon Nov 10 2003 Arnaud de Lorbeau 0.7.3-3mdk +- Correction changelog + +* Mon Nov 10 2003 Arnaud de Lorbeau 0.7.3-2mdk +- Correction Buildrequires + +* Fri Nov 07 2003 Thierry Vignaud 0.7.3-1mdk +- new release + +* Fri Jul 25 2003 Arnaud de Lorbeau 0.6.3-1mdk +- New release + +* Fri Jul 18 2003 Laurent MONTEL 0.6.0-3mdk +- Rebuild + +* Wed Apr 30 2003 Lenny Cartier 0.6.0-2mdk +- buildrequires + +* Wed Jan 08 2003 Lenny Cartier 0.6.0-1mdk +- 0.6.0 + +* Tue Aug 27 2002 Arnaud de Lorbeau 0.5.0-2mdk +- New release + +* Mon Aug 19 2002 Laurent Culioli 0.4.1-4mdk +- rebuild with gcc3.2 + +* Sat Jul 27 2002 Arnaud de Lorbeau 0.4.1-3mdk +- Mandrake adaptions +- Creation of patch for qt3 detection in configure +- Creation of french po file diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..5c68efa --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,41 @@ +# set the include path for X, qt and KDE +INCLUDES = $(all_includes) + +# these are the headers for your project +noinst_HEADERS = knutclient.h knutmainwindow.h knutprefdlg.h knutnewupsdlg.h \ + knutupsdata.h knutvardata.h knutnet.h knutfrontpanel.h knutpanelmeter.h knutdock.h \ + knutprintupsvar.h knutinstcomms.h knutrwvar.h knutanalog.h knutmessagemanager.h \ + knutmessage.h + +# let automoc handle all of the meta source files (moc) +METASOURCES = AUTO + +messages: rc.cpp + $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp + $(XGETTEXT) *.cpp -o $(podir)/knutclient.pot + +KDE_ICON = AUTO + +######################################################################### +# APPLICATION SECTION +######################################################################### +# this is the program that gets installed. it's name is used for all +# of the other Makefile.am variables +bin_PROGRAMS = knutclient + +# the application source, library search path, and link libraries +knutclient_SOURCES = main.cpp knutclient.cpp knutmainwindow.cpp knutprefdlg.cpp \ + knutnewupsdlg.cpp knutupsdata.cpp knutvardata.cpp knutnet.cpp knutfrontpanel.cpp \ + knutpanelmeter.cpp knutdock.cpp knutprintupsvar.cpp knutinstcomms.cpp knutrwvar.cpp \ + knutanalog.cpp knutmessagemanager.cpp knutmessage.cpp +knutclient_LDFLAGS = $(KDE_RPATH) $(all_libraries) +knutclient_LDADD = $(LIB_KDEUI) + +# this is where the desktop file will go +shelldesktopdir = $(kde_appsdir)/Utilities +shelldesktop_DATA = knutclient.desktop + +# this is where the shell's XML-GUI resource file goes +shellrcdir = $(kde_datadir)/knutclient +shellrc_DATA = knutclientui.rc + diff --git a/src/hi16-app-knutclient.png b/src/hi16-app-knutclient.png new file mode 100644 index 0000000000000000000000000000000000000000..2583d9a0e11830fb2470ea9897d5ce51247b68cd GIT binary patch literal 313 zcmeAS@N?&q;$mQ6;Pv!y2?EjrAk4uAB;`Nr+jUR4Y95`(9!pUXO@geCxf CHgHb> literal 0 HcmV?d00001 diff --git a/src/hi16-app-knutclientconn.png b/src/hi16-app-knutclientconn.png new file mode 100755 index 0000000000000000000000000000000000000000..e298e09329a4291f5f086859e884351cfdd44dc4 GIT binary patch literal 865 zcmV-n1D^beP)Uy%R+00(qQO+^RR0T>G`F~r1&CjbBf?@2^K zR5;6hlS^ovWfX>=^L_tJlbOt~Thl(tc+4)7%1}0XilnWn!{&dJPe%?--DxJVl=|6m>BV%CaS34(~!YV+qs^x_@2U;cXb%H0NZ(R|Da(Nz5jDbib z0)TU1&$dx2M>?aO?N7yh_S7x+^JuV!*=m(@%UsC^My!g6iijo>NwwChoJ(oo1I_$$ zP*1bo--xykg!OZ+ilZZd#$f)ELgtl~!8jV&o2#Wf|`T?DI4*g*_daRB8%l{%+ z>|0eGAXKYWKoKz*6QZ?xdYg|hH49;$ebzF-3g~|&Dq_@_RSK$^4X^272l`PvFRipF r{11n_lJQ%8I9O9o?iu00N;CfeS&~jO^ZZ$Qp00(qQO+^RO3?30H1VOR+y8r+Imq|oH zRCt`FlRZcrK^(<@=S6X05g}p{Q3<&tT3D0+10 zLM%f-5F4x8N{%#Fh}wus0*VlFMN$Zg&ti7(du<#T9?ZP={_j5@@W2rR5a=_ktiUbs z7-+QHJC`v23-}3~LF_u<8z37C^rT^1pi#I0{sIL%CD2KLFGI2Hf+B&sI7ORo*3W@@TbNk?+IC4SeV?15(5l}RVz(w0<-i^0{w339E&>47nDUWnQX{- zYZ7Sj$+vZe^fbz#nTp;^CIaCj(%-+*ua0VALx5LN&H!d^4GsqHqd>jt_{bz}3-djn zHtQt_$Mb5j2@laN$hcb)Xur8{GRojBa2Sd+-Q98=$M&Ag3m;{srhnXbjjN+@8Hzp6 zlk2+01R(L@csbWK@V?rl0U!+nyU?Bj_L`b1t^c=LJWbrZp3P-}6p*b*QvUiJ$C2y0 zipS$B-sCf#^GYLp)T4lJWck5w0uN}d?aT+>K!Ph;I3OSUSIxKsHrd-7Arg!!00000 LNkvXXu0mjf9OvHK literal 0 HcmV?d00001 diff --git a/src/hi32-app-knutclient.png b/src/hi32-app-knutclient.png new file mode 100644 index 0000000000000000000000000000000000000000..f5c9beb926c4f4a470918f14aa68c5b4766721e3 GIT binary patch literal 523 zcmV+m0`&cfP)$Qp00(qQO+^RR0vQw=A~+kLH2?qsnMp)J zR9M69m%mB_K@i4&bEJ!eKq_NvVk3z704nxZ`98+l2k;Rrg$QDqMnw_C#v+A{_zwy3 z1>#ubj%+TMxO*c><97@@d$2d(&dko-imH+a5!nQmfih4_UYCJS&;ig_KZIF2XYwcG7K_dvEX zZKTyMj^nZFH$GP-eKNYK8;ZzoK=AT)V;!h0x)7}xzt^=AXc!6fECg18H6ww3=mPg< zbdvoc$vcX_;H&U41YUw}M)`7F=w_6lZgl@O@IJqGJc$S3!rTkyjUQ4_yV?CXmrnoy N002ovPDHLkV1j{x&g}pI literal 0 HcmV?d00001 diff --git a/src/hi48-app-knutclient.png b/src/hi48-app-knutclient.png new file mode 100644 index 0000000000000000000000000000000000000000..b26d5c9785ca7b938f8216f4eda172f04ada41d1 GIT binary patch literal 962 zcmV;z13mnSP)OYP)S5V zRA}DSnm=e1K@`S+vqX<0nn=*7AyMQ+a0~Hbdu$id9H_-%YpK}T1q2IQiKMW!77PTE zO41o3h(!vC7HSGTJ&cO~l{*vnS?sJi&-E_Z%v+KVhWWG0-uq_0_vY=+L3$Wld$s_+ zfki-?iY~em%`#vlvQI>k?$`kw1$F_4?D!+#4NwPuuH7yj_`4>shMmAEYv2*!3@`u; zwOm~PR-I*Qm5t`#Gz7+C~}Wl z31c(P%q-2o)KPe7qPjE#@Cz8!ni*pwj~fY16@*$&_(oJu72<0%AVy;a#D+dM7+iv$ z26O|x4H)_pJ^O%y3qMGbP!+i7gutr;e96HN;ByYDh4{)z;INC$EQx^F4QKNhABP8n z@Pw!yACIqeH|^jm=ur-%^=LoPi9!J1?3S;Tfi-f#0ZjrS@K%k$YOYfr<|LVW3Y6AN7?f9>EyA&SD6r~rzY_6Ioz{#(%7$hCh{`Y58OwggNvC&q4ek^p`L7< z_(+1a?+ zoBFBeAFpR@SzAJTl*9C=EW)TJYMKNLuveMDQ%wRrK)*79`_2i72qPmSbaizd&LCBJ z;hezO*cf3L;(6Y2W#g;-brkD}z{JD^^YiojS5{WelJM;^2!gi#tQ|OZ)>d2ruC)%X zKNnh8hHwM8?CP+)m5}x+ +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + + + +KNutAnalog::KNutAnalog( QWidget *parent, const char *name, int bottomLimit, int topLimit, int typeOfView, int countOfParts, int countOfSubParts, QColor pointerColor, QColor scaleColor, QColor textColor, QFont *analogFonts, int qualityOfPointer, bool makeBG ) + : QFrame( parent, name ), m_bottomLimit(bottomLimit), m_topLimit(topLimit), m_typeOfView(typeOfView), m_countOfParts(countOfParts), m_countOfSubParts(countOfSubParts), m_pointerColor(pointerColor), m_scaleColor(scaleColor) ,m_textColor(textColor) { + + + if ( qualityOfPointer==0) { + m_speedOfAAlias=none; + m_makeBlurMotion=false; + } + else { + if ((qualityOfPointer==2) || (qualityOfPointer== 4)) m_speedOfAAlias=slow; else m_speedOfAAlias=fast; + if ((qualityOfPointer==3) || (qualityOfPointer== 4)) m_makeBlurMotion=true; else m_makeBlurMotion=false; + } + +// m_showBackGround = true; +// m_showPointer = true; + + if (m_countOfParts > 6) m_countOfParts=6; + else if (m_countOfParts < 2) m_countOfParts=2; + + + if ( m_countOfSubParts > 6 ) m_countOfSubParts = 6; + if ( m_countOfSubParts == 0 ) { + if (m_countOfParts < 4) m_countOfSubParts =5; + else { + if (m_countOfParts < 6) m_countOfSubParts=4; + else m_countOfSubParts =3; + } + } + + m_valueOfPointer=m_bottomLimit; + /* hodnoty zavisle na typu zobrazeni */ + switch (m_typeOfView) { + case 1 : + m_direction = 1; /* smer =1 ve smeru (clockwise), smer =-1 proti smeru hod. rucicek */ + m_angleOfViewer=270; + m_startAngle=225; + m_centerX=m_widthOfBackGround/2; + m_centerY=m_widthOfBackGround/2; + m_widthOfScale=118; + m_radiusOfScaleNumbers=37; + break; + case 2 : + m_direction = -1; /* smer =1 ve smeru (clockwise), smer =-1 proti smeru hod. rucicek */ + m_angleOfViewer=90; + m_startAngle=0; + m_centerX=13; + m_centerY=110; + m_widthOfScale=210; + m_radiusOfScaleNumbers=83; + break; + case 3 : + m_direction = 1; /* smer =1 ve smeru (clockwise), smer =-1 proti smeru hod. rucicek */ + m_angleOfViewer=90; + m_startAngle=135; + m_centerX=m_widthOfBackGround/2; + m_centerY=m_widthOfBackGround-15; + m_widthOfScale=170; + m_radiusOfScaleNumbers=65; + break; + } + // konec hodnot zavislych na typu zobrazeni + + if (analogFonts == 0) { // pokud neni predan font nastavi se systemovy font + m_scaleFont = kapp->font(); + m_textFont = kapp->font(); + } + else { + m_scaleFont= *analogFonts; + m_textFont= *analogFonts; + } + + m_countOfColorParts = 0; + setMinimumSize( AnalogWidth, AnalogWidth ); + setMaximumSize( AnalogWidth, AnalogWidth ); + setFrameStyle( QFrame::Box | QFrame::Raised ); + setLineWidth( 2 ); + + m_backgroudLayerBig = new QPixmap( (AnalogWidth-8) * 3,(AnalogWidth-8)*3 ); + + m_scaleLayerBig = new QPixmap ( (AnalogWidth-8)*3, (AnalogWidth-8)*3 ); // + m_scaleLayerSmall = new QPixmap ( (AnalogWidth-8), (AnalogWidth-8)); // + + m_wholeLayer = new QPixmap ( AnalogWidth-8, AnalogWidth-8 ); // + + m_pointerLayerBig = new QPixmap ( (AnalogWidth-8)*3, (AnalogWidth-8)*3 ); // + m_pointerLayerSmall = new QPixmap ( (AnalogWidth-8), (AnalogWidth-8)); // + + setDefaultArcColor(false); // sets standard registers // nastavime standartni registry + + if (makeBG) { + paintBackGround(); + m_showBackGround = true; + m_showPointer = true; + } + } + +KNutAnalog::~KNutAnalog() { + + delete (m_backgroudLayerBig); + + delete (m_scaleLayerBig); + delete (m_scaleLayerSmall); + + delete (m_pointerLayerBig); + delete (m_pointerLayerSmall); + + delete (m_wholeLayer); +} + + +void KNutAnalog::makeBackground (bool run) { + + paintBackGround(); + m_showBackGround = true; + if (run) { + repaint(); + } + } + + +void KNutAnalog::setText (QString inscription, QString text_up, bool run) { + + m_inscription=inscription; + AnMJ=text_up; + if (run) { + paintBackGround(); + m_showBackGround = true; + repaint(); + } + } + +void KNutAnalog::setDefaultArcColor(bool run) { + + m_arcColors[0] = Qt::white; + m_arcColors[1] = Qt::green; + m_arcColors[2] = Qt::yellow; + m_arcColors[3] = Qt::red; + m_arcColors[4] = Qt::blue; + m_arcColors[5] = Qt::cyan; + m_arcColors[6] = Qt::magenta; + m_arcColors[7] = Qt::gray; + m_arcColors[8] = Qt::black; + if (run) { + paintBackGround(); + m_showBackGround=true; + repaint(); + } + } + + +void KNutAnalog::setArcColor(int reg, QColor color ) { + if ((reg > -1) && (reg < 9)) m_arcColors[reg] = color; + } + + +void KNutAnalog::addArc (double startOfCircle, double endOfCircle, int regColor, bool run) { + + if (m_countOfColorParts < 5) { + m_extentOfDye[m_countOfColorParts].start=startOfCircle; + m_extentOfDye[m_countOfColorParts].end=endOfCircle; + if ((regColor <0) || (regColor > 8)) regColor=0; + m_extentOfDye[m_countOfColorParts++].color=regColor; + } + if (run) { + paintBackGround(); + m_showBackGround = true; + repaint (); + } + } + + +void KNutAnalog::delArc (bool run) { + + m_countOfColorParts = 0; + if (run) { + paintBackGround(); + m_showBackGround = true; + repaint (); + } + } + + + +void KNutAnalog::setRange (int Astart, int Aend , bool run) { + + m_bottomLimit=Astart; + m_topLimit=Aend; + // pokud zmenime rozasah musime prekrelit i rucicku + m_showPointer = true; + if (run) { + paintBackGround(); + m_showBackGround = true; + repaint (); + } + } + + + +void KNutAnalog::setMember (int Count, bool run) { + + m_countOfParts=Count; + if (run) { + paintBackGround(); + m_showBackGround = true; + repaint (); + } + } + + + +void KNutAnalog::setPointerColor (QColor pointerColor, bool run ) { + + m_pointerColor = pointerColor; + paintPointer(); + m_showPointer = true; + if (run) { + repaint (); + } + } + + +void KNutAnalog::repaintPointer ( bool run ) { + + paintPointer(); + m_showPointer = true; + if (run) { + repaint (); + } + } + + +void KNutAnalog::setFontColor (QColor fontColor, bool run ) { + + m_textColor = fontColor; +// paintBackGround(); +// m_showBackGround = true; + if (run) { + paintBackGround(); + m_showBackGround = true; + repaint (); + } + } + + +void KNutAnalog::setScaleColor (QColor scaleColor, bool run) { + + m_scaleColor = scaleColor; + if (run) { + paintBackGround(); + m_showBackGround = true; + repaint (); + } + } + + +void KNutAnalog::setDigitalProcesing (int qualityOfPointer, bool run ) { + + if (qualityOfPointer < 0) qualityOfPointer = 0; + if (qualityOfPointer > 4) qualityOfPointer = 4; + if ( qualityOfPointer==0) { + m_speedOfAAlias=none; + m_makeBlurMotion=false; + } + else { + if ((qualityOfPointer==2) || (qualityOfPointer== 4)) m_speedOfAAlias=slow; else m_speedOfAAlias=fast; + if ((qualityOfPointer==3) || (qualityOfPointer== 4)) m_makeBlurMotion=true; else m_makeBlurMotion=false; + } + paintPointer(); + m_showPointer = true; // pri jakemkoliv prekresleni prekreslime rucicku + if (run) repaint (); +} + + + +void KNutAnalog::setPointer (double pointerValue, bool run ) { + if (m_valueOfPointer != pointerValue) { + m_valueOfPointer = pointerValue; + paintPointer(); + m_showPointer = true; // pri jakemkoliv prekresleni prekreslime rucicku + if (run) { +// paintPointer(); + m_showPointer = true; // pri jakemkoliv prekresleni prekreslime rucicku + repaint (); + } + } +} + + + +//************** PUBLIC SLOTS ********************************** + +void KNutAnalog::slotSetScaleFont(QFont newScaleFont){ + m_scaleFont = newScaleFont; + paintBackGround(); + m_showBackGround=true; + repaint(); + } + +void KNutAnalog::slotSetTextFont(QFont newTextFont){ + m_textFont = newTextFont; + paintBackGround(); + paintPointer(); // repaint values if pointer + m_showBackGround=true; + m_showPointer=true; + repaint(); + } + +void KNutAnalog::slotSetAllFont(QFont newAllFont){ + m_scaleFont = newAllFont; + m_textFont = newAllFont; + paintBackGround(); + paintPointer(); // repaint values if pointer + m_showBackGround=true; + m_showPointer=true; + repaint(); + } + + +void KNutAnalog::repaintAll (void) { + paintBackGround(); + m_showBackGround = true; + m_showPointer = true; + repaint (); + } + + +//************** protected **************************** + +void KNutAnalog::resizeEvent( QResizeEvent * ) { +} + + +void KNutAnalog::paintEvent( QPaintEvent *e ) { + + if (isVisible()) { + QFrame::paintEvent(e); + if ((m_showBackGround) || (m_showPointer)) { // novou kompletni vrstvu sestavime jen pokud doslo ke zmene + bitBlt( m_wholeLayer, 0, 0, m_scaleLayerSmall, 0, 0, m_widthOfBackGround, m_widthOfBackGround, CopyROP); //nakopirujeme vrstvu + bitBlt( m_wholeLayer, 0, 0, m_pointerLayerSmall, 0, 0, m_widthOfBackGround, m_widthOfBackGround, AndROP ); //nakopirujeme rucicku + } + bitBlt( this , m_startOfBackGround, m_startOfBackGround, m_wholeLayer, 0, 0, m_widthOfBackGround, m_widthOfBackGround, CopyROP); //nakopirujeme vrstvu + m_showBackGround = false; + m_showPointer = false; + } + } + + +//***************private ************************ + +void KNutAnalog::paintBackGround ( void ) { + QPainter paint; + QImage myImage; //big image + +//qDebug ("KNutAnalog::paintBackGround"); + + m_scaleLayerBig->fill( this,0,0); //color if background + + paint.begin ( m_scaleLayerBig ); + paint.setBackgroundMode(Qt::OpaqueMode); + paint.setBackgroundColor(backgroundColor()); + paintPartOfCircle(&paint, m_centerX*3, m_centerY*3,m_widthOfScale*3); //CMK pro inter + paintScale(&paint, m_centerX*3, m_centerY*3,m_widthOfScale*3); // Scale + paint.end(); + + myImage = m_scaleLayerBig->convertToImage(); + + makeMotionBlur(&myImage,myImage.pixel(1,1),m_typeOfView); + makeAntialiasing(&myImage,m_scaleLayerSmall,myImage.pixel(1,1),slow,m_typeOfView); + + paint.begin( m_scaleLayerSmall ); // paint on layer of scale + // painting numbers + paintScaleNumbers( &paint ); //painting of numbers + // painting texts + paintText( &paint ); + paint.end (); + } + + + +void KNutAnalog::paintPointer ( void ) { + + +//qDebug ("KNutAnalog::paintPointer"); + if (m_speedOfAAlias == none) paintPointerFastly (m_valueOfPointer); + else paintPointerSlowly ( m_valueOfPointer, m_centerX*3, m_centerY*3,m_widthOfScale*3); +} + + +void KNutAnalog::paintPointerSlowly ( double position, int centerX , int centerY, int widthOfCircle) { + QPainter paint; + + QImage myImage; //big image + double angle; + int lengthOfPointer = widthOfCircle / 2 - 12; + + if (position < m_bottomLimit) position=m_bottomLimit; + else { + if (position > m_topLimit) position = m_topLimit; + } + // painting of pointer + angle = ((m_angleOfViewer/(m_topLimit-m_bottomLimit))*(position-m_bottomLimit))*((-1)*m_direction)+m_startAngle; + + m_pointerLayerBig->fill( Qt::white ); //color if beckground + paint.begin( m_pointerLayerBig ); // paints of pointer + paint.setBackgroundMode(Qt::TransparentMode); + + paint.setBrush( m_pointerColor ); // sets color + paint.setPen ( m_pointerColor ); + QPointArray pts; + // k posuvu a k otoceni pouziva funkce paintu + // for rotate and translate uses functions of paint + paint.translate (centerX, centerY); + paint.rotate(-angle); + pts.setPoints( 4, -6, 0, 0, -6, lengthOfPointer, 0, 0, 6 ); + paint.drawConvexPolygon( pts ); + + paint.end (); + //m_pointerMutex.lock(); + + myImage = m_pointerLayerBig->convertToImage(); + + if (m_makeBlurMotion) makeMotionBlur(&myImage,myImage.pixel(1,1)); + makeAntialiasing(&myImage,m_pointerLayerSmall,myImage.pixel(1,1),m_speedOfAAlias,0); + + paint.begin( m_pointerLayerSmall ); // paints on layer's background + paintValueOfPointer ( &paint, m_valueOfPointer); + paint.end (); + // m_pointerMutex.unlock(); + } + + + +void KNutAnalog::paintPointerFastly (double position) { + QPainter paint; + double uhel; + + int delka = m_widthOfScale / 2 - 4; + + //m_pointerMutex.lock(); + m_pointerLayerSmall->fill( Qt::white ); //background color + paint.begin( m_pointerLayerSmall ); // kreslime na plochu rucicky + paint.setBackgroundMode(Qt::TransparentMode); + paintValueOfPointer ( &paint, m_valueOfPointer); + + + if (position < m_bottomLimit) position=m_bottomLimit; + else { + if (position > m_topLimit) position = m_topLimit; + } + /* painting of pointer*/ + uhel = ((m_angleOfViewer/(m_topLimit-m_bottomLimit))*(position-m_bottomLimit))*((-1)*m_direction)+m_startAngle; + + paint.setBrush( m_pointerColor ); // nastavime barvu + paint.setPen ( m_pointerColor ); + QPointArray pts; + // for translate a rotate uses functions of paint // k posuvu a k otoceni pouziva funkce paintu + paint.translate (m_centerX, m_centerY); + paint.rotate(-uhel); + pts.setPoints( 4, -2, 0, 0, -2, delka, 0, 0, 2 ); + paint.drawPolygon( pts ); + + paint.end(); + //m_pointerMutex.unlock(); + } + + + +void KNutAnalog::paintPartOfCircle ( QPainter *paint, int centerX , int centerY, int widthOfCircle ) { + double Astart, Aend; + + // pocitani uhlu + //nula je ve 3 hodiny + // prirustek je kladny proti smeru hod rucicek + + //int extent = m_topLimit-m_bottomLimit; //rozsah +// double extent = m_topLimit-m_bottomLimit; //rozsah +// double jednotka = ((double)m_angleOfViewer/extent); + double jednotka = ((double)m_angleOfViewer/(m_topLimit-m_bottomLimit)); + bool painted = false; + +// int smerMK = (-1)*m_direction; + // paints parts of circle + for (int i=0;i m_bottomLimit)) { + if (m_extentOfDye[i].start < m_bottomLimit) Astart = m_bottomLimit; else Astart = m_extentOfDye[i].start; + if (m_extentOfDye[i].end > m_topLimit) Aend = m_topLimit; else Aend = m_extentOfDye[i].end; + paint->setBrush ( m_arcColors[m_extentOfDye[i].color] ); + paint->setPen (NoPen); + paint->drawPie((centerX-widthOfCircle/2),(centerY-widthOfCircle/2),widthOfCircle,widthOfCircle,(int)((((Astart-m_bottomLimit)*jednotka)*((-1)*m_direction)+m_startAngle)*16),(int)(((-1)*m_direction)*((Aend-Astart)*jednotka)*16)); + painted = true; // bylo provedeno vykresleni + } + } + if ((m_countOfColorParts > 0) && (painted)) { // kreslime jen pokud bylo kreslena kruhova vysec + // musime vybarvit stred kotouce + //fills center of circle + paint->setBrush ( paint->backgroundColor() ); //The angles are 1/16th of a degree + paint->drawPie((centerX-(widthOfCircle/2)+18),(centerY-(widthOfCircle/2)+18),widthOfCircle-36,widthOfCircle-36,(int)(m_startAngle*16+90*m_direction),(int)((-m_direction)*(m_angleOfViewer*16+180))); + } + } + + + +void KNutAnalog::paintScale ( QPainter *paint , int centerX , int centerY, int widthOfCircle) { + + int bottomMax = widthOfCircle/2 - 29; + int bottom = widthOfCircle/2 -17 ; + int smer_stup = (-1)*m_direction; + paint->save(); + paint->setPen ( m_scaleColor); + + paint->translate( centerX, centerY ); + + double stupne = smer_stup * (m_angleOfViewer/(m_countOfParts*(m_countOfSubParts))); + + // nakresleni prvni linky + //paints of the first line + paint->rotate( -m_startAngle); + paint->setBrush ( m_scaleColor ); + paint->drawRect( bottomMax,-1,30,3 ); + + for ( int i=0; i<(m_countOfParts); i++ ) { + for ( int j=0; j<(m_countOfSubParts-1); j++) { + paint->rotate( -stupne ); + paint->drawRect( bottom,-1,18,2 ); + } + paint->rotate( -stupne ); + paint->drawRect( bottomMax,-1,30,3 ); + } + paint->restore(); + } + + + +void KNutAnalog::makeAntialiasing (QImage* bigImage, QPixmap* smallPixmap, const QRgb colorOfBG, speedOfAAlias speed, int typeOfView) { + ulong imageRed, imageGreen, imageBlue; + QRgb imageRgb; + QImage* smallImage; + bool computeAverage; + ulong sumOfRed, sumOfGreen, sumOfBlue; + + if (speed == slow) { + sumOfRed = (qRed ( colorOfBG ))*9; + sumOfGreen = (qGreen ( colorOfBG ))*9; + sumOfBlue = (qBlue ( colorOfBG ))*9; + } + else { + sumOfRed = (qRed ( colorOfBG ))*16; + sumOfGreen = (qGreen ( colorOfBG ))*16; + sumOfBlue = (qBlue ( colorOfBG ))*16; + } + int smallImageWidth=bigImage->width()/3; + int smallImageHeight=bigImage->height()/3; + + + smallImage = new QImage(smallImageWidth,smallImageHeight, bigImage->depth()); + +// imageRgb = bigImage->pixel(1,1); + + for (int x = 0; x < smallImageWidth; x++) { + for (int y = 0; y < smallImageHeight; y++) { + imageRed = 0; + imageGreen = 0; + imageBlue = 0; + + switch (typeOfView) { + case 0: + //nothing + computeAverage=true; + break; + case 1: + if ((y>25) and (x >30) and (x < 92)) computeAverage=false; + else computeAverage=true; + break; + case 2: + if ((y < 15) || ((x+15) > y)) computeAverage=true; + else computeAverage=false; + break; + case 3: + //computes top part only + if ((y < 60) && (y>15)) computeAverage=true; + else computeAverage=false; + break; + default: + computeAverage=true; + } + + if (speed == slow) { +//// uses divide, slowly compute + if (computeAverage) { + for (int xi = 0 ; xi < 3; xi ++) { + for (int yi = 0 ; yi < 3; yi ++) { + imageRgb = bigImage->pixel(x*3+xi,y*3+yi); + imageRed += qRed ( imageRgb ); + imageGreen += qGreen ( imageRgb ); + imageBlue += qBlue ( imageRgb ); + } + } + if (((imageRed == sumOfRed) && (imageGreen == sumOfGreen) && (imageBlue == sumOfBlue))) { + smallImage->setPixel (x,y,colorOfBG); + } + else { + imageRed = imageRed / 9; + imageGreen = imageGreen/9; + imageBlue = imageBlue/9; + smallImage->setPixel (x,y,qRgb(imageRed,imageGreen,imageBlue)); + } + } + else { + smallImage->setPixel (x,y,bigImage->pixel(x*3,y*3)); + } + } + else { +//// uses bitmove, fastly compute + if (computeAverage) { + for (int xi = 0 ; xi < 3; xi ++) { + for (int yi = 0 ; yi < 3; yi ++) { + if ((xi == 1) && (yi == 1)) { // center of 3x3 area + imageRgb = bigImage->pixel(x*3+xi,y*3+yi); + imageRed += qRed ( imageRgb )*4; + imageGreen += qGreen ( imageRgb )*4; + imageBlue += qBlue ( imageRgb )*4; + } + else { + if ((xi == 1) || (yi == 1)) { + imageRgb = bigImage->pixel(x*3+xi,y*3+yi); + imageRed += qRed ( imageRgb )*2; + imageGreen += qGreen ( imageRgb )*2; + imageBlue += qBlue ( imageRgb )*2; + } + else { + imageRgb = bigImage->pixel(x*3+xi,y*3+yi); + imageRed += qRed ( imageRgb ); + imageGreen += qGreen ( imageRgb ); + imageBlue += qBlue ( imageRgb ); + } + } + } + } + if ((imageRed == sumOfRed) && (imageGreen == sumOfGreen) && (imageBlue == sumOfBlue)) { + smallImage->setPixel (x,y,colorOfBG); + } + else { + imageRed = imageRed >> 4; + imageGreen = imageGreen >> 4; + imageBlue = imageBlue >> 4; + smallImage->setPixel (x,y,qRgb(imageRed,imageGreen,imageBlue)); + } + } + else { + smallImage->setPixel (x,y,bigImage->pixel(x*3,y*3)); + } + } //end of fastly + } + } + smallPixmap->convertFromImage(*smallImage); + delete smallImage; +} + + +void KNutAnalog::makeMotionBlur (QImage* image, const QRgb colorOfBG, int typeOfView) { + + ulong imageRed, imageGreen, imageBlue; + QRgb imageRgb; + QImage *layerImageBlur; + bool computeAverage; + int startHeight, stopHeight; + ulong sumOfRed, sumOfGreen, sumOfBlue; + + sumOfRed = (qRed ( colorOfBG ))*9; + sumOfGreen = (qGreen ( colorOfBG ))*9; + sumOfBlue = (qBlue ( colorOfBG ))*9; + + int imageWidth=image->width(); + int imageHeight=image->height(); + + layerImageBlur = new QImage(*image); + layerImageBlur->detach(); //costructor makes swallow copy, have to use detach + + + switch (typeOfView) { + case 0: + //nothing + startHeight =1; + stopHeight =imageHeight-2; + break; + case 2: + startHeight =1; + stopHeight =imageHeight-2; + break; + case 3: + startHeight =45; + stopHeight =180; + break; + default: + startHeight =1; + stopHeight =imageHeight-2; + } + + + for (int x = 1; x < imageWidth-2; x++) { + for (int y = startHeight; y < stopHeight; y++) { + imageRed = 0; + imageGreen = 0; + imageBlue = 0; + + switch (typeOfView) { + case 0: + //nothing + computeAverage=true; + break; + case 1: + if ((y>75) and (x >90) and (x < 274)) computeAverage=false; + else computeAverage=true; + break; + case 2: + if ((y < 45) || ((x+45) > y)) computeAverage=true; + else computeAverage=false; + break; + case 3: + //computes top part only + if ((y < 180) && (y>45)) computeAverage=true; + else computeAverage=false; + break; + default: + computeAverage=true; + } + + + if (computeAverage) { + for (int xi = -1 ; xi < 2; xi ++) { + for (int yi = -1 ; yi < 2; yi ++) { + imageRgb = layerImageBlur->pixel(x+xi,y+yi); + imageRed += qRed ( imageRgb ); + imageGreen += qGreen ( imageRgb ); + imageBlue += qBlue ( imageRgb ); + } + } + + if (!((imageRed == sumOfRed) && (imageGreen == sumOfGreen) && (imageBlue == sumOfBlue))) { + imageRed = (int)(imageRed / 9); + imageGreen = (int)(imageGreen/9); + imageBlue = (int)(imageBlue/9); + image->setPixel (x,y,qRgb(imageRed,imageGreen,imageBlue)); + } + } + } + } + delete layerImageBlur; +} + + + + + + +void KNutAnalog::paintScaleNumbers ( QPainter *paint ) { + //paintig of scaleNumbers + + int poz_x, poz_y, r_vyska, r_sirka; + double posun, angle; + + double upi = 0.0174532; + int smer_st = -m_direction; + + paint->save(); // ulozime + QString cislo; + paint->setPen(m_textColor); + paint->setFont(m_scaleFont); + + QFontMetrics fm = paint->fontMetrics(); + r_vyska = ((fm.ascent()) / 2); + posun = ((double)(m_topLimit-m_bottomLimit))/m_countOfParts; + for (int i=0; i<=(m_countOfParts);i++) { + cislo.sprintf( "%3.0f",m_bottomLimit+i*posun); + cislo=cislo.stripWhiteSpace(); + r_sirka = (fm.width(cislo))/2; + angle = (m_startAngle+ ((m_angleOfViewer/m_countOfParts)*i*smer_st))*upi; + poz_x = (int)((cos(angle)*m_radiusOfScaleNumbers+m_centerX) - r_sirka); + poz_y = (int)((m_centerY-sin(angle)*m_radiusOfScaleNumbers) + r_vyska); + paint->drawText (poz_x,poz_y,cislo); + } + paint->restore(); + } + + +void KNutAnalog::paintText ( QPainter *paint ) { + QString nadpis1; + QString nadpis2; + int index; + + if (m_inscription.length() >1) { + if ((index = m_inscription.find(" ")) != -1) { + // mezera nalezena space found + nadpis1 = m_inscription.left(index); + nadpis2 = m_inscription.mid(index+1,(uint)(m_inscription.length() - index - 1)); + } + } else index = -1; + + paint->setPen(m_textColor); + paint->setFont(m_textFont); + QFontMetrics fm = paint->fontMetrics(); + int r_vyska = fm.height()/ 2; + switch (m_typeOfView) { + // kruznice - kreslime dve radky nad sebou cemtrovane + case 1 : + if (index == -1 ) paint->drawText( m_centerX - fm.width(m_inscription)/2, 104 + r_vyska , m_inscription); + else { + // mame dve slova + paint->drawText( m_centerX - fm.width(nadpis1)/2, 106 + r_vyska/2 - 2, nadpis1); + paint->drawText( m_centerX - fm.width(nadpis2)/2, 106 + (r_vyska*3)/2 + 2, nadpis2); + } + paint->drawText( m_centerX - fm.width(AnMJ)/2, 44 + r_vyska , AnMJ); + break; + // ctvrt oblouk kreslime dve radky nad sebou centrovane v pravem hornim rohu + case 2 : + if (index == -1 ) paint->drawText( 121 - fm.width(m_inscription) , 6 + r_vyska , m_inscription); + else { + paint->drawText( 121 - fm.width(nadpis1) , 6 + r_vyska , nadpis1); + paint->drawText( 121 - fm.width(nadpis2) , 10 + r_vyska*2 , nadpis2); + } + paint->drawText( m_centerX , 68 + r_vyska*2 , AnMJ); + break; + // horni oblouk + case 3 : + paint->drawText( m_centerX - fm.width(m_inscription)/2, 6 + r_vyska , m_inscription); + paint->drawText( m_widthOfBackGround -5 -fm.width(AnMJ), m_widthOfBackGround -r_vyska, AnMJ); + + break; + } + } + + + +void KNutAnalog::paintValueOfPointer ( QPainter *p, double value) { + + QString cislo; + cislo.sprintf( "%5.1f",value); + cislo=cislo.stripWhiteSpace(); + + if (value < m_bottomLimit) value=m_bottomLimit; + else { + if (value > m_topLimit) value = m_topLimit; + } + /* nakresleni rucicky*/ +// uhel = ((uhel_zobrazeni/(horni_mez-dolni_mez))*(value-dolni_mez))*((-1)*smer)+m_startAngle; + + p->setPen(m_textColor); + p->setFont(m_textFont); + QFontMetrics fm = p->fontMetrics(); + int r_vyska = fm.height()/ 2; + + + switch (m_typeOfView) { + case 1 : + p->drawText( m_centerX - fm.width(cislo)/2, 75 + r_vyska , cislo); + break; + case 2 : + p->drawText( m_centerX , 57 + r_vyska , cislo); + break; + case 3 : + p->drawText( 5, m_widthOfBackGround -r_vyska, cislo); + break; + } + } + + + +#include "knutanalog.moc" + + + diff --git a/src/knutanalog.h b/src/knutanalog.h new file mode 100644 index 0000000..b0b64f5 --- /dev/null +++ b/src/knutanalog.h @@ -0,0 +1,452 @@ +/*************************************************************************** + * Copyright (C) 2007 by Daniel Prynych * + * Daniel.Prynych@buzuluk.cz * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#ifndef KNUTANALOG_H +#define KNUTANALOG_H + +#include + +#include // po odladeni smazat +#include +#include + + +class QPainter; +class QFont; + +enum speedOfAAlias { none,fast,slow}; + + +/** + * This class shows analog measuring panels + * + * @author Daniel Prynych + * @short analog measuring panels + * @version 0.1 +*/ + +class KNutAnalog : public QFrame { + Q_OBJECT +public: + + + struct extentOfDyeDef { + double start,end; + int color; + }; + + + +/** + * Construct - makes object for analog measuring panel about size 130 x 130 points + * Konstruktor - vytvori objekt pro analogovy merici panel o rozmerech 130 x 130 bodu + * + * When you need paint or repainr panel you have to call functiin reapaint + * other functions calls this function theirself, when run = true + * Pokud je potreba vykreslit nebo prekreslit panel je nutno zavolat funkci repaint, + * ostatni funkce ji zavolaji sami pokud je run = TRUE. + * + * @param bottomLimit Is bottom value of scale.. + * @param topLimit is end value of scale. + * @param typeOfView determine type view of scale 1- circle 2- right part of circle, 3 - top part of circle + * @param countOfParts determine count of big parts (parents parts) of scale. + * @param countOfSubParts determine count small parts (children parts) id scale, evere big part include e few small part. + * @param pointerColor determine color of pointer. + * @param scaleColor determine color of scale. + * @param textColor determine color of text. + * @param analogFonts determine fonts for text and scale. + * @param qualityOfPainter determine quality painting of pointer- 0 nothing. 1 fast antialiasing, 2 slow antialiasing, 3 blur motion + fast antialiasing, 4 blur motion + slow antialiasing + * @since 0.3 + **/ + KNutAnalog(QWidget *parent = 0, const char *name = 0, int Astart = 0, int topLimit = 100, int typeOfView = 1, int countOfParts = 5, int countOfSubParts = 0, QColor pointerColor = Qt::black, QColor m_scaleColor = Qt::black, QColor textColor = Qt::black, QFont *analogFonts = 0, int qualityOfPointer = 4, bool makeBG = false ); + +/** + * Destruktor + * @since 0.1 + **/ + ~KNutAnalog(); + + +/** + * Sets text for top and bottom text of panel. + * Nastavi text dolni a horni text na panelu. + * + * @param m_inscription determinuje inscription , bottom text , usually. + * @param m_inscription Udava nadpis, "dolni" text, obvykle co je mereno. + * @param text_up Udava mernou jednotku "horni" text, obvykle merna jednotka. + * @param run = TRUE makes immediately repaint of panel + * @param run = TRUE provede okamzite prekresleni panelu. + * + * @since 0.1 + **/ + void setText (QString m_inscription, QString text_up, bool run=false); + + +/** + * Makes background of analog panel. + * Vytvori pozadi analogoveho panelu. + * + * @param run = TRUE makes immediately repaint of panel + * @param run = TRUE provede okamzite prekresleni panelu. + * + * @since 0.2 + **/ + void makeBackground (bool run=false); + + +/** + * Repaint pointer of analog panel. + * Prekresli rucicku analogoveho panelu. + * + * @param run = TRUE makes immediately repaint of panel + * @param run = TRUE provede okamzite prekresleni panelu. + * + * @since 0.2 + **/ + void repaintPointer ( bool run ); + + + +/** + * Nastavuje devet zakladnich barev pro mezikruzi. + * Sets nine basic color for circle in scale + * + * @param run = TRUE provede okamzite prekresleni panelu. + * @param run = TRUE makes immediately repaint of panel + * + * @since 0.1 + **/ + void setDefaultArcColor(bool run=false); + + +/** + * Nastavi zakladni barvu pro mezikruzi. + * Sets basic color for circle in scale + * + * @param reg Poradove cislo barvy (barevneho registru). + * @param color Barva na kterou bude nastaven registr barvy. + * + * @since 0.1 + **/ + void setArcColor(int reg, QColor color ); + + + +/** + * Vybarvi cast stupnice zadanou barvou. + * Nastavi rozsah mezikruzi, podle stupnice od pocatecni hodnoty do koncove hodnoty stupnice + * Barevne casti se barvy postupne, podel poradoveho cisla, mohou se prekryvat. + * Je mozno nastavit jen 5 casti !! + * + * @param startOfCircle Urcuje zazatek mezikruzi. + * @param endOfCircle Urcuje konec mezikruzi. + * @param color Urcuje barvu. + * @param run = TRUE makes immediately repaint of panel + * @param run = TRUE provede okamzite prekresleni panelu. + * + * @since 0.2 + **/ + void addArc (double startOfCircle, double endOfCircle, int regColor, bool run=false); + + + +/** + * Clear colors of scale + * Zrusi vybarveni stupnice. + * + * @param run = TRUE makes immediately repaint of panel + * @param run = TRUE provede okamzite prekresleni panelu. + * + * @since 0.1 + **/ + void delArc (bool run=false); + + + +/** + * + * Nastavi rozsah stupnice. + * + * @param Astart Urcuje pocatecni hodnotu stupnice. + * @param AEND Urcuje koncovou hodnotu stupnice. + * @param run = TRUE makes immediately repaint of panel + * @param run = TRUE provede okamzite prekresleni panelu. + * + * @since 0.2 + */ + void setRange (int Astart = 0, int Aend = 100, bool run=false); + +/** + * Sets number of parts od scale + * Nastavi pocet dilku stupnice. + * + * @param Count Determine number of parts of pointer.. + * @param Count Urcuje pocet casti stupnice. + * @param run = TRUE makes immediately repaint of panel + * @param run = TRUE provede okamzite prekresleni panelu. + * + * @since 0.1 + */ + void setMember (int Count, bool run=false); + +/** + * Sets color of analog pointer. + * Nastavi barvu analogove rucicky. + * + * @param pointerColor determine color of pointer. + * @param pointerColor Urcuje barvu rucicky. + * @param run = TRUE makes immediately repaint of panel + * @param run = TRUE provede okamzite prekresleni panelu. + * @since 0.2 + */ + void setPointerColor (QColor pointerColor, bool run=false); + +/** + * sets color of text; + * Nastavi barvu textu. + * + * @param fontColor determine color of font. + * @param fontColor urcuje barvu fontu. + * @param run = TRUE makes immediately repaint of panel + * @param run = TRUE provede okamzite prekresleni panelu. + * + * @since 0.1 + */ + void setFontColor (QColor fontColor, bool run=false ); + + + +/** + * Sets color of scale + * Nastavi barvu stupnice. + * + * @param scaleColor determine color if scale. + * @param scaleColor urcuje barvu stupnice. + * @param run = TRUE makes immediately repaint of panel + * @param run = TRUE provede okamzite prekresleni panelu. + * + * @since 0.1 + */ + void setScaleColor (QColor scaleColor, bool run=false); + + +/** + * Sets type of digital processing of pointer. 0 nothing. 1 fast antialiasing, 2 slow antialiasing, 3 blur motion + fast antialiasing, 4 blur motion + slow antialiasing. + * + * @param qualityOfPointer determine quality of pointer's digital procesing + * @param run = TRUE makes immediately repaint of panel + * @param run = TRUE provede okamzite prekresleni panelu. + * + * @since 0.1 + */ + void setDigitalProcesing (int qualityOfPointer, bool run =false ); + + + +/** + * Sets pointer on value pointerValue. + * Posune rucicku na hodnotu pointerValue. + * + * @param pointerValue Urcuje hodnotu na jakou bude nastavena rucicka. + * @param run = TRUE makes immediately repaint of panel + * @param run = TRUE provede okamzite prekresleni panelu. + * + * @since 0.1 + */ + void setPointer (double pointerValue, bool run=true ); + + +/** + * Const. determines width of analog panel in points + * Konstanta, udava velikost analogoveho panelu v bodech. + * + * @since 0.1 + */ + static const int AnalogWidth = 130; + + + public slots: + +/** + * Sets font of scale, change is doing immediately + * Nastavi font stupnice, zmena je provedena okamzite. + * + * @param newScaleFont Urcuje novy font hodnot stupnice. + * @param newScaleFont Urcuje novy font hodnot stupnice. + * + * @since 0.1 + */ + void slotSetScaleFont(QFont newScaleFont); + + +/** + * Sets font of text. change is doing immediately. + * Nastavi font textu, zmena je provedena okamzite. + * + * @param newTextFont Urcuje novy font pro texty. + * + * @since 0.1 + */ + void slotSetTextFont(QFont newTextFont); + + +/** + * Nastavi font stupnice a textu, zmena je provedena okamzite. + * + * @param newTextFont Urcuje novy font pro texty a hodnoty stupnice. + * + * @since 0.1 + */ + void slotSetAllFont(QFont newAllFont); + + +/** + * Repaint layer of backgroud and layer of pointer, + * all panel will be repainted + * Da povel k prekreseni urovne pozadi a urovne rucicky. + * To znamena, ze bude prekreslen kompletne cely panel. + * + * @since 0.1 + */ + void repaintAll (void); + + + protected: + virtual void resizeEvent( QResizeEvent * ); + virtual void paintEvent( QPaintEvent * ); + + private: + + +/** + * @internal + */ + void paintBackGround ( void ); + + +/** + * @internal + */ + void paintPointer ( void ); + + +/** + * @internal + */ + void paintPointerSlowly ( double position, int centerX , int centerY, int widthOfCircle); + +/** + * @internal + */ + void paintPointerFastly ( double position); + + +/** + * @internal + */ + void paintPartOfCircle ( QPainter *paint, int centerX , int centerY, int widthOfCircle ); + + +/** + * @internal + */ + void paintScale ( QPainter *paint , int centerX , int centerY, int widthOfCircle); + + +/** + * @internal + */ + void makeAntialiasing (QImage* myImage, QPixmap* smallPixmap, const QRgb colorOfBG, speedOfAAlias speed = slow , int typeOfView = 0); + + +/** + * @internal + */ + void makeMotionBlur (QImage* myImage, const QRgb colorOfBG, int typeOfView = 0); + + +/** + * @internal + */ + void paintScaleNumbers ( QPainter *paint ); + +/** + * @internal + */ + void paintText ( QPainter *paint ); + + +/** + * @internal + */ + void paintValueOfPointer ( QPainter *p, double value); + + + + static const int m_widthOfBackGround = 122; + static const int m_startOfBackGround = 4; + + bool m_showBackGround; + bool m_showPointer; + + int m_bottomLimit; + int m_topLimit; + int m_typeOfView; // udava typ meraku + int m_countOfParts; // pocet policek na stupnici + int m_countOfSubParts; // pocet dilku v policku na stupnici + QColor m_pointerColor, m_scaleColor, m_textColor; // colors of pointer, text and scale + + QColor m_arcColors[9]; + QString m_inscription; + QString AnMJ; + int m_countOfColorParts; // count of color parts on scale + double m_valueOfPointer; // position of pointer; + double m_angleOfViewer, m_startAngle; //pocatecni_uhel; + int m_centerX; + int m_centerY; + int m_direction; + int m_widthOfScale; + int m_radiusOfScaleNumbers; + + + speedOfAAlias m_speedOfAAlias; + bool m_makeBlurMotion; + + QFont m_scaleFont; + QFont m_textFont; + + QPixmap *m_wholeLayer; + + QPixmap *m_backgroudLayerBig; + + + QPixmap *m_scaleLayerBig; + QPixmap *m_scaleLayerSmall; + + QPixmap *m_pointerLayerBig; + QPixmap *m_pointerLayerSmall; + + + extentOfDyeDef m_extentOfDye[5]; + + QMutex m_pointerMutex; +}; + + +#endif diff --git a/src/knutclient.cpp b/src/knutclient.cpp new file mode 100755 index 0000000..f7d7157 --- /dev/null +++ b/src/knutclient.cpp @@ -0,0 +1,1237 @@ +/*************************************************************************** + knutclient.cpp - description + ------------------- + begin : Út srp 21 19:12:20 CEST 2001 + copyright : (C) 2001 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "knutupsdata.h" +#include "knutvardata.h" +#include "knutprefdlg.h" +#include "knutprintupsvar.h" +#include "knutinstcomms.h" +#include "knutrwvar.h" +#include "knutclient.h" + +#include +#include + +#include +#include + +#include + +#include // for function sleep and other ... + +//#include + + + + +// const char *nameUpsVars1[] = { +// "NONE", "UTILITY", "BATTPCT", "UPSTEMP", "ACFREQ", "LOADPCT", "AMBTEMP", "AMBHUMID","BATTVOLT","OUTVOLT",CURRENT}; +// const char *nameUpsVars2[] = { +// "none", "input.voltage", "battery.charge", "ups.temperature", "input.frequency", "ups.load", "ambient.temperature", +//"ambient.humidity","battery.voltage","output.voltage","output.current","battery.temperature","battery.current"}; + + extern const char *nameUpsVars1[]; + extern const char *nameUpsVars2[]; + +KNutClient::KNutClient(bool noDock, QObject* parent, const char *name) : QObject(parent, name) { + + upsRecords = new KNutUpsData(); + analogRecords = new KNutVarData(); + + m_upsTimer = new QTimer (this); + connect( m_upsTimer, SIGNAL(timeout()), SLOT(slotTimeout()) ); + + m_reconnectTimer = new QTimer(this); + connect( m_reconnectTimer, SIGNAL(timeout()), SLOT(slotReconnectTimeout()) ); + + + // data for combo + m_listKNutEvent = new QStringList(); + + // init and load of configuration + initVars(); + + loadConfiguration(); + + if (!noDock) { + m_myDock = new KNutDock(&m_mainUpsInfo,&settingData,upsRecords); + + m_myDock->show(); + connect(m_myDock, SIGNAL(endApplication()), this, SLOT(slotExitApplication())); + connect(m_myDock, SIGNAL(activeMainWindow()), this, SLOT(slotActiveMainWindow())); + connect(m_myDock, SIGNAL(minimize()), this, SLOT(closeMainWindow())); + connect(m_myDock, SIGNAL(UPSChanged(QString)), this, SLOT(slotSetNewUPS (QString))); + + connect(m_myDock, SIGNAL(preferences()),this, SLOT(slotPreferenceUps())); + connect(m_myDock, SIGNAL(printUPSVars()),this, SLOT(slotPrintUPSVars())); + connect(m_myDock, SIGNAL(instComms()),this, SLOT(slotInstComms())); + connect(m_myDock, SIGNAL(RWVars()),this, SLOT(slotRWVars())); + connect(m_myDock, SIGNAL(makeRefreshConnection()),this, SLOT(slotRefreshConnection())); + } + + addEventString(i18n("Ready.")); + + + // nastavime data pro vybranou polozku + // sets data for selected item + setActiveUpsInfo(m_mainUpsInfo.record.name); + + // sets mainUpsInfo.oldState to const value KNutNet::initStatus + m_mainUpsInfo.oldState=KNutNet::initState; + + + //makes connect to UPS, connection is non blocking operation + //we have to use signal firstConnection and connectionError from KNutNet class + m_mainUpsInfo.upsNet = new KNutNet( m_mainUpsInfo.record.upsAddress, m_mainUpsInfo.record.upsName, m_mainUpsInfo.record.port,5,200); + + + connect(m_mainUpsInfo.upsNet, SIGNAL(firstConnection(void)),this, SLOT(slotFirstConnection(void))); + connect(m_mainUpsInfo.upsNet, SIGNAL(connectionError(int)),this, SLOT(slotErrorConnection(int))); + connect(m_mainUpsInfo.upsNet, SIGNAL(connectionClosed(void )),this, SLOT(slotConnectionClosed(void))); + connect(m_mainUpsInfo.upsNet, SIGNAL(tryFirstConnection(int )),this, SLOT(slotTryFirstConnection(int))); + connect(m_mainUpsInfo.upsNet, SIGNAL(tryRepeatFirstConnection(int )),this, SLOT(slotTryReepatFirstConnection( int ))); + + +// state of connection to usbd, this isn't state of knutnet +// if (mainUpsInfo.record.upsName !="") { +// mainUpsInfo.upsDriverState=knc::connecting; + // } + // else mainUpsInfo.upsDriverState=knc::notConnected; + + // repaints the dock + if (m_myDock) m_myDock->clearDockValues(); + + if (settingData.useMainWindow == KNutVarData::mw_yes || noDock || + (settingData.useMainWindow == KNutVarData::mw_auto && settingData.activatedMainWindow )) makeMainWindow (); + + if (m_myDock) m_myMessMan = new KNutMessageManager(this); + + //tries connecting to server + m_mainUpsInfo.upsDriverState=knc::connecting; + m_mainUpsInfo.upsNet->open(); + } + + +KNutClient::~KNutClient(void) { + + if (m_myMessMan) delete m_myMessMan; + + // melo by uz byt zruseno - jistota + if (m_myDock) { m_myDock->close(); m_myDock=0l;} + + if (m_mainUpsInfo.upsNet) { + // melo by uz byt zruseno - jistota + delete m_mainUpsInfo.upsNet; + m_mainUpsInfo.upsNet = 0; + } + m_listKNutEvent->clear(); + delete m_listKNutEvent; + + // melo by uz byt zruseno - jistota + if (mainWindow) delete mainWindow; + + delete upsRecords; + delete analogRecords; + } + + + +void KNutClient::slotTryFirstConnection (int maxCount) { +//qDebug ("KNutClient::slotTryFirstConnection"); + +//knutNet begin the first test of connection (connectToHost will be made after emiting signal tryFirstConnection ) +// repaints icon + if (m_myDock) m_myDock->repaintDock(true); + if (mainWindow) mainWindow->startConnectPB(maxCount); + } + + +void KNutClient::slotTryReepatFirstConnection (int number ) { +//qDebug ("KNutClient::slotTryFirstConnection"); +//knutNet begin nexts test of connection + + if (mainWindow) mainWindow->setProgressConnectPB (number); + } + + + +void KNutClient::slotFirstConnection (void) { +//qDebug ("sKNutClient::slotFirstConnection"); +//TCP - UDP connection to server was made + + bool reconnecting = m_mainUpsInfo.reconnecting; + + + m_mainUpsInfo.reconnecting =false; + m_reconnectTimer->stop(); + + m_mainUpsInfo.nutVariables = m_mainUpsInfo.upsNet->getNutVariables(); + m_mainUpsInfo.nutProtocol = m_mainUpsInfo.upsNet->getNutProtocol(); + + if (mainWindow) mainWindow->hideConnectPB(); + + + // reads UPS's variables + + int countRevision = 2; // pocet max opakovani po kterych muzeme zjistovat hodnoty + do { + if (!(m_mainUpsInfo.netError = m_mainUpsInfo.upsNet->getUpsVars())) break; + if (!(m_mainUpsInfo.netError)) break; // no error + if (m_mainUpsInfo.netError == KNutNet::UnknownUps) break; + if (m_mainUpsInfo.netError == KNutNet::DriverNotConnected) break; + countRevision--; + if (countRevision) sleep (2); + } + while (countRevision); + + if (m_mainUpsInfo.netError) { + m_mainUpsInfo.errorUpsData=true; + // mainUpsInfo.upsDriverState is state of connection to usbd, this isn't state of knutnet + if (m_mainUpsInfo.netError == KNutNet::DriverNotConnected) + m_mainUpsInfo.upsDriverState=knc::notConnected; + else + m_mainUpsInfo.upsDriverState=knc::error; + + if (m_myDock) m_myDock->repaintDock(true); + addEventString (KNutVarData::errorToText(m_mainUpsInfo.netError),m_mainUpsInfo.record.name); +// KNutVarData::showError (mainUpsInfo.netError); + if ((m_myMessMan)) m_myMessMan->addMessage(KNutVarData::errorToText(m_mainUpsInfo.netError),knc::errorLevel,true); + } + else { + + if (reconnecting) { + addEventString(i18n("The connection was renewed."),m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(i18n("The connection was renewed."),knc::errorLevel,true,true); + } + + + m_mainUpsInfo.upsDriverState=knc::connected; + m_mainUpsInfo.errorUpsData=false; + + switch (m_mainUpsInfo.nutVariables) { // type of variables, old or new (with dot) + case 1: +//qDebug ("sKNutClient::slotFirstConnection - var 1"); + if (!(m_mainUpsInfo.upsNet->existName("BATT_RUNTIME"))) m_mainUpsInfo.runtimeVar="BATT_RUNTIME"; + else m_mainUpsInfo.runtimeVar="RUNTIME"; + m_mainUpsInfo.upsLoadVar="LOADPCT"; + m_mainUpsInfo.lowxferVar="LOWXFER"; + m_mainUpsInfo.highxferVar="HIGHXFER"; + m_mainUpsInfo.statusVar="STATUS"; + break; + case 2: +//qDebug ("sKNutClient::slotFirstConnection - var 2"); + m_mainUpsInfo.runtimeVar="battery.runtime"; + m_mainUpsInfo.upsLoadVar="ups.load"; + m_mainUpsInfo.lowxferVar="input.transfer.low"; + m_mainUpsInfo.highxferVar="input.transfer.high"; + m_mainUpsInfo.statusVar="ups.status"; + } + + + if ((settingData.useDescription) && (!m_mainUpsInfo.upsNet->isDescription())) m_mainUpsInfo.upsNet->getDescription(); + // test presunut do setActiveUpsVars + if (mainWindow) setActiveUpsVars(true); + else setActiveUpsVars(false); + + // repaints main window and dock immediately + if (mainWindow) mainWindow->showUpsData(); +// if (myDock) myDock->repaintDock(mainUpsInfo.netError,true); // dock is repainting always + if (m_myDock) m_myDock->repaintDock(true); // dock is repainting always + + m_panelsAreZeroing=false; // analog panels isn't setting to zero + } + if ((m_mainUpsInfo.upsNet->getState() == KNutNet::Connected) && (!m_mainUpsInfo.errorUpsData)) { + showStatusEvent(); + // getUpsVars loads informations about variables, but their values too + m_upsTimer->start( m_mainUpsInfo.record.delay, TRUE ); // nastartujeme casovac - starts timer + } + } + + +void KNutClient::slotErrorConnection (int error) { + +//qDebug ("KNutClient::slotErrorConnection (1)"); + + if (mainWindow) mainWindow->hideConnectPB(); + + m_mainUpsInfo.netError = error; + m_mainUpsInfo.errorUpsData=true; + if (m_mainUpsInfo.netError == KNutNet::DriverNotConnected) + m_mainUpsInfo.upsDriverState=knc::notConnected; + else + m_mainUpsInfo.upsDriverState=knc::error; + if (m_myDock) m_myDock->repaintDock(true); + + if (m_mainUpsInfo.reconnecting) { +//qDebug ("KNutClient::slotErrorConnection (2)"); + m_mainUpsInfo.reconnectCount++; + if (m_mainUpsInfo.reconnectCount > countNextConnDelay) m_mainUpsInfo.reconnectCount = countNextConnDelay; + + addEventString(i18n("The connection failed. The next connection will make after %1 sec.").arg(nextConnDelay[m_mainUpsInfo.reconnectCount-1]),m_mainUpsInfo.record.name); + m_reconnectTimer->start( nextConnDelay[m_mainUpsInfo.reconnectCount-1]*1000, TRUE ); // starts reconnect timer again + } + else { +//qDebug ("KNutClient::slotErrorConnection (3)"); + addEventString (KNutVarData::errorToText(m_mainUpsInfo.netError),m_mainUpsInfo.record.name); +// KNutVarData::showError (mainUpsInfo.netError); + if ((m_myMessMan)) m_myMessMan->addMessage(KNutVarData::errorToText(m_mainUpsInfo.netError),knc::errorLevel,true); + + + } + } + + + +void KNutClient::initVars (void) { +// Nasledujici data jsou nastavena pri natazeni konfigurace +//Next data is setted when konfiguration is loaded + settingData.panelFlags = KNutFrontPanel::DefaultPanelFlags; // informace v hlavnim panelu // information in main panel + settingData.toolTipFlags = KNutDock::DefaultToolTipFlags; // informace v hlavnim panelu // information in main panel + + m_mainUpsInfo.record.name=""; + m_mainUpsInfo.upsNet=0L; + m_mainUpsInfo.netError=0; // no error zadna chyba + m_mainUpsInfo.name=""; + m_mainUpsInfo.password=""; + m_mainUpsInfo.errorUpsData=false; + m_mainUpsInfo.nutVariables=0; + m_mainUpsInfo.runtimeVar=""; + m_mainUpsInfo.lowxferVar=""; + m_mainUpsInfo.highxferVar=""; + m_mainUpsInfo.statusVar=""; + m_mainUpsInfo.upsLoadVar=""; + m_mainUpsInfo.upsDriverState=knc::notConnected; + m_mainUpsInfo.reconnectCount = 1; + m_mainUpsInfo.reconnecting = false; + + m_panelsAreZeroing=false; + m_lastError=0; // no error + + + mainWindow=0; + m_myDock=0; + m_myMessMan=0; + settingData.activatedMainWindow=false; + } + + + void KNutClient::loadConfiguration ( void ) { + + QString groupName; + KNutUpsData::upsRecordDef upsData; // structure includes informations about UPS // struktura obsahuje udaje o UPS + QFont appFont = kapp->font(); // systemovy font pri startu + kapp->config()->setGroup (""); + settingData.areYouSure=kapp->config()->readBoolEntry("AreYouSure",FALSE); + + int helpInt=kapp->config()->readNumEntry("UseMainWindow",TRUE); + +//std::cout << "readNumEntry " << helpInt << "--" << std::endl; + switch (helpInt) { + case 0 : settingData.useMainWindow=KNutVarData::mw_yes;break; + case 1 : settingData.useMainWindow=KNutVarData::mw_no;break; + default : settingData.useMainWindow=KNutVarData::mw_auto;break; + } + + + settingData.useMessageWindow=kapp->config()->readBoolEntry("UseMessageWindow",FALSE); + settingData.activatedMainWindow=kapp->config()->readBoolEntry("PreviousMainWindow",FALSE); + settingData.x=kapp->config()->readNumEntry("PosX",0); + settingData.y=kapp->config()->readNumEntry("PosY",0); + settingData.width=kapp->config()->readNumEntry("Width",300); + settingData.height=kapp->config()->readNumEntry("Height",200); + settingData.useDescription=kapp->config()->readBoolEntry("UseDescription",FALSE); + settingData.countCols=kapp->config()->readNumEntry("NumberOfCols",knc::DefaultCountCols); + settingData.panelFlags=kapp->config()->readUnsignedNumEntry("PanelFlags",KNutFrontPanel::DefaultPanelFlags); + settingData.inputFrequency=kapp->config()->readNumEntry("InputFrequency",knc::DefaultInputFrequency); + settingData.inputVoltage=kapp->config()->readNumEntry("InputVoltage",knc::DefaultInputVoltage); + settingData.lowHighXfer=kapp->config()->readBoolEntry("LowHighXfer",FALSE); + settingData.customFont=kapp->config()->readBoolEntry("CustomFont",FALSE); + settingData.aPanelFont=kapp->config()->readFontEntry("AnalogPanelFont",&appFont); + settingData.mPanelFont=kapp->config()->readFontEntry("MainPanelFont",&appFont); + int upsCount=kapp->config()->readNumEntry("NumberOfUpsRecords",0); + settingData.customBColor=kapp->config()->readBoolEntry("CustomBColor",FALSE); + settingData.mainBackgroundColor=kapp->config()->readColorEntry ("MainBackGroundColor",& DEFAULT_BG_COLOR); + settingData.customBPanelColor=kapp->config()->readBoolEntry("CustomBPanelColor",FALSE); + settingData.customBAnalogColor=kapp->config()->readBoolEntry("CustomBAnalogColor",FALSE); + settingData.customOAnalogColor=kapp->config()->readBoolEntry("CustomOAnalogColor",FALSE); + settingData.mPanelBackgroundColor=kapp->config()->readColorEntry ("MPanelBackGroundColor",& DEFAULT_BG_COLOR); + settingData.aPanelBackgroundColor=kapp->config()->readColorEntry ("APanelBackGroundColor",& DEFAULT_BG_COLOR); + settingData.analogFingerColor=kapp->config()->readColorEntry ("AnalogFingerColor",& DEFAULT_FINGER_COLOR); + settingData.analogOKColor=kapp->config()->readColorEntry ("AnalogOKColor",& DEFAULT_OK_COLOR); + settingData.analogWarnningColor=kapp->config()->readColorEntry ("AnalogWarnningColor",& DEFAULT_WARNNING_COLOR); + settingData.analogErrorColor=kapp->config()->readColorEntry ("AnalogErrorColor",& DEFAULT_ERROR_COLOR); + settingData.analogScaleColor=kapp->config()->readColorEntry ("AnalogScaleColor",& DEFAULT_SCALE_COLOR); + settingData.analogFontColor=kapp->config()->readColorEntry ("AnalogFontColor",& DEFAULT_FONT_COLOR); + settingData.toolTipFlags=kapp->config()->readUnsignedNumEntry("ToolTipFlags",KNutDock::DefaultToolTipFlags); + settingData.customKIconColor=kapp->config()->readBoolEntry("CustomKIconColor",FALSE); + settingData.kIconBackgroundColor=kapp->config()->readColorEntry ("KIconBackGroundColor",& DEFAULT_KICON_COLOR); + settingData.typeOfKIcon=kapp->config()->readBoolEntry("TypeOfKIcon", KNutDock::pictureKI); + settingData.typeDigitalProcessing=kapp->config()->readNumEntry("DigitalProcessingOfPointers", 2); + + + m_mainUpsInfo.record.name=kapp->config()->readEntry("ActiveUps",""); + + + for (int i = 0; i < upsCount; i++) { + groupName.sprintf ("UPS %d",i); + kapp->config()->setGroup (groupName); + if ((upsData.name = kapp->config()->readEntry ("Name")) != QChar::null) { + // record exist, we will go next part + //if ActiveUps is empty, we use name of first ups from ups list + if ((m_mainUpsInfo.record.name.isEmpty()) && (!(upsData.name.isEmpty()))) + m_mainUpsInfo.record.name = upsData.name; + upsData.upsName = kapp->config()->readEntry ("UpsName",""); + if (((upsData.upsAddress = kapp->config()->readEntry ("UpsAddress")) != QChar::null) + || (( upsData.upsAddress == QChar::null) && (upsData.upsName != QChar::null ))) { + + // only for backwards compatibility with older release then 0.7 + if (upsData.upsAddress.isEmpty()) { + int charPos; + if ((charPos=upsData.upsName.find('@')) == -1) { + upsData.upsAddress=upsData.upsName; + upsData.upsName=""; + } + else { + upsData.upsAddress=upsData.upsName.mid(charPos+1); + upsData.upsName=upsData.upsName.left(charPos); + } + } + // zaznam existuje pokracujeme dale a nacteme zbytek hodnotet + // record exists, we go next and will read rest of values + upsData.delay = kapp->config()->readNumEntry("Delay",knc::DefaultDelay); + upsData.port = (unsigned short)kapp->config()->readNumEntry("Port",knc::DefaultPort); + upsData.userName=kapp->config()->readEntry("UserName",""); + upsData.password=kapp->config()->readEntry("Password",""); + upsData.savePassword=kapp->config()->readBoolEntry("SavePassword",false); + for (int j=0; j < knc::NumberOfVars; j++) { + groupName.sprintf ("Var %d",j); + upsData.upsVarCode[j]=kapp->config()->readNumEntry (groupName,0); + if ((upsData.upsVarCode[j] < 0) || (upsData.upsVarCode[j] > knc::NumberOfTypes)) + upsData.upsVarCode[j] = 0; + } + upsRecords->add (upsData); + } + } + } + } + +void KNutClient::saveConfiguration ( bool all ) { + QString groupName; + QString codeName; + KNutUpsData::upsRecordDef upsData; // struktura obsahuje udaje o UPS // structure includes information about UPS + int upsCount = upsRecords->getCount(); + + kapp->config()->setGroup (""); + + if (all) { + kapp->config()->writeEntry ("DigitalProcessingOfPointers",settingData.typeDigitalProcessing); + kapp->config()->writeEntry ("TypeOfKIcon",settingData.typeOfKIcon); + kapp->config()->writeEntry ("KIconBackGroundColor",settingData.kIconBackgroundColor); + kapp->config()->writeEntry ("CustomKIconColor",(settingData.customKIconColor)); + kapp->config()->writeEntry ("ToolTipFlags",(settingData.toolTipFlags)); + } + + //if name of active ups isn't knowly, will use name of the firt ups from ups list + if ((m_mainUpsInfo.record.name.isEmpty()) && (upsCount > 0)) { + upsRecords->get(0,upsData); + kapp->config()->writeEntry ("ActiveUps",upsData.name); + } + else kapp->config()->writeEntry ("ActiveUps",(QString)m_mainUpsInfo.record.name); // + + if (all) { + kapp->config()->writeEntry ("AnalogFontColor",settingData.analogFontColor); + kapp->config()->writeEntry ("AnalogScaleColor",settingData.analogScaleColor); + kapp->config()->writeEntry ("AnalogErrorColor",settingData.analogErrorColor); + kapp->config()->writeEntry ("AnalogWarnningColor",settingData.analogWarnningColor); + kapp->config()->writeEntry ("AnalogOKColor",settingData.analogOKColor); + kapp->config()->writeEntry ("AnalogFingerColor",settingData.analogFingerColor); + kapp->config()->writeEntry ("APanelBackGroundColor",settingData.aPanelBackgroundColor); + kapp->config()->writeEntry ("MPanelBackGroundColor",settingData.mPanelBackgroundColor); + kapp->config()->writeEntry ("MainBackGroundColor",settingData.mainBackgroundColor); + kapp->config()->writeEntry ("NumberOfUpsRecords",upsCount); + kapp->config()->writeEntry ("CustomFont",settingData.customFont); + kapp->config()->writeEntry ("AnalogPanelFont",settingData.aPanelFont); + kapp->config()->writeEntry ("MainPanelFont",settingData.mPanelFont); + kapp->config()->writeEntry ("CustomBColor",(settingData.customBColor)); + kapp->config()->writeEntry ("CustomBPanelColor",(settingData.customBPanelColor)); + kapp->config()->writeEntry ("CustomBAnalogColor",(settingData.customBAnalogColor)); + kapp->config()->writeEntry ("CustomOAnalogColor",(settingData.customOAnalogColor)); + kapp->config()->writeEntry ("LowHighXfer",(settingData.lowHighXfer)); + kapp->config()->writeEntry ("InputVoltage",(settingData.inputVoltage)); + kapp->config()->writeEntry ("InputFrequency",(settingData.inputFrequency)); + kapp->config()->writeEntry ("PanelFlags",(settingData.panelFlags | 3)); + kapp->config()->writeEntry ("NumberOfCols",settingData.countCols); + kapp->config()->writeEntry ("UseDescription",settingData.useDescription); + kapp->config()->writeEntry ("AreYouSure",settingData.areYouSure); + kapp->config()->writeEntry ("UseMainWindow",settingData.useMainWindow); + kapp->config()->writeEntry ("UseMessageWindow",settingData.useMessageWindow); + } + + kapp->config()->writeEntry ("Height",settingData.height); // + kapp->config()->writeEntry ("Width",settingData.width); // + kapp->config()->writeEntry ("PosY",settingData.y); // + kapp->config()->writeEntry ("PosX",settingData.x); // + kapp->config()->writeEntry ("PreviousMainWindow",settingData.activatedMainWindow); + + if (all) { + for (int i=0; iconfig()->setGroup (groupName); + upsRecords->get(i,upsData); + kapp->config()->writeEntry ("Port",upsData.port); + kapp->config()->writeEntry ("Delay",upsData.delay); + kapp->config()->writeEntry ("UpsAddress",upsData.upsAddress); + kapp->config()->writeEntry ("UpsName",upsData.upsName); + kapp->config()->writeEntry ("Name",upsData.name); + if (upsData.savePassword) { + kapp->config()->writeEntry ("UserName",upsData.userName); + kapp->config()->writeEntry ("Password",upsData.password); + } + kapp->config()->writeEntry ("SavePassword",upsData.savePassword); + for (int j=0; j < knc::NumberOfVars; j++) { + groupName.sprintf ("Var %d",j); + kapp->config()->writeEntry (groupName,upsData.upsVarCode[j]); + } + kapp->config()->setGroup (""); + } + } + kapp->config()->sync(); + } + + +bool KNutClient::commitData (QSessionManager&) { + + saveConfiguration(false); + return true; + } + + bool KNutClient::saveState (QSessionManager&) { + + saveConfiguration(false); + return true; + } + + + +void KNutClient::upsActivate (void) { + +//qDebug ("KNutClient::upsActivate"); + + m_mainUpsInfo.upsNet = new KNutNet( m_mainUpsInfo.record.upsAddress,m_mainUpsInfo.record.upsName,m_mainUpsInfo.record.port,0,1); + if (m_mainUpsInfo.upsNet->getState() != KNutNet::Connected) { + m_mainUpsInfo.netError=m_mainUpsInfo.upsNet->getError(); // aktivace ups skoncila s chybou +// KNutVarData::showError(mainUpsInfo.netError); + + if ((m_myMessMan)) m_myMessMan->addMessage(KNutVarData::errorToText(m_mainUpsInfo.netError),knc::errorLevel,true); + + + m_mainUpsInfo.errorUpsData=true; + m_mainUpsInfo.upsDriverState=knc::notConnected; + } + else { + if (m_mainUpsInfo.upsNet->switchedToTCP()) + addEventString (i18n("upsd > 1.2 doesn't support UDP. Connection is switched to TCP"),m_mainUpsInfo.record.name); + m_mainUpsInfo.nutVariables = m_mainUpsInfo.upsNet->getNutVariables(); + m_mainUpsInfo.nutProtocol = m_mainUpsInfo.upsNet->getNutProtocol(); + + int countRevision = 2; // pocet max opakovani po kterych muzeme zjistovat hodnoty + do { + if (!(m_mainUpsInfo.netError = m_mainUpsInfo.upsNet->getUpsVars())) break; + if (m_mainUpsInfo.netError == KNutNet::UnknownUps) break; + if (m_mainUpsInfo.netError == KNutNet::DriverNotConnected) break; + countRevision--; + if (countRevision) sleep (2); + } + while (countRevision); + + if (m_mainUpsInfo.netError) { + addEventString (KNutVarData::errorToText(m_mainUpsInfo.netError),m_mainUpsInfo.record.name); +// KNutVarData::showError (mainUpsInfo.netError); + + if ((m_myMessMan)) m_myMessMan->addMessage(KNutVarData::errorToText(m_mainUpsInfo.netError),knc::errorLevel,true); + + m_mainUpsInfo.errorUpsData=true; + if (m_mainUpsInfo.netError == KNutNet::DriverNotConnected) + m_mainUpsInfo.upsDriverState=knc::notConnected; + else + m_mainUpsInfo.upsDriverState=knc::error; + } + else { + m_mainUpsInfo.upsDriverState=knc::connected; + + switch (m_mainUpsInfo.nutVariables) { + case 1: + if (!(m_mainUpsInfo.upsNet->existName("BATT_RUNTIME"))) m_mainUpsInfo.runtimeVar="BATT_RUNTIME"; + else m_mainUpsInfo.runtimeVar="RUNTIME"; + m_mainUpsInfo.upsLoadVar="LOADPCT"; + m_mainUpsInfo.lowxferVar="LOWXFER"; + m_mainUpsInfo.highxferVar="HIGHXFER"; + m_mainUpsInfo.statusVar="STATUS"; + break; + case 2: + m_mainUpsInfo.runtimeVar="battery.runtime"; + m_mainUpsInfo.upsLoadVar="ups.load"; + m_mainUpsInfo.lowxferVar="input.transfer.low"; + m_mainUpsInfo.highxferVar="input.transfer.high"; + m_mainUpsInfo.statusVar="ups.status"; + } + + if ((settingData.useDescription) && (!m_mainUpsInfo.upsNet->isDescription())) m_mainUpsInfo.upsNet->getDescription(); + // test presunut do setActiveUpsVars + if (mainWindow) setActiveUpsVars(true); + else setActiveUpsVars(false); + } + } + } + +void KNutClient::upsDeactivate (void) { + + // this function isn't interuptable function +// upsDeactivateMutex.lock(); + QMutexLocker upsDeactivateLocker( &m_upsDeactivateMutex ); + m_mainUpsInfo.upsNet->close(); // close connection + // state of connection to usbd, this isn't state of knutnet + m_mainUpsInfo.upsDriverState=knc::notConnected; + m_mainUpsInfo.netError=0; // no error + m_mainUpsInfo.nutVariables=0; +// upsDeactivateMutex.unlock(); + } + +void KNutClient::setActiveUpsVars (bool mWindow) { + // nastavujeme jen pokud existuji nejake promene + if ( m_mainUpsInfo.upsNet->readNumberVars() > 0) { + // deaktivujeme veskere promene + m_mainUpsInfo.upsNet->unSetActivateAll(); + + if (mWindow) { + for (int j=0; j < knc::NumberOfVars; j++) { + switch (m_mainUpsInfo.nutVariables) { + case 1: + if (m_mainUpsInfo.record.upsVarCode[j] != 0 ) m_mainUpsInfo.upsNet->setActivate(nameUpsVars1[m_mainUpsInfo.record.upsVarCode[j]]); + break; + case 2: + if (m_mainUpsInfo.record.upsVarCode[j] != 0 ) m_mainUpsInfo.upsNet->setActivate(nameUpsVars2[m_mainUpsInfo.record.upsVarCode[j]]); + break; + } + } + } + m_mainUpsInfo.upsNet->setActivate(m_mainUpsInfo.runtimeVar); //runtime je vzdy pridano v merenym polozkam + if (m_myDock) m_mainUpsInfo.upsNet->setActivate(m_mainUpsInfo.upsLoadVar); + // status se nastavi vzdy + m_mainUpsInfo.upsNet->setActivate(m_mainUpsInfo.statusVar); + // xfer se nastavi vzdy pokud existuje + // podrebujeme ho znat jeste pred startem a pak behen behu programu + setActiveXFerVars(true); + } + } + + +void KNutClient::setActiveXFerVars (bool activate) { + if (activate) { + // podkud neexistuje jedna z promenych neaktivujeme ani jednu + if (!(m_mainUpsInfo.upsNet->setActivate(m_mainUpsInfo.lowxferVar))) + if (m_mainUpsInfo.upsNet->setActivate(m_mainUpsInfo.highxferVar)) + m_mainUpsInfo.upsNet->unSetActivate(m_mainUpsInfo.lowxferVar); + } + else { + m_mainUpsInfo.upsNet->unSetActivate(m_mainUpsInfo.lowxferVar); + m_mainUpsInfo.upsNet->unSetActivate(m_mainUpsInfo.highxferVar); + } + } + +void KNutClient::setActiveUpsInfo (QString name) { + //presuneme jmena z databaze ups-ek - je nahrana z config. souboru + KNutUpsData::upsRecordDef* upsRecordPointer; + + if ((!name.isNull()) && (!name.isEmpty()) && ((upsRecordPointer = upsRecords->findName(name)) != 0L)) { + + m_mainUpsInfo.record.upsName = upsRecordPointer->upsName; + m_mainUpsInfo.record.upsAddress = upsRecordPointer->upsAddress; + m_mainUpsInfo.record.delay = upsRecordPointer->delay; + m_mainUpsInfo.record.port = upsRecordPointer->port; +// mainUpsInfo.record.tcp = upsRecordPointer->tcp; + m_mainUpsInfo.record.userName = upsRecordPointer->userName; + m_mainUpsInfo.record.password = upsRecordPointer->password; + for (int i =0; i < knc::NumberOfVars; i++) m_mainUpsInfo.record.upsVarCode[i] = 0; // vynulujeme polozky + int ii = 0; + for (int i =0; i < knc::NumberOfVars; i++) + if (upsRecordPointer->upsVarCode[i]>0) m_mainUpsInfo.record.upsVarCode[ii++] = upsRecordPointer->upsVarCode[i]; + } + } + + +void KNutClient::getUpsData (void) { + int runNetError; + +//qDebug("KNutClient::getUpsData"); + + //loads values for selected variables / activate values + if (!(runNetError=m_mainUpsInfo.upsNet->getUpsValues(false))) { // data from upsNet is ok + // we read all values of UPS + // nacetli jsme vsechny hodnoty pro ups + m_mainUpsInfo.netError=runNetError; + if (m_mainUpsInfo.errorUpsData) { // changes status from error to ok + m_mainUpsInfo.errorUpsData=false; + addEventString (i18n("Data OK"),m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(i18n("Data OK"),knc::errorLevel,true,true); + } + } + else { // data from upsNet isn't ok + m_mainUpsInfo.netError=runNetError; + if (!m_mainUpsInfo.errorUpsData) { //change status from ok to error + addEventString (KNutVarData::errorToText(runNetError), m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(KNutVarData::errorToText(runNetError),knc::errorLevel); + m_lastError=runNetError; + m_mainUpsInfo.errorUpsData=true; + } + else { + if (m_lastError != runNetError) { // change status from error to other error + addEventString (KNutVarData::errorToText(runNetError),m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(KNutVarData::errorToText(runNetError),knc::errorLevel); + m_lastError=runNetError; + } + } + } + } + + +void KNutClient::addEventString (const QString text, const QString UPSAddress) { + + if (mainWindow) + mainWindow->addComboStatusItem (text,UPSAddress); + else + { + QString dateTime(QDate::currentDate().toString()); + dateTime +=" " + QTime::currentTime().toString(); + if (UPSAddress.isEmpty()) m_listKNutEvent->append(dateTime+" "+text); + else m_listKNutEvent->append(dateTime+" "+UPSAddress+" : "+text); + if (m_listKNutEvent->count() > knc::maxCountKNutEvent) m_listKNutEvent->remove(m_listKNutEvent->begin()); + } + } + +/*********************************************************************************************/ +/* */ +/* PRIVATE SLOTS */ +/* */ +/*********************************************************************************************/ + + +void KNutClient::slotReconnectTimeout (void) { + + m_mainUpsInfo.netError=0; //clears netError + m_mainUpsInfo.upsDriverState=knc::connecting; + m_mainUpsInfo.upsNet->open(); + } + + + +void KNutClient::slotTimeout (void) { + + getUpsData(); + if (!m_mainUpsInfo.errorUpsData) { // no error + if (mainWindow) { + mainWindow->repaintPanel(); + mainWindow->repaintAnalogs(); + } + m_panelsAreZeroing=false; + showStatusEvent(); + } + else { // error + if ((mainWindow) && (!m_panelsAreZeroing)) mainWindow->zeroingPanels(); + m_panelsAreZeroing=true; + if (m_myDock) m_myDock->clearDockValues(); + } + if (m_myDock) m_myDock->repaintDock(); + m_upsTimer->start( m_mainUpsInfo.record.delay, TRUE ); // nastartujem znovu + } + + +void KNutClient::slotConnectionClosed(void) { +//qDebug("KNutClient::slotConnectionClosed"); + + m_mainUpsInfo.netError = KNutNet::ConnetionClosedByServer; + + m_upsTimer->stop(); + upsDeactivate(); + //sets netError this, because procedure upsDeactivate sets netError to zero + m_mainUpsInfo.netError = KNutNet::ConnetionClosedByServer; + + if (mainWindow) { + mainWindow->hideConnectPB(); + mainWindow->cleanPanels(); + } + if (m_myDock) { + // clears values of dock and set standard icon of dock + m_myDock->clearDockValues(); + } + + addEventString(i18n("The connection was closed by the second side (upsd)."),m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(i18n("The connection was closed by the second side (upsd)."),knc::errorLevel,true); + + m_mainUpsInfo.reconnecting = true; + m_mainUpsInfo.reconnectCount = 1; + m_reconnectTimer->start( nextConnDelay[0]*1000, TRUE ); // start timer for reconnect delay + } + +void KNutClient::showStatusEvent(void) { + + +//qDebug ("KNutClient::showStatusEvent"); + int myState = m_mainUpsInfo.upsNet->readStatus(); + if (myState != m_mainUpsInfo.oldState) { + + if ((myState & KNutNet::OFF) != (m_mainUpsInfo.oldState & KNutNet::OFF)) { + if (myState & KNutNet::OFF) { + addEventString(i18n("UPS is off."),m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(i18n("UPS is off."),knc::criticalLevel); + } + else { + addEventString(i18n("UPS is back on."),m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(i18n("UPS is back on."),knc::criticalLevel,true); + } + } + if ((myState & KNutNet::OL) != (m_mainUpsInfo.oldState & KNutNet::OL)){ + if (myState & KNutNet::OL) { + addEventString(i18n("Power is back online."),m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(i18n("Power is back online."),knc::warningLevel,true); + } + } + if ((myState & KNutNet::OB) != (m_mainUpsInfo.oldState & KNutNet::OB)) { + if (myState & KNutNet::OB) { + addEventString(i18n("UPS is on battery."),m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(i18n("UPS is on battery."),knc::warningLevel); + } + } + if ((myState & KNutNet::LB) != (m_mainUpsInfo.oldState & KNutNet::LB)) { + if (myState & KNutNet::LB) { + addEventString(i18n("UPS battery is low."),m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(i18n("UPS battery is low."),knc::criticalLevel); + } + else { + addEventString(i18n("UPS battery is OK."),m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(i18n("UPS battery is OK."),knc::criticalLevel,true); + } + } + if ((myState & KNutNet::RB) != (m_mainUpsInfo.oldState & KNutNet::RB)) { + if (myState & KNutNet::RB) { + addEventString(i18n("UPS battery is bad and needs be replaced."),m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(i18n("UPS battery is bad and needs be replaced."),knc::infoLevel); + } + } + if ((myState & KNutNet::OVER) != (m_mainUpsInfo.oldState & KNutNet::OVER)) { + if (myState & KNutNet::OVER) { + addEventString(i18n("UPS is overloaded."),m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(i18n("UPS is overloaded."),knc::lowWarningLevel); + } + else { + addEventString(i18n("UPS isn't overloaded."),m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(i18n("UPS isn't overloaded."),knc::lowWarningLevel,true); + } + } + if ((myState & KNutNet::CAL) != (m_mainUpsInfo.oldState & KNutNet::CAL)) { + if (myState & KNutNet::CAL) { + addEventString(i18n("UPS is performing calibration")+".",m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(i18n("UPS is performing calibration")+".",knc::infoLevel); + } + else { + addEventString(i18n("Calibration of UPS is ended."),m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(i18n("Calibration of UPS is ended."),knc::infoLevel,true); + } + } + if ((myState & KNutNet::BOOST) != (m_mainUpsInfo.oldState & KNutNet::BOOST)) { + if (myState & KNutNet::BOOST) { + addEventString(i18n("UPS is boosting incoming voltage."),m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(i18n("UPS is boosting incoming voltage."),knc::infoLevel); + } + else { + addEventString(i18n("Boosting of UPS is ended."),m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(i18n("Boosting of UPS is ended."),knc::infoLevel,true); + } + } + if ((myState & KNutNet::TRIM) != (m_mainUpsInfo.oldState & KNutNet::TRIM)) { + if (myState & KNutNet::TRIM) { + addEventString(i18n("UPS is trimming incoming voltage."),m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(i18n("UPS is trimming incoming voltage."),knc::infoLevel); + } + else { + addEventString(i18n("Trimming of UPS is ended."),m_mainUpsInfo.record.name); + if ((m_myMessMan) and (settingData.useMessageWindow)) m_myMessMan->addMessage(i18n("Trimming of UPS is ended."),knc::infoLevel,true); + } + } + m_mainUpsInfo.oldState=myState; + } + } + +void KNutClient::slotSetNewUPS (QString name) { + + m_mainUpsInfo.reconnecting =false; + m_reconnectTimer->stop(); + + if (name != m_mainUpsInfo.record.name) { + m_upsTimer->stop(); + upsDeactivate(); + + addEventString(i18n("Switched"),name); + if (m_myMessMan) m_myMessMan->deleteMessage(); + + m_mainUpsInfo.record.name=name; + m_mainUpsInfo.errorUpsData=false; + setActiveUpsInfo(m_mainUpsInfo.record.name); + + //new connection name and password are cleaned + m_mainUpsInfo.name = ""; + m_mainUpsInfo.password = ""; + + if (mainWindow) { + mainWindow->setCombo(name); +// mainWindow->showUpsData(); + mainWindow->cleanPanels(); + } + + if (m_myDock) { + // clears values of dock and set standard icon of dock + m_myDock->clearDockValues(); + m_myDock->setNewUPS(); // sets miniIcon in list of UPSes for selected UPS + } + + m_panelsAreZeroing=false; + m_lastError=0; // zadna chyba + m_mainUpsInfo.oldState=KNutNet::initState; // init variable of last UPS state + + // nova cast + + m_mainUpsInfo.upsNet->newUPS(m_mainUpsInfo.record.upsAddress,m_mainUpsInfo.record.upsName, m_mainUpsInfo.record.port); + // state of connection to usbd, this isn't state of knutnet + m_mainUpsInfo.upsDriverState=knc::connecting; + m_mainUpsInfo.upsNet->open(); + } + } + + +void KNutClient::slotPreferenceUps (void) { + + KNutPrefDlg* prefDlg = new KNutPrefDlg ( upsRecords, analogRecords, &settingData, m_mainUpsInfo.record.name ); // aktivujeme dialog pro preference + connect (prefDlg,SIGNAL(signalChangeConfig(unsigned int)),this,SLOT(slotSetConfig(unsigned int))); + prefDlg->exec(); + delete prefDlg; + } + + +void KNutClient::slotSetConfig (unsigned int changeSetting) { + + if (changeSetting) { + // cely blok konfiguraci ukladame jen zde // all block of configurations is saved only here + saveConfiguration(true); + if (changeSetting & KNutPrefDlg::ChangeXFer) { + if (settingData.lowHighXfer) + setActiveXFerVars(false); + else + setActiveXFerVars(true); + } + + if (changeSetting & KNutPrefDlg::ChangeUpsSetting) { + //we have changed active UPS +//********** same code like code into slotSetNewUPS -- stejny kod jako v slotSetNewUPS + m_upsTimer->stop(); + upsDeactivate(); + + if (m_mainUpsInfo.record.name == "") { + // the first record was added, because the first UPS is active UPS always + QString name = upsRecords->getName(0); + addEventString(i18n("Switched"),name); + m_mainUpsInfo.record.name=name; + m_mainUpsInfo.errorUpsData=false; + m_myMessMan->deleteMessage(); + saveConfiguration(false); // saves information of new/first active UPS + } + else { + if (upsRecords->getCount() == 0) { + // the last record was deleted, because the last UPS is active UPS + addEventString(i18n("Switched"),""); + m_mainUpsInfo.record.name=""; + m_mainUpsInfo.errorUpsData=false; + m_mainUpsInfo.record.upsName = ""; + m_mainUpsInfo.record.upsAddress = ""; + m_myMessMan->deleteMessage(); + saveConfiguration(false); // saves information of no UPS, list of UPS is empty + } + } + setActiveUpsInfo(m_mainUpsInfo.record.name); +// upsActivate(); +// getUpsData(); // provedeme hned natazeni zbytku promenych oby se nastavili meraky + // protoze UPS byla odpojena a znovu pripojena + // zde je nutno hned provest prekresleni + // showUpsData je nutno udelat take proto ze se mohl zmenit vyber meraku +// if (mainWindow) mainWindow->showUpsData(); + if (mainWindow) mainWindow->cleanPanels(); +// if (myDock) myDock->repaintDock(mainUpsInfo.netError); + if (m_myDock) m_myDock->clearDockValues(); + + m_mainUpsInfo.upsNet->newUPS(m_mainUpsInfo.record.upsAddress,m_mainUpsInfo.record.upsName, m_mainUpsInfo.record.port); + // state of connection to usbd, this isn't state of knutnet + m_mainUpsInfo.upsDriverState=knc::connecting; + m_mainUpsInfo.upsNet->open(); +// if ((mainUpsInfo.upsNet->getState() == KNutNet::Connected) && (!mainUpsInfo.errorUpsData)) { +// showStatusEvent(); +// upsTimer->start( mainUpsInfo.record.delay, TRUE ); // nastartujeme casovac +// } + } + + if (changeSetting & KNutPrefDlg::ChangeUpsCount) { + if (m_myDock) m_myDock->changeUps(); + } + + if (changeSetting & KNutPrefDlg::ChangeTypeOfKIcon) { + if (m_myDock) m_myDock->changeKIcon(); + } + + if (changeSetting & KNutPrefDlg::ChangeCustomKIconColor) { + if (m_myDock) m_myDock->changeKIBColor(); + } + + if (changeSetting & KNutPrefDlg::ChangeKIconBColor) { + if (m_myDock) m_myDock->changeKIBColor(); + } + + if (changeSetting & KNutPrefDlg::ChangeToolTip) { + if (m_myDock) m_myDock->changeToolTip(); + } + + //for other settings will call functions from mainWindow class + if (mainWindow) mainWindow->setConfig (changeSetting); + } + } + + +void KNutClient::slotPrintUPSVars(void) { + + if (m_mainUpsInfo.upsDriverState == knc::connected) { + if (!m_mainUpsInfo.errorUpsData) { + if ((m_mainUpsInfo.upsNet->readNumberVars (KNutNet::AllVars)) || (m_mainUpsInfo.upsNet->readNumberComms ())) { + KNutPrintUpsVar *windowUpsVars = new KNutPrintUpsVar(m_mainUpsInfo.upsNet,settingData.useDescription); + if (windowUpsVars->upsOk()) windowUpsVars->exec(); + delete windowUpsVars; + } + } else { + // KNutVarData::showError (mainUpsInfo.netError); + if ((m_myMessMan)) m_myMessMan->addMessage(KNutVarData::errorToText(m_mainUpsInfo.netError),knc::errorLevel,true); + } + } else { + // KNutVarData::showError (KNutNet::NotConnection); + if ((m_myMessMan)) m_myMessMan->addMessage(KNutVarData::errorToText(KNutNet::NotConnection),knc::errorLevel,true); + + } + } + + +void KNutClient::slotInstComms(void) { + + if (m_mainUpsInfo.upsDriverState == knc::connected) { + if (!m_mainUpsInfo.errorUpsData) { + if (m_mainUpsInfo.upsNet->readNumberComms ()) { + KNutInstComms *windowInstComms = new KNutInstComms(&m_mainUpsInfo.name,&m_mainUpsInfo.password,m_mainUpsInfo.record.userName,m_mainUpsInfo.record.password,m_mainUpsInfo.upsNet); + if (windowInstComms->upsOk()) windowInstComms->exec(); + delete windowInstComms; + } + } + else { +// KNutVarData::showError (mainUpsInfo.netError); + if ((m_myMessMan)) m_myMessMan->addMessage(KNutVarData::errorToText(m_mainUpsInfo.netError),knc::errorLevel,true); + } + } + else { +// KNutVarData::showError (KNutNet::NotConnection); + if ((m_myMessMan)) m_myMessMan->addMessage(KNutVarData::errorToText(KNutNet::NotConnection),knc::errorLevel,true); + } + } + +void KNutClient::slotRWVars(void) { + + if (m_mainUpsInfo.upsDriverState == knc::connected) { + if (!m_mainUpsInfo.errorUpsData) { + if (m_mainUpsInfo.upsNet->readNumberVars (KNutNet::RWVars)) { + KNutRWVar *windowRWVars = new KNutRWVar(&m_mainUpsInfo.name,&m_mainUpsInfo.password,m_mainUpsInfo.record.userName,m_mainUpsInfo.record.password,m_mainUpsInfo.upsNet); + connect (windowRWVars,SIGNAL(signalChangeRWVars(QString)),this,SLOT(slotChangeRWVars(QString))); + if (windowRWVars->upsOk()) windowRWVars->exec(); + delete windowRWVars; + } + } + else { + // KNutVarData::showError (mainUpsInfo.netError); + if ((m_myMessMan)) m_myMessMan->addMessage(KNutVarData::errorToText(m_mainUpsInfo.netError),knc::errorLevel,true); + } + } + else { + // KNutVarData::showError (mainUpsInfo.netError); + if ((m_myMessMan)) m_myMessMan->addMessage(KNutVarData::errorToText(KNutNet::NotConnection),knc::errorLevel,true); + } + } + + +void KNutClient::slotRefreshConnection(void) { + + m_reconnectMutex.lock(); + + m_mainUpsInfo.reconnecting =false; + m_reconnectTimer->stop(); + m_upsTimer->stop(); + upsDeactivate(); // closes connections + + // nastavime na docku iconu + // sets icon for dock + if (m_myDock) { + m_myDock->clearDockValues(); + // myDock->initImage(); + // myDock->repaint(); + } + if (mainWindow) { + mainWindow->cleanPanels(); + } + addEventString(i18n("Reconnect"),m_mainUpsInfo.record.name); + if (m_myMessMan) m_myMessMan->deleteMessage(); + +// mainUpsInfo.record.name=name; + m_mainUpsInfo.errorUpsData=false; + setActiveUpsInfo(m_mainUpsInfo.record.name); + + //new connection name and password are cleaned + m_mainUpsInfo.name = ""; + m_mainUpsInfo.password = ""; + + + m_panelsAreZeroing=false; + m_lastError=0; // zadna chyba + m_mainUpsInfo.oldState=KNutNet::initState; + + m_mainUpsInfo.upsNet->newUPS(m_mainUpsInfo.record.upsAddress,m_mainUpsInfo.record.upsName, m_mainUpsInfo.record.port); + // state of connection to usbd, this isn't state of knutnet + m_mainUpsInfo.upsDriverState=knc::connecting; + m_mainUpsInfo.upsNet->open(); + m_reconnectMutex.unlock(); + } + + +void KNutClient::slotChangeRWVars( QString ) { + // informace ze doslo k uspesne zmene promene + // vzhledem k asynchronimu zpracovani muze upsd vratit tuto hodnotu az za nejakou dobu + // nevim zda bude potreba + } + + +void KNutClient::exitMainWindow (void) { + + mainWindow=0; + if (m_mainUpsInfo.upsNet) setActiveUpsVars(false); + // Pokud neni aktivovan dock musime ukoncit aplikaci.. + // When dock isn't activated we must close application. + if (m_myDock == 0) { + saveConfiguration(false); + if (m_mainUpsInfo.upsNet) { + delete m_mainUpsInfo.upsNet; + m_mainUpsInfo.upsNet = 0; + } + kapp->quit(); + } + } + + +void KNutClient::makeMainWindow (void) { + + mainWindow = new KNutMainWindow(m_listKNutEvent ,&m_mainUpsInfo, &settingData, upsRecords, analogRecords); + connect(mainWindow, SIGNAL(UPSChanged (QString)), this, SLOT(slotSetNewUPS (QString))); + connect(mainWindow, SIGNAL(preferenceUps()),this, SLOT(slotPreferenceUps())); + connect(mainWindow, SIGNAL(showUPSVars()),this, SLOT(slotPrintUPSVars())); + connect(mainWindow, SIGNAL(makeInstComms()),this, SLOT(slotInstComms())); + connect(mainWindow, SIGNAL(makeRWVars()),this, SLOT(slotRWVars())); + connect(mainWindow, SIGNAL(makeRefreshConnection()),this, SLOT(slotRefreshConnection())); + connect(mainWindow, SIGNAL(saveConf()),this, SLOT(slotSaveConf())); + + + + + connect(mainWindow, SIGNAL(endApplication()), this, SLOT(slotExitApplication())); + connect(mainWindow, SIGNAL(destroyed()), this, SLOT(exitMainWindow())); + } + + + +void KNutClient::slotActiveMainWindow (void) { + + if (!mainWindow) { + // pred activaci nastaveme promenne znovu precteme data + // state of connection to usbd, this isn't state of knutnet + if (m_mainUpsInfo.upsDriverState==knc::connected) { + m_upsTimer->stop(); + setActiveUpsVars(true); + getUpsData(); + makeMainWindow(); + if (m_myDock) m_myDock->repaintDock(m_mainUpsInfo.netError); + m_upsTimer->start( 1, TRUE ); // nastartujem znovu + // 1 proto aby se zpracovali pripadne udalosti o zruseni spojeni + } + else { + setActiveUpsVars(true); + //getUpsData(); zrusene protoze kdyz nebylo spojeni navazeno vratil by prikaz + // getValues error=0 a doslo by vypsani data ok. + makeMainWindow(); + if (!m_mainUpsInfo.errorUpsData) { + if (m_myDock) m_myDock->repaintDock(m_mainUpsInfo.netError); + } + } + } + else { // end if mainWindow + //activates main window + mainWindow->raise(); + KWin::activateWindow(mainWindow->winId()); + } + } + +void KNutClient::slotSaveConf (void) { + saveConfiguration(true); // saves all configuration +} + +void KNutClient::closeMainWindow (void) { + if (mainWindow) { + if (m_myDock) m_myDock->repaintDock(m_mainUpsInfo.netError); + m_upsTimer->stop(); + mainWindow->close(); + mainWindow=0; + m_upsTimer->start( 1, TRUE ); // starts timer // nastartujeme casovac + } + } + + +void KNutClient::slotExitApplication(void) { + + m_upsTimer->stop(); + if (mainWindow) { + // odpojime protoze exitMainWindow by byl vykonan az po zkonceni procedury; + disconnect(mainWindow, SIGNAL(destroyed()), this, SLOT(exitMainWindow())); + delete mainWindow; + mainWindow = 0; + } + saveConfiguration(false); + if (m_mainUpsInfo.upsNet) { + delete m_mainUpsInfo.upsNet; + m_mainUpsInfo.upsNet = 0; + } + if (m_myDock) { m_myDock->close(); m_myDock = 0;} + kapp->quit(); + } + +#include "knutclient.moc" + diff --git a/src/knutclient.desktop b/src/knutclient.desktop new file mode 100644 index 0000000..8a2568e --- /dev/null +++ b/src/knutclient.desktop @@ -0,0 +1,20 @@ +# KDE Config File +[Desktop Entry] +Encoding=UTF-8 +Type=Application +Version=0.9.4 +Exec=knutclient -caption "%c" %i %m +Icon=knutclient.png +MiniIcon=knutclient.png +DocPath=knutclient/index.html +Name=KNutClient +Name[de]=KNutClient +Name[cs]=KNutClient +Comment=Client for NUT +Comment[de]= +Comment[cs]=Klient pro UPS systďż˝ NUT +Comment[es]=Cliente KDE para NUT +Terminal=0 +X-KDE-StartupNotify=true +OnlyShowIn=KDE; +Categories=Qt;KDE;System;Monitor; diff --git a/src/knutclient.h b/src/knutclient.h new file mode 100755 index 0000000..fab2295 --- /dev/null +++ b/src/knutclient.h @@ -0,0 +1,210 @@ +/*************************************************************************** + knutclient.h - description + ------------------- + begin : Út srp 21 19:12:20 CEST 2001 + copyright : (C) 2001 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNUTCLIENT_H +#define KNUTCLIENT_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "knutmainwindow.h" +#include "knutvardata.h" +#include "knutupsdata.h" +#include "knutnet.h" +#include "knutdock.h" +#include "knutprefdlg.h" +#include "knutmessagemanager.h" + +#include + + +#include +#include +#include +#include + + const int countNextConnDelay = 10; + const int nextConnDelay[] = { + 5, 5, 20, 30, 60, 60, 120, 300, 600, 900 }; + + +class KNutClient : public QObject, public KSessionManaged { + Q_OBJECT + public: + KNutClient(bool noDock = false, QObject* parent=0,const char* name=0); + ~KNutClient(); + + private slots: + void slotTimeout (void); + + void slotReconnectTimeout (void); + + void slotSetNewUPS (QString name); + + void slotPreferenceUps(void); + + void slotSetConfig (unsigned int changeSetting); + + void slotPrintUPSVars(void); + void slotInstComms(void); + void slotRWVars(void); + void slotChangeRWVars( QString ); + + void slotSaveConf (void); + + + void slotExitApplication(void); + + +/** + * + * Calls function for repainting of icon in dock. + * Vola funkci pro prekresleni icony v doku. + * + * @since 0.1 + **/ + void slotTryFirstConnection (int maxCount); + + + +/** + * This function is called when program repeats other connection; + * Calls function for repainting of icon in dock. + * Tata funkce je volana, kdyz program opakuje pokus o pripojeni. + * Vola funkci pro prekresleni icony v doku. + * + * @since 0.1 + **/ + void slotTryReepatFirstConnection (int number ); + + +/** + * Nastavi hodnoty po prvem pripojeni na UPS, zavola prekresleni docku a nastartuje timer + * Sets values after the first conection to UPS ,calls to repaint of dock and starts timer + * + * @since 0.2 + **/ + void slotFirstConnection (void); + + + +/** + * Zpracuje chybu spojeni + * Executes error of connection + * + * @since 0.1 + **/ + void slotErrorConnection (int error); + + +/** + * Zpracuje ukonceni spojeni, pokud spojeni bylo ukonceno druhou stranou. + * Executes end of connection, when connection was closed by the second side. + * + * @since 0.1 + **/ + void slotConnectionClosed(void); + + +/** + * + * + * @since 0.1 + **/ + void slotRefreshConnection(void); + + + void closeMainWindow (void); + void exitMainWindow (void); + void slotActiveMainWindow (void); + + virtual bool commitData (QSessionManager&); + virtual bool saveState (QSessionManager&); + + private: + +/** + * Prepares and show main window. + * Pripravi a zobrazi hlavni okno. + * + * @since 0.1 + **/ + void makeMainWindow (void); + +/** + * Sets all variables to initial values. + * Nastavi vsechny vsechny promenne na pocatecni hodnoty. + * + * @since 0.1 + **/ + void initVars (void); + + void loadConfiguration ( void ); + void saveConfiguration ( bool all = true ); + + void upsActivate (void); + void upsDeactivate (void); + + void setActiveUpsVars (bool mWindow = true); + void setActiveXFerVars (bool activate); + + void getUpsData (void); + + void setActiveUpsInfo (QString name); + + void addEventString (const QString text, const QString UPSAddress = QString::null); + + void showStatusEvent(void); + + + + +/********* PRIVATE VARS****************/ + // hlavni informace o upsce + // main informacion about UPS + KNutVarData::upsInfoDef m_mainUpsInfo; + + // v teto strukture jsou ulozeny promene ktere nastavuji konfiguraci + // in this structure are saveing values, which setting configuration + KNutVarData::SettingDataDef settingData; + + KNutDock* m_myDock; + + KNutMainWindow* mainWindow; + + KNutUpsData* upsRecords; + KNutVarData* analogRecords; + + QTimer* m_upsTimer; + QTimer* m_reconnectTimer; + + QStringList* m_listKNutEvent; + + bool m_panelsAreZeroing; // indikuje zda je panel nulovany // use if analog panels is setting to zero + // kod posledni chyby spojeni zjistene v timeoutu + // nebere ohled zda byla chyba pri inicializaci + int m_lastError; + + KNutMessageManager* m_myMessMan; + + // mutex for reconnect, only one reconnect at a time + QMutex m_reconnectMutex; + QMutex m_upsDeactivateMutex; + + }; +#endif diff --git a/src/knutclientui.rc b/src/knutclientui.rc new file mode 100644 index 0000000..8854298 --- /dev/null +++ b/src/knutclientui.rc @@ -0,0 +1,24 @@ + + + +

&File + + + + + &Settings + + + + &Connection + + + + + + + + + + + diff --git a/src/knutconst.h b/src/knutconst.h new file mode 100755 index 0000000..866fe5d --- /dev/null +++ b/src/knutconst.h @@ -0,0 +1,58 @@ +/*************************************************************************** + knutconst.h - description + ------------------- + begin : Tue Sep 24 2001 + copyright : (C) 2003 by Daniel Prynych + email : Daniel@prynych.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNUTCONST_H +#define KNUTCONST_H + + +namespace knc { + + const int StartPort =1024; + const int StopPort= 65535; + const int MinDelay = 2000; + + const int MinCols = 1; + const int MaxCols = 5; + + const int DefaultCountCols = 3; // prednastaveny pocet sloupcu analogovych meraku + const int DefaultPort = 3493; // default ports - prednastaveny port + + const int DefaultDelay = 2000; //2000 msec + + const int DefaultInputVoltage = 230; + const int DefaultInputFrequency = 50; + + const int NumberOfTypes = 14; // count types of variables // pocet typu promenych (none,utility ....) + const int NumberOfVars = NumberOfTypes -1; // how many variables we can measure // kolik promenych muzeme merit + + enum {VarNone,VarUtility,VarBattPct,VarUpsTemp,VarAcfreq,VarLoadPct,VarAmbTemp,VarAmbHumid,VarBattVolt,VarOutVolt,VarCurrent,VarOutFreq,VarBattTemp,VarBattCurrent}; + + const unsigned int maxCountKNutEvent = 100; + + const int numberVarError = -1000; + + enum upsDriverConnection { // state of connection to usbd, this isn't state of knutnet + connecting, + connected, + stale, + notConnected, + error + }; + } + + +#endif diff --git a/src/knutdock.cpp b/src/knutdock.cpp new file mode 100755 index 0000000..13d0d87 --- /dev/null +++ b/src/knutdock.cpp @@ -0,0 +1,976 @@ +/*************************************************************************** + knutdock.cpp - description + ------------------- + begin : Út zari 23 2003 + copyright : (C) 2003 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "knutdock.h" +#include "knutnet.h" + +//#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + + +#include +#include +#include + +//#include + +KNutDock::KNutDock(KNutVarData::upsInfoDef* activeUpsInfo, KNutVarData::SettingDataDef* settingData, KNutUpsData* upsRecords){ + QString valueName; + + m_settingData = settingData; + m_upsRecords = upsRecords; + m_activeUpsInfo = activeUpsInfo; + +//saves backgroundcolor of kicker + backgroundColor = paletteBackgroundColor(); + + m_typeOfIcon = m_settingData->typeOfKIcon; + + if (!m_settingData->customKIconColor) m_myBGColor = backgroundColor; + else m_myBGColor = m_settingData->kIconBackgroundColor; + + m_toolTipFlags=m_settingData->toolTipFlags; + + clearValues(); + + + KIconLoader *loader = KGlobal::iconLoader(); + m_mainPix = loader->loadIcon ("knutclient",KIcon::Small,16); + + // aplications's own icons + m_errorPix = UserIcon ("knc_error"); + m_connectPix = UserIcon ("knc_conn"); + m_upsPix = UserIcon ("knc_ups"); + m_battPix = UserIcon ("knc_batt"); + + createMainMenu(); + + m_statusLayer = 0; + m_runtimeLayer = 0; + + m_loadLayer = new QPixmap(24,24); + m_chargeLayer = new QPixmap(24,24); + m_mainLayer = new QPixmap(24,24); + + + initImage(); + changeKIcon(); // this function calls function repaintIcon + + } + + +KNutDock::~KNutDock(){ + + if (m_statusLayer) delete m_statusLayer; + if (m_runtimeLayer) delete m_runtimeLayer; + + delete m_loadLayer; + delete m_chargeLayer; + delete m_mainLayer; + + delete m_upsServerMenu; + delete m_menu; + } + +void KNutDock::changeUps (void) { + + m_upsServerMenu->clear(); + createUpsMenu(); + } + + +void KNutDock::clearDockValues(void){ + + initImage(); // paints standart icon + + clearValues(); + repaintDock(true); + } + + +void KNutDock::changeToolTip(void){ + + m_toolTipFlags=m_settingData->toolTipFlags; + toolTip(m_runtimeValue, m_statusValue, m_batteryChargeValue, m_upsLoadValue); + } + + +void KNutDock::changeKIBColor(void) { + + if (!m_settingData->customKIconColor) m_myBGColor = backgroundColor; + else m_myBGColor = m_settingData->kIconBackgroundColor; // uses defined color + + repaintDock(true); + } + +void KNutDock::changeKIcon (void) { + + m_typeOfIcon = m_settingData->typeOfKIcon; + if ( m_typeOfIcon == generalKI) { + + if (m_mainLayer) { + delete m_mainLayer; + m_mainLayer=new QPixmap(24,24); + } + + if (!m_statusLayer) { + m_statusLayer = new QPixmap(24,24); + } + if (!m_runtimeLayer) { + m_runtimeLayer = new QPixmap(24,24); + } + paintStatus(m_statusValue); + paintRuntime(m_runtimeValue, m_statusValue); + } + else { // picture Icon + delete m_statusLayer; + m_statusLayer = 0; + delete m_runtimeLayer; + m_runtimeLayer=0; + } + paintLoad(m_upsLoadValue); + paintCharge(m_batteryChargeValue); + + m_statusWarningValue = m_statusValue & (KNutNet::CAL | KNutNet::TRIM | KNutNet::BOOST + | KNutNet::OVER | KNutNet::RB); + repaintDock(true); + } + +void KNutDock::initImage(void) { + setPixmap(m_mainPix); + m_dataOk = idle; + m_dataOkOld = m_dataOk; + } + +void KNutDock::setNewUPS(void) { + m_upsServerMenu->clear(); + createUpsMenu(); + } + + +void KNutDock::repaintDock (const bool always) { + QString nutStringVar; + int myRuntimeValue; + int myUpsLoadValue; + int myStatusValue; + int myStatusBatValue; + int myBatteryChargeValue; + bool repaintNow = false; + // value repaintNow is seted when some ups values are changed + bool okFloat; + QString valueName; + QPainter paint; + + + if (m_activeUpsInfo->upsNet == 0) { repaint(); return;} + + m_dataOkOld=m_dataOk; + + if ((m_activeUpsInfo->upsNet->getState() == KNutNet::Connected) // paints icons with information values + && (!m_activeUpsInfo->netError)) { + // ups is connected dataOK is ok (program shows icon of connecting UPS) + m_dataOk = ok; // pro paint event udava ze mam pouzit nase ikony + + if (!m_activeUpsInfo->upsNet->existName(m_activeUpsInfo->runtimeVar)) { + nutStringVar = m_activeUpsInfo->upsNet->readStringVar(m_activeUpsInfo->runtimeVar); +//std::cout << "KNutDock::repaintDock RUNTIME " << nutStringVar << std::endl; + if (nutStringVar.isEmpty()) myRuntimeValue=knc::numberVarError; + else { + myRuntimeValue = (int)nutStringVar.toFloat(&okFloat); + if (!okFloat) myRuntimeValue = knc::numberVarError; + } + } + else myRuntimeValue = knc::numberVarError; + + myStatusValue = m_activeUpsInfo->upsNet->readStatus(); + + + switch (m_typeOfIcon) { + case generalKI: +// *********STATUS**************** + if (myStatusValue !=m_statusValue ) { + m_statusValue = myStatusValue; + paintStatus(m_statusValue); + repaintNow = true; + } + +// **********RUNTIME*********** + myStatusBatValue = myStatusValue & KNutNet::OB; // OB = UPS runs on battery + if ((myRuntimeValue != m_runtimeValue) || (myStatusBatValue != m_statusBatValue)) { + // when runtime is changed or flags OB is changed we must repaint icons + // when OB is changed same items in icon will change color + m_runtimeValue = myRuntimeValue; // runtime is old value of runtime, one is defined like global value of class + m_statusBatValue = myStatusBatValue; + paintRuntime(m_runtimeValue, m_statusValue); + repaintNow = true; + } + break; + + case pictureKI: +// *********STATUS**************** + if (myStatusValue !=m_statusValue ) { + m_statusValue = myStatusValue; + m_statusWarningValue = myStatusValue & (KNutNet::CAL | KNutNet::TRIM | KNutNet::BOOST + | KNutNet::OVER | KNutNet::RB); + repaintNow = true; + } + +// **********RUNTIME*********** + if (myRuntimeValue != m_runtimeValue) { + m_runtimeValue = myRuntimeValue; + repaintNow = true; + } + break; + } ///////////////////// end of models + + // Other values are for all modes + +// **********UPS LOAD*************** + if (m_activeUpsInfo->nutVariables == 1) valueName = "LOADPCT"; + else valueName = "ups.load"; + if (!m_activeUpsInfo->upsNet->existName(valueName)) { + nutStringVar = m_activeUpsInfo->upsNet->readStringVar(valueName); + if (nutStringVar.isEmpty()) myUpsLoadValue=knc::numberVarError; + else { + myUpsLoadValue = (int)nutStringVar.toFloat(&okFloat); + if (!okFloat) myUpsLoadValue=knc::numberVarError; + } + } + else myUpsLoadValue=knc::numberVarError; + + if (myUpsLoadValue != m_upsLoadValue) { + m_upsLoadValue = myUpsLoadValue; + if (m_typeOfIcon == generalKI) paintLoad(m_upsLoadValue); + repaintNow = true; + } + +// *********BATTERY CHARGE**************** + if (m_activeUpsInfo->nutVariables == 1) valueName="BATTPCT"; + else valueName="battery.charge"; + if (!m_activeUpsInfo->upsNet->existName(valueName)) { + nutStringVar = m_activeUpsInfo->upsNet->readStringVar(valueName); + if (nutStringVar.isEmpty()) myBatteryChargeValue=knc::numberVarError; + else { + myBatteryChargeValue = (int)nutStringVar.toFloat(&okFloat); + if (!okFloat) myBatteryChargeValue = knc::numberVarError; + } + } + else myBatteryChargeValue=knc::numberVarError; + + if (myBatteryChargeValue != m_batteryChargeValue) { + m_batteryChargeValue = myBatteryChargeValue; + if (m_typeOfIcon == generalKI)paintCharge(m_batteryChargeValue); + repaintNow = true; + } +// ************* End of values******************** + + if (repaintNow || always || (m_dataOk != m_dataOkOld)) { + + + switch (m_typeOfIcon) { + case generalKI: + m_mainLayer->fill(m_myBGColor); +// copyBlt (m_mainLayer,0,0,m_runtimeLayer,0,0,24,24); + bitBlt (m_mainLayer,0,0,m_runtimeLayer,0,0,24,24,AndROP); + bitBlt (m_mainLayer,0,0,m_loadLayer,0,0,24,24,AndROP); + bitBlt (m_mainLayer,0,0,m_chargeLayer,0,0,24,24,AndROP); + bitBlt (m_mainLayer,0,0,m_statusLayer,0,0,24,24,AndROP); + break; + case pictureKI: +// if (m_statusValue & KNutNet::OL) bitBlt (m_mainLayer,0,0,m_loadLayer,0,0,24,24,AndROP); // icon of UPS + if (m_statusValue & KNutNet::OL) { // ONLINE - icon of UPS + int myLoad; + QPainter paint; + copyBlt (m_mainLayer,0,0,&m_upsPix,0,0,24,24); // icon of UPS + + paint.begin(m_mainLayer); + if (m_upsLoadValue == knc::numberVarError) myLoad=0; + else myLoad = abs(m_upsLoadValue/10); + + if (m_upsLoadValue != knc::numberVarError) { + if (myLoad > 12) myLoad=12; + if (myLoad > 10) myLoad++; // preskocime rysku pro 100 % + if (myLoad < 9) paint.setPen(QColor(0,192,0)); //green + else { + if (myLoad < 11) paint.setPen(QColor(255,255,0)); //yellow + else paint.setPen(QColor(255,0,0));//red + } + for (int i = 19; i < 22; i++) paint.drawLine(i,13,i,13-myLoad +1); + + if (myLoad < 13) { + paint.setPen(QColor(168,220,255)); + for (int i = 20; i < 23; i++ ) paint.drawLine(i,1,i,13-myLoad); + } + } + paint.setPen(QColor(Qt::black)); // line for 100 % load + paint.drawLine(19,3,22,3); + if (!m_statusWarningValue) paintOKPoint(paint); + else paintErrorPoint(paint); + paint.end(); + } + else { + QPainter paint; + copyBlt (m_mainLayer,0,0,&m_battPix,0,0,24,24); // icon of Battery + paint.begin(m_mainLayer); + if (m_batteryChargeValue != knc::numberVarError) { + if (m_batteryChargeValue < 40) paint.setPen(Qt::red); + else paint.setPen(Qt::black); + if (m_batteryChargeValue < 40) paint.setPen(Qt::red); + else { + if (m_batteryChargeValue < 50) paint.setPen(Qt::yellow); + else paint.setPen(Qt::green); + } + int delka = abs((16*m_batteryChargeValue)/100); + delka += abs((delka-1)/4) -1; + paint.drawLine (2,7,2+delka,7); + paint.drawLine (2,8,2+delka,8); + paint.drawLine (2,9,2+delka,9); + } + paint.end(); + } + break; + } + toolTip(m_runtimeValue, m_statusValue, m_batteryChargeValue, m_upsLoadValue); + + setPixmap(*m_mainLayer); + } + } + else { // KNutNet->state isn't connected + // we must test activeUpsInfo->netError because error can rise higher level + if (m_activeUpsInfo->netError) + m_dataOk = error; // error is value not variable + else { + if ((m_activeUpsInfo->upsNet->getState() == KNutNet::Connecting) || + (m_activeUpsInfo->upsNet->getState() == KNutNet::HostLookup)) + m_dataOk = connecting; + else m_dataOk = idle; + } + if ((m_dataOk != m_dataOkOld) or always) { + toolTip(0, -1, 0, 0); + m_dataOkOld=m_dataOk; + if (m_dataOk == connecting) setPixmap(m_connectPix); + else { + if (m_dataOk == error) setPixmap(m_errorPix); + else { + setPixmap(m_mainPix); + } + } + } + } + repaint(); + } + + + +void KNutDock::toolTip (int runtime, int status, int batteryCharge, int upsLoad ) { + + QString text; + QString manufacturer = ""; + QString upsModel = ""; + QString serial = ""; + QString firmware = ""; + int myNetErr = 0; + + int min = abs(runtime/60); + int sec = runtime - (min*60); + + if (m_activeUpsInfo->upsNet != 0) { + myNetErr= m_activeUpsInfo->upsNet->getError(); + switch (m_activeUpsInfo->nutVariables) { + case 1: + manufacturer = m_activeUpsInfo->upsNet->readStringVar("MFR"); + upsModel = m_activeUpsInfo->upsNet->readStringVar("MODEL"); + serial = m_activeUpsInfo->upsNet->readStringVar("SERIAL"); + firmware = m_activeUpsInfo->upsNet->readStringVar("FIRMREV"); + break; + case 2: + manufacturer = m_activeUpsInfo->upsNet->readStringVar("ups.mfr"); + upsModel = m_activeUpsInfo->upsNet->readStringVar("ups.model"); + serial = m_activeUpsInfo->upsNet->readStringVar("ups.serial"); + firmware = m_activeUpsInfo->upsNet->readStringVar("ups.firmware"); + break; + } + } + + text = i18n("Name")+" : "+m_activeUpsInfo->record.name + "\n" + +i18n("UPS name")+" : "+m_activeUpsInfo->record.upsName + "\n" + +i18n("UPS address")+" : "+m_activeUpsInfo->record.upsAddress +"\n" + +i18n("Status : "); + + if (status == -1) { + text += i18n("Connection doesn't exist."); + } + else { + if (status & KNutNet::OL) { + text += i18n("UPS On line"); + } + else { + if (status & KNutNet::OB) { + text += i18n("UPS On battery"); + } + else { + if (status & KNutNet::OFF) { + text += i18n("UPS Of line"); + } + } + } + + if (status & KNutNet::LB) { + text += "\n" + i18n("Status : ") + i18n("UPS Battery is low"); + } + if (status & KNutNet::RB) { + text += "\n" + i18n("Status : ") + i18n("Replace battery"); + } + if (status & KNutNet::CAL) { + text += "\n" + i18n("Status : ") + i18n("UPS is performing calibration"); + } + if (status & KNutNet::OVER) { + text += "\n" + i18n("Status : ") + i18n("UPS is Overload"); + } + if (status & KNutNet::TRIM) { + text += "\n" + i18n("Status : ") + i18n("UPS is trimming voltage"); + } + if (status & KNutNet::BOOST) { + text += "\n" + i18n("Status : ")+ i18n("UPS is boosting voltage"); + } + + + } + if ((status == -1) && (myNetErr != KNutNet::NoError)) { + text += "\n" + i18n("Error : ")+ KNutVarData::errorToText(myNetErr); + } + + if (m_toolTipFlags & TTMFR) text += "\n" + i18n("Manufac. : ")+ manufacturer; + + if (m_toolTipFlags & TTModel) text += "\n" + i18n("Name")+" : "+ upsModel; + + if (m_toolTipFlags & TTSerial) text += "\n" + i18n("Serial")+" : "+ serial; + + if (m_toolTipFlags & TTFirm) text += "\n" + i18n("Firmware")+" : "+ firmware; + + if (m_toolTipFlags & TTRun) { + if (runtime != knc::numberVarError) + text += "\n" + i18n("Runtime") + i18n(" : %1:%2 min").arg(min).arg(sec); + } + + if (m_toolTipFlags & TTCharge) { + if (batteryCharge != knc::numberVarError) + text += "\n" + i18n("Battery Charge") + QString(" : %1 %").arg(batteryCharge); + } + + if (m_toolTipFlags & TTLoad) { + if (upsLoad != knc::numberVarError) + text += "\n" + i18n("UPS Load") + QString(" : %1 %").arg(upsLoad); + } + + QToolTip::remove(this); + QToolTip::add(this,text); + } + + + +/*********************************************************************************************/ +/* */ +/* PRIVATE SLOTS */ +/* */ +/*********************************************************************************************/ + + void KNutDock::slotShowMyAbout() { + KAboutApplication *dialog; + + dialog= new KAboutApplication; + dialog->exec(); + delete dialog; +} + +void KNutDock::slotExitApplication (void) { + + if (m_settingData->areYouSure) { + if (KMessageBox::warningYesNo (0,i18n("Are you sure ?")) == 3) + emit endApplication(); + } + else emit endApplication(); + } + +void KNutDock::slotUpsName(int i) { + + emit UPSChanged(m_upsRecords->getName(i-101)); + } + + +void KNutDock::slotMinimize(void) { + + emit minimize (); + } + +void KNutDock::slotPreferences(void) { + + emit preferences(); + } + +void KNutDock::slotPrintUPSVars(void) { + + emit printUPSVars(); + } + +void KNutDock::slotInstComms(void) { + + emit instComms(); + } + +void KNutDock::slotRWVars(void) { + + emit RWVars(); + } + +void KNutDock::slotRefreshConnection(void) { + + emit makeRefreshConnection(); + } + + +//------------------------------------------ + +void KNutDock::mousePressEvent(QMouseEvent *e) { + +//qDebug("KNutDock::mousePressEvent"); + if( e->button()==LeftButton ) emit activeMainWindow(); + if( e->button()==RightButton ) m_menu->popup(e->globalPos()); + } + + + + +void KNutDock::paintEvent (QPaintEvent *e) { + + KSystemTray::paintEvent(e); + if ((m_activeUpsInfo->upsNet->getState() == KNutNet::Connected) and + (m_statusValue != KNutNet::NS)) { // When driver isn't connected, getState is connected and m_statusValue is NS // NONE STATUS + if (m_typeOfIcon == pictureKI) { + QPainter painter(this); +// painter.begin(); + if (m_statusValue & KNutNet::OL) { // ONLINE - icon of UPS + painter.setPen(Qt::black); + paintNumbers (m_upsLoadValue, -2, 15, &painter ); + } + else { // OFFLINE icon of battery + if (m_batteryChargeValue != knc::numberVarError) { + if (m_batteryChargeValue < 40) painter.setPen(Qt::red); + else painter.setPen(Qt::black); + paintNumbers(m_batteryChargeValue,-2,16,&painter); + } + else { + painter.setPen(Qt::black); + paintDash (3,16,&painter); + paintDash (8,16,&painter); + } + } + // painter.end(); + } + } + } + + + + +/*********************************************************************************************/ +/* */ +/* PRIVATE FUNCTIONS */ +/* */ +/*********************************************************************************************/ + +void KNutDock::clearValues(void) { + + m_batteryChargeValue = 0; + m_runtimeValue = 0; + m_upsLoadValue = 0; + m_statusValue = 0; + } + + +void KNutDock::createUpsMenu(void) { + + int n = m_upsRecords->getCount(); + for (int i =0; i < n; i++) { + if (m_activeUpsInfo->record.name == m_upsRecords->getName(i)) + m_upsServerMenu->insertItem(kapp->miniIcon(),m_upsRecords->getName(i), this, SLOT(slotUpsName(int)),0,101+i); + else + m_upsServerMenu->insertItem(m_upsRecords->getName(i), this, SLOT(slotUpsName(int)),0,101+i); + } + } + +void KNutDock::createMainMenu(void) { + + m_menu = new KPopupMenu; + m_upsServerMenu = new KPopupMenu; + createUpsMenu(); + + m_menu->insertTitle (kapp->miniIcon(),"knutclient"); + m_menu->insertSeparator(); + m_menu->insertItem("UPS",m_upsServerMenu); + m_menu->insertSeparator(); + m_menu->insertItem(i18n("&Showing UPS variables and commands"), this, SLOT(slotPrintUPSVars())); + m_menu->insertItem(i18n("&Running instant commands"), this, SLOT(slotInstComms())); + m_menu->insertItem(i18n("Setting R&W variables"), this, SLOT(slotRWVars())); + m_menu->insertSeparator(); + m_menu->insertItem(SmallIcon("reload"),i18n("Reconnect"), this, SLOT(slotRefreshConnection())); + m_menu->insertSeparator(); + m_menu->insertItem(SmallIcon("configure"),i18n("&Preferences"), this, SLOT(slotPreferences())); + m_menu->insertSeparator(); + m_menu->insertItem(kapp->miniIcon(),i18n("&About KNutClient"), this, SLOT(slotShowMyAbout())); + m_menu->insertSeparator(); + m_menu->insertItem(i18n("&Minimize"), this, SLOT(slotMinimize())); + m_menu->insertSeparator(); + m_menu->insertItem (SmallIcon("exit"),i18n("&Exit"),this ,SLOT(slotExitApplication())); + } + + +void KNutDock::paintCharge (int charge ) { + QPainter paint; + + m_chargeLayer->fill(Qt::white); + paint.begin(m_chargeLayer); + if (charge > 199) charge = 199; + + if (m_typeOfIcon == generalKI) { + if (charge != knc::numberVarError) { + if (charge < 40) paint.setPen(Qt::red); + else paint.setPen(Qt::black); + paintNumbers(charge,8,2,&paint); + } + else { + paint.setPen(Qt::black); + paintDash (13,2,&paint); + paintDash (18,2,&paint); + } + } + else { + // picture version + if (charge != knc::numberVarError) { + if (charge < 40) paint.setPen(Qt::red); + else paint.setPen(Qt::black); + paintNumbers(charge,-2,16,&paint); + + if (charge < 40) paint.setPen(Qt::red); + else { + if (charge < 50) paint.setPen(Qt::yellow); + else paint.setPen(Qt::green); + } + int delka = abs((16*charge)/100); + delka += abs((delka-1)/4) -1; + paint.drawLine (2,7,2+delka,7); + paint.drawLine (2,8,2+delka,8); + paint.drawLine (2,9,2+delka,9); + } + else { + paint.setPen(Qt::black); + paintDash (3,16,&paint); + paintDash (8,16,&paint); + } + + } + paint.end(); + } + + +void KNutDock::paintErrorPoint ( QPainter& paint ) { + + paint.setPen(QColor(0,0,255)); + paint.setPen(QColor(255,0,0)); + + paint.drawLine(19,18,21,18); + paint.drawLine(19,19,21,19); + paint.drawLine(19,20,21,20); + } + + +void KNutDock::paintOKPoint (QPainter& paint ) { + + paint.setPen(QColor(0,255,0)); + paint.drawLine(19,18,21,18); + paint.drawLine(19,19,21,19); + paint.drawLine(19,20,21,20); + } + + +void KNutDock::paintStatus (int status ) { + QPainter paint; + int lastPos = 0; + + m_statusLayer->fill(Qt::white); + paint.begin(m_statusLayer); + + if (status & KNutNet::OL) { + paint.setPen(Qt::black); + paintChar (1,2,'P',&paint); + } + else { + if (status & KNutNet::OB) { + paint.setPen(Qt::red); + paintChar (1,2,'B',&paint); + } + } + + if (status & KNutNet::LB) { + paint.setPen(Qt::red); + paintChar (6,2,'L',&paint); + } + if ((lastPos <2) && (status & KNutNet::RB)) { + paint.setPen(Qt::red); + paintChar (6,2,'R',&paint); + lastPos++; + } + if ((lastPos <2) && (status & KNutNet::BOOST)) { + paint.setPen(Qt::red); + paintChar (6,2,'B',&paint); + lastPos++; + } + if ((lastPos <2) && (status & KNutNet::TRIM)) { + paint.setPen(Qt::red); + paintChar (6,2,'T',&paint); + lastPos++; + } + if ((lastPos <2) && (status & KNutNet::CAL)) { + paint.setPen(Qt::red); + paintChar (6,2,'C',&paint); + lastPos++; + } + paint.end(); + } + +void KNutDock::paintRuntime (int runtime, int status ) { + QPainter paint; + + m_runtimeLayer->fill(Qt::white); + paint.begin(m_runtimeLayer); + + if (status & KNutNet::OB) + paint.setPen(Qt::red); + else + paint.setPen(Qt::black); + if (runtime != knc::numberVarError) { + + int min = abs(runtime/60); + int sec = runtime - (min*60); + + paintNumber(1,11, abs(min/10) ,&paint); + paintNumber(6,11,min-((abs(min/10))*10) ,&paint); + paintNumber(13,11, abs(sec/10) ,&paint); + paintNumber(18,11,sec-((abs(sec/10))*10) ,&paint); + } + else { + paintDash (1,11,&paint); + paintDash (6,11,&paint); + paintDash (13,11,&paint); + paintDash (18,11,&paint); + } + paint.drawLine (11,12,11,13); + paint.drawLine (11,15,11,16); + paint.end(); + } + +void KNutDock::paintLoad (int load ) { + QPainter paint; + int myLoad; + +// if (m_typeOfIcon != generalKI) bitBlt (m_loadLayer,0,0,m_upsLayer,0,0,24,24,AndROP); + m_loadLayer->fill(Qt::white); + paint.begin(m_loadLayer); + if (load == knc::numberVarError) myLoad=0; + else myLoad = abs(load/10); + + if (m_typeOfIcon == generalKI) { + if (load != knc::numberVarError) { + if (myLoad > 11) myLoad=11; + if (myLoad < 9) paint.setPen(Qt::green); + else { + if (myLoad < 11) paint.setPen(Qt::yellow); + else paint.setPen(Qt::red); + } + paint.setPen(Qt::green.light(60)); + for (int i = 0; i < myLoad; i++) { + paint.drawLine((i*2)+1,19,(i*2)+1,21); + } + paint.setPen(Qt::cyan.light(150)); + for (int i = myLoad; i < 11; i++) { + paint.drawLine((i*2)+1,19,(i*2)+1,21); + } + } + } + paint.end(); + + } + + + + +void KNutDock::paintNumbers (int numbers, int x, int y, QPainter* p ) { + bool first = false; + + if (numbers > 199) numbers = 199; + + if (numbers != knc::numberVarError) { + + if (numbers > 99) { + paintNumber (x,y,1,p); + numbers -= 100; + first=true; + } + int second = abs (numbers/10); + int third = numbers - (second * 10); + + if ((second != 0) || (first)) paintNumber (x+5,y,second,p); + paintNumber (x+10,y,third,p); + + } + else { + p->setPen(Qt::black); + paintDash (x+5,y,p); + paintDash (x+10,y,p); + } + } + + +void KNutDock::paintDash (int x, int y, QPainter *p) { + + p->drawLine(x,y+3,x+3,y+3); + } + +void KNutDock::paintNumber (int x, int y, int number, QPainter *p) { + // x and y are left top corner + + if ((number > -1) && (number < 10)) { + // painting - kreslim + switch (number) { + case 0: + p->drawRect(x,y,4,7); + break; + case 1: + p->drawLine (x+3,y,x+3,y+6); + break; + case 2: + p->drawLine(x,y,x+3,y); + p->lineTo(x+3,y+3); + p->lineTo(x,y+3); + p->lineTo(x,y+6); + p->lineTo(x+3,y+6); + break; + case 3: + p->drawLine(x,y,x+3,y); + p->lineTo(x+3,y+6); + p->lineTo(x,y+6); + p->drawLine(x,y+3,x+3,y+3); + break; + case 4: + p->drawLine(x,y,x,y+3); + p->lineTo(x+3,y+3); + p->drawLine (x+3,y,x+3,y+6); + break; + case 5: + p->drawLine(x+3,y,x,y); + p->lineTo(x,y+3); + p->lineTo(x+3,y+3); + p->lineTo(x+3,y+6); + p->lineTo(x,y+6); + break; + case 6: + p->drawRect(x,y+3,4,4); + p->drawLine(x,y+3,x,y); + p->lineTo(x+3,y); + break; + case 7: + p->drawLine(x,y,x+3,y); + p->lineTo(x+3,y+6); + break; + case 8: + p->drawRect(x,y,4,7); + p->drawLine(x,y+3,x+3,y+3); + break; + case 9: + p->drawRect(x,y,4,4); + p->drawLine(x+3,y+3,x+3,y+6); + p->lineTo(x,y+6); + break; + } + } + } + + +void KNutDock::paintChar (int x, int y, char LCDChar, QPainter *p) { + // x and y are left up corner + switch (LCDChar) { + case 'L': + p->drawLine(x,y,x,y+6); + p->lineTo(x+3,y+6); + break; + case 'O': + p->drawRect(x,y,4,7); + break; + case 'B': + p->drawLine(x,y,x,y+6); + p->lineTo(x+2,y+6); + p->drawLine(x,y,x+2,y); + p->drawLine(x,y+3,x+2,y+3); + p->drawLine(x+3,y+1,x+3,y+2); + p->drawLine(x+3,y+4,x+3,y+5); + break; + case 'U': + p->drawLine(x,y,x,y+6); + p->lineTo(x+3,y+6); + p->lineTo(x+3,y); + break; + case 'C': + p->drawLine(x+3,y+1,x+3,y); + p->lineTo(x,y); + p->lineTo(x,y+6); + p->lineTo(x+3,y+6); + p->lineTo(x+3,y+5); + break; + case 'R': + p->drawLine(x,y,x,y+6); + p->drawLine(x,y,x+2,y); + p->drawLine(x,y+3,x+2,y+3); + p->drawLine(x+3,y+1,x+3,y+2); + p->drawLine(x+3,y+4,x+3,y+6); + break; + case 'P': + p->drawLine(x,y,x,y+6); + p->drawLine(x,y,x+2,y); + p->drawLine(x,y+3,x+2,y+3); + p->drawLine(x+3,y+1,x+3,y+2); + break; + case 'T': + p->drawLine(x+2,y,x+2,y+6); + p->drawLine(x,y,x+4,y); + break; + } + } + + + + +#include "knutdock.moc" diff --git a/src/knutdock.h b/src/knutdock.h new file mode 100755 index 0000000..15fa69c --- /dev/null +++ b/src/knutdock.h @@ -0,0 +1,525 @@ +/*************************************************************************** + knutdock.h - description + ------------------- + begin : Út zari 23 2003 + copyright : (C) 2003 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNUTDOCK_H +#define KNUTDOCK_H + +#include "knutupsdata.h" +#include "knutvardata.h" +#include "knutconst.h" + + +#include +#include + +#include + + +class QString; +class QPixmap; +class QColor; + +/** + * This class makes icons in dock. + * Tato trida zajistuje vytvoreni icony v docku. + * + * @author Daniel Prynych + * @short Dock's icons + * @version 0.3 + */ +class KNutDock : public KSystemTray { + Q_OBJECT + public: + + enum KNTDconst { DefaultToolTipFlags = 0x398}; + + + enum upsConnection { + idle, // ups isn't connected + connecting, // ups is connecting + ok, // ups is connected + error // error of connecting + }; + + enum eTypeOfIcons { pictureKI = 0, generalKI}; + + + enum toolTipItems { + TTMFR = 0x8, // 8, // FRM + TTModel = 0x10, // 16, // Model + TTSerial = 0x20, // 32, // Serial + TTFirm = 0x40, //64, // Firmware Revision + TTRun = 0x80,// 128, // Runtime + TTCharge = 0x100, // 256, // Charge + TTLoad = 0x200 // 512 // Load + }; + + + + +/** + * Constructor - makes icon in dockbar. + * Konstruktor - vytvori iconu v docku. + * + * @param activeUpsInfo odkaz na structuru upsInfo + * @param activeUpsInfo pointer to structure upsInfo + * @param settingData odkaz na strukturu typu SettingDataDef + * @param settingData pointer to structure type of SettingDataDef + * @param upsRecord odkaz na instanci tridy tActiveUpsInfo + * @param upsRecord pointer to class tActiveUpsInfo + * @since 0.3 + */ + KNutDock(KNutVarData::upsInfoDef* activeUpsInfo, KNutVarData::SettingDataDef* settingData, KNutUpsData* upsRecords); + +/** + * Destruktor. + * + * @since 0.1.2 + **/ + ~KNutDock(); + + +/** + * Nastavi zakladni nastaveni pro dock. + * Sets basic setting for dock. + * + * @since 0.1 + **/ + void clearDockValues(void); + + +/** + * Vytvori menu (seznam) UPS. + * Makes menu (list) of UPS. + * + * @since 0.1 + **/ + void changeUps(void); + + +/** + * Zmeni styl/typ icon + * Changes style/type of icon + * + * @since 0.1 + **/ + void changeKIcon (void); + +/** + * Zmeni pozadi icony v kickeru + * Changes background of icon in kicker + * + * @since 0.2 + **/ + void changeKIBColor(void); + + +/** + * Zmeni prvky v tooltip-u + * Changes items in toolTip + * + * @since 0.1 + **/ + void changeToolTip(void); + +/** + * Provede nove zpracovani dat a jejich nakresli iconu docku, interni repaint je volan vzdy. + * Tato funkce take vola funkci ToolTip. + * Makes new processing of data and paints icons of dock, internal repaint is colled always. + * This function calls function ToolTips too. + * @param always Kdyz je true prorovede vykresleni vzdy, kde je false provede vykresleni jen kdyz je zmenena nejaka hodnota UPS. + * @param always When param is true, icon is made always, is one is false icon is makeing when same UPS's value is changed. + * + * @since 0.4 + **/ + void repaintDock ( const bool always = false); + + + +/** + * Nastavi v Menu oznaceni pro aktivni UPS. + * Sets mark for active UPS in menu. + * + * @since 0.1 + **/ + void setNewUPS(void); + + + + + signals: +/**This signal is emited when end of application was selected in menu. + * Tento signal je vyslan pokud bylo vybrano v menu ukonceni aplikace. + * + * + * @since 0.1 + **/ + void endApplication(void); + +/** + * Tento signal je vyslan pokud bylo vybrano v menu minimalizace aplikace. + * Tento signal is emited when minimize application was selected in menu. + * + * + * @since 0.1 + **/ + void minimize(void); + +/** + * Tento signal je vyslan pokud bylo vybrano v menu polozka preferences. + * This signal is emited when item preferences was selected in menu. + * + * @since 0.1 + **/ + void preferences(void); + + + +/** + * Tento signal je vyslan pokud byla vybrana activace hlavniho okna (Main Window). + * + * @since 0.1 + **/ + void activeMainWindow(void); + + +/** + * Tento signal je vyslan pokud bylo vybrano zobrazeni promennych; + * This signal is emited when showing values was selected. + * + * @since 0.1 + **/ + void printUPSVars(void); + +/** + * Tento signal je vyslan pokud bylo vybrano provedeni okamziteho prikazu; + * This signal is emited when running instant command was selected. + * + * @since 0.1 + **/ + void instComms(void); + +/** + * Tento signal je vyslan pokud bylo vybrana zmena RW promennych. + * This signal is emited when change of RW values was selected. + * + * @since 0.1 + **/ + void RWVars(void); + +/** + * Tento signal je vyslan pokud bylo vybrana zmena RW promennych. + * This signal is emited when refresh connection was selected + * + * @since 0.1 + **/ + void makeRefreshConnection(void); + + +/** + * Tento signal je vyslan pokud je vybrana nova UPS; + * This signal is emited when new UPS is selected + * + * @since 0.1 + **/ + void UPSChanged(QString name); + + + protected slots: + + virtual void mousePressEvent(QMouseEvent *e); + +/** + * @internal + * Vola proceduru KAboutApplication, zobrazi informace o teto aplikaci a KDE. + * Calls procedure KAboutApplication, shows informations about this application and KDE. + * + * @since 0.1 + **/ + void slotShowMyAbout(); + void slotExitApplication (void); + +/** + * @internal + * Vysle signal minimize. + * Sends signal minimize. + * + * @since 0.1 + **/ + void slotMinimize (void); + + +/** + * @internal + * Vysle signal peferences. + * Sends signal preferences. + * + * @since 0.1 + **/ + void slotPreferences (void); + +/** + * @internal + * Vysle signal printUPSVars. + * Sends signal printUPSVars. + * + * @since 0.1 + **/ + void slotPrintUPSVars(void); + +/** + * @internal + * Vysle signal instComms. + * Sends signal instComms. + * + * @since 0.1 + **/ + void slotInstComms(void); + + +/** + * @internal + * Vysle signal RWVars. + * Sends signal RWVars. + * + * @since 0.1 + **/ + void slotRWVars(void); + +/** + * @internal + * Vysle signal upsName + * Sends signal upsName. + * + * @since 0.1 + **/ + void slotUpsName(int i); + +/** + * @internal + * Vysle signal makeRefreshConnection + * Sends signal makeRefreshConnection. + * + * @since 0.1 + **/ + void slotRefreshConnection(void); + + + protected: +/** + * @internal + * Nastavi vse pro vykresleni zakladni ikony. + * Tato ikona je kreslena dokud neni navazano spojeni + * Sets all for painting of basic icon. + * This icon is painted + * + * @since 0.2 + **/ + void initImage(void); + + + +/** + * @internal + * Sets tooltip. + * Nastavi ToolTip. + * + * @since 0.1 + **/ + void toolTip (int runtime, int status, int batteryCharge, int upsLoad ); + + +/** + * @internal + * Vytvori a hlavni menu panelu. + * Makes a main menu of panel + * + * @since 0.1 + **/ + void createMainMenu(void); + +/** + * @internal + * Vytvori a podmenu pro seznam UPS-ek. + * Makes a submenu for list ig UPSes. + * + * @since 0.1 + **/ + void createUpsMenu(void); + +/** + * @internal + * Paints a numbers. + * Vykresli cisla. + * @param number je hodnota cisla. + * @param x je leva souradnice cisla + * @param y je horni souradnice cisla + * @param p je ukazatel na painter + * + * @since 0.2 + **/ + void paintNumbers (int numbers, int x, int y, QPainter* p ); //x,y levy horni roh cisla 1 + +/** + * @internal + * Paints a number + * Vykresli cislici. + * @param number je hodnota cislice. + * @param x je leva souradnice cislice + * @param y je horni souradnice cislice + * @param p je ukazatel na painter + * + * @since 0.1 + **/ + void paintNumber (int x, int y, int number, QPainter *p); + +/** + * @internal + * Paints a char. + * Vykresli znak. + * @param x je leva souradnice cislice + * @param y je horni souradnice cislice + * @param p je ukazatel na painter + * @param char je vykreslovany znak. + * + * @since 0.1 + **/ + void paintChar (int x, int y, char LCDChar, QPainter *p); + + +/** + * @internal + * Vykresli pomlcku. + * @param x je leva souradnice pomlcky + * @param y je horni souradnice pomlcky + * @param p je ukazatel na painter + * + * @since 0.1 + **/ + void paintDash (int x, int y, QPainter *p); + + +/** + * @internal + * Paints runtime layer. + * Vykresli vrstvu runtime. + * + * @since 0.1 + **/ + void paintRuntime (int runtime, int status); + +/** + * @internal + * Paints layer for UPS Load + * Vykresli vrstvu pro UPS Load. + * + * @since 0.2 + **/ + void paintLoad (int load ); + +/** + * @internal + * Paints layer for Battery Charge, only for type general. + * Vykresli vrstvu pro Battery Charge. + * + * @since 0.2 + **/ + void paintCharge (int charge ); + +/** + * @internal + * Paints layer for UPS Status, only for type general + * Vykresli vrstvu pro UPS Status. + * + * @since 0.2 + **/ + void paintStatus (int status ); + + + void paintEvent (QPaintEvent *); + +/** + * @internal + * Paints green point into main layer, only for type picture. + * Vykresli do hlavni vrstvy zeleny bod. + * Ma vyznam jen pro typ picture. + * + * @since 0.3 + **/ + void paintErrorPoint ( QPainter& paint ); + +/** + * @internal + * Paints red point into main layer, only for type picture. + * Vykresli do hlavni vrstvy cerveny bod. + * Ma vyznam jen pro typ picture. + * + * @since 0.3 + **/ + void paintOKPoint ( QPainter& paint ); + +/** + * @internal + * Clean internal variables this class. + * Vycisti interni promene teto tridy. + * + * @since 0.1 + **/ + void clearValues(void); + + + KNutUpsData* m_upsRecords; + KNutVarData::SettingDataDef* m_settingData; // v teto strukture jsou ulozeny promene ktere nastavuji konfiguraci + KNutVarData::upsInfoDef* m_activeUpsInfo; // values for selected ups + + QPixmap m_mainPix; + QPixmap m_errorPix; + QPixmap m_connectPix; + QPixmap m_upsPix; + QPixmap m_battPix; + + QPixmap m_mainLayer1; + + QColor backgroundColor; + + KPopupMenu* m_menu; + KPopupMenu* m_upsServerMenu; + + QPixmap *m_statusLayer; + QPixmap *m_runtimeLayer; + QPixmap *m_loadLayer; + QPixmap *m_chargeLayer; + QPixmap *m_mainLayer; + + int m_runtimeValue; + int m_upsLoadValue; + int m_batteryChargeValue; + int m_statusValue; + int m_statusBatValue; + int m_statusWarningValue; + + + upsConnection m_dataOk; // selects one from four type of icons's view //idle, connecting, connected, error + upsConnection m_dataOkOld; + + int m_typeOfIcon; + QColor m_myBGColor; + unsigned int m_toolTipFlags; + +}; + +#endif diff --git a/src/knutfrontpanel.cpp b/src/knutfrontpanel.cpp new file mode 100755 index 0000000..caa5b6e --- /dev/null +++ b/src/knutfrontpanel.cpp @@ -0,0 +1,676 @@ +/*************************************************************************** + knutfrontpanel.cpp - description + ------------------- + begin : Tue Aug 21 2001 + copyright : (C) 2001 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + + +#include "knutfrontpanel.h" +#include "knutvardata.h" +#include "knutnet.h" + +#include +#include + +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include +#include + +#include + +KNutFrontPanel::KNutFrontPanel( QPalette* const paletteIn, QWidget *parent, const unsigned int flags, QFont* const panelFonts, const char *name) : QFrame( parent, name ), m_panelFlags(flags) { + + m_myPalette = paletteIn->copy(); // makes deep copy of palette + m_upsOkColor = Qt::green; + m_upsErrorColor = Qt::red; + m_upsBackColor = Qt::white; //backgroundColor(); + m_helpColor = Qt::black; + m_typeOfLCDColor=true; + m_LCDNumber1 = 0; + + + setFrameStyle( QFrame::Box | QFrame::Raised ); + setLineWidth( 2 ); + + if (panelFonts == 0) { + m_panelFont =kapp->font(); // sets font - system font + m_panelBoldFont = kapp->font(); + } + else { + m_panelFont = *panelFonts; // sets font / our selected font + m_panelBoldFont = *panelFonts; // change later + } + m_panelBoldFont.setBold (TRUE); + m_panelFont.setBold (FALSE); // sets no bold + + m_mainLayout = new QVBoxLayout(this); + m_mainLayout->setMargin ( 10 ); + m_mainLayout->setSpacing ( 10 ); + + // layer for bulbs + + m_bulbsGroupBox = new QGroupBox(this); + m_mainLayout->addWidget(m_bulbsGroupBox); + m_bulbsGroupBox->setFrameStyle( QFrame::Panel + QFrame::Raised); +// m_bulbsGroupBox->setFrameStyle( QFrame::Panel + QFrame::Sunken); + m_bulbsGroupBox->setLineWidth(2); + QVBoxLayout* bulbsLayout = new QVBoxLayout(m_bulbsGroupBox); + bulbsLayout->setMargin( 5 ); + + + m_textLabel1 = new QLabel( i18n("UPS On line"),m_bulbsGroupBox); + m_frameOL = new KLed (m_upsBackColor,KLed::Off,KLed::Sunken,KLed::Circular,m_bulbsGroupBox); + m_frameOL->setMaximumSize(30,30); + m_frameOL->setMinimumSize(25,25); + QToolTip::add(m_textLabel1,m_textLabel1->text()); + + QHBoxLayout* OLLayout = new QHBoxLayout(bulbsLayout); + OLLayout->addWidget(m_textLabel1); + OLLayout->addSpacing(10); + OLLayout->addWidget(m_frameOL); + OLLayout->setMargin (3); + OLLayout->setStretchFactor(m_textLabel1,20); + OLLayout->setStretchFactor(m_frameOL,5); + + + m_textLabel2 = new QLabel( i18n("UPS On battery"), m_bulbsGroupBox); + m_frameOB = new KLed (m_upsBackColor,KLed::Off,KLed::Sunken,KLed::Circular,m_bulbsGroupBox); + m_frameOB->setMaximumSize(30,30); + m_frameOB->setMinimumSize(25,25); + QToolTip::add(m_textLabel2,m_textLabel2->text()); + + QHBoxLayout* OBLayout = new QHBoxLayout(bulbsLayout); + OBLayout->addWidget(m_textLabel2); + OBLayout->addSpacing(10); + OBLayout->addWidget(m_frameOB); + OBLayout->setMargin (3); + OBLayout->setStretchFactor(m_textLabel2,20); + OBLayout->setStretchFactor(m_frameOB,5); + + + m_textLabel3 = new QLabel( i18n("UPS Overload"), m_bulbsGroupBox); + m_frameOVER = new KLed (m_upsBackColor,KLed::Off,KLed::Sunken,KLed::Circular,m_bulbsGroupBox); + m_frameOVER->setMaximumSize(30,30); + m_frameOVER->setMinimumSize(25,25); + QToolTip::add(m_textLabel3,m_textLabel3->text()); + + m_OLayout = new QHBoxLayout(bulbsLayout); + m_OLayout->addWidget(m_textLabel3); + m_OLayout->addSpacing(10); + m_OLayout->addWidget(m_frameOVER); + m_OLayout->setMargin (3); + m_OLayout->setStretchFactor(m_textLabel3,20); + m_OLayout->setStretchFactor(m_frameOVER,5); + + m_textLabel4 = new QLabel( i18n("UPS Battery low"), m_bulbsGroupBox); + m_frameLB = new KLed (m_upsBackColor,KLed::Off,KLed::Sunken,KLed::Circular,m_bulbsGroupBox); + m_frameLB->setMaximumSize(30,30); + m_frameLB->setMinimumSize(25,25); + QToolTip::add(m_textLabel4,m_textLabel4->text()); + + m_LBLayout = new QHBoxLayout(bulbsLayout); + m_LBLayout->addWidget(m_textLabel4); + m_LBLayout->addSpacing(10); + m_LBLayout->addWidget(m_frameLB); + m_LBLayout->setMargin (3); + m_LBLayout->setStretchFactor(m_textLabel4,20); + m_LBLayout->setStretchFactor(m_frameLB,5); + + m_textLabel5 = new QLabel( i18n("Replace battery"), m_bulbsGroupBox); + m_frameRB = new KLed (m_upsBackColor,KLed::Off,KLed::Sunken,KLed::Circular,m_bulbsGroupBox); + m_frameRB->setMaximumSize(30,30); + m_frameRB->setMinimumSize(25,25); + QToolTip::add(m_textLabel5,m_textLabel5->text()); + + m_RBLayout = new QHBoxLayout(bulbsLayout); + m_RBLayout->addWidget(m_textLabel5); + m_RBLayout->addSpacing(10); + m_RBLayout->addWidget(m_frameRB); + m_RBLayout->setMargin (3); + m_RBLayout->setStretchFactor(m_textLabel5,20); + m_RBLayout->setStretchFactor(m_frameRB,5); + + m_textLabel6 = new QLabel( i18n("UPS calibration"), m_bulbsGroupBox); + m_frameCAL = new KLed (m_upsBackColor,KLed::Off,KLed::Sunken,KLed::Circular,m_bulbsGroupBox); + m_frameCAL->setMaximumSize(30,30); + m_frameCAL->setMinimumSize(25,25); + QToolTip::add(m_textLabel6,m_textLabel6->text()); + + m_CALLayout = new QHBoxLayout(bulbsLayout); + m_CALLayout->addWidget(m_textLabel6); + m_CALLayout->addSpacing(10); + m_CALLayout->addWidget(m_frameCAL); + m_CALLayout->setMargin (3); + m_CALLayout->setStretchFactor(m_textLabel6,20); + m_CALLayout->setStretchFactor(m_frameCAL,5); + + + m_messGroupBox = new QGroupBox(this); + m_mainLayout->addWidget(m_messGroupBox); + m_messGroupBox->setFrameStyle( QFrame::Panel + QFrame::Raised); +// m_messGroupBox->setFrameStyle( QFrame::Panel + QFrame::Sunken); + m_messGroupBox->setLineWidth(2); + QVBoxLayout* messLayout = new QVBoxLayout(m_messGroupBox); + messLayout->setMargin( 3 ); + + + m_textLabel7 = new QLabel( "", m_messGroupBox); + QToolTip::add(m_textLabel7,m_textLabel7->text()); + m_manufacModelLayout = new QHBoxLayout(messLayout); + m_manufacModelLayout->addWidget(m_textLabel7); + m_manufacModelLayout->setMargin ( 3 ); + + m_textLabelManufac = new QLabel( i18n("Manufac. : "), m_messGroupBox); + m_textLabel8 = new QLabel( "", m_messGroupBox); + QToolTip::add(m_textLabelManufac,m_textLabelManufac->text()); + + m_manufacLayout = new QHBoxLayout(messLayout); + m_manufacLayout->addWidget(m_textLabelManufac); + m_manufacLayout->addWidget(m_textLabel8); + m_manufacLayout->addStretch(20); + m_manufacLayout->setMargin ( 3 ); + + m_textLabelName = new QLabel( i18n("Name")+" : ", m_messGroupBox); + m_textLabel9 = new QLabel( "", m_messGroupBox); + QToolTip::add(m_textLabelName,m_textLabelName->text()); + + m_nameLayout = new QHBoxLayout(messLayout); + m_nameLayout->addWidget(m_textLabelName); + m_nameLayout->addWidget(m_textLabel9); + m_nameLayout->addStretch(20); + m_nameLayout->setMargin ( 3 ); + + m_textLabelSerial = new QLabel( i18n("Serial : "), m_messGroupBox); + m_textLabel10 = new QLabel( "", m_messGroupBox); + QToolTip::add(m_textLabelSerial,m_textLabelSerial->text()); + + m_serialLayout = new QHBoxLayout(messLayout); + m_serialLayout->addWidget(m_textLabelSerial); + m_serialLayout->addWidget(m_textLabel10); + m_serialLayout->addStretch(20); + m_serialLayout->setMargin ( 3 ); + + m_textLabelFirm = new QLabel( i18n("Firm. rev. : "), m_messGroupBox); + m_textLabel11 = new QLabel( "", m_messGroupBox); + QToolTip::add(m_textLabelFirm,m_textLabelFirm->text()); + + m_firmLayout = new QHBoxLayout(messLayout); + m_firmLayout->addWidget(m_textLabelFirm); + m_firmLayout->addWidget(m_textLabel11); + m_firmLayout->addStretch(20); + m_firmLayout->setMargin ( 3 ); + + + m_valGroupBox = new QGroupBox(this); + m_mainLayout->addWidget(m_valGroupBox); + m_valGroupBox->setFrameStyle( QFrame::Panel + QFrame::Raised); +// m_bulbsGroupBox->setFrameStyle( QFrame::Panel + QFrame::Sunken); + m_valGroupBox->setLineWidth(2); + QVBoxLayout* valLayout = new QVBoxLayout(m_valGroupBox); + valLayout->setMargin( 3 ); + + + + m_textLabelRun = new QLabel( i18n("Runtime")+" : ", m_valGroupBox); + QToolTip::add(m_textLabelRun,m_textLabelRun->text()); + + m_LCDNumber1 = new QLCDNumber (5,m_valGroupBox); + m_LCDNumber1->setSegmentStyle (QLCDNumber::Flat); + m_LCDNumber1->setFrameStyle( QFrame::NoFrame ); + m_LCDNumber1->setMinimumSize(50,20); + + m_runLayout = new QHBoxLayout(valLayout); + m_runLayout->addWidget(m_textLabelRun); + m_runLayout->addStretch(20); + m_runLayout->addWidget(m_LCDNumber1); + m_runLayout->setMargin ( 5 ); + + m_mainLayout->addStretch(20); + m_mainLayout->addSpacing(5); + + setAllPalettes(); + + changePanelFont(); + paintPanel (); + + } + +KNutFrontPanel::~KNutFrontPanel(){ + } + + +//************************************************************ + +void KNutFrontPanel::paintPanel( void ) { + + if (m_panelFlags & PBOnLine) { + m_textLabel1->show(); + m_frameOL->show(); + } + else { + m_textLabel1->hide(); + m_frameOL->hide(); + } + + if (m_panelFlags & PBOnBatt) { + m_textLabel2->show(); + m_frameOB->show(); + } + else { + m_textLabel2->hide(); + m_frameOB->hide(); + } + + if (m_panelFlags & PBOver) { + m_OLayout->setMargin ( 3 ); + m_textLabel3->show(); + m_frameOVER->show(); + } + else { + m_textLabel3->hide(); + m_frameOVER->hide(); + m_OLayout->setMargin ( 0 ); + } + + if (m_panelFlags & PBBattLow) { + m_textLabel4->show(); + m_frameLB->show(); + m_LBLayout->setMargin ( 3 ); + } + else { + m_textLabel4->hide(); + m_frameLB->hide(); + m_LBLayout->setMargin ( 0 ); + } + + if (m_panelFlags & PBRepBatt) { + m_textLabel5->show(); + m_frameRB->show(); + m_RBLayout->setMargin ( 3 ); + } + else { + m_textLabel5->hide(); + m_frameRB->hide(); + m_RBLayout->setMargin ( 0 ); + } + + if (m_panelFlags & PBCal) { + m_textLabel6->show(); + m_frameCAL->show(); + m_CALLayout->setMargin ( 3 ); + } + else { + m_textLabel6->hide(); + m_frameCAL->hide(); + m_CALLayout->setMargin ( 0 ); + } + + if (m_panelFlags & PBMFRMod) { + m_textLabel7->show(); + m_manufacModelLayout->setMargin ( 5 ); + } + else { + m_textLabel7->hide(); + m_manufacModelLayout->setMargin ( 0 ); + } + + + if (m_panelFlags & PBMFR) { + m_textLabel8->show(); + m_textLabelManufac->show(); + m_manufacLayout->setMargin ( 5 ); + } + else { + m_textLabel8->hide(); + m_textLabelManufac->hide(); + m_manufacLayout->setMargin ( 0 ); + } + + if (m_panelFlags & PBModel) { + m_textLabel9->show(); + m_textLabelName->show(); + m_nameLayout->setMargin ( 5 ); + } + else { + m_textLabel9->hide(); + m_textLabelName->hide(); + m_nameLayout->setMargin ( 0 ); + } + + if (m_panelFlags & PBSerial) { + m_textLabel10->show(); + m_textLabelSerial->show(); + m_serialLayout->setMargin ( 5 ); + } + else { + m_textLabel10->hide(); + m_textLabelSerial->hide(); + m_serialLayout->setMargin ( 0 ); + } + + if (m_panelFlags & PBFirm) { + m_textLabel11->show(); + m_textLabelFirm->show(); + m_firmLayout->setMargin ( 5 ); + } + else { + m_textLabel11->hide(); + m_textLabelFirm->hide(); + m_firmLayout->setMargin ( 0 ); + } + +if ( (m_panelFlags & PBMFRMod) || (m_panelFlags & PBMFR) || (m_panelFlags & PBModel) || (m_panelFlags & PBSerial) ||(m_panelFlags & PBFirm)) + m_messGroupBox->show(); +else + m_messGroupBox->hide(); + + if (m_panelFlags & PBRun) { +// LCDNumber1->show(); +// textLabelRun->show(); +// runLayout->setMargin ( 5 ); + m_valGroupBox->show(); + } + else { +// LCDNumber1->hide(); +// textLabelRun->hide(); +// runLayout->setMargin ( 0 ); + m_valGroupBox->hide(); + } + } + + +int KNutFrontPanel::getPanelHeight( void) { return 0; } ///// correct !!!!!!!! + +unsigned int KNutFrontPanel::getPanelFlags( void) { return m_panelFlags; } + +void KNutFrontPanel::setPanelFlags(const int upsPanelFlags) { m_panelFlags = upsPanelFlags; } + +void KNutFrontPanel::setAllNameUps(const QString panelUpsAllName ){ + m_textLabel7->setText(panelUpsAllName); + QToolTip::remove(m_textLabel7); + QToolTip::add(m_textLabel7,panelUpsAllName); + } + +void KNutFrontPanel::setMFRUps(const QString panelUpsFRM ){ + m_textLabel8->setText(panelUpsFRM); + QToolTip::remove(m_textLabelManufac); + QToolTip::add(m_textLabelManufac,m_textLabelManufac->text()+panelUpsFRM); + } + +void KNutFrontPanel::setNameUps(const QString panelUpsName ){ + m_textLabel9->setText(panelUpsName); + QToolTip::remove(m_textLabelName); + QToolTip::add(m_textLabelName,m_textLabelName->text()+panelUpsName); + } + +void KNutFrontPanel::setSerialUps(const QString panelUpsSerial ){ + m_textLabel10->setText(panelUpsSerial); + QToolTip::remove(m_textLabelSerial); + QToolTip::add(m_textLabelSerial,m_textLabelSerial->text()+panelUpsSerial); + } + +void KNutFrontPanel::setFirmRevUps(const QString upsPanelFormRev ){ + m_textLabel11->setText(upsPanelFormRev); + QToolTip::remove(m_textLabelFirm); + QToolTip::add(m_textLabelFirm,m_textLabelFirm->text()+upsPanelFormRev); + } + + +void KNutFrontPanel::cleanPanel(void) { + m_textLabel7->setText(""); + m_textLabel8->setText(""); + m_textLabel9->setText(""); + m_textLabel10->setText(""); + m_textLabel11->setText(""); + + m_frameOL->setColor(m_upsBackColor); + m_frameOL->off(); + m_frameOB->setColor(m_upsBackColor); + m_frameOB->off(); + m_frameOVER->setColor(m_upsBackColor); + m_frameOVER->off(); + m_frameLB->setColor(m_upsBackColor); + m_frameLB->off(); + m_frameRB->setColor(m_upsBackColor); + m_frameRB->off(); + m_frameCAL->setColor(m_upsBackColor); + m_frameCAL->off(); + + m_LCDNumber1->display("-:--"); + m_LCDNumber1->setPalette (palette()); + } + +void KNutFrontPanel::setRuntime(const int runtime) { + QString runtimeString; + + if (runtime != knc::numberVarError) { + int min = (int)floor(runtime/60); + int sec = runtime - (min*60); + runtimeString=QString("%1:%2").arg(min,2).arg(sec,2); + if (runtimeString[3] == ' ') runtimeString[3]='0'; + } + else runtimeString="-:--"; + + m_LCDNumber1->display(runtimeString); + } + + + +void KNutFrontPanel::setPanel(const int panelBulbs) { +// OFF - 1 ups je vypnuta +// OL - 2 ups je bezi na sit +// OB - 4 ups bezi na baterie +// LB - 8 baterie je vybyta (pokud je zaroven OB dojde k shutdownu) +// CAL - 16 je spustena calibrace +// OVER - 128 ups je pretizena +// RB - 256 ups pozaduje vymenu baterie + + + if (!(panelBulbs < 0)) { + // ups online /na sit + if (panelBulbs & KNutNet::OL) { + m_frameOL->setColor(m_upsOkColor); + m_frameOL->on(); + m_LCDNumber1->setPalette (m_LCDPaletteOk); + m_typeOfLCDColor=true; + } + else { + m_frameOL->setColor(m_upsBackColor); + m_frameOL->off(); + } + + // ups ofline /na baterie + if (panelBulbs & KNutNet::OB) { + m_frameOB->setColor(m_upsErrorColor); + m_frameOB->on(); + m_LCDNumber1->setPalette (m_LCDPaletteErr); + m_typeOfLCDColor=false; + } + else { + m_frameOB->setColor(m_upsBackColor); + m_frameOB->off(); + } + + if (panelBulbs & KNutNet::LB) { + m_frameLB->setColor(m_upsErrorColor); + m_frameLB->on(); + } + else { + m_frameLB->setColor(m_upsBackColor); + m_frameLB->off(); + } + + if (panelBulbs & KNutNet::OVER) { + m_frameOVER->setColor(m_upsErrorColor); + m_frameOVER->on(); + } + else { + m_frameOVER->setColor(m_upsBackColor); + m_frameOVER->off(); + } + + if (panelBulbs & KNutNet::RB) { + m_frameRB->setColor(m_upsErrorColor); + m_frameRB->on(); + } + else { + m_frameRB->setColor(m_upsBackColor); + m_frameRB->off(); + } + + if (panelBulbs & KNutNet::CAL) { + m_frameCAL->setColor(m_upsErrorColor); + m_frameCAL->on(); + } + else { + m_frameCAL->setColor(m_upsBackColor); + m_frameCAL->off(); + } + } + } + + +/*********************************************************************************************/ +/* */ +/* PUBLIC SLOTS */ +/* */ +/*********************************************************************************************/ + + +void KNutFrontPanel::slotSetPanelFont(QFont newPanelFont) { + + m_panelFont = newPanelFont; // nastavime font + m_panelBoldFont = newPanelFont; // pozdeji zmenime + + m_panelBoldFont.setBold (TRUE); + m_panelFont.setBold (FALSE); // Zrusime bold u panelu + + changePanelFont(); // zmeni pismo + paintPanel(); + } + + +/*********************************************************************************************/ +/* */ +/* PRIVATE FUNCTIONS */ +/* */ +/*********************************************************************************************/ + + +void KNutFrontPanel::setLCDPalette (void) { + m_LCDPaletteOk = m_myPalette; + m_LCDPaletteErr = m_myPalette; + //Nastavime barvu pro OK system je online + QColorGroup activeColorGroup = m_LCDPaletteOk.active(); + activeColorGroup.setColor( QColorGroup::Foreground, green); + + m_LCDPaletteOk.setActive(activeColorGroup); + m_LCDPaletteOk.setInactive(activeColorGroup); + + //Nastavime Barvu pro Error - System neni online + activeColorGroup = m_LCDPaletteErr.active(); + activeColorGroup.setColor( QColorGroup::Foreground, red); + m_LCDPaletteErr.setActive(activeColorGroup); + m_LCDPaletteErr.setInactive(activeColorGroup); + } + +void KNutFrontPanel::setPalette (const QPalette & p){ + + m_myPalette = p; + setAllPalettes(); + } + + +void KNutFrontPanel::setAllPalettes (void){ + QColor myColor; + + QFrame::setPalette (m_myPalette); + //QColorGroup myColorGroup = myPalette.active(); + +// LCDPaletteOk = myPalette; +// LCDPaletteErr = myPalette; + + setLCDPalette(); + + m_bulbsPalette = m_myPalette; + + m_frameOL->setPalette(m_bulbsPalette); + + // we must correct feature of KLed, KLed repaint background when color of item (function KLed::setColor()) is changed only + // when we change palette backround only, KLed ignore this change + + myColor = m_frameOL->color(); + m_frameOL->setColor(m_helpColor); // black is neutral (unprofitable) color for us + m_frameOL->setColor(myColor); + + myColor = m_frameOB->color(); + m_frameOB->setColor(m_helpColor); + m_frameOB->setColor(myColor); + + myColor = m_frameLB->color(); + m_frameLB->setColor(m_helpColor); + m_frameLB->setColor(myColor); + + myColor = m_frameOVER->color(); + m_frameOVER->setColor(m_helpColor); + m_frameOVER->setColor(myColor); + + myColor = m_frameRB->color(); + m_frameRB->setColor(m_helpColor); + m_frameRB->setColor(myColor); + + myColor = m_frameCAL->color(); + m_frameCAL->setColor(m_helpColor); + m_frameCAL->setColor(myColor); + + + if (m_LCDNumber1) { + if (m_typeOfLCDColor) + m_LCDNumber1->setPalette (m_LCDPaletteOk); + else + m_LCDNumber1->setPalette (m_LCDPaletteErr); + } + } + +void KNutFrontPanel::changePanelFont (void) { + m_textLabel1->setFont(m_panelFont); + m_textLabel2->setFont(m_panelFont); + m_textLabel3->setFont(m_panelFont); + m_textLabel4->setFont(m_panelFont); + m_textLabel5->setFont(m_panelFont); + m_textLabel6->setFont(m_panelFont); + + m_textLabelManufac->setFont(m_panelFont); + m_textLabelName->setFont (m_panelFont); + m_textLabelSerial->setFont (m_panelFont); + m_textLabelFirm->setFont (m_panelFont); + m_textLabelRun->setFont (m_panelFont); + m_textLabel7->setFont (m_panelBoldFont); + m_textLabel8->setFont (m_panelBoldFont); + m_textLabel9->setFont (m_panelBoldFont); + m_textLabel10->setFont (m_panelBoldFont); + m_textLabel11->setFont (m_panelBoldFont); + m_textLabelRun->setFont (m_panelFont); + } + + +#include "knutfrontpanel.moc" diff --git a/src/knutfrontpanel.h b/src/knutfrontpanel.h new file mode 100755 index 0000000..42242ed --- /dev/null +++ b/src/knutfrontpanel.h @@ -0,0 +1,333 @@ +/*************************************************************************** + knutfrontpanel.h - description + ------------------- + begin : Tue Aug 21 2001 + copyright : (C) 2001 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNUTFRONTPANEL_H +#define KNUTFRONTPANEL_H + +#include + +#include + + +/** + *@author Daniel Prynych + */ + + +class QFont; +class QPalette; +class QColor; +class QLCDNumber; +class QLabel; +class QVBoxLayout; +class QHBoxLayout; +class QGroupBox; + + +/** + * Class is used for feature of panel, which shows informations about UPS. + * Trida slouzi pro zobrazeni panelu, ktery zobrazuje informace o UPS. + * + * + * @author Daniel Prynych + * @short Main panel + * @version 0.7.0 + */ +class KNutFrontPanel : public QFrame { + Q_OBJECT + public: + + +enum KNFPConst { DefaultPanelFlags = 1615}; //1+2+4+8+64+512+1024 + + +enum panelBulb { + PBOnLine = 1, // Panel Bulb On Line + PBOnBatt = 2, // Panel Bulb On Battery + PBOver = 4, // Panel Bulb Overloading + PBBattLow = 8, // Panel Bulb Battery Low + PBRepBatt = 16, // Panel Bulb Replace Battery + PBCal = 32, // Panel Bulb Calibration + PBMFRMod = 64, // FRM + Model + PBMFR = 128, // FRM + PBModel = 256, // Model + PBSerial = 512, // Serial + PBFirm = 1024, // Firmware Revision + PBRun=2048 // Panel LCD Number Runtime + }; + + + + + + + +/** + * Constructor - makes panel, which shows status of UPS + * Konstruktor - vytvori panel, ktery zobrazuje stav UPS-ky. + * + * @param flags Determine which parts will be shown. + * @param panelFonts Pointer to font, which is used for painnting, when one is 0 (zero) systems font is used. + * @param flags Udava ktere casti se maji na panelu zobrazit. + * @param panelFonts Odkaz na fonts ktery se ma pouzit pro vykreslovani, pokud je = 0 (nula) pouzije se systemovy font pri aplikaci. + * @since 0.8 + */ + KNutFrontPanel( QPalette* const paletteIn, QWidget *parent = 0, const unsigned int flags = DefaultPanelFlags, QFont* const panelFonts = 0L ,const char *name = 0); + +/** + * Destruktor + * + * @since 0.3 + */ + ~KNutFrontPanel(); + + +/** + * Vykresli na panelu udaje. + * Paints values on panel. + * + * @since 0.4 + */ + void paintPanel( void); + +/** + * Gets height of panel. + * Vrati vysku panelu. + * Od verzi 0.4 je vracena vzdy 0. !!!!!! + * From version 0.4 always gets 0 !!!!!!!!!!! + * + * @since 0.4 + */ + int getPanelHeight( void); + +/** + * Vrati nastaveni panelu. + * Gets setting of panel (flags of panel). + * + * @since 0.2 + */ + unsigned int getPanelFlags( void); + +/** + * Nastavi priznaky(nastaveni) panelu. Tyto priznaky nastavuji ktere prvky budou na panelu zobrazeny. + * Sets flags of panel. This flags sets what items will be shown on panel. + * + * @param upsPanelFlags flags od panel. + * @param upsPanelFlags priznaky panelu. + * + * @since 0.2 + */ + void setPanelFlags(const int upsPanelFlags); + +/** + * Shows complete name (name of UPS and manufacturer) of UPS on panel. + * Zobrazi na panelu cele jmeno (jmeno UPS a vyrobce ) UPS-ky. + * + * @param upsPanelName Text which is showed on panel (address of UPS and manufacturer). + * @param upsPanelName Text ktery se zobrazi na panelu (adresa UPS-ky a vyrobce). + * + * @since 0.2 + */ +void setAllNameUps(const QString panelUpsAllName); + +/** + * Shows name of UPS on panel. + * Zobrazi na panelu jmeno UPS-ky. + * + * @param upsPanelName Text which is shown on panel (name of UPS). + * @param upsPanelName Text ktery se zobrazi na panelu (jmeno UPS-ky). + * + * @since 0.3 + */ + void setNameUps(const QString panelUpsName ); + +/** + * Zobrazi na panelu jmeno vyrobce UPS-ky. + * Shows name of UPS's manufacturer on panel. + * + * @param panelUpsFRM Text ktery se zobrazi na panelu (vyrobce UPS). + * @param panelUpsFRM Text which is showed on panel (UPS's manufacturer). + * + * @since 0.2 + */ + void setMFRUps(const QString panelUpsFRM ); + +/** + * Shows serial number of UPS on panel. + * Zobrazi na panelu seriove cislo UPS-ky. + * + * @param panelUpsSerial Text ktery se zobrazi na panelu (seriove cislo UPS-ky). + * @param panelUpsSerial Text which is showed on panel (serial number of UPS). + * + * @since 0.2 + */ + void setSerialUps(const QString panelUpsSerial ); + +/** + * Zobrazi na panelu verzi firmwaru cislo UPS-ky. + * + * @param upsPanelFormRev Text ktery se zobrazi na panelu (verze firmwaru UPS-ky). + * + * @since 0.2 + */ + void setFirmRevUps(const QString upsPanelFormRev ); + +/** + * Offs bulbs on panel. / Cleans panel. + * Zhasne indikacni prvky na panelu. + * + * @since 0.5 + */ + void cleanPanel(void); + +/** + * Shows bulbs on panel. + * Rozsviti indikacni prvky na panelu. + * + * @param panelBulbs Code for select lighted bulbs. + * @param panelBulbs Kod pro urceni rozsvicenych indikacnich prvku. + * + * @since 0.4 + */ + void setPanel(const int panelBulbs); + + +/** + * Sets value of runtime. + * Nastavi hodnotu runtime. + * + * @param Runtime hodnota ktera se zobrazi jako runtime. + * + * @since 0.4 + */ + void setRuntime(const int runtime); + +/** + * Sets palette. + * Nastavi paletu (palette). Predefinovana funkce from QWidget. + * + * @param Palette which mail panel is painted. + * @param Paleta kterou ma byt vykreslen hlavni panel + * + * @since 0.1 + */ + void setPalette (const QPalette & ); + + public slots: + +/** + * Changes font for painting. + * Zmeni font pro vykresleni. + * + * @param panelFonts Novy font. + * + * @since 0.2 + */ + void slotSetPanelFont(QFont newPanelFont); + + private: + +/** + * @internal + * Sets palettes for LCDLabel. + * Nastavi palety pro LCDLabel. + * + * @since 0.1 + */ + void setLCDPalette (void); + +/** + * @internal + * Makes change of palette of all items on based values m_myPalette + * Provede zmenu palety vsech prvku na zaklade promenne m_myPalette + * + * @since 0.1 + */ + void setAllPalettes (void); + +/** + * @internal + * Makes font's change of all items, based on values m_panelFont and m_panelBoldFont + * Provede zmenu fontu vsech prvku, na zaklade promennych m_panelFont and mpanelBoldFont + * + * @since 0.1 + */ + void changePanelFont (void); + + + QLabel* m_textLabel1; + QLabel* m_textLabel2; + QLabel* m_textLabel3; + QLabel* m_textLabel4; + QLabel* m_textLabel5; + QLabel* m_textLabel6; + QLabel* m_textLabel7; + QLabel* m_textLabel8; + QLabel* m_textLabel9; + QLabel* m_textLabel10; + QLabel* m_textLabel11; + + QLabel* m_textLabelManufac; + QLabel* m_textLabelName; + QLabel* m_textLabelSerial; + QLabel* m_textLabelFirm; + QLabel* m_textLabelRun; + + + KLed* m_frameOL; + KLed* m_frameOB; + KLed* m_frameOVER; + KLed* m_frameLB; + KLed* m_frameRB; + KLed* m_frameCAL; + + QLCDNumber* m_LCDNumber1; + QPalette m_LCDPaletteOk, m_LCDPaletteErr; + QPalette m_bulbsPalette; + + QColor m_upsOkColor, m_upsErrorColor, m_upsBackColor, m_helpColor; + + QFont m_panelFont; // font pro header + QFont m_panelBoldFont; // font for date + + unsigned int m_panelFlags; // selects which of rows will be shown/ urcuji ktera radka bude rozsvicena 1 OL, 2 OB, 3 OVER, 4 RB, CAL 5 ... + + QPalette m_myPalette; + + + QGroupBox* m_bulbsGroupBox; + QGroupBox* m_messGroupBox; + QGroupBox* m_valGroupBox; + + bool m_typeOfLCDColor; + + QVBoxLayout* m_mainLayout; + + QHBoxLayout* m_OLayout; + QHBoxLayout* m_LBLayout; + QHBoxLayout* m_RBLayout; + QHBoxLayout* m_CALLayout; + QHBoxLayout* m_manufacModelLayout; + QHBoxLayout* m_manufacLayout; + QHBoxLayout* m_nameLayout; + QHBoxLayout* m_serialLayout; + QHBoxLayout* m_firmLayout; + QHBoxLayout* m_runLayout; +}; + +#endif + diff --git a/src/knutinstcomms.cpp b/src/knutinstcomms.cpp new file mode 100755 index 0000000..e21ebfc --- /dev/null +++ b/src/knutinstcomms.cpp @@ -0,0 +1,137 @@ +/*************************************************************************** + knutinstcomms.cpp - description + ------------------- + begin : ct ríj 24 2002 + copyright : (C) 2002 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "knutinstcomms.h" +#include "knutprintupsvar.h" +#include "knutvardata.h" + +#include +#include + + +#include +#include +#include +#include + + +KNutInstComms::KNutInstComms(QString* userName, QString* userPassword, const QString uName, const QString password, KNutNet* const upsNet, QWidget* parent, const char* name, const bool modal) +: KDialogBase(Plain, i18n("Instant commands"),Ok|Cancel,Ok, parent, name, modal, true), m_upsNet(upsNet),m_oldUserName(userName), m_oldUserPassword(userPassword) { + upsICommDef upsIComm; + + + if (m_upsNet->getState() != KNutNet::Connected) { // no connection - no instant commnads + KNutVarData::showError (KNutNet::NotConnection); + m_upsConnectOk=false; + } + else { + m_upsConnectOk=true; + QFrame *page = plainPage(); + QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() ); + QLabel *label1 = new QLabel (i18n("RUN INSTANT COMMAND"),page,"label1"); + label1->setAlignment(Qt::AlignHCenter); + topLayout->addWidget(label1); + + QLabel *label2 = new QLabel (i18n("Command:"),page,"label2"); + m_instCommBox = new KComboBox(page,"instcommbox"); + + QGridLayout *passLayout = new QGridLayout (3,2,5,"passLayout"); + QLabel *labelName = new QLabel (i18n("User name:"),page,"labelName"); + QLabel *labelPassword = new QLabel (i18n("Password:"),page,"labelPassword"); + m_lineEditName = new KLineEdit( page, "LineEditName" ); + m_lineEditPassword = new KLineEdit( page, "LineEditName" ); + if (((*m_oldUserName) == "") && ((*m_oldUserPassword) == "")) { + m_lineEditName->setText(uName); + m_lineEditPassword->setText(password); + } + else { + m_lineEditName->setText(*m_oldUserName); + m_lineEditPassword->setText(*m_oldUserPassword); + m_lineEditName->setDisabled(true); + m_lineEditPassword->setDisabled(true); + } + + // if (!((*oldUserName) == "") || !((*oldUserPassword) == "")) { + // if (!((*oldUserName) == "") && ((*oldUserPassword) == "")) { + // lineEditName->setDisabled(true); + // lineEditPassword->setDisabled(true); + // } + + m_lineEditPassword->setEchoMode(QLineEdit::Password); + + topLayout->addLayout(passLayout); + + passLayout->addWidget(label2,0,0); + passLayout->addWidget(m_instCommBox,0,1); + + passLayout->addWidget(labelName,1,0); + passLayout->addWidget(labelPassword,2,0); + passLayout->addWidget(m_lineEditName,1,1); + passLayout->addWidget(m_lineEditPassword,2,1); + + topLayout->addStretch(10); + + //loads ComboBox + int n = m_upsNet->readNumberComms()+1; + for (int i =1; i < n ; i++) { // for se testuje na zacatku pokud je n < 1 neprovede se ani jednou + if (!m_upsNet->readIComm(i, upsIComm)) + m_instCommBox->insertItem(upsIComm.upsCommName); + } + } + } + +KNutInstComms::~KNutInstComms(){ +} + + +void KNutInstComms::slotOk() { + int error =0; + + + if (((*m_oldUserName) == "") && ((*m_oldUserPassword) == "")) { + // prvni propojeni nastavime jmeno a heslo + //for the first connection we have to set name and password + if (!( error = m_upsNet->instantCommand(m_instCommBox->currentText(),m_lineEditName->text(),m_lineEditPassword->text(),false))) { + (*m_oldUserName) = m_lineEditName->text(); + (*m_oldUserPassword) = m_lineEditPassword->text(); + accept(); + } + } + else { + // for other connection name and password are not setted + if (((*m_oldUserName) == m_lineEditName->text()) && ((*m_oldUserPassword) == m_lineEditPassword->text())) { + // jen posleme prikaz // sends command only + if (!( error = m_upsNet->instantCommand(m_instCommBox->currentText(),m_lineEditName->text(),m_lineEditPassword->text(),true))) accept(); + } +// az v pristi verzi +// else +// { +// // odpojime a pripojime +// // nastavime jmeno a heslo +// if (!( error = myUpsNet->instantCommand(instCommBox->currentText(),lineEditName->text(),lineEditPassword->text(),false))) { +// (*oldUserName) = lineEditName->text(); +// (*oldUserPassword) = lineEditPassword->text(); +// accept(); +// } +// } + } + if (error) KNutVarData::showError (error); + } + +//bool KNutInstComms::upsOk (void) { return m_upsConnectOk; } + + diff --git a/src/knutinstcomms.h b/src/knutinstcomms.h new file mode 100755 index 0000000..55e02b1 --- /dev/null +++ b/src/knutinstcomms.h @@ -0,0 +1,97 @@ +/*************************************************************************** + knutinstcomms.h - description + ------------------- + begin : ct ríj 24 2002 + copyright : (C) 2002 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNUTINSTCOMMS_H +#define KNUTINSTCOMMS_H + +#include "knutnet.h" + +#include +#include +#include +#include + + +class QString; + + +/** + * This class is graphic interface for runinng of instant commands. + * Tato trida je graficke rozhrani pro spusteni okamzitych prikazu. + * + * @author Daniel Prynych + * @short Okamzite prikazy + * @version 0.4 +*/ +class KNutInstComms : public KDialogBase { +public: + + +/** + * Construktor - Creates window for select of instant command. + * Konstruktor - vytvori okno pro vyber okamziteho prikazu. + * + * @param uName Determines user name. + * @param password Determines passwprd. + * @param uName Urcuje uzivatelske jmeno. + * @param password Urcuje heslo. + * @param upsNet Je odkaz na instanci tridy KNutNet. + * + * @since 0.4 + **/ + KNutInstComms(QString* userName, QString* userPassword, const QString uName, const QString password, KNutNet* const upsNet, QWidget* parent = 0, const char* name = 0, bool const modal = TRUE); + +/** + * Destruktor + * + * @since 0.3 + **/ + ~KNutInstComms(); + + +/** + * Vraci true pokud existuje pripojeni na server a vytvorilo se + * ovladaci okno pro odeslani prikazu. + * + * @since 0.3 + **/ + bool upsOk (void) { return m_upsConnectOk; }; + + +private slots: +/** + * @internal + * + * Provede akci, da prikaz k provedeni okamziteho prikazu. + */ + virtual void slotOk(); + + +private: + KLineEdit *m_lineEditName; + KLineEdit *m_lineEditPassword; + KComboBox *m_instCommBox; + + KNutNet* m_upsNet; + bool m_upsConnectOk; + + QString* m_oldUserName; + QString* m_oldUserPassword; + +}; + +#endif diff --git a/src/knutmainwindow.cpp b/src/knutmainwindow.cpp new file mode 100644 index 0000000..c5aaf16 --- /dev/null +++ b/src/knutmainwindow.cpp @@ -0,0 +1,813 @@ +/*************************************************************************** + knutmainwindow.cpp - description + ------------------- + begin : Po cen 16 2003 + copyright : (C) 2003 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + + +#include "knutmainwindow.h" +#include "knutvardata.h" + +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include + + + + +#include +#include +#include + +#include + + + +extern const char *nameUpsVars1[]; +extern const char *nameUpsVars2[]; + +const char *descrOfConnection = I18N_NOOP("test of conection from 5"); + + + +KNutMainWindow::KNutMainWindow(QStringList *tListKNutEvent, KNutVarData::upsInfoDef* tActiveUpsInfo, KNutVarData::SettingDataDef* tSettingData, KNutUpsData* tUpsRecords, KNutVarData* tAnalogRecords, QWidget* parent, const char *name) : KMainWindow(parent, name), + m_listKNutEvent(tListKNutEvent), m_activeUpsInfo(tActiveUpsInfo),m_settingData (tSettingData), + m_upsRecords(tUpsRecords), m_analogRecords (tAnalogRecords) { + + + + m_settingData->activatedMainWindow=true; //information about state of mainWindow + + initVars(); + initStatusBar(); + initAction(); +// createGUI ("/home/dan/Projekty/knutclient/src/knutclientui.rc"); // pred distribuci nezapomenout odstranit retezec + // createGUI vytvori zakladni strukturu podle souboru knutclientui.rc + createGUI (); + initToolBar (); + + + m_descriptionAction->setChecked(m_settingData->useDescription); + + //sets input frequency and input voltage + //nastavime vstupni frekvenci a vstupni napeti + m_analogRecords->setFrequency(m_settingData->inputFrequency); + m_analogRecords->setVoltage(m_settingData->inputVoltage); + + //sets palette for analog panels + // nastavime paletu pro analogove panely + if (m_settingData->customBAnalogColor) { + m_aPanelPalette.setColor(QPalette::Active,QColorGroup::Background,m_settingData->aPanelBackgroundColor); + m_aPanelPalette.setColor(QPalette::Inactive,QColorGroup::Background,m_settingData->aPanelBackgroundColor); + } + + if (m_settingData->customBColor) { + m_areaPalette.setColor(QPalette::Active,QColorGroup::Background,m_settingData->mainBackgroundColor); + m_areaPalette.setColor(QPalette::Inactive,QColorGroup::Background,m_settingData->mainBackgroundColor); + } + + + // makes main area // Vytvorime hlavni plochu + m_area = new QLabel (this); + setCentralWidget (m_area); + + QHBoxLayout* mainLayout = new QHBoxLayout(m_area); + m_mainSplit = new QSplitter(Qt::Horizontal,m_area); + m_mainSplit->setOpaqueResize(true); + + mainLayout->addWidget(m_mainSplit); + if (m_settingData->customBPanelColor) { + m_mPanelPalette.setColor(QPalette::Active,QColorGroup::Background,m_settingData->mPanelBackgroundColor); + m_mPanelPalette.setColor(QPalette::Inactive,QColorGroup::Background,m_settingData->mPanelBackgroundColor); + } + + QScrollView* panelSV = new QScrollView(m_mainSplit,"panelSV"); + if (m_settingData->customFont) + m_frontPanel = new KNutFrontPanel (&m_mPanelPalette,m_mainSplit,m_settingData->panelFlags,&(m_settingData->mPanelFont),"FrontPanel"); + else + m_frontPanel = new KNutFrontPanel (&m_mPanelPalette,m_mainSplit,m_settingData->panelFlags,&(m_settingData->systemFont),"FrontPanel"); + panelSV->addChild(m_frontPanel); + panelSV->setResizePolicy ( QScrollView::AutoOneFit ) ; + m_mainSplit->setResizeMode (panelSV,QSplitter::FollowSizeHint); + + m_panelMeter = new KNutPanelMeter(m_aPanelPalette,m_activeUpsInfo,m_settingData,m_analogRecords,m_mainSplit); + m_mainSplit->setResizeMode (m_panelMeter,QSplitter::Stretch ); + + m_area->setPalette(m_areaPalette); + m_panelMeter->setPalette(m_areaPalette); + + // sets Combo a actives connections to meter panels + // Nastavime COMBO a pripadne aktivujeme spojeni na merici panely + int activeUpsNameIndex = activeMainCombo (); + if (activeUpsNameIndex != -1) toolBar(0)->getCombo(1)->setCurrentItem( activeUpsNameIndex ); + + showUpsData(); + setGeometry (m_settingData->x,m_settingData->y,m_settingData->width,m_settingData->height); + show(); + + + //message has to include into status bar after showing window, + // only for KDE relase < 3.0.0 + + // jinak se nastavi minimalni velikost ne mensi nez delka aktivni zpravy. + + initStatusBarMessage(); + } + + + +void KNutMainWindow::addComboStatusItem (const QString text, const QString name) { + if (m_infoCombo->count() >= (int)knc::maxCountKNutEvent) m_infoCombo->removeItem(0); + if (m_listKNutEvent->count() > knc::maxCountKNutEvent) m_listKNutEvent->remove(m_listKNutEvent->begin()); + + QString dateTime(QDate::currentDate().toString()); + dateTime +=" " + QTime::currentTime().toString(); + if (name.isEmpty()) { + m_infoCombo->insertItem(dateTime+" "+text); + m_listKNutEvent->append(dateTime+" "+text); + } + else { + m_infoCombo->insertItem(dateTime+" "+name+" : "+text); + m_listKNutEvent->append(dateTime+" "+name+" : "+text); + } + m_infoCombo->setCurrentItem(m_infoCombo->count()-1); + if (m_listKNutEvent->count() > knc::maxCountKNutEvent) m_listKNutEvent->remove(m_listKNutEvent->begin()); + } + + +KNutMainWindow::~KNutMainWindow(void) { + + m_settingData->height = height(); + m_settingData->width = width(); + m_settingData->y = y(); + m_settingData->x = x(); + + delete m_frontPanel; + delete m_panelMeter; + } + + +void KNutMainWindow::setConfig (unsigned int changeSetting) { + + +//qDebug ("KNutMainWindow::setConfig"); + KNutVarData::VarStrucDef analogMemberData; + bool repaintVoltagePanels = false; + bool repaintFrequencyPanels = false; + bool repaintAllPanels = false; + bool repaintOAPanels = false; + + // Main Setting + + // Nastavime zmenu barvy pozadi + // sets background color + if (changeSetting & KNutPrefDlg::ChangeCustomBColor) { + if (!m_settingData->customBColor) { // nastavime barvu pozadi podle systemu + m_area->setPalette (m_mainPalette); // we set background color based on system + m_panelMeter->setPalette (m_mainPalette); + repaint(); + } + else { + m_areaPalette.setColor(QPalette::Active,QColorGroup::Background,m_settingData->mainBackgroundColor); + m_areaPalette.setColor(QPalette::Inactive,QColorGroup::Background,m_settingData->mainBackgroundColor); + m_area->setPalette (m_areaPalette); + m_panelMeter->setPalette (m_areaPalette); + repaint(); + } + } + else { + if (changeSetting & KNutPrefDlg::ChangeMBColor ) { + m_areaPalette.setColor(QPalette::Active,QColorGroup::Background,m_settingData->mainBackgroundColor); + m_areaPalette.setColor(QPalette::Inactive,QColorGroup::Background,m_settingData->mainBackgroundColor); + m_area->setPalette (m_areaPalette); + m_panelMeter->setPalette (m_areaPalette); + repaint(); + } + } + + // Sets background for panels + // sets frequence + // sets voltage + // XFer is switch-on and one exist for this UPS + + + if ((changeSetting & KNutPrefDlg::ChangeXFer) || // je provedena nejaka zmena na napeti nebo frekvence + (changeSetting & KNutPrefDlg::ChangeVoltage) || (changeSetting & KNutPrefDlg::ChangeFrequency)) { + + if ((changeSetting & KNutPrefDlg::ChangeXFer) && (m_settingData->lowHighXfer) && (m_existLowHighXfer)) { + // xfer was activated + if (changeSetting & KNutPrefDlg::ChangeXFer) { + if (abs((int)(230 - (m_lowXfer + (m_highXfer - m_lowXfer) /2))) > abs((int)(120 - (m_lowXfer + (m_highXfer - m_lowXfer) /2)))) { + m_analogRecords->setVoltage(120); + m_analogRecords->setFrequency(60); + } + else { + m_analogRecords->setVoltage(230); + m_analogRecords->setFrequency(50); + } + m_analogRecords->setXfer(m_lowXfer,m_highXfer); + repaintVoltagePanels = true; + repaintFrequencyPanels = true; + } + } + else { + // XFER neni aktivovano nebo je nepodporuje UPS + // XFER isn;t activated or XFER isn't supported by UPS + if ((changeSetting & KNutPrefDlg::ChangeVoltage) || ((changeSetting & KNutPrefDlg::ChangeXFer))) { + // byla aktivovana zmena napeti nebo zmena xfer a zaroven ho ups podporuje + m_analogRecords->setVoltage(m_settingData->inputVoltage); + repaintVoltagePanels=true; + } + if ((changeSetting & KNutPrefDlg::ChangeFrequency) || ((changeSetting & KNutPrefDlg::ChangeXFer))) { + // byla aktivovana zmena napeti nebo zmena xfer a zaroven ho ups podporuje + m_analogRecords->setFrequency(m_settingData->inputFrequency); + repaintFrequencyPanels=true; + } + } + } + + // Analog setting + // now DigitalProcesing of pointer + if (changeSetting & KNutPrefDlg::ChangeTypeOfDigProcessing) { //type of digital processing was changed + m_panelMeter->changeAnalogPanelsDigProcessing(); //paint pointers with new digotal processing + } + + if ((changeSetting & KNutPrefDlg::ChangeCustomAPanelBColor) || // barva panelu je zmenena, panel color is changed + (changeSetting & KNutPrefDlg::ChangeAPBColor)) { + if (m_settingData->customBAnalogColor) { + m_aPanelPalette.setColor(QPalette::Active,QColorGroup::Background,m_settingData->aPanelBackgroundColor); + m_aPanelPalette.setColor(QPalette::Inactive,QColorGroup::Background,m_settingData->aPanelBackgroundColor); + repaintAllPanels=true; + m_panelMeter->setAnalogBG(m_aPanelPalette); + } + else { + m_aPanelPalette = m_mainPalette; + repaintAllPanels=true; + m_panelMeter->setAnalogBG(m_aPanelPalette); + } + } + + if ((changeSetting & KNutPrefDlg::ChangeCustomAPanelOColor) || // je provedena zmena barvy panelu + (changeSetting & KNutPrefDlg::ChangeAPOColor)) { + if (m_settingData->customOAnalogColor) { + repaintAllPanels=true; + repaintOAPanels=true; + } + else { + repaintAllPanels=true; + repaintOAPanels=true; + } + } + // regeneration of panel uses for setting Main and setting Analog + // pregenerovani panelu slozi pro setting Main a setting Analog + m_panelMeter->repaintAnalogPanels (repaintFrequencyPanels, repaintVoltagePanels, repaintAllPanels); + + if (m_activeUpsInfo->record.name != "") { + m_panelMeter->setSize(); + m_mainSplit->refresh(); + } + + // UPS Setting + if (changeSetting & KNutPrefDlg::ChangeUpsSetting ) activeMainCombo(); + else { + if (changeSetting & KNutPrefDlg::ChangeUpsCount) activeMainCombo(); + } + + // Main Panel Setting + // change of background color + // zmena barvy pozadi; + if (changeSetting & KNutPrefDlg::ChangeCustomMPanelBColor) { + if (!m_settingData->customBPanelColor) { // nastavime barvu pozadi podle systemu + m_frontPanel->setPalette (m_mainPalette); + } + else { + m_mPanelPalette.setColor(QPalette::Active,QColorGroup::Background,m_settingData->mPanelBackgroundColor); + m_mPanelPalette.setColor(QPalette::Inactive,QColorGroup::Background,m_settingData->mPanelBackgroundColor); + m_frontPanel->setPalette (m_mPanelPalette); + } + } + else { + if (changeSetting & KNutPrefDlg::ChangeMPBColor ) { + m_mPanelPalette.setColor(QPalette::Active,QColorGroup::Background,m_settingData->mPanelBackgroundColor); + m_mPanelPalette.setColor(QPalette::Inactive,QColorGroup::Background,m_settingData->mPanelBackgroundColor); + m_frontPanel->setPalette (m_mPanelPalette); + } + } + + if (changeSetting & KNutPrefDlg::ChangeMainPanelSetting ) { + if (m_settingData->panelFlags != m_frontPanel->getPanelFlags()) { + m_frontPanel->setPanelFlags(m_settingData->panelFlags); + //aktivujema a presuneme prvky panelu + // activates and moves items of panel + m_frontPanel->paintPanel(); + } + } + + // Font panel setting + if (changeSetting & KNutPrefDlg::ChangeAnalogFont ) { + QFont newAnalogFont; + if (m_settingData->customFont) { + newAnalogFont=m_settingData->aPanelFont; + } + else { + newAnalogFont=m_settingData->systemFont; + } + + m_panelMeter->slotSetPanelsFont(newAnalogFont); + } + if (changeSetting & KNutPrefDlg::ChangePanelFont ) { + QFont newPanelFont; + if (m_settingData->customFont) { + m_frontPanel->slotSetPanelFont(m_settingData->mPanelFont); + } + else { + m_frontPanel->slotSetPanelFont(m_settingData->systemFont); + } + } + } + + + + +void KNutMainWindow::showUpsData (void) { + +//qDebug ("KNutMainWindow::showUpsData start"); + + + if ((m_activeUpsInfo->upsNet != 0L) && (!m_activeUpsInfo->netError) && + (m_activeUpsInfo->upsDriverState == knc::connected)) { + int runtimeVal; + QString nutStringVar; + bool okFloat; +// activeUpsInfo->oldStatus=KNutNet::initStatus; + + // Nastaveni nemenych dat jsou precteny pouze jednou, predpoklada se jejich nemenost + // setting of unchange data, ones are reading only one. + nutStringVar = m_activeUpsInfo->upsNet->readStringVar(m_activeUpsInfo->lowxferVar); + switch (m_activeUpsInfo->nutVariables) { + case 1: + m_manufacturer = m_activeUpsInfo->upsNet->readStringVar("MFR"); + m_upsModel = m_activeUpsInfo->upsNet->readStringVar("MODEL"); + m_serial = m_activeUpsInfo->upsNet->readStringVar("SERIAL"); + m_firmrev = m_activeUpsInfo->upsNet->readStringVar("FIRMREV"); + break; + case 2: + m_manufacturer = m_activeUpsInfo->upsNet->readStringVar("ups.mfr"); + m_upsModel = m_activeUpsInfo->upsNet->readStringVar("ups.model"); + m_serial = m_activeUpsInfo->upsNet->readStringVar("ups.serial"); + m_firmrev = m_activeUpsInfo->upsNet->readStringVar("ups.firmware"); + break; + } + QString allUpsName = m_manufacturer + " " + m_upsModel; + m_frontPanel->setAllNameUps (allUpsName); + m_frontPanel->setMFRUps (m_manufacturer); + m_frontPanel->setNameUps (m_upsModel); + m_frontPanel->setSerialUps (m_serial); + m_frontPanel->setFirmRevUps (m_firmrev); + // try if LOWXFER and HIGHXFER or our values are existed + //Zjistime zda existuji LOWXFER a HIGHXFER pripadne jeji hodnoty + + if (nutStringVar.isNull()) { + m_lowXfer =-1; + m_highXfer=-1; + m_existLowHighXfer = false; + } + else { + m_lowXfer = atof(nutStringVar); + nutStringVar = m_activeUpsInfo->upsNet->readStringVar(m_activeUpsInfo->highxferVar); + if (nutStringVar.isEmpty()) { + m_highXfer = -1; + m_existLowHighXfer = false; + } + else { + m_highXfer = atof(nutStringVar); + m_existLowHighXfer = true; + } + } + int upsStatus=0; + if ((upsStatus = m_activeUpsInfo->upsNet->readStatus ()) != -1) + m_frontPanel->setPanel(upsStatus); + + if ( !m_activeUpsInfo->upsNet->existName(m_activeUpsInfo->runtimeVar)) { + nutStringVar = m_activeUpsInfo->upsNet->readStringVar(m_activeUpsInfo->runtimeVar); + if (nutStringVar.isEmpty()) runtimeVal=knc::numberVarError; + else { + runtimeVal=(int)nutStringVar.toFloat(&okFloat); + if (!okFloat) runtimeVal = knc::numberVarError; + } + } + else runtimeVal=knc::numberVarError; + m_frontPanel->setRuntime(runtimeVal); + + m_panelMeter->deActivateAnalogs(); + + // pokud je pouzito XFER nastavime hodnoty + // when XFER is used we set values + if (m_settingData->lowHighXfer) { + // xfer je nastaveno + // xfer is seted + if (m_existLowHighXfer) { + if (abs((int)(230 - (m_lowXfer + (m_highXfer - m_lowXfer) /2))) > abs((int)(120 - (m_lowXfer + (m_highXfer - m_lowXfer) /2)))) { + m_analogRecords->setVoltage(120); + m_analogRecords->setFrequency(60); + } + else { + m_analogRecords->setVoltage(230); + m_analogRecords->setFrequency(50); + } + m_analogRecords->setXfer(m_lowXfer,m_highXfer); + } + } + +//qDebug ("KNutMainWindow::showUpsData 1"); + m_panelMeter->activateAnalogs(); // makes panel and makes background of panel + repaintAnalogs(false); +//qDebug ("KNutMainWindow::showUpsData 2"); + m_panelMeter->setSize(true); +//qDebug ("KNutMainWindow::showUpsData 3"); + m_mainSplit->refresh(); + // doesn't repaint analog pointers, because pointers will be repainted twice +//qDebug ("KNutMainWindow::showUpsData 4"); +// repaintAnalogs(false); // don't make this +//qDebug ("KNutMainWindow::showUpsData 5"); + } + else { + cleanPanels(); + } + } + + +void KNutMainWindow::zeroingPanels (void) { + + m_panelMeter->zeroingPanels(); + m_frontPanel->setRuntime(knc::numberVarError); + m_frontPanel->setPanel(0); + } + + +void KNutMainWindow::hideUpsData (void) { + m_frontPanel->cleanPanel(); + } + +void KNutMainWindow::setCombo (QString name) { + if (toolBar(0)->getCombo(1)->currentText() != name) toolBar(0)->getCombo(1)->setCurrentText(name); + } + +void KNutMainWindow::repaintPanel (void) { + QString nutStringVar; + + if (m_activeUpsInfo->upsNet == 0) return; + if (!m_activeUpsInfo->upsNet->existName(m_activeUpsInfo->runtimeVar)) { + nutStringVar = m_activeUpsInfo->upsNet->readStringVar(m_activeUpsInfo->runtimeVar); + if (nutStringVar.isEmpty()) m_frontPanel->setRuntime(0); + else m_frontPanel->setRuntime( nutStringVar.toInt()); + } + else m_frontPanel->setRuntime(knc::numberVarError); + // precteme status a nastavime zarovky panelu + int status = m_activeUpsInfo->upsNet->readStatus(); + m_frontPanel->setPanel(status); + } + + +/// je volan vzdy po timeoutu +/// this function is called after timeout always +void KNutMainWindow::repaintAnalogs ( bool run ) { +//qDebug ("KNutMainWindow::repaintAnalogs"); + + + QString nutStringVar; + float numVar; + bool newRange = false; + + if ((m_settingData->lowHighXfer) && (m_existLowHighXfer)) { + QString nutStringVar; + + nutStringVar = m_activeUpsInfo->upsNet->readStringVar(m_activeUpsInfo->lowxferVar); + if (! nutStringVar.isEmpty()) { + float helpLowXfer = nutStringVar.toFloat(); + nutStringVar = m_activeUpsInfo->upsNet->readStringVar(m_activeUpsInfo->highxferVar); + if (! nutStringVar.isEmpty()) { + float helpHighXfer = nutStringVar.toFloat(); + if ((helpLowXfer != m_lowXfer) || (helpHighXfer != m_highXfer)) { + m_lowXfer=helpLowXfer; + m_highXfer=helpHighXfer; + m_analogRecords->setXfer(m_lowXfer,m_highXfer); + newRange = true; + } + } + } + } + +//qDebug ("KNutMainWindow::repaintAnalogs 1"); + + for (int i=0; i< knc::NumberOfVars; i++) { + if (m_activeUpsInfo->record.upsVarCode[i] != 0) { // jistota pokud by nam to nekde propadlo + switch (m_activeUpsInfo->nutVariables) { + case 1: + nutStringVar = m_activeUpsInfo->upsNet->readStringVar ((char *)nameUpsVars1[m_activeUpsInfo->record.upsVarCode[i]]); + break; + case 2: + nutStringVar = m_activeUpsInfo->upsNet->readStringVar ((char *)nameUpsVars2[m_activeUpsInfo->record.upsVarCode[i]]); + break; + } +//qDebug ("KNutMainWindow::repaintAnalogs 2 "); + + if (nutStringVar.isEmpty()) numVar=0; + else numVar = nutStringVar.toFloat(); + + m_panelMeter->repaintScaleAnalogPanel (i, numVar); + if (newRange) m_panelMeter->repaintAnalogPanels (true, true, false); //freq volt + m_panelMeter->repaintAnalogPointer(i,numVar,run); + } + } // end for +//qDebug ("KNutMainWindow::repaintAnalogs 3 "); + } + + + +void KNutMainWindow::cleanPanels (void) { + + m_frontPanel->cleanPanel(); + m_panelMeter->deActivateAnalogs(); + m_panelMeter->setSize(false); + m_mainSplit->refresh(); + } + +void KNutMainWindow::startConnectPB ( const int count ) { + m_connectProggresBar->setTotalSteps(count); + m_connectProggresBar->setProgress(1); + m_connectProggresBar->show(); + } + + +void KNutMainWindow::setProgressConnectPB ( const int progress ) { + m_connectProggresBar->setProgress(progress); + } + + +void KNutMainWindow::hideConnectPB ( void ) { + m_connectProggresBar->setProgress(0); + m_connectProggresBar->hide(); + } + + +/*********************************************************************************************/ +/* */ +/* PRIVATE SLOTS */ +/* */ +/*********************************************************************************************/ + + +//this SLOT is for older KDE only +void KNutMainWindow::slotShowToolBar(void) { + + if(toolBar("mainToolBar")->isVisible()) toolBar("mainToolBar")->hide(); + else toolBar("mainToolBar")->show(); + } + + +void KNutMainWindow::slotShowStatusBar(void) { + + if(statusBar()->isVisible()) { + statusBar()->hide(); + } + else { + statusBar()->show(); + } + } + +void KNutMainWindow::slotDescription(void) { + + if (m_descriptionAction->isChecked()) { + if (!m_activeUpsInfo->upsNet->isDescription()) m_activeUpsInfo->upsNet->getDescription(); + m_settingData->useDescription=true; + } + else m_settingData->useDescription=false; + emit saveConf(); + } + + +void KNutMainWindow::slotPrintUPSVars(void) { + + emit showUPSVars(); +} + + +void KNutMainWindow::slotInstComms(void) { + + emit makeInstComms(); + } + +void KNutMainWindow::slotRWVars(void) { + + emit makeRWVars(); + } + +void KNutMainWindow::slotRefreshConnection(void) { + + emit makeRefreshConnection(); + } + + +void KNutMainWindow::slotChangeRWVars ( QString ) { + } + + + +void KNutMainWindow::closeEvent( QCloseEvent *e ){ + + m_settingData->activatedMainWindow=false; //information about state of mainWindow + e->accept(); + } + + + +void KNutMainWindow::slotConfigureKeys() { + + KKeyDialog::configure( actionCollection(), this ); + } + + +void KNutMainWindow::slotCloseKnutClient (void) { + if (m_settingData->areYouSure) { + if (KMessageBox::warningYesNo (0,i18n("Are you sure ?")) == 3) + emit endApplication(); + } + else emit endApplication(); + } + + + + + void KNutMainWindow::slotChangeUPS (const QString &name) { + emit UPSChanged (name); + } + + +void KNutMainWindow::slotPreferencesUps() { + emit preferenceUps(); + } + + +/*********************************************************************************************/ +/* */ +/* PRIVATE FUNCTIONS */ +/* */ +/*********************************************************************************************/ + + + +void KNutMainWindow::initStatusBar ( void ) { + // sets main message if statusbar + // nastavime hlavni hlaseni v statusbaru + + // QString progressString("%v ");// += descrOfConnection; +// progressString.append(descrOfConnection); + + m_progressFormatString.append("%v "); + m_progressFormatString.append(descrOfConnection); + m_infoCombo = new KComboBox (statusBar(),"infoCombo"); + m_infoCombo->setMaxCount(knc::maxCountKNutEvent+1); // nastavime maximalni pocet polozek v Combu + // pro rezervu pridame jeste jednu +//sets maximal if items in Combo + statusBar()->addWidget(m_infoCombo,10,false); + + m_connectProggresBar = new KProgress(statusBar(),"connectProgressBar"); + statusBar()->addWidget(m_connectProggresBar,5,false); + m_connectProggresBar->setProgress(0); +// m_connectProggresBar->setFormat("%v test of conection from 5"); + m_connectProggresBar->setFormat(m_progressFormatString); + m_connectProggresBar->hide(); + } + + +void KNutMainWindow::initStatusBarMessage ( void ) { + // loads data into comboBox + QStringList::iterator it; + + for ( it = m_listKNutEvent->begin(); it != m_listKNutEvent->end(); ++it ) { + m_infoCombo->insertItem((*it)); + } + statusBar()-> setItemAlignment(0,Qt::AlignHCenter|Qt::AlignVCenter); + m_infoCombo->setCurrentItem(m_infoCombo->count()-1); + } + + +void KNutMainWindow::initToolBar ( void ) { + + QLabel *upsNazev = new QLabel ("UPS : ",toolBar("mainToolBar")); + // upsNazev is connected on toolBaar, dosn't need to call desctructor + toolBar ("mainToolBar")->insertWidget (0,upsNazev->sizeHint().width(),upsNazev); + toolBar ("mainToolBar")->insertCombo("",1,false, SIGNAL (activated (const QString &)),this,SLOT (slotChangeUPS (const QString &))); + // bude se pouze vybirat-------------------^^^ + KComboBox *combo = toolBar("mainToolBar")->getCombo(1); + combo->clear(); + toolBar("mainToolBar")->setBarPos (KToolBar::Top); + //sets toolbarr no movable / nastavime toolBar nepresouvatelny + setToolBarsMovable(false); + } + + +void KNutMainWindow::initAction ( void ) { + + // KAction and KStdAction must be to make before command createGUI, function initToolBar is runed after create GUI + m_quit = KStdAction::quit (this, SLOT (slotCloseKnutClient()), actionCollection()); + m_quit->setStatusText(i18n("Quits the application")); + + m_preferencesUps = KStdAction::preferences (this, SLOT (slotPreferencesUps()), actionCollection(),"options_configure"); + new KAction(i18n("&Showing UPS variables and commands"),0,this,SLOT(slotPrintUPSVars()),actionCollection(),"printupsvars"); + new KAction(i18n("&Running instant commands"),0,this,SLOT(slotInstComms()),actionCollection(),"instcomms"); + new KAction(i18n("Setting R&W variables"),0,this,SLOT(slotRWVars()),actionCollection(),"rwvars"); + +/////////////////// +// KStdAction::showToolbar (this, SLOT (slotShowToolBar()), actionCollection()); +// setStandardToolBarMenuEnabled(true); since KDE version 3.1 + +// since version 3.1 + #if defined (KDE_VERSION_MAJOR) + #if KDE_VERSION_MAJOR >= 3 + #if defined (KDE_VERSION_MINOR) + #if KDE_VERSION_MINOR >= 1 + setStandardToolBarMenuEnabled(true); + #else + KStdAction::showToolbar (this, SLOT (slotShowToolBar()), actionCollection()); + #endif + #else + KStdAction::showToolbar (this, SLOT (slotShowToolBar()), actionCollection()); + #endif + #else + KStdAction::showToolbar (this, SLOT (slotShowToolBar()), actionCollection()); + #endif + #else + KStdAction::showToolbar (this, SLOT (slotShowToolBar()), actionCollection()); + #endif + + + KStdAction::showStatusbar (this, SLOT (slotShowStatusBar()), actionCollection()); + + m_descriptionAction = new KToggleAction(i18n("&Using descriptions"),0,this,SLOT(slotDescription()),actionCollection(),"use_description"); + + KStdAction::keyBindings( this, SLOT(slotConfigureKeys()),actionCollection()); + new KAction (i18n("Reconnect"),"reload",Key_F5,this,SLOT(slotRefreshConnection()),actionCollection(),"reconnect"); + } + +void KNutMainWindow::initVars ( void ) { + + //m_activeUpsIndex = -1; + + //nastavime fonty + // sets fonts + m_mainPalette= kapp->palette(); + m_areaPalette=m_mainPalette; + m_mPanelPalette=m_mainPalette; + m_aPanelPalette=m_mainPalette; + } + + +int KNutMainWindow::activeMainCombo (void) { + int activeUpsNameIndex = -1; // zadne upsName neni aktivni , any upsName is not active + KComboBox *combo = toolBar(0)->getCombo(1); + + //naplnime comboBox + //loads comboBox + combo->clear(); + for (int i=0; i < m_upsRecords->getCount (); i++) { + combo->insertItem (m_upsRecords->getName(i)); + // ulozime si poradove cislo jmena aktivniho ups + // save serial number of active usp name + if ((m_upsRecords->getName(i)) == m_activeUpsInfo->record.name) activeUpsNameIndex = i; + } + return activeUpsNameIndex; + } + +#include "knutmainwindow.moc" diff --git a/src/knutmainwindow.h b/src/knutmainwindow.h new file mode 100644 index 0000000..01b9815 --- /dev/null +++ b/src/knutmainwindow.h @@ -0,0 +1,346 @@ +/*************************************************************************** + knutmainwindow.h - description + ------------------- + begin : Po cen 16 2003 + copyright : (C) 2003 by Daniel Prynych + email : Daniel@prynych.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNUTMAINWINDOW_H +#define KNUTMAINWINDOW_H + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "knutprefdlg.h" +#include "knutupsdata.h" +#include "knutvardata.h" +#include "knutfrontpanel.h" +#include "knutnet.h" +#include "knutanalog.h" +#include "knutpanelmeter.h" + +#include +#include +#include +//#include + + +#include +#include +//#include + + +class QString; +class QStringList; +class QLabel; +class QPalette; +class QSplitter; +class KProgress; +//class QProgressBar; + + +/** + * Trida slouzi pro zobrazeni okna s informacemi o UPS. + * Class is used for view window with informations about UPS + * + * @author Daniel Prynych + * @short Hlavni okno + * @version 0.2.3 + */ +class KNutMainWindow : public KMainWindow { + Q_OBJECT + public: + +/** + * Constructor - makes main window. + * Konstruktor - vytvori hlavni okno. + * + * @param tListKNutEvent pointer on QStringList contain text information about events (drop connection, switch ..) + * @param tActiveUpsInfo pointer on data about active UPS + * @param tSettingData pointer on basic data of program (background color, intercircle, pointers...,fonts..) + * @param tAnalogRecords pointer in class which works with data about UPS + * @param tListKNutEvent ukazatel na QStringList obsahuje textove udaje o udalostech (ztrata spojeni, prepnuti atd.) + * @param tActiveUpsInfo ukazatel na data o aktivni UPS + * @param tSettingData ukazatel na zakladni data programu (barvy pozadi, mezikruzi, rucicky ... ,fonty atd ) + * @param tAnalogRecords ukazatel na tridu ktera pracuje s daty o upsekach + * + * @since 0.3.1 + **/ + KNutMainWindow(QStringList* tListKNutEvent, KNutVarData::upsInfoDef* tActiveUpsInfo, KNutVarData::SettingDataDef* tSettingData, KNutUpsData* tUpsRecords, KNutVarData* tAnalogRecords, QWidget* parent=0,const char *name=0); + +/** + * Destructor + * + * @since 0.1.1 + **/ + ~KNutMainWindow(); + +/** + * Repaints information of main panel. + * Prekresli informace hlavniho panelu. + * + * @since 0.1.2 + **/ + void repaintPanel(void); + + +/** + * Repaints analog panels based on their status. + * Prekresli analogove panely na zaklade jejich stavu. + * @param run = TRUE makes immediately repaint of panel + * + * @since 0.3.1 + **/ + void repaintAnalogs ( bool run = true); + +/** + * Da prikaz k prekresleni analogovych panelu, hlavniho panelu a nastavi jejich hodnoty na + * zaklade XFer hodnot. + * Give command to repaint analog panels, main panel and sets their values based on XFer values + * @param run = TRUE makes immediately repaint of analog panels + * + * @since 0.3.1 + **/ + void showUpsData (void); + + +/** + * Adds other line into list of events and shows them on bottom part of panel. + * Prida dalsi radku do seznamu udalosti a zobrazi je v dolni casti panelu. + * + * @param text text of event. + * @param name name of UPS, name which is list of UPSes. + * @param text udava text udalosti. + * @param name udava jmeno UPS-ky tak jak je vedena v seznamu UPS-ek tohoto programu + * + * @since 0.1 + **/ + void addComboStatusItem (const QString text, const QString name = QString::null); + +/** + * Rebuilds main panel based on value changeSetting. + * This value generates config windies + * Prestavi hlavni panel na zaklade hodnoty changeSetting. + * Tuto hodnotu generuje konfiguracni okno. + * + * @param changeSetting tell which setting was changed. + * @param changeSetting udava jake nastaveni bylo zmeneno. + * + * @since 0.1.2 + **/ + void setConfig (unsigned int changeSetting); + +/** + * Sets ComboBox (for name of UPS) + * Nastavi ComboBox (pro jmeno UPSky). + * + * ¶m name je jmeno UPSky ktere bude nastavena. + * ¶m name is name of ups which will be set. + * + * @since 0.1 + **/ + void setCombo(QString name); + +/** + * Nastavi vsechny panely na nulovo hodnotu + * Sets all pannels to zero value + * + * @since 0.2 + **/ + void zeroingPanels (void); + +/** + * Cleans front panel and panel meter (includes analog panels) . + * + * @since 0.1 + **/ + void cleanPanels (void); + +/** + * Sets and shows connect progress bar. + * Nastavi a zobrazi connect progress bar. + * + * ¶m is count of parts of progress bar. + * ¶m je pocet casti progres baru. + * + * @since 0.1 + **/ + void startConnectPB ( const int count ); + +/** + * Hide connect progress bar. + * Schova connect progress bar. + * + * @since 0.1 + **/ + void hideConnectPB ( void ); + + +/** + * Sets amount of progress for connect progress bar. + * Nastavi delku vyplne pro connect progresbar. + * + * ¶m is amount of progress. + * ¶m je delka vyplne. + * + * @since 0.1 + **/ + void setProgressConnectPB ( const int progress ); + + + signals: +/** + * This signal is emited when other UPS was selected. + * Tento signal je vyslan pokud byla vybrana jina UPS-ka. + * + * @since 0.1 + **/ + void UPSChanged (QString); + +/** + * This signal is emited when request for viewing preferences window was ordered from menu. + * Tento signal je vyslan pokud byl z menu zadan pozadavek na zobrazeni okna + * pro nastaveni programu (preference). + * + * @since 0.1 + **/ + void preferenceUps (void); + +/** + * This signal is emited, when in menu was odered requirement for viewing list of values . + * Tento signal je vyslan, pokud byl z menu zadan pozadavek na zobrazeni seznamu promennych. + * + * @since 0.1 + **/ + void showUPSVars (void); + +/** + * Tento signal je vyslan pokud byl z menu zadan pozadavek na zmenu RW promennych. + * This signal is emited when request for change RW varianles was orederd from menu. + * + * @since 0.1 + **/ + void makeRWVars(void); + + +/** + * Tento signal je vyslan pokud byl z menu vybran pozadavek na obnovu spojeni. + * This signal is emited when request for refreshing connection was selected from menu. + * + * @since 0.1 + **/ + void makeRefreshConnection(void); + +/** + * This signal is emited when request for making instant commands was selected from menu. + * Tento signal je vyslan pokud byl z menu zadan pozadavek na provedeni okamzitych prikazu. + * + * @since 0.1 + **/ + void makeInstComms(void); + +/** + * This signal is emited whem we need save configuration of program. + * Tento signal je vyslan pokud potrebujeme ulozit konfiguraci programuss. + * + * @since 0.1 + **/ + void saveConf(void); + + + +/** + * This signal is emited whem request for ending all application was selected from menu. + * Tento signal je vyslan pokud byl z menu zadan pozadavek na ukonceni cele aplikace. + * + * @since 0.1 + **/ + void endApplication(); + + protected: + void closeEvent( QCloseEvent *e ); + + + + private slots: + void slotDescription(void); + void slotShowToolBar(void); + void slotShowStatusBar(void); + void slotPreferencesUps(void); + void slotPrintUPSVars(void); + void slotInstComms(void); + void slotRWVars(void); + void slotChangeRWVars ( QString ); + void slotCloseKnutClient (void); + void slotChangeUPS (const QString &name); + void slotConfigureKeys(void); + void slotRefreshConnection(void); + +/************** private common functions ************************/ + private: + + void activeConfiguration (void); + int activeMainCombo (void); + void hideUpsData (void); + + +/************ init functions ********************/ + void initVars ( void ); + void initAction ( void ); + void initStatusBar ( void ); + void initToolBar ( void ); + void initStatusBarMessage ( void ); + + +/************** private vars **************************/ +// Nazvy promenych UPS cislovany jsou od 0 do 10 "NONE", "UTILITY", "BATTPCT", "UPSTEMP", "ACFREQ", "LOADPCT", "AMBTEMP", "AMBHUMID", "BATTVOLT", "OUTVOLT", "CURRENT" + + QStringList* m_listKNutEvent; + KNutVarData::upsInfoDef* m_activeUpsInfo; // values for selected ups / hodnoty pro vybrane ups + KNutVarData::SettingDataDef* m_settingData; // v teto strukture jsou ulozeny promene ktere nastavuji konfiguraci + KNutUpsData* m_upsRecords; + KNutVarData* m_analogRecords; + + + KAction *m_quit; + KAction *m_preferencesUps; + KToggleAction *m_descriptionAction; + + + QLabel* m_area; // main arrea, on its will server main panel and analog panels + // hlavni plocha na ni umistime panel a analogove ukazatele + + QSplitter* m_mainSplit; + KNutFrontPanel* m_frontPanel; + + // nactene hodnoty promenych UPS, tyto promene se ctou jen jednou + // readly values of UPS's variables, these varieables is read only once + QString m_manufacturer, m_upsModel, m_serial, m_firmrev; + bool m_existLowHighXfer; + float m_lowXfer, m_highXfer; + QPalette m_mainPalette, m_areaPalette, m_mPanelPalette, m_aPanelPalette; + + // Combo a pomocne struktury pro dolni radku + // Combo and help structures for bottom line. + KComboBox *m_infoCombo; + + KNutPanelMeter* m_panelMeter; + + KProgress* m_connectProggresBar; + QString m_progressFormatString; + + }; +#endif + diff --git a/src/knutmessage.cpp b/src/knutmessage.cpp new file mode 100644 index 0000000..f13b9e7 --- /dev/null +++ b/src/knutmessage.cpp @@ -0,0 +1,95 @@ +/*************************************************************************** + knutmessage.cpp - description + ------------------- + begin : So led 24 2004 + copyright : (C) 2004 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "knutmessage.h" +#include +#include + +#include +#include +#include +#include +#include + + +KNutMessage::KNutMessage(const QString messageText, const typeOfMessage type, const long int timeValidity, QWidget *parent, const char *name) : KDialogBase(Plain, "Messages",Ok,Ok, parent, name, false, false) { + + + setCaption("KNutClient"); + m_messageTimer = 0; + KIconLoader *loader = KGlobal::iconLoader(); + + switch(type) { + case infoMess: + m_ret = loader->loadIcon("messagebox_info", KIcon::NoGroup, KIcon::SizeMedium, KIcon::DefaultState, 0, true); + break; + case warningMess: + m_ret = loader->loadIcon("messagebox_warning", KIcon::NoGroup, KIcon::SizeMedium, KIcon::DefaultState, 0, true); + break; + case criticalMess: + m_ret = loader->loadIcon("messagebox_critical", KIcon::NoGroup, KIcon::SizeMedium, KIcon::DefaultState, 0, true); + break; + } + + QFrame *page = plainPage(); + + QVBoxLayout *setTopLayout = new QVBoxLayout( page, 10, spacingHint(), "setTopLayout" ); + QHBoxLayout *setMessageLayout = new QHBoxLayout( setTopLayout, spacingHint(), "setMessageLayout" ); + + QLabel* picture = new QLabel (page); + QLabel* text = new QLabel (messageText,page); + picture->setPixmap(m_ret); + + setMessageLayout->addWidget(picture); + setMessageLayout->addWidget(text); + + if (timeValidity > 0 ) { + m_messageTimer = new QTimer(this); + if (timeValidity > maxTime) + m_messageTimer->start(maxTime*1000); + else + m_messageTimer->start(timeValidity*1000); + connect (m_messageTimer,SIGNAL(timeout()),this,SLOT(timeout())); + disableResize(); + } + } + +KNutMessage::~KNutMessage(){ + } + +void KNutMessage::timeout(void) { + + if (m_messageTimer) m_messageTimer->stop(); + + emit endMessage(); + } + + +void KNutMessage::slotOk (void) { + + if (m_messageTimer) m_messageTimer->stop(); + emit endMessage(); + } + +void KNutMessage::moveEvent ( QMoveEvent * e) { + + KDialogBase::moveEvent (e); + emit messageMoved(x(),y()); +} + + +#include "knutmessage.moc" diff --git a/src/knutmessage.h b/src/knutmessage.h new file mode 100644 index 0000000..6be9f5d --- /dev/null +++ b/src/knutmessage.h @@ -0,0 +1,126 @@ +/*************************************************************************** + knutmessage.h - description + ------------------- + begin : So led 24 2004 + copyright : (C) 2004 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNUTMESSAGE_H +#define KNUTMESSAGE_H + +#include + +//#include +//#include + + +/** + *@author Daniel Prynych + */ + + +class QTimer; +class QPixmap; + +/** + * Tato trida zobrazi okno zpravy v modeless rezimu. + * Okno pracuje nezavisle na ostatnich oknech a NEPOZASTAVUJE jejich cinnost. + * + * @author Daniel Prynych + * @short window message + * @version 0.1 + */ +class KNutMessage : public KDialogBase { + Q_OBJECT +public: + +enum typeOfMessage { + infoMess, + warningMess, + criticalMess + }; + + +/** + * Constructor - makes window of message. + * Konstruktor - vytvori okno zpravy. + * @param messageText is text of message + * @param type is type of message see on enum typeOfMessage + * @param timeValidity maximal time for showing window, if it is equal zere, time is unlimited. + * + * @param messageText je text zpravu. + * @param type je typ zpravy blize enum typeOfMessage + * @param timeValidity maximalni doba zobrazeni okna, je-li rovna nule je neomezena. + * @since 0.2 + */ + KNutMessage(const QString messageText, const typeOfMessage type=infoMess, const long int timeValidity=0, QWidget *parent=0, const char *name=0); + +/** + * Destruktor. + * + * @since 0.1.2 + **/ + ~KNutMessage(); + +signals: +/** + * Je emitovan kdyz dojde ke stisku tlacitka OK, nebo vyprsi doba platnosti (timeValidity). + * Is emited, when button OK is pressed or time of validity is stopped. + * + * @since 0.1 + **/ + void endMessage(void); + +/** + * Is emited when window of message is moved; + * Je emitovan kdyz dojde presunu okna. + * + * @since 0.1 + **/ + + void messageMoved (int, int); + +private slots: + +/** + * @internal + * Je aktivivan, kdyz vyprsi doba platnosti (timeValidity). + * + * @since 0.1 + **/ + void timeout(void); + +/** + * @internal + * Is activated when button OK was pressed + * Je aktivovan kdyz se stiskne tlacitko OK + * + * @since 0.1 + **/ + virtual void slotOk (void); + + +private: + // max rime for message window is 3600 sec or 60 min + static const int maxTime = 3600; + + QPixmap m_ret; + QTimer* m_messageTimer; + +protected: + void moveEvent ( QMoveEvent * e); + + +}; + +#endif diff --git a/src/knutmessagemanager.cpp b/src/knutmessagemanager.cpp new file mode 100644 index 0000000..4a5aa8a --- /dev/null +++ b/src/knutmessagemanager.cpp @@ -0,0 +1,121 @@ +/*************************************************************************** + knutmessagemanager.cpp - description + ------------------- + begin : So led 24 2004 + copyright : (C) 2004 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "knutmessagemanager.h" +#include + +KNutMessageManager::KNutMessageManager( QObject *parent, const char *name) : QObject (parent, name) { +//qDebug("KNutMessageManager::KNutMessageManager"); + + + m_myMess =0; + m_myMessLevel = knc::infoLevel; + m_xPos=0; + m_yPos=0; + } + + + +KNutMessageManager::~KNutMessageManager(){ + + deleteMessage (); + } + + +void KNutMessageManager::deleteMessage (void) { + + if (m_myMess) { + disconnect (m_myMess,SIGNAL(finished()),this,SLOT(slotFinishedMessage())); + disconnect (m_myMess,SIGNAL(endMessage()),this,SLOT(slotEndMessage())); + disconnect (m_myMess,SIGNAL(messageMoved(int,int)),this,SLOT(slotMessageMoved(int,int))); + m_myMess->hide(); + delete m_myMess; + m_myMess = 0; + } + } + +void KNutMessageManager::addMessage (QString text, knc::LevelOfMessage messageLevel, bool useInfoIcon, bool useShortTimeOfValidity) { +long int timeOfMessageValidity; + + if (useShortTimeOfValidity) timeOfMessageValidity = ShortTimeOfValidity; + else timeOfMessageValidity = TimeOfValidity; +//qDebug("KNutMessageManager::addMessage"); + + deleteMessage(); + if (useInfoIcon) m_myMess = new KNutMessage(text,KNutMessage::infoMess,timeOfMessageValidity); + else { + switch (messageLevel) { + case knc::infoLevel: + m_myMess = new KNutMessage(text,KNutMessage::infoMess,timeOfMessageValidity); + break; + case knc::lowWarningLevel: + m_myMess = new KNutMessage(text,KNutMessage::warningMess,timeOfMessageValidity); + break; + case knc::warningLevel: + m_myMess = new KNutMessage(text,KNutMessage::warningMess,timeOfMessageValidity); + break; + case knc::errorLevel: + m_myMess = new KNutMessage(text,KNutMessage::criticalMess,timeOfMessageValidity); + break; + case knc::criticalLevel: + m_myMess = new KNutMessage(text,KNutMessage::criticalMess,TimeOfValidity); //validity time of critical message has to be standard time of Validity, this time doesn't be short time + break; + } + } + m_myMessLevel=messageLevel; + if ((m_xPos != 0) && (m_yPos !=0)) { + m_myMess->move (m_xPos, m_yPos); + } + + m_myMess->show(); + connect (m_myMess,SIGNAL(finished()),this,SLOT(slotFinishedMessage())); + connect (m_myMess,SIGNAL(endMessage()),this,SLOT(slotEndMessage())); + connect (m_myMess,SIGNAL(messageMoved(int,int)),this,SLOT(slotMessageMoved(int,int))); + } + + +void KNutMessageManager::slotFinishedMessage (void) { + + if (m_myMess) { + disconnect (m_myMess,SIGNAL(finished()),this,SLOT(slotFinishedMessage())); + disconnect (m_myMess,SIGNAL(endMessage()),this,SLOT(slotEndMessage())); + disconnect (m_myMess,SIGNAL(messageMoved(int,int)),this,SLOT(slotMessageMoved(int,int))); + m_myMess->hide(); + m_myMess->deleteLater(); + m_myMess=0; + } + } + +void KNutMessageManager::slotEndMessage (void) { + //kdyz dojde ke stisku tlacitka OK, nebo vyprsi doba platnosti (timeValidity) + + deleteMessage(); + } + + +void KNutMessageManager::slotMessageMoved (int x,int y) { + +//qDebug("KNutMessageManager::slotMessageMoved"); + m_xPos=x; + m_yPos=y; +} + + + + + +#include "knutmessagemanager.moc" diff --git a/src/knutmessagemanager.h b/src/knutmessagemanager.h new file mode 100644 index 0000000..3267c6e --- /dev/null +++ b/src/knutmessagemanager.h @@ -0,0 +1,131 @@ +/*************************************************************************** + knutmessagemanager.h - description + ------------------- + begin : So led 24 2004 + copyright : (C) 2004 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNUTMESSAGEMANAGER_H +#define KNUTMESSAGEMANAGER_H + +#include "knutmessage.h" + +#include + +/** + *@author Daniel Prynych + */ + +namespace knc { + +enum LevelOfMessage { + infoLevel, // status RB, TRIM, CAL, TRIM + lowWarningLevel, // OVER, + warningLevel, // OB .. + errorLevel, // connection error + criticalLevel // Status BL, OFF + }; + + } + +class QString; + +/** + * Tato trida slouzi pro ovladani vyskakovacich oken (pop-up) + * Okno pracuji nezavisle na ostatnich oknech a NEPOZASTAVUJI jejich cinnost. + * + * @author Daniel Prynych + * @short window message manager + * @version 0.1 + */ +class KNutMessageManager : public QObject { + Q_OBJECT + public: +/** + * Konstruktor - vytvori instanci tridy. + * + * @since 0.1 + */ + KNutMessageManager( QObject *parent=0, const char *name=0); + +/** + * Destruktor. + * + * @since 0.1.1 + **/ + ~KNutMessageManager(); + +/** + * Pozada o zobrazeni okna. Pokud je zobrazeno okne s vyssi prioritou, neni funkce provedena. + * + * @param text Text of message, which will be showed in window + * + * @param text Text zpravy ktera se zobrazi v okne. + * @param messageLevel urcuje prioritu zpravy. + * @param useInfoIcon urcuje ktera icona se zobrazi. Pokud je nastaven na true, je vzdy zobrazena icona + * info, pokud je false je nastavena icona v zavislosti na priorite zpravy. + * + * @since 0.2 + **/ + void addMessage (QString text, knc::LevelOfMessage messageLevel = knc::infoLevel, bool useInfoIcon = false, bool useShortTimeOfValidity = false); + + +/** + * Close window, when one is existed + * Zrusi okno, pokud existuje; + * + * @since 0.1.1 + **/ + void deleteMessage (void); + + + private slots: + +/** + * @internal + * Je aktivovan, kdyz bylo pozadano o zruseni okna stisknutim praveho widgetu nebo vnejsimi udalostmi (KDE Logout). + * + * @since 0.1.2 + **/ + void slotFinishedMessage (void); + +/** + * @internal + * Je aktivovan, kdyz bylo pozadano o zruseni okna stsknutim OK nebo vyprsenim casoveho terminu + * + * @since 0.1.2 + **/ + void slotEndMessage (void); + + +/** + * @internal + / Is activated when window was moved + * Je aktivovan, kdyz bylo okno presunuto + * + * @since 0.1.2 + **/ + void slotMessageMoved (int x,int y); + + + private: + static const long int TimeOfValidity = 600; //600 sec or 10n min + static const long int ShortTimeOfValidity = 60; // 60 sec or one min + KNutMessage* m_myMess; + knc::LevelOfMessage m_myMessLevel; + int m_xPos; + int m_yPos; + + }; + +#endif diff --git a/src/knutnet.cpp b/src/knutnet.cpp new file mode 100755 index 0000000..71bc315 --- /dev/null +++ b/src/knutnet.cpp @@ -0,0 +1,1941 @@ +/*************************************************************************** + knutnet.cpp - description + ------------------- + begin : Ne led 12 2003 + copyright : (C) 2003 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "knutnet.h" + +#include +#include +#include +#include + + +#include // for function sleep + +//#include + + + +/****** CONSTS ***********/ + +//const Q_ULONG rBufferLen = 1024; + + + +KNutNet::KNutNet (const QString upsAddress, const QString upsName, const unsigned short port, unsigned int countRepeat, const unsigned int delay) + : QObject(), m_upsAddress(upsAddress), m_upsName(upsName), m_countRepeat(countRepeat), m_port(port), m_delay(delay) { + + +//qDebug ("KNutNet::KNutNet"); + + m_state = Idle; //idle is value + m_numberVars = 0; + m_numberRWVars = 0; + m_numberIComms = 0; + m_upsStatusVar = 0; + m_nutProtocol = 0; + m_nutVariables = 0; + m_switchToTCP = false; + + m_description = false; // popis neni natazen - description is not loaded + + m_unConnectTimer = new QTimer( this ); + connect( m_unConnectTimer, SIGNAL(timeout()), this, SLOT(slotTimerReconnect()) ); + + m_error = NoError; + + m_commandSocket = new QSocket( this ); + connect( m_commandSocket, SIGNAL( hostFound()),this, SLOT( slotHostFound())); + connect( m_commandSocket, SIGNAL( connected()),this,SLOT( slotConnected())); + connect( m_commandSocket, SIGNAL( connectionClosed()),this, SLOT( slotConnectionClosed())); + connect( m_commandSocket, SIGNAL( error(int)),this, SLOT( slotConnectionError(int))); + } + + +KNutNet::~KNutNet(){ + QCString inBuffer; + QString outBuffer; + + close(); // close connetion when is existed + while (m_state == Closing ) { + sleep (100); + } +// deleteVars() is made in close(); + } + + +void KNutNet::close (void) { +// std::cout << "--KNutNet::close" << std::endl; + QCString inBuffer; + QString outBuffer; + + m_unConnectTimer->stop(); + deleteVars(); + if ((m_state == Connected) || (m_state == Connecting)) { + m_state = Closing; + if (m_state == Connected) { + inBuffer="LOGOUT\n"; + getUpsData (inBuffer,outBuffer); + // getUpsDate makes "commandSocket->flush()" + } + + if (m_commandSocket->bytesToWrite () > 0) sleep (1000); + m_commandSocket->clearPendingData (); // data in output buffer will be errased + m_commandSocket->close(); // closes the socket + + if ( m_commandSocket->state() == QSocket::Closing ) { + connect( m_commandSocket, SIGNAL(delayedCloseFinished()),this,SLOT(slotClosed()) ); + } + else { + slotClosed(); + } + } + } + +void KNutNet::slotClosed (void) { + + disconnect( m_commandSocket,SIGNAL(delayedCloseFinished()),this, SLOT(slotClosed()) ); + m_state = Idle; + } + + +void KNutNet::open (void) { + + QCString inBuffer; + QString outBuffer; + + if ((m_state == Connected) || (m_state == Connecting)) close(); // close connetion when is existed + else { + while (m_state == Closing ) { + sleep (100); + } + } + if (m_upsAddress != "") { + if ( m_commandSocket->state() != QSocket::Connecting ) { + m_firstConnect=true; + m_numberConnection=0; + m_state = HostLookup; + emit tryFirstConnection(m_countRepeat); // how many times we can try to connect with ups server /upsd/ +// std::cout << "--KNutNet :: Open emit - tryFirstConnection" << std::endl; + m_commandSocket->connectToHost(m_upsAddress,m_port); + } + } + } + + +void KNutNet::newUPS (const QString upsAddress, const QString upsName, const unsigned short port) { + + if ((m_state == Connected) || (m_state == Connecting)) { + close(); + while (m_state == Closing ) { + sleep (100); + } + } + + m_upsAddress = upsAddress; + m_upsName = upsName; + m_port = port; + + m_state = Idle; + m_numberVars = 0; + m_numberRWVars = 0; + m_numberIComms = 0; + m_upsStatusVar = 0; + m_nutProtocol = 0; + m_nutVariables = 0; + m_switchToTCP = false; + + m_error = NoError; + //firstConnect=true; + //numberConnection=0; + } + + + +int KNutNet::getError ( void ) { return m_error; } + +int KNutNet::getState ( void ){ return m_state; } + +bool KNutNet::isDescription ( void ){ return m_description; } + +int KNutNet::getNutProtocol ( void ) { return m_nutProtocol; } + +int KNutNet::getNutVariables ( void ) { return m_nutVariables; } + +bool KNutNet::switchedToTCP ( void ) { return m_switchToTCP; } + + +int KNutNet::getUpsVars ( void) { + int returnValue; + + m_error=0; + if (m_state == Connected) { + + // init vars and lists + m_numberVars = 0; + m_numberRWVars = 0; + m_numberIComms = 0; + deleteVars(); + int countWaitRevision = 5; + do { + switch (m_nutProtocol) { + case 1: + returnValue = getUpsVars1(); + break; + case 2: + returnValue = getUpsVars2(); + break; + default: + return 0; + } + if ( readStatus() != KNutNet::WAIT) return returnValue; + countWaitRevision--; + if (countWaitRevision) sleep (2); + } + while (countWaitRevision); + return NoListVars; //getUpsVars can't read list variables + } + else { + return NotConnection; + } + } + + +int KNutNet::getUpsValues (const bool allVars ) {// allVars = true vse; allVars = false jen activate + + m_error=0; // vynulujeme chyby + if (m_state == Connected) { + // init vars and lists + switch (m_nutProtocol) { + case 1: + return getUpsValues1(allVars); + break; + case 2: + return getUpsValues2(allVars); + break; + default: + return 0; + } + } + else { + return NotConnection; + } + } + + + +int KNutNet::getDescription (bool always) { + + m_error=0; // vynulujeme chyby + if (m_state == Connected) { + switch (m_nutProtocol) { + case 1: + return getDescription1 (always); + break; + case 2: + return getDescription2 (always); + break; + default: + return 0; + } + } + else return NotConnection; + } + + +int KNutNet::instantCommand (const QString command, const QString userName, const QString password, const bool onlyCommand) { + m_error=0; // vynulujeme chyby + + if (m_state == Connected) { + QString outBuffer; + + // funkce sendComm sama mastavi promenou error + if (onlyCommand) { + if (!(m_error = sendComm("INSTCMD", command, "",true))) { +// netMutex=false; + return 0; + } + else { +// netMutex=false; + return m_error; + } + } + else { + + + + + if (!(m_error = sendComm ("USERNAME", userName, ""))) { + if (!(m_error = sendComm("PASSWORD", password, ""))) { + if (!(m_error = sendComm("INSTCMD", command, "",true))) { +// netMutex=false; + return 0; + } + else { + return m_error; // spatny prikaz + } + } //username + else { + return m_error; //spatne helso + } + } + else { + return m_error; // spatne jmeno + } + } + } + else return NotConnection; + } + + +int KNutNet::setVariable (const QString variable, const QString value, const QString userName, const QString password, const bool onlyVariable) { + m_error=0; // vynulujeme chyby + if (m_state == Connected) { + QString outBuffer; + QString setCommand; + + switch (m_nutProtocol) { + case 1: setCommand = "SET"; + break; + case 2: setCommand = "SET VAR"; + } + if (onlyVariable) { + if (!(m_error = sendComm(setCommand, variable, value, true))) { + return 0; + } + else { + return m_error; + } + } + else { + if (!(m_error = sendComm ("USERNAME", userName, ""))) { + if (!(m_error = sendComm("PASSWORD", password, ""))) { + if (!(m_error = sendComm(setCommand, variable, value, true))) { + //netMutex=false; + return 0; + } + else { + return m_error; + } + } //username + else { + return m_error; + } + } + else { + return m_error; + } + } + } + else return NotConnection; + } + + +int KNutNet::readNumberVars (typeOfVar typVar) { +// Vraci pocet promenych + m_error=0; + if (m_state == Connected) { + switch (typVar) { + case AllVars: + return m_numberVars; + break; + case ROVars: + return m_numberVars - m_numberRWVars; + break; + case RWVars: + return m_numberRWVars; + break; + default: + return -1; + } + } + else return -1; + } + +int KNutNet::readNumberComms (void) { +// Vraci pocet prikazu + m_error=0; + if (m_state == Connected) return m_numberIComms; + else return -1; + } + + +int KNutNet::readIComm (const int seqNumber, upsICommDef& upsIComm) { + m_error =0; + if (m_state == Connected) { + if ((seqNumber < 1) || ((unsigned int)seqNumber > m_listIComms.size())) { + m_error=CommNotFind; + return m_error; + } + upsIComm = m_listIComms[seqNumber-1]; + return 0; + } + else return NotConnection; + } + + +int KNutNet::readVars (const QString name, struct upsVarDef& allVar) { + m_error =0; + if (m_state == Connected) { + QValueVector::const_iterator it; + for (it = m_listVars.begin(); it != m_listVars.end(); it++) { + if ((*it).upsVarName == name) { + allVar = (*it); + return 0; + } + } + m_error=VarNotFind; + return m_error; + } + else return NotConnection; + } + + int KNutNet::readVars (const int seqNumber, struct upsVarDef& allVar, const typeOfVar typVar) { + + m_error =0; + if (m_state == Connected) { + int n = 1; + QValueVector::const_iterator it; + + for (it = m_listVars.begin(); it != m_listVars.end(); it++) { + if ((typVar== AllVars) || ((typVar==ROVars) && ((*it).upsVarType)) || + ((typVar==RWVars) && (!(*it).upsVarType))) { + if (n == seqNumber) { + allVar = (*it); + return 0; + } + n++; + } + } + m_error=VarNotFind; + return m_error; + } + else return NotConnection; + } + + +QString KNutNet::readStringVar (const QString name) { + + m_error =0; + if (m_state == Connected) { + QValueVector::const_iterator it; + for (it = m_listVars.begin(); it != m_listVars.end(); it++) { + if ((*it).upsVarName == name) return (*it).upsValue; + } + m_error = VarNotFind; + return 0l; + } + else return 0l; +} + + +QString KNutNet::readEnumValueVar (const QString name, const int valueNumber) { + + m_error =0; + if (m_state == Connected) { +// #if defined (KDE_VERSION_MAJOR) +// #if KDE_VERSION_MAJOR >= 3 + QValueVector::const_iterator it; +// #else +// QValueList::ConstIterator it; +// #endif +// #else +// QValueList::ConstIterator it; +// #endif + + + for (it = m_listVars.begin(); it != m_listVars.end(); it++) { + if ((*it).upsVarName == name) { + if ((valueNumber < 1) || (valueNumber > (*it).upsVarMax)) { + m_error=EnumValueNotFind; + return 0l; + } + // vratime hodnotu + return (*(*it).upsEnumValues)[valueNumber-1]; + } + } + m_error = VarNotFind; + return 0; + } + else return 0; + } + + +int KNutNet::readStatus(void) { + + m_error=0; + return m_upsStatusVar; + } + + +int KNutNet::setActivate ( const QString name ) { + return activate (name,true); + } + + +int KNutNet::unSetActivate ( const QString name ) { + return activate (name,false); + } + + +int KNutNet::unSetActivateAll ( void ) { + return activateAll (false); + } + + +int KNutNet::existName ( const QString name ) { + + m_error =0; + if (m_state == Connected) { + QValueVector::const_iterator it; + for (it = m_listVars.begin(); it != m_listVars.end(); it++) { + if ((*it).upsVarName == name) return 0; + } + m_error = VarNotFind; + return m_error; + } + else return NotConnection; + } + +/*************************************************************************/ +/* */ +/* PRIVATE FUNCTIONS */ +/* */ +/*************************************************************************/ + + +int KNutNet::version (int countRepeat, const int delay) { + QCString inBuffer; + QString outBuffer; + + m_error =0; + do { + inBuffer="VER\n"; + if (!(m_error=getUpsData (inBuffer,outBuffer))) { + outBuffer=outBuffer.stripWhiteSpace (); + + if (outBuffer.length() > 0) { + outBuffer = outBuffer.mid(outBuffer.find("upsd")+4); + int n = outBuffer.find("."); + if (n > 0) { + QString firstNumber= outBuffer.left(n); + QString secondNumber= outBuffer.mid(n+1); + int n = secondNumber.find("."); + if (n > 0) { + bool ok; + secondNumber = secondNumber.left(n); + int secondInt = secondNumber.toInt(&ok); + if (!ok) {m_error = UnknownFormatVer; return m_error;} + int firstInt = firstNumber.toInt(&ok); + if (!ok) {m_error = UnknownFormatVer; return m_error;} + if ((firstInt == 0) || ((firstInt == 1) && (secondInt < 3))) { + m_nutProtocol =1; + m_nutVariables =1; + } + else { + m_nutProtocol =2; + m_nutVariables =2; + } + return 0; + } + else m_error = UnknownFormatVer; // n is <= 0 the second dot + } + else m_error = UnknownFormatVer; // n is <= 0 the first dot + } + m_error = UnknownAnswer; // i cannot specify number of protocol and number of variables + return m_error; + } + countRepeat--; + if (countRepeat) sleep (delay); + } + while ((countRepeat)); + return m_error; + } + + + +int KNutNet::getFirstUpsName (QString& firstUpsName) { + QCString inBuffer; + QString outBuffer; + QString varOutBuffer; + int lenString; + + m_error=0; + inBuffer = "LIST UPS\n"; + if (!(m_error=getUpsData (inBuffer,outBuffer,"END LIST UPS"))) { + + QString inLine, upsNameRet, varName, value; + int key, typeValue; + bool beginList = false; + QTextIStream varInputStream(&outBuffer); + while (!(inLine = varInputStream.readLine()).isNull()) { + key = parseLine (inLine, upsNameRet, varName, value, typeValue, lenString); + switch (key) { + case BEGIN_LIST_UPS: { + beginList = true;; + break; + } + case UPS: + if (beginList ) { + firstUpsName = upsNameRet; + return 0; + } + case END_LIST_UPS: + firstUpsName = ""; + m_error=NoUpsHere; + return m_error; + case ERR: + m_error = upsTranslateError(value); + return m_error; + default: + m_error=UnknownAnswer; + return m_error; + } + }// end while + } + else {m_error=NoData; return m_error; } + return 0; + } + + + +int KNutNet::setKey (const QString line) { + + QString myLine=line.stripWhiteSpace(); + if (myLine == "OK") return OK; + if (myLine == "ERR") return ERR; + if (myLine == "BEGIN") return BEGIN; + if (myLine == "END") return END; + if (myLine == "VAR") return VAR; + if (myLine == "TYPE") return TYPE; + if (myLine == "DESC") return DESC; + if (myLine == "CMDDESC") return CMDDESC; + if (myLine == "UPSDESC") return CMDDESC; + if (myLine == "UPS") return UPS; + if (myLine == "LIST") return LIST; + if (myLine == "RW") return RW; + if (myLine == "CMD") return CMD; + if (myLine == "ENUM") return ENUM; + if (myLine == "STARTTLS") return STARTTLS; + return NONE; + } + +QString KNutNet::parseValue (const QString line) { + + if (line.isEmpty()) return ""; + if (line[0] != "\"") { + if ((m_posChar=line.find(' ')) == -1) return line; + else return line.left(m_posChar+1); + } + else { + int len = line.length(); + QString outString = ""; + for (int i=1; i < len; i++) { + if ( line[i] == "\\") { + if ((i+1) > word; + if (word == "RW") ret += RW_FLAG; + if (word == "ENUM") ret += ENUM_FLAG; + if (word.find("STRING:") != -1) { + word = word.mid(7); + ret += STRING_FLAG; + lenString = word.toInt(); + } + } + return ret; + } + + +int KNutNet::parseLine(QString& line, QString& upsName ,QString& varName, QString& value, int& typeValue, int& lenString) { + int posChar; + QString word1, word2, word3; + int key1, key2, key3; + + line = line.stripWhiteSpace(); + + upsName = ""; + varName = ""; + value = ""; + typeValue =0; + + if (line.isEmpty()) return NONE; + + if ((posChar=line.find(' ')) == -1) { + if (setKey(line) == OK) return OK; + else return NONE; + } + else { + key1 = setKey( line.left(posChar)); + line = line.mid(posChar+1); + + switch (key1) { + + case NONE: + return key1; + case OK: + return key1; + case ERR: + value = parseValue(line); + return key1; + default: + if ((posChar=line.find(' ')) == -1) return NONE; + word2 = line.left(posChar); + key2 = setKey( word2); + line = line.mid(posChar+1); + + switch (key1) { + case BEGIN: + if ((key2 == LIST) && (setKey(line) == UPS)) return BEGIN_LIST_UPS; + break; + case END: + if ((key2 == LIST) && (setKey(line) == UPS)) return END_LIST_UPS; + break; + case UPS: + upsName = word2; + value = parseValue(line); + return key1; + case CMD: + upsName = word2; + varName = parseValue(line); + return key1; + } + + if ((posChar=line.find(' ')) == -1) return NONE; + + word3 = line.left(posChar); + key3 = setKey( word3); + line = line.mid(posChar+1); + + switch (key1) { + case VAR: + upsName = word2; + varName = word3; + value = parseValue(line); + return VAR; + case TYPE: + upsName = word2; + varName = word3; + typeValue = parseTypeValue(line,lenString); + return TYPE; + case ENUM: + upsName = word2; + varName = word3; + value = parseValue(line); + return ENUM; + case DESC: + upsName = word2; + varName = word3; + value = parseValue(line); + return DESC; + case CMDDESC: + upsName = word2; + varName = word3; + value = parseValue(line); + return CMDDESC; + case BEGIN: + if (key2 != LIST) return NONE; + if (key3 == VAR) { + upsName=line.stripWhiteSpace(); + return BEGIN_LIST_VAR; + } + if (key3 == RW) { + upsName=line.stripWhiteSpace(); + return BEGIN_LIST_RW; + } + if (key3 == CMD) { + upsName=line.stripWhiteSpace(); + return BEGIN_LIST_CMD; + } + if (key3 == ENUM) { + if ((posChar=line.find(' ')) == -1) return NONE; + upsName = line.left(posChar); + line=line.mid(posChar+1); + varName = line.stripWhiteSpace(); + return BEGIN_LIST_ENUM; + } + return NONE; + case END: + if (key2 != LIST) return NONE; + if (key3 == VAR) { + upsName=line.stripWhiteSpace(); + return END_LIST_VAR; + } + if (key3 == RW) { + upsName=line.stripWhiteSpace(); + return END_LIST_RW; + } + if (key3 == CMD) { + upsName=line.stripWhiteSpace(); + return END_LIST_CMD; + } + if (key3 == ENUM) { + if ((posChar=line.find(' ')) == -1) return NONE; + upsName = line.left(posChar); + line=line.mid(posChar+1); + varName = line.stripWhiteSpace(); + return END_LIST_ENUM; + } + return NONE; + default: + return NONE; + } + } + } + } + + +int KNutNet::newDescription (const QCString inBuffer, QString& upsDescription) { + QString outBuffer; + + if (!(m_error=getUpsData (inBuffer,outBuffer))) { + outBuffer=outBuffer.stripWhiteSpace (); + QString word1, word2, word3; + + if ((m_posChar = outBuffer.find(' ')) == -1) + word1 = outBuffer; + else { + word1 = outBuffer.left(m_posChar); + word2 = outBuffer.mid(m_posChar+1); + } + if (word1 == "DESC") { + if ((m_posChar = word2.find('\"')) == -1) word3=""; + else + { + word3 = word2.mid(m_posChar+1); + if ((m_posChar = word3.find('\"')) != -1) word3=word3.left(m_posChar); + } + if (!word3.isEmpty()) upsDescription=word3; + } + else { + if (word1 == "ERR" ) return upsTranslateError(word2); + else return UnknownAnswer; + } + } + else return m_error; + return 0; + } + + +void KNutNet::cleanConnecting (void) { + Q_ULONG rMaxLen; + QCString recvBuffer(rBufferLen); + Q_LONG lengthInputData; + + int n = 0; + while (m_commandSocket->bytesAvailable() > 0) { + + if ( (m_commandSocket->bytesAvailable()+1) > rBufferLen) rMaxLen = rBufferLen; + else rMaxLen=m_commandSocket->bytesAvailable()+1; + + recvBuffer.resize(rMaxLen); + if ((lengthInputData = m_commandSocket->readBlock(recvBuffer.data(),rMaxLen)) == -1) { + } + if (lengthInputData == 0) break; + if (n > 20) break; else n++; + } + } + + +int KNutNet::getUpsData (const QCString sBuffer, QString& rBuffer, const QCString endString) { + + //rbufferLen a sbufferLen are maximal value of buffers + QCString recvBuffer(rBufferLen); + Q_LONG lengthInputData; + Q_ULONG dataAvailable; + + + QMutexLocker getUpsDataLocker( &m_getUpsDataMutex ); + + cleanConnecting(); + // first we clean input TCP buffer + + //cleans buffer + rBuffer=""; // clean main input buffer; + + + // after write block, runs command flush for sending data to server inmediately + if (m_commandSocket->writeBlock(sBuffer.data(),sBuffer.length()) < 0 ) return SendErr; + m_commandSocket->flush(); + + if (m_commandSocket->waitForMore(1000) == 0) { + m_commandSocket->waitForMore(500); // workaround + } + bool endRecv = false; + do { + dataAvailable=m_commandSocket->bytesAvailable(); + if (recvBuffer.size() < (dataAvailable+1) ) recvBuffer.resize(dataAvailable+1); + if ((lengthInputData = m_commandSocket->readBlock(recvBuffer.data(),dataAvailable)) == -1) return RecvErr; + +//correct for X86_64 by Alexey Sidorov + recvBuffer[(int)lengthInputData]='\0'; + // recvBuffer[lengthInputData]='\0'; + + //Problem is that + //for 64bit environment is Q_LONG defined like _int64 and + //for other environments is Q_LONG defined like long + + + + + rBuffer.append(recvBuffer.data()); // adds reading data to main input buffer + if (endString.isEmpty()) endRecv = false; + else { + if (recvBuffer.findRev(endString) == -1) { +//doesn't find right end of input data + if (m_commandSocket->bytesAvailable() == 0) m_commandSocket->waitForMore(1000); + if (m_commandSocket->bytesAvailable() > 0) endRecv=true; // makes other cyckle og while + else endRecv=false; + } +//finds right end of input data + else endRecv = false; // we have found what we want to find + } + } while (endRecv); + return 0; // all is OK + } + + + + void KNutNet::setRWVars (const QString varName, const bool valueType, const int varMax, QValueVector* enumValues) { + QValueVector::iterator it; + + for (it = m_listVars.begin(); it != m_listVars.end(); it++) { + if ((*it).upsVarName == varName) { + (*it).upsVarMax = varMax; + (*it).upsValueType=valueType; + (*it).upsEnumValues=enumValues; + (*it).upsVarType=false; + break; + } + } + } + +void KNutNet::upsSetType (struct upsVarDef& upsVar, const QString name, const QString value) { + + if (((m_nutVariables = 2) && (name == "STATUS")) || ((m_nutVariables = 2) && (name == "ups.status"))) + upsVar.upsVarActivate=true; + else upsVar.upsVarActivate=false; + + upsVar.upsVarName = name; + upsVar.upsVarType=true; + upsVar.upsValueType=true; + upsVar.upsVarMax=0; + upsVar.upsValue=value; + upsVar.upsDescription=""; + upsVar.upsEnumValues=0L; +} + + +void KNutNet::deleteVars (void) { +// #if defined (KDE_VERSION_MAJOR) +// #if KDE_VERSION_MAJOR >= 3 + QValueVector::iterator it; +// #else +// QValueList::Iterator it; +// #endif +// #else +// QValueList::Iterator it; +// #endif + for (it = m_listVars.begin(); it != m_listVars.end(); it++) { + if ((*it).upsEnumValues != 0) { + (*it).upsEnumValues->clear(); + delete (*it).upsEnumValues; + } + } + m_listVars.clear(); + m_listIComms.clear(); + } + +void KNutNet::genStatusFlags (QString value) { + m_upsStatusVar = 0; + QTextIStream inputStream(&value); + QString word; + while (!inputStream.atEnd()) { + inputStream >> word; + if (word == "OFF") m_upsStatusVar +=OFF; + if (word == "OL") m_upsStatusVar +=OL; + if (word == "OB") m_upsStatusVar +=OB; + if (word == "LB") m_upsStatusVar +=LB; + if (word == "CAL") m_upsStatusVar +=CAL; + if (word == "TRIM") m_upsStatusVar +=TRIM; + if (word == "BOOST") m_upsStatusVar +=BOOST; + if (word == "OVER") m_upsStatusVar +=OVER; + if (word == "RB") m_upsStatusVar +=RB; + if (word == "WAIT") m_upsStatusVar = WAIT; + //OFF - 1 ups je vypnuta + //OL - 2 ups je bezi na sit + //OB - 4 ups bezi na baterie + //LB - 8 baterie je vybyta (pokud je zaroven OB dojde k shutdownu) + //CAL - 16 je spustena kalibrace + //OVER - 128 ups je pretizena + //RB - 256 ups pozaduje vymenu baterie + //WAIT - 512 ups zada o strpeni // UPS asks for waiting + } + } + + +int KNutNet::getDescription1 (bool always) { + + if (always || (! m_description)) { + QCString inBuffer; + QString outBuffer; + + QValueVector::iterator itv; + QValueVector::iterator itc; + for (itv = m_listVars.begin(); itv != m_listVars.end(); itv++) { + //nacteme promenou + inBuffer = "VARDESC " + (*itv).upsVarName + "\n"; + if ((m_error = newDescription (inBuffer, (*itv).upsDescription))) { + //netMutex.unlock(); +// netMutex=false; + return m_error; + } + } + for (itc = m_listIComms.begin(); itc != m_listIComms.end(); itc++) { + //nacteme promenou + inBuffer = "INSTCMDDESC "+(*itc).upsCommName+"\n"; + if ((m_error = newDescription (inBuffer, (*itc).upsDescription))) { + //netMutex.unlock(); + //netMutex=false; + return m_error; + } + } + //netMutex=false; + m_description = true; + } + return 0; + } + + + +int KNutNet::getDescription2 (bool always) { + + if (always || (! m_description)) { + QCString inBuffer; + QString outBuffer; + QString upsNameRet; + QString varName; + QString value; + int typeValue; + int lenString; + + QValueVector::iterator itv; + QValueVector::iterator itc; + for (itv = m_listVars.begin(); itv != m_listVars.end(); itv++) { + //nacteme promenou + inBuffer = "GET DESC " + m_upsName + " " + (*itv).upsVarName+"\n"; + + if (!(m_error=getUpsData (inBuffer,outBuffer))) { + outBuffer=outBuffer.stripWhiteSpace (); + if ( !outBuffer.isEmpty() ) { + int key = parseLine(outBuffer, upsNameRet, varName, value, typeValue, lenString); + switch (key) { + case DESC: + (*itv).upsDescription = value; + break; + case ERR: + m_error=upsTranslateError(value); + return m_error; + default: + m_error=UnknownAnswer; + return m_error; + } + } + else { + m_error = NoData; + return m_error; + } + } + else { + return m_error; + } + } + for (itc = m_listIComms.begin(); itc != m_listIComms.end(); itc++) { + //nacteme promenou + inBuffer = "GET CMDDESC " + m_upsName + " " + (*itc).upsCommName+"\n"; + if (!(m_error=getUpsData (inBuffer,outBuffer))) { + outBuffer=outBuffer.stripWhiteSpace (); + if ( !outBuffer.isEmpty() ) { + int key = parseLine(outBuffer, upsNameRet, varName, value, typeValue, lenString); + switch (key) { + case CMDDESC: + (*itc).upsDescription = value; + break; + case ERR: + m_error=upsTranslateError(value); + return m_error; + default: + m_error=UnknownAnswer; + return m_error; + } + } + else { + m_error = NoData; + return m_error; + } + } + else { + return m_error; + } + } + m_description = true; + } + return 0; + } + + + +int KNutNet::getUpsVars1 ( void) { +// getUpsVars nacte promene a jejich typ +// vraci kod chyby nebo 0 pokud je vse v poradku + QCString inBuffer; + QString outBuffer; + QString varOutBuffer; + upsVarDef upsVar; + upsICommDef upsIComm; + + // init vars and lists + if (!m_upsName.isEmpty()) { // pokud upsName neni je vzdy nastaveno na null + inBuffer="LISTVARS "; + inBuffer.append(m_upsName); + inBuffer.append("\n"); + } + else inBuffer ="LISTVARS\n"; + + if (!(m_error=getUpsData (inBuffer,outBuffer))) { + outBuffer=outBuffer.stripWhiteSpace (); + if (outBuffer.length() > 0) { + // precteme data + QTextIStream inputStream(&outBuffer); + QString word; + int count =1 ; + while (!inputStream.atEnd()) { + inputStream >> word; + switch (count) { + case 1: + // vyndame prvni polozku + if (word == "VARS") count++; + else { + if (word == "ERR") { + inputStream >> word; + m_error = upsTranslateError(word); + } + else m_error=UnknownAnswer; + return m_error; + } + break; + case 2: + count++; + if ((word.length() > 0) && word.startsWith("@")) break; + default: + // pridame polozku do tabulky + upsSetType(upsVar, word); + m_listVars.push_back(upsVar); + m_numberVars++; + break; + } + } + } + else { m_error=NoData; return m_error; } + } + else return m_error; + + if ((m_error = getUpsValues1(true))) return m_error; + + // *********** RW VARIABLES + if (!m_upsName.isEmpty()) { // pokud upsName neni je vzdy nastaveno na null + inBuffer="LISTRW "; + inBuffer.append(m_upsName); + inBuffer.append("\n"); + } + else inBuffer ="LISTRW\n"; + + if (!(m_error=getUpsData (inBuffer,outBuffer))) { + outBuffer=outBuffer.stripWhiteSpace(); + if (!outBuffer.isEmpty()) { + // precteme data + QTextIStream inputStream(&outBuffer); + QString word; + int count =1 ; + bool valueType; + int varMax; + while (!inputStream.atEnd()) { + inputStream >> word; + switch (count) { + case 1: + // vyndame prvni polozku + if (word == "RW") count++; + else { + if (word == "ERR") { + inputStream >> word; + m_error = upsTranslateError(word); + } + else m_error=UnknownAnswer; + return m_error; + } + break; + case 2: + count++; + if ((word.length() > 0) && word.startsWith("@")) break; + default: + // Zpracujeme polozku v tabulce + // zjistime informaci o promene + inBuffer="VARTYPE "; + inBuffer.append(word); + if (!m_upsName.isEmpty()) { + inBuffer.append("@"); // pokud upsName neni je vzdy nastaveno na null + inBuffer.append(m_upsName); + } + inBuffer.append("\n"); + if (!(m_error=getUpsData (inBuffer,varOutBuffer))) { + varOutBuffer=varOutBuffer.stripWhiteSpace(); + if ( !outBuffer.isEmpty() ) { + QTextIStream varInputStream(&varOutBuffer); + QString word1, word2, word3; + varInputStream >> word1; + varInputStream >> word2; + varInputStream >> word3; + if (word1 == "TYPE") { + if ((word2.isEmpty()) || (word3.isEmpty())) { + m_error=UnknownFormat; + return m_error; + } + if (word2 == "ENUM") valueType=false; + else { + if (word2 =="STRING") valueType=true; + else { + m_error=UnknownFormat; + return m_error; + } + } + bool ok = true; + varMax=word3.toInt(&ok); + if (!ok) {m_error=UnknownFormat; return m_error;}; + } // word1 = Type + else { + if (word1=="ERR") { + m_error = upsTranslateError(word2); + return m_error; + } + else { + m_error = UnknownAnswer; + return m_error; + } + } + } + else { m_error=NoData; return m_error; } + } + else return m_error; + // ********** ENUM / STRING ****************** + + QValueVector* enumString=0; + if (!valueType) { + // nacteme enum hodnoty + inBuffer="ENUM "; + inBuffer.append(word); + // pokud existuje pridame jmeno UPS-ky + if (!m_upsName.isEmpty()) { + inBuffer.append("@"); + inBuffer.append(m_upsName); + } + inBuffer.append("\n"); + if (!(m_error=getUpsData (inBuffer,varOutBuffer,"END\n"))) { +// varOutBuffer.stripWhiteSpace(); nemuze provest protoze bychom si odstranili konce radek + if (!varOutBuffer.isEmpty()) { + QString inLine, word1, word2; + QTextIStream varInputStream(&varOutBuffer); + int inCountLine=1; + while (!(inLine = varInputStream.readLine()).isNull()) { + inLine=inLine.stripWhiteSpace(); + + if ((m_posChar=inLine.find(' ')) == -1) word1=inLine; + else { + word1=inLine.left(m_posChar); + inLine = inLine.mid(m_posChar+1); + } + if (word1.isEmpty()) { m_error = UnknownFormat; return m_error; } + if (inCountLine == 1) { + if ((m_posChar=inLine.find(' ')) == -1) word2=inLine; + else word2=inLine.left(m_posChar); + if (word1 =="ENUM") { + if (word2 != word) { m_error = UnknownFormat; return m_error; } + varMax=0; + inCountLine++; + enumString = new QValueVector; + enumString->clear(); + } + else { + if (word1=="ERR") + m_error=upsTranslateError(word2); // prevede chybu na jeji kod + else m_error=UnknownAnswer; + return m_error; + } + } + else { + if (word1 == "END") break; + if (word1 != "OPTION") { m_error = UnknownFormat; return m_error; } + if ((m_posChar = inLine.find('\"')) == -1) word2 = ""; + else { + word2 = inLine.mid(m_posChar+1); + if ((m_posChar=word2.find('\"')) != -1) word2 = word2.left(m_posChar); + } + enumString->push_back(word2); + varMax++; + } + } // end while + } // buffer is not empty + else { m_error = NoData ; return m_error; } + } // getUpsData + else return m_error; + } // type of var + else enumString = 0l; + // nacteme stringovou promenou + // ulozime promene + setRWVars (word,valueType,varMax,enumString); + m_numberRWVars++; + break; + } + } // end while (!inputStream.atEnd()) + } + else { m_error = NoData ; return m_error; } + } + else return m_error; + + // *************** INSTANT COMMAND + if (!m_upsName.isEmpty()) { // pokud upsName neni je vzdy nastaveno na null + inBuffer="LISTINSTCMD "; + inBuffer.append(m_upsName); + inBuffer.append("\n"); + } + else inBuffer ="LISTINSTCMD\n"; + + if (!(m_error=getUpsData (inBuffer,outBuffer))) { + outBuffer=outBuffer.stripWhiteSpace (); + if ( !outBuffer.isEmpty() ) { + // precteme data + QTextIStream inputStream(&outBuffer); + QString word; + int count =1 ; + while (!inputStream.atEnd()) { + inputStream >> word; + switch (count) { + case 1: + // vyndame prvni polozku + if (word == "INSTCMDS") count++; + else { + if (word == "ERR") { + inputStream >> word; + m_error = upsTranslateError(word); + } + else m_error=UnknownAnswer; + return m_error; + } + break; + case 2: + count++; + if ((word.length() > 0) && word.startsWith("@")) break; + default: + // Zpracujeme polozku v tabulky + upsIComm.upsCommName=word; + upsIComm.upsDescription=""; + m_listIComms.push_back(upsIComm); + m_numberIComms++; + break; + } + } + } + else { m_error=NoData; return m_error; } + } + else return m_error; + return 0; + } + + + +int KNutNet::getUpsVars2 ( void) { + QCString inBuffer; + QString outBuffer; + QString varOutBuffer; + upsVarDef upsVar; + upsICommDef upsIComm; + int key; + int typeValue; + int lenString; + int varMax=0; + + QValueVector* enumString=0; + inBuffer = "LIST VAR " + m_upsName + "\n"; + if (!(m_error=getUpsData (inBuffer,outBuffer,"END LIST VAR"))) { + QString inLine, upsNameRet, varName, varNameRet, value; + bool beginList = false; + QTextIStream varInputStream(&outBuffer); + while (!(inLine = varInputStream.readLine()).isNull()) { + + key = parseLine (inLine, upsNameRet, varName, value, typeValue, lenString); + switch (key) { + case BEGIN_LIST_VAR: + if (upsNameRet == m_upsName) beginList = true; + break; + case VAR: + if (beginList ) { + upsSetType(upsVar, varName, value); + + if (varName == "ups.status") genStatusFlags(value); + inBuffer = "GET TYPE " + m_upsName + " " + varName +"\n"; + if (!(m_error=getUpsData (inBuffer,varOutBuffer))) { + key = parseLine (varOutBuffer, upsNameRet, varNameRet, value, typeValue, lenString); + switch (key) { + case TYPE: + if (typeValue & RW_FLAG) { + upsVar.upsVarMax = 0; + upsVar.upsEnumValues=0L; + if (typeValue & ENUM_FLAG) { + upsVar.upsValueType=false; + // nacteme enumValues + inBuffer = "LIST ENUM " + m_upsName + " " + varName +"\n"; + if (!(m_error=getUpsData (inBuffer,varOutBuffer,"END LIST ENUM"))) { + bool beginEnumList = false; + QTextIStream varInputStream(&varOutBuffer); + while (!(inLine = varInputStream.readLine()).isNull()) { + key = parseLine (inLine, upsNameRet, varName, value, typeValue, lenString); + switch (key) { + case BEGIN_LIST_ENUM: + beginEnumList = true; + varMax=0; + enumString = new QValueVector; + enumString->clear(); + upsVar.upsEnumValues=enumString; + break; + case ENUM: + if (beginList ) { + enumString->push_back(value); + varMax++; + } + break; + case ERR: + m_error = upsTranslateError(value); + return m_error; + default: + m_error=UnknownAnswer; + return m_error; + case END_LIST_ENUM: + upsVar.upsVarMax=varMax; + break; + } + } + } + } + else { + // Vse co nenini ENUM je STRING + upsVar.upsValueType=true; + upsVar.upsVarMax=lenString; + } + upsVar.upsVarType=false; + m_numberRWVars++; + } + break; + case ERR: + m_error = upsTranslateError(value); + return m_error; + default: + m_error=UnknownAnswer; + return m_error; + } + } + else { return m_error; } + m_listVars.push_back(upsVar); + m_numberVars++; + } + break; + case END_LIST_VAR: + break; + case ERR: + m_error = upsTranslateError(value); + return m_error; + default: + m_error=UnknownAnswer; + return m_error; + } // end switch + } // end while + } + else { return m_error; } + // INSTANT COMMANDS + + inBuffer = "LIST CMD " + m_upsName + "\n"; + if (!(m_error=getUpsData (inBuffer,outBuffer,"END LIST CMD"))) { + + QString inLine, upsNameRet, varName, value; + int key, typeValue; + bool beginList = false; +//std::cout << "CMD Buffer " << outBuffer << std::endl; + + QTextIStream varInputStream(&outBuffer); + while (!(inLine = varInputStream.readLine()).isNull()) { + key = parseLine (inLine, upsNameRet, varName, value, typeValue, lenString); +//std::cout << "CMD Line " << inLine << std::endl; + + switch (key) { + case BEGIN_LIST_CMD: { + if (upsNameRet == m_upsName) beginList = true; + break; + } + case CMD: + if (beginList ) { + // Zpracujeme polozku v tabulky + upsIComm.upsCommName=varName; + upsIComm.upsDescription=""; + m_listIComms.push_back(upsIComm); + m_numberIComms++; + } + break; + case END_LIST_CMD: + break; + case ERR: + m_error = upsTranslateError(value); + return m_error; + default: + m_error=UnknownAnswer; + return m_error; + } // end switch + } // end while + } + else { return m_error; } + return 0; + } + + + +int KNutNet::getUpsValues1 (const bool allVars ) {// allVars = true vse; allVars = false jen activate + QString endChar; + QCString inBuffer; + QString outBuffer; + QValueVector::iterator it; + + // Nacte hodnotu promenych + // reads value of variables + + + emit getVarDesc (m_numberVars, 0); + + int numberVar = 0; + for (it = m_listVars.begin(); it != m_listVars.end(); it++) { + numberVar++; + if ((allVars) || ((*it).upsVarActivate)) { + //nacteme promenou + inBuffer = "REQ "; + inBuffer.append((*it).upsVarName); + if (!m_upsName.isEmpty()) { // pokud upsName neni je vzdy nastaveno na null + inBuffer.append("@"); + inBuffer.append(m_upsName); + } + inBuffer.append("\n"); +// if (!(error=getUpsData (inBuffer,outBuffer))) { + m_error=getUpsData (inBuffer,outBuffer); + // when outBuffer is empty sends and reads date again, but only the only time + if ((!(m_error)) && (outBuffer.isEmpty())) m_error=getUpsData (inBuffer,outBuffer); + if (!(m_error)) { + + endChar = ""; + if ((outBuffer.length()>0) && (outBuffer.at(outBuffer.length()-2)==' ')) endChar=' '; + + outBuffer=outBuffer.stripWhiteSpace (); + outBuffer += endChar; + emit getVarDesc (m_numberVars, numberVar); + + if ( !outBuffer.isEmpty() ) { + QTextIStream inputStream(&outBuffer); + QString word1, word2, word3 ; + inputStream >> word1; + inputStream >> word2; + if (inputStream.atEnd()) { // neexistuje treti cast VALUE + if (word1 == "ERR") { + // vracena chyba + m_error=upsTranslateError(word2); + return m_error; + } + else { +// if ((word2 != "MODEL") && (word2 != "MFR")) { + if (endChar != " ") { // if values of variable is empty, string is ended on char space + m_error=UnknownFormat; + return m_error; + } + } + } + inputStream >> word3; + if (word1 == "ANS") { + // answer - odpoved + // odstranime pripadne jmeno upsky + if ((m_posChar = word2.find('@')) != -1) word2 = word2.left(m_posChar); + if ( word2 != (*it).upsVarName ) { + m_error=UnknownAnswer; + return m_error;// neni to odpoved na spravnou promennou + } + // test pro starsi format modulu, vraceli chybu v hodnote promene + if ((m_error=upsOldTranslateError(word3))) { + return m_error; + } + // zalozime hodnotu do vectoru; + (*it).upsValue=word3; + if ((*it).upsVarName == "STATUS") { + // dogenerujeme dalsi slova pro status + word3 += inputStream.readLine(); + genStatusFlags(word3); + } + } + else { + // neznama odpoved - neni ANS ani ERR + m_error=UnknownAnswer; + return m_error; + } + } + else { + m_error=NoData; + return m_error; + } + } + else { + return m_error; + } + } + } + return 0; + } + + + +int KNutNet::getUpsValues2 (const bool allVars ) {// allVars = true vse; allVars = false jen activate + QString varName; + QString upsNameRet; + QString value; + int typeValue; + int lenString; + + // reads value of variables + QCString inBuffer; + QString outBuffer; + QValueVector::iterator it; + + emit getVarDesc (m_numberVars, 0); + int numberVar = 0; + for (it = m_listVars.begin(); it != m_listVars.end(); it++) { + numberVar++; + if ((allVars) || ((*it).upsVarActivate)) { + //reads variable + inBuffer = "GET VAR "+m_upsName+" "+(*it).upsVarName+"\n"; +// if (!(error=getUpsData (inBuffer,outBuffer))) { + m_error=getUpsData (inBuffer,outBuffer); + // when outBuffer is empty sends and reads date again, but only the only time + if ((!(m_error)) && (outBuffer.isEmpty())) m_error=getUpsData (inBuffer,outBuffer); + if (!(m_error)) { + outBuffer=outBuffer.stripWhiteSpace (); + emit getVarDesc (m_numberVars, numberVar); + if ( !outBuffer.isEmpty() ) { + int key = parseLine(outBuffer, upsNameRet, varName, value, typeValue, lenString); + switch (key) { + case VAR: + if ( varName != (*it).upsVarName ) { + m_error=UnknownAnswer; + return m_error;// it isn't answer for right variable - neni to odpoved na spravnou promennou + } + (*it).upsValue=value; + if ((((*it).upsVarName == "STATUS") && (m_nutVariables == 1)) || (((*it).upsVarName == "ups.status") && (m_nutVariables == 2))) { + // dogenerujeme dalsi slova pro status + genStatusFlags(value); + } + break; + case ERR: + m_error=upsTranslateError(value); + return m_error; + default: + m_error=UnknownAnswer; + return m_error; + } + } + else { + m_error= NoData; + return m_error; + } + } + else { + return m_error; + } + } + } + return 0; + } + + +int KNutNet::sendComm (const QString command, const QString arg1, const QString arg2, const bool useUpsName) { + int localError; +// nenastavi promenou error ale nenuluje ji + QCString inBuffer; + QString outBuffer; + + switch (m_nutProtocol) { + case 1: + inBuffer=command + " " + arg1; + if (useUpsName && (!m_upsName.isEmpty())) // pokud upsName neni je vzdy prazdne + inBuffer += "@"+m_upsName; + if (!arg2.isEmpty()) inBuffer += " " + arg2; + break; + case 2: + inBuffer = command + " "; + if (useUpsName) inBuffer += m_upsName + " "; + inBuffer.append(arg1); + if (!arg2.isEmpty()) inBuffer += " \"" + arg2 +"\""; + break; + } + inBuffer.append("\n"); + + if (!(localError=getUpsData (inBuffer,outBuffer))) { + outBuffer=outBuffer.stripWhiteSpace(); + QTextIStream inputStream(&outBuffer); + QString word1, word2; + inputStream >> word1; + inputStream >> word2; + if (word1.isEmpty()) return UnknownAnswer; // zadna odpoved + if (word1 != "OK") { + // neni rovno OK + if (word1 == "ERR") return upsTranslateError (word2); + else return UnknownAnswer; + } + else return 0; + } + else return localError; + } + + +int KNutNet::activate ( const QString name, const bool setActivate ) { + m_error =0; + if (m_state == Connected) { + QValueVector::iterator it; + for (it = m_listVars.begin(); it != m_listVars.end(); it++) { + if ((*it).upsVarName == name) { + (*it).upsVarActivate = setActivate; + return 0; + } + } + m_error = VarNotFind; + return m_error; + } + else return NotConnection; + } + +int KNutNet::activateAll ( const bool setActivate ) { + m_error =0; + if (m_state == Connected) { + QValueVector::iterator it; + for (it = m_listVars.begin(); it != m_listVars.end(); it++) { + (*it).upsVarActivate = setActivate; + } + return 0; + } + else return NotConnection; + } + + +int KNutNet::upsTranslateError (const QString string) { + if (string == "VAR-NOT-SUPPORTED") return VarNotSupported; + if (string == "VAR-UNKNOWN") return VarUnknown; + + if (string == "ACCESS-DENIED") return AccessDenied; + if (string == "PASSWORD-REQUIRED") return PasswordRequired; + if (string == "PASSWORD-INCORRECT") return PasswordIncorrect; + if (string == "UNKNOWN-UPS") return UnknownUps; + if (string == "ALREADY-LOGGED_IN") return AlreadyLoggedIn; + if (string == "ALREADY-SET-PASSWORD") return AlreadySetPassword; + if (string == "ALREADY-SET-USERNAME") return AlreadySetUsername; + if (string == "UNKNOWN-COMMAND") return UnknownCommand; + + if (string == "UNKNOWN-INSTCMD") return UnknownInstCmd; + if (string == "CMD-NOT-SUPPORTED") return CmdNotSupported; + + if (string == "INVALID-VALUE") return InvalidValue; + + if (string == "NO-RESPONSE") return NoResponse; + if (string == "UNKNOWN-REPLY") return UnknownReply; + if (string == "NOT-IMPLEMENTED") return NotImplemented; + if (string == "COMMAND-FAILED") return CommandFailed; + + if (string == "MISSING-ARGUMENT") return MissingArgument; + if (string == "DATA-STALE") return DataStale; + if (string == "UNKNOWN-TYPE") return UnknownType; + + if (string == "DRIVER-NOT-CONNECTED") return DriverNotConnected; + + if (string == "") return UnknownFormat; + + return UnknownErr; + } + +int KNutNet::upsOldTranslateError (const QString string) { + if (string == "NOT-SUPPORTED") return VarNotSupported; + if (string == "UNKNOWN") return VarUnknown; + if (string == "DATA-STALE") return DataStale; + return 0; // nebylo nalezeno + } + +//--------------------Socket---------------- + + +void KNutNet::slotConnectionError(int error) { +//std::cout << "--KNutNet::slotConnectionError" << std::endl; +//qDebug ("--KNutNet::slotConnectionError"); + + m_state = ConnectError; + m_unConnectTimer->stop(); + if (error == QSocket::ErrHostNotFound) { + error = NoSuchHost; + emit connectionError(error); + return; + } + //connection was refused // no connection + if ((error == QSocket::ErrConnectionRefused) && (m_commandSocket->state()==QSocket::Idle)) { + if (m_firstConnect) { + if (m_numberConnection < m_countRepeat) { + m_numberConnection++; +// qDebug ("--KNutNet:: connect error - try connect on next time"); + m_unConnectTimer->start( m_delay, TRUE ); + } + else { + // i don't connect server + error=CantConnect; +// qDebug("--KNutNet::emit - connection error "); + emit connectionError(error); + return; + } + } // end of if (firstConnection) + else { + // connecting is down, try repeated connection + +// qDebug ("--KNutNet::no first connect connection error "); + m_unConnectTimer->start( m_delay, TRUE ); + } + return; + } + if (error == QSocket::ErrConnectionRefused) { + error = ConnectionRefused; +// std::cout << "--KNutNet::connection error ErrConnectionRefused " << QSocket::Idle << " - " << error << std::endl; + emit connectionError(error); + return; + } + if (error == QSocket::ErrSocketRead) { + error = SocketReadErr; +// std::cout << "--KNutNet::connection error QSocket::ErrSocketRead " << error << std::endl; + emit connectionError(error); + return; + } + } + + +void KNutNet::slotConnected(void) { + int n; + + if ((n = version (m_countRepeat, m_delay)) == 0) { // 0 OK, 0> error + if ((m_nutProtocol == 0) || (m_nutVariables == 0)) { // answer from upsd (VER) is unknown + m_error=NutProtocolVarErr; + m_state = Closing; + m_commandSocket->close(); + while (m_commandSocket->state() == QSocket::Closing) { + sleep (100); + } + m_state = ConnectError; + + return; + } + if ((m_nutProtocol == 2) && m_upsName.isEmpty()) { + // if upsName is empty reads first ups name from upsd server + if ((m_error =KNutNet::getFirstUpsName (m_upsName))) { // reading first upsName + // upsd server doesn't support any ups + m_state = Closing; + m_commandSocket->close(); + while (m_commandSocket->state() == QSocket::Closing) { + sleep (100); + } + m_state = ConnectError; + + } + } + m_state=Connected; + } + else { + m_commandSocket->close(); + } + emit firstConnection(); +// std::cout << "KNutNet::emit - firstConnection" << std::endl; + } + +void KNutNet::slotHostFound(void) { + +// std::cout << "--KNutNet::slotHostFound" << std::endl; + m_state = Connecting; + emit hostFound(); + } + + +void KNutNet::slotConnectionClosed(void) { + +// std::cout << "--KNutNet::slotConnectionClosed" << std::endl; + m_unConnectTimer->stop(); + deleteVars(); + m_state = Idle; + emit connectionClosed(); + } + + + +void KNutNet::slotTimerReconnect(void) { +// std::cout << "--KNutNet::slotTimerReconnect" << std::endl; + + m_unConnectTimer->stop(); + if (m_commandSocket->state()==QSocket::Idle) { + //std::cout << "--KNutNet::slotTimerReconnect QSOcket::Idle" << std::endl; + emit tryRepeatFirstConnection(m_numberConnection); + // std::cout << "KNutNet::emit-tryRepeatFirstConnection" << std::endl; + m_state=Connecting; + if ( m_commandSocket->state() != QSocket::Connecting ) + m_commandSocket->connectToHost(m_upsAddress,m_port); + } + } + + +#include "knutnet.moc" diff --git a/src/knutnet.h b/src/knutnet.h new file mode 100755 index 0000000..00b8e9a --- /dev/null +++ b/src/knutnet.h @@ -0,0 +1,869 @@ +/*************************************************************************** + knutnet.h - description + ------------------- + begin : Ne led 12 2003 + copyright : (C) 2003 by Daniel Prynych + email : Daniel@prynych.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNUTNET_H +#define KNUTNET_H + +//Od verze 3 je kapp jen odkaz na kapplication +//Since version 3 is kapp pointer on kapplication only +//#include +#include + +#include +#include +#include +#include +#include + +#include + + + struct upsVarDef { + QString upsVarName; + bool upsVarActivate; + bool upsVarType; // typ true(1) RO - false (0) RW (muzeme menit) + bool upsValueType; // typ true(1) char - false (0) enum (vyctova) + // ma vyznam jen pro RW promenne + int upsVarMax; // udave max delku string promenne nebo pocet moznosti pro enum promennou + // ma vyznam jen pro RW promenne + QString upsValue; // hodnota promene + QString upsDescription; // informace o promene + QValueVector* upsEnumValues; + }; + + + struct upsICommDef { + QString upsCommName; + QString upsDescription; + }; + +class QString; +class QCString; +class QSocket; +class QTimer; + + +/** + *@author Daniel Prynych + */ + +/** + * This class reads data from serveru NUT. + * Since version 0.5 is written and API is changet. + * Since 0.6.1 supports protocol client-server and variables for upsd >= nut 1.3 + * Since 0.6.1 doesn't ups name like ups_name@host_address + * Since 0.7 doesn't support UDP + * Tato trida zajistuje cteni dat ze serveru NUT. + * Od verze 0.5 je uplne prepsana a je zmeneno i API. + * Od verze 0.6.1 proporuje take client-server protokol a promenne pro upsd >= nut 1.3 + * Od verze 0.6.1 nepodporuje jmeno ups ve tvaru jmeno_ups@adresa_pc + * Od verze 0.7 neni podporovano UDP + * + * @author Daniel Prynych + * @short Communication with UPS - Komunikace s UPS + * @version 0.7 +*/ +class KNutNet : public QObject { + Q_OBJECT +public: + + enum NetState {Idle, HostLookup, Connecting, Connected, ConnectError,Closing }; + // idle is same like NotConnected + // neni pripojeno chyba pri pripojeni,pripojeno, pripojuji + + + enum typeOfVar {AllVars, ROVars, RWVars }; + + enum NetError { + NoError, + LowMem, // no memmory - nebyla pridelena pamet + NullAddress, // no address of host nebyla zadana adresa pocitace + NoSuchHost, // this host noexist neexistuje takovy pocitac + CantConnect, // I cannot connect to server Nemohu se spojit se serverem + SocketReadErr, // I cannot read data from socket - Nelze cist data ze soketu + ConnectErr, // connect isn't maked - Nejde provest connect + NutProtocolVarErr, // Nelze zjistit verze protokolu + NoUpsHere, // ni UPS on this address na teto adrese neni zadna UPS + ConnectionRefused, // server refused connection + ConnetionClosedByServer, // connection was closed by server upsd // by the second side + + SendErr, // doesn't send date - Nelze odeslat data + RecvErr, // doesn't receive data - Nelze prijmout data + NoData, // no data was received, empty string was received - Nebyla prijmuta zadna data, byl prijmut prazdny retezec + UnknownAnswer, // Server answer no right - Server neodpovedel spravne + UnknownFormat, // Data hasn't got right structure - Data nemaji spravnou strukturu + UnknownFormatVer, //Data returned after command VER don't have right structure - Data vracena po prikazu VER nemaji spravnou strukturu + NoServerData, // doesn't read data from server (Server isn't answering) Nelze precist data ze serveru (Sever neodpovida) + NoUpsnetOk, // UpsNetOK is setting on faLse - je nastaven UpsNetOk na false + UnknownErr, // unknown error unknown text after ERR - neznama chyba - neznamy text za ERR + CommNotFind, // command hasn't been found in list of module's commands - prikaz nebyl nalezen v seznamu prikazu modulu + VarNotFind, // variable hasn't been found in list of module's variables promena nebyla nalezena v seznamu promenych modulu + EnumValueNotFind, //value of enumereted variable hasn't been found hodnota vyctove promene nebyla nalezena + +// tyto zpravy vraci server +// this mesages is returned server upsd + AccessDenied, // access denied - pristup odmitnut + PasswordRequired, // password is required - pro akci je nutno zaslat heslo + PasswordIncorrect, // password is incorrect nespravane heslo + UnknownUps, // this ups isn't occured on address - tato ups neni na zadane adrese + AlreadyLoggedIn, // prihlaseni LOGIN jiz bylo provedeno + AlreadySetPassword, // password has been already entered - heslo jiz bylo zadano + AlreadySetUsername, // username has been already entered - uzivatelske jmeno jiz bylo zadano + DataStale, // data from module isn't got - neni mozne ziskat z modulu nove data + MissingArgument, // misses argument - chyby argument + UnknownType, // unknown type of variable -neznamy typ promene + UnknownCommand, // umknown command example: sends maybe "UPERNAME admin" - nezmamy prikaz pr: poslem treba "UPERNAME admin" + + //tyto chyby se vztahuji k driveru pro danny typ UPS-ky + // this mistake is refered for selected driver of UPS + DriverNotConnected, // driver isn't connected - driver neni pripojen + NoResponse, // driver pro ups neodpovedel ve vymezenem case + UnknownReply, // unknown reply - neznama odpoved + NotImplemented, // + CommandFailed, // failed command - chybny prikaz + VarUnknown, // values isn't selected by driver - promena neni driverem podporovana + VarNotSupported, // cannot get data for this values - neni mozno zislat data pro tuto promenou + InvalidValue, // unknown value - nespravna hodnota + UnknownInstCmd, // unknown instant command / neznamy okamzity prikaz + CmdNotSupported, // this instant command isn't supported - tento okamzity prikaz neni podporovan + NotConnection, // operace nelze provest protoze neni provedeno pripojeni + // this not error + NoListVars}; //upsd doesn't return list of variables, variable for STATUS has got value WAIT + + enum typeOfStatus { + NS = 0, // - NONE status of UPS wasn't read + OFF = 1, // - UPS is off (not supplying power) + OL = 2, // - UPS is online (supplying power from the line/mains) + OB = 4, // - UPS is on battery + LB = 8, // - UPS battery is low (with OB = shutdown situation) + CAL = 16, // - UPS is performing calibration + TRIM = 32, // - UPS is trimming incoming voltage (APC "SmartTrim") + BOOST = 64, // - UPS is boosting incoming voltage (APC "SmartBoost") + OVER = 128, // - UPS is overloaded + RB = 256, // - UPS battery needs to be replaced + WAIT = 512 // - UPS as for waiting + }; + + enum keyWord { + NONE, + OK, + ERR, + BEGIN, + END, + VAR, + TYPE, + DESC, + UPSDESC, + CMDDESC, + UPS, + LIST, + RW, + CMD, + ENUM, + STARTTLS, + BEGIN_LIST_VAR, + BEGIN_LIST_RW, + BEGIN_LIST_CMD, + BEGIN_LIST_UPS, + BEGIN_LIST_ENUM, + END_LIST_VAR, + END_LIST_RW, + END_LIST_CMD, + END_LIST_UPS, + END_LIST_ENUM + }; + + enum flagsVar { + RW_FLAG = 1, + ENUM_FLAG = 2, + STRING_FLAG = 4 + }; + + + +/** + * Constructor sets basic variables and structures only, but doesn't read variables from server NUT + * Konstruktor pouze nastavi zakladni promene a struktury, ale necte promene se serveru NUT. + * @param upsName in name of UPS + * @param upsAddress Is address of UPS (adresa pocitace na ktery je UPS pripojena) + * netAddress can is entered like ip address or domain name + * example: localhost karel.domain,cz 194.212.25.55. + * @param tPort Is name if port, for NUT server (NUT is received on this port), default is 3493. + * @param delay is delay in msec. System waits before one tries to make connection again. When test of connection fails, + * @param countRepeat is maximal number of repeating for make connection. + * + * Since 0.7.5 version protocol UDP is not supported + * @param upsAddress Je adresa ups-ky (adresa pocitace na ktery je UPS pripojena) + * netAddress muze byt zadan jako ip adresa nebo domenove jmeno pocitace + * @param upsName je jmeno UPSky + * pr.: localhost karel.domena.cz 194.212.25.55. + * @param tPort je cislo portu na kterem nasloucha NUT server, default je 3493. + * @param delay je zpozdeni v msec, System ceka nez znovu pokusi ukutecnit spojeni. Kdyz pokus o spojeni selhal. + * @param countRepeat je maximalni pocet opakovani spojeni pro navazani spojeni. + * Od verze 0.7 neni podporovano UDP + * + * @since 0.7.5 + **/ + KNutNet (const QString upsAddress, const QString upsName="", const unsigned short port=3493, unsigned int countRepeat =0, const unsigned int delay = 200); + +/** + * @since 0.5 + **/ + ~KNutNet(); + + + +/** + * Zavre spojeni a nastavi hodnoty pro novou UPSku + * Closes conneting and sets values for new UPS + * + * @since 0.1 + **/ + void newUPS (const QString upsAddress, const QString upsName, const unsigned short port=3493); + + +/** + * Provadi spojeni + * Makes conneting + * + * @since 0.1 + **/ + void open (void); + +/** + * Zavre spojeni + * Closes conneting + * + * @since 0.1 + **/ + void close (void); + + +/** + * Returns kod of error, which is setted after last colling of same function this calls. + * Error NotConnected isn't returned (not for function getError, getState). + * It means then error NotConnected isn't remembered. + * Vraci kod chyby, ktera nastala pri poslednim volani kterekoliv funkce + * teto tridy (s vyjimkou getError, getState ), + * chyba NotConnected neni vracena; + * To znamena ze chyba NotConnected neni zapamatovana. + * + * + * @since 0.5 + **/ + int getError ( void ); + + +/** + * Vraci stav pripojeni. + * Returns state of connection. + * + * @since 0.5 + **/ + int getState ( void ); + + +/** + * Returns state of description, if descriptions is loaded. + * Vraci stav popisu, zda je nahran; + * + * @since 0.5 + **/ + bool isDescription ( void ); + + +/** + * Vraci zda doslo k prepnuti z UDP do TCP; + * Ma vyznam je pro verzi protokolu 2 + * + * @since 0.1 + **/ +bool switchedToTCP ( void ); + + +/** + * Vraci cislo protokolu pro komunikaci s NUT + * Returns nunber of protocol for comunications with NUT + * Od verze NUTu 1.3 je zmenen protokol + * Since version 1.3 protocol is changed + * + * @since 0.1 + **/ + int getNutProtocol ( void ); + +/** + * Return number of NUT's version + * Vraci cislo verze nazvu NUT-u + * Since version if nut 1.3 are changed names of values + * Od verze NUTu 1.3 jsou zmeneny nazvy promenych + * + * @since 0.1 + **/ + int getNutVariables ( void ); + + + +/** + * Nacte vsechny promene UPS-ky a nastavi jejich typ (znakove/char, vyctove/enum a status) + * Nastavi priznak aktivity jen pro status. + * Funkce vraci kod chyby nebo 0 pokud k chybe nedojde; + * Vzdy jsou nacteny i hodnoty promenych. + * + * @since 0.6.1 + **/ + int getUpsVars ( void); + + +/** + * Nacte hodnoty vsech promenych UPS-ky pokud je nastaven jejich priznak aktivity, + * nebo je nastaven allVars na true. + * Pozor po provedeni getUpsVars je priznak aktivity nastaven jen pro status. + * + * @param allVars Urcuje zda se prikaz tyka vsech promenych, nebo jen tech ktere + * maji nastaven priznak aktivity na TRUE. + * + * @since 0.6.1 + **/ + int getUpsValues (const bool allVars=true ); + + +/** + * Nacte popisy pro kazdou promennou + * Read descriptions for every variable + * + * @param always Urcuje zda se nacteny provede vzdy nebo jen kdy popis jeste + * nebyl nacten. + * + * @since 0.6 + **/ + int getDescription (bool always = false); + + +/** + * Provede okamzity prikaz. + * Vraci 0 pokud provedeni skoncilo v poradku jinak kod chyby. + * + * @param command Udava nazev prikazu. + * @param userName Udava uzivatelske jmeno. + * @param password Udava heslo. + * @param onlyCommand udava zda ma byt poslan pouze prikaz, nebo i nastaveno uzivatelske jmeno a heslo. + * POZOR!! uzivatelske jmeno nejde zmenit bez odpojeni a znovu pripojeni. + * + * @since 0.7 + **/ + int instantCommand (const QString command, const QString userName, const QString password, const bool onlyCommand = false); + + +/** + * Nastavi RW promenou. + * Vraci 0 pokud provedeni skoncilo v poradku jinak kod chyby; + * + * @param variable Udava nazev promenne. + * @param value Udava hodnotu. + * @param userName Udava uzivatelske jmeno. + * @param password Udava heslo. + * @param onlyVariable udava zda ma byt poslana pouze zadost na zmenu promenne, nebo i nastaveno uzivatelske jmeno a heslo. + * POZOR!! uzivatelske jmeno nejde zmenit bez odpojeni a znovu pripojeni. + * + * @since 0.7 + **/ + int setVariable (const QString variable, const QString value, const QString userName, const QString password, const bool onlyVariable = false); + + + +/** + * Returns number of UPS's variables. On error -1 is returned. + * Vrati pocet promenych UPS-ky. Pri chybe vraci -1. + * + * @param typVar Is type of variable, its number is found out. + * @param typVar Je typ promene pro ktere zjistujeme pocet + * muze se jednat o RO promenne RW promene nebo o vsechny promenne. + * + * @since 0.6 + **/ + int readNumberVars (typeOfVar typVar = AllVars); + + +/** + * Returns number of UPS's commands. On erroe -1 is returned. + * Vrati pocet prikazu UPS-ky. Pri chybe vraci -1. + * + * @since 0.6 + **/ + int readNumberComms (void); + + + +/** + * Nastavi strukturu udavajici vsechny hodnoty pro prikaz. + * Pri chybe vrati kod chyby + * + * @param seqNumber Udava cislo promene. + * @param upsIComm Je struktura upsICommDef. + * + * @since 0.6 + **/ + int readIComm (const int seqNumber, upsICommDef& upsIComm); + + +/** + * Nastavi strukturu obsahujici vsechny udaje promene. + * Pri chybe vrati kod chyby. + * + * @param name Udava jmeno promene. + * + * @since 0.6 + **/ + int readVars (const QString name, struct upsVarDef& allVar); + + +/** + * Nastavi strukturu obsahujici vsechny udaje promene. + * Pri chybe vrati kod chyby. + * + * @param seqNumber Udava poradove cislo promene, ta zacina VZDY cislem 1. + * @param typVar Udava typ promene /RO/RW/ALL. + * + * @since 0.6 + **/ + int readVars (const int seqNumber, struct upsVarDef& allVar, const typeOfVar typVar = AllVars); + + +/** + * Vrati hodnotu promenne. + * Pri chybe vrati 0l. + * + * @param name Udava jmeno promene. + * + * @since 0.6.1 + **/ + QString readStringVar (const QString name); + +/** + * Nacte jednu z hodnot vyctove promenne. + * Vraci jednu z hodnot vyctove promenne udanou poradovym cislem hodnoty. + * Pri chybe vrati 0l. + * + * @param name Udava nazev vyctove promenne. + * @param valueNumber Udava poradove cislo hodnoty vyctove promenne. + * @param enumValue Je naplnena hodnotou vyctove promenne. + * + * @since 0.6.1 + **/ + QString readEnumValueVar (const QString name, const int valueNumber); + + +/** + * Vraci kod stavu (statusu) UPS-ky + * kody je mozne scitat napt OB+LB = 12 + * OFF = 1, UPS-ka je vypnuta + * OL = 2, UPS-ka bezi na sit + * OB = 4 UPS-ka bezi na baterie + * LB = 8 baterie je vybyta (pokud je zaroven OB dojde k shutdownu) + * CAL = je spustena kalibrace UPS-ky + * OVER =128 UPS-ka je pretizena + * RB = 256 UPS-ka pozaduje vymenu baterie + * + * @since 0.5 + **/ +int readStatus(void); + + +/** + * Nastavi priznak aktivity. + * Pri chybe vrati kod chyby. + * + * @param name Udava jmeno promene. + * + * @since 0.6 + **/ + int setActivate ( const QString name ); + +/** + * Zrusi nastaveni priznaku aktivity. + * Pri chybe vrati kod chyby. + * + * @param name Udava jmeno promene. + * + * @since 0.6 + **/ + int unSetActivate ( const QString name ); + +/** + * Zrusi nastaveni priznaku aktivity pro VSECHNY promene. + * Pri chybe vrati kod chyby. + * + * @since 0.6 + **/ + int unSetActivateAll ( void ); + + + +/** + * Testuje zda existuje promena danneho jmena. + * POZOR ZMENA v NAVRATOVYCH HODNOTACH + * Vraci 0 pokud existuje. + * Pokud neexistuje nebo pri chybe vrati kod chyby. + * + * @param name Udava jmeno promene. + * + * @since 0.6 + **/ + int existName ( const QString name ); + +/********* Consts ****************/ + + +static const int initState = OL; + +signals: +/** + * Signal je vyslan, kdyz dojde k chube. + * Signal is emited, when error is occurred + * + * param@ error je cislo chyby. + * param@ error je value of error. + **/ +void connectionError(int error); + + +/** + * Signal je vyslan, kdyz druha starna uzavrela spojeni. + * Signal is emited, when other side closed connection. + * + * @since 0.1 + **/ +void connectionClosed (void); + +/** + * Signal je vyslan, kdyz dojde k prvemu spojeni se serverem. + * Signal is emited, when the first connection with server is realized + * + * @since 0.1 + **/ +void firstConnection(void); /** + * Signal je vyslan, kdyz dojde k dalsimu spojeni se serverem, znovu pripojeni. + * Signal is emited, when next connection with server is realized, reconnect. + * + * @since 0.1 + **/ +void nextConnection(void); + /** + * Signal je vyslan, kdyz prevod jmena byl uspesny. + * Signal is emited, when host lookup has succeeded + * + * @since 0.1 + **/ +void hostFound(void); + + + /** + * Signal je vyslan, kdyz spojeni je opet zkouseno. + * Signal is emited, when connection is tried again. + * + * @since 0.1 + **/ +void tryRepeatFirstConnection( int ); + + + /** + * Signal je vyslan, kdyz spojeni je zkouseno poprve. + * Signal is emited, when connection is tried at first. + * + * @since 0.1 + **/ +void tryFirstConnection( int); + + +// signals: + + void getVarDesc (int count, int item); + +/********* Private part **********/ + + private: + +// internal funkcion + + +/** + * Cleans input buffer + * Vycisti vstupni buffer + * + * @since 0.1 + **/ +void cleanConnecting (void); + + +/** + * Prevede textovy nazev klice na jeho numerickou hodnotu + * Jen pro protokol verze 2. + * Funkce vraci kod klice; + * param@ line textovy nazev klice. + * + * @since 0.1 + **/ +int setKey (const QString line); + +QString parseValue (const QString line); + +/** + * Parsuje typ promenne (RW ENUM STRING). + * Jen pro protokol verze 2. + * Funkce vraci soucet kodu typu promenych; + * param@ line retezec ktery se parsuje. + * param@ lenString vraci maximalni delka promenne typu STRING. + * + * @since 0.1.1 + **/ +int parseTypeValue (QString line, int& lenString ); + + + +/** + * Parsuje navratovou hodnotu z upsd (protokol klient-server). + * Jen pro protokol verze 2. + * Funkce vraci kod prikazu (UPS, VAR BEGIN_LIST_VAR ); + * + * @since 0.1 + **/ +int parseLine(QString& line, QString& upsName ,QString& varName, QString& value, int& typeValue, int& lenString); + + + +/** + * Nacte popisy pro kazdou promennou + * Jen pro protokol verze 1. + * + * @param always Urcuje zda se nacteny provede vzdy nebo jen kdy popis jeste + * nebyl nacten. + * + * @since 0.1 + **/ + int getDescription1 (bool always = false); + +/** + * Nacte popisy pro kazdou promennou + * Jen pro protokol verze 2. + * + * @param always Urcuje zda se nacteny provede vzdy nebo jen kdy popis jeste + * nebyl nacten. + * + * @since 0.1 + **/ + int getDescription2 (bool always = false); + + + +/** + * internal + * Nacte nazev prvni UPS-ky na danne adrese. + * Jen pro protokol verze 2 + * Funkce vraci kod chyby nebo 0 pokud k chybe nedojde; + * + * @since 0.1 + **/ +int getFirstUpsName (QString& firstUpsName); + + +/** + * internal + * Nacte vsechny promene UPS-ky a nastavi jejich typ (znakove/char, vyctove/enum a status) + * nastavi priznak aktivity jen pro status. + * Jen pro protokol verze 2 + * Funkce vraci kod chyby nebo 0 pokud k chybe nedojde; + * + * @since 0.1 + **/ + int getUpsVars1 ( void); + + + +/** + * internal + * Nacte vsechny promene UPS-ky a nastavi jejich typ (znakove/char, vyctove/enum a status) + * nastavi priznak aktivity jen pro status. + * Jen pro protokol verze 2 + * Funkce vraci kod chyby nebo 0 pokud k chybe nedojde; + * + * @since 0.2 + **/ + int getUpsVars2 ( void); + + + +/** + * Nacte hodnoty vsech promenych UPS-ky pokud je nastaven jejich priznak aktivity, + * nebo je nastaven allVars na true. + * + * @param allVars Urcuje zda se prikaz tyka vsech promenych, nebo jen tech ktere + * maji nastaven priznak aktivity na TRUE. + * Jen pro protokol verze 1 + * + * @since 0.6 + **/ + int getUpsValues1 (const bool allVars ); + +/** + * Nacte hodnoty vsech promenych UPS-ky pokud je nastaven jejich priznak aktivity, + * nebo je nastaven allVars na true. + * + * @param allVars Urcuje zda se prikaz tyka vsech promenych, nebo jen tech ktere + * maji nastaven priznak aktivity na TRUE. + * Jen pro protokol verze 2 + * + * @since 0.6 + **/ + int getUpsValues2 (const bool allVars ); + + +/** + * @internal + * Zjisti verzi upsd + * + * @param countRepeat maximalni pocet pokusu (ne opakovani !!) + * @param delay zpozdeni, cas mezi opakovani + */ + int version (int countRepeat, const int delay); + + +/** + * @internal + * Nenastavuje promenou error. + * Doesn't set variable error + */ + int getUpsData (const QCString sbuffer, QString& rbuffer, const QCString endString=0); + +/** + * @internal + */ + void setRWVars (const QString varName, const bool valueType, const int varMax, QValueVector* enumValues); + +/** + * @internal + */ +void upsSetType (struct upsVarDef& upsVar, const QString name, const QString value = ""); + +/** + * @internal + */ + int upsTranslateError (const QString string); + + +/** + * @internal + */ + void deleteVars (void); + +/** + * @internal + */ + int upsOldTranslateError (const QString string); + + +/** + * @internal + * Pro qt mensi nez 3.0.0 nemuze byt value const + */ + void genStatusFlags (QString value); + +/** + * @internal + * Nenastavuje promenou error. + */ + int sendComm (const QString command, const QString arg1, const QString arg2, const bool useUpsName=false); + + +/** + * @internal + */ + int activate ( const QString name, const bool setActivate ); + + +/** + * @internal + */ + int activateAll ( const bool setActivate ); + + +/** + * @internal + */ + int newDescription (const QCString inBuffer, QString& upsDescription); + +private slots: + void slotConnectionError(int error); + + void slotConnected(void); + + void slotTimerReconnect(void); + + void slotHostFound(void); + + void slotConnectionClosed(void); + + void slotClosed (void); + + +private: + + /******* CONST ********/ + + static const Q_ULONG rBufferLen = 1024; + + QSocket *m_commandSocket; + QTimer* m_unConnectTimer; + + + /****** VARS *************/ + QString m_upsAddress; + QString m_upsName; + + unsigned int m_countRepeat; + unsigned short m_port; + unsigned int m_delay; + + NetState m_state; + int m_error; + bool m_firstConnect; + unsigned int m_numberConnection; + + int m_nutProtocol; // 1 for NUT <1.3, 2 for NUT => 1.3 + int m_nutVariables; // 1 for NUT <1.3, 2 for NUT => 1.3 + + + int m_numberVars; // number of all variables - pocet vsech promennych + int m_numberRWVars; + int m_numberIComms; + + int m_upsStatusVar; + bool m_description; + + bool m_switchToTCP; + + QMutex m_getUpsDataMutex; + + QValueVector m_listVars; + QValueVector m_listIComms; + +/********* Pomocne promenne ***********/ + int m_posChar; + +}; + +#endif + diff --git a/src/knutnewupsdlg.cpp b/src/knutnewupsdlg.cpp new file mode 100644 index 0000000..6cdd2b9 --- /dev/null +++ b/src/knutnewupsdlg.cpp @@ -0,0 +1,294 @@ +/*************************************************************************** + knutnewupsdlg.cpp - description + ------------------- + begin : Tue Aug 21 2001 + copyright : (C) 2001 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "knutnewupsdlg.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +//#include +#include +#include +#include + +//#include + + + +KNutNewUpsDlg::KNutNewUpsDlg (KNutUpsData* const upsData, KNutVarData* const analogData, const bool add, QWidget* parent, const char* name, const bool modal) + : KDialogBase(Plain, i18n("New Ups"),Help|Ok|Cancel,Ok, parent, name, modal, true ), addMember(add), m_myUpsData(upsData) { + + setName( "KupsNewUpsDlg" ); + + QFrame *page =plainPage(); + QVBoxLayout *mainLayout = new QVBoxLayout( page, 0, spacingHint(), "mainLayout" ); + QHBoxLayout *dataLayout = new QHBoxLayout(mainLayout, spacingHint(),"dataLayout"); + + + QGroupBox *hostBox = new QGroupBox (page,"hostBox"); + QGridLayout *hostLayout = new QGridLayout (hostBox, 5, 2, spacingHint () ); + hostBox->setFrameStyle(QFrame::NoFrame); + dataLayout->addWidget(hostBox); + + QHBoxLayout *portLayout = new QHBoxLayout(-1,"portLayout"); + hostLayout->addLayout(portLayout,4,1); + + QHBoxLayout *loginLayout = new QHBoxLayout(-1,"loginLayout"); + hostLayout->addLayout(loginLayout,5,1); + + + QGroupBox* GroupBox2 = new QGroupBox( page, "GroupBox2" ); + + + QVBoxLayout *vActionSelectorLayout = new QVBoxLayout( GroupBox2, 0, spacingHint(), "VActionLayout" ); + vActionSelectorLayout->addSpacing(fontMetrics().lineSpacing()); + QHBoxLayout *hActionSelectorLayout = new QHBoxLayout( vActionSelectorLayout, spacingHint(), "HActionLayout" ); + vActionSelectorLayout->addSpacing(10); + + + QLabel* TextLabel1 = new QLabel( i18n("Name")+":",hostBox, "TextLabel1" ); + hostLayout->addWidget (TextLabel1,1,0); + m_lineEdit1 = new KLineEdit( hostBox, "LineEdit1" ); + m_lineEdit1->setEnabled( add ); + // pokud se nejedna o pridani (add) neni jmeno aktivovani + // when makes adding name isn;t activated + hostLayout->addWidget (m_lineEdit1,1,1); + + QLabel* TextLabel2 = new QLabel(i18n("UPS address")+":", hostBox, "TextLabel2" ); + hostLayout->addWidget (TextLabel2,2,0); + m_lineEdit2 = new KLineEdit( hostBox, "LineEdit2" ); + hostLayout->addWidget (m_lineEdit2,2,1); + +// Name of UPS + QLabel* TextLabel7 = new QLabel(i18n("UPS name")+":", hostBox, "TextLabel7" ); + hostLayout->addWidget (TextLabel7,3,0); + m_lineEdit7 = new KLineEdit( hostBox, "LineEdit7" ); + hostLayout->addWidget (m_lineEdit7,3,1); + + + QLabel* TextLabel3 = new QLabel(i18n("Delay (ms):"), hostBox, "TextLabel3" ); + hostLayout->addWidget (TextLabel3,4,0); + m_lineEdit3 = new KLineEdit( hostBox, "LineEdit3" ); + m_lineEdit3->setText("5000"); + portLayout->addWidget(m_lineEdit3); + portLayout->addSpacing(10); + + QLabel* TextLabel4 = new QLabel(i18n("Port:"), hostBox, "TextLabel4" ); + m_lineEdit4 = new KLineEdit( hostBox, "LineEdit4" ); + m_lineEdit4->setText(QString("%1").arg(knc::DefaultPort)); + portLayout->addWidget(TextLabel4); + portLayout->addWidget(m_lineEdit4); + + QLabel* TextLabel5 = new QLabel(i18n("User name:"), hostBox, "TextLabel5" ); + hostLayout->addWidget (TextLabel5,5,0); + m_lineEdit5 = new KLineEdit( hostBox, "LineEdit5" ); + m_lineEdit5->setText(""); + loginLayout->addWidget(m_lineEdit5); + loginLayout->addSpacing(10); + + QLabel* TextLabel6 = new QLabel(i18n("Password:"), hostBox, "TextLabel6" ); + m_lineEdit6 = new KLineEdit( hostBox, "LineEdit6" ); + m_lineEdit6->setEchoMode(QLineEdit::Password); + m_lineEdit6->setText(""); + loginLayout->addWidget(TextLabel6); + loginLayout->addWidget(m_lineEdit6); + + m_savePassword = new QCheckBox (i18n("Store NUT password in configuration file"),page,"savePassword"); + mainLayout->addWidget(m_savePassword); + mainLayout->addWidget(GroupBox2); + + + m_upsValueSelector = new KActionSelector(GroupBox2); + + m_upsValueSelector->setAvailableLabel(i18n("Availabled UPS values")); + m_upsValueSelector->setSelectedLabel(i18n("Selected UPS values")); + m_upsValueSelector->setAvailableInsertionPolicy(KActionSelector::Sorted); + m_upsValueSelector->setSelectedInsertionPolicy(KActionSelector::AtBottom); + + hActionSelectorLayout->addSpacing(10); + hActionSelectorLayout->addWidget(m_upsValueSelector); + hActionSelectorLayout->addSpacing(10); + + mainLayout->addStretch(10); + + GroupBox2->setTitle( i18n( "UPS Variables" )); + + QListBox* aListBox = m_upsValueSelector->availableListBox(); + for (int i=1; i < knc::NumberOfTypes; i++) { //values 0 is None, this values isn't showing + new KNutUpsBoxItem (aListBox,analogData->getNameAnalogData(i),i); + } + + aListBox->sort(true); + } + + + +KNutNewUpsDlg::~KNutNewUpsDlg() { + } + + +void KNutNewUpsDlg::moveToSelectedList (const int codeUpsVar) { + +if (codeUpsVar == 0) return; +if (isExistSelectedItem(codeUpsVar)) return; //Value is moved yet + +KNutUpsBoxItem * availableItem; +availableItem =(KNutUpsBoxItem*) m_upsValueSelector->availableListBox()->firstItem(); + +while (availableItem != 0) { + if (availableItem->getVarCode() == codeUpsVar) { + break; + } + availableItem=(KNutUpsBoxItem*)availableItem->next(); + } + +//remove item from left list +if (availableItem != 0) { + QListBox* sListBox = m_upsValueSelector->selectedListBox(); + new KNutUpsBoxItem (sListBox,availableItem->text(),codeUpsVar); + m_upsValueSelector->availableListBox()->removeItem(m_upsValueSelector->availableListBox()->index(availableItem)); + + } +} + + +bool KNutNewUpsDlg::isExistSelectedItem (const int codeUpsVar) const { + +KNutUpsBoxItem * selectedItem; +selectedItem =(KNutUpsBoxItem*) m_upsValueSelector->selectedListBox()->firstItem(); + + +while (selectedItem != 0) { + if (selectedItem->getVarCode() == codeUpsVar) return true; + selectedItem=(KNutUpsBoxItem*)selectedItem->next(); + } +return false; +} + + +void KNutNewUpsDlg::putData (const KNutUpsData::upsRecordDef upsRecord ) { + m_lineEdit1->setText(upsRecord.name); + m_lineEdit2->setText(upsRecord.upsAddress); + m_lineEdit7->setText(upsRecord.upsName); + QString delay, port; + delay.setNum(upsRecord.delay); + m_lineEdit3->setText(delay); + port.setNum(upsRecord.port); + m_lineEdit4->setText(port); + m_lineEdit5->setText(upsRecord.userName); + m_lineEdit6->setText(upsRecord.password); +// RadioButton1->setChecked( !upsInfo.tcp ); +// RadioButton2->setChecked( upsInfo.tcp ); + m_savePassword->setChecked(m_savePassword); + + for (int j=0; j text(); + upsRecord.upsAddress=m_lineEdit2->text(); + upsRecord.upsName= m_lineEdit7->text(); + upsRecord.delay=m_lineEdit3->text().toLong(); + upsRecord.port=(short unsigned)m_lineEdit4->text().toUInt(); +// upsInfo.tcp=RadioButton2->isChecked(); + upsRecord.userName=m_lineEdit5->text(); + upsRecord.password=m_lineEdit6->text(); + upsRecord.savePassword=m_savePassword->isChecked(); + + + int j =0; + KNutUpsBoxItem * selectedItem; + selectedItem =(KNutUpsBoxItem*) m_upsValueSelector->selectedListBox()->firstItem(); + + while (selectedItem != 0) { + upsRecord.upsVarCode[j++]=selectedItem->getVarCode(); + selectedItem=(KNutUpsBoxItem*)selectedItem->next(); + } + + for (int i=j; i < knc::NumberOfVars; i++) { + upsRecord.upsVarCode[i]=0; + } + + return upsRecord; + } + +/*********************************************************************************************/ +/* */ +/* PRIVATE SLOTS */ +/* */ +/*********************************************************************************************/ + + + +void KNutNewUpsDlg::slotOk() { + bool ok; + // closes window + m_lineEdit1->setText(m_lineEdit1->text().stripWhiteSpace()); + m_lineEdit2->setText(m_lineEdit2->text().stripWhiteSpace()); + + if ((m_lineEdit1->text().length() <1 ) + || (m_lineEdit2->text().length() <1 )) { + KMessageBox::sorry (0,i18n("No Name or UPS address")); + return; + } + + if (addMember) { + // when UpsName is existed we cannot make new record + // pokud UpsName jiz existuje nemuzeme vytvorit novy zaznam + if ( m_myUpsData->findName(m_lineEdit1->text()) != 0L ) { + KMessageBox::sorry (0,i18n("This Name exist")); + return; + } + } + + long delay = m_lineEdit3->text().toLong(&ok); + if (! ok) { + KMessageBox::sorry (0,i18n("Delay must be number")); + return; + } + + long port = m_lineEdit4->text().toLong(&ok); + if (! ok) { + KMessageBox::sorry (0,i18n("Port must be number")); + return; + } + + if ((port < knc::StartPort) || (port > knc::StopPort)) { + KMessageBox::sorry (0,i18n("Port must be from 1025 until 65535")); + return; + } + + if (delay < knc::MinDelay) { + KMessageBox::sorry (0,i18n("Delay is too small")); + return; + } + accept (); + } + + + +#include "knutnewupsdlg.moc" diff --git a/src/knutnewupsdlg.h b/src/knutnewupsdlg.h new file mode 100644 index 0000000..447c089 --- /dev/null +++ b/src/knutnewupsdlg.h @@ -0,0 +1,160 @@ +/*************************************************************************** + knutnewupsdlg.h - description + ------------------- + begin : Tue Aug 21 2001 + copyright : (C) 2001 by Daniel Prynych + email : Daniel@prynych.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNUTNEWUPSDLG_H +#define KNUTNEWUPSDLG_H + +#include "knutupsdata.h" +#include "knutvardata.h" + +#include +#include +#include +#include +#include + +#include + + +class QLabel; +class QGroupBox; +class QButtonGroup; +class QCheckBox; + +/** + * This class is dialog for makeing or correting informations about UPS. + * It can set address, port and seletcts values its values will be found, + * Tato trida je dialog pro vytvoreni nebo opravu informaci a UPS. + * Umoznuje nastavit adresu, port, a vybrat promennou jejiz hodnota se bude zjistovat. + * @author Daniel Prynych + * @short Panel for setting parameters of UPS + * + * @version 0.4 + */ +class KNutNewUpsDlg : public KDialogBase +{ + Q_OBJECT + +public: + +/** + * Constructor - makes configure dialog. + * Konstruktor - vytvori konfiguracni dialog. + * + * @param add Urcuje zda budeme data opravovat nebo pridavat. + * @param settingData pointer on structure, which includes values which is setted in dialog. + * @param upsdata is pointer on instance of class KNutUpsData. + * @param analogData is pointer on instance of class KNutVardata + * @param add Urcuje zda budeme data opravovat nebo pridavat. + * @param settingData Je odkaz na strukturu ktera obsahuje hodnoty nastavovane v dialogu. + * @param upsData Je odkaz na na instanci tridy KNutUpsData. + * @param analogData Je odkaz na na instanci tridy KNutVarData. + * + * @since 0.7 + **/ + KNutNewUpsDlg (KNutUpsData* const upsData, KNutVarData* const analogData, const bool add = TRUE, QWidget* parent = 0, const char* name = 0, const bool modal = TRUE); + +/** + * @since 0.3 + **/ + ~KNutNewUpsDlg(); + +/** + * Reads data from items of form. + * Precte data z polozek formulare. + * + * @param upRecordDef Struktura of UpsInfo - contains all items which is included in form. + * @param upsRecordDef Struktura UpsInfo - obsahuje vsechny polozky ktere jsou ve formulari. + * + * @since 0.4 + **/ + KNutUpsData::upsRecordDef getData (void ) const; + +/** + * Puts date into intems of form + * Vlozi data do polozek formulare. + * + * @param upsRecord Struktura of upsRecordDef - contains all items which is included in form. + * @param upsRecord Struktura psRecordDef - obsahuje vsechny polozky ktere jsou ve formulari. + * + * @since 0.4 + **/ + void putData (const KNutUpsData::upsRecordDef upsRecord ); + +/********************* PRIVATE **************************/ + + private slots: + +/** + * Is activated when button ok is pressed. + * Provede se pri stisknuti tlacitka ok. + * + * @since 0.1 + **/ + virtual void slotOk(); + + +private: +/** + * This class is inner class for showing items. + * Add information about order number of UPS values. + * Tato trida je vnorena trida pro zobrazeni polozek. + * Pridava informaci o poradovem cisle UPS promennych. + * @author Daniel Prynych + * @short Item of listBox + * + * @version 0.1 + */ + class KNutUpsBoxItem : public QListBoxText + { + private: + int m_ordVarCode; + + public: + KNutUpsBoxItem ( QListBox* listbox, const QString & text=QString::null, const int ordVarCode = 0 ) : + QListBoxText (listbox, text), m_ordVarCode (ordVarCode) {}; + KNutUpsBoxItem ( QListBox* listbox, const QString & text, QListBoxItem *after, const int ordVarCode = 0 ) : + QListBoxText (listbox, text, after), m_ordVarCode (ordVarCode) {}; + int getVarCode (void) const {return m_ordVarCode;}; + void putGetCode (const int ordVarCode) {m_ordVarCode = ordVarCode;}; +// QString text () const {return QListBoxItem::text();}; + }; + + + void moveToSelectedList (const int codeUpsVar); + + bool isExistSelectedItem (const int codeUpsVar) const; + + + bool addMember; // true pokud se pridava polozka, false edit + KNutUpsData* m_myUpsData; // Ups data object + + KLineEdit* m_lineEdit1; + KLineEdit* m_lineEdit2; + KLineEdit* m_lineEdit3; + KLineEdit* m_lineEdit4; + KLineEdit* m_lineEdit5; + KLineEdit* m_lineEdit6; + KLineEdit* m_lineEdit7; + + QCheckBox* m_savePassword; + + KActionSelector* m_upsValueSelector; + +}; + +#endif diff --git a/src/knutpanelmeter.cpp b/src/knutpanelmeter.cpp new file mode 100644 index 0000000..e27a246 --- /dev/null +++ b/src/knutpanelmeter.cpp @@ -0,0 +1,353 @@ +/*************************************************************************** + knutpanelmeter.cpp - description + ------------------- + begin : Út b?e 16 2004 + copyright : (C) 2004 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "knutpanelmeter.h" + +#include + +#include +#include +#include + + +#include +#include +#include + +//#include + + +extern const char *nameUpsVars1[]; +extern const char *nameUpsVars2[]; + + +KNutPanelMeter::KNutPanelMeter(QPalette aPanelPalette, KNutVarData::upsInfoDef* activeUpsInfo, KNutVarData::SettingDataDef* settingData, KNutVarData* analogRecords, QWidget *parent, const char *name ) : QScrollView(parent,name,Qt::WResizeNoErase|Qt::WStaticContents) { + + m_settingData = settingData; + m_activeUpsInfo = activeUpsInfo; + m_analogRecords = analogRecords; + m_aPanelPalette = aPanelPalette; + + m_analogArea = new QLabel(this->viewport()); + addChild(m_analogArea); + setResizePolicy ( QScrollView::AutoOneFit ) ; + + +////NUTNO PAK UPRAVIT ACTIVATE A DEAKTIVATE ANALOGS + m_analogPanels = new analogPanelRecordsDef; + for (int i=0; i< knc::NumberOfVars; i++) + m_analogPanels->upsAnalogs[i]=0L; + + m_widthArea =0; + m_heightArea =0; + } + +KNutPanelMeter::~KNutPanelMeter(){ + + deActivateAnalogs(); + delete m_analogPanels; + m_analogPanels=0L; + } + + + +void KNutPanelMeter::deActivateAnalogs (void) { + +//std::cout << "KNutPanelMeter::deActivateAnalogs" << std::endl; + + if (m_analogPanels) { + for (int i=0; i< knc::NumberOfVars; i++) { + if (m_analogPanels->upsAnalogs[i] != 0) { + delete m_analogPanels->upsAnalogs[i]; // uvolnime meraky + } + m_analogPanels->upsAnalogs[i]=0L; + } + } + m_widthArea =0; + m_heightArea =0; + } + +void KNutPanelMeter::activateAnalogs (void) { +//qDebug ("KNutPanelMeter::activateAnalogs start"); + + + KNutVarData::VarStrucDef analogMemberData; + int ii =0; + // deletes vatiables which ups doeasn't support + // vyjmeme promene ktere ups nepodporuje + + //// nasledujici radka neni nutna + for (int i=0; i< knc::NumberOfVars; i++) m_analogPanels->upsAnalogs[i]=0L; + for (int i=0; i< knc::NumberOfVars; i++) { + // otestujeme zda dane UPS podporuje tuto promenou + // pokud existuje vrati 1 + switch (m_activeUpsInfo->nutVariables) { + case 1: + if (!m_activeUpsInfo->upsNet->existName(nameUpsVars1[m_activeUpsInfo->record.upsVarCode[i]])) + m_activeUpsInfo->record.upsVarCode[ii++] = m_activeUpsInfo->record.upsVarCode[i]; + break; + case 2: + if (!m_activeUpsInfo->upsNet->existName(nameUpsVars2[m_activeUpsInfo->record.upsVarCode[i]])) + m_activeUpsInfo->record.upsVarCode[ii++] = m_activeUpsInfo->record.upsVarCode[i]; + break; + } + } + for (int i=ii; i< knc::NumberOfVars; i++) m_activeUpsInfo->record.upsVarCode[i]=0;// doplnime zbytek nulami to znamena zadna promena + + for (int i=0; i< knc::NumberOfVars; i++) { + if (m_activeUpsInfo->record.upsVarCode[i] != 0) { + analogMemberData=m_analogRecords->getData (m_activeUpsInfo->record.upsVarCode[i]); + + m_analogPanels->scaleEnd[i]=analogMemberData.end; + m_analogPanels->scaleStart[i]=analogMemberData.start; + QColor analogFingerColor, analogScaleColor, analogFontColor; + if (m_settingData->customOAnalogColor) { + analogFingerColor = m_settingData->analogFingerColor; + analogScaleColor = m_settingData->analogScaleColor; + analogFontColor = m_settingData->analogFontColor; + } + else { + analogFingerColor = DEFAULT_FINGER_COLOR; + analogScaleColor = DEFAULT_SCALE_COLOR; + analogFontColor = DEFAULT_FONT_COLOR; + } + + if (m_settingData->customFont) + // doesn't make background + m_analogPanels->upsAnalogs[i] = new KNutAnalog( m_analogArea,0L,analogMemberData.start,analogMemberData.end,analogMemberData.typeAnalog,analogMemberData.numberItem,analogMemberData.numberInItem,analogFingerColor,analogScaleColor,analogFontColor,&(m_settingData->aPanelFont),m_settingData->typeDigitalProcessing); + else + m_analogPanels->upsAnalogs[i] = new KNutAnalog( m_analogArea,0L,analogMemberData.start,analogMemberData.end,analogMemberData.typeAnalog,analogMemberData.numberItem,analogMemberData.numberInItem,analogFingerColor,analogScaleColor,analogFontColor,&(m_settingData->systemFont),m_settingData->typeDigitalProcessing); + //nastavime barvu mezikruzi + + + if (m_settingData->customOAnalogColor) { + m_analogPanels->upsAnalogs[i]->setArcColor(1,m_settingData->analogOKColor); // doesn't make background + m_analogPanels->upsAnalogs[i]->setArcColor(2,m_settingData->analogWarnningColor); // doesn't make background + m_analogPanels->upsAnalogs[i]->setArcColor(3,m_settingData->analogErrorColor); // doesn't make background + } + // po vygenerovani panelu jsou standartni barvy nastaveny automaticky + //nastavime mezikruzi + for (int j = 0; j < 5; j++ ) { + if (!((analogMemberData.scaleStruct[j].start == 0) && (analogMemberData.scaleStruct[j].end ==0 ))) { + m_analogPanels->upsAnalogs[i]->addArc (analogMemberData.scaleStruct[j].start,analogMemberData.scaleStruct[j].end,analogMemberData.scaleStruct[j].scaleColor, false); // doesn't make background + } + } + m_analogPanels->upsAnalogs[i]->setText(analogMemberData.nameAnalog,analogMemberData.nameUnit); + m_analogPanels->upsAnalogs[i]->setPalette(m_aPanelPalette); + m_analogPanels->upsAnalogs[i]->makeBackground(false); // makes background of analog panel + + } + } + +//qDebug ( "KNutPanelMeter::activateAnalogs 1" ); + m_analogArea->repaint(); //repaint all analog panels, background was made already +//qDebug ("KNutPanelMeter::activateAnalogs - end"); +// analogSV->resizeContents(sizeHint().width(),sizeHint().height()); + } + + + +void KNutPanelMeter::setSize (bool showPanels) { + int row =0; + int col=0; + int maxCols =0; + int maxRows =0; + + if (!m_activeUpsInfo->netError) { + for (int i=0; i< knc::NumberOfVars; i++) { + if (m_activeUpsInfo->record.upsVarCode[i] != 0) { + if (maxCols < m_settingData->countCols) maxCols++; + maxRows = row+1; + // jestlize upsAnalogs =0 nejsou aktivovany + if (m_analogPanels->upsAnalogs[i]) { + m_analogPanels->upsAnalogs[i]->move (SpacePanels + (SpacePanels)+(col*(KNutAnalog::AnalogWidth+SpacePanels)),SpacePanels+(row*(KNutAnalog::AnalogWidth+SpacePanels))); + if (showPanels) m_analogPanels->upsAnalogs[i]->show(); + } + col++; + if (col > (m_settingData->countCols-1) ) {col=0; row++;}; // prechod na dalsi radku + } + } + } + // musime nastavit velikost + m_widthArea = (KNutAnalog::AnalogWidth + SpacePanels)*maxCols +2*SpacePanels; // sirka + m_heightArea = (KNutAnalog::AnalogWidth + SpacePanels)*(maxRows) + SpacePanels; // minimalni velikost podle mericich panelu + + m_analogArea->setMinimumSize (m_widthArea,m_heightArea); + adjustSize(); + resizeContents(m_widthArea,m_heightArea); + repaint(); + } + +void KNutPanelMeter::repaintScaleAnalogPanel (int panelNumber, float value) { + + if (m_analogPanels->upsAnalogs[panelNumber] != 0L){ + switch (m_activeUpsInfo->record.upsVarCode[panelNumber]) { + case knc::VarCurrent : // output.current + if (m_analogPanels->scaleEnd[panelNumber] < MaxCurrent) { + if (m_analogPanels->scaleEnd[panelNumber] < value) { + m_analogPanels->scaleEnd[panelNumber]=(static_cast(floor((value+1)/5)))*5 +5; + if (m_analogPanels->scaleEnd[panelNumber] > MaxCurrent) m_analogPanels->scaleEnd[panelNumber]=MaxCurrent; + m_analogPanels->upsAnalogs[panelNumber]->setRange(m_analogPanels->scaleStart[panelNumber],m_analogPanels->scaleEnd[panelNumber],true); + } + } + break; + case knc::VarBattVolt : // battery.voltage + if (m_analogPanels->scaleEnd[panelNumber] < MaxBattVolt) { + if (m_analogPanels->scaleEnd[panelNumber] < value) { + m_analogPanels->scaleEnd[panelNumber]=(static_cast(floor((value+1)/10)))*10 +10; + if (m_analogPanels->scaleEnd[panelNumber] > MaxBattVolt) m_analogPanels->scaleEnd[panelNumber]=MaxBattVolt; + m_analogPanels->upsAnalogs[panelNumber]->setRange(m_analogPanels->scaleStart[panelNumber],m_analogPanels->scaleEnd[panelNumber],true); + } + } + break; + case knc::VarBattCurrent : // battery.current + if (m_analogPanels->scaleEnd[panelNumber] < MaxBattCurrent) { + if ((m_analogPanels->scaleEnd[panelNumber] < value) || (m_analogPanels->scaleStart[panelNumber] > value)) { + if ((value >10) || (value <- 15)) { + if ((value >20) || (value < -30)) { + m_analogPanels->scaleEnd[panelNumber]=30; + m_analogPanels->scaleStart[panelNumber]=-45; + } + else { + m_analogPanels->scaleEnd[panelNumber]=20; + m_analogPanels->scaleStart[panelNumber]=-30; + } + m_analogPanels->upsAnalogs[panelNumber]->setPointer(value); // jistota pokud by nam to nekde propadlo + m_analogPanels->upsAnalogs[panelNumber]->hide();// schovame analogovy panel hides analog panel + m_analogPanels->upsAnalogs[panelNumber]->setRange (m_analogPanels->scaleStart[panelNumber],m_analogPanels->scaleEnd[panelNumber]); + m_analogPanels->upsAnalogs[panelNumber]->repaint(); // prekreslime , repaints panel + m_analogPanels->upsAnalogs[panelNumber]->show(); //zobrazime merak shows analog panel + } + } + } + break; + } // end switch + } + } + + + +void KNutPanelMeter::repaintAnalogPointer (int panelNumber, float value, bool run) { + if (m_analogPanels->upsAnalogs[panelNumber] != 0L) + m_analogPanels->upsAnalogs[panelNumber]->setPointer (value,run); // nastavi hodnotu rucicky + } + + + +void KNutPanelMeter::setAnalogBG(QPalette aPanelPalette) { + + m_aPanelPalette = aPanelPalette; + for (int i=0; i< knc::NumberOfVars; i++) { + if ((m_activeUpsInfo->record.upsVarCode[i]) && (m_analogPanels->upsAnalogs[i])) + m_analogPanels->upsAnalogs[i]->setPalette(m_aPanelPalette); + } + } + + +void KNutPanelMeter::changeAnalogPanelsDigProcessing (void) { + + if (m_analogPanels == 0) return; + + for (int i=0; i< knc::NumberOfVars; i++) { + if (m_analogPanels->upsAnalogs[i] != 0L) m_analogPanels->upsAnalogs[i]->setDigitalProcesing(m_settingData->typeDigitalProcessing,true); + } + + } + + +void KNutPanelMeter::repaintAnalogPanels (bool repaintFrequencyPanels, bool repaintVoltagePanels, bool repaintAllPanels) { + +KNutVarData::VarStrucDef analogMemberData; + + if (m_analogPanels == 0) return; + + // pregenerovani panelu slouzi pro settingMain a setting Analog + for (int i=0; i< knc::NumberOfVars; i++) { + if ((m_activeUpsInfo->record.upsVarCode[i]) && (m_analogPanels->upsAnalogs[i])) { + //if upsAnalogs[x] is set to zero, this upsAnalog is not used + // record.upsVarCode contain list of code of analog meter + // 0 is code for none analog meter, 1 for Input Voltage, 2 for Battery Charge, + if (((m_activeUpsInfo->record.upsVarCode[i] == knc::VarAcfreq) && (repaintFrequencyPanels)) || + ((m_activeUpsInfo->record.upsVarCode[i] == knc::VarOutFreq) && (repaintFrequencyPanels)) || + (((m_activeUpsInfo->record.upsVarCode[i] == knc::VarUtility) || + (m_activeUpsInfo->record.upsVarCode[i] == knc::VarOutVolt)) && (repaintVoltagePanels))) { + + analogMemberData=m_analogRecords->getData (m_activeUpsInfo->record.upsVarCode[i]); // nacteme data + + m_analogPanels->upsAnalogs[i]->hide();// schovame analogovy panel + m_analogPanels->upsAnalogs[i]->delArc(); //zrusime segmenty + m_analogPanels->upsAnalogs[i]->setRange (analogMemberData.start,analogMemberData.end); + for (int j = 0; j < 5; j++ ) { + if (!((analogMemberData.scaleStruct[j].start == 0) && (analogMemberData.scaleStruct[j].end ==0 ))) { + m_analogPanels->upsAnalogs[i]->addArc (analogMemberData.scaleStruct[j].start,analogMemberData.scaleStruct[j].end,analogMemberData.scaleStruct[j].scaleColor, false); + } // end if (! + }// end for (int i=0 + + m_analogPanels->upsAnalogs[i]->makeBackground(false); // repaints analog meter + m_analogPanels->upsAnalogs[i]->repaintPointer(false); // repaints analog meter + m_analogPanels->upsAnalogs[i]->repaint(); // repaints analog meter + m_analogPanels->upsAnalogs[i]->show(); // shows analog meter + } // end if (((activeUpsInfo + if (repaintAllPanels) { + if (m_settingData->customOAnalogColor) { + m_analogPanels->upsAnalogs[i]->setPointerColor(m_settingData->analogFingerColor); + m_analogPanels->upsAnalogs[i]->setArcColor(1,m_settingData->analogOKColor); + m_analogPanels->upsAnalogs[i]->setArcColor(2,m_settingData->analogWarnningColor); + m_analogPanels->upsAnalogs[i]->setArcColor(3,m_settingData->analogErrorColor); + m_analogPanels->upsAnalogs[i]->setScaleColor(m_settingData->analogScaleColor); + m_analogPanels->upsAnalogs[i]->setFontColor(m_settingData->analogFontColor); + } + else { + m_analogPanels->upsAnalogs[i]->setPointerColor (DEFAULT_FINGER_COLOR); + m_analogPanels->upsAnalogs[i]->setDefaultArcColor(); + m_analogPanels->upsAnalogs[i]->setScaleColor (DEFAULT_SCALE_COLOR); + m_analogPanels->upsAnalogs[i]->setFontColor (DEFAULT_FONT_COLOR); + } + m_analogPanels->upsAnalogs[i]->repaintAll(); + } + } + } // end for + } + +void KNutPanelMeter::zeroingPanels (void) { + if (m_analogPanels) { + for (int i=0; i< knc::NumberOfVars; i++) { + if ((m_analogPanels->upsAnalogs[i] != 0L) && (m_activeUpsInfo->record.upsVarCode[i] != 0)) // jistota pokud by nam to nekde propadlo + m_analogPanels->upsAnalogs[i]->setPointer (0); // nastavi hodnotu rucicky + } + } + } + + + +QSize KNutPanelMeter::sizeHint (void){ + + return QSize(m_widthArea,m_heightArea); + } + + +void KNutPanelMeter::slotSetPanelsFont(QFont newFont) { + + for (int i=0; i< knc::NumberOfVars; i++) { + if ((m_activeUpsInfo->record.upsVarCode[i]) && (m_analogPanels->upsAnalogs[i])) { + m_analogPanels->upsAnalogs[i]->slotSetAllFont(newFont); + // je nutno prekresli i rucicku + } + } + } + +#include "knutpanelmeter.moc" diff --git a/src/knutpanelmeter.h b/src/knutpanelmeter.h new file mode 100644 index 0000000..3bc8d47 --- /dev/null +++ b/src/knutpanelmeter.h @@ -0,0 +1,210 @@ +/*************************************************************************** + knutpanelmeter.h - description + ------------------- + begin : Út b?e 16 2004 + copyright : (C) 2004 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNUTPANELMETER_H +#define KNUTPANELMETER_H + +#include "knutanalog.h" +#include "knutvardata.h" + + +//#include +#include + + +class QLabel; +class QFont; + +/** + *@author Daniel Prynych + */ +class KNutPanelMeter : public QScrollView { + Q_OBJECT +public: + +/** + * Konstruktor + * + * Param taPanelPalette je paleta pozadi subpanelu MERAKU !!! + * @param activeUpsInfo ukazatel na data o aktivni UPS + * @param settingData ukazatel na zakladni data programu (barvy pozadi, mezikruzi, rucicky ... ,fonty atd ) + * @param analogRecords ukazatel na tridu ktera pracuje s daty o upsekach + * + * @since 0.2 + **/ + KNutPanelMeter(QPalette aPanelPalette, KNutVarData::upsInfoDef* activeUpsInfo, KNutVarData::SettingDataDef* settingData, KNutVarData* analogRecords, QWidget *parent=0, const char *name=0); + +/** + * Destruktor + * + * @since 0.1 + **/ + ~KNutPanelMeter(); + +/** + * Zrusi analogove panely vcetne uvoneni pameti. + * + * @since 0.1 + **/ + void deActivateAnalogs (void); + + +/** + * Vytvori a inicializuje analogove panely. + * + * @since 0.1 + **/ + void activateAnalogs (void); + +/** + * Rozmisti analogove panely po hlavnim panelu a spocte jeho rozmery. + * + * @param showPanels je true jsou rozsviceny (show) subpanely + * @since 0.2 + **/ + void setSize (bool showPanels = false); + + +/** + * Prekresli zmenu rozsahu pro dany analogovy panel (jenom jeden) + * Pokud panel nepodporuje zmeny rozsahu neprovede nic. + * Zmenu rozsahu podporuji nasledujici panely: Current,BattVolt,BattCurrent + * + * @param panelNumber je cislo analogoveho panelu. + * @param value je hodnota na kterou je panel nastaven. + * + * @since 0.1 + **/ + void repaintScaleAnalogPanel (int panelNumber, float value); + +/** + * Paints pointer for selected analog panel + * Prekresli rucicku pro vybrany analogovy panel. + * + * @param panelNumber is number of analog panel. + * @param value is value of settimg amalog panel. + * @param run = TRUE makes immediately repaint of panel + * @param panelNumber je cislo analogoveho panelu. + * @param value je hodnota na kterou je panel nastaven. + * @param run = TRUE provede okamzite prekresleni + * + * @since 0.2 + **/ + void repaintAnalogPointer (int panelNumber, float value, bool run = true); + + +/** + * Repaints analog panels + * Repainting range of panel for frequency and voltage, based on current setting. + * Prekresli a prebarvi analogove panely. + * Prekresuje rozsah panelu pro frekvenci a nepeti na zaklade soucasneho nastaveni. + * + * @param repaintFrequencyPanels urcuje ze ma prekreslit panely ktere zobrazuji vstupni frequency. + * @param repaintVoltagePanels urcuje ze ma prekreslit panely ktere zobrazuji vstupni a vystupni napeti. + * @param repaintAllPanels urcuje ze ma prebarvit vsechny prvky panelu. + * + * @since 0.1 + **/ + void repaintAnalogPanels (bool repaintFrequencyPanels, bool repaintVoltagePanels, bool repaintAllPanels); + + + + + + +/** + * Changes type of digital processing of pointer and repaints it. + * Zmeni zpusob digitalniho zpracovani rucucky a prekresli ji + * + * @since 0.1 + **/ + void changeAnalogPanelsDigProcessing (void); + + +/** + * Sets value of panels to zero + * Nastavi hodnotu vsech panelu na nulu + * + * @since 0.1 + **/ + void zeroingPanels (void); + +/** + * Repaints backgroud of analog panels + * Prebarvi pozadi analogovych panelu. + * + * @param taPanelPalette je hodnota nove palety pro pozadi + * + * @since 0.1 + **/ + void setAnalogBG(QPalette aPanelPalette); + + + +/** + * Vraci soucasnou velikost panelu. + * + * @since 0.1 + **/ + virtual QSize sizeHint (void); + +public slots: + + /** + * Sets new font for all panels + * Nastavy novy font ve vsech panelech. + * + * @since 0.1 + **/ + void slotSetPanelsFont(QFont newFont); + + +private: +/************ private const *****************/ + + static const int SpacePanels = 2; //vzdalenost mezi meraky, length between panels + + static const int MaxBattVolt = 350; // max battery.voltage + static const int MaxCurrent = 50; // max output.current + static const int MaxBattCurrent = 50; // max battery.current +/************ private struct ************************/ + + struct analogPanelRecordsDef { + int scaleEnd[knc::NumberOfVars]; + int scaleStart[knc::NumberOfVars]; + KNutAnalog* upsAnalogs[knc::NumberOfVars]; + }; + + +/*********** private vars *******************/ + + QLabel* m_analogArea; + + analogPanelRecordsDef* m_analogPanels; + + KNutVarData::upsInfoDef* m_activeUpsInfo; // values for selected ups -- hodnoty pro vybrane ups + KNutVarData::SettingDataDef* m_settingData; // v teto strukture jsou ulozeny promene ktere nastavuji konfiguraci + + KNutVarData* m_analogRecords; + + QPalette m_aPanelPalette; + + int m_widthArea; + int m_heightArea; +}; + +#endif diff --git a/src/knutprefdlg.cpp b/src/knutprefdlg.cpp new file mode 100644 index 0000000..68ce4ce --- /dev/null +++ b/src/knutprefdlg.cpp @@ -0,0 +1,979 @@ +/*************************************************************************** + knutprefdlg.cpp - description + ------------------- + begin : Tue Aug 21 2001 + copyright : (C) 2001 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "knutprefdlg.h" +#include "knutvardata.h" +#include "knutfrontpanel.h" +#include "knutdock.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +#include +//#include + +#define MAIN_PANEL_FONT 0 +#define ANALOG_PANEL_FONT 1 + + + +KNutPrefDlg::KNutPrefDlg(KNutUpsData* const upsData, KNutVarData* const analogData, KNutVarData::SettingDataDef* const settingData, + const QString upsName, QWidget* parent, const char* name, const bool modal) + :KDialogBase(IconList, i18n("Preferences"),Help|Default|Apply|Ok|Cancel,Ok, parent, name, modal, true), + m_activeUpsName (upsName), m_myUpsData(upsData), m_myAnalogData(analogData), m_settingData(settingData) { + + setName( "UpsMemberDlg" ); + + m_checked = false; // no change of definition of UPS // neni zadna zmena na definici UPS + m_checkedActiveUps = false; // change of active UPS hasn't been made // neni provedena zmena aktivni UPS + + initSetting(); + initUps(); + initPanel(); + initFonts(); + initAnalog(); + initDock(); // from 0.8 version + setMinimumSize (450, 300); + } + + +KNutPrefDlg::~KNutPrefDlg(){ + delete m_listBox2; + } + + + + +/*********************************************************************************************/ +/* */ +/* PRIVATE SLOTS */ +/* */ +/*********************************************************************************************/ + + +void KNutPrefDlg::slotSetPictureKI (bool on) { +if (!on) { + m_checkBoxCbi->setEnabled(true); + m_iconDockLabel->setEnabled(true); + m_BGIButton->setEnabled(m_checkBoxCbi->isChecked()); + m_dockBackgroundColorLabel->setEnabled(m_checkBoxCbi->isChecked()); + + } +else { + m_checkBoxCbi->setEnabled(false); + m_iconDockLabel->setEnabled(false); + m_BGIButton->setEnabled(false); + m_dockBackgroundColorLabel->setEnabled(false); + + } + +} + +void KNutPrefDlg::slotEnableVoltage(bool enable) { m_voltageGroup->setEnabled(!enable);} + +void KNutPrefDlg::slotEnableFrequency(bool enable) { m_frequencyGroup->setEnabled(!enable);} + +void KNutPrefDlg::slotUseCustomBColor(bool enable) { + m_BGButton->setEnabled(enable); + m_mainBackgroundColorLabel->setEnabled(enable); + } + +void KNutPrefDlg::slotUseCustomBIconColor(bool enable) { + m_BGIButton->setEnabled(enable); + m_dockBackgroundColorLabel->setEnabled(enable); + } + + +void KNutPrefDlg::slotUseCustomBPanelColor(bool enable) { + m_BGPButton->setEnabled(enable); + m_panelBackgroundColorLabel->setEnabled(enable); + } + +void KNutPrefDlg::slotUseCustomBAnalogColor(bool enable) { + m_BGAButton->setEnabled(enable); + m_analogBackgroundColorLabel->setEnabled(enable); + } + +void KNutPrefDlg::slotUseCustomOAnalogColor(bool enable) { + m_AFingerButton->setEnabled(enable); + m_AOKButton->setEnabled(enable); + m_AWarnningButton->setEnabled(enable); + m_AErrorButton->setEnabled(enable); + m_AScaleButton->setEnabled(enable); + m_AFontButton->setEnabled(enable); + m_analogPointerColorLabel->setEnabled(enable); + m_analogOKColorLabel->setEnabled(enable); + m_analogWarningColorLabel->setEnabled(enable); + m_analogErrorColorLabel->setEnabled(enable); + m_analogScaleColorLabel->setEnabled(enable); + m_analogFontColorLabel->setEnabled(enable); + } + + + +void KNutPrefDlg::slotChangeSettingFont(int index) { + if (m_settingFont != index) { + // vybirame jiny font + if (m_settingFont == MAIN_PANEL_FONT) { + m_mPanelFont=m_fontWidget->font(); + m_fontWidget->setFont(m_aPanelFont); + } + else { + m_aPanelFont=m_fontWidget->font(); + m_fontWidget->setFont(m_mPanelFont); + } + m_settingFont = index; + } +} + + + +void KNutPrefDlg::slotDeleteUps() { + if (m_listBox2->currentItem() != -1) { + // smazeme policko + int ukListBox = m_listBox2->currentItem(); + if ( m_activeUpsName == m_listBox2->currentText() ) m_checkedActiveUps = true; + m_myUpsData->deleteName(ukListBox); + m_listBox2->removeItem(ukListBox); + m_checked = true; + // when active ups is deleted, will set checkedActiveUps + // pokud smazeme aktivni UPS nastavime checkedActiveUps + } + } + + +void KNutPrefDlg::slotEditUps() { + if (m_listBox2->currentItem() != -1) { + KNutUpsData::upsRecordDef upsRecord; + // makes dialog + newUpsDlg = new KNutNewUpsDlg(m_myUpsData,m_myAnalogData,false); + // reads record + m_myUpsData->get(m_listBox2->currentItem(),upsRecord); + // sets parameters for edit / nastavime parametry pro edit + newUpsDlg->putData(upsRecord); + int result = newUpsDlg->exec(); + if (result == Accepted) { + // adds into list after OK will be clicked + // reads data from form + upsRecord = newUpsDlg->getData(); + // corrects data in list + m_myUpsData->put(m_listBox2->currentItem(),upsRecord); + // corrects data in window + m_listBox2->changeItem(upsRecord.name,m_listBox2->currentItem()); + m_checked = true; + // if active UPS is changed, will set checkedActiveUps + // pokud zmenime aktivni UPS nastavime checkedActiveUps + if ( m_activeUpsName == m_listBox2->currentText() ) m_checkedActiveUps = true; + } + delete newUpsDlg; + } + } + + +void KNutPrefDlg::slotNewUps () { + KNutUpsData::upsRecordDef upsRecord; + // Zalozime novou UPS + // add new UPS + newUpsDlg = new KNutNewUpsDlg(m_myUpsData,m_myAnalogData); + int result = newUpsDlg->exec(); + if (result == Accepted) { + // adds into list, when OK is pressed + //reads data from form + upsRecord = newUpsDlg->getData(); + //pridame data do zaznamu + //adds data to record + m_myUpsData->add(upsRecord); + //add data to window + // pridame data do okenka + m_listBox2->insertItem(upsRecord.name); + // pokud pridame prvni prekreslime hlavni okno + // when adds the first sameone, will repaint window + m_checked = true; + if (m_myUpsData->getCount() ==1 ) m_checkedActiveUps = true; + } + delete newUpsDlg; + } + + +void KNutPrefDlg::slotOk() { + slotApply (); + accept(); + } + +void KNutPrefDlg::slotApply() { +// budeme emitovat signal podle toho co se deje +// will emit signal about situation + unsigned int changeSetting = 0; + + // MainPage + if (m_settingData->countCols != m_numberOfColumns->value()) { + changeSetting += ChangeCountCols; // nastavime pocet sloupcu + m_settingData->countCols = m_numberOfColumns->value(); // nastavime pocet sloupcu + } + + if (m_settingData->customBColor != m_checkBoxCbc->isChecked()) { + m_settingData->customBColor = m_checkBoxCbc->isChecked(); + changeSetting += ChangeCustomBColor; + } + + if (m_settingData->mainBackgroundColor != m_BGButton->color()) { + changeSetting += ChangeMBColor; + m_settingData->mainBackgroundColor = m_BGButton->color(); // nastavime barvu pozadi + } + + // ovlivnuje jen ukonceni programu, neurcujeme type ChangeSetting + if (m_settingData->areYouSure != m_checkBoxAys->isChecked()) { + m_settingData->areYouSure = m_checkBoxAys->isChecked(); + changeSetting = changeSetting | ChangeSomeThing; + } + + //for next start only + if (m_comboBoxMainWindow->currentItem() != (int)m_settingData->useMainWindow) { + m_settingData->useMainWindow = (KNutVarData::mainWindowStartVariant)m_comboBoxMainWindow->currentItem(); + changeSetting = changeSetting | ChangeSomeThing; + } + +// if (m_prefData->useMainWindow != m_checkBoxMW->isChecked()) { +// m_prefData->useMainWindow = m_checkBoxMW->isChecked(); +// changeSetting = changeSetting | ChangeSomeThing; +// } + //for next start only + if (m_settingData->useMessageWindow != m_checkBoxMesW->isChecked()) { + m_settingData->useMessageWindow = m_checkBoxMesW->isChecked(); + changeSetting = changeSetting | ChangeSomeThing; + } + + //for next start only + if (m_settingData->useMessageWindow != m_checkBoxMesW->isChecked()) { + m_settingData->useMessageWindow = m_checkBoxMesW->isChecked(); + changeSetting = changeSetting | ChangeSomeThing; + } + + + int newInputVoltage, newInputFrequency; + if ( m_vRadioButton1->isChecked()) newInputVoltage = 230; else newInputVoltage = 120; + if ( m_fRadioButton1->isChecked()) newInputFrequency = 50; else newInputFrequency = 60; + + if (m_settingData->inputVoltage != newInputVoltage) { + m_settingData->inputVoltage = newInputVoltage; + changeSetting += ChangeVoltage; + } + + if (m_settingData->inputFrequency != newInputFrequency) { + m_settingData->inputFrequency = newInputFrequency; + changeSetting += ChangeFrequency; + } + + if (m_settingData->lowHighXfer != m_xfer->isChecked()) changeSetting += ChangeXFer; + m_settingData->lowHighXfer = m_xfer->isChecked(); + + //Ups page + if ( m_checkedActiveUps ) { // zmena aktivni UPS + //change of active UPS or add the first UPS, because the first UPS is active always + changeSetting += ChangeUpsSetting; + } + else { + if (m_checked) changeSetting += ChangeUpsCount; + } + // panel Page + unsigned int prefPanelFlags = 3; + if (m_checkBoxOver->isChecked()) prefPanelFlags += KNutFrontPanel::PBOver; + if (m_checkBoxBL->isChecked()) prefPanelFlags += KNutFrontPanel::PBBattLow; + if (m_checkBoxRB->isChecked()) prefPanelFlags += KNutFrontPanel::PBRepBatt; + if (m_checkBoxCal->isChecked()) prefPanelFlags += KNutFrontPanel::PBCal; + if (m_checkBoxMFRM->isChecked()) prefPanelFlags += KNutFrontPanel::PBMFRMod; + if (m_checkBoxMFR->isChecked()) prefPanelFlags += KNutFrontPanel::PBMFR; + if (m_checkBoxModel->isChecked()) prefPanelFlags += KNutFrontPanel::PBModel; + if (m_checkBoxSerial->isChecked()) prefPanelFlags += KNutFrontPanel::PBSerial; + if (m_checkBoxFirm->isChecked()) prefPanelFlags += KNutFrontPanel::PBFirm; + if (m_checkBoxRun->isChecked()) prefPanelFlags += KNutFrontPanel::PBRun; + + if (m_settingData->panelFlags != prefPanelFlags) { + m_settingData->panelFlags = prefPanelFlags; + changeSetting += ChangeMainPanelSetting; + } + + if (m_settingData->customBPanelColor != m_checkBoxCbpc->isChecked()) { + m_settingData->customBPanelColor = m_checkBoxCbpc->isChecked(); + changeSetting += ChangeCustomMPanelBColor; + } + + if (m_settingData->mPanelBackgroundColor != m_BGPButton->color()) { + changeSetting += ChangeMPBColor; + m_settingData->mPanelBackgroundColor = m_BGPButton->color(); // sets color of background + } + + + // font Page: + unsigned int changeFonts; + changeFonts =0; + + if (m_settingFont == MAIN_PANEL_FONT) + m_mPanelFont=m_fontWidget->font(); + else + m_aPanelFont=m_fontWidget->font(); + + if ( m_customFont->isChecked() != m_settingData->customFont) { + // zmena typy fontu systemove <-> uzivatelske + m_settingData->customFont = m_customFont->isChecked(); + if (m_settingData->customFont) { + // prejdeme na uzivatelske fonty + m_settingData->aPanelFont = m_aPanelFont; + m_settingData->mPanelFont = m_mPanelFont; + changeSetting += ChangeAnalogFont; + changeSetting += ChangePanelFont; + } + else { + // pouzijeme systemove fonty + changeSetting += ChangeAnalogFont; + changeSetting += ChangePanelFont; + } + } + else { + if ( m_settingData->customFont ) { + // otestujeme zda se zmenili nase fonty + if (m_aPanelFont != m_settingData->aPanelFont) { + m_settingData->aPanelFont = m_aPanelFont; + changeSetting += ChangeAnalogFont; + } + if (m_mPanelFont != m_settingData->mPanelFont) { + m_settingData->mPanelFont = m_mPanelFont; + changeSetting += ChangePanelFont; + } + } + } + // analog page + + if (m_settingData->customBAnalogColor != m_checkBoxCbac->isChecked()) { + m_settingData->customBAnalogColor = m_checkBoxCbac->isChecked(); + changeSetting += ChangeCustomAPanelBColor; + } + + if (m_settingData->aPanelBackgroundColor != m_BGAButton->color()) { + changeSetting += ChangeAPBColor; + m_settingData->aPanelBackgroundColor = m_BGAButton->color(); // nastavime barvu pozadi + } + + if (m_settingData->customOAnalogColor != m_checkBoxCoac->isChecked()) { + m_settingData->customOAnalogColor = m_checkBoxCoac->isChecked(); + changeSetting += ChangeCustomAPanelOColor; + } + + if ((m_settingData->analogFingerColor != m_AFingerButton->color()) || + (m_settingData->analogOKColor != m_AOKButton->color()) || + (m_settingData->analogWarnningColor != m_AWarnningButton->color()) || + (m_settingData->analogErrorColor != m_AErrorButton->color()) || + (m_settingData->analogScaleColor != m_AScaleButton->color()) || + (m_settingData->analogFontColor != m_AFontButton->color())) { + changeSetting += ChangeAPOColor; + m_settingData->analogFingerColor = m_AFingerButton->color(); // sets color of pointers-- nastavime barvu rucicky + m_settingData->analogOKColor = m_AOKButton->color(); // sets color of OK -- nastavime barvu ok + m_settingData->analogWarnningColor = m_AWarnningButton->color(); // nastavime barvu varovano + m_settingData->analogErrorColor = m_AErrorButton->color(); // nastavime barvu chyby + m_settingData->analogScaleColor = m_AScaleButton->color(); // nastavime barvu stupnice + m_settingData->analogFontColor = m_AFontButton->color(); // nastavime barvu textu + } + + if (m_settingData->typeDigitalProcessing != m_digitalProcesingOfPointers->currentItem()) { + m_settingData->typeDigitalProcessing = m_digitalProcesingOfPointers->currentItem(); + changeSetting += ChangeTypeOfDigProcessing; + } + + // Kicker Icon page + + int stateKIcon; + if (m_iconRadioButton1->isChecked()) stateKIcon = KNutDock::pictureKI; + else stateKIcon = KNutDock::generalKI; + if (m_settingData->typeOfKIcon != stateKIcon) { + if (m_iconRadioButton1->isChecked()) m_settingData->typeOfKIcon = KNutDock::pictureKI; + if (m_iconRadioButton2->isChecked()) m_settingData->typeOfKIcon = KNutDock::generalKI; + changeSetting += ChangeTypeOfKIcon; + } + + if (m_settingData->customKIconColor != m_checkBoxCbi->isChecked()) { + m_settingData->customKIconColor = m_checkBoxCbi->isChecked(); + changeSetting += ChangeCustomKIconColor; + } + + if (m_settingData->kIconBackgroundColor != m_BGIButton->color()) { + changeSetting += ChangeKIconBColor; + m_settingData->kIconBackgroundColor = m_BGIButton->color(); // nastavime barvu pozadi + } + + unsigned int prefToolTipFlags = 0; + if (m_checkBoxTTMFR->isChecked()) prefToolTipFlags += KNutDock::TTMFR; + if (m_checkBoxTTModel->isChecked()) prefToolTipFlags += KNutDock::TTModel; + if (m_checkBoxTTSerial->isChecked()) prefToolTipFlags += KNutDock::TTSerial; + if (m_checkBoxTTFirm->isChecked()) prefToolTipFlags += KNutDock::TTFirm; + if (m_checkBoxTTRun->isChecked()) prefToolTipFlags += KNutDock::TTRun; + if (m_checkBoxTTCharge->isChecked()) prefToolTipFlags += KNutDock::TTCharge; + if (m_checkBoxTTLoad->isChecked()) prefToolTipFlags += KNutDock::TTLoad; + + if (m_settingData->toolTipFlags != prefToolTipFlags) { + m_settingData->toolTipFlags = prefToolTipFlags; + changeSetting += ChangeToolTip; + } + + if (changeSetting) emit signalChangeConfig( changeSetting ); + } + + +void KNutPrefDlg::slotDefault() { + switch (activePageIndex()) { + case mainSettingPage: + m_numberOfColumns->setValue( knc::DefaultCountCols ); + m_BGButton->setColor(DEFAULT_BG_COLOR); + m_checkBoxAys->setChecked ( false ); + m_checkBoxMesW->setChecked ( false ); + m_comboBoxMainWindow->setCurrentItem(KNutVarData::mw_no); // sets NO + m_vRadioButton1->setChecked( true ); + m_fRadioButton1->setChecked( true ); + m_xfer->setChecked( false ); + break; + case panelSettingPage: + m_checkBoxOver->setChecked(KNutFrontPanel::DefaultPanelFlags & KNutFrontPanel::PBOver); + m_checkBoxBL->setChecked(KNutFrontPanel::DefaultPanelFlags & KNutFrontPanel::PBBattLow); + m_checkBoxRB->setChecked(KNutFrontPanel::DefaultPanelFlags & KNutFrontPanel::PBRepBatt); + m_checkBoxCal->setChecked(KNutFrontPanel::DefaultPanelFlags & KNutFrontPanel::PBCal); + m_checkBoxMFRM->setChecked(KNutFrontPanel::DefaultPanelFlags & KNutFrontPanel::PBMFRMod); + m_checkBoxMFR->setChecked(KNutFrontPanel::DefaultPanelFlags & KNutFrontPanel::PBMFR); + m_checkBoxModel->setChecked(KNutFrontPanel::DefaultPanelFlags & KNutFrontPanel::PBModel); + m_checkBoxSerial->setChecked(KNutFrontPanel::DefaultPanelFlags & KNutFrontPanel::PBSerial); + m_checkBoxFirm->setChecked(KNutFrontPanel::DefaultPanelFlags & KNutFrontPanel::PBFirm); + m_checkBoxCbpc->setChecked(false); + m_BGAButton->setColor(DEFAULT_BG_COLOR); + break; + case fontSettingPage: + m_customFont->setChecked(false); + break; + case analogSettingPage: + m_checkBoxCbac->setChecked(false); + m_BGAButton->setColor(DEFAULT_BG_COLOR); + m_checkBoxCoac->setChecked(false); + m_AFingerButton->setColor(DEFAULT_FINGER_COLOR); + m_AOKButton->setColor(DEFAULT_OK_COLOR); + m_AWarnningButton->setColor(DEFAULT_WARNNING_COLOR); + m_AErrorButton->setColor(DEFAULT_ERROR_COLOR); + m_AScaleButton->setColor(DEFAULT_SCALE_COLOR); + m_AFontButton->setColor(DEFAULT_FONT_COLOR); + break; + case kickerSettingPage: + m_checkBoxCbi->setChecked(false); + m_BGAButton->setColor(DEFAULT_KICON_COLOR); + m_checkBoxTTMFR->setChecked(KNutDock::DefaultToolTipFlags & KNutDock::TTMFR); + m_checkBoxTTModel->setChecked(KNutDock::DefaultToolTipFlags & KNutDock::TTModel); + m_checkBoxTTSerial->setChecked(KNutDock::DefaultToolTipFlags & KNutDock::TTSerial); + m_checkBoxTTFirm->setChecked(KNutDock::DefaultToolTipFlags & KNutDock::TTFirm); + m_checkBoxTTRun->setChecked(KNutDock::DefaultToolTipFlags & KNutDock::TTRun); + m_checkBoxTTCharge->setChecked(KNutDock::DefaultToolTipFlags & KNutDock::TTCharge); + m_checkBoxTTLoad->setChecked(KNutDock::DefaultToolTipFlags & KNutDock::TTLoad); + m_iconRadioButton1->setChecked( true ); + break; + } + } + +/*********************************************************************************************/ +/* */ +/* PRIVATE FUNCTIONS */ +/* */ +/*********************************************************************************************/ + +void KNutPrefDlg::initSetting () { + m_mSetPix = UserIcon ("knc_mset"); + + + QFrame *page = addPage( i18n("Setting"),i18n("Main Setting"),m_mSetPix); + QVBoxLayout *setTopLayout = new QVBoxLayout( page, 10, spacingHint (), "setTopLayout" ); + + QGroupBox *dataBox = new QGroupBox (page ,"dataBox"); + QGridLayout *dataLayout = new QGridLayout (dataBox,5,2,spacingHint()); + dataBox->setFrameStyle(QFrame::NoFrame); + setTopLayout->addWidget(dataBox); + + QButtonGroup *VFGroup = new QButtonGroup(i18n("Voltage/Frequency"),page,"VFGroup"); + QGridLayout *setVoltFreqLayout = new QGridLayout (VFGroup, 4 , 2,spacingHint () ); + + m_xfer = new QCheckBox (i18n("&Use High-Low XFER"),VFGroup,"m_xfer"); + + QLabel *initSettingLabel1 = new QLabel(i18n("Number of columns :"),dataBox,"label1"); + m_numberOfColumns = new QSpinBox(knc::MinCols,knc::MaxCols,1,dataBox); + + QLabel *initSettingLabel2 = new QLabel(i18n("Use custom background color"),dataBox,"label2"); + m_checkBoxCbc = new QCheckBox ("",dataBox,"checboxcbc"); + + + m_mainBackgroundColorLabel = new QLabel(i18n("Color of background :"),dataBox,"label3"); + m_BGButton = new KColorButton (dataBox); + m_BGButton->setColor (m_settingData->mainBackgroundColor); + + QLabel *initSettingLabel4 = new QLabel(i18n("Use dialog \"Are you sure\""),dataBox,"m_areYouSureLabel"); + m_checkBoxAys = new QCheckBox ("",dataBox,"checboxays"); + + QLabel *initSettingLabel5 = new QLabel(i18n("Use Main window when program is started"),dataBox,"initSettingLabel5"); +// m_checkBoxMW = new QCheckBox ("",dataBox,"checboxmv"); + + QLabel *initSettingLabel6 = new QLabel(i18n("Show message window, when program reports error"),dataBox,"initSettingLabel6"); + m_checkBoxMesW = new QCheckBox ("",dataBox,"checboxer"); + m_comboBoxMainWindow = new KComboBox (dataBox); + m_comboBoxMainWindow->insertItem (i18n("Yes")); + m_comboBoxMainWindow->insertItem (i18n("No")); + m_comboBoxMainWindow->insertItem (i18n("Auto")); + + + + m_voltageGroup = new QButtonGroup(i18n("Nominal Input Voltage"),VFGroup,"voltageGroup"); + QGridLayout *voltLayout = new QGridLayout (m_voltageGroup, 3 , 1,spacingHint () ); + + m_vRadioButton1 = new QRadioButton(i18n("&230 V"), m_voltageGroup, "vRadioButton1" ); + m_vRadioButton2 = new QRadioButton(i18n("&120 V"), m_voltageGroup, "vRadioButton2" ); + + m_frequencyGroup = new QButtonGroup(i18n("Nominal Input Frequency"),VFGroup,"frequencyGroup"); + QGridLayout *freqLayout = new QGridLayout (m_frequencyGroup, 3 , 1,spacingHint () ); + + m_fRadioButton1 = new QRadioButton(i18n("&50 Hz"), m_frequencyGroup, "fRadioButton1" ); + m_fRadioButton2 = new QRadioButton(i18n("&60 Hz"), m_frequencyGroup, "fRadioButton2" ); + + dataLayout->addWidget (initSettingLabel1,0,0); + dataLayout->addWidget (m_numberOfColumns,0,1); + + dataLayout->addWidget (initSettingLabel2,1,0); + dataLayout->addWidget (m_checkBoxCbc,1,1); + + dataLayout->addWidget (m_mainBackgroundColorLabel,2,0); + dataLayout->addWidget (m_BGButton,2,1); + + dataLayout->addWidget (initSettingLabel4,3,0); + dataLayout->addWidget (m_checkBoxAys,3,1); + + dataLayout->addWidget (initSettingLabel5,4,0); + dataLayout->addWidget (m_comboBoxMainWindow,4,1); + + dataLayout->addWidget (initSettingLabel6,5,0); + dataLayout->addWidget (m_checkBoxMesW,5,1); + + dataLayout->setColStretch(1,5); + + voltLayout->addRowSpacing (0 ,fontMetrics().lineSpacing() ); + voltLayout->addWidget ( m_vRadioButton1,1,0 ); + voltLayout->addWidget ( m_vRadioButton2,2,0 ); + + freqLayout->addRowSpacing (0 ,fontMetrics().lineSpacing() ); + freqLayout->addWidget ( m_fRadioButton1,1,0 ); + freqLayout->addWidget ( m_fRadioButton2,2,0 ); + + setTopLayout->addWidget (VFGroup,10); + setVoltFreqLayout->addRowSpacing (0 ,fontMetrics().lineSpacing() ); + setVoltFreqLayout->addWidget ( m_voltageGroup,1,0 ); + setVoltFreqLayout->addWidget ( m_frequencyGroup,1,1 ); + setVoltFreqLayout->addWidget ( m_xfer,2,0 ); + setVoltFreqLayout->addRowSpacing (3 ,fontMetrics().lineSpacing() ); + + setTopLayout->addStretch( 20 ); + + //sets value + m_numberOfColumns->setValue(m_settingData->countCols); + m_BGButton->setColor(m_settingData->mainBackgroundColor); // sets color of backgound + m_checkBoxAys->setChecked(m_settingData->areYouSure); + m_checkBoxMesW->setChecked(m_settingData->useMessageWindow); + m_comboBoxMainWindow->setCurrentItem(m_settingData->useMainWindow); + + if (m_settingData->inputVoltage == 230) + m_vRadioButton1->setChecked( true ); + else + m_vRadioButton2->setChecked( true ); + if (m_settingData->inputFrequency == 50) + m_fRadioButton1->setChecked( true ); + else + m_fRadioButton2->setChecked( true ); + + m_xfer->setChecked(m_settingData->lowHighXfer); + m_voltageGroup->setEnabled(!m_settingData->lowHighXfer); + m_frequencyGroup->setEnabled(!m_settingData->lowHighXfer); + connect (m_xfer,SIGNAL(toggled(bool)),this,SLOT(slotEnableVoltage(bool))); + connect (m_xfer,SIGNAL(toggled(bool)),this,SLOT(slotEnableFrequency(bool))); + + + m_checkBoxCbc->setChecked(m_settingData->customBColor); + m_BGButton->setColor(m_settingData->mainBackgroundColor); + m_BGButton->setEnabled(m_settingData->customBColor); + m_mainBackgroundColorLabel->setEnabled(m_settingData->customBColor); + connect (m_checkBoxCbc,SIGNAL(toggled(bool)),this,SLOT(slotUseCustomBColor(bool))); + } + +void KNutPrefDlg::initUps () { + m_upsesPix = UserIcon ("knc_upses"); + QFrame *page = addPage( i18n("UPS"),i18n("UPS Setting"),m_upsesPix); + QHBoxLayout *upsTopLayout = new QHBoxLayout( page, 0, spacingHint (),"upsTopLayout" ); + + // makes box for names of UPS's / Vytvorime box pro jmena UPS-ek + m_listBox2 = new KListBox( page, "ListBox2" ); + m_listBox2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)5, m_listBox2->sizePolicy().hasHeightForWidth() ) ); + m_listBox2->setFrameShape( QListBox::StyledPanel ); + m_listBox2->setFrameShadow( QListBox::Sunken ); + m_listBox2->setMinimumSize (100,100); + + // sets listbox + for (int i=0; i < m_myUpsData->getCount (); i++) m_listBox2->insertItem (m_myUpsData->getName(i)); + //includes listbox into horizontal layout on the first place + upsTopLayout->addWidget( m_listBox2, 20 ); + // makes vertical layout and includes it in horizontal layout into the second place + QVBoxLayout *upsLayout = new QVBoxLayout( upsTopLayout, spacingHint (),"upsLayout" ); + + // vytvorime tlacitka + KPushButton *newButton = new KPushButton (i18n("&Add"),page); + KPushButton *editButton = new KPushButton (i18n("&Edit"),page); + KPushButton *deleteButton = new KPushButton (i18n("&Delete"),page); + + // includes buttons into layout / vlozime tlacitka do layoutu + upsLayout->addWidget( newButton ); + upsLayout->addWidget( editButton ); + upsLayout->addWidget( deleteButton ); + + upsLayout->addStretch( 10 ); + + connect (newButton,SIGNAL(clicked()),this,SLOT(slotNewUps())); + connect (editButton,SIGNAL(clicked()),this,SLOT(slotEditUps())); + connect (deleteButton,SIGNAL(clicked()),this,SLOT(slotDeleteUps())); + connect (m_listBox2,SIGNAL(doubleClicked(QListBoxItem*, const QPoint&)),this,SLOT(slotEditUps())); + + } + +void KNutPrefDlg::initDock () { + + m_dockPix = UserIcon ("knc_dock"); + QFrame *page = addPage( i18n("Dock bar"),i18n("Docking Setting"),m_dockPix); + + QVBoxLayout *setTopLayout = new QVBoxLayout( page, 10, spacingHint (), "setTopLayout" ); + + QButtonGroup *typeGroup = new QButtonGroup(i18n("Type of dock's showing"),page,"typeGroup"); + QGridLayout *typeLayout = new QGridLayout (typeGroup,2,2,spacingHint()); + setTopLayout->addWidget(typeGroup); + + + QGroupBox *infoBox = new QGroupBox (i18n("Items of tooltip"),page ,"infoBox"); + QGridLayout *infoLayout = new QGridLayout (infoBox,8,1,spacingHint()); + setTopLayout->addWidget(infoBox); + + QGridLayout *colorLayout = new QGridLayout (10,1,spacingHint(),"colorLayout"); + setTopLayout->addLayout(colorLayout); + + + m_iconRadioButton1 = new QRadioButton(i18n("&Picture"), typeGroup, "iconRadioButton1" ); + m_iconRadioButton2 = new QRadioButton(i18n("&General"), typeGroup, "iconRadioButton2" ); + + + m_checkBoxTTMFR = new QCheckBox (i18n("M&anufacturer"),infoBox); + m_checkBoxTTMFR->setChecked((m_settingData->toolTipFlags) & KNutDock::TTMFR); + + m_checkBoxTTModel = new QCheckBox (i18n("M&odel"),infoBox); + m_checkBoxTTModel->setChecked((m_settingData->toolTipFlags) & KNutDock::TTModel); + + m_checkBoxTTSerial = new QCheckBox (i18n("&Serial"),infoBox); + m_checkBoxTTSerial->setChecked((m_settingData->toolTipFlags) & KNutDock::TTSerial); + + m_checkBoxTTFirm = new QCheckBox (i18n("&Firm. rev."),infoBox); + m_checkBoxTTFirm->setChecked((m_settingData->toolTipFlags) & KNutDock::TTFirm); + + m_checkBoxTTRun = new QCheckBox (i18n("&Runtime"),infoBox); + m_checkBoxTTRun->setChecked((m_settingData->toolTipFlags) & KNutDock::TTRun); + + m_checkBoxTTCharge = new QCheckBox (i18n("&Battery Charge"),infoBox); + m_checkBoxTTCharge->setChecked((m_settingData->toolTipFlags) & KNutDock::TTCharge); + + m_checkBoxTTLoad = new QCheckBox (i18n("&UPS Load"),infoBox); + m_checkBoxTTLoad->setChecked((m_settingData->toolTipFlags) & KNutDock::TTLoad); + + + m_iconDockLabel = new QLabel(i18n("Use custom icon's background color"),page,"label1"); + m_checkBoxCbi = new QCheckBox ("",page,"checboxcbpc"); + + m_dockBackgroundColorLabel = new QLabel(i18n("Color of icon's background :"),page,"label12"); + m_BGIButton = new KColorButton (page); + + typeLayout->addRowSpacing (0 ,fontMetrics().lineSpacing() ); + typeLayout->addWidget ( m_iconRadioButton1,1,0 ); + typeLayout->addWidget ( m_iconRadioButton2,2,0 ); + + if (m_settingData->typeOfKIcon == KNutDock::pictureKI) + m_iconRadioButton1->setChecked( true ); + if (m_settingData->typeOfKIcon == KNutDock::generalKI) + m_iconRadioButton2->setChecked( true ); + + infoLayout->addRowSpacing (0 ,fontMetrics().lineSpacing() ); + infoLayout->addWidget ( m_checkBoxTTMFR ,1,0); + infoLayout->addWidget ( m_checkBoxTTModel ,2,0); + infoLayout->addWidget ( m_checkBoxTTSerial ,3,0); + infoLayout->addWidget ( m_checkBoxTTFirm ,4,0); + infoLayout->addWidget ( m_checkBoxTTRun ,5,0); + infoLayout->addWidget ( m_checkBoxTTCharge ,6,0); + infoLayout->addWidget ( m_checkBoxTTLoad ,7,0); + + colorLayout->addWidget (m_iconDockLabel,0,0); + colorLayout->addWidget (m_checkBoxCbi,0,1); + colorLayout->addWidget (m_dockBackgroundColorLabel,1,0); + colorLayout->addWidget (m_BGIButton,1,1); + + m_checkBoxCbi->setChecked(m_settingData->customKIconColor); + m_BGIButton->setColor(m_settingData->kIconBackgroundColor); +// m_BGIButton->setEnabled(m_prefData->customKIconColor); +// m_dockBackgroundColorLabel->setEnabled(m_prefData->customKIconColor); + + if (m_iconRadioButton1->isChecked()) { + m_iconDockLabel->setEnabled(false); + m_checkBoxCbi->setEnabled(false); + m_BGIButton->setEnabled(false); + m_dockBackgroundColorLabel->setEnabled(false); + } + else { + m_iconDockLabel->setEnabled(true); + m_BGIButton->setEnabled(m_settingData->customKIconColor); + m_dockBackgroundColorLabel->setEnabled(m_settingData->customKIconColor); + } + + setTopLayout->addStretch( 20 ); + + connect (m_checkBoxCbi,SIGNAL(toggled(bool)),this,SLOT(slotUseCustomBIconColor(bool))); + connect (m_iconRadioButton1,SIGNAL(toggled(bool)),this,SLOT(slotSetPictureKI(bool))); + + } + + +void KNutPrefDlg::initPanel () { + + m_panelPix = UserIcon ("knc_panel"); + +// QFrame *page = addPage( i18n("Panel"),i18n("Panel Setting"),DesktopIcon("panel_settings")); + QFrame *page = addPage( i18n("Panel"),i18n("Panel Setting"),m_panelPix); + + QVBoxLayout *setTopLayout = new QVBoxLayout( page, 10, spacingHint (), "setTopLayout" ); + + + QGroupBox *infoBox = new QGroupBox (page ,"infoBox"); + QGridLayout *infoLayout = new QGridLayout (infoBox,10,1,spacingHint()); + setTopLayout->addWidget(infoBox); + + QGridLayout *colorLayout = new QGridLayout (10,1,spacingHint(),"colorLayout"); + setTopLayout->addLayout(colorLayout); + + + // vytvorime widgety - Nazev Zatrhavaci box + //makes widgets - name checkbox + m_checkBoxOver = new QCheckBox (i18n("UPS &Overload"),infoBox); + m_checkBoxOver->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBOver); + + m_checkBoxBL = new QCheckBox (i18n("UPS &Battery low"),infoBox); + m_checkBoxBL->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBBattLow); + + m_checkBoxRB = new QCheckBox (i18n("R&eplace battery"),infoBox); + m_checkBoxRB->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBRepBatt); + + m_checkBoxCal = new QCheckBox (i18n("Ups &calibration"),infoBox); + m_checkBoxCal->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBCal); + + m_checkBoxMFRM = new QCheckBox (i18n("&Manufac. + Model"),infoBox); + m_checkBoxMFRM->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBMFRMod); + + m_checkBoxMFR = new QCheckBox (i18n("M&anufacturer"),infoBox); + m_checkBoxMFR->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBMFR); + + m_checkBoxModel = new QCheckBox (i18n("M&odel"),infoBox); + m_checkBoxModel->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBModel); + + m_checkBoxSerial = new QCheckBox (i18n("&Serial"),infoBox); + m_checkBoxSerial->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBSerial); + + m_checkBoxFirm = new QCheckBox (i18n("&Firm. rev."),infoBox); + m_checkBoxFirm->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBFirm); + + m_checkBoxRun = new QCheckBox (i18n("&Runtime"),infoBox); + m_checkBoxRun->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBRun); + + + QLabel *initPanelLabel1 = new QLabel(i18n("Use custom background color"),page,"label1"); + m_checkBoxCbpc = new QCheckBox ("",page,"checboxcbpc"); + + m_panelBackgroundColorLabel = new QLabel(i18n("Color of background :"),page,"m_panelBackgroundColorLabel"); + m_BGPButton = new KColorButton (page); + + // includes widgets + infoLayout->addWidget ( m_checkBoxOver, 0,0); + infoLayout->addWidget ( m_checkBoxBL ,1,0); + infoLayout->addWidget ( m_checkBoxRB ,2,0); + infoLayout->addWidget ( m_checkBoxCal ,3,0); + infoLayout->addWidget ( m_checkBoxMFRM ,4,0); + infoLayout->addWidget ( m_checkBoxMFR ,5,0); + infoLayout->addWidget ( m_checkBoxModel ,6,0); + infoLayout->addWidget ( m_checkBoxSerial ,7,0); + infoLayout->addWidget ( m_checkBoxFirm ,8,0); + infoLayout->addWidget ( m_checkBoxRun ,9,0); + + colorLayout->addWidget (initPanelLabel1,0,0); + colorLayout->addWidget (m_checkBoxCbpc,0,1); + colorLayout->addWidget (m_panelBackgroundColorLabel,1,0); + colorLayout->addWidget (m_BGPButton,1,1); + + setTopLayout->addStretch( 20 ); + + m_checkBoxCbpc->setChecked(m_settingData->customBPanelColor); + m_BGPButton->setColor(m_settingData->mPanelBackgroundColor); + m_BGPButton->setEnabled(m_settingData->customBPanelColor); + m_panelBackgroundColorLabel->setEnabled(m_settingData->customBPanelColor); + m_panelBackgroundColorLabel->setEnabled(m_settingData->customBPanelColor); + connect (m_checkBoxCbpc,SIGNAL(toggled(bool)),this,SLOT(slotUseCustomBPanelColor(bool))); + + } + + +void KNutPrefDlg::initFonts () { + QFrame *page = addPage( i18n("Fonts"),i18n("Setting Fonts"),DesktopIcon("fonts")); + + QVBoxLayout *setTopLayout = new QVBoxLayout( page, 10, spacingHint (), "setTopLayout" ); + QHBoxLayout *setSysLayout = new QHBoxLayout( setTopLayout, spacingHint (), "setTypeLayout" ); + QHBoxLayout *setTypeLayout = new QHBoxLayout( setTopLayout, spacingHint (), "setTypeLayout" ); + QHBoxLayout *setFontLayout = new QHBoxLayout( setTopLayout, spacingHint (), "setFontLayout" ); + + m_customFont = new QCheckBox (i18n("&Use custom font"),page); + setSysLayout->addWidget ( m_customFont ,10); + setSysLayout->addStretch( 10 ); + + KComboBox *panelFonts = new KComboBox(page); + panelFonts->insertItem (i18n("Main panel")); + panelFonts->insertItem (i18n("Analog panels")); + setTypeLayout->addWidget ( panelFonts ,0); + + + + m_fontWidget = new KFontChooser(page,"Font",false); + setFontLayout->addWidget (m_fontWidget ,0); + + setTopLayout->addStretch( 20 ); + +// init items + m_customFont->setChecked(m_settingData->customFont); + m_aPanelFont = m_settingData->aPanelFont; + m_mPanelFont = m_settingData->mPanelFont; + m_settingFont = MAIN_PANEL_FONT; // sets font for Main Panel / nastavujeme font pro Main Panel + m_fontWidget->setFont(m_mPanelFont); + m_fontWidget->setEnabled(m_settingData->customFont); + connect (panelFonts,SIGNAL(activated(int)),this,SLOT(slotChangeSettingFont(int))); + connect (m_customFont,SIGNAL(toggled(bool)),m_fontWidget,SLOT(setEnabled(bool))); + } + +void KNutPrefDlg::initAnalog () { + m_analogPix = UserIcon ("knc_analog"); + QFrame *page = addPage( i18n("Analog"),i18n("Setting Analog panel"),m_analogPix); +// QFrame *page = addPage( i18n("Analog"),i18n("Setting Analog panel"),DesktopIcon("ksysguard")); + QVBoxLayout *setTopLayout = new QVBoxLayout( page, 10, spacingHint (), "setTopLayout" ); + QGridLayout *setColorLayout = new QGridLayout( 9,2, spacingHint(),"setColorLayout"); + setTopLayout->addLayout(setColorLayout); + setTopLayout->addStretch( 20 ); + + QLabel *initAnalogLabel1 = new QLabel(i18n("Use custom background color"),page,"initAnalogLabel1"); + m_checkBoxCbac = new QCheckBox ("",page,"checboxcbac"); + m_analogBackgroundColorLabel = new QLabel(i18n("Color of background :"),page,"m_backgroundColorLabel"); + m_BGAButton = new KColorButton (page); + QLabel *initAnalogLabel12 = new QLabel(i18n("Use custom other colors"),page,"label12"); + m_checkBoxCoac = new QCheckBox ("",page,"checboxcoac"); + m_analogPointerColorLabel = new QLabel(i18n("Color of pointer :"),page,"m_analogPointerColorLabel"); + m_AFingerButton = new KColorButton (page); + m_analogOKColorLabel = new QLabel(i18n("Color of OK range :"),page,"label7"); + m_AOKButton = new KColorButton (page); + m_analogWarningColorLabel = new QLabel(i18n("Color of warning range :"),page,"label8"); + m_AWarnningButton = new KColorButton (page); + m_analogErrorColorLabel= new QLabel(i18n("Color of error range :"),page,"label9"); + m_AErrorButton = new KColorButton (page); + m_analogScaleColorLabel = new QLabel(i18n("Color of scale :"),page,"label10"); + m_AScaleButton = new KColorButton (page); + m_analogFontColorLabel = new QLabel(i18n("Color of font :"),page,"label11"); + m_AFontButton = new KColorButton (page); + + m_digitalProcessingLabel = new QLabel(i18n("Digital processing of pointers :"),page,"label12"); + m_digitalProcesingOfPointers = new KComboBox (page); + + + setColorLayout->addWidget ( initAnalogLabel1, 0,0); + setColorLayout->addWidget ( m_checkBoxCbac ,0,1); + setColorLayout->addWidget ( m_analogBackgroundColorLabel, 1,0); + setColorLayout->addWidget ( m_BGAButton ,1,1); + setColorLayout->addWidget ( initAnalogLabel12, 2,0); + setColorLayout->addWidget ( m_checkBoxCoac ,2,1); + setColorLayout->addWidget ( m_analogPointerColorLabel, 3,0); + setColorLayout->addWidget ( m_AFingerButton ,3,1); + setColorLayout->addWidget ( m_analogOKColorLabel, 4,0); + setColorLayout->addWidget ( m_AOKButton ,4,1); + setColorLayout->addWidget ( m_analogWarningColorLabel, 5,0); + setColorLayout->addWidget ( m_AWarnningButton ,5,1); + setColorLayout->addWidget ( m_analogErrorColorLabel, 6,0); + setColorLayout->addWidget ( m_AErrorButton ,6,1); + setColorLayout->addWidget ( m_analogScaleColorLabel, 7,0); + setColorLayout->addWidget ( m_AScaleButton ,7,1); + setColorLayout->addWidget ( m_analogFontColorLabel, 8,0); + setColorLayout->addWidget ( m_AFontButton ,8,1); + setColorLayout->addWidget ( m_digitalProcessingLabel, 9,0); + setColorLayout->addWidget ( m_digitalProcesingOfPointers, 9,1); + + + m_checkBoxCbac->setChecked(m_settingData->customBAnalogColor); + m_checkBoxCoac->setChecked(m_settingData->customOAnalogColor); + m_BGAButton->setColor(m_settingData->aPanelBackgroundColor); + m_BGAButton->setEnabled(m_settingData->customBAnalogColor); + m_AFingerButton->setColor(m_settingData->analogFingerColor); + m_AFingerButton->setEnabled(m_settingData->customOAnalogColor); + m_AOKButton->setColor(m_settingData->analogOKColor); + m_AOKButton->setEnabled(m_settingData->customOAnalogColor); + m_AWarnningButton->setColor(m_settingData->analogWarnningColor); + m_AWarnningButton->setEnabled(m_settingData->customOAnalogColor); + m_AErrorButton->setColor(m_settingData->analogErrorColor); + m_AErrorButton->setEnabled(m_settingData->customOAnalogColor); + m_AScaleButton->setColor(m_settingData->analogScaleColor); + m_AScaleButton->setEnabled(m_settingData->customOAnalogColor); + m_AFontButton->setColor(m_settingData->analogFontColor); + m_AFontButton->setEnabled(m_settingData->customOAnalogColor); + m_analogBackgroundColorLabel->setEnabled(m_settingData->customBAnalogColor); + m_analogPointerColorLabel->setEnabled(m_settingData->customOAnalogColor); + m_analogOKColorLabel->setEnabled(m_settingData->customOAnalogColor); + m_analogWarningColorLabel->setEnabled(m_settingData->customOAnalogColor); + m_analogErrorColorLabel->setEnabled(m_settingData->customOAnalogColor); + m_analogScaleColorLabel->setEnabled(m_settingData->customOAnalogColor); + m_analogFontColorLabel->setEnabled(m_settingData->customOAnalogColor); + + + m_digitalProcesingOfPointers->insertItem(i18n("Nothing processing")); + m_digitalProcesingOfPointers->insertItem(i18n("Fast antialiasing")); + m_digitalProcesingOfPointers->insertItem(i18n("Fine antialiasing")); + m_digitalProcesingOfPointers->insertItem(i18n("Fast antialiasing and blur motion")); + m_digitalProcesingOfPointers->insertItem(i18n("Fine antialiasing and blur motion")); + + m_digitalProcesingOfPointers->setCurrentItem(m_settingData->typeDigitalProcessing); + + + connect (m_checkBoxCbac,SIGNAL(toggled(bool)),this,SLOT(slotUseCustomBAnalogColor(bool))); + connect (m_checkBoxCoac,SIGNAL(toggled(bool)),this,SLOT(slotUseCustomOAnalogColor(bool))); + } + + + +#include "knutprefdlg.moc" diff --git a/src/knutprefdlg.h b/src/knutprefdlg.h new file mode 100644 index 0000000..0628abd --- /dev/null +++ b/src/knutprefdlg.h @@ -0,0 +1,359 @@ +/*************************************************************************** + knutprefdlg.h - description + ------------------- + begin : Tue Aug 21 2001 + copyright : (C) 2001 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNUTPREFDLG_H +#define KNUTPREFDLG_H + +#include "knutnewupsdlg.h" +#include "knutupsdata.h" +#include "knutvardata.h" +#include "knutconst.h" + + +#include +#include +#include +#include +#include +#include +#include + +#include + +class QLabel; +class QFont; +class QCheckBox; +class QRadioButton; +class QSpinBox; + + +/** + *@author Daniel Prynych + */ + +/** + * This class makes configure dialog + * Tato trida je vytvari konfiguracni dialog. + * @author Daniel Prynych + * @short Konfiguracni dialog + * @version 0.8 + */ +class KNutPrefDlg : public KDialogBase +{ + Q_OBJECT + public: + +enum changePref { + ChangeCountCols = 0x1, //1, + ChangeCustomBColor = 0x2, //2, + ChangeMBColor = 0x4, //4, + ChangeVoltage = 0x8, // 8, + ChangeFrequency = 0x10, // 16, + ChangeXFer = 0x20, // 32, + + ChangeUpsSetting = 0x40, // 64, + ChangeUpsCount = 0x80, // 128, + + ChangeMainPanelSetting = 0x100, // 256, + ChangeCustomMPanelBColor = 0x200, // 512, + ChangeMPBColor = 0x400, // 1024, + + ChangeAnalogFont = 0x800, // 2048, + ChangePanelFont = 0x1000, // 4096, + + ChangeCustomAPanelBColor = 0x2000, // 8192, + ChangeAPBColor = 0x4000, // 16384, + + ChangeCustomAPanelOColor = 0x8000, // 32768, + ChangeAPOColor = 0x10000, // 65536, + + ChangeCustomKIconColor = 0x20000, // 131072, + ChangeKIconBColor = 0x40000, // 262144, + + ChangeToolTip = 0x80000, // 524288, + + ChangeTypeOfKIcon = 0x100000, // 1048576 + + ChangeTypeOfDigProcessing = 0x200000, // 1048576 *2 + + ChangeSomeThing = 0x400000 // 1048576 *4 + + + }; + + + + +/** + * Constructor makes configure dialog. + * Konstruktor vytvori konfiguracni dialog. + * + * @param upsData Is pointer on instance of class of KNutUpsData, which manage informations about UPSes. + * @param analogData Is pointer on instance of class of KNutVarData, which manages data about analog panels. + * @param settingData Is pointer on struct, which contain values is setted in dialog. + * @param upsName Is name of active UPS. + * + * @param upsData Je odkaz na instanci tridy KNutUpsData, ktera spravuje informace o UPS-kach. + * @param analogData Je odkaz na na instanci tridy KNutVarData, ktera spravuje data o analogovych panelech. + * @param settingData Je odkaz na strukturu ktera obsahuje hodnoty nastavovane v dialogu. + * @param upsName Je jmeno aktivni UPS-ky. + * + * @since 0.5 + **/ + KNutPrefDlg(KNutUpsData* const upsData, KNutVarData* const analogData, KNutVarData::SettingDataDef* const settingData, const QString upsName, QWidget* parent = 0, const char* name = 0, const bool modal = true); + +/** + * @since 0.3 + **/ + ~KNutPrefDlg(); + + signals: + +/** + * Signal is emited when statement is changed same pages. + * Signal je aktivovan pokud je zmenen udaj na kterekoliv strance. + * + * @param changeSetting Declare, what item was changed. + * @param changeSetting Udava, ktery prvek byl zmenen. + * + * @since 0.2 + **/ + void signalChangeConfig (unsigned int changeSetting ); + + + + private slots: + +/** + * @internal + */ + virtual void slotDefault(); + +/** + * @internal + */ + virtual void slotApply(); + +/** + * @internal + */ + virtual void slotOk(); + +/** + * @internal + */ + void slotChangeSettingFont(int index); + +/** + * @internal + */ + void slotSetPictureKI (bool on); + + +/** + * @internal + */ + void slotEnableVoltage(bool enable); + + +/** + * @internal + */ + void slotEnableFrequency(bool enable); + + +/** + * @internal + */ + void slotUseCustomBColor(bool enable); + +/** + * @internal + */ + void slotUseCustomBPanelColor(bool enable); + +/** + * @internal + */ +void slotUseCustomBAnalogColor(bool enable); + + +/** + * @internal + */ +void slotUseCustomOAnalogColor(bool enable); + +/** + * @internal + */ +void slotUseCustomBIconColor(bool enable); + + +/** + * @internal + */ + void slotNewUps(); + +/** + * @internal + */ + void slotEditUps(); + +/** + * @internal + */ + void slotDeleteUps(); + + + private: + + enum Page { + mainSettingPage =0, + upsSettingPage, + panelSettingPage, + fontSettingPage, + analogSettingPage, + kickerSettingPage + }; + +/** + * @internal + */ + void initSetting(); + +/** + * @internal + */ + void initUps(); + +/** + * @internal + */ + void initPanel(); + +/** + * @internal + */ + void initFonts(); + +/** + * @internal + */ + void initAnalog (); + +/** + * @internal + */ + void initDock (); + + + +// Private values + QString m_activeUpsName; // name of UPS which is active + KNutUpsData* m_myUpsData; + KNutVarData* m_myAnalogData; + KNutVarData::SettingDataDef* m_settingData; + KNutNewUpsDlg* newUpsDlg; + + KListBox* m_listBox2; // uses in part UPS, contain name of UPS + + bool m_checked; //it's settted when, definition(parameters) of UPS were chaged // nastaveno kdyz doslo k zmene v definici UPS + bool m_checkedActiveUps; //it's setted when, parameters of active UPS were changed // nastaveno pokud doslo ke zmene na aktivni UPS + + QSpinBox *m_numberOfColumns; + KColorButton *m_BGButton; + QCheckBox *m_checkBoxCbc; + QCheckBox *m_checkBoxAys; +// QCheckBox *m_checkBoxMW; + QCheckBox *m_checkBoxMesW; + KComboBox *m_comboBoxMainWindow; + QCheckBox *m_xfer; + + QCheckBox *m_checkBoxOver; + QCheckBox *m_checkBoxBL; + QCheckBox *m_checkBoxRB; + QCheckBox *m_checkBoxCal; + QCheckBox *m_checkBoxMFRM; + QCheckBox *m_checkBoxMFR; + QCheckBox *m_checkBoxModel; + QCheckBox *m_checkBoxSerial; + QCheckBox *m_checkBoxFirm; + QCheckBox *m_checkBoxRun; + QCheckBox *m_checkBoxCbpc; + QCheckBox* m_checkBoxCbac; + QCheckBox* m_checkBoxCoac; + QCheckBox *m_checkBoxCbi; + QCheckBox *m_checkBoxTTMFR; + QCheckBox *m_checkBoxTTModel; + QCheckBox *m_checkBoxTTSerial; + QCheckBox *m_checkBoxTTFirm; + QCheckBox *m_checkBoxTTRun; + QCheckBox *m_checkBoxTTCharge; + QCheckBox *m_checkBoxTTLoad; + + QLabel *m_panelBackgroundColorLabel; + QLabel *m_mainBackgroundColorLabel; + QLabel *m_analogBackgroundColorLabel; + QLabel *m_dockBackgroundColorLabel; + QLabel *m_analogPointerColorLabel; + QLabel *m_analogOKColorLabel; + QLabel *m_analogWarningColorLabel; + QLabel *m_analogErrorColorLabel; + QLabel *m_analogScaleColorLabel; + QLabel *m_analogFontColorLabel; + QLabel *m_digitalProcessingLabel; + QLabel *m_iconDockLabel; + + QRadioButton *m_vRadioButton1; + QRadioButton *m_vRadioButton2; + QRadioButton *m_fRadioButton1; + QRadioButton *m_fRadioButton2; + QRadioButton *m_iconRadioButton1; + QRadioButton *m_iconRadioButton2; + + KColorButton *m_BGPButton; + KColorButton* m_BGAButton; + KColorButton* m_AFingerButton; + KColorButton* m_AOKButton; + KColorButton* m_AWarnningButton; + KColorButton* m_AErrorButton; + KColorButton* m_AScaleButton; + KColorButton* m_AFontButton; + KColorButton *m_BGIButton; + + KComboBox* m_digitalProcesingOfPointers; + + QButtonGroup *m_voltageGroup; + QButtonGroup *m_frequencyGroup; + + QCheckBox* m_customFont; // User's font + KFontChooser *m_fontWidget; + + QFont m_aPanelFont; // Analog panel font + QFont m_mPanelFont; // Main panel font + + int m_settingFont; // which font is setted (selected) + + QPixmap m_panelPix; + QPixmap m_mSetPix; + QPixmap m_upsesPix; + QPixmap m_analogPix; + QPixmap m_dockPix; + +}; + +#endif diff --git a/src/knutprintupsvar.cpp b/src/knutprintupsvar.cpp new file mode 100644 index 0000000..bfd09e4 --- /dev/null +++ b/src/knutprintupsvar.cpp @@ -0,0 +1,210 @@ +/*************************************************************************** + knutprintupsvar.cpp - description + ------------------- + begin : St cec 3 2002 + copyright : (C) 2002 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "knutprintupsvar.h" +#include "knutvardata.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + + + +//#include + + +// od verze 0.6.0 nebudeme vytvaret vlastni spojeni + +KNutPrintUpsVar::KNutPrintUpsVar(KNutNet* const upsNet, const bool useDescription, QWidget* parent, const char* name, const bool modal ) +: KDialogBase(Plain, i18n("Variables"),User1|Cancel,Ok, parent, name, modal, true), myUpsNet(upsNet){ + + upsVarDef upsVar; + upsICommDef upsIComm; + dataVar pointerVar; + dataList.clear(); + + if (!upsNet) return; + + setButtonText(User1,i18n("Reload Vars")); + setName( "knutprintupsvar" ); + setCaption( i18n("UPS variables") ); + + //int error; + if (myUpsNet->getState() != KNutNet::Connected) { + KNutVarData::showError (KNutNet::NotConnection); + upsConnectOk = false; + page=0; + } + else { + upsConnectOk = true; + countVars=myUpsNet->readNumberVars(KNutNet::AllVars); + countRWVars=myUpsNet->readNumberVars(KNutNet::RWVars); + countIComms=myUpsNet->readNumberComms(); + + KIconLoader *loader = KGlobal::iconLoader(); + dirPixmap=loader->loadIcon ("folder_open",KIcon::Small,16); + + page = plainPage(); + QHBoxLayout* upsVarsMainLayout = new QHBoxLayout(page); + + table = new KListView(page); + table->setRootIsDecorated(true); + + table->setAllColumnsShowFocus( TRUE ); + table->setFullWidth ( true ); + + table->addColumn( i18n("Name") ); + table->addColumn( i18n("Value") ); + if (useDescription) + table->addColumn( i18n("Description") ); + table->setSorting (-1); + + upsVarsMainLayout->addWidget(table); + + + KListViewItem* myListItem; + if (countIComms) { + + ICommList = new KListViewItem( table, i18n("Instant Commands")); + ICommList->setOpen(true); + + for (int i=0; ireadIComm(i+1,upsIComm); + + myListItem = addListItem( ICommList,upsIComm.upsCommName,""); + if ((!upsVar.upsDescription.isEmpty()) && useDescription) + myListItem->setText(2,upsIComm.upsDescription); + } + } + + if (countRWVars) { + RWVarsList = new KListViewItem( table, i18n("Read/Write Variables")); + RWVarsList->setOpen(true); + for (int i=0; ireadVars(i+1,upsVar); + + if (!upsVar.upsVarType) { + pointerVar.myName=upsVar.upsVarName; + pointerVar.myValue = addListItem( RWVarsList,upsVar.upsVarName,upsVar.upsValue); + + if ((!upsVar.upsDescription.isEmpty()) && useDescription) + pointerVar.myValue->setText(2,upsVar.upsDescription); + + dataList.push_back(pointerVar); + } + } + } + + + ROVarsList = new KListViewItem( table, i18n("Read Only Variables")); + ROVarsList->setOpen(true); + + for (int i=0; ireadVars(i+1,upsVar); + if (upsVar.upsVarType) { + + pointerVar.myName=upsVar.upsVarName; + pointerVar.myValue = addListItem( ROVarsList,upsVar.upsVarName,upsVar.upsValue); + + if ((!upsVar.upsDescription.isEmpty()) && useDescription) + pointerVar.myValue->setText(2,upsVar.upsDescription); + + dataList.push_back(pointerVar); + } + } + + connect (this,SIGNAL(user1Clicked()),this,SLOT(slotReloadVars())); + } // end else + } + + + +KNutPrintUpsVar::~KNutPrintUpsVar(){ + + dataList.clear(); + if (page) delete page; + } + + +void KNutPrintUpsVar::slotReloadVars (void) { + upsVarDef upsVar; + + if (myUpsNet->getUpsValues(true) !=0) + KNutVarData::showError (myUpsNet->getError()); + else { + + QValueVector::const_iterator it; + for (it = dataList.begin(); it != dataList.end(); it++) { + myUpsNet->readVars((*it).myName, upsVar); + (*it).myValue->setText (1, upsVar.upsValue); + } + } + } + + KListViewItem* KNutPrintUpsVar::addListItem (KListViewItem* table, QString varName, QString value) { + KListViewItem* myListItem; + KListViewItem* helpListItem; + QString left; + int n; + + myListItem = table; + do { + n = varName.find("."); + if (n > 0) { + left = varName.left(n); + varName = varName.mid(n+1); + if (!(helpListItem = existListItem( myListItem,left))) { + myListItem = new KListViewItem( myListItem, left); + myListItem->setOpen(true); + } + else myListItem = helpListItem; + if (!myListItem->pixmap(0)) myListItem->setPixmap(0,dirPixmap); + } + else { // end part + helpListItem = new KListViewItem( myListItem, varName, value); + helpListItem->setOpen(true); + return helpListItem; + } + } while (n > -1); + return 0; // for compiler only + } + + + KListViewItem* KNutPrintUpsVar::existListItem (KListViewItem* listItem, QString name) { + KListViewItem* myItem; + + if (!(myItem = (KListViewItem *)listItem->firstChild())) return 0l; + while (myItem) { + if (myItem->text(0) == name) return myItem; + myItem = (KListViewItem *)myItem->nextSibling(); + } + return 0l; + } + +bool KNutPrintUpsVar::upsOk (void) { return upsConnectOk; } + + +#include "knutprintupsvar.moc" + diff --git a/src/knutprintupsvar.h b/src/knutprintupsvar.h new file mode 100755 index 0000000..bded7ac --- /dev/null +++ b/src/knutprintupsvar.h @@ -0,0 +1,160 @@ +/*************************************************************************** + knutprintupsvar.h - description + ------------------- + begin : St cec 3 2002 + copyright : (C) 2002 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNUTPRINTUPSVAR_H +#define KNUTPRINTUPSVAR_H + +//Od verze 3 je kapp jen odkaz na kapplication +//#include +#include +#include "knutupsdata.h" +#include "knutnet.h" + +#include +#include +#include +#include + + +#include +#include +#include + + +#include + +class QLabel; +class QPixmap; +class QFramel; +class QString; + +/** + *@author Daniel Prynych + */ + +/** + * Tato trida zajistuje zobrazeni vsech promenych, + * ktere podporuje prislusny ovladac/driver/model (ovladac) NUTu + * pro urcenou UPS-ku + * @author Daniel Prynych + * @short NUT show UPS vars + * @version 0.3.2 +*/ +class KNutPrintUpsVar : public KDialogBase { + + Q_OBJECT + +public: +/** + * Constructor - makes window, reads values of variables + * and will write names and values of variables + * Konstruktor - vytvori okno, nacte hodnoty promennych, + * a vypise jmena a hodnoty promenych. + * @param upsnet Je odkaz na instanci KNutNet - obsahuje hodnoty promennych systemu NUT. + * @param useDescription Urcuje zda pouzit pro promenne a prikazy taky popis. + * pokud data o UPS-kach neexistuji vraci funkce upsOk vzdy false. + * + * since 0.3.1 + **/ + KNutPrintUpsVar(KNutNet* const upsNet, const bool useDescription, QWidget* parent = 0, const char* name = 0, const bool modal = true); + +/** + * @since 0.1 + **/ + ~KNutPrintUpsVar(); + + + + +/** + * Vrati zda se povedlo pripojit na server NUT-u a nacist udaje. + * + * @since 0.1 + **/ + bool upsOk (void); + + +protected: + +/****** protected vars ************/ + + int countVars; + int countIComms; + int countRWVars; + + KNutNet* myUpsNet; + + KPushButton* reloadButton; + + struct dataVar { + QString myName; + KListViewItem* myValue; + }; + QValueVector dataList; + KListViewItem* ROVarsList; + KListViewItem* RWVarsList; + KListViewItem* ICommList; + + QFrame *page; + KListView* table; + + QPixmap dirPixmap; + + + bool upsConnectOk; + +/********** protected functions ****************/ + +/** + * @internal + * adds name into part of tree + * Prida jmeno do casti stromu. + * @param table is top of tree's part + * @param varName is text which is addes into tree on the first column + * @param varName is text which is addes into tree on the second column + * @param table je vrchol casti stromu. + * @param varName je text ktere se prida do stromu na prvni sloupec. + * @param value je text ktere se prida do stromu na druhy sloupec. + * + * @since 0.2.1 + **/ + KListViewItem* addListItem (KListViewItem* table, QString varName, QString value); + +/** + * @internal + * Zjisti existenci jmena ve vetvi stromu + * + * listItem je vrcholovy prvek vetve. + * @param name je jmeno ktere se hleda ve strome. + * + * @since 0.2 + **/ + KListViewItem* existListItem (KListViewItem* listItem, QString name); + +protected slots: + +/** + * @internal + * Nacte a prepise hodnoty promenych + * + * @since 0.3 + **/ + void slotReloadVars (void); + +}; + +#endif diff --git a/src/knutrwvar.cpp b/src/knutrwvar.cpp new file mode 100755 index 0000000..20e45bc --- /dev/null +++ b/src/knutrwvar.cpp @@ -0,0 +1,217 @@ +/*************************************************************************** + knutrwvar.cpp - description + ------------------- + begin : So ríj 26 2002 + copyright : (C) 2002 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + + +#include "knutrwvar.h" +#include "knutvardata.h" +#include "knutprintupsvar.h" + +//Od verze 3 je kapp jen odkaz na kapplication +//#include +#include +#include +#include +#include + + +#include +#include +#include +#include + + +//#include + +KNutRWVar::KNutRWVar(QString* userName, QString* userPassword, const QString uName, const QString password, KNutNet* const initUpsNet, QWidget* parent, const char* name, const bool modal) +: KDialogBase(Plain, i18n("RW variables"),Ok|Cancel|Default,Ok, parent, name, modal, true), m_upsNet(initUpsNet){ + upsVarDef upsVar; + +// int error; + + if (m_upsNet->getState() != KNutNet::Connected) { + KNutVarData::showError (KNutNet::NotConnection); + m_upsConnectOk = false; + } + else { + m_oldUserName = userName; + m_oldUserPassword = userPassword; + + m_upsConnectOk = true; + QFrame *page = plainPage(); + QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() ); + QLabel *label1 = new QLabel (i18n("SET RW VARIABLE"),page,"label1"); + label1->setAlignment(Qt::AlignHCenter); + topLayout->addWidget(label1); + + + QLabel *label2 = new QLabel (i18n("Variable:"),page,"label2"); + m_rWVarBox = new KComboBox(page,"rwvarbox"); + + QLabel *label3 = new QLabel (i18n("Value:"),page,"label2"); + m_valueVarBox = new KComboBox(page,"valuevarbox"); + m_valueVarLine = new KLineEdit(page,"valuevarLine"); + m_valueVarLine->hide(); + + m_passLayout = new QGridLayout (4,2,5,"passLayout"); + QLabel *labelName = new QLabel (i18n("User name:"),page,"labelName"); + QLabel *labelPassword = new QLabel (i18n("Password:"),page,"labelPassword"); + m_lineEditName = new KLineEdit( page, "LineEditName" ); + m_lineEditPassword = new KLineEdit( page, "LineEditName" ); + + + if (((*m_oldUserName) == "") && ((*m_oldUserPassword) == "")) { + m_lineEditName->setText(uName); + m_lineEditPassword->setText(password); + } + else { + m_lineEditName->setText(*m_oldUserName); + m_lineEditPassword->setText(*m_oldUserPassword); + } + + if (!((*m_oldUserName) == "") || !((*m_oldUserPassword) == "")) { + m_lineEditName->setDisabled(true); + m_lineEditPassword->setDisabled(true); + } + + m_lineEditPassword->setEchoMode(QLineEdit::Password); + + topLayout->addLayout(m_passLayout); + + m_passLayout->addWidget(label2,0,0); + m_passLayout->addWidget(m_rWVarBox,0,1); + m_passLayout->addWidget(label3,1,0); + m_passLayout->addWidget(labelName,2,0); + m_passLayout->addWidget(labelPassword,3,0); + m_passLayout->addWidget(m_lineEditName,2,1); + m_passLayout->addWidget(m_lineEditPassword,3,1); + + topLayout->addStretch(10); + //loads ComboBox + int n; + if (( n = (m_upsNet->readNumberVars( KNutNet::RWVars )+1)) > 1 ) { // zvetsime si pocet o 1 + for (int i =1; i < n ; i++) { + if (!m_upsNet->readVars(i, upsVar,KNutNet::RWVars)) + m_rWVarBox->insertItem(upsVar.upsVarName); + } + slotChangeVar(0); + } + else { + m_passLayout->addWidget(m_valueVarLine,1,1); + m_valueVarLine->setMaxLength(upsVar.upsVarMax); + m_valueVarBox->hide(); + m_valueVarLine->show(); + m_upsValueType=true; + } + connect (m_rWVarBox,SIGNAL(activated(int)),this,SLOT(slotChangeVar(int))); + } + } + +int KNutRWVar::findItem(const KComboBox *myBox, const QString text) { + int n; + + if ((n=myBox->count())) { + for (int i =0; i < n; i++) + if (text == myBox->text(i)) return i; + } + return myBox->currentItem(); + } + + +void KNutRWVar::slotDefault () { + upsVarDef upsVar; + int error; + + QString varName = m_rWVarBox->currentText(); + if (!( error = m_upsNet->readVars(varName,upsVar))) { + if (upsVar.upsValueType) m_valueVarLine->setText(upsVar.upsValue); + else m_valueVarBox->setCurrentItem(upsVar.upsValue); + } + else KNutVarData::showError (error); + } + + +void KNutRWVar::slotChangeVar(int item) { + upsVarDef upsVar; + + QString varName = m_rWVarBox->text(item); + int error = m_upsNet->readVars(varName,upsVar); + m_upsValueType=upsVar.upsValueType; + if (error || (upsVar.upsValueType)) { + // char + m_valueVarBox->hide(); + m_valueVarLine->show(); + m_passLayout->addWidget(m_valueVarLine,1,1); + m_valueVarLine->setText(upsVar.upsValue); + } + else { + //enum + m_valueVarLine->hide(); + m_valueVarBox->show(); + m_passLayout->addWidget(m_valueVarBox,1,1); + m_valueVarBox->clear(); + if (upsVar.upsVarMax) { + for (int i = 0 ; i < upsVar.upsVarMax; i++) + m_valueVarBox->insertItem(m_upsNet->readEnumValueVar(upsVar.upsVarName,i+1)); + } + m_valueVarBox->setCurrentItem(upsVar.upsValue); + } + } + + + +KNutRWVar::~KNutRWVar(){ +} + +bool KNutRWVar::upsOk (void) { return m_upsConnectOk; } + + +void KNutRWVar::slotOk() { + QString value; + int error =0; + if (m_upsValueType) value=m_valueVarLine->text(); + else value=m_valueVarBox->currentText(); + + if (((*m_oldUserName) == "") && ((*m_oldUserPassword) == "")) { + //the first connection sets name and password + //prvni propojeni nastavime jmeno a heslo + if (!(error = m_upsNet->setVariable(m_rWVarBox->currentText(), value, m_lineEditName->text(),m_lineEditPassword->text(),false))) { + // vzhledem k asynchronimu spracovani asi zbytecne +// myUpsNet->getUpsValues(true); + emit signalChangeRWVars(m_rWVarBox->currentText());//emits command for loading of variable and repaint of panel + + (*m_oldUserName) = m_lineEditName->text(); + (*m_oldUserPassword) = m_lineEditPassword->text(); + accept(); + } + } + else { + if (((*m_oldUserName) == m_lineEditName->text()) && ((*m_oldUserPassword) == m_lineEditPassword->text())) { + if (!(error = m_upsNet->setVariable(m_rWVarBox->currentText(), value, m_lineEditName->text(),m_lineEditPassword->text(),true))) { + // next line isn't needed, maybe + // vzhledem k asynchronimu spracovani asi zbytecne +// myUpsNet->getUpsValues(true); + emit signalChangeRWVars(m_rWVarBox->currentText()); //emits command for loading of variable and repaint of panel + accept(); + } + } + } + //Nahlasime chybu + // sends information about error + if (error) KNutVarData::showError (error); + } + +#include "knutrwvar.moc" diff --git a/src/knutrwvar.h b/src/knutrwvar.h new file mode 100755 index 0000000..4cef64c --- /dev/null +++ b/src/knutrwvar.h @@ -0,0 +1,140 @@ +/*************************************************************************** + knutrwvar.h - description + ------------------- + begin : So ríj 26 2002 + copyright : (C) 2002 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNUTRWVAR_H +#define KNUTRWVAR_H + +#include "knutnet.h" + +#include +#include +#include +#include + + +class QString; +class QGridLayout; + +/** + * This class is graphics interface for changes of RW variables. + * Tato trida je graficke rozhrani pro zmenu RW promennych. + * + * @author Daniel Prynych + * @short RW promenne + * @version 0.2 +*/ +class KNutRWVar : public KDialogBase { + Q_OBJECT + public: +/** + * Constructor - makes window for change of RW variable. + * Konstruktor - vytvori okno pro zmenu RW promene. + * + + * @param uName Describes user name. + * @param password Describes password. + * @param initUpsNet is pointer of intance of class KNutNet. + * @param userName Urcuje uzivatelske jmeno. + * @param userPassword Urcuje heslo. + * @param uName Urcuje uzivatelske jmeno. + * @param password Urcuje heslo. + * @param initUpsNet Je odkaz na instanci tridy KNutNet. + * @since 0.2 + **/ + KNutRWVar(QString* userName, QString* userPassword, const QString uName, const QString password, KNutNet* const initUpsNet, QWidget* parent = 0, const char* name = 0, const bool modal = TRUE); + +/** + * Destructor + * + * @since 0.2 + **/ + ~KNutRWVar(); + +/** + * Vraci true pokud existuje pripojeni na server a vytvorilo se + * ovladaci okno pro nastaveni promennych. + * + * @since 0.3 + **/ + bool upsOk (void); + + + private slots: + +/** + * @internal + * + * Nastavi hodnotu a zpusob vyberu hodnoty promenne. + */ + void slotChangeVar(int item); + +/** + * @internal + * + * Sets value of variable on default value + * Nastavi hodnotu promenne na puvodni hodnotu. + */ + virtual void slotDefault (); + +/** + * @internal + * + * Provede akci + */ + virtual void slotOk(); + + + +/** + * @internal + * + * Find asked item in box + * Since at version 3.0.0 is not needed. + * Najde pozadovanou polozku v boxu. + * Ve verzi qt > 3.0.0 neni potreba. + */ +int findItem(const KComboBox *myBox ,const QString text); + + signals: +/** + * Signal je aktivovam pokud je zmenen udaj na kterekoliv strance. + * + * @param changeSetting Udava co bylo zmeneno. + * + * @since 0.1 + **/ + void signalChangeRWVars (QString varName); + + + private: + KNutNet* m_upsNet; + KLineEdit *m_lineEditName; + KLineEdit *m_lineEditPassword; + KComboBox *m_rWVarBox; + KComboBox *m_valueVarBox; + KLineEdit *m_valueVarLine; + QGridLayout *m_passLayout; + bool m_upsValueType; + bool m_upsConnectOk; + + QString* m_oldUserName; + QString* m_oldUserPassword; + + + }; + +#endif diff --git a/src/knutupsdata.cpp b/src/knutupsdata.cpp new file mode 100644 index 0000000..9a4a0b5 --- /dev/null +++ b/src/knutupsdata.cpp @@ -0,0 +1,78 @@ +/*************************************************************************** + knutupsdata.cpp - description + ------------------- + begin : Tue Aug 21 2001 + copyright : (C) 2001 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "knutupsdata.h" +#include "knutvardata.h" + +#include + + +KNutUpsData::KNutUpsData() { +// vytvori seznam UPS + m_listRecords.clear(); + m_countUpsRecords = 0; + } + +KNutUpsData::~KNutUpsData() { m_listRecords.clear(); } + +void KNutUpsData::add (const upsRecordDef upsRecord) { +// vlozime ups na konec + m_countUpsRecords++; + m_listRecords.append(upsRecord); + } + + +void KNutUpsData::put (const int index, const upsRecordDef upsRecord ) { + if ((index > -1 ) && (index < m_countUpsRecords)) { + m_listRecords[index] = (upsRecord); + } + } + + +void KNutUpsData::get (const int index, upsRecordDef& upsRecord ) { + if ((index > -1 ) && (index < m_countUpsRecords)) upsRecord=m_listRecords[index]; + } + +QString KNutUpsData::getName (const int index) { + if ((index > -1 ) && (index < m_countUpsRecords)) return m_listRecords[index].name; + else return 0L; + } + + +void KNutUpsData::deleteName (const int index) { + if ((index > -1 ) && (index < m_countUpsRecords)) { + QValueList::Iterator it = m_listRecords.begin(); + for (int i =0; i < index; i++) it++; + m_listRecords.remove(it); + m_countUpsRecords--; + } +} + + +int KNutUpsData::getCount ( void ) { return m_countUpsRecords; } + + +KNutUpsData::upsRecordDef* KNutUpsData::findName (const QString name) { + QValueList::Iterator it; + for (it = m_listRecords.begin(); it != m_listRecords.end(); it++) { + if ((*it).name == name) { + return &(*it); // vratime adresu + } + } + return 0l; + } + diff --git a/src/knutupsdata.h b/src/knutupsdata.h new file mode 100644 index 0000000..e258227 --- /dev/null +++ b/src/knutupsdata.h @@ -0,0 +1,161 @@ +/*************************************************************************** + knutupsdata.h - description + ------------------- + begin : Tue Aug 21 2001 + copyright : (C) 2001 by Daniel Prynych + email : Daniel@prynych.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNUTUPSDATA_H +#define KNUTUPSDATA_H + +#include "knutconst.h" +#include "knutanalog.h" + +#include +#include + +class QString; + +/** + *@author Daniel Prynych + */ + + + + /** + * Trida obsahuje data o UPS-kach, + * nazev, adresu port, protokol, promenne atd. + * Class includes data about UPSes like name. address, port, protocol, variables ... + * + * @author Daniel Prynych + * @short Information about UPS + * @version 0.4 + **/ +class KNutUpsData { + + +public: + + +struct upsRecordDef { //include information about one UPS + QString name; // name + QString upsName; // name of UPSky <> mojeups + QString upsAddress; // address of UPS <> muj.pc.cz + long delay; // time between read date from UPS + unsigned short port; // port for connecting server + QString userName; + QString password; + bool savePassword; //save password into configuration + int upsVarCode[knc::NumberOfVars]; + }; + + + + /** + * Konstruktor + * + * @since 0.3 + **/ + KNutUpsData(); + + /** + * Destruktor + * + * @since 0.3 + **/ + ~KNutUpsData(); + + /** + * Adds record + * Prida zaznam. + * + * @param upsRecord are data of record in structure of upsRecordStruct. + * @param upsRecord jsou data zaznamu ve strukture upsRecordStruct. + * @since 0.4 + **/ + void add (const upsRecordDef upsRecord); + + /** + * Rewrites record + * Prepise zaznam. + * + * @param index Describes order number od record. + * @param index Udava poradove cislo zaznamu.. + * @param upsRecord are data of record in structure of upsRecordStruct. + * @param upsRecord jsou data zaznamu ve strukture upsRecordStruct. + * @since 0.4 + **/ + void put (const int index, const upsRecordDef upsRecord ); + + /** + * Returns record. + * Vrati zaznam. + * + * @param index Describes order number od record. + * @param index Udava poradove cislo zaznamu. + * @param upsRecord are data of record in structure upsRecordStruct. + * @param upsRecord jsou data zaznamu ve strukture upsRecordStruct. + * + * @since 0.4 + **/ + void get (const int index, upsRecordDef& upsRecord ); + + /** + * Returns name of record. + * Vrati jmeno zaznamu. + * + * @param index Describes order number od record. + * @param index Udava poradove cislo zaznamu. + * @since 0.3 + **/ + QString getName (const int index); + + /** + * Deletes record; + * Zrusi zaznam. + * + * @param index Describes order number od record. + * @param index Udava poradove cislo zaznamu. + * + * @since 0.3 + **/ + void deleteName (const int index); + + /** + * Returns count of records + * Vrati pocet zaznamu. + * + * @since 0.3 + **/ + int getCount ( void ); + + /** + * Returns pointer on record, when record is not existed returns 0 + * Vrati ukazatel na zaznam, pokud zaznam neexistuje vrati 0. + * + * @param name Is name of list. + * @param name Je jmeno zaznamu. + * @since 0.3 + **/ + upsRecordDef* findName (const QString name); + + + +private: + int m_countUpsRecords; + + QValueList m_listRecords; +}; + + +#endif diff --git a/src/knutvardata.cpp b/src/knutvardata.cpp new file mode 100755 index 0000000..86650bd --- /dev/null +++ b/src/knutvardata.cpp @@ -0,0 +1,242 @@ +/*************************************************************************** + knutvardata.cpp - description + ------------------- + begin : Tue Aug 21 2001 + copyright : (C) 2001 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "knutvardata.h" +#include "knutnet.h" + +#include +#include + +#include + +//#include + + const char *nameUpsVars1[] = { + "NONE", "UTILITY", "BATTPCT", "UPSTEMP", "ACFREQ", "LOADPCT", "AMBTEMP", "AMBHUMID","BATTVOLT","OUTVOLT","CURRENT","NONE","BATT_TEMP","BATT_CURRENT"}; + + const char *nameUpsVars2[] = { + "none", "input.voltage", "battery.charge", "ups.temperature", "input.frequency", "ups.load", "ambient.temperature", "ambient.humidity","battery.voltage","output.voltage","output.current","output.frequency","battery.temperature","battery.current"}; + +/* + * Nic,Vstupni Napeti,Baterie,Teplota UPSky, + * Vstupni frekvence,Zatizeni,Vnejsi teplota, + * Vnejsi vlhkost,Napeti baterie, Vystupni napeti + * Vystupni proud, Teplota baterie, Proud baterie +*/ + +KNutVarData::KNutVarData(){ + + m_upsVarNameAnalog[0] = i18n("None"); + m_upsVarNameAnalog[1] = i18n("Input Voltage"); + m_upsVarNameAnalog[2] = i18n("Battery Charge"); + m_upsVarNameAnalog[3] = i18n("UPS Temperature"); + m_upsVarNameAnalog[4] = i18n("Input Frequency"); + m_upsVarNameAnalog[5] = i18n("UPS Load"); + m_upsVarNameAnalog[6] = i18n("Outside Temperature"); + m_upsVarNameAnalog[7] = i18n("Outside Humidity"); + m_upsVarNameAnalog[8] = i18n("Battery Voltage"); + m_upsVarNameAnalog[9] = i18n("Output Voltage"); + m_upsVarNameAnalog[10] = i18n("Output Current"); + m_upsVarNameAnalog[11] = i18n("Output Frequency"); + m_upsVarNameAnalog[12] = i18n("Battery Temperature"); + m_upsVarNameAnalog[13] = i18n("Battery Current"); + + static const QString upsVarNameUnit[] = {"", "V", "%", "C", "Hz", "%", "C", "%", "V", "V", "A","Hz","C", "A"}; + static const int upsVarType[] = {0,3,2,1,1,2,1,1,3,3,2,1,1,2}; //typ panelu + static const int upsVarItem[] = {5,4,5,5,6,6,5,5,5,4,5,6,5,5}; // pocet velkych policek na stupnici + static const int upsVarInItem[] = {0,3,0,0,4,0,0,0,0,3,5,4,0,5}; // pocet malych policek ve velkem policku na stupnici + static const int upsVarStart[] = {0,170,0,-10,20,0,-10,0,0,170,0,20,-10,-15}; + static const int upsVarEnd[] = {0,290,100,90,80,120,70,100,10,290,5,80,90,10}; + static const int upsVarScaleStart[ knc::NumberOfTypes ][5] = {{0,0,0,0,0},{0,210,0,0,0},{50,0,40,0,0},{-100,50,0,0,0},{0,40,45,0,0},{0,80,100,0,0},{-100,50,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{210,0,250,0,0},{0,0,0,0,0},{0,40,45,0,0},{-100,50,0,0,0},{0,0,0,0,0}}; + static const int upsVarScaleEnd[ knc::NumberOfTypes ][5] = {{0,0,0,0,0},{400,250,0,0,0},{120,40,50,0,0},{50,100,0,0,0},{90,60,55,0,0},{80,100,120,0,0},{50,70,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{250,210,400,0,0},{0,0,0,0,0},{90,60,55,0,0},{50,100,0,0,0},{0,0,0,0,0}}; + + + + int upsVarScaleColor[ knc::NumberOfTypes ][5] = {{aRegWhite,aRegWhite,aRegWhite,aRegWhite,aRegWhite}, + {aRegRed,aRegGreen,aRegWhite,aRegWhite,aRegWhite}, + {aRegGreen,aRegRed,aRegYellow,aRegWhite,aRegWhite}, + {aRegGreen,aRegRed,aRegWhite,aRegWhite,aRegWhite}, + {aRegRed,aRegYellow,aRegGreen,aRegWhite,aRegWhite}, + {aRegGreen,aRegYellow,aRegRed,aRegWhite,aRegWhite}, + {aRegGreen,aRegRed,aRegWhite,aRegWhite,aRegWhite}, + {aRegWhite,aRegWhite,aRegWhite,aRegWhite,aRegWhite}, + {aRegGreen,aRegRed,aRegRed,aRegWhite,aRegWhite}, + {aRegGreen,aRegRed,aRegRed,aRegWhite,aRegWhite}, + {aRegWhite,aRegWhite,aRegWhite,aRegWhite,aRegWhite}, + {aRegRed,aRegYellow,aRegGreen,aRegWhite,aRegWhite}, + {aRegGreen,aRegRed,aRegWhite,aRegWhite,aRegWhite}, + {aRegWhite,aRegWhite,aRegWhite,aRegWhite,aRegWhite}}; + + + for (int i=0;i < knc::NumberOfTypes; i++) { + m_dataVar[i].nameAnalog = m_upsVarNameAnalog[i]; + m_dataVar[i].nameUnit = upsVarNameUnit[i]; + m_dataVar[i].typeAnalog = upsVarType[i]; + m_dataVar[i].numberItem = upsVarItem[i]; + m_dataVar[i].numberInItem = upsVarInItem[i]; + m_dataVar[i].start = upsVarStart[i]; + m_dataVar[i].end = upsVarEnd[i]; + for (int j=0; j< 5; j++) { + m_dataVar[i].scaleStruct[j].start=upsVarScaleStart[i][j]; + m_dataVar[i].scaleStruct[j].end=upsVarScaleEnd[i][j]; + m_dataVar[i].scaleStruct[j].scaleColor=upsVarScaleColor[i][j]; + } + } + + m_dataVarVoltage[U230V]=m_dataVar[knc::VarUtility]; + m_dataVarVoltage[U120V]=m_dataVar[knc::VarUtility]; + m_dataVarVoltage[U120V].start=90; + m_dataVarVoltage[U120V].end=150; + m_dataVarVoltage[U120V].scaleStruct[0].start=0; + m_dataVarVoltage[U120V].scaleStruct[1].start=110; + m_dataVarVoltage[U120V].scaleStruct[0].end=200; + m_dataVarVoltage[U120V].scaleStruct[1].end=130; + + m_dataVarFrequence[F50HZ]=m_dataVar[knc::VarAcfreq]; + m_dataVarFrequence[F60HZ]=m_dataVar[knc::VarAcfreq]; + m_dataVarFrequence[F60HZ].start=30; + m_dataVarFrequence[F60HZ].end=90; + m_dataVarFrequence[F60HZ].scaleStruct[0].start=0; + m_dataVarFrequence[F60HZ].scaleStruct[1].start=50; + m_dataVarFrequence[F60HZ].scaleStruct[2].start=55; + m_dataVarFrequence[F60HZ].scaleStruct[0].end=100; + m_dataVarFrequence[F60HZ].scaleStruct[1].end=70; + m_dataVarFrequence[F60HZ].scaleStruct[2].end=65; + } + +KNutVarData::~KNutVarData(){ +} + + +KNutVarData::VarStrucDef KNutVarData::getData (const int seqNumber) const { + int i = seqNumber; + + if (i < 1) i = 1; + else {if (i > (knc::NumberOfTypes-1)) i = knc::NumberOfTypes - 1;}; + return m_dataVar[i]; + } + + + +QString KNutVarData::getNameAnalogData (const int seqNumber) { + if ((seqNumber >= 0) && (seqNumber < knc::NumberOfTypes)) + return m_upsVarNameAnalog[seqNumber]; + else + return ""; + } + + +void KNutVarData::putData (const int seqNumber, VarStrucDef& varStruc) { + if (seqNumber > 0 && seqNumber < knc::NumberOfTypes) m_dataVar[seqNumber] = varStruc; + } + +void KNutVarData::setVoltage (const int typeVoltage) { + if (typeVoltage == 230) { + m_dataVar[knc::VarUtility] = m_dataVarVoltage[U230V]; + m_dataVar[knc::VarOutVolt] = m_dataVarVoltage[U230V]; +// m_dataVar[knc::VarOutVolt].nameAnalog = upsVarNameAnalog[knc::VarOutVolt]; // je nutno nastavit nazev + } + if (typeVoltage == 120) { + m_dataVar[knc::VarUtility] = m_dataVarVoltage[U120V]; + m_dataVar[knc::VarOutVolt] = m_dataVarVoltage[U120V]; +// dataVar[knc::VarOutVolt].nameAnalog = upsVarNameAnalog[knc::VarOutVolt]; // je nutno nastavit nazev + } + m_dataVar[knc::VarOutVolt].nameAnalog = m_upsVarNameAnalog[knc::VarOutVolt]; // je nutno nastavit nazev + } + +void KNutVarData::setFrequency (const int typeFrequence) { + if (typeFrequence == 50) { + m_dataVar[knc::VarAcfreq] = m_dataVarFrequence[F50HZ]; + m_dataVar[knc::VarOutFreq] = m_dataVarFrequence[F50HZ]; + } + if (typeFrequence == 60) { + m_dataVar[knc::VarAcfreq] = m_dataVarFrequence[F60HZ]; + m_dataVar[knc::VarOutFreq] = m_dataVarFrequence[F60HZ]; + } + m_dataVar[knc::VarOutFreq].nameAnalog = m_upsVarNameAnalog[knc::VarOutFreq]; // je nutno nastavit nazev + } + +void KNutVarData::setXfer (const float lowXfer, const float highXfer) { + m_dataVar[knc::VarUtility].scaleStruct[1].start=(int)lowXfer; + m_dataVar[knc::VarUtility].scaleStruct[1].end=(int)highXfer; + m_dataVar[knc::VarOutVolt].scaleStruct[1].start=(int)lowXfer; + m_dataVar[knc::VarOutVolt].scaleStruct[1].end=(int)highXfer; + } + + +const QString KNutVarData::errorToText (const int error) { + + switch (error) { + + // knutclient error + case KNutNet::LowMem: return i18n("No memory."); + case KNutNet::NullAddress: return i18n("No address."); + case KNutNet::NoSuchHost: return i18n("Unknown address."); + case KNutNet::SocketReadErr: // socket + case KNutNet::ConnectErr: // connect + return i18n("Error of connection."); + + case KNutNet::CantConnect: + return i18n("No connection with server."); + + case KNutNet::NutProtocolVarErr: return i18n("Server-client protocol or variables of NUT are unknown."); + case KNutNet::NoUpsHere: return i18n("No UPS on this address."); + case KNutNet::ConnectionRefused: return i18n("Connection was refused by server."); + + case KNutNet::SendErr: return i18n("Server doesn't receive data."); + case KNutNet::RecvErr: return i18n("Server doesn't send data."); + case KNutNet::NoServerData: return i18n("Server doesn't answer."); + + case KNutNet::UnknownFormat: return i18n("Server returns data with unknown format."); + case KNutNet::UnknownAnswer: return i18n("Server returns unknown data."); + case KNutNet::UnknownFormatVer: return i18n("Command VER returns data with unknown format."); + + case KNutNet::NoData: return i18n("No data."); + case KNutNet::NotConnection: return i18n("Connection doesn't exist."); + +// server error + case KNutNet::AccessDenied: return i18n("Access denied. Failed password ?"); + case KNutNet::DataStale: return i18n("UPS doesn't sent data to server (Data Stale)."); + case KNutNet::UnknownCommand: return i18n("Server doesn't know this command."); + +// driver error + case KNutNet::DriverNotConnected: return i18n("UPS's driver isn't connected."); + + case KNutNet::PasswordRequired: return i18n("Server required password."); + case KNutNet::PasswordIncorrect: return i18n("Incorrect password."); + case KNutNet::NoResponse: return i18n("UPS doesn't response."); + case KNutNet::CommandFailed: return i18n("Command failed."); + case KNutNet::UnknownInstCmd: return i18n("UPS doesn't know this instant command."); + case KNutNet::CmdNotSupported: return i18n("UPS doesn't support this instant command."); + case KNutNet::VarUnknown: return i18n("UPS doesn't known this variable."); + case KNutNet::VarNotSupported: return i18n("UPS doesn't support this variable."); + case KNutNet::InvalidValue: return i18n("UPS doesn't support this value in this variable."); + case KNutNet::UnknownUps: return i18n("Name of UPS is unknown."); + + case KNutNet::AlreadySetUsername: return i18n("Username has been already entered."); + case KNutNet::AlreadySetPassword: return i18n("Password has been already entered."); + + case KNutNet::NoListVars: return i18n("Server doesn't send list of variables."); + +//default + default: return i18n("Unknown error."); + } + } + +void KNutVarData::showError (const int error) { + KMessageBox::sorry (0,errorToText(error)); + } diff --git a/src/knutvardata.h b/src/knutvardata.h new file mode 100755 index 0000000..6f112d5 --- /dev/null +++ b/src/knutvardata.h @@ -0,0 +1,261 @@ +/*************************************************************************** + knutvardata.h - description + ------------------- + begin : Tue Aug 21 2001 + copyright : (C) 2001 by Daniel Prynych + email : Daniel@prynych.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNUTVARDATA_H +#define KNUTVARDATA_H + + +/*******************************/ +/* GLOBAL DEFINE */ +/*******************************/ + +#define DEFAULT_BG_COLOR Qt::lightGray +#define DEFAULT_FINGER_COLOR Qt::black +#define DEFAULT_OK_COLOR Qt::green +#define DEFAULT_WARNNING_COLOR Qt::yellow +#define DEFAULT_ERROR_COLOR Qt::red +#define DEFAULT_SCALE_COLOR Qt::black +#define DEFAULT_FONT_COLOR Qt::black +#define DEFAULT_KICON_COLOR Qt::white + +#include + +#include "knutnet.h" +#include "knutupsdata.h" +#include "knutconst.h" + +#include +#include +#include + + +// const char *nameUpsVars1[] = { +// "NONE", "UTILITY", "BATTPCT", "UPSTEMP", "ACFREQ", "LOADPCT", "AMBTEMP", "AMBHUMID","BATTVOLT","OUTVOLT","CURRENT","BATT_TEMP","BATT_CURRENT"}; + +// const char *nameUpsVars2[] = { +// "none", "input.voltage", "battery.charge", "ups.temperature", "input.frequency", "ups.load", "ambient.temperature", "ambient.humidity","battery.voltage","output.voltage","output.current","battery.temperature","battery.current"}; + + +/** + *@author Daniel Prynych + */ + + + /** + * Class contain data about analog panels, + * name, .. + * Describes view of panel. + * Trida obsahuje data o analogovych panelech, + * nazev, atd. + * Popisuje jak ma prislusny panel vypadat + * + * @author Daniel Prynych + * @short Information about analog panels + * @version 0.4 + **/ + +class QString; +class QColor; +class QFont; + +class KNutVarData { + +public: + + enum mainWindowStartVariant{ + mw_yes=0, + mw_no, + mw_auto + }; + +struct ScaleStructDef { + int start; + int end; + int scaleColor; + }; + +struct SettingDataDef { + int countCols; + int x; + int y; + int width; + int height; + QColor mainBackgroundColor; + QColor mPanelBackgroundColor; + QColor aPanelBackgroundColor; + QColor analogFingerColor; + QColor analogOKColor; + QColor analogWarnningColor; + QColor analogErrorColor; + QColor analogScaleColor; + QColor analogFontColor; + unsigned int panelFlags; + int inputVoltage; + int inputFrequency; + bool lowHighXfer; + bool areYouSure; + mainWindowStartVariant useMainWindow; + int useMessageWindow; + bool customBColor; + bool customBPanelColor; + bool customBAnalogColor; + bool customOAnalogColor; + QFont mPanelFont; // main panel font + QFont aPanelFont; // analog panel font + QFont systemFont; // system font + bool customFont; // use custom font + bool useDescription; + unsigned int toolTipFlags; + bool customKIconColor; + QColor kIconBackgroundColor; + int typeOfKIcon; + int typeDigitalProcessing; + bool activatedMainWindow; + }; + +struct upsInfoDef{ //include generally informations about active (selected) UPS + KNutNet *upsNet; // pointer to instance of KNutNet + KNutUpsData::upsRecordDef record; // include information about information of ups (name, address, login, password ...) + int netError; // kod chyby pri spojeni // kode if error of conection + bool errorUpsData; + // state of connection to usbd, this isn't state of knutnet + knc::upsDriverConnection upsDriverState; // defined in knutconst.h + int oldState; // code of lost state of UPS kod posledniho stavu UPS + QString name; + QString password; + int nutVariables; + int nutProtocol; + QString runtimeVar; + QString lowxferVar; + QString highxferVar; + QString statusVar; + QString upsLoadVar; + bool reconnecting; // is true when program is in reconnecting stage + int reconnectCount; + }; + +struct VarStrucDef { + QString nameAnalog; // jmeno promene v meraku napr. UPS Load + QString nameUnit; // merna jednotka napr % + int typeAnalog; //typ meraku + int numberItem; //pocet casti stupnice neni v souvislosti barvou + int numberInItem; //pocet casti stupnice uvnitr dilku stupnice + int start; // pocatecni hodnota v meraku + int end; // konecna hodnota v meraku + struct ScaleStructDef scaleStruct[5]; + }; + + + KNutVarData(); + ~KNutVarData(); + + /** + * Gets data of analog measure panel, type of measure panel, + * Vrati data analogoveho mericiho panelu. + * typ meraku, pocet dilku stupnice, merici jedntotku atd + * data je mozno take nastavovat + * @param seqNumber Kod typu meraky. + * @return Data pro zadany typ panelu. + * @since 0.1 + **/ +VarStrucDef getData (const int seqNumber) const; + + + /** + * Puts data of analog measure panel + * Nastavi data analogoveho mericiho panelu. + * + * @param seqNumber Kod typu meraky. + * @param data Data pro zadany typ panelu. + * + * @since 0.1 + **/ +void putData (const int seqNumber, VarStrucDef& varStruc); + + /** + * Sets data of analog measure panel for input and output voltage + * Nastavi data analogoveho mericiho panelu pro vstupni a vystupni napeti. + * + * @param typeVoltage Typ vstupniho napeti 230/120. + * + * @since 0.1 + **/ +void setVoltage (const int typeVoltage); + + /** + * Sets data of analog measure panel for input frequence + * Nastavi data analogoveho mericiho panelu pro vstupni frekvence. + * + * @param typeFrequence Typ vstupni frekvence 50/60. + * + * @since 0.1 + **/ +void setFrequency (const int typeFrequence); + + /** + * Nastavi vnitrni cast vybarveni podle low/high xfer, + * low/high-XFER udava rozpeti pri kterem UPS zpracovava napeti ze site. + * + * @param lowXfer Pocatecni hodnota. + * @param highXfer Konecna hodnota. + * @since 0.1 + **/ +void setXfer (const float lowXfer, const float highXfer); + + /** + * Vrati dlouhy nazev analogoveho panelu, + * je to jmeno merene veliciny + * + * @param seqNumber Kod typu merakuss. + * @since 0.1 + **/ +QString getNameAnalogData (const int seqNumber); + + +/** + * Prevede kod chyby na jeho textovou reprezentaci + * + * @since 0.2 + **/ + static const QString errorToText (const int error); + + +/** + * Zobrazi jmeno chyby na zaklade jeho cisla. + * + * @since 0.1.2 + **/ + static void showError (const int error); + + +private: + + enum {aRegWhite,aRegGreen,aRegYellow,aRegRed,aRegBlue,aRegCyan,aRegMagenta,aRegBlack}; + + VarStrucDef m_dataVar[ knc::NumberOfTypes ]; /* udrzuje popis Anagovych meraku pro danou promenou jmeno zabarveni typ meraky */ + VarStrucDef m_dataVarVoltage[2]; + VarStrucDef m_dataVarFrequence[2]; + + static const int U230V = 0; + static const int U120V = 1; + static const int F50HZ = 0; + static const int F60HZ = 1; + + QString m_upsVarNameAnalog[ knc::NumberOfTypes ];//array of strings - includes name of analog meters +}; + +#endif diff --git a/src/lo16-app-knutclient.png b/src/lo16-app-knutclient.png new file mode 100644 index 0000000000000000000000000000000000000000..8b8d655a7959d7420d4c33520d11172b16f23ca3 GIT binary patch literal 167 zcmeAS@N?&q;$mQ6;Pv!y2?EjrAk4uAB;`NjdH|Bcu?1?#a{i-I?b(7gzMseUb7&3E9`(!6^ZQbOZ!9K7 zhXWWu2hWPl%{4&K8XU&~z!)k~ux0{ymr?)v i&Zj>mqOat+h1oh8G8H5;H8=bTTidk^lez literal 0 HcmV?d00001 diff --git a/src/lo32-app-knutclient.png b/src/lo32-app-knutclient.png new file mode 100644 index 0000000000000000000000000000000000000000..2c6d538bc85ea5e14c3345641043bc251e2a79ba GIT binary patch literal 330 zcmV-Q0k!^#P)M088oLU6kw$qPjGBgW8{2I1cW zNe^^gw`-f{*nkPl8oUnijCTu?h($07*qoM6N<$f(+A%^#A|> literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..d3dabec --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,78 @@ +/*************************************************************************** + main.cpp - description + ------------------- + begin : Út srp 21 19:12:20 CEST 2001 + copyright : (C) 2001 by Daniel Prynych + email : Daniel.Prynych@alo.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "knutclient.h" + +#include +#include + +static const char *description = + I18N_NOOP("Client for Network UPS Tool"); +// INSERT A DESCRIPTION FOR YOUR APPLICATION HERE + + +static KCmdLineOptions options[] = +{ + {"nodock",I18N_NOOP("Don't dock in Kicker"),0}, + { 0, 0, 0 } + // INSERT YOUR COMMANDLINE OPTIONS HERE +}; + + + +int main(int argc, char *argv[]) +{ + + KAboutData aboutData( "knutclient", I18N_NOOP("KNutClient"), + VERSION, description, KAboutData::License_GPL, + "(c) 2002 - 2009 Daniel Prynych", "Zajecov, Czech Republic", 0, "Daniel@prynych.cz"); + aboutData.addAuthor("Daniel Prynych",0, "Daniel@prynych.cz","http://www.knut.noveradsl.cz/knutclient/"); + aboutData.addCredit("Arnaud Quette",0,"arnaud.quette@free.fr","http://www.networkupstools.org/"); + aboutData.addCredit("MGE",0,0,"http://opensource.mgeups.com"); + + KCmdLineArgs::init( argc, argv, &aboutData ); + KCmdLineArgs::addCmdLineOptions( options ); // Add our own options. + KUniqueApplication::addCmdLineOptions(); + + KCmdLineArgs* args = KCmdLineArgs::parsedArgs(); + bool noDock = args->isSet("dock"); + args->clear(); + + // main KUApp this is remark + if (!KUniqueApplication::start()) { + fprintf(stderr,"Sorry : KNutClient is already running!\n"); + exit(0); + } + KUniqueApplication a; + +// next line is for testing only. +// I don't debug KUniqueApplication + +// KApplication a; +// + KNutClient *knutclient = new KNutClient(!noDock); + int returnCode = a.exec(); + delete knutclient; + return returnCode; +} diff --git a/stamp-h.in b/stamp-h.in new file mode 100755 index 0000000..e69de29