diff --git a/.gitignore b/.gitignore index d4a3c328..7f9b38e5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ +bin src/messenger/.idea/workspace.xml src/messenger/webim/install/package src/messenger/absent_* src/messenger/release* +src/mibewjava/.idea/workspace.xml +src/mibewjava/org.mibew.notifier/resources/ +mibew.ini .DS_Store diff --git a/README.md b/README.md new file mode 100644 index 00000000..c91f35bf Binary files /dev/null and b/README.md differ diff --git a/docs/design/abstract_button_narrow.psd b/docs/design/abstract_button_narrow.psd index dbca29c3..c5da078e 100644 Binary files a/docs/design/abstract_button_narrow.psd and b/docs/design/abstract_button_narrow.psd differ diff --git a/docs/design/abstract_rounded.psd b/docs/design/abstract_rounded.psd new file mode 100644 index 00000000..49e8568c Binary files /dev/null and b/docs/design/abstract_rounded.psd differ diff --git a/src/messenger/.buildpath b/src/messenger/.buildpath deleted file mode 100644 index 8bcb4b5f..00000000 --- a/src/messenger/.buildpath +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/messenger/.idea/codeStyleSettings.xml b/src/messenger/.idea/codeStyleSettings.xml new file mode 100644 index 00000000..de6382eb --- /dev/null +++ b/src/messenger/.idea/codeStyleSettings.xml @@ -0,0 +1,31 @@ + + + + + + + diff --git a/src/messenger/.idea/misc.xml b/src/messenger/.idea/misc.xml index f82faeb6..11e74ae4 100644 --- a/src/messenger/.idea/misc.xml +++ b/src/messenger/.idea/misc.xml @@ -1,8 +1,5 @@ - - http://www.w3.org/1999/xhtml diff --git a/src/messenger/.idea/scopes/scope_settings.xml b/src/messenger/.idea/scopes/scope_settings.xml new file mode 100644 index 00000000..922003b8 --- /dev/null +++ b/src/messenger/.idea/scopes/scope_settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/src/messenger/.project b/src/messenger/.project deleted file mode 100644 index 1885041d..00000000 --- a/src/messenger/.project +++ /dev/null @@ -1,27 +0,0 @@ - - - messenger - - - - - - org.eclipse.dltk.core.scriptbuilder - - - - - org.eclipse.php.core.PhpIncrementalProjectBuilder - - - - - org.eclipse.wst.validation.validationbuilder - - - - - - org.eclipse.php.core.PHPNature - - diff --git a/src/messenger/.settings/org.eclipse.core.resources.prefs b/src/messenger/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index b324460a..00000000 --- a/src/messenger/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Sat May 08 00:52:18 CEST 2010 -eclipse.preferences.version=1 -encoding//webim/locales=UTF-8 -encoding//webim/locales/bg/properties=cp1251 -encoding//webim/locales/ca/properties=ISO-8859-1 -encoding//webim/locales/names/properties=utf-8 -encoding//webim/locales/ru=cp1251 -encoding//webim/locales/sp/properties=ISO-8859-1 -encoding//webim/locales/ua/properties=cp1251 diff --git a/src/messenger/pack.pl b/src/messenger/pack.pl index eb5a04a7..5cb4a0a2 100755 --- a/src/messenger/pack.pl +++ b/src/messenger/pack.pl @@ -5,7 +5,7 @@ ################################################################## $targetFolder = "deploy"; -$suffix = "164"; +$suffix = "165"; ################################################################## # Copies tree into target folder, preprocess .phps diff --git a/src/messenger/tools/header.txt b/src/messenger/tools/header.txt index d00ac202..1c735e25 100644 --- a/src/messenger/tools/header.txt +++ b/src/messenger/tools/header.txt @@ -1,14 +1,13 @@ -This file is part of Mibew Messenger project. +Copyright 2005-2013 the original author or authors. -Copyright (c) 2005-2011 Mibew Messenger Community -All rights reserved. The contents of this file are subject to the terms of -the Eclipse Public License v1.0 which accompanies this distribution, and -is available at http://www.eclipse.org/legal/epl-v10.html +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at -Alternatively, the contents of this file may be used under the terms of -the GNU General Public License Version 2 or later (the "GPL"), in which case -the provisions of the GPL are applicable instead of those above. If you wish -to allow use of your version of this file only under the terms of the GPL, and -not to allow others to use your version of this file under the terms of the -EPL, indicate your decision by deleting the provisions above and replace them -with the notice and other provisions required by the GPL. \ No newline at end of file + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/src/messenger/tools/header_update.pl b/src/messenger/tools/header_update.pl index 69ce5e92..044298c2 100755 --- a/src/messenger/tools/header_update.pl +++ b/src/messenger/tools/header_update.pl @@ -43,16 +43,9 @@ P: for $phpfile (grep { /\.php$/ } @allfiles) { if($comment =~ /\[external\]/) { next P; }; - die "no contributors in $phpfile" unless $comment =~ /Contributors:/; - $newcomment = $comment; - $newcomment =~ s/\s\*\s//g; - $newcomment =~ s/^\/\*//; - $newcomment =~ s/\*\/$//; - $newcomment =~ s/.*(Contributors:)/$1/s; - $newcomment =~ s/^\s+//; - $newcomment =~ s/\s+$//; - $newcomment = "$php_header\n\n$newcomment"; + $newcomment = "$php_header"; $newcomment =~ s/^/ * /gm; + $newcomment =~ s/\s+$//gm; $newcomment = "/*\n$newcomment\n */"; $content =~ s/^(<\?php\n)\/\*.*?\*\//$1$newcomment/s; diff --git a/src/messenger/webim/COPYING b/src/messenger/webim/COPYING deleted file mode 100644 index bfdf54c2..00000000 --- a/src/messenger/webim/COPYING +++ /dev/null @@ -1,19 +0,0 @@ -Mibew Messenger -Copyright (c) 2005-2011 Mibew Messenger Community - -LICENSE - -Mibew Messenger is distributed under the terms of the Eclipse Public License (or -the General Public License, this means that you can choose one of two, and use it -accordingly) with the following special exception. - -License exception: -No one may remove, alter or hide any copyright notices or links to the community -site ("http://mibew.org") contained within the Program. Any derivative work -must include this license exception. - -Eclipse Public License: -http://www.eclipse.org/legal/epl-v10.html - -General Public License: -http://www.gnu.org/copyleft/gpl.html diff --git a/src/messenger/webim/LICENSE b/src/messenger/webim/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/src/messenger/webim/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/messenger/webim/README b/src/messenger/webim/README index 23eb567a..87cb10e7 100644 --- a/src/messenger/webim/README +++ b/src/messenger/webim/README @@ -1,5 +1,5 @@ Mibew Messenger -Copyright (c) 2005-2011 Mibew Messenger Community +Copyright 2005-2013 the original author or authors. REQUIREMENTS diff --git a/src/messenger/webim/VERSION b/src/messenger/webim/VERSION index cff47a7b..10a9279e 100644 --- a/src/messenger/webim/VERSION +++ b/src/messenger/webim/VERSION @@ -1 +1 @@ -Mibew/1.6.4 \ No newline at end of file +Mibew/1.6.5 \ No newline at end of file diff --git a/src/messenger/webim/b.php b/src/messenger/webim/b.php index 97671c68..fc8faf39 100644 --- a/src/messenger/webim/b.php +++ b/src/messenger/webim/b.php @@ -1,22 +1,18 @@ - - - - - - - -Eclipse Public License - Version 1.0 - - - - - - -
- -

Eclipse Public License - v 1.0 -

- -

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER -THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, -REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE -OF THIS AGREEMENT.

- -

1. DEFINITIONS

- -

"Contribution" means:

- -

a) -in the case of the initial Contributor, the initial code and documentation -distributed under this Agreement, and
-b) in the case of each subsequent Contributor:

- -

i) -changes to the Program, and

- -

ii) -additions to the Program;

- -

where -such changes and/or additions to the Program originate from and are distributed -by that particular Contributor. A Contribution 'originates' from a Contributor -if it was added to the Program by such Contributor itself or anyone acting on -such Contributor's behalf. Contributions do not include additions to the -Program which: (i) are separate modules of software distributed in conjunction -with the Program under their own license agreement, and (ii) are not derivative -works of the Program.

- -

"Contributor" means any person or -entity that distributes the Program.

- -

"Licensed Patents " mean patent -claims licensable by a Contributor which are necessarily infringed by the use -or sale of its Contribution alone or when combined with the Program.

- -

"Program" means the Contributions -distributed in accordance with this Agreement.

- -

"Recipient" means anyone who -receives the Program under this Agreement, including all Contributors.

- -

2. GRANT OF RIGHTS

- -

a) -Subject to the terms of this Agreement, each Contributor hereby grants Recipient -a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly -display, publicly perform, distribute and sublicense the Contribution of such -Contributor, if any, and such derivative works, in source code and object code -form.

- -

b) -Subject to the terms of this Agreement, each Contributor hereby grants -Recipient a non-exclusive, worldwide, royalty-free -patent license under Licensed Patents to make, use, sell, offer to sell, import -and otherwise transfer the Contribution of such Contributor, if any, in source -code and object code form. This patent license shall apply to the combination -of the Contribution and the Program if, at the time the Contribution is added -by the Contributor, such addition of the Contribution causes such combination -to be covered by the Licensed Patents. The patent license shall not apply to -any other combinations which include the Contribution. No hardware per se is -licensed hereunder.

- -

c) -Recipient understands that although each Contributor grants the licenses to its -Contributions set forth herein, no assurances are provided by any Contributor -that the Program does not infringe the patent or other intellectual property -rights of any other entity. Each Contributor disclaims any liability to Recipient -for claims brought by any other entity based on infringement of intellectual -property rights or otherwise. As a condition to exercising the rights and -licenses granted hereunder, each Recipient hereby assumes sole responsibility -to secure any other intellectual property rights needed, if any. For example, -if a third party patent license is required to allow Recipient to distribute -the Program, it is Recipient's responsibility to acquire that license before -distributing the Program.

- -

d) -Each Contributor represents that to its knowledge it has sufficient copyright -rights in its Contribution, if any, to grant the copyright license set forth in -this Agreement.

- -

3. REQUIREMENTS

- -

A Contributor may choose to distribute the -Program in object code form under its own license agreement, provided that: -

- -

a) -it complies with the terms and conditions of this Agreement; and

- -

b) -its license agreement:

- -

i) -effectively disclaims on behalf of all Contributors all warranties and -conditions, express and implied, including warranties or conditions of title -and non-infringement, and implied warranties or conditions of merchantability -and fitness for a particular purpose;

- -

ii) -effectively excludes on behalf of all Contributors all liability for damages, -including direct, indirect, special, incidental and consequential damages, such -as lost profits;

- -

iii) -states that any provisions which differ from this Agreement are offered by that -Contributor alone and not by any other party; and

- -

iv) -states that source code for the Program is available from such Contributor, and -informs licensees how to obtain it in a reasonable manner on or through a -medium customarily used for software exchange.

- -

When the Program is made available in source -code form:

- -

a) -it must be made available under this Agreement; and

- -

b) a -copy of this Agreement must be included with each copy of the Program.

- -

Contributors may not remove or alter any -copyright notices contained within the Program.

- -

Each Contributor must identify itself as the -originator of its Contribution, if any, in a manner that reasonably allows -subsequent Recipients to identify the originator of the Contribution.

- -

4. COMMERCIAL DISTRIBUTION

- -

Commercial distributors of software may -accept certain responsibilities with respect to end users, business partners -and the like. While this license is intended to facilitate the commercial use -of the Program, the Contributor who includes the Program in a commercial -product offering should do so in a manner which does not create potential -liability for other Contributors. Therefore, if a Contributor includes the -Program in a commercial product offering, such Contributor ("Commercial -Contributor") hereby agrees to defend and indemnify every other -Contributor ("Indemnified Contributor") against any losses, damages and -costs (collectively "Losses") arising from claims, lawsuits and other -legal actions brought by a third party against the Indemnified Contributor to -the extent caused by the acts or omissions of such Commercial Contributor in -connection with its distribution of the Program in a commercial product -offering. The obligations in this section do not apply to any claims or Losses -relating to any actual or alleged intellectual property infringement. In order -to qualify, an Indemnified Contributor must: a) promptly notify the Commercial -Contributor in writing of such claim, and b) allow the Commercial Contributor -to control, and cooperate with the Commercial Contributor in, the defense and -any related settlement negotiations. The Indemnified Contributor may participate -in any such claim at its own expense.

- -

For example, a Contributor might include the -Program in a commercial product offering, Product X. That Contributor is then a -Commercial Contributor. If that Commercial Contributor then makes performance -claims, or offers warranties related to Product X, those performance claims and -warranties are such Commercial Contributor's responsibility alone. Under this -section, the Commercial Contributor would have to defend claims against the -other Contributors related to those performance claims and warranties, and if a -court requires any other Contributor to pay any damages as a result, the -Commercial Contributor must pay those damages.

- -

5. NO WARRANTY

- -

EXCEPT AS EXPRESSLY SET FORTH IN THIS -AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, -WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, -MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely -responsible for determining the appropriateness of using and distributing the -Program and assumes all risks associated with its exercise of rights under this -Agreement , including but not limited to the risks and costs of program errors, -compliance with applicable laws, damage to or loss of data, programs or -equipment, and unavailability or interruption of operations.

- -

6. DISCLAIMER OF LIABILITY

- -

EXCEPT AS EXPRESSLY SET FORTH IN THIS -AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF -THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF -THE POSSIBILITY OF SUCH DAMAGES.

- -

7. GENERAL

- -

If any provision of this Agreement is invalid -or unenforceable under applicable law, it shall not affect the validity or -enforceability of the remainder of the terms of this Agreement, and without -further action by the parties hereto, such provision shall be reformed to the -minimum extent necessary to make such provision valid and enforceable.

- -

If Recipient institutes patent litigation -against any entity (including a cross-claim or counterclaim in a lawsuit) -alleging that the Program itself (excluding combinations of the Program with -other software or hardware) infringes such Recipient's patent(s), then such -Recipient's rights granted under Section 2(b) shall terminate as of the date -such litigation is filed.

- -

All Recipient's rights under this Agreement -shall terminate if it fails to comply with any of the material terms or -conditions of this Agreement and does not cure such failure in a reasonable -period of time after becoming aware of such noncompliance. If all Recipient's -rights under this Agreement terminate, Recipient agrees to cease use and -distribution of the Program as soon as reasonably practicable. However, -Recipient's obligations under this Agreement and any licenses granted by -Recipient relating to the Program shall continue and survive.

- -

Everyone is permitted to copy and distribute -copies of this Agreement, but in order to avoid inconsistency the Agreement is -copyrighted and may only be modified in the following manner. The Agreement -Steward reserves the right to publish new versions (including revisions) of -this Agreement from time to time. No one other than the Agreement Steward has -the right to modify this Agreement. The Eclipse Foundation is the initial -Agreement Steward. The Eclipse Foundation may assign the responsibility to -serve as the Agreement Steward to a suitable separate entity. Each new version -of the Agreement will be given a distinguishing version number. The Program -(including Contributions) may always be distributed subject to the version of -the Agreement under which it was received. In addition, after a new version of -the Agreement is published, Contributor may elect to distribute the Program -(including its Contributions) under the new version. Except as expressly stated -in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to -the intellectual property of any Contributor under this Agreement, whether -expressly, by implication, estoppel or otherwise. All rights in the Program not -expressly granted under this Agreement are reserved.

- -

This Agreement is governed by the laws of the -State of New York and the intellectual property laws of the United States of -America. No party to this Agreement will bring a legal action under this -Agreement more than one year after the cause of action arose. Each party waives -its rights to a jury trial in any resulting litigation.

- -

 

- -
- - - - \ No newline at end of file diff --git a/src/messenger/webim/gpl-2.0.txt b/src/messenger/webim/gpl-2.0.txt deleted file mode 100644 index d511905c..00000000 --- a/src/messenger/webim/gpl-2.0.txt +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - 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 Lesser General -Public License instead of this License. diff --git a/src/messenger/webim/index.php b/src/messenger/webim/index.php index 20fa4719..d50d3251 100644 --- a/src/messenger/webim/index.php +++ b/src/messenger/webim/index.php @@ -1,22 +1,18 @@ array( + "idx_agentid" => "agentid" + ) +); + $memtables = array(); $dbtables_can_update = array( diff --git a/src/messenger/webim/install/dbperform.php b/src/messenger/webim/install/dbperform.php index 24f3a69b..26b1addc 100644 --- a/src/messenger/webim/install/dbperform.php +++ b/src/messenger/webim/install/dbperform.php @@ -1,22 +1,18 @@ this?"0"+a:a};var Try={these:function(){for(var a,b=0;b=200&&a.status<300)if((a=a.responseXML)&&a.documentElement)return a.documentElement;return null},getError:function(a){return a.statusText||"connection error N"+a.status},emptyFunction:function(){},Base:function(){}}; -Ajax.Base.prototype={setOptions:function(a){this._options={_method:"post",asynchronous:true,parameters:""}.extend(a||{})},getStatus:function(){try{return this.transport.status||0}catch(a){return 0}},responseIsSuccess:function(){var a=this.getStatus();return!a||a>=200&&a<300},responseIsFailure:function(){return!this.responseIsSuccess()}};Ajax.Request=Class.create();Ajax.Request.Events=["Uninitialized","Loading","Loaded","Interactive","Complete"]; -Class.inherit(Ajax.Request,Ajax.Base,{initialize:function(a,b){this.transport=Ajax.getTransport();this.setOptions(b);this.transportTimer={};this.finished=false;this.request(a)},request:function(a){var b=this._options.parameters||"";b.length>0&&(b=b+"&_=");try{this._options._method=="get"&&b.length>0&&(a=a+("?"+b));this.transport.open(this._options._method.toUpperCase(),a,this._options.asynchronous);if(this._options.asynchronous){this.transport.onreadystatechange=this.onStateChange.bind(this);if(this._options.timeout)this.transportTimer= -setTimeout(this.handleTimeout.bind(this),this._options.timeout)}this.setRequestHeaders();var c=this._options.postBody?this._options.postBody:b;this.transport.send(this._options._method=="post"?c:null)}catch(d){this.dispatchException(d)}},setRequestHeaders:function(){var a=["X-Requested-With","XMLHttpRequest"];if(this._options._method=="post"){a.push("Content-type","application/x-www-form-urlencoded");this.transport.overrideMimeType&&(navigator.userAgent.match("/Gecko/(d{4})/")||[0,2005])[1]<2005&& -a.push("Connection","close")}this._options.requestHeaders&&a.push.apply(a,this._options.requestHeaders);for(var b=0;ba.status&&(a=a.responseXML)&&a.documentElement?a.documentElement:null},getError:function(a){return a.statusText||"connection error N"+a.status},emptyFunction:function(){},Base:function(){}}; +Ajax.Base.prototype={setOptions:function(a){this._options={_method:"post",asynchronous:!0,parameters:""}.extend(a||{})},getStatus:function(){try{return this.transport.status||0}catch(a){return 0}},responseIsSuccess:function(){var a=this.getStatus();return!a||200<=a&&300>a},responseIsFailure:function(){return!this.responseIsSuccess()}};Ajax.Request=Class.create();Ajax.Request.Events=["Uninitialized","Loading","Loaded","Interactive","Complete"]; +Class.inherit(Ajax.Request,Ajax.Base,{initialize:function(a,b){this.transport=Ajax.getTransport();this.setOptions(b);this.transportTimer={};this.finished=!1;this.request(a)},request:function(a){var b=this._options.parameters||"";0(navigator.userAgent.match("/Gecko/(d{4})/")|| +[0,2005])[1]&&a.push("Connection","close"));this._options.requestHeaders&&a.push.apply(a,this._options.requestHeaders);for(var b=0;b-1){var d=token.split("#"),e=d[0],b=document.getElementById(d[1]);if(b==null||e&&b.nodeName.toLowerCase()!=e)return[];b=Array(b)}else if(token.indexOf(".")>-1){d=token.split(".");e=d[0];d=d[1];e||(e="*");for(var f=[],g=0,j=0;j'}function htmlescape(a){return a.replace("&","&").replace("<","<").replace(">",">").replace('"',""")}var ClientForm=Class.create(); -ClientForm.prototype={initialize:function(a){this.emailPattern=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;this.form=a;this.localizedStrings=null},emailIsValid:function(a){return a!=null&&a.value.search(this.emailPattern)==-1?false:true},changeGroup:function(a,b,c){document.getElementById(b).innerHTML=c[a.selectedIndex]},checkFields:function(){return null},localize:function(a){this.localizedStrings= -a},submit:function(){var a=this.checkFields();a===null?this.form.submit():a!=""&&alert(a)}}; \ No newline at end of file +document.getElementsBySelector=function(a){if(!document.getElementsByTagName)return[];a=a.split(" ");for(var b=Array(document),c=0;c'}function htmlescape(a){return a.replace("&","&").replace("<","<").replace(">",">").replace('"',""")}var ClientForm=Class.create(); +ClientForm.prototype={initialize:function(a){this.emailPattern=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;this.form=a;this.localizedStrings=null},emailIsValid:function(a){return null!=a&&-1==a.value.search(this.emailPattern)?!1:!0},changeGroup:function(a,b,c){document.getElementById(b).innerHTML=c[a.selectedIndex]},checkFields:function(){return null},localize:function(a){this.localizedStrings= +a},submit:function(){var a=this.checkFields();null===a?this.form.submit():""!=a&&alert(a)}}; diff --git a/src/messenger/webim/leavemessage.php b/src/messenger/webim/leavemessage.php index b256d53b..0a516dd5 100644 --- a/src/messenger/webim/leavemessage.php +++ b/src/messenger/webim/leavemessage.php @@ -1,22 +1,18 @@ $state_closed and istate <> $state_left and lastpingagent <> 0 and lastpinguser <> 0 and " . + "(ABS(UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - UNIX_TIMESTAMP(lastpinguser)) > " . $settings['thread_lifetime'] . " and " . + "ABS(UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - UNIX_TIMESTAMP(lastpingagent)) > " . $settings['thread_lifetime'] . ")"; + + perform_query($query, $link); +} + function thread_by_id_($id, $link) { global $mysqlprefix; diff --git a/src/messenger/webim/libs/common.php b/src/messenger/webim/libs/common.php index 7208284e..fecf2a77 100644 --- a/src/messenger/webim/libs/common.php +++ b/src/messenger/webim/libs/common.php @@ -1,22 +1,18 @@ "; + echo "\n"; } /* print csrf token in url format */ diff --git a/src/messenger/webim/libs/config.php b/src/messenger/webim/libs/config.php index 90a2e203..c8d326d4 100644 --- a/src/messenger/webim/libs/config.php +++ b/src/messenger/webim/libs/config.php @@ -1,22 +1,18 @@ here settings.invitationstyle=Select a style for your invitation settings.leavemessage_captcha.description=Protection against automated spam (captcha) -settings.leavemessage_captcha=Force visitorOD to enter a verification code when leaving message +settings.leavemessage_captcha=Force visitor to enter a verification code when leaving message settings.logo.description=Enter http address of your company logo settings.logo=Your company logo settings.no.title=Please enter your company title diff --git a/src/messenger/webim/locales/ru/properties b/src/messenger/webim/locales/ru/properties index 284a62bb..5f39b0fb 100644 --- a/src/messenger/webim/locales/ru/properties +++ b/src/messenger/webim/locales/ru/properties @@ -539,6 +539,8 @@ settings.survey.askmail.description= settings.survey.askmail=Ñïðàøèâàòü e-mail àäðåñ settings.survey.askmessage.description=Ïîêàçàòü/ñïðÿòàòü ïîëå ââîäà ïåðâîãî âîïðîñà settings.survey.askmessage=Ïðåäëàãàòü ñðàçó æå çàäàòü âîïðîñ +settings.threadlifetime.description=Óêàæèòå âðåìÿ æèçíè äèàëîãà ïîñëå çàêðûòèÿ äèàëîãîâîãî îêíà â ñåêóíäàõ. Ïî óìîë÷àíèþ, 600 ñåêóíä. Óêàæèòå 0 äëÿ ñíÿòèÿ îãðàíè÷åíèÿ. +settings.threadlifetime=Âðåìÿ æèçíè äèàëîãà settings.title=Íàñòðîéêè ìåññåíäæåðà settings.trackinglifetime.description=Óêàæèòå ñðîê õðàíåíèÿ ñòàðûõ îòñëåæåííûõ ïóòåé â ñåêóíäàõ. Ïî óìîë÷àíèþ, 600 ñåêóíä. settings.trackinglifetime=Ñðîê õðàíåíèÿ îòñëåæåííûõ ïóòåé diff --git a/src/messenger/webim/mail.php b/src/messenger/webim/mail.php index 552bb136..bcdf01f7 100644 --- a/src/messenger/webim/mail.php +++ b/src/messenger/webim/mail.php @@ -1,22 +1,18 @@ 0 ) { ?> diff --git a/src/messenger/webim/view/inc_locales.php b/src/messenger/webim/view/inc_locales.php index 3c8c5cf7..9f2f7842 100644 --- a/src/messenger/webim/view/inc_locales.php +++ b/src/messenger/webim/view/inc_locales.php @@ -1,22 +1,18 @@ + + + + + + diff --git a/src/mibewjava/.idea/compiler.xml b/src/mibewjava/.idea/compiler.xml new file mode 100644 index 00000000..e644c940 --- /dev/null +++ b/src/mibewjava/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + diff --git a/src/mibewjava/.idea/copyright/profiles_settings.xml b/src/mibewjava/.idea/copyright/profiles_settings.xml new file mode 100644 index 00000000..3572571a --- /dev/null +++ b/src/mibewjava/.idea/copyright/profiles_settings.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/mibewjava/.idea/encodings.xml b/src/mibewjava/.idea/encodings.xml new file mode 100644 index 00000000..e206d70d --- /dev/null +++ b/src/mibewjava/.idea/encodings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/mibewjava/.idea/inspectionProfiles/Project_Default.xml b/src/mibewjava/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..c66df003 --- /dev/null +++ b/src/mibewjava/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/src/mibewjava/.idea/inspectionProfiles/profiles_settings.xml b/src/mibewjava/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 00000000..3b312839 --- /dev/null +++ b/src/mibewjava/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/src/mibewjava/.idea/libraries/swt.xml b/src/mibewjava/.idea/libraries/swt.xml new file mode 100644 index 00000000..798fd500 --- /dev/null +++ b/src/mibewjava/.idea/libraries/swt.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/mibewjava/.idea/misc.xml b/src/mibewjava/.idea/misc.xml new file mode 100644 index 00000000..1c091f99 --- /dev/null +++ b/src/mibewjava/.idea/misc.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + http://www.w3.org/1999/xhtml + + + + + + diff --git a/src/mibewjava/.idea/modules.xml b/src/mibewjava/.idea/modules.xml new file mode 100644 index 00000000..852f03e3 --- /dev/null +++ b/src/mibewjava/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/mibewjava/.idea/runConfigurations/MibewTray.xml b/src/mibewjava/.idea/runConfigurations/MibewTray.xml new file mode 100644 index 00000000..efbaaaf6 --- /dev/null +++ b/src/mibewjava/.idea/runConfigurations/MibewTray.xml @@ -0,0 +1,24 @@ + + + + \ No newline at end of file diff --git a/src/mibewjava/.idea/uiDesigner.xml b/src/mibewjava/.idea/uiDesigner.xml new file mode 100644 index 00000000..3b000203 --- /dev/null +++ b/src/mibewjava/.idea/uiDesigner.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mibewjava/.idea/vcs.xml b/src/mibewjava/.idea/vcs.xml new file mode 100644 index 00000000..9ab281ac --- /dev/null +++ b/src/mibewjava/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/mibewjava/org.mibew.api/.classpath b/src/mibewjava/org.mibew.api/.classpath new file mode 100644 index 00000000..18d70f02 --- /dev/null +++ b/src/mibewjava/org.mibew.api/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/mibewjava/org.mibew.api/.project b/src/mibewjava/org.mibew.api/.project new file mode 100644 index 00000000..3197fa8e --- /dev/null +++ b/src/mibewjava/org.mibew.api/.project @@ -0,0 +1,17 @@ + + + org.mibew.api + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/src/mibewjava/org.mibew.api/org.mibew.api.iml b/src/mibewjava/org.mibew.api/org.mibew.api.iml new file mode 100644 index 00000000..79c37165 --- /dev/null +++ b/src/mibewjava/org.mibew.api/org.mibew.api.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/mibewjava/org.mibew.api/src/org/mibew/api/MibewAgent.java b/src/mibewjava/org.mibew.api/src/org/mibew/api/MibewAgent.java new file mode 100644 index 00000000..87a1bcd5 --- /dev/null +++ b/src/mibewjava/org.mibew.api/src/org/mibew/api/MibewAgent.java @@ -0,0 +1,151 @@ +package org.mibew.api; + +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.security.NoSuchAlgorithmException; +import java.util.LinkedList; +import java.util.List; + +import javax.xml.parsers.ParserConfigurationException; + +import org.xml.sax.SAXException; + +/** + * @author inspirer + */ +public class MibewAgent { + + private final MibewAgentOptions fOptions; + private final MibewAgentListener fListener; + private final MibewUpdateThread fThread; + private volatile boolean started; + + public MibewAgent(MibewAgentOptions options, MibewAgentListener listener) { + fOptions = options; + fListener = listener; + fThread = new MibewUpdateThread(); + started = false; + } + + public synchronized void launch() { + if(!started) { + fThread.start(); + started = true; + } + } + + public synchronized void stop() { + if(started) { + fThread.disconnect(); + started = false; + } + } + + public boolean isOnline() { + return fThread.isOnline(); + } + + protected void logError(String message, Throwable th) { + System.err.println(message); + } + + public MibewAgentOptions getOptions() { + return fOptions; + } + + private class MibewUpdateThread extends Thread { + + private volatile boolean fExiting; + private volatile boolean isOnline = false; + private final Object fSync = new Object(); + + public MibewUpdateThread() { + setName("Mibew Connection thread"); + fExiting = false; + } + + public void disconnect() { + synchronized (fSync) { + fExiting = true; + fSync.notifyAll(); + } + } + + @Override + public void run() { + while(!fExiting) { + try { + connectAndTrack(); + } catch(InterruptedException ex) { + /* ignore */ + } catch(Throwable th) { + logError(th.getMessage(), th); + } + } + setOnline(false); + } + + private void setOnline(boolean online) { + if(isOnline != online) { + isOnline = online; + fListener.onlineStateChanged(online); + } + } + + public boolean isOnline() { + return isOnline; + } + + private void connectAndTrack() throws InterruptedException, UnsupportedEncodingException, NoSuchAlgorithmException, MalformedURLException, ParserConfigurationException, SAXException { + setOnline(false); + MibewConnection conn = new MibewConnection(fOptions.getUrl(), fOptions.getLogin(), fOptions.getPassword()) { + @Override + protected void handleError(String message, Exception ex) { + logError(message, ex); + } + }; + if(!conn.connect()) { + logError("Wrong server, login or password.", null); + interruptableSleep(fOptions.getPollingInterval() * 3); + return; + } + final List createdThreads = new LinkedList(); + MibewTracker mt = new MibewTracker(conn, new MibewTrackerListener(){ + @Override + public void threadCreated(MibewThread thread) { + createdThreads.add(thread); + } + }); + long maxTime = System.currentTimeMillis() + fOptions.getConnectionRefreshTimeout()*1000; + + int errorsCount = 0; + while(!fExiting && (System.currentTimeMillis() < maxTime)) { + try { + createdThreads.clear(); + mt.update(); + fListener.updated(mt.getThreads(), createdThreads.toArray(new MibewThread[createdThreads.size()])); + errorsCount = 0; + setOnline(true); + } catch (Throwable th) { + setOnline(false); + errorsCount++; + logError("not updated", th); + interruptableSleep(errorsCount < 10 ? fOptions.getPollingInterval() / 2 : fOptions.getPollingInterval() * 2); + continue; + } + interruptableSleep(fOptions.getPollingInterval()); + } + + conn.disconnect(); + } + + private void interruptableSleep(long millis) throws InterruptedException { + synchronized (fSync ) { + if(fExiting) { + return; + } + fSync.wait(millis); + } + } + } +} diff --git a/src/mibewjava/org.mibew.api/src/org/mibew/api/MibewAgentListener.java b/src/mibewjava/org.mibew.api/src/org/mibew/api/MibewAgentListener.java new file mode 100644 index 00000000..78df236e --- /dev/null +++ b/src/mibewjava/org.mibew.api/src/org/mibew/api/MibewAgentListener.java @@ -0,0 +1,10 @@ +package org.mibew.api; + +public abstract class MibewAgentListener { + + protected void onlineStateChanged(boolean isOnline) { + } + + protected void updated(MibewThread[] all, MibewThread[] created) { + } +} diff --git a/src/mibewjava/org.mibew.api/src/org/mibew/api/MibewAgentOptions.java b/src/mibewjava/org.mibew.api/src/org/mibew/api/MibewAgentOptions.java new file mode 100644 index 00000000..9470af0d --- /dev/null +++ b/src/mibewjava/org.mibew.api/src/org/mibew/api/MibewAgentOptions.java @@ -0,0 +1,62 @@ +package org.mibew.api; + +import java.io.IOException; +import java.util.Properties; + +/** + * @author inspirer + */ +public class MibewAgentOptions { + + private String fUrl; + private String fLogin; + private String fPassword; + private int fConnectionRefreshTimeout = 900; // in seconds (15 minutes by default) + private int fPollingInterval = 2000; // 2 sec (in milliseconds) + + public MibewAgentOptions(String fUrl, String fLogin, String fPassword) { + super(); + this.fUrl = fUrl; + this.fLogin = fLogin; + this.fPassword = fPassword; + } + + public String getLogin() { + return fLogin; + } + + public String getPassword() { + return fPassword; + } + + public String getUrl() { + return fUrl; + } + + public int getConnectionRefreshTimeout() { + return fConnectionRefreshTimeout; + } + + public int getPollingInterval() { + return fPollingInterval; + } + + private static String getProperty(Properties p, String name, String defaultValue) throws IOException { + String result = p.getProperty(name); + if(result == null) { + if(defaultValue != null) { + return defaultValue; + } + throw new IOException("No '"+name+"' property"); + } + return result; + } + + public static MibewAgentOptions create(Properties p) throws IOException { + String url = getProperty(p, "mibew.host", null); + String login = getProperty(p, "mibew.login", null); + String password = getProperty(p, "mibew.password", null); + + return new MibewAgentOptions(url, login, password); + } +} diff --git a/src/mibewjava/org.mibew.jabber/src/org/mibew/api/MibewConnection.java b/src/mibewjava/org.mibew.api/src/org/mibew/api/MibewConnection.java similarity index 100% rename from src/mibewjava/org.mibew.jabber/src/org/mibew/api/MibewConnection.java rename to src/mibewjava/org.mibew.api/src/org/mibew/api/MibewConnection.java diff --git a/src/mibewjava/org.mibew.jabber/src/org/mibew/api/MibewResponse.java b/src/mibewjava/org.mibew.api/src/org/mibew/api/MibewResponse.java similarity index 100% rename from src/mibewjava/org.mibew.jabber/src/org/mibew/api/MibewResponse.java rename to src/mibewjava/org.mibew.api/src/org/mibew/api/MibewResponse.java diff --git a/src/mibewjava/org.mibew.api/src/org/mibew/api/MibewThread.java b/src/mibewjava/org.mibew.api/src/org/mibew/api/MibewThread.java new file mode 100644 index 00000000..5f3a8207 --- /dev/null +++ b/src/mibewjava/org.mibew.api/src/org/mibew/api/MibewThread.java @@ -0,0 +1,172 @@ +package org.mibew.api; + + +/** + * @author inspirer + */ +public class MibewThread implements Comparable { + + private final long fId; + private String fState; + private String fClientName = ""; + private String fAgent = ""; + private String fAddress = ""; + private String fFirstMessage = ""; + private boolean fCanOpen = false; + private boolean fCanView = false; + private boolean fCanBan = false; + private String fStateText; + private long fWaitingTime; + + public MibewThread(long id, String state) { + fId = id; + fState = state; + } + + public void updateFrom(MibewThread updated) { + if(fId != updated.fId) { + throw new IllegalArgumentException("different threads"); + } + fState = updated.fState; + fClientName = updated.fClientName; + fAgent = updated.fAgent; + fAddress = updated.fAddress; + fFirstMessage = updated.fFirstMessage; + fCanOpen = updated.fCanOpen; + fCanView = updated.fCanView; + fCanBan = updated.fCanBan; + fStateText = updated.fStateText; + fWaitingTime = updated.fWaitingTime; + } + + public long getId() { + return fId; + } + + public String getState() { + return fState; + } + + public String getStateText() { + return fStateText; + } + + public void setStateText(String stateText) { + fStateText = stateText; + } + + public String getAddress() { + return fAddress; + } + + public void setAddress(String address) { + fAddress = address; + } + + public String getAgent() { + return fAgent; + } + + public void setAgent(String agent) { + fAgent = agent; + } + + public String getClientName() { + return fClientName; + } + + public void setClientName(String clientName) { + fClientName = clientName; + } + + public String getFirstMessage() { + return fFirstMessage; + } + + public void setFirstMessage(String firstMessage) { + fFirstMessage = firstMessage; + } + + public boolean isCanBan() { + return fCanBan; + } + + public void setCanBan(boolean canBan) { + fCanBan = canBan; + } + + public boolean isCanOpen() { + return fCanOpen; + } + + public void setCanOpen(boolean canOpen) { + fCanOpen = canOpen; + } + + public boolean isCanView() { + return fCanView; + } + + public void setCanView(boolean canView) { + fCanView = canView; + } + + public long getWaitingTime() { + return fWaitingTime; + } + + public void setWaitingTime(long value) { + fWaitingTime = value; + } + + public int compareTo(MibewThread o) { + int res = index(this).compareTo(index(o)); + if(res != 0) { + return res; + } + return getClientName().compareTo(o.getClientName()); + } + + private Integer index(MibewThread th) { + if("prio".equals(th.getState())) { + return -1; + } + if("wait".equals(th.getState())) { + return 0; + } + return 1; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + boolean isChat = "chat".equals(getState()); + if(isChat) { + sb.append("(chat) "); + } + sb.append(getClientName()); + if(!isCanOpen() && isCanView()) { + sb.append(" (view only)"); + } + if(!isChat) { + sb.append(" - "); + sb.append(formatWaitingTime((System.currentTimeMillis() - getWaitingTime())/1000)); + } + return sb.toString(); + } + + private static String atLeast2(long i) { + return i < 10 ? "0" + i : Long.toString(i); + } + + private static String formatWaitingTime(long time) { + String s = atLeast2(time/60%60) + ":" + atLeast2(time%60); + if(time >= 3600) { + s = atLeast2(time/3600%24) + ":" + s; + if(time >= 24*3600) { + s = time/24/3600 + "d, " + s; + } + } + return s; + } +} diff --git a/src/mibewjava/org.mibew.api/src/org/mibew/api/MibewTracker.java b/src/mibewjava/org.mibew.api/src/org/mibew/api/MibewTracker.java new file mode 100644 index 00000000..8f48957e --- /dev/null +++ b/src/mibewjava/org.mibew.api/src/org/mibew/api/MibewTracker.java @@ -0,0 +1,85 @@ +package org.mibew.api; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.mibew.api.handlers.UpdateHandler; +import org.xml.sax.SAXException; + +/** + * @author inspirer + */ +public class MibewTracker { + + private final MibewConnection fConnection; + private final MibewTrackerListener fListener; + private long fSince = 0; + private long fLastUpdate = 0; + + private final Map fThreads; + + public MibewTracker(MibewConnection conn, MibewTrackerListener listener) { + this.fConnection = conn; + this.fListener = listener; + this.fThreads = new HashMap(); + } + + public void update() throws IOException, SAXException, ParserConfigurationException { + MibewResponse response = fConnection.request("operator/update.php", "since=" + fSince); + SAXParser sp = SAXParserFactory.newInstance().newSAXParser(); + UpdateHandler handler = new UpdateHandler(); + sp.parse(new ByteArrayInputStream(response.getResponse()), handler); + handleResponse(response, handler); + } + + private void handleResponse(MibewResponse response, UpdateHandler handler) throws IOException { + if (handler.getResponse() == UpdateHandler.UPD_ERROR) { + throw new IOException("Update error: " + handler.getMessage()); + } else if (handler.getResponse() == UpdateHandler.UPD_SUCCESS) { + fSince = handler.getRevision(); + fLastUpdate = handler.getTime(); + List threads = handler.getThreads(); + if (threads != null && threads.size() > 0) { + processUpdate(threads); + } + } else { + throw new IOException("Update error: " + response.getResponseText()); + } + } + + private void processUpdate(List updated) { + for (MibewThread mt : updated) { + MibewThread existing = fThreads.get(mt.getId()); + boolean isClosed = mt.getState().equals("closed"); + if (existing == null) { + if (!isClosed) { + fThreads.put(mt.getId(), mt); + fListener.threadCreated(mt); + } + } else if (isClosed) { + fThreads.remove(mt.getId()); + fListener.threadClosed(existing); + } else { + existing.updateFrom(mt); + fListener.threadChanged(existing); + } + } + } + + public long getLastUpdate() { + return fLastUpdate; + } + + public MibewThread[] getThreads() { + Collection values = fThreads.values(); + return values.toArray(new MibewThread[values.size()]); + } +} diff --git a/src/mibewjava/org.mibew.jabber/src/org/mibew/api/MibewTrackerListener.java b/src/mibewjava/org.mibew.api/src/org/mibew/api/MibewTrackerListener.java similarity index 100% rename from src/mibewjava/org.mibew.jabber/src/org/mibew/api/MibewTrackerListener.java rename to src/mibewjava/org.mibew.api/src/org/mibew/api/MibewTrackerListener.java diff --git a/src/mibewjava/org.mibew.jabber/src/org/mibew/api/Utils.java b/src/mibewjava/org.mibew.api/src/org/mibew/api/Utils.java similarity index 99% rename from src/mibewjava/org.mibew.jabber/src/org/mibew/api/Utils.java rename to src/mibewjava/org.mibew.api/src/org/mibew/api/Utils.java index bf79cb7f..ba8595d0 100644 --- a/src/mibewjava/org.mibew.jabber/src/org/mibew/api/Utils.java +++ b/src/mibewjava/org.mibew.api/src/org/mibew/api/Utils.java @@ -26,6 +26,4 @@ public class Utils { } return sb.toString(); } - - } diff --git a/src/mibewjava/org.mibew.jabber/src/org/mibew/api/handlers/LoginHandler.java b/src/mibewjava/org.mibew.api/src/org/mibew/api/handlers/LoginHandler.java similarity index 100% rename from src/mibewjava/org.mibew.jabber/src/org/mibew/api/handlers/LoginHandler.java rename to src/mibewjava/org.mibew.api/src/org/mibew/api/handlers/LoginHandler.java diff --git a/src/mibewjava/org.mibew.jabber/src/org/mibew/api/handlers/UpdateHandler.java b/src/mibewjava/org.mibew.api/src/org/mibew/api/handlers/UpdateHandler.java similarity index 51% rename from src/mibewjava/org.mibew.jabber/src/org/mibew/api/handlers/UpdateHandler.java rename to src/mibewjava/org.mibew.api/src/org/mibew/api/handlers/UpdateHandler.java index 58dc8b44..397327a3 100644 --- a/src/mibewjava/org.mibew.jabber/src/org/mibew/api/handlers/UpdateHandler.java +++ b/src/mibewjava/org.mibew.api/src/org/mibew/api/handlers/UpdateHandler.java @@ -15,14 +15,18 @@ import org.xml.sax.helpers.DefaultHandler; public class UpdateHandler extends DefaultHandler { public static final int UPD_ERROR = 1; - public static final int UPD_THREADS = 2; + public static final int UPD_SUCCESS = 2; + + private static final int STATE_READING_THREADS = 1; private int fResponse = 0; private String fMessage = ""; private long fRevision; private long fTime; private List fUpdated; - + + private int state = 0; + private Stack fPath = new Stack(); private MibewThread fCurrentThread; @@ -33,27 +37,34 @@ public class UpdateHandler extends DefaultHandler { if (fPath.size() == 0) { if (name.equals("error")) { fResponse = UPD_ERROR; - } else if (name.equals("threads")) { - fResponse = UPD_THREADS; - fTime = Long.parseLong(attributes.getValue("time")); - fRevision = Long.parseLong(attributes.getValue("revision")); + } else if (name.equals("update")) { + fResponse = UPD_SUCCESS; } else { throw new SAXException("unknown root element: " + name); } - } - if (fResponse == UPD_THREADS && fPath.size() == 1 - && name.equals("thread")) { - long id = Long.parseLong(attributes.getValue("id")); - String stateid = attributes.getValue("stateid"); - fCurrentThread = new MibewThread(id, stateid); - - if(!stateid.equals("closed")) { - fCurrentThread.fStateText = attributes.getValue("state"); - fCurrentThread.fCanOpen = booleanAttribute(attributes.getValue("canopen")); - fCurrentThread.fCanView = booleanAttribute(attributes.getValue("canview")); - fCurrentThread.fCanBan = booleanAttribute(attributes.getValue("canban")); + } else if(fResponse == UPD_SUCCESS) { + if(fPath.size() == 1) { + if (name.equals("threads")) { + fTime = Long.parseLong(attributes.getValue("time")); + fRevision = Long.parseLong(attributes.getValue("revision")); + fUpdated = new ArrayList(); + state = STATE_READING_THREADS; + } + /* ignore others for compatibility reasons */ + } + if (fPath.size() == 2 && state == STATE_READING_THREADS && name.equals("thread")) { + long id = Long.parseLong(attributes.getValue("id")); + String stateid = attributes.getValue("stateid"); + fCurrentThread = new MibewThread(id, stateid); + + if(!stateid.equals("closed")) { + fCurrentThread.setStateText(attributes.getValue("state")); + fCurrentThread.setCanOpen(booleanAttribute(attributes.getValue("canopen"))); + fCurrentThread.setCanView(booleanAttribute(attributes.getValue("canview"))); + fCurrentThread.setCanBan(booleanAttribute(attributes.getValue("canban"))); + } + } - } } catch (NumberFormatException ex) { throw new SAXException(ex.getMessage()); @@ -68,17 +79,23 @@ public class UpdateHandler extends DefaultHandler { return false; } + private long longValue(String value) throws SAXException { + try { + return Long.parseLong(value); + } catch(NumberFormatException ex) { + throw new SAXException(ex); + } + } + @Override public void endElement(String uri, String localName, String name) throws SAXException { fPath.pop(); - if (fResponse == UPD_THREADS && fPath.size() == 1 - && name.equals("thread")) { - if(fUpdated == null) { - fUpdated = new ArrayList(); - } + if (fResponse == UPD_SUCCESS && fPath.size() == 2 && state == STATE_READING_THREADS && name.equals("thread")) { fUpdated.add(fCurrentThread); fCurrentThread = null; + } else if(fPath.size() == 1 && state == STATE_READING_THREADS) { + state = 0; } } @@ -91,21 +108,26 @@ public class UpdateHandler extends DefaultHandler { throw new SAXException("unexpected characters"); } fMessage += new String(ch, start, length); - } else if (fResponse == UPD_THREADS) { - if(fCurrentThread == null || fPath.size() != 3) { + } else if (fResponse == UPD_SUCCESS && fCurrentThread != null) { + if(fCurrentThread == null || fPath.size() != 4) { throw new SAXException("unknown characters"); } String subvar = fPath.peek(); String value = new String(ch, start, length); if("name".equals(subvar)) { - fCurrentThread.fClientName += value; + fCurrentThread.setClientName(fCurrentThread.getClientName() + value); } else if("addr".equals(subvar)) { - fCurrentThread.fAddress += value; + fCurrentThread.setAddress(fCurrentThread.getAddress() + value); } else if("message".equals(subvar)) { - fCurrentThread.fFirstMessage += value; + fCurrentThread.setFirstMessage(fCurrentThread.getFirstMessage() + value); } else if("agent".equals(subvar)) { - fCurrentThread.fAgent += value; + fCurrentThread.setAgent(fCurrentThread.getAgent() + value); + } else if("modified".equals(subvar)) { + if(fCurrentThread.getWaitingTime() != 0) { + throw new SAXException("error: waiting time is already set"); + } + fCurrentThread.setWaitingTime(longValue(value) - fTime + System.currentTimeMillis()); } // TODO diff --git a/src/mibewjava/org.mibew.jabber/.classpath b/src/mibewjava/org.mibew.jabber/.classpath index 4257a5dc..89790263 100644 --- a/src/mibewjava/org.mibew.jabber/.classpath +++ b/src/mibewjava/org.mibew.jabber/.classpath @@ -4,5 +4,6 @@ + diff --git a/src/mibewjava/org.mibew.jabber/resources/Mibew Notifier.app/Contents/Info.plist b/src/mibewjava/org.mibew.jabber/resources/Mibew Notifier.app/Contents/Info.plist new file mode 100644 index 00000000..11b4d738 --- /dev/null +++ b/src/mibewjava/org.mibew.jabber/resources/Mibew Notifier.app/Contents/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleName + Mibew Notifier + CFBundleIdentifier + org.mibew.notifier + CFBundleVersion + 100.0 + CFBundleAllowMixedLocalizations + true + CFBundleExecutable + MibewNotifier + CFBundleDevelopmentRegion + English + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleGetInfoString + Mibew Notifier 1.0, build 17 Jan, 2010 + CFBundleInfoDictionaryVersion + 6.0 + CFBundleIconFile + mibew.icns + Java + + WorkingDirectory + $APP_PACKAGE/Contents/Resources/Java + VMOptions + -Xms16mm + MainClass + org.mibew.trayapp.NotifyApp + JVMVersion + 1.6+ + ClassPath + + $JAVAROOT/org.mibew.notifier.jar + $JAVAROOT/smackx.jar + $JAVAROOT/smackx-jingle.jar + $JAVAROOT/smackx-debug.jar + $JAVAROOT/smack.jar + + + + diff --git a/src/mibewjava/org.mibew.jabber/resources/Mibew Notifier.app/Contents/MacOS/MibewNotifier b/src/mibewjava/org.mibew.jabber/resources/Mibew Notifier.app/Contents/MacOS/MibewNotifier new file mode 100755 index 00000000..7035592f Binary files /dev/null and b/src/mibewjava/org.mibew.jabber/resources/Mibew Notifier.app/Contents/MacOS/MibewNotifier differ diff --git a/src/mibewjava/org.mibew.jabber/resources/Mibew Notifier.app/Contents/PkgInfo b/src/mibewjava/org.mibew.jabber/resources/Mibew Notifier.app/Contents/PkgInfo new file mode 100644 index 00000000..bd04210f --- /dev/null +++ b/src/mibewjava/org.mibew.jabber/resources/Mibew Notifier.app/Contents/PkgInfo @@ -0,0 +1 @@ +APPL???? \ No newline at end of file diff --git a/src/mibewjava/org.mibew.jabber/resources/Mibew Notifier.app/Contents/Resources/mibew.icns b/src/mibewjava/org.mibew.jabber/resources/Mibew Notifier.app/Contents/Resources/mibew.icns new file mode 100644 index 00000000..c9a253d6 Binary files /dev/null and b/src/mibewjava/org.mibew.jabber/resources/Mibew Notifier.app/Contents/Resources/mibew.icns differ diff --git a/src/mibewjava/org.mibew.jabber/resources/build.xml b/src/mibewjava/org.mibew.jabber/resources/build.xml new file mode 100644 index 00000000..d9312466 --- /dev/null +++ b/src/mibewjava/org.mibew.jabber/resources/build.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mibewjava/org.mibew.jabber/resources/images/mibew.gif b/src/mibewjava/org.mibew.jabber/resources/images/mibew.gif new file mode 100644 index 00000000..a78219c4 Binary files /dev/null and b/src/mibewjava/org.mibew.jabber/resources/images/mibew.gif differ diff --git a/src/mibewjava/org.mibew.jabber/resources/packdmg.sh b/src/mibewjava/org.mibew.jabber/resources/packdmg.sh new file mode 100755 index 00000000..f9b4da50 --- /dev/null +++ b/src/mibewjava/org.mibew.jabber/resources/packdmg.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +rm -rf *.dmg +hdiutil create mibew-notifier-temp.dmg -volname "Mibew Notifier 1.0" -fs HFS+ -srcfolder "Mibew Notifier.app" +hdiutil convert "mibew-notifier-temp.dmg" -format UDZO -imagekey zlib-level=9 -o "mibew-1.0.0.dmg" +rm mibew-notifier-temp.dmg diff --git a/src/mibewjava/org.mibew.jabber/src/org/mibew/api/MibewThread.java b/src/mibewjava/org.mibew.jabber/src/org/mibew/api/MibewThread.java deleted file mode 100644 index f9d31280..00000000 --- a/src/mibewjava/org.mibew.jabber/src/org/mibew/api/MibewThread.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.mibew.api; - -/** - * @author inspirer - */ -public class MibewThread { - - public final long fId; - public String fState; - public String fClientName = ""; - public String fAgent = ""; - public String fAddress = ""; - public String fFirstMessage = ""; - public boolean fCanOpen = false; - public boolean fCanView = false; - public boolean fCanBan = false; - public String fStateText; - - public MibewThread(long id, String state) { - fId = id; - fState = state; - } - - public void updateFrom(MibewThread updated) { - if(fId != updated.fId) { - throw new IllegalArgumentException("different threads"); - } - fState = updated.fState; - fClientName = updated.fClientName; - fAgent = updated.fAgent; - fAddress = updated.fAddress; - fFirstMessage = updated.fFirstMessage; - fCanOpen = updated.fCanOpen; - fCanView = updated.fCanView; - fCanBan = updated.fCanBan; - fStateText = updated.fStateText; - } -} diff --git a/src/mibewjava/org.mibew.jabber/src/org/mibew/api/MibewTracker.java b/src/mibewjava/org.mibew.jabber/src/org/mibew/api/MibewTracker.java deleted file mode 100644 index 96aa3188..00000000 --- a/src/mibewjava/org.mibew.jabber/src/org/mibew/api/MibewTracker.java +++ /dev/null @@ -1,85 +0,0 @@ -package org.mibew.api; - -import java.io.ByteArrayInputStream; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; - -import org.mibew.api.handlers.UpdateHandler; - -/** - * @author inspirer - */ -public class MibewTracker { - - private final MibewConnection fConnection; - private final MibewTrackerListener fListener; - private long fSince = 0; - private long fLastUpdate = 0; - - private final Map fThreads; - - public MibewTracker(MibewConnection conn, MibewTrackerListener listener) { - this.fConnection = conn; - this.fListener = listener; - this.fThreads = new HashMap(); - } - - public void track() throws InterruptedException { - for(int i = 0; i < 5; i++) { - try { - MibewResponse response = fConnection.request("operator/update.php", "since="+fSince); - SAXParser sp = SAXParserFactory.newInstance().newSAXParser(); - UpdateHandler handler = new UpdateHandler(); - sp.parse(new ByteArrayInputStream(response.getResponse()), handler); - handleResponse(response, handler); - } catch(Exception e) { - System.err.println("update exception: " + e.getMessage()); - } - Thread.sleep(1000); - } - } - - private void handleResponse(MibewResponse response, UpdateHandler handler) { - if(handler.getResponse() == UpdateHandler.UPD_ERROR) { - System.out.println("Update error: " + handler.getMessage()); - } else if(handler.getResponse() == UpdateHandler.UPD_THREADS) { - System.out.println("Updated.... " + handler.getRevision()); - fSince = handler.getRevision(); - fLastUpdate = handler.getTime(); - List threads = handler.getThreads(); - if(threads != null && threads.size() > 0) { - processUpdate(threads); - } - } else { - System.out.println("Update error"); - System.out.println(response.getResponseText()); - } - } - - private void processUpdate(List updated) { - for(MibewThread mt : updated) { - MibewThread existing = fThreads.get(mt.fId); - boolean isClosed = mt.fState.equals("closed"); - if(existing == null) { - if(!isClosed) { - fThreads.put(mt.fId, mt); - fListener.threadCreated(mt); - } - } else if(isClosed) { - fThreads.remove(mt.fId); - fListener.threadClosed(existing); - } else { - existing.updateFrom(mt); - fListener.threadChanged(existing); - } - } - } - - public long getLastUpdate() { - return fLastUpdate; - } -} diff --git a/src/mibewjava/org.mibew.jabber/src/org/mibew/jabber/Application.java b/src/mibewjava/org.mibew.jabber/src/org/mibew/jabber/Application.java index 961c3970..8733ddbe 100644 --- a/src/mibewjava/org.mibew.jabber/src/org/mibew/jabber/Application.java +++ b/src/mibewjava/org.mibew.jabber/src/org/mibew/jabber/Application.java @@ -39,7 +39,7 @@ public class Application { } }); - MibewConnection conn = new MibewConnection("http://localhost:8080/webim/", "admin", ""); + MibewConnection conn = new MibewConnection("http://localhost:8080/webim/", "admin", "1"); if(!conn.connect()) { System.err.println("Wrong server, login or password."); return; @@ -49,14 +49,14 @@ public class Application { @Override public void threadCreated(MibewThread thread) { try { - chat.sendMessage(thread.fId + ": " + thread.fAddress + " " + thread.fClientName); + chat.sendMessage(thread.getId() + ": " + thread.getAddress() + " " + thread.getClientName()); } catch (XMPPException e) { e.printStackTrace(); } } }); - mt.track(); + //mt.track(); connection.disconnect(); } diff --git a/src/mibewjava/org.mibew.notifier/.classpath b/src/mibewjava/org.mibew.notifier/.classpath new file mode 100644 index 00000000..78fdd7f0 --- /dev/null +++ b/src/mibewjava/org.mibew.notifier/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/mibewjava/org.mibew.notifier/.project b/src/mibewjava/org.mibew.notifier/.project new file mode 100644 index 00000000..4a130331 --- /dev/null +++ b/src/mibewjava/org.mibew.notifier/.project @@ -0,0 +1,17 @@ + + + org.mibew.notifier + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/src/mibewjava/org.mibew.notifier/libs/src.zip b/src/mibewjava/org.mibew.notifier/libs/src.zip new file mode 100644 index 00000000..708c8d33 Binary files /dev/null and b/src/mibewjava/org.mibew.notifier/libs/src.zip differ diff --git a/src/mibewjava/org.mibew.notifier/libs/swt-debug.jar b/src/mibewjava/org.mibew.notifier/libs/swt-debug.jar new file mode 100644 index 00000000..a369b688 Binary files /dev/null and b/src/mibewjava/org.mibew.notifier/libs/swt-debug.jar differ diff --git a/src/mibewjava/org.mibew.notifier/libs/swt.jar b/src/mibewjava/org.mibew.notifier/libs/swt.jar new file mode 100644 index 00000000..9a326dfc Binary files /dev/null and b/src/mibewjava/org.mibew.notifier/libs/swt.jar differ diff --git a/src/mibewjava/org.mibew.notifier/org.mibew.notifier.iml b/src/mibewjava/org.mibew.notifier/org.mibew.notifier.iml new file mode 100644 index 00000000..5efe060c --- /dev/null +++ b/src/mibewjava/org.mibew.notifier/org.mibew.notifier.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/mibewjava/org.mibew.notifier/src/mibew.ini b/src/mibewjava/org.mibew.notifier/src/mibew.ini new file mode 100644 index 00000000..3564fbaa --- /dev/null +++ b/src/mibewjava/org.mibew.notifier/src/mibew.ini @@ -0,0 +1,5 @@ +# Mibew parameters + +mibew.host=http://localhost:8080/webim/ +mibew.login=admin +mibew.password= diff --git a/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/BrowserUtil.java b/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/BrowserUtil.java new file mode 100644 index 00000000..6ee074bf --- /dev/null +++ b/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/BrowserUtil.java @@ -0,0 +1,42 @@ +package org.mibew.notifier; + +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.Arrays; + +public class BrowserUtil { + + static final String[] browsers = { "firefox", "opera", "konqueror", "epiphany", "seamonkey", "galeon", + "kazehakase", "mozilla", "netscape" }; + + /** + * Bare Bones Browser Launch + * Version 2.0 (May 26, 2009) + * By Dem Pilafian + * @param url + */ + public static void openURL(String url) throws IOException { + String osName = System.getProperty("os.name"); + try { + if (osName.startsWith("Mac OS")) { + Class fileMgr = Class.forName("com.apple.eio.FileManager"); + Method openURL = fileMgr.getDeclaredMethod("openURL", new Class[] { String.class }); + openURL.invoke(null, new Object[] { url }); + } else if (osName.startsWith("Windows")) { + Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url); + } else { // assume Unix or Linux + boolean found = false; + for (String browser : browsers) + if (!found) { + found = Runtime.getRuntime().exec(new String[] { "which", browser }).waitFor() == 0; + if (found) + Runtime.getRuntime().exec(new String[] { browser, url }); + } + if (!found) + throw new Exception(Arrays.toString(browsers)); + } + } catch (Throwable th) { + throw new IOException("Error attempting to launch web browser\n" + th.toString()); + } + } +} \ No newline at end of file diff --git a/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/ConsoleApp.java b/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/ConsoleApp.java new file mode 100644 index 00000000..005b52e7 --- /dev/null +++ b/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/ConsoleApp.java @@ -0,0 +1,28 @@ +package org.mibew.notifier; + +import org.mibew.api.MibewAgent; +import org.mibew.api.MibewAgentListener; + +public class ConsoleApp { + + public static void main(String[] args) { + Options options = new Options(args); + if(!options.load()) { + return; + } + + MibewAgent agent = new MibewAgent(options.getAgentOptions(), new MibewAgentListener() { + @Override + protected void onlineStateChanged(boolean isOnline) { + System.out.println("now " + (isOnline ? "online" : "offline")); + } + }); + agent.launch(); + try { + Thread.sleep(3500); + } catch (InterruptedException e) { + } + + agent.stop(); + } +} diff --git a/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/MibewTray.java b/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/MibewTray.java new file mode 100644 index 00000000..bd408425 --- /dev/null +++ b/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/MibewTray.java @@ -0,0 +1,140 @@ +package org.mibew.notifier; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.*; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.MenuItem; +import org.mibew.api.MibewAgent; +import org.mibew.api.MibewAgentListener; +import org.mibew.api.MibewThread; + +import java.awt.*; +import java.io.IOException; + +public class MibewTray extends MibewAgentListener { + + private volatile boolean isStopped = false; + + private Image fImageOn; + private Image fImageOff; + private TrayItem fItem; + private Menu fMenu; + private MibewAgent fAgent; + + void initTray(Display display, Shell shell, MibewAgent agent) { + fAgent = agent; + fImageOn = new Image(display, getClass().getClassLoader().getResourceAsStream("org/mibew/notifier/tray_on.png")); + fImageOff = new Image(display, getClass().getClassLoader().getResourceAsStream("org/mibew/notifier/tray_off.png")); + + final Tray tray = display.getSystemTray(); + if (tray == null) { + System.out.println("The system tray is not available"); + } else { + fItem = new TrayItem(tray, SWT.NONE); + fItem.setToolTipText("SWT TrayItem"); + fItem.addListener(SWT.Show, new Listener() { + public void handleEvent(Event event) { + System.out.println("show"); + } + }); + fItem.addListener(SWT.Hide, new Listener() { + public void handleEvent(Event event) { + System.out.println("hide"); + } + }); + fMenu = new Menu(shell, SWT.POP_UP); + for (int i = 0; i < 8; i++) { + MenuItem mi = new MenuItem(fMenu, SWT.PUSH); + mi.setText("Item" + i); + mi.addListener(SWT.Selection, new Listener() { + public void handleEvent(Event event) { + System.out.println("selection " + event.widget); + } + }); + } + Listener listener = new Listener() { + public void handleEvent(Event event) { + fMenu.setVisible(true); + } + }; + fItem.addListener(SWT.MenuDetect, listener); + fItem.addListener(SWT.Selection, listener); + fItem.setImage(fImageOff); + } + shell.setBounds(50, 50, 300, 200); + //shell.open(); + } + + @Override + protected synchronized void onlineStateChanged(final boolean isOnline) { + if(isStopped) + return; + + Display.getDefault().asyncExec(new Runnable() { + public void run() { + if(isStopped) + return; + + fItem.setImage(isOnline ? fImageOn : fImageOff); + } + }); + } + + @Override + protected synchronized void updated(final MibewThread[] all, final MibewThread[] created) { + if(isStopped) + return; + + Display.getDefault().asyncExec(new Runnable() { + public void run() { + if(isStopped) + return; + + for (MenuItem menuItem : fMenu.getItems()) { + menuItem.dispose(); + } + for(MibewThread m : all) { + MenuItem mi = new MenuItem(fMenu, SWT.PUSH); + mi.setText(m.getClientName()); + mi.addListener(SWT.Selection, new LinkActionListener(null, fAgent.getOptions().getUrl() + "operator/agent.php?thread=" + m.getId())); + } + + if(created.length == 1) { + fItem.setToolTipText(created[0].getClientName() + "\n" + created[0].getFirstMessage()); + } else if(created.length > 1) { + fItem.setToolTipText("New " + created.length + " visitors"); + } + + } + }); + } + + synchronized void dispose() { + isStopped = true; + fItem.dispose(); + fImageOn.dispose(); + fImageOff.dispose(); + } + + private static class LinkActionListener implements Listener { + private final Shell shell; + private final String link; + + public LinkActionListener(Shell shell, String link) { + this.shell = shell; + this.link = link; + } + + public void handleEvent(Event event) { + try { + BrowserUtil.openURL(link); + } catch (IOException e1) { + MessageBox messageBox = new MessageBox(shell, SWT.OK | SWT.ICON_ERROR); + messageBox.setText("Browser error"); //$NON-NLS-1$ + messageBox.setMessage(e1.getMessage()); + messageBox.open(); + } + } + }} diff --git a/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/NotifyApp.java b/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/NotifyApp.java new file mode 100644 index 00000000..ece7777d --- /dev/null +++ b/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/NotifyApp.java @@ -0,0 +1,34 @@ +package org.mibew.notifier; + +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.mibew.api.MibewAgent; +import org.mibew.notifier.Options.JOptions; + +public class NotifyApp { + + public static void main(String[] args) { + Display display = new Display(); + Shell shell = new Shell(display); + + Options options = new JOptions(shell, args); + if (!options.load()) { + return; + } + + MibewTray tray = new MibewTray(); + MibewAgent agent = new MibewAgent(options.getAgentOptions(), tray); + agent.launch(); + + tray.initTray(display, shell, agent); + + while (!shell.isDisposed()) { + if (!display.readAndDispatch()) + display.sleep(); + } + tray.dispose(); + agent.stop(); + display.dispose(); + System.exit(0); + } +} diff --git a/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/Options.java b/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/Options.java new file mode 100644 index 00000000..a190c98d --- /dev/null +++ b/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/Options.java @@ -0,0 +1,62 @@ +package org.mibew.notifier; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.MessageBox; +import org.eclipse.swt.widgets.Shell; +import org.mibew.api.MibewAgentOptions; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public class Options { + + private MibewAgentOptions agentOptions; + private Properties myProperties; + + public Options(String[] args) { + } + + public boolean load() { + try { + InputStream is = getClass().getClassLoader().getResourceAsStream("mibew.ini"); + if (is != null) { + myProperties = new Properties(); + myProperties.load(is); + agentOptions = MibewAgentOptions.create(myProperties); + return true; + } else { + handleError("cannot find mibew.ini"); + } + } catch (IOException e) { + handleError(e.getMessage()); + } + return false; + } + + protected void handleError(String message) { + System.err.println(message); + } + + public MibewAgentOptions getAgentOptions() { + return agentOptions; + } + + public static class JOptions extends Options { + + private final Shell fShell; + + public JOptions(Shell shell, String[] args) { + super(args); + fShell = shell; + } + + @Override + protected void handleError(final String message) { + MessageBox messageBox = new MessageBox(fShell, SWT.OK | SWT.ICON_ERROR); + messageBox.setText("Options error"); //$NON-NLS-1$ + messageBox.setMessage(message); + messageBox.open(); + } + } +} diff --git a/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/tray_off.png b/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/tray_off.png new file mode 100644 index 00000000..daf8251b Binary files /dev/null and b/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/tray_off.png differ diff --git a/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/tray_on.png b/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/tray_on.png new file mode 100644 index 00000000..1e8f871a Binary files /dev/null and b/src/mibewjava/org.mibew.notifier/src/org/mibew/notifier/tray_on.png differ