summaryrefslogtreecommitdiff
path: root/protocols/Yahoo
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Yahoo')
-rw-r--r--protocols/Yahoo/Docs/License.txt340
-rw-r--r--protocols/Yahoo/Docs/ReadMe.txt49
-rw-r--r--protocols/Yahoo/Docs/features.txt93
-rw-r--r--protocols/Yahoo/Docs/translation.txt104
-rw-r--r--protocols/Yahoo/Makefile.win76
-rw-r--r--protocols/Yahoo/Yahoo.dep475
-rw-r--r--protocols/Yahoo/Yahoo.dsp350
-rw-r--r--protocols/Yahoo/Yahoo.mak915
-rw-r--r--protocols/Yahoo/Yahoo.rc182
-rw-r--r--protocols/Yahoo/Yahoo.sln29
-rw-r--r--protocols/Yahoo/Yahoo.vcproj556
-rw-r--r--protocols/Yahoo/Yahoo_10.vcxproj640
-rw-r--r--protocols/Yahoo/Yahoo_10.vcxproj.filters137
-rw-r--r--protocols/Yahoo/Yahoo_8.vcproj771
-rw-r--r--protocols/Yahoo/Yahoo_9.vcproj1361
-rw-r--r--protocols/Yahoo/avatar.cpp920
-rw-r--r--protocols/Yahoo/avatar.h60
-rw-r--r--protocols/Yahoo/chat.cpp72
-rw-r--r--protocols/Yahoo/chat.h42
-rw-r--r--protocols/Yahoo/file_transfer.cpp908
-rw-r--r--protocols/Yahoo/file_transfer.h50
-rw-r--r--protocols/Yahoo/http_gateway.cpp84
-rw-r--r--protocols/Yahoo/http_gateway.h24
-rw-r--r--protocols/Yahoo/icolib.cpp86
-rw-r--r--protocols/Yahoo/icos/address_book.icobin0 -> 2550 bytes
-rw-r--r--protocols/Yahoo/icos/calendar.icobin0 -> 2550 bytes
-rw-r--r--protocols/Yahoo/icos/inbox.icobin0 -> 2550 bytes
-rw-r--r--protocols/Yahoo/icos/invite.icobin0 -> 2550 bytes
-rw-r--r--protocols/Yahoo/icos/profile.icobin0 -> 2550 bytes
-rw-r--r--protocols/Yahoo/icos/refresh.icobin0 -> 2038 bytes
-rw-r--r--protocols/Yahoo/icos/set_status.icobin0 -> 2550 bytes
-rw-r--r--protocols/Yahoo/icos/yahoo.icobin0 -> 6830 bytes
-rw-r--r--protocols/Yahoo/ignore.cpp66
-rw-r--r--protocols/Yahoo/ignore.h16
-rw-r--r--protocols/Yahoo/im.cpp277
-rw-r--r--protocols/Yahoo/im.h25
-rw-r--r--protocols/Yahoo/libyahoo2/Docs/AUTHORS10
-rw-r--r--protocols/Yahoo/libyahoo2/Docs/COPYING340
-rw-r--r--protocols/Yahoo/libyahoo2/Docs/ChangeLog280
-rw-r--r--protocols/Yahoo/libyahoo2/Docs/NEWS88
-rw-r--r--protocols/Yahoo/libyahoo2/Docs/README442
-rw-r--r--protocols/Yahoo/libyahoo2/Docs/TODO8
-rw-r--r--protocols/Yahoo/libyahoo2/Docs/ymsg-9.txt326
-rw-r--r--protocols/Yahoo/libyahoo2/config.h71
-rw-r--r--protocols/Yahoo/libyahoo2/crypt.c205
-rw-r--r--protocols/Yahoo/libyahoo2/libyahoo2.c6662
-rw-r--r--protocols/Yahoo/libyahoo2/yahoo2.h230
-rw-r--r--protocols/Yahoo/libyahoo2/yahoo2_callbacks.h891
-rw-r--r--protocols/Yahoo/libyahoo2/yahoo2_types.h432
-rw-r--r--protocols/Yahoo/libyahoo2/yahoo_debug.h58
-rw-r--r--protocols/Yahoo/libyahoo2/yahoo_httplib.c455
-rw-r--r--protocols/Yahoo/libyahoo2/yahoo_httplib.h49
-rw-r--r--protocols/Yahoo/libyahoo2/yahoo_list.c236
-rw-r--r--protocols/Yahoo/libyahoo2/yahoo_list.h74
-rw-r--r--protocols/Yahoo/libyahoo2/yahoo_util.c161
-rw-r--r--protocols/Yahoo/libyahoo2/yahoo_util.h109
-rw-r--r--protocols/Yahoo/links.cpp184
-rw-r--r--protocols/Yahoo/m_assocmgr.h301
-rw-r--r--protocols/Yahoo/m_folders.h282
-rw-r--r--protocols/Yahoo/main.cpp198
-rw-r--r--protocols/Yahoo/options.cpp397
-rw-r--r--protocols/Yahoo/options.h22
-rw-r--r--protocols/Yahoo/proto.cpp933
-rw-r--r--protocols/Yahoo/proto.h329
-rw-r--r--protocols/Yahoo/resource.h91
-rw-r--r--protocols/Yahoo/search.cpp207
-rw-r--r--protocols/Yahoo/search.h24
-rw-r--r--protocols/Yahoo/server.cpp224
-rw-r--r--protocols/Yahoo/services.cpp577
-rw-r--r--protocols/Yahoo/user_info.cpp141
-rw-r--r--protocols/Yahoo/util.cpp370
-rw-r--r--protocols/Yahoo/version.h5
-rw-r--r--protocols/Yahoo/version.rc36
-rw-r--r--protocols/Yahoo/webcam.cpp59
-rw-r--r--protocols/Yahoo/webcam.h31
-rw-r--r--protocols/Yahoo/yahoo.cpp1845
-rw-r--r--protocols/Yahoo/yahoo.dev539
-rw-r--r--protocols/Yahoo/yahoo.h155
-rw-r--r--protocols/Yahoo/yahoo.mdsp145
79 files changed, 26930 insertions, 0 deletions
diff --git a/protocols/Yahoo/Docs/License.txt b/protocols/Yahoo/Docs/License.txt
new file mode 100644
index 0000000000..7f1161073d
--- /dev/null
+++ b/protocols/Yahoo/Docs/License.txt
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/protocols/Yahoo/Docs/ReadMe.txt b/protocols/Yahoo/Docs/ReadMe.txt
new file mode 100644
index 0000000000..4c3c50b6b9
--- /dev/null
+++ b/protocols/Yahoo/Docs/ReadMe.txt
@@ -0,0 +1,49 @@
+=================================================================================
+Yahoo 0.3.0.9 plugin for Miranda IM
+
+Copyright (C) 2003-6 Gennady Feldman (aka Gena01)
+Copyright (C) 2003-4 Laurent Marechal (aka Peorth)
+
+Thanks to the Miranda developers for their code contributions, suggestions, ideas
+and support.
+
+Download: http://www.miranda-im.org/download/details.php?action=viewfile&id=1248
+Support: http://forums.miranda-im.org/
+To report Bugs: http://bugs.miranda-im.org/
+
+=================================================================================
+
+Table of Contents:
+
+1. What's New
+2. Installation
+3. Troubleshooting
+
+ * * *
+
+1. What's New:
+--------------
++ Complete avatar support.
++ Yahoo Calendar integration. (links in Main Menu)
++ Yahoo Calendar Reminders via IM now work. (You need to have Popup plugin installed)
+x Lots of other fixes and improvements.
+
+2. Installation:
+----------------
+a. Close Miranda if you have it open.
+b. Extract the zip file into a temporary folder.
+c. Copy yahoo.dll to Miranda\Plugins folder.
+d. Start Miranda.
+e. Open Options->Network->Yahoo and enter your login information.
+f. If you have the popup plugin:
+ Go into the Options->Popups->Yahoo menu of Miranda and set your preferences.
+
+3. Troubleshooting:
+-------------------
+a. Check your settings/options. Make sure they are set properly.
+b. If some weird stuff or crashes happen try to disable other plugins and minimize
+ the list of plugins that might cause the problem.
+c. Check your firewall logs/settings. In some cases it could be a blocked connection by the
+ firewall/proxy that's causing the problem.
+d. Enable "Network Log" and try to browse through it.
+e. If you can't figure it out post a thread in the forums [see link above for Support]
diff --git a/protocols/Yahoo/Docs/features.txt b/protocols/Yahoo/Docs/features.txt
new file mode 100644
index 0000000000..a110af643c
--- /dev/null
+++ b/protocols/Yahoo/Docs/features.txt
@@ -0,0 +1,93 @@
+This is a list of features that are/might/will be possible with the current
+LibYahoo2 library. Not all of them are implemented or will be implemented.
+Some (like conferencing or chat) need to have some support into Miranda core
+and this will not be implemented until this support will be present.
+
+The following list is borrowed from the official libyahoo2 site
+ (http://libyahoo2.sourceforge.net/)
+
+[D] Implemented in the plugin
+[P] Part implemented in the plugin
+[-] Not used/possible/implemented in Miranda at 'this' time
+[ ] Not yet implemented
+
+Note that some Yahoo feature are already existing under Miranda and
+so are not in the plugin. In this list this will be shown as 'in the
+plugin'
+
+[D] Messaging:
+[D] Sending messages (UTF-8 supported via LibYhaoo2)
+[D] Send typing notification
+[D] Receive typing notification
+
+[P] Buddy list management:
+[D] Add buddies
+[D] Remove buddies
+[-] Change buddy group
+[D] Ignore buddy
+[D] Unignore buddy
+[D] Reject buddy
+[D] Buddy status updates
+[-] Group renaming
+
+[P] Yahoo Address book support
+[D] Loading Yahoo Address Book
+[ ] Don't load the whole YAB every time. Only track changes.
+[ ] Parse lots of new YAB fields. (We only support a small subset)
+[ ] Update YAB according to current miranda database settings.(Like Nick, etc)
+[ ] Delete YAB entry when removing a buddy from our buddy list.(Optionally?)
+[ ] Create new YAB entry when adding a new buddy to buddy list.
+
+[D] Changing Status:
+[D] Regular status messages
+[D] Custom away/non-away status messages
+
+[-] Conferencing:
+[-] Create new conference
+[-] Join existing conference
+[-] Invite members to join existing conference
+[-] Decline joining a conference
+[-] Leave a conference
+[-] Send message to conference
+
+[-] Yahoo Chat
+[-] List chatrooms
+[-] Join/leave a chatroom
+[-] Chat :)
+
+[-] Webcam support
+[-] Support for viewing other people's webcams
+[-] Support for broadcasting webcam images
+
+[P] File Transfer:
+[ ] Send file directly to another client
+[D] Send file via Yahoo file transfer server
+[D] Receive files via Yahoo file transfer server
+[D] Receive files directly from another client
+
+[D] Mail Notification
+
+[-] Identities
+[-] Activate/Deactivate an identity
+[-] Send messages from a particular identity
+[-] Conferencing with a particular identity
+
+[P] Avatar Support
+[D] Receive avatars from your buddies.
+[D] Set your own avatar
+[ ] Flash avatars [Receive/Set]
+
+[P] Stealth Settings
+[D] Hide your own online status from certain buddies.
+[ ] Show yourself online to certain buddies while being invisible to everybody else.
+
+[D] ServerSide IgnoreList
+[D] Add yahoo id to server ignore list.
+[D] Remove yahoo id from server ignore list.
+[D] Drop IMs from ignored contacts.
+
+[D] Yahoo Calendar support
+[D] Yahoo Calendar link in main menu w/ auto-login
+[D] Yahoo Calendar Reminders via IM.
+
+libyahoo2 does not yet have support for Voice messages, nor for IMvironments.
diff --git a/protocols/Yahoo/Docs/translation.txt b/protocols/Yahoo/Docs/translation.txt
new file mode 100644
index 0000000000..250f07d6eb
--- /dev/null
+++ b/protocols/Yahoo/Docs/translation.txt
@@ -0,0 +1,104 @@
+Miranda Language Pack Version 1
+Locale: 0809
+Authors: Gennady Feldman
+Author-email: gena01@miranda-im.org
+Last-Modified-Using: Miranda IM 0.5
+Plugins-included:
+
+; Generated by lpgen on Tue Jun 6 11:47:43 2006
+; Translations: 82
+
+; avatar.c
+;[Your png2dib.dll is either obsolete or damaged. ]
+;[Error]
+;[Avatar]
+
+; main.c
+;[mail]
+
+; options.c
+;[Network]
+;[You need to be connected to Yahoo to add to Ignore List.]
+;[Yahoo Ignore]
+;[Please enter a valid buddy name to ignore.]
+;[The buddy is already on your ignore list. ]
+;[You need to be connected to Yahoo to remove from the Ignore List.]
+;[Please select a buddy on the ignore list to remove.]
+;[The changes you have made require you to restart Miranda IM before they take effect]
+;[YAHOO Options]
+;[The changes you have made require you to reconnect to the Yahoo network before they take effect]
+
+; services.c
+;[ID]
+;[Please enter your yahoo id in Options/Network/Yahoo]
+;[Please enter your yahoo password in Options/Network/Yahoo]
+;[Yahoo Login Error]
+;[The message send timed out.]
+;[Message is too long: Yahoo messages are limited by 800 UTF8 chars]
+;[You need to be connected to set the custom message]
+;[You need to be connected to refresh your buddy list]
+;[Set &Custom Status]
+;[&My Profile]
+;[&Yahoo Mail]
+;[&Address Book]
+;[&Calendar]
+;[&Refresh]
+;[&Show Profile]
+
+; yahoo.c
+;[[miranda] Got conference invite to room: %s with msg: %s]
+;[I am sorry, but i can't join your conference since this feature is not currently implemented in my client.]
+;[Calendar Reminder]
+;[Yahoo Error]
+;[%s has rejected your request and sent the following message:]
+;[New Mail]
+;[You Have %i unread msgs]
+;[New Mail (%i msgs)]
+;[From: %s\nSubject: %s]
+;[[miranda] Got webcam invite. (not currently supported)]
+;[Yahoo Ping Error]
+;[Could not log into Yahoo service - username not recognised. Please verify that your username is correctly typed.]
+;[Could not log into Yahoo service - password incorrect. Please verify that your username and password are correctly typed.]
+;[Could not log into Yahoo service. Your account has been locked.\nVisit %s to reactivate it.]
+;[You have been logged out of the yahoo service, possibly due to a duplicate login.]
+;[Could not connect to the Yahoo service. Check your server/port and proxy settings.]
+;[Could not log in, unknown reason: %d.]
+;[unknown error %s]
+;[custom error %s]
+;[%s is not available for the conference]
+;[%s is already ignored]
+;[%s is not in the ignore list]
+;[%s is in buddy list - cannot ignore ]
+;[system error %s]
+;[server connection error %s]
+;[Please enter Yahoo server to Connect to in Options.]
+
+; Yahoo.rc
+;[Create a new Yahoo account using the Yahoo website]
+;[Yahoo Japan]
+;[Disable UTF8 encoding]
+;[Disable main menu (needs restart)]
+;[Use Yahoo Address Book (YAB)]
+;[Show Avatars]
+;[AutoLogin to Yahoo ]
+;[Display Yahoo notifications]
+;[Show Errors]
+;[Show as busy]
+;[Share Avatar]
+;[OK]
+;[Reset]
+;[Add]
+;[Remove]
+;[Cancel]
+;[Set]
+;[Delete]
+;[Login server:]
+;[Port:]
+;[ID:]
+;[Password:]
+;[Nick:]
+;[Yahoo]
+;[Expert]
+;[Yahoo Ignore List]
+;[Set Custom Status]
+
diff --git a/protocols/Yahoo/Makefile.win b/protocols/Yahoo/Makefile.win
new file mode 100644
index 0000000000..270810c554
--- /dev/null
+++ b/protocols/Yahoo/Makefile.win
@@ -0,0 +1,76 @@
+#
+# Makefile for Miranda IM written by Gennady Feldman <gena01@miranda-im.org>
+#
+#
+
+#
+# List the required object files.
+#
+
+OBJ = http_gateway.o \
+ main.o \
+ options.o \
+ server.o \
+ services.o \
+ util.o \
+ yahoo.o \
+ avatar.o \
+ chat.o \
+ webcam.o \
+ icolib.o \
+ ignore.o \
+ file_transfer.o \
+ im.o \
+ search.o \
+ proto.o \
+ libyahoo2\crypt.o \
+ libyahoo2\libyahoo2.o \
+ libyahoo2\yahoo_httplib.o \
+ libyahoo2\yahoo_list.o \
+ libyahoo2\yahoo_util.o
+
+RES = Yahoo.res
+
+LIB = -lcomdlg32 -lgdi32 -lwsock32
+
+CC = gcc
+RC = windres
+RM = del
+
+ifdef DEBUG
+BIN = ..\..\bin\debug\plugins\Yahoo.dll
+else
+BIN = ..\..\bin\release\plugins\Yahoo.dll
+endif
+
+DEFINES = -DHAVE_CONFIG_H
+ifdef DEBUG
+DEFINES := $(DEFINES) -D_DEBUG
+endif
+
+
+ifdef DEBUG
+CFLAGS = -g $(DEFINES) -I../../include -mwindows -c
+LDFLAGS = -shared
+else
+CFLAGS = -Os $(DEFINES) -I../../include -mwindows -c
+LDFLAGS = -shared -s
+endif
+
+all : ${BIN}
+
+${BIN} : $(OBJ) $(RES)
+ g++ $(LDFLAGS) -o $(BIN) $(OBJ) $(RES) $(LIB) -Wl
+
+$(RES) : $(RES:.res=.rc) $(RES:.res=.h) Makefile.win
+ $(RC) -O COFF -o $(RES) -i $(RES:.res=.rc)
+
+.cpp.o:
+ g++ $(CFLAGS) $< -o $@
+
+.c.o:
+ gcc $(CFLAGS) $< -o $@
+
+
+clean :
+ -$(RM) $(OBJ) $(RES) ${BIN}
diff --git a/protocols/Yahoo/Yahoo.dep b/protocols/Yahoo/Yahoo.dep
new file mode 100644
index 0000000000..1b360623b7
--- /dev/null
+++ b/protocols/Yahoo/Yahoo.dep
@@ -0,0 +1,475 @@
+# Microsoft Developer Studio Generated Dependency File, included by Yahoo.mak
+
+.\libyahoo2\crypt.c : \
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ ".\libyahoo2\config.h"\
+ ".\libyahoo2\yahoo_util.h"\
+
+
+.\libyahoo2\libyahoo2.c : \
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ ".\libyahoo2\config.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_debug.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+
+
+.\libyahoo2\yahoo_httplib.c : \
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ ".\libyahoo2\config.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_debug.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+
+
+.\libyahoo2\yahoo_list.c : \
+ ".\libyahoo2\yahoo_list.h"\
+
+
+.\libyahoo2\yahoo_util.c : \
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ ".\libyahoo2\config.h"\
+ ".\libyahoo2\yahoo_util.h"\
+
+
+.\avatar.cpp : \
+ "..\..\include\m_avatars.h"\
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\win2k.h"\
+ ".\avatar.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+ ".\m_folders.h"\
+ ".\resource.h"\
+
+
+.\chat.cpp : \
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_message.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\win2k.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+
+
+.\file_transfer.cpp : \
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\win2k.h"\
+ ".\file_transfer.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+
+
+.\http_gateway.cpp : \
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\win2k.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+
+
+.\icolib.cpp : \
+ "..\..\include\m_icolib.h"\
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\win2k.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+ ".\resource.h"\
+
+
+.\ignore.cpp : \
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\win2k.h"\
+ ".\ignore.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+
+
+.\im.cpp : \
+ "..\..\include\m_avatars.h"\
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\win2k.h"\
+ ".\avatar.h"\
+ ".\ignore.h"\
+ ".\im.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+
+
+.\links.cpp : \
+ "..\..\include\m_addcontact.h"\
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_message.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\win2k.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+ ".\m_assocmgr.h"\
+ ".\resource.h"\
+
+
+.\main.cpp : \
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\m_version.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\win2k.h"\
+ ".\http_gateway.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+ ".\resource.h"\
+ ".\version.h"\
+
+
+.\options.cpp : \
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_options.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_popup.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\win2k.h"\
+ ".\ignore.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+ ".\resource.h"\
+
+
+.\proto.cpp : \
+ "..\..\include\m_idle.h"\
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_options.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_skin.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_userinfo.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\win2k.h"\
+ ".\file_transfer.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+ ".\resource.h"\
+
+
+.\search.cpp : \
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\win2k.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+ ".\resource.h"\
+
+
+.\server.cpp : \
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\win2k.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+
+
+.\services.cpp : \
+ "..\..\include\m_avatars.h"\
+ "..\..\include\m_idle.h"\
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_options.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_popup.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_skin.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\win2k.h"\
+ ".\avatar.h"\
+ ".\file_transfer.h"\
+ ".\im.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+ ".\resource.h"\
+ ".\search.h"\
+
+
+.\user_info.cpp : \
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_options.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_skin.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_userinfo.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\win2k.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+ ".\resource.h"\
+
+
+.\util.cpp : \
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_options.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_popup.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_skin.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\win2k.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+ ".\resource.h"\
+
+
+.\webcam.cpp : \
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_message.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\win2k.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+
+
+.\yahoo.cpp : \
+ "..\..\include\m_avatars.h"\
+ "..\..\include\m_clist.h"\
+ "..\..\include\m_clistint.h"\
+ "..\..\include\m_database.h"\
+ "..\..\include\m_genmenu.h"\
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_message.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_popup.h"\
+ "..\..\include\m_protocols.h"\
+ "..\..\include\m_protoint.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_skin.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_system_cpp.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\statusmodes.h"\
+ "..\..\include\win2k.h"\
+ ".\avatar.h"\
+ ".\chat.h"\
+ ".\file_transfer.h"\
+ ".\ignore.h"\
+ ".\im.h"\
+ ".\libyahoo2\yahoo2.h"\
+ ".\libyahoo2\yahoo2_callbacks.h"\
+ ".\libyahoo2\yahoo2_types.h"\
+ ".\libyahoo2\yahoo_httplib.h"\
+ ".\libyahoo2\yahoo_list.h"\
+ ".\libyahoo2\yahoo_util.h"\
+ ".\proto.h"\
+ ".\search.h"\
+ ".\webcam.h"\
+ ".\yahoo.h"\
+
diff --git a/protocols/Yahoo/Yahoo.dsp b/protocols/Yahoo/Yahoo.dsp
new file mode 100644
index 0000000000..fbb4ac6bb2
--- /dev/null
+++ b/protocols/Yahoo/Yahoo.dsp
@@ -0,0 +1,350 @@
+# Microsoft Developer Studio Project File - Name="Yahoo" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=Yahoo - Win32 Debug Unicode
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "Yahoo.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "Yahoo.mak" CFG="Yahoo - Win32 Debug Unicode"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "Yahoo - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "Yahoo - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "Yahoo - Win32 Debug Unicode" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "Yahoo - Win32 Release Unicode" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "Yahoo - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Yu"yahoo.h" /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x419 /d "NDEBUG"
+# ADD RSC /l 0x419 /i "../../include" /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib wsock32.lib /nologo /dll /map /debug /machine:I386 /out:"../../Bin/Release/Plugins/Yahoo.dll"
+# SUBTRACT LINK32 /pdb:none /incremental:yes
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Yu"yahoo.h" /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x419 /d "_DEBUG"
+# ADD RSC /l 0x419 /i "../../include" /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib wsock32.lib /nologo /dll /debug /machine:I386 /out:"../../Bin/Debug/Plugins/Yahoo.dll" /pdbtype:sept
+# SUBTRACT LINK32 /pdb:none /incremental:no
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Debug Unicode"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Yahoo___Win32_Debug_Unicode"
+# PROP BASE Intermediate_Dir "Yahoo___Win32_Debug_Unicode"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug_Unicode"
+# PROP Intermediate_Dir "Debug_Unicode"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Yu"yahoo.h" /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Yu"yahoo.h" /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x419 /d "_DEBUG"
+# ADD RSC /l 0x419 /i "../../include" /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"../../Bin/Debug/Plugins/Yahoo.dll" /pdbtype:sept
+# SUBTRACT BASE LINK32 /pdb:none /incremental:no
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib wsock32.lib /nologo /dll /debug /machine:I386 /out:"../../Bin/Debug Unicode/Plugins/Yahoo.dll" /pdbtype:sept
+# SUBTRACT LINK32 /pdb:none /incremental:no
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Release Unicode"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Yahoo___Win32_Release_Unicode"
+# PROP BASE Intermediate_Dir "Yahoo___Win32_Release_Unicode"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release_Unicode"
+# PROP Intermediate_Dir "Release_Unicode"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Yu"yahoo.h" /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x419 /d "NDEBUG"
+# ADD RSC /l 0x419 /i "../../include" /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /map /debug /machine:I386 /out:"../../Bin/Release/Plugins/Yahoo.dll"
+# SUBTRACT BASE LINK32 /pdb:none /incremental:yes
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib wsock32.lib /nologo /dll /map /debug /machine:I386 /out:"../../Bin/Release Unicode/Plugins/Yahoo.dll"
+# SUBTRACT LINK32 /pdb:none /incremental:yes
+
+!ENDIF
+
+# Begin Target
+
+# Name "Yahoo - Win32 Release"
+# Name "Yahoo - Win32 Debug"
+# Name "Yahoo - Win32 Debug Unicode"
+# Name "Yahoo - Win32 Release Unicode"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Group "libyahoo"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\libyahoo2\crypt.c
+# SUBTRACT CPP /YX /Yc /Yu
+# End Source File
+# Begin Source File
+
+SOURCE=.\libyahoo2\libyahoo2.c
+# SUBTRACT CPP /YX /Yc /Yu
+# End Source File
+# Begin Source File
+
+SOURCE=.\libyahoo2\yahoo2_callbacks.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\libyahoo2\yahoo2_types.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\libyahoo2\yahoo_debug.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\libyahoo2\yahoo_httplib.c
+# SUBTRACT CPP /YX /Yc /Yu
+# End Source File
+# Begin Source File
+
+SOURCE=.\libyahoo2\yahoo_httplib.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\libyahoo2\yahoo_list.c
+# SUBTRACT CPP /YX /Yc /Yu
+# End Source File
+# Begin Source File
+
+SOURCE=.\libyahoo2\yahoo_list.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\libyahoo2\yahoo_util.c
+# SUBTRACT CPP /YX /Yc /Yu
+# End Source File
+# Begin Source File
+
+SOURCE=.\libyahoo2\yahoo_util.h
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=.\avatar.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\chat.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\file_transfer.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\http_gateway.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\icolib.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\ignore.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\im.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\links.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\main.cpp
+# ADD CPP /Yu"yahoo.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\options.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\proto.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\resource.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\search.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\server.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\services.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\user_info.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\util.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\webcam.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\yahoo.cpp
+# ADD CPP /Yc"yahoo.h"
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE=.\Yahoo.rc
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\avatar.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\chat.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\file_transfer.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\http_gateway.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\ignore.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\im.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\options.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\proto.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\search.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\version.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\webcam.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\yahoo.h
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/protocols/Yahoo/Yahoo.mak b/protocols/Yahoo/Yahoo.mak
new file mode 100644
index 0000000000..1989266ce8
--- /dev/null
+++ b/protocols/Yahoo/Yahoo.mak
@@ -0,0 +1,915 @@
+# Microsoft Developer Studio Generated NMAKE File, Based on Yahoo.dsp
+!IF "$(CFG)" == ""
+CFG=Yahoo - Win32 Debug Unicode
+!MESSAGE No configuration specified. Defaulting to Yahoo - Win32 Debug Unicode.
+!ENDIF
+
+!IF "$(CFG)" != "Yahoo - Win32 Release" && "$(CFG)" != "Yahoo - Win32 Debug" && "$(CFG)" != "Yahoo - Win32 Debug Unicode" && "$(CFG)" != "Yahoo - Win32 Release Unicode"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "Yahoo.mak" CFG="Yahoo - Win32 Debug Unicode"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "Yahoo - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "Yahoo - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "Yahoo - Win32 Debug Unicode" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "Yahoo - Win32 Release Unicode" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+!ERROR An invalid configuration is specified.
+!ENDIF
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+
+!IF "$(CFG)" == "Yahoo - Win32 Release"
+
+OUTDIR=.\Release
+INTDIR=.\Release
+
+ALL : "..\..\Bin\Release\Plugins\Yahoo.dll"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\avatar.obj"
+ -@erase "$(INTDIR)\chat.obj"
+ -@erase "$(INTDIR)\crypt.obj"
+ -@erase "$(INTDIR)\file_transfer.obj"
+ -@erase "$(INTDIR)\http_gateway.obj"
+ -@erase "$(INTDIR)\icolib.obj"
+ -@erase "$(INTDIR)\ignore.obj"
+ -@erase "$(INTDIR)\im.obj"
+ -@erase "$(INTDIR)\libyahoo2.obj"
+ -@erase "$(INTDIR)\links.obj"
+ -@erase "$(INTDIR)\main.obj"
+ -@erase "$(INTDIR)\options.obj"
+ -@erase "$(INTDIR)\proto.obj"
+ -@erase "$(INTDIR)\search.obj"
+ -@erase "$(INTDIR)\server.obj"
+ -@erase "$(INTDIR)\services.obj"
+ -@erase "$(INTDIR)\user_info.obj"
+ -@erase "$(INTDIR)\util.obj"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(INTDIR)\vc60.pdb"
+ -@erase "$(INTDIR)\webcam.obj"
+ -@erase "$(INTDIR)\yahoo.obj"
+ -@erase "$(INTDIR)\Yahoo.pch"
+ -@erase "$(INTDIR)\Yahoo.res"
+ -@erase "$(INTDIR)\yahoo_httplib.obj"
+ -@erase "$(INTDIR)\yahoo_list.obj"
+ -@erase "$(INTDIR)\yahoo_util.obj"
+ -@erase "$(OUTDIR)\Yahoo.exp"
+ -@erase "$(OUTDIR)\Yahoo.lib"
+ -@erase "$(OUTDIR)\Yahoo.map"
+ -@erase "$(OUTDIR)\Yahoo.pdb"
+ -@erase "..\..\Bin\Release\Plugins\Yahoo.dll"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fp"$(INTDIR)\Yahoo.pch" /Yu"yahoo.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32
+RSC=rc.exe
+RSC_PROJ=/l 0x419 /fo"$(INTDIR)\Yahoo.res" /i "../../include" /d "NDEBUG"
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\Yahoo.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib wsock32.lib /nologo /dll /incremental:no /pdb:"$(OUTDIR)\Yahoo.pdb" /map:"$(INTDIR)\Yahoo.map" /debug /machine:I386 /out:"../../Bin/Release/Plugins/Yahoo.dll" /implib:"$(OUTDIR)\Yahoo.lib"
+LINK32_OBJS= \
+ "$(INTDIR)\crypt.obj" \
+ "$(INTDIR)\libyahoo2.obj" \
+ "$(INTDIR)\yahoo_httplib.obj" \
+ "$(INTDIR)\yahoo_list.obj" \
+ "$(INTDIR)\yahoo_util.obj" \
+ "$(INTDIR)\avatar.obj" \
+ "$(INTDIR)\chat.obj" \
+ "$(INTDIR)\file_transfer.obj" \
+ "$(INTDIR)\http_gateway.obj" \
+ "$(INTDIR)\icolib.obj" \
+ "$(INTDIR)\ignore.obj" \
+ "$(INTDIR)\im.obj" \
+ "$(INTDIR)\links.obj" \
+ "$(INTDIR)\main.obj" \
+ "$(INTDIR)\options.obj" \
+ "$(INTDIR)\proto.obj" \
+ "$(INTDIR)\search.obj" \
+ "$(INTDIR)\server.obj" \
+ "$(INTDIR)\services.obj" \
+ "$(INTDIR)\user_info.obj" \
+ "$(INTDIR)\util.obj" \
+ "$(INTDIR)\webcam.obj" \
+ "$(INTDIR)\yahoo.obj" \
+ "$(INTDIR)\Yahoo.res"
+
+"..\..\Bin\Release\Plugins\Yahoo.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Debug"
+
+OUTDIR=.\Debug
+INTDIR=.\Debug
+
+ALL : "..\..\Bin\Debug\Plugins\Yahoo.dll"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\avatar.obj"
+ -@erase "$(INTDIR)\chat.obj"
+ -@erase "$(INTDIR)\crypt.obj"
+ -@erase "$(INTDIR)\file_transfer.obj"
+ -@erase "$(INTDIR)\http_gateway.obj"
+ -@erase "$(INTDIR)\icolib.obj"
+ -@erase "$(INTDIR)\ignore.obj"
+ -@erase "$(INTDIR)\im.obj"
+ -@erase "$(INTDIR)\libyahoo2.obj"
+ -@erase "$(INTDIR)\links.obj"
+ -@erase "$(INTDIR)\main.obj"
+ -@erase "$(INTDIR)\options.obj"
+ -@erase "$(INTDIR)\proto.obj"
+ -@erase "$(INTDIR)\search.obj"
+ -@erase "$(INTDIR)\server.obj"
+ -@erase "$(INTDIR)\services.obj"
+ -@erase "$(INTDIR)\user_info.obj"
+ -@erase "$(INTDIR)\util.obj"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(INTDIR)\vc60.pdb"
+ -@erase "$(INTDIR)\webcam.obj"
+ -@erase "$(INTDIR)\yahoo.obj"
+ -@erase "$(INTDIR)\Yahoo.pch"
+ -@erase "$(INTDIR)\Yahoo.res"
+ -@erase "$(INTDIR)\yahoo_httplib.obj"
+ -@erase "$(INTDIR)\yahoo_list.obj"
+ -@erase "$(INTDIR)\yahoo_util.obj"
+ -@erase "$(OUTDIR)\Yahoo.exp"
+ -@erase "$(OUTDIR)\Yahoo.lib"
+ -@erase "$(OUTDIR)\Yahoo.pdb"
+ -@erase "..\..\Bin\Debug\Plugins\Yahoo.dll"
+ -@erase "..\..\Bin\Debug\Plugins\Yahoo.ilk"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fp"$(INTDIR)\Yahoo.pch" /Yu"yahoo.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /win32
+RSC=rc.exe
+RSC_PROJ=/l 0x419 /fo"$(INTDIR)\Yahoo.res" /i "../../include" /d "_DEBUG"
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\Yahoo.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib wsock32.lib /nologo /dll /incremental:yes /pdb:"$(OUTDIR)\Yahoo.pdb" /debug /machine:I386 /out:"../../Bin/Debug/Plugins/Yahoo.dll" /implib:"$(OUTDIR)\Yahoo.lib" /pdbtype:sept
+LINK32_OBJS= \
+ "$(INTDIR)\crypt.obj" \
+ "$(INTDIR)\libyahoo2.obj" \
+ "$(INTDIR)\yahoo_httplib.obj" \
+ "$(INTDIR)\yahoo_list.obj" \
+ "$(INTDIR)\yahoo_util.obj" \
+ "$(INTDIR)\avatar.obj" \
+ "$(INTDIR)\chat.obj" \
+ "$(INTDIR)\file_transfer.obj" \
+ "$(INTDIR)\http_gateway.obj" \
+ "$(INTDIR)\icolib.obj" \
+ "$(INTDIR)\ignore.obj" \
+ "$(INTDIR)\im.obj" \
+ "$(INTDIR)\links.obj" \
+ "$(INTDIR)\main.obj" \
+ "$(INTDIR)\options.obj" \
+ "$(INTDIR)\proto.obj" \
+ "$(INTDIR)\search.obj" \
+ "$(INTDIR)\server.obj" \
+ "$(INTDIR)\services.obj" \
+ "$(INTDIR)\user_info.obj" \
+ "$(INTDIR)\util.obj" \
+ "$(INTDIR)\webcam.obj" \
+ "$(INTDIR)\yahoo.obj" \
+ "$(INTDIR)\Yahoo.res"
+
+"..\..\Bin\Debug\Plugins\Yahoo.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Debug Unicode"
+
+OUTDIR=.\Debug_Unicode
+INTDIR=.\Debug_Unicode
+
+ALL : "..\..\Bin\Debug Unicode\Plugins\Yahoo.dll"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\avatar.obj"
+ -@erase "$(INTDIR)\chat.obj"
+ -@erase "$(INTDIR)\crypt.obj"
+ -@erase "$(INTDIR)\file_transfer.obj"
+ -@erase "$(INTDIR)\http_gateway.obj"
+ -@erase "$(INTDIR)\icolib.obj"
+ -@erase "$(INTDIR)\ignore.obj"
+ -@erase "$(INTDIR)\im.obj"
+ -@erase "$(INTDIR)\libyahoo2.obj"
+ -@erase "$(INTDIR)\links.obj"
+ -@erase "$(INTDIR)\main.obj"
+ -@erase "$(INTDIR)\options.obj"
+ -@erase "$(INTDIR)\proto.obj"
+ -@erase "$(INTDIR)\search.obj"
+ -@erase "$(INTDIR)\server.obj"
+ -@erase "$(INTDIR)\services.obj"
+ -@erase "$(INTDIR)\user_info.obj"
+ -@erase "$(INTDIR)\util.obj"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(INTDIR)\vc60.pdb"
+ -@erase "$(INTDIR)\webcam.obj"
+ -@erase "$(INTDIR)\yahoo.obj"
+ -@erase "$(INTDIR)\Yahoo.pch"
+ -@erase "$(INTDIR)\Yahoo.res"
+ -@erase "$(INTDIR)\yahoo_httplib.obj"
+ -@erase "$(INTDIR)\yahoo_list.obj"
+ -@erase "$(INTDIR)\yahoo_util.obj"
+ -@erase "$(OUTDIR)\Yahoo.exp"
+ -@erase "$(OUTDIR)\Yahoo.lib"
+ -@erase "$(OUTDIR)\Yahoo.pdb"
+ -@erase "..\..\Bin\Debug Unicode\Plugins\Yahoo.dll"
+ -@erase "..\..\Bin\Debug Unicode\Plugins\Yahoo.ilk"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fp"$(INTDIR)\Yahoo.pch" /Yu"yahoo.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /win32
+RSC=rc.exe
+RSC_PROJ=/l 0x419 /fo"$(INTDIR)\Yahoo.res" /i "../../include" /d "_DEBUG"
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\Yahoo.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib wsock32.lib /nologo /dll /incremental:yes /pdb:"$(OUTDIR)\Yahoo.pdb" /debug /machine:I386 /out:"../../Bin/Debug Unicode/Plugins/Yahoo.dll" /implib:"$(OUTDIR)\Yahoo.lib" /pdbtype:sept
+LINK32_OBJS= \
+ "$(INTDIR)\crypt.obj" \
+ "$(INTDIR)\libyahoo2.obj" \
+ "$(INTDIR)\yahoo_httplib.obj" \
+ "$(INTDIR)\yahoo_list.obj" \
+ "$(INTDIR)\yahoo_util.obj" \
+ "$(INTDIR)\avatar.obj" \
+ "$(INTDIR)\chat.obj" \
+ "$(INTDIR)\file_transfer.obj" \
+ "$(INTDIR)\http_gateway.obj" \
+ "$(INTDIR)\icolib.obj" \
+ "$(INTDIR)\ignore.obj" \
+ "$(INTDIR)\im.obj" \
+ "$(INTDIR)\links.obj" \
+ "$(INTDIR)\main.obj" \
+ "$(INTDIR)\options.obj" \
+ "$(INTDIR)\proto.obj" \
+ "$(INTDIR)\search.obj" \
+ "$(INTDIR)\server.obj" \
+ "$(INTDIR)\services.obj" \
+ "$(INTDIR)\user_info.obj" \
+ "$(INTDIR)\util.obj" \
+ "$(INTDIR)\webcam.obj" \
+ "$(INTDIR)\yahoo.obj" \
+ "$(INTDIR)\Yahoo.res"
+
+"..\..\Bin\Debug Unicode\Plugins\Yahoo.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Release Unicode"
+
+OUTDIR=.\Release_Unicode
+INTDIR=.\Release_Unicode
+
+ALL : "..\..\Bin\Release Unicode\Plugins\Yahoo.dll"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\avatar.obj"
+ -@erase "$(INTDIR)\chat.obj"
+ -@erase "$(INTDIR)\crypt.obj"
+ -@erase "$(INTDIR)\file_transfer.obj"
+ -@erase "$(INTDIR)\http_gateway.obj"
+ -@erase "$(INTDIR)\icolib.obj"
+ -@erase "$(INTDIR)\ignore.obj"
+ -@erase "$(INTDIR)\im.obj"
+ -@erase "$(INTDIR)\libyahoo2.obj"
+ -@erase "$(INTDIR)\links.obj"
+ -@erase "$(INTDIR)\main.obj"
+ -@erase "$(INTDIR)\options.obj"
+ -@erase "$(INTDIR)\proto.obj"
+ -@erase "$(INTDIR)\search.obj"
+ -@erase "$(INTDIR)\server.obj"
+ -@erase "$(INTDIR)\services.obj"
+ -@erase "$(INTDIR)\user_info.obj"
+ -@erase "$(INTDIR)\util.obj"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(INTDIR)\vc60.pdb"
+ -@erase "$(INTDIR)\webcam.obj"
+ -@erase "$(INTDIR)\yahoo.obj"
+ -@erase "$(INTDIR)\Yahoo.pch"
+ -@erase "$(INTDIR)\Yahoo.res"
+ -@erase "$(INTDIR)\yahoo_httplib.obj"
+ -@erase "$(INTDIR)\yahoo_list.obj"
+ -@erase "$(INTDIR)\yahoo_util.obj"
+ -@erase "$(OUTDIR)\Yahoo.exp"
+ -@erase "$(OUTDIR)\Yahoo.lib"
+ -@erase "$(OUTDIR)\Yahoo.map"
+ -@erase "$(OUTDIR)\Yahoo.pdb"
+ -@erase "..\..\Bin\Release Unicode\Plugins\Yahoo.dll"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fp"$(INTDIR)\Yahoo.pch" /Yu"yahoo.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32
+RSC=rc.exe
+RSC_PROJ=/l 0x419 /fo"$(INTDIR)\Yahoo.res" /i "../../include" /d "NDEBUG"
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\Yahoo.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib wsock32.lib /nologo /dll /incremental:no /pdb:"$(OUTDIR)\Yahoo.pdb" /map:"$(INTDIR)\Yahoo.map" /debug /machine:I386 /out:"../../Bin/Release Unicode/Plugins/Yahoo.dll" /implib:"$(OUTDIR)\Yahoo.lib"
+LINK32_OBJS= \
+ "$(INTDIR)\crypt.obj" \
+ "$(INTDIR)\libyahoo2.obj" \
+ "$(INTDIR)\yahoo_httplib.obj" \
+ "$(INTDIR)\yahoo_list.obj" \
+ "$(INTDIR)\yahoo_util.obj" \
+ "$(INTDIR)\avatar.obj" \
+ "$(INTDIR)\chat.obj" \
+ "$(INTDIR)\file_transfer.obj" \
+ "$(INTDIR)\http_gateway.obj" \
+ "$(INTDIR)\icolib.obj" \
+ "$(INTDIR)\ignore.obj" \
+ "$(INTDIR)\im.obj" \
+ "$(INTDIR)\links.obj" \
+ "$(INTDIR)\main.obj" \
+ "$(INTDIR)\options.obj" \
+ "$(INTDIR)\proto.obj" \
+ "$(INTDIR)\search.obj" \
+ "$(INTDIR)\server.obj" \
+ "$(INTDIR)\services.obj" \
+ "$(INTDIR)\user_info.obj" \
+ "$(INTDIR)\util.obj" \
+ "$(INTDIR)\webcam.obj" \
+ "$(INTDIR)\yahoo.obj" \
+ "$(INTDIR)\Yahoo.res"
+
+"..\..\Bin\Release Unicode\Plugins\Yahoo.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ENDIF
+
+
+!IF "$(NO_EXTERNAL_DEPS)" != "1"
+!IF EXISTS("Yahoo.dep")
+!INCLUDE "Yahoo.dep"
+!ELSE
+!MESSAGE Warning: cannot find "Yahoo.dep"
+!ENDIF
+!ENDIF
+
+
+!IF "$(CFG)" == "Yahoo - Win32 Release" || "$(CFG)" == "Yahoo - Win32 Debug" || "$(CFG)" == "Yahoo - Win32 Debug Unicode" || "$(CFG)" == "Yahoo - Win32 Release Unicode"
+SOURCE=.\libyahoo2\crypt.c
+
+!IF "$(CFG)" == "Yahoo - Win32 Release"
+
+CPP_SWITCHES=/nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+"$(INTDIR)\crypt.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Debug"
+
+CPP_SWITCHES=/nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+"$(INTDIR)\crypt.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Debug Unicode"
+
+CPP_SWITCHES=/nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+"$(INTDIR)\crypt.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Release Unicode"
+
+CPP_SWITCHES=/nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+"$(INTDIR)\crypt.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ENDIF
+
+SOURCE=.\libyahoo2\libyahoo2.c
+
+!IF "$(CFG)" == "Yahoo - Win32 Release"
+
+CPP_SWITCHES=/nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+"$(INTDIR)\libyahoo2.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Debug"
+
+CPP_SWITCHES=/nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+"$(INTDIR)\libyahoo2.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Debug Unicode"
+
+CPP_SWITCHES=/nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+"$(INTDIR)\libyahoo2.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Release Unicode"
+
+CPP_SWITCHES=/nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+"$(INTDIR)\libyahoo2.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ENDIF
+
+SOURCE=.\libyahoo2\yahoo_httplib.c
+
+!IF "$(CFG)" == "Yahoo - Win32 Release"
+
+CPP_SWITCHES=/nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+"$(INTDIR)\yahoo_httplib.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Debug"
+
+CPP_SWITCHES=/nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+"$(INTDIR)\yahoo_httplib.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Debug Unicode"
+
+CPP_SWITCHES=/nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+"$(INTDIR)\yahoo_httplib.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Release Unicode"
+
+CPP_SWITCHES=/nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+"$(INTDIR)\yahoo_httplib.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ENDIF
+
+SOURCE=.\libyahoo2\yahoo_list.c
+
+!IF "$(CFG)" == "Yahoo - Win32 Release"
+
+CPP_SWITCHES=/nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+"$(INTDIR)\yahoo_list.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Debug"
+
+CPP_SWITCHES=/nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+"$(INTDIR)\yahoo_list.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Debug Unicode"
+
+CPP_SWITCHES=/nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+"$(INTDIR)\yahoo_list.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Release Unicode"
+
+CPP_SWITCHES=/nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+"$(INTDIR)\yahoo_list.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ENDIF
+
+SOURCE=.\libyahoo2\yahoo_util.c
+
+!IF "$(CFG)" == "Yahoo - Win32 Release"
+
+CPP_SWITCHES=/nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+"$(INTDIR)\yahoo_util.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Debug"
+
+CPP_SWITCHES=/nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+"$(INTDIR)\yahoo_util.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Debug Unicode"
+
+CPP_SWITCHES=/nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+"$(INTDIR)\yahoo_util.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Release Unicode"
+
+CPP_SWITCHES=/nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+"$(INTDIR)\yahoo_util.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ENDIF
+
+SOURCE=.\avatar.cpp
+
+"$(INTDIR)\avatar.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+
+
+SOURCE=.\chat.cpp
+
+"$(INTDIR)\chat.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+
+
+SOURCE=.\file_transfer.cpp
+
+"$(INTDIR)\file_transfer.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+
+
+SOURCE=.\http_gateway.cpp
+
+"$(INTDIR)\http_gateway.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+
+
+SOURCE=.\icolib.cpp
+
+"$(INTDIR)\icolib.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+
+
+SOURCE=.\ignore.cpp
+
+"$(INTDIR)\ignore.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+
+
+SOURCE=.\im.cpp
+
+"$(INTDIR)\im.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+
+
+SOURCE=.\links.cpp
+
+"$(INTDIR)\links.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+
+
+SOURCE=.\main.cpp
+
+!IF "$(CFG)" == "Yahoo - Win32 Release"
+
+CPP_SWITCHES=/nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fp"$(INTDIR)\Yahoo.pch" /Yu"yahoo.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+"$(INTDIR)\main.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Debug"
+
+CPP_SWITCHES=/nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fp"$(INTDIR)\Yahoo.pch" /Yu"yahoo.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+"$(INTDIR)\main.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Debug Unicode"
+
+CPP_SWITCHES=/nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fp"$(INTDIR)\Yahoo.pch" /Yu"yahoo.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+"$(INTDIR)\main.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Release Unicode"
+
+CPP_SWITCHES=/nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fp"$(INTDIR)\Yahoo.pch" /Yu"yahoo.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+"$(INTDIR)\main.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ENDIF
+
+SOURCE=.\options.cpp
+
+"$(INTDIR)\options.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+
+
+SOURCE=.\proto.cpp
+
+"$(INTDIR)\proto.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+
+
+SOURCE=.\search.cpp
+
+"$(INTDIR)\search.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+
+
+SOURCE=.\server.cpp
+
+"$(INTDIR)\server.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+
+
+SOURCE=.\services.cpp
+
+"$(INTDIR)\services.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+
+
+SOURCE=.\user_info.cpp
+
+"$(INTDIR)\user_info.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+
+
+SOURCE=.\util.cpp
+
+"$(INTDIR)\util.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+
+
+SOURCE=.\webcam.cpp
+
+"$(INTDIR)\webcam.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\Yahoo.pch"
+
+
+SOURCE=.\yahoo.cpp
+
+!IF "$(CFG)" == "Yahoo - Win32 Release"
+
+CPP_SWITCHES=/nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fp"$(INTDIR)\Yahoo.pch" /Yc"yahoo.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+"$(INTDIR)\yahoo.obj" "$(INTDIR)\Yahoo.pch" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Debug"
+
+CPP_SWITCHES=/nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fp"$(INTDIR)\Yahoo.pch" /Yc"yahoo.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+"$(INTDIR)\yahoo.obj" "$(INTDIR)\Yahoo.pch" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Debug Unicode"
+
+CPP_SWITCHES=/nologo /MDd /W3 /Gm /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fp"$(INTDIR)\Yahoo.pch" /Yc"yahoo.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+"$(INTDIR)\yahoo.obj" "$(INTDIR)\Yahoo.pch" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "Yahoo - Win32 Release Unicode"
+
+CPP_SWITCHES=/nologo /MD /W3 /Zi /O1 /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "YAHOO_EXPORTS" /D "HAVE_CONFIG_H" /Fp"$(INTDIR)\Yahoo.pch" /Yc"yahoo.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+"$(INTDIR)\yahoo.obj" "$(INTDIR)\Yahoo.pch" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ENDIF
+
+SOURCE=.\Yahoo.rc
+
+"$(INTDIR)\Yahoo.res" : $(SOURCE) "$(INTDIR)"
+ $(RSC) $(RSC_PROJ) $(SOURCE)
+
+
+
+!ENDIF
+
diff --git a/protocols/Yahoo/Yahoo.rc b/protocols/Yahoo/Yahoo.rc
new file mode 100644
index 0000000000..88956e6dfc
--- /dev/null
+++ b/protocols/Yahoo/Yahoo.rc
@@ -0,0 +1,182 @@
+/*
+ * $Id: Yahoo.rc 11954 2010-06-09 12:28:38Z borkra $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+#include <winresrc.h>
+
+#include "resource.h"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_OPT_YAHOO DIALOGEX 0, 0, 296, 220
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ // Yahoo Login Information [Top Box]
+ GROUPBOX "Yahoo",IDC_STYAHOOGROUP,8,10,280,72
+ RTEXT "ID:",IDC_STATIC,16,20,52,8
+ EDITTEXT IDC_HANDLE,72,18,100,12,ES_AUTOHSCROLL
+ RTEXT "Password:",IDC_STATIC,16,36,52,8
+ EDITTEXT IDC_PASSWORD,72,34,100,12,ES_PASSWORD | ES_AUTOHSCROLL
+ RTEXT "Nick:",IDC_STATIC,16,52,52,8
+ EDITTEXT IDC_NICK,72,50,100,12,ES_AUTOHSCROLL
+ CONTROL "Create a new Yahoo account using the Yahoo website",
+ IDC_NEWYAHOOACCOUNTLINK,"Hyperlink",WS_TABSTOP,21,66,208,8
+
+ // Expert Section [Server/Port/etc]
+ GROUPBOX "Expert",IDC_STATIC,8,84,280,80
+
+ /*CONTROL "Disable UTF8 encoding",IDC_DISABLE_UTF8,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,16,94,260,10
+ */
+ CONTROL "Use Yahoo Address Book (YAB)",IDC_USE_YAB,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,16,104,260,10
+
+ CONTROL "Show Avatars",IDC_SHOW_AVATARS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,16,114,260,10
+
+ CONTROL "AutoLogin to Yahoo Website(s)",IDC_MAIL_AUTOLOGIN,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,16,124,260,10
+
+ CONTROL "Display Yahoo notifications", IDC_DISABLEYAHOOMAIL,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,16,134,260,10
+
+ CONTROL "Show Errors",IDC_SHOW_ERRORS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,16,144,260,10
+
+END
+
+IDD_YAHOOACCOUNT DIALOGEX 0, 0, 186, 134
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ LTEXT "ID:",IDC_STATIC,0,0,53,12
+ EDITTEXT IDC_HANDLE,54,0,131,12,ES_AUTOHSCROLL
+ LTEXT "Password:",IDC_STATIC,0,16,53,12
+ EDITTEXT IDC_PASSWORD,54,16,131,12,ES_PASSWORD | ES_AUTOHSCROLL
+
+ CONTROL "Yahoo Japan",IDC_YAHOO_JAPAN,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,0,32,140,12
+
+ CONTROL "Create a new Yahoo account",IDC_NEWYAHOOACCOUNTLINK,
+ "Hyperlink",WS_TABSTOP,0,48,174,12
+END
+
+IDD_OPT_YAHOO_CONNECTION DIALOGEX 0, 0, 296, 220
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+
+ // Expert Section [Server/Port/etc]
+ GROUPBOX "Connection Settings",IDC_STATIC,8,10,280,72
+
+ LTEXT "Login server:",IDC_STATIC,16,26,52,10
+ EDITTEXT IDC_LOGINSERVER,68,24,168,12,ES_AUTOHSCROLL
+ LTEXT "Port:",IDC_STATIC,16,42,25,10
+ EDITTEXT IDC_YAHOOPORT,68,40,29,12,ES_AUTOHSCROLL | ES_NUMBER
+ PUSHBUTTON "Reset",IDC_RESETSERVER,244,24,40,12
+
+ CONTROL "Yahoo Japan",IDC_YAHOO_JAPAN,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,16,58,140,10
+END
+
+IDD_OPT_YAHOO_IGNORE DIALOGEX 0, 0, 296, 220
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Yahoo Ignore List",IDC_STIGNGROUP,8,10,280,210
+
+ CONTROL "Ignore anyone who is not on my Yahoo buddy list ",IDC_OPT_IGN_UNKNOWN,
+ "Button",BS_AUTORADIOBUTTON,16,20,232,10
+
+ CONTROL "Ignore only the people below: ",IDC_OPT_IGN_LIST,
+ "Button",BS_AUTORADIOBUTTON,16,36,232,10
+
+ EDITTEXT IDC_YIGN_EDIT,16,53,232,13,ES_AUTOHSCROLL
+ PUSHBUTTON "&Add",IDC_IGN_ADD,250,52,34,12
+
+ LISTBOX IDC_YIGN_LIST,16,68,232,150, LBS_NOTIFY | LBS_HASSTRINGS | LBS_SORT | WS_BORDER | WS_VSCROLL
+
+ PUSHBUTTON "&Remove", IDC_IGN_REMOVE, 250,202,34,12
+
+END
+
+
+IDD_SETCUSTSTAT DIALOGEX 0, 0, 187, 51
+STYLE DS_SETFONT | DS_FIXEDSYS | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Set Custom Status"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ EDITTEXT IDC_CUSTSTAT,5,5,177,12,ES_AUTOHSCROLL
+ CONTROL "Show as busy",
+ IDC_CUSTSTATBUSY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+ 5,21,120,10
+ DEFPUSHBUTTON "OK",IDOK,36,34,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,102,34,50,14
+END
+
+IDD_SEARCHUSER DIALOGEX 0, 0, 109, 148
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ LTEXT "ID:",IDC_STATIC,0,1,97,8
+ EDITTEXT IDC_SEARCH_ID,0,10,105,15,ES_AUTOHSCROLL
+
+ LTEXT "Protocol:",IDC_STATIC,0,31,97,38
+ COMBOBOX IDC_SEARCH_PROTOCOL,0,40,105,75,CBS_DROPDOWNLIST
+END
+
+IDD_USER_INFO DIALOGEX 0, 0, 221, 132
+STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "ID:", IDC_STATIC, 5, 5, 71,8
+ EDITTEXT IDC_SEARCH_ID, 74, 5, 143, 12, ES_AUTOHSCROLL | ES_READONLY | NOT
+ WS_BORDER
+
+ LTEXT "Protocol:", IDC_STATIC, 5, 18, 71, 8
+ EDITTEXT IDC_SEARCH_PROTOCOL, 74, 18, 143,12, ES_AUTOHSCROLL | ES_READONLY | NOT
+ WS_BORDER
+
+ LTEXT "Client:", IDC_STATIC, 5, 31, 71, 8
+ EDITTEXT IDC_NFO_CLIENT, 74, 31, 143,12, ES_AUTOHSCROLL | ES_READONLY | NOT
+ WS_BORDER
+
+
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_YAHOO ICON "icos/yahoo.ico"
+IDI_INBOX ICON "icos/inbox.ico"
+IDI_PROFILE ICON "icos/profile.ico"
+IDI_REFRESH ICON "icos/refresh.ico"
+IDI_YAB ICON "icos/address_book.ico"
+IDI_SET_STATUS ICON "icos/set_status.ico"
+IDI_CALENDAR ICON "icos/calendar.ico"
+
+#include "version.rc"
+
diff --git a/protocols/Yahoo/Yahoo.sln b/protocols/Yahoo/Yahoo.sln
new file mode 100644
index 0000000000..e9a7c16235
--- /dev/null
+++ b/protocols/Yahoo/Yahoo.sln
@@ -0,0 +1,29 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Yahoo", "Yahoo.vcproj", "{E42870DB-9FED-44E7-9C93-4E64D0C87F51}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SourceCodeControl) = preSolution
+ SccNumberOfProjects = 1
+ SccProjectUniqueName0 = Yahoo.vcproj
+ SccProjectName0 = \u0022$/Miranda/miranda/Yahoo\u0022,\u0020GKQAAAAA
+ SccLocalPath0 = .
+ SccProvider0 = MSSCCI:Microsoft\u0020Visual\u0020SourceSafe
+ CanCheckoutShared = false
+ EndGlobalSection
+ GlobalSection(SolutionConfiguration) = preSolution
+ Debug = Debug
+ Release = Release
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {E42870DB-9FED-44E7-9C93-4E64D0C87F51}.Debug.ActiveCfg = Debug|Win32
+ {E42870DB-9FED-44E7-9C93-4E64D0C87F51}.Debug.Build.0 = Debug|Win32
+ {E42870DB-9FED-44E7-9C93-4E64D0C87F51}.Release.ActiveCfg = Release|Win32
+ {E42870DB-9FED-44E7-9C93-4E64D0C87F51}.Release.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/protocols/Yahoo/Yahoo.vcproj b/protocols/Yahoo/Yahoo.vcproj
new file mode 100644
index 0000000000..0acb2d3012
--- /dev/null
+++ b/protocols/Yahoo/Yahoo.vcproj
@@ -0,0 +1,556 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="Yahoo"
+ ProjectGUID="{E42870DB-9FED-44E7-9C93-4E64D0C87F51}"
+ SccProjectName=""
+ SccLocalPath="">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)/Plugins"
+ IntermediateDirectory="$(SolutionDir)$(ConfigurationName)/Obj/$(ProjectName)"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;YAHOO_EXPORTS;HAVE_CONFIG_H"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="3"
+ PrecompiledHeaderThrough="yahoo.h"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ DebugInformationFormat="4"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wsock32.lib"
+ LinkIncremental="2"
+ SuppressStartupBanner="TRUE"
+ GenerateDebugInformation="TRUE"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="TRUE"
+ SuppressStartupBanner="TRUE"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Debug/Yahoo.tlb"
+ HeaderFileName=""/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1049"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)/Plugins"
+ IntermediateDirectory="$(SolutionDir)$(ConfigurationName)/Obj/$(ProjectName)"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2"
+ WholeProgramOptimization="FALSE">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ GlobalOptimizations="TRUE"
+ InlineFunctionExpansion="1"
+ FavorSizeOrSpeed="2"
+ OmitFramePointers="FALSE"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;YAHOO_EXPORTS;HAVE_CONFIG_H"
+ StringPooling="TRUE"
+ ExceptionHandling="FALSE"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="TRUE"
+ UsePrecompiledHeader="3"
+ PrecompiledHeaderThrough="yahoo.h"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="TRUE"
+ AdditionalDependencies="wsock32.lib"
+ LinkIncremental="1"
+ SuppressStartupBanner="TRUE"
+ AdditionalLibraryDirectories="../../lib"
+ IgnoreAllDefaultLibraries="TRUE"
+ GenerateDebugInformation="TRUE"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ OptimizeForWindows98="1"
+ ImportLibrary=""
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="TRUE"
+ SuppressStartupBanner="TRUE"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Release/Yahoo.tlb"
+ HeaderFileName=""/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1049"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Debug Unicode|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)/Plugins"
+ IntermediateDirectory="$(SolutionDir)$(ConfigurationName)/Obj/$(ProjectName)"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="1">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;YAHOO_EXPORTS;HAVE_CONFIG_H"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ BufferSecurityCheck="TRUE"
+ UsePrecompiledHeader="3"
+ PrecompiledHeaderThrough="yahoo.h"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ DebugInformationFormat="4"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="TRUE"
+ AdditionalDependencies="wsock32.lib"
+ LinkIncremental="2"
+ SuppressStartupBanner="TRUE"
+ GenerateDebugInformation="TRUE"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="TRUE"
+ SuppressStartupBanner="TRUE"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Debug/Yahoo.tlb"
+ HeaderFileName=""/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1049"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release Unicode|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)/Plugins"
+ IntermediateDirectory="$(SolutionDir)$(ConfigurationName)/Obj/$(ProjectName)"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="1"
+ WholeProgramOptimization="FALSE">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ GlobalOptimizations="TRUE"
+ FavorSizeOrSpeed="2"
+ OmitFramePointers="FALSE"
+ OptimizeForProcessor="0"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;YAHOO_EXPORTS;HAVE_CONFIG_H"
+ StringPooling="TRUE"
+ ExceptionHandling="FALSE"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="TRUE"
+ UsePrecompiledHeader="3"
+ PrecompiledHeaderThrough="yahoo.h"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="TRUE"
+ AdditionalDependencies="wsock32.lib"
+ AdditionalLibraryDirectories="../../lib"
+ IgnoreAllDefaultLibraries="TRUE"
+ GenerateDebugInformation="TRUE"
+ GenerateMapFile="TRUE"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ OptimizeForWindows98="1"
+ ImportLibrary=""
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="TRUE"
+ SuppressStartupBanner="TRUE"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Release/Yahoo.tlb"
+ HeaderFileName=""/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1049"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
+ <File
+ RelativePath=".\avatar.cpp">
+ </File>
+ <File
+ RelativePath=".\chat.cpp">
+ </File>
+ <File
+ RelativePath=".\file_transfer.cpp">
+ </File>
+ <File
+ RelativePath=".\http_gateway.cpp">
+ </File>
+ <File
+ RelativePath=".\icolib.cpp">
+ </File>
+ <File
+ RelativePath=".\ignore.cpp">
+ </File>
+ <File
+ RelativePath=".\im.cpp">
+ </File>
+ <File
+ RelativePath=".\links.cpp">
+ </File>
+ <File
+ RelativePath=".\main.cpp">
+ </File>
+ <File
+ RelativePath=".\options.cpp">
+ </File>
+ <File
+ RelativePath=".\proto.cpp">
+ </File>
+ <File
+ RelativePath=".\search.cpp">
+ </File>
+ <File
+ RelativePath=".\server.cpp">
+ </File>
+ <File
+ RelativePath=".\services.cpp">
+ </File>
+ <File
+ RelativePath=".\util.cpp">
+ </File>
+ <File
+ RelativePath=".\user_info.cpp">
+ </File>
+ <File
+ RelativePath=".\webcam.cpp">
+ </File>
+ <File
+ RelativePath=".\yahoo.cpp">
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"/>
+ </FileConfiguration>
+ </File>
+ <Filter
+ Name="libyahoo2"
+ Filter="">
+ <File
+ RelativePath=".\libyahoo2\config.h">
+ </File>
+ <File
+ RelativePath=".\libyahoo2\crypt.c">
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\libyahoo2\libyahoo2.c">
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo2.h">
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo2_callbacks.h">
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo2_types.h">
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_debug.h">
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_httplib.c">
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_httplib.h">
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_list.c">
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_list.h">
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_util.c">
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_util.h">
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl">
+ <File
+ RelativePath=".\http_gateway.h">
+ </File>
+ <File
+ RelativePath=".\ignore.h">
+ </File>
+ <File
+ RelativePath=".\proto.h">
+ </File>
+ <File
+ RelativePath=".\pthread.h">
+ </File>
+ <File
+ RelativePath=".\resource.h">
+ </File>
+ <File
+ RelativePath=".\yahoo.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
+ <File
+ RelativePath=".\Yahoo.rc">
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/protocols/Yahoo/Yahoo_10.vcxproj b/protocols/Yahoo/Yahoo_10.vcxproj
new file mode 100644
index 0000000000..3d7deb67e8
--- /dev/null
+++ b/protocols/Yahoo/Yahoo_10.vcxproj
@@ -0,0 +1,640 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug Unicode|Win32">
+ <Configuration>Debug Unicode</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug Unicode|x64">
+ <Configuration>Debug Unicode</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release Unicode|Win32">
+ <Configuration>Release Unicode</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release Unicode|x64">
+ <Configuration>Release Unicode</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectName>Yahoo</ProjectName>
+ <ProjectGuid>{E42870DB-9FED-44E7-9C93-4E64D0C87F51}</ProjectGuid>
+ <RootNamespace>Yahoo</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Unicode|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release Unicode|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)/Plugins\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)/Obj/$(ProjectName)\</IntDir>
+ <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</IgnoreImportLibrary>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)$(Configuration)64/Plugins\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)$(Configuration)64/Obj/$(ProjectName)\</IntDir>
+ <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</IgnoreImportLibrary>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)/Plugins\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)/Obj/$(ProjectName)\</IntDir>
+ <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</IgnoreImportLibrary>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)$(Configuration)64/Plugins\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)$(Configuration)64/Obj/$(ProjectName)\</IntDir>
+ <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</IgnoreImportLibrary>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'">$(SolutionDir)$(Configuration)/Plugins\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'">$(SolutionDir)$(Configuration)/Obj/$(ProjectName)\</IntDir>
+ <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'">true</IgnoreImportLibrary>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|x64'">$(SolutionDir)$(Configuration)64/Plugins\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|x64'">$(SolutionDir)$(Configuration)64/Obj/$(ProjectName)\</IntDir>
+ <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|x64'">true</IgnoreImportLibrary>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">$(SolutionDir)$(Configuration)/Plugins\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">$(SolutionDir)$(Configuration)/Obj/$(ProjectName)\</IntDir>
+ <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">true</IgnoreImportLibrary>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release Unicode|x64'">$(SolutionDir)$(Configuration)64/Plugins\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release Unicode|x64'">$(SolutionDir)$(Configuration)64/Obj/$(ProjectName)\</IntDir>
+ <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Release Unicode|x64'">true</IgnoreImportLibrary>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release Unicode|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release Unicode|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release Unicode|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>.\Debug/Yahoo.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;YAHOO_EXPORTS;HAVE_CONFIG_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>yahoo.h</PrecompiledHeaderFile>
+ <BrowseInformationFile>
+ </BrowseInformationFile>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0419</Culture>
+ <AdditionalIncludeDirectories>./../../include/msapi/</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>wsock32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>.\Debug/Yahoo.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;YAHOO_EXPORTS;HAVE_CONFIG_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>yahoo.h</PrecompiledHeaderFile>
+ <BrowseInformationFile>
+ </BrowseInformationFile>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0419</Culture>
+ <AdditionalIncludeDirectories>./../../include/msapi/</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>wsock32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <AdditionalManifestDependencies>%(AdditionalManifestDependencies)</AdditionalManifestDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>.\Release/Yahoo.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Full</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;YAHOO_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>false</ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <FloatingPointModel>Fast</FloatingPointModel>
+ <RuntimeTypeInfo>false</RuntimeTypeInfo>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>yahoo.h</PrecompiledHeaderFile>
+ <BrowseInformationFile>
+ </BrowseInformationFile>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0419</Culture>
+ <AdditionalIncludeDirectories>./../../include/msapi/</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>wsock32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <AdditionalManifestDependencies>type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27X86%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies)</AdditionalManifestDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>.\Release/Yahoo.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Full</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;YAHOO_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>false</ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <FloatingPointModel>Fast</FloatingPointModel>
+ <RuntimeTypeInfo>false</RuntimeTypeInfo>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>yahoo.h</PrecompiledHeaderFile>
+ <BrowseInformationFile>
+ </BrowseInformationFile>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0419</Culture>
+ <AdditionalIncludeDirectories>./../../include/msapi/</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>wsock32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <AdditionalManifestDependencies>%(AdditionalManifestDependencies)</AdditionalManifestDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>.\Debug/Yahoo.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;YAHOO_EXPORTS;HAVE_CONFIG_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>false</StringPooling>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <FloatingPointModel>Precise</FloatingPointModel>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>yahoo.h</PrecompiledHeaderFile>
+ <BrowseInformationFile>
+ </BrowseInformationFile>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0419</Culture>
+ <AdditionalIncludeDirectories>./../../include/msapi/</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>wsock32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|x64'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>.\Debug/Yahoo.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;YAHOO_EXPORTS;HAVE_CONFIG_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>false</StringPooling>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <FloatingPointModel>Precise</FloatingPointModel>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>yahoo.h</PrecompiledHeaderFile>
+ <BrowseInformationFile>
+ </BrowseInformationFile>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0419</Culture>
+ <AdditionalIncludeDirectories>./../../include/msapi/</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>wsock32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <AdditionalManifestDependencies>%(AdditionalManifestDependencies)</AdditionalManifestDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>.\Release/Yahoo.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Full</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;YAHOO_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>false</ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <FloatingPointModel>Fast</FloatingPointModel>
+ <RuntimeTypeInfo>false</RuntimeTypeInfo>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>yahoo.h</PrecompiledHeaderFile>
+ <BrowseInformationFile>
+ </BrowseInformationFile>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0419</Culture>
+ <AdditionalIncludeDirectories>./../../include/msapi/</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>wsock32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalManifestDependencies>type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27X86%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies)</AdditionalManifestDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Unicode|x64'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>.\Release/Yahoo.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Full</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;YAHOO_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>false</ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <FloatingPointModel>Fast</FloatingPointModel>
+ <RuntimeTypeInfo>false</RuntimeTypeInfo>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>yahoo.h</PrecompiledHeaderFile>
+ <BrowseInformationFile>
+ </BrowseInformationFile>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0419</Culture>
+ <AdditionalIncludeDirectories>./../../include/msapi/</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>wsock32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalManifestDependencies>%(AdditionalManifestDependencies)</AdditionalManifestDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="avatar.cpp" />
+ <ClCompile Include="chat.cpp" />
+ <ClCompile Include="file_transfer.cpp" />
+ <ClCompile Include="http_gateway.cpp" />
+ <ClCompile Include="icolib.cpp" />
+ <ClCompile Include="ignore.cpp" />
+ <ClCompile Include="im.cpp" />
+ <ClCompile Include="links.cpp" />
+ <ClCompile Include="main.cpp" />
+ <ClCompile Include="options.cpp" />
+ <ClCompile Include="proto.cpp" />
+ <ClCompile Include="search.cpp" />
+ <ClCompile Include="server.cpp" />
+ <ClCompile Include="services.cpp" />
+ <ClCompile Include="user_info.cpp" />
+ <ClCompile Include="util.cpp" />
+ <ClCompile Include="webcam.cpp" />
+ <ClCompile Include="yahoo.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|x64'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release Unicode|x64'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+ </ClCompile>
+ <ClCompile Include="libyahoo2\crypt.c">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release Unicode|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
+ </ClCompile>
+ <ClCompile Include="libyahoo2\libyahoo2.c">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release Unicode|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
+ </ClCompile>
+ <ClCompile Include="libyahoo2\yahoo_httplib.c">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release Unicode|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
+ </ClCompile>
+ <ClCompile Include="libyahoo2\yahoo_list.c">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release Unicode|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
+ </ClCompile>
+ <ClCompile Include="libyahoo2\yahoo_util.c">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release Unicode|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="libyahoo2\config.h" />
+ <ClInclude Include="libyahoo2\yahoo2.h" />
+ <ClInclude Include="libyahoo2\yahoo2_callbacks.h" />
+ <ClInclude Include="libyahoo2\yahoo2_types.h" />
+ <ClInclude Include="libyahoo2\yahoo_debug.h" />
+ <ClInclude Include="libyahoo2\yahoo_httplib.h" />
+ <ClInclude Include="libyahoo2\yahoo_list.h" />
+ <ClInclude Include="libyahoo2\yahoo_util.h" />
+ <ClInclude Include="http_gateway.h" />
+ <ClInclude Include="ignore.h" />
+ <ClInclude Include="proto.h" />
+ <ClInclude Include="resource.h" />
+ <ClInclude Include="yahoo.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="Yahoo.rc" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/protocols/Yahoo/Yahoo_10.vcxproj.filters b/protocols/Yahoo/Yahoo_10.vcxproj.filters
new file mode 100644
index 0000000000..9df62075f8
--- /dev/null
+++ b/protocols/Yahoo/Yahoo_10.vcxproj.filters
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{c68788e9-3d77-44e1-a66b-bda39296f53f}</UniqueIdentifier>
+ <Extensions>cpp;c;cxx;rc;def;r;odl;idl;hpj;bat</Extensions>
+ </Filter>
+ <Filter Include="Source Files\libyahoo2">
+ <UniqueIdentifier>{d20cb62e-866e-477a-8707-3b29c4f94cfa}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{288de062-fdf1-46a7-a887-c66e6f87a98c}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{7dad73cf-d1b2-4738-bf9a-ef0718c4837d}</UniqueIdentifier>
+ <Extensions>ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="avatar.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="chat.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="file_transfer.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="http_gateway.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="icolib.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="ignore.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="im.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="main.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="options.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="proto.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="search.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="server.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="services.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="user_info.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="util.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="webcam.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="yahoo.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="libyahoo2\crypt.c">
+ <Filter>Source Files\libyahoo2</Filter>
+ </ClCompile>
+ <ClCompile Include="libyahoo2\libyahoo2.c">
+ <Filter>Source Files\libyahoo2</Filter>
+ </ClCompile>
+ <ClCompile Include="libyahoo2\yahoo_httplib.c">
+ <Filter>Source Files\libyahoo2</Filter>
+ </ClCompile>
+ <ClCompile Include="libyahoo2\yahoo_list.c">
+ <Filter>Source Files\libyahoo2</Filter>
+ </ClCompile>
+ <ClCompile Include="libyahoo2\yahoo_util.c">
+ <Filter>Source Files\libyahoo2</Filter>
+ </ClCompile>
+ <ClCompile Include="links.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="libyahoo2\config.h">
+ <Filter>Source Files\libyahoo2</Filter>
+ </ClInclude>
+ <ClInclude Include="libyahoo2\yahoo2.h">
+ <Filter>Source Files\libyahoo2</Filter>
+ </ClInclude>
+ <ClInclude Include="libyahoo2\yahoo2_callbacks.h">
+ <Filter>Source Files\libyahoo2</Filter>
+ </ClInclude>
+ <ClInclude Include="libyahoo2\yahoo2_types.h">
+ <Filter>Source Files\libyahoo2</Filter>
+ </ClInclude>
+ <ClInclude Include="libyahoo2\yahoo_debug.h">
+ <Filter>Source Files\libyahoo2</Filter>
+ </ClInclude>
+ <ClInclude Include="libyahoo2\yahoo_httplib.h">
+ <Filter>Source Files\libyahoo2</Filter>
+ </ClInclude>
+ <ClInclude Include="libyahoo2\yahoo_list.h">
+ <Filter>Source Files\libyahoo2</Filter>
+ </ClInclude>
+ <ClInclude Include="libyahoo2\yahoo_util.h">
+ <Filter>Source Files\libyahoo2</Filter>
+ </ClInclude>
+ <ClInclude Include="http_gateway.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="ignore.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="proto.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="resource.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="yahoo.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="Yahoo.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/protocols/Yahoo/Yahoo_8.vcproj b/protocols/Yahoo/Yahoo_8.vcproj
new file mode 100644
index 0000000000..6a03cae708
--- /dev/null
+++ b/protocols/Yahoo/Yahoo_8.vcproj
@@ -0,0 +1,771 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="Yahoo"
+ ProjectGUID="{E42870DB-9FED-44E7-9C93-4E64D0C87F51}"
+ RootNamespace="Yahoo"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)/Plugins"
+ IntermediateDirectory="$(SolutionDir)$(ConfigurationName)/Obj/$(ProjectName)"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Debug/Yahoo.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;YAHOO_EXPORTS;HAVE_CONFIG_H"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderThrough="yahoo.h"
+ AssemblerListingLocation=""
+ BrowseInformationFile=""
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="4"
+ DisableSpecificWarnings="4996"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1049"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wsock32.lib"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ GenerateDebugInformation="true"
+ GenerateMapFile="false"
+ MapFileName=""
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)/Plugins"
+ IntermediateDirectory="$(SolutionDir)$(ConfigurationName)/Obj/$(ProjectName)"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Release/Yahoo.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ InlineFunctionExpansion="1"
+ FavorSizeOrSpeed="2"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;YAHOO_EXPORTS"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderThrough="yahoo.h"
+ AssemblerListingLocation=""
+ BrowseInformationFile=""
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ DisableSpecificWarnings="4996"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1049"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="true"
+ AdditionalDependencies="wsock32.lib"
+ SuppressStartupBanner="true"
+ AdditionalManifestDependencies="type=&apos;Win32&apos; name=&apos;Microsoft.Windows.Common-Controls&apos; version=&apos;6.0.0.0&apos; processorArchitecture=&apos;X86&apos; publicKeyToken=&apos;6595b64144ccf1df&apos; language=&apos;*&apos;"
+ GenerateDebugInformation="true"
+ GenerateMapFile="false"
+ MapFileName=""
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug Unicode|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)/Plugins"
+ IntermediateDirectory="$(SolutionDir)$(ConfigurationName)/Obj/$(ProjectName)"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Debug/Yahoo.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;YAHOO_EXPORTS;HAVE_CONFIG_H"
+ StringPooling="false"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ FloatingPointModel="0"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderThrough="yahoo.h"
+ AssemblerListingLocation=""
+ BrowseInformationFile=""
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="4"
+ DisableSpecificWarnings="4996"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1049"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wsock32.lib"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
+ GenerateMapFile="false"
+ MapFileName=""
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release Unicode|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)/Plugins"
+ IntermediateDirectory="$(SolutionDir)$(ConfigurationName)/Obj/$(ProjectName)"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Release/Yahoo.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ InlineFunctionExpansion="1"
+ FavorSizeOrSpeed="2"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;YAHOO_EXPORTS"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderThrough="yahoo.h"
+ AssemblerListingLocation=""
+ BrowseInformationFile=""
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ DisableSpecificWarnings="4996"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1049"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="true"
+ AdditionalDependencies="wsock32.lib"
+ AdditionalManifestDependencies="type=&apos;Win32&apos; name=&apos;Microsoft.Windows.Common-Controls&apos; version=&apos;6.0.0.0&apos; processorArchitecture=&apos;X86&apos; publicKeyToken=&apos;6595b64144ccf1df&apos; language=&apos;*&apos;"
+ GenerateDebugInformation="true"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+ >
+ <File
+ RelativePath=".\avatar.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\chat.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\file_transfer.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\http_gateway.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\icolib.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\ignore.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\im.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\links.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\main.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\options.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\proto.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\search.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\server.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\services.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\user_info.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\util.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\webcam.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\yahoo.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ </File>
+ <Filter
+ Name="libyahoo2"
+ >
+ <File
+ RelativePath=".\libyahoo2\config.h"
+ >
+ </File>
+ <File
+ RelativePath=".\libyahoo2\crypt.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\libyahoo2\libyahoo2.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo2.h"
+ >
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo2_callbacks.h"
+ >
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo2_types.h"
+ >
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_debug.h"
+ >
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_httplib.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_httplib.h"
+ >
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_list.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_list.h"
+ >
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_util.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_util.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl"
+ >
+ <File
+ RelativePath=".\http_gateway.h"
+ >
+ </File>
+ <File
+ RelativePath=".\ignore.h"
+ >
+ </File>
+ <File
+ RelativePath=".\proto.h"
+ >
+ </File>
+ <File
+ RelativePath=".\resource.h"
+ >
+ </File>
+ <File
+ RelativePath=".\yahoo.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+ >
+ <File
+ RelativePath=".\Yahoo.rc"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/protocols/Yahoo/Yahoo_9.vcproj b/protocols/Yahoo/Yahoo_9.vcproj
new file mode 100644
index 0000000000..9918b436be
--- /dev/null
+++ b/protocols/Yahoo/Yahoo_9.vcproj
@@ -0,0 +1,1361 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="Yahoo"
+ ProjectGUID="{E42870DB-9FED-44E7-9C93-4E64D0C87F51}"
+ RootNamespace="Yahoo"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)/Plugins"
+ IntermediateDirectory="$(SolutionDir)$(ConfigurationName)/Obj/$(ProjectName)"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Debug/Yahoo.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;YAHOO_EXPORTS;HAVE_CONFIG_H"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderThrough="yahoo.h"
+ AssemblerListingLocation=""
+ BrowseInformationFile=""
+ WarningLevel="3"
+ DebugInformationFormat="4"
+ DisableSpecificWarnings="4996"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1049"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="true"
+ AdditionalDependencies="wsock32.lib"
+ SuppressStartupBanner="true"
+ GenerateDebugInformation="true"
+ GenerateMapFile="false"
+ MapFileName=""
+ RandomizedBaseAddress="1"
+ ImportLibrary="$(IntDir)/$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)64/Plugins"
+ IntermediateDirectory="$(SolutionDir)$(ConfigurationName)64/Obj/$(ProjectName)"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="3"
+ TypeLibraryName=".\Debug/Yahoo.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;YAHOO_EXPORTS;HAVE_CONFIG_H"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderThrough="yahoo.h"
+ AssemblerListingLocation=""
+ BrowseInformationFile=""
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ DisableSpecificWarnings="4996"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1049"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="true"
+ AdditionalDependencies="wsock32.lib"
+ SuppressStartupBanner="true"
+ AdditionalManifestDependencies=""
+ GenerateDebugInformation="true"
+ GenerateMapFile="false"
+ MapFileName=""
+ RandomizedBaseAddress="1"
+ ImportLibrary="$(IntDir)/$(TargetName).lib"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)/Plugins"
+ IntermediateDirectory="$(SolutionDir)$(ConfigurationName)/Obj/$(ProjectName)"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Release/Yahoo.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ InlineFunctionExpansion="1"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="2"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;YAHOO_EXPORTS"
+ StringPooling="true"
+ ExceptionHandling="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ FloatingPointModel="2"
+ RuntimeTypeInfo="false"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderThrough="yahoo.h"
+ AssemblerListingLocation=""
+ BrowseInformationFile=""
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ DisableSpecificWarnings="4996"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1049"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="true"
+ AdditionalDependencies="wsock32.lib"
+ SuppressStartupBanner="true"
+ AdditionalManifestDependencies="type=&apos;Win32&apos; name=&apos;Microsoft.Windows.Common-Controls&apos; version=&apos;6.0.0.0&apos; processorArchitecture=&apos;X86&apos; publicKeyToken=&apos;6595b64144ccf1df&apos; language=&apos;*&apos;"
+ GenerateDebugInformation="true"
+ GenerateMapFile="false"
+ MapFileName=""
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
+ RandomizedBaseAddress="1"
+ ImportLibrary="$(IntDir)/$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)64/Plugins"
+ IntermediateDirectory="$(SolutionDir)$(ConfigurationName)64/Obj/$(ProjectName)"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="3"
+ TypeLibraryName=".\Release/Yahoo.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ InlineFunctionExpansion="1"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="2"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;YAHOO_EXPORTS"
+ StringPooling="true"
+ ExceptionHandling="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ FloatingPointModel="2"
+ RuntimeTypeInfo="false"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderThrough="yahoo.h"
+ AssemblerListingLocation=""
+ BrowseInformationFile=""
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ DisableSpecificWarnings="4996"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1049"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="true"
+ AdditionalDependencies="wsock32.lib"
+ SuppressStartupBanner="true"
+ AdditionalManifestDependencies=""
+ GenerateDebugInformation="true"
+ GenerateMapFile="false"
+ MapFileName=""
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
+ RandomizedBaseAddress="1"
+ ImportLibrary="$(IntDir)/$(TargetName).lib"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug Unicode|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)/Plugins"
+ IntermediateDirectory="$(SolutionDir)$(ConfigurationName)/Obj/$(ProjectName)"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Debug/Yahoo.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;YAHOO_EXPORTS;HAVE_CONFIG_H"
+ StringPooling="false"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ FloatingPointModel="0"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderThrough="yahoo.h"
+ AssemblerListingLocation=""
+ BrowseInformationFile=""
+ WarningLevel="3"
+ DebugInformationFormat="4"
+ DisableSpecificWarnings="4996"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1049"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="true"
+ AdditionalDependencies="wsock32.lib"
+ SuppressStartupBanner="true"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
+ GenerateMapFile="false"
+ MapFileName=""
+ RandomizedBaseAddress="1"
+ ImportLibrary="$(IntDir)/$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug Unicode|x64"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)64/Plugins"
+ IntermediateDirectory="$(SolutionDir)$(ConfigurationName)64/Obj/$(ProjectName)"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="3"
+ TypeLibraryName=".\Debug/Yahoo.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;YAHOO_EXPORTS;HAVE_CONFIG_H"
+ StringPooling="false"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ FloatingPointModel="0"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderThrough="yahoo.h"
+ AssemblerListingLocation=""
+ BrowseInformationFile=""
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ DisableSpecificWarnings="4996"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1049"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="true"
+ AdditionalDependencies="wsock32.lib"
+ SuppressStartupBanner="true"
+ AdditionalManifestDependencies=""
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
+ GenerateMapFile="false"
+ MapFileName=""
+ RandomizedBaseAddress="1"
+ ImportLibrary="$(IntDir)/$(TargetName).lib"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release Unicode|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)/Plugins"
+ IntermediateDirectory="$(SolutionDir)$(ConfigurationName)/Obj/$(ProjectName)"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Release/Yahoo.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ InlineFunctionExpansion="1"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="2"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;YAHOO_EXPORTS"
+ StringPooling="true"
+ ExceptionHandling="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ FloatingPointModel="2"
+ RuntimeTypeInfo="false"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderThrough="yahoo.h"
+ AssemblerListingLocation=""
+ BrowseInformationFile=""
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ DisableSpecificWarnings="4996"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1049"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="true"
+ AdditionalDependencies="wsock32.lib"
+ AdditionalManifestDependencies="type=&apos;Win32&apos; name=&apos;Microsoft.Windows.Common-Controls&apos; version=&apos;6.0.0.0&apos; processorArchitecture=&apos;X86&apos; publicKeyToken=&apos;6595b64144ccf1df&apos; language=&apos;*&apos;"
+ GenerateDebugInformation="true"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
+ RandomizedBaseAddress="1"
+ ImportLibrary="$(IntDir)/$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release Unicode|x64"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)64/Plugins"
+ IntermediateDirectory="$(SolutionDir)$(ConfigurationName)64/Obj/$(ProjectName)"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="3"
+ TypeLibraryName=".\Release/Yahoo.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ InlineFunctionExpansion="1"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="2"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;YAHOO_EXPORTS"
+ StringPooling="true"
+ ExceptionHandling="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ FloatingPointModel="2"
+ RuntimeTypeInfo="false"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderThrough="yahoo.h"
+ AssemblerListingLocation=""
+ BrowseInformationFile=""
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ DisableSpecificWarnings="4996"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1049"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="true"
+ AdditionalDependencies="wsock32.lib"
+ AdditionalManifestDependencies=""
+ GenerateDebugInformation="true"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
+ RandomizedBaseAddress="1"
+ ImportLibrary="$(IntDir)/$(TargetName).lib"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+ >
+ <File
+ RelativePath=".\avatar.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\chat.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\file_transfer.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\http_gateway.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\icolib.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\ignore.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\im.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\links.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\main.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\options.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\proto.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\search.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\server.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\services.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\user_info.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\util.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\webcam.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\yahoo.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ </File>
+ <Filter
+ Name="libyahoo2"
+ >
+ <File
+ RelativePath=".\libyahoo2\config.h"
+ >
+ </File>
+ <File
+ RelativePath=".\libyahoo2\crypt.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\libyahoo2\libyahoo2.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo2.h"
+ >
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo2_callbacks.h"
+ >
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo2_types.h"
+ >
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_debug.h"
+ >
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_httplib.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_httplib.h"
+ >
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_list.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_list.h"
+ >
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_util.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Unicode|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\libyahoo2\yahoo_util.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl"
+ >
+ <File
+ RelativePath=".\http_gateway.h"
+ >
+ </File>
+ <File
+ RelativePath=".\ignore.h"
+ >
+ </File>
+ <File
+ RelativePath=".\proto.h"
+ >
+ </File>
+ <File
+ RelativePath=".\resource.h"
+ >
+ </File>
+ <File
+ RelativePath=".\yahoo.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+ >
+ <File
+ RelativePath=".\Yahoo.rc"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/protocols/Yahoo/avatar.cpp b/protocols/Yahoo/avatar.cpp
new file mode 100644
index 0000000000..4ad7233cb9
--- /dev/null
+++ b/protocols/Yahoo/avatar.cpp
@@ -0,0 +1,920 @@
+/*
+ * $Id: avatar.cpp 14178 2012-03-11 15:02:54Z borkra $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+
+#include "yahoo.h"
+
+#include <sys/stat.h>
+
+#include <m_langpack.h>
+#include "m_folders.h"
+#include "avatar.h"
+#include "resource.h"
+
+/*
+ *31 bit hash function - this is based on g_string_hash function from glib
+ */
+
+int YAHOO_avt_hash(const char *key, DWORD len)
+{
+ /*
+ Thank you Pidgin and Kopete devs. It seems that both clients are using this code now.
+
+ */
+
+ const unsigned char *p = (const unsigned char *)key;
+ int checksum = 0, g, i = len;
+
+ while(i--) {
+ checksum = (checksum << 4) + *p++;
+
+ if((g = (checksum & 0xf0000000)) != 0)
+ checksum ^= g >> 23;
+
+ checksum &= ~g;
+ }
+
+ return checksum;
+}
+
+/**************** Send Avatar ********************/
+
+void upload_avt(int id, int fd, int error, void *data)
+{
+ struct yahoo_file_info *sf = (struct yahoo_file_info*) data;
+ unsigned long size = 0;
+ char buf[1024];
+ int rw; /* */
+ DWORD dw; /* needed for ReadFile */
+ HANDLE myhFile;
+
+ if (fd < 1 || error) {
+ LOG(("[get_fd] Connect Failed!"));
+ return;
+ }
+
+ myhFile = CreateFileA(sf->filename,
+ GENERIC_READ,
+ FILE_SHARE_READ|FILE_SHARE_WRITE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
+ 0);
+
+ if (myhFile == INVALID_HANDLE_VALUE) {
+ LOG(("[get_fd] Can't open file for reading?!"));
+ return;
+ }
+
+ LOG(("Sending file: %s size: %ld", sf->filename, sf->filesize));
+
+ do {
+ rw = ReadFile(myhFile, buf, sizeof(buf), &dw, NULL);
+
+ if (rw != 0) {
+ rw = Netlib_Send((HANDLE)fd, buf, dw, MSG_NODUMP);
+
+ if (rw < 1) {
+ LOG(("Upload Failed. Send error?"));
+ //ShowError(Translate("Yahoo Error"), Translate("Avatar upload failed!?!"));
+ break;
+ }
+
+ size += rw;
+ }
+ } while (rw >= 0 && size < sf->filesize);
+
+ CloseHandle(myhFile);
+
+ do {
+ rw = Netlib_Recv((HANDLE)fd, buf, sizeof(buf), 0);
+ LOG(("Got: %d bytes", rw));
+ } while (rw > 0);
+
+ LOG(("File send complete!"));
+}
+
+void __cdecl CYahooProto::send_avt_thread(void *psf)
+{
+ struct yahoo_file_info *sf = ( yahoo_file_info* )psf;
+ if (sf == NULL) {
+ DebugLog("[yahoo_send_avt_thread] SF IS NULL!!!");
+ return;
+ }
+
+ SetByte("AvatarUL", 1);
+ yahoo_send_avatar(m_id, sf->filename, sf->filesize, &upload_avt, sf);
+
+ free(sf->filename);
+ free(sf);
+
+ if (GetByte("AvatarUL", 1) == 1)
+ SetByte("AvatarUL", 0);
+}
+
+void CYahooProto::SendAvatar(const TCHAR *szFile)
+{
+ struct _stat statbuf;
+ if (_tstat( szFile, &statbuf ) != 0) {
+ LOG(("[YAHOO_SendAvatar] Error reading File information?!"));
+ return;
+ }
+
+ yahoo_file_info *sf = y_new(struct yahoo_file_info, 1);
+ sf->filesize = statbuf.st_size;
+
+#ifdef _UNICODE
+ wchar_t tszFilename[MAX_PATH];
+ wcscpy(tszFilename, szFile);
+ GetShortPathNameW(szFile, tszFilename, SIZEOF(tszFilename));
+ char szFilename[MAX_PATH];
+ WideCharToMultiByte(CP_ACP, 0, tszFilename, -1, szFilename, MAX_PATH, 0, 0);
+ sf->filename = strdup(szFilename);
+#else
+ sf->filename = strdup(szFile);
+#endif
+
+ DebugLog("[Uploading avatar] filename: %s size: %ld", sf->filename, sf->filesize);
+
+ YForkThread(&CYahooProto::send_avt_thread, sf);
+}
+
+struct avatar_info{
+ char *who;
+ char *pic_url;
+ int cksum;
+};
+
+void __cdecl CYahooProto::recv_avatarthread(void *pavt)
+{
+ PROTO_AVATAR_INFORMATION AI;
+ struct avatar_info *avt = ( avatar_info* )pavt;
+ int error = 0;
+ HANDLE hContact = 0;
+ TCHAR buf[4096];
+
+ if (avt == NULL) {
+ DebugLog("AVT IS NULL!!!");
+ return;
+ }
+
+ if (!m_bLoggedIn) {
+ DebugLog("We are not logged in!!!");
+ return;
+ }
+
+ // ProtoBroadcastAck(m_szModuleName, hContact, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, (HANDLE) 1, 0);
+
+ LOG(("yahoo_recv_avatarthread who:%s url:%s checksum: %d", avt->who, avt->pic_url, avt->cksum));
+
+ hContact = getbuddyH(avt->who);
+
+ if (!hContact){
+ LOG(("ERROR: Can't find buddy: %s", avt->who));
+ error = 1;
+ } else if (!error) {
+ SetDword(hContact, "PictCK", avt->cksum);
+ SetDword(hContact, "PictLoading", 1);
+ }
+
+ if(!error) {
+
+ NETLIBHTTPREQUEST nlhr={0},*nlhrReply;
+
+ nlhr.cbSize = sizeof(nlhr);
+ nlhr.requestType= REQUEST_GET;
+ nlhr.flags = NLHRF_NODUMP|NLHRF_GENERATEHOST|NLHRF_SMARTAUTHHEADER;
+ nlhr.szUrl = avt->pic_url;
+
+ nlhrReply=(NETLIBHTTPREQUEST*)CallService(MS_NETLIB_HTTPTRANSACTION,(WPARAM)m_hNetlibUser,(LPARAM)&nlhr);
+
+ if(nlhrReply) {
+
+ if (nlhrReply->resultCode != 200) {
+ LOG(("Update server returned '%d' instead of 200. It also sent the following: %s", nlhrReply->resultCode, nlhrReply->szResultDescr));
+ // make sure it's a real problem and not a problem w/ our connection
+ yahoo_send_picture_info(m_id, avt->who, 3, avt->pic_url, avt->cksum);
+ error = 1;
+ } else if (nlhrReply->dataLength < 1 || nlhrReply->pData == NULL) {
+ LOG(("No data??? Got %d bytes.", nlhrReply->dataLength));
+ error = 1;
+ } else {
+ HANDLE myhFile;
+
+ GetAvatarFileName(hContact, buf, 1024, DBGetContactSettingByte(hContact, m_szModuleName,"AvatarType", 0));
+ DeleteFile(buf);
+
+ LOG(("Saving file: %s size: %u", buf, nlhrReply->dataLength));
+ myhFile = CreateFile(buf,
+ GENERIC_WRITE,
+ FILE_SHARE_WRITE,
+ NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
+
+ if(myhFile !=INVALID_HANDLE_VALUE) {
+ DWORD c;
+
+ WriteFile(myhFile, nlhrReply->pData, nlhrReply->dataLength, &c, NULL );
+ CloseHandle(myhFile);
+
+ SetDword(hContact, "PictLastCheck", 0);
+ } else {
+ LOG(("Can not open file for writing: %s", buf));
+ error = 1;
+ }
+ }
+ CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,(LPARAM)nlhrReply);
+ }
+ }
+
+ if (GetDword(hContact, "PictCK", 0) != avt->cksum) {
+ LOG(("WARNING: Checksum updated during download?!"));
+ error = 1; /* don't use this one? */
+ }
+
+ SetDword(hContact, "PictLoading", 0);
+ LOG(("File download complete!?"));
+
+ if (error)
+ buf[0]='\0';
+
+ free(avt->who);
+ free(avt->pic_url);
+ free(avt);
+
+ AI.cbSize = sizeof AI;
+ AI.format = PA_FORMAT_PNG;
+ AI.hContact = hContact;
+ #if defined( _UNICODE )
+ WideCharToMultiByte( CP_ACP, 0, buf, -1, AI.filename, sizeof AI.filename, 0, 0 );
+ #else
+ lstrcpyA( AI.filename, buf );
+ #endif
+
+ if (error)
+ SetDword(hContact, "PictCK", 0);
+
+ ProtoBroadcastAck(m_szModuleName, hContact, ACKTYPE_AVATAR, !error ? ACKRESULT_SUCCESS:ACKRESULT_FAILED,(HANDLE) &AI, 0);
+}
+
+void CYahooProto::ext_got_picture(const char *me, const char *who, const char *pic_url, int cksum, int type)
+{
+ HANDLE hContact = 0;
+
+ LOG(("[ext_yahoo_got_picture] for %s with url %s (checksum: %d) type: %d", who, pic_url, cksum, type));
+
+ /*
+ Type:
+
+ 1 - Send Avatar Info
+ 2 - Got Avatar Info
+ 3 - YIM6 didn't like my avatar? Expired? We need to invalidate and re-load
+ */
+ switch (type) {
+ case 1:
+ {
+ int cksum=0;
+ DBVARIANT dbv;
+
+ /* need to send avatar info */
+ if (!GetByte( "ShowAvatars", 1 )) {
+ LOG(("[ext_yahoo_got_picture] We are not using/showing avatars!"));
+ yahoo_send_picture_update(m_id, who, 0); // no avatar (disabled)
+ return;
+ }
+
+ LOG(("[ext_yahoo_got_picture] Getting ready to send info!"));
+ /* need to read CheckSum */
+ cksum = GetDword("AvatarHash", 0);
+ if (cksum) {
+ if (!DBGetContactSettingString(NULL, m_szModuleName, "AvatarURL", &dbv)) {
+ LOG(("[ext_yahoo_got_picture] Sending url: %s checksum: %d to '%s'!", dbv.pszVal, cksum, who));
+ //void yahoo_send_picture_info(int id, const char *me, const char *who, const char *pic_url, int cksum)
+ yahoo_send_picture_info(m_id, who, 2, dbv.pszVal, cksum);
+ DBFreeVariant(&dbv);
+ break;
+ } else
+ LOG(("No AvatarURL???"));
+
+ /*
+ * Try to re-upload the avatar
+ */
+ if (GetByte("AvatarUL", 0) != 1){
+ // NO avatar URL??
+ if (!DBGetContactSettingTString(NULL, m_szModuleName, "AvatarFile", &dbv)) {
+ struct _stat statbuf;
+
+ if (_tstat( dbv.ptszVal, &statbuf ) != 0 ) {
+ LOG(("[ext_yahoo_got_picture] Avatar File Missing? Can't find file: %s", dbv.ptszVal));
+ } else {
+ DBWriteContactSettingString(NULL, m_szModuleName, "AvatarInv", who);
+ SendAvatar(dbv.ptszVal);
+ }
+
+ DBFreeVariant(&dbv);
+ } else {
+ LOG(("[ext_yahoo_got_picture] No Local Avatar File??? "));
+ }
+ } else
+ LOG(("[ext_yahoo_got_picture] Another avatar upload in progress?"));
+ }
+ }
+ break;
+ case 2: /*
+ * We got Avatar Info for our buddy.
+ */
+ if (!GetByte( "ShowAvatars", 1 )) {
+ LOG(("[ext_yahoo_got_picture] We are not using/showing avatars!"));
+ return;
+ }
+
+ /* got avatar info, so set miranda up */
+ hContact = getbuddyH(who);
+
+ if (!hContact) {
+ LOG(("[ext_yahoo_got_picture] Buddy not on my buddy list?."));
+ return;
+ }
+
+ if (!cksum && pic_url) {
+ const char *chk = strstr(pic_url, "chksum=");
+ if (chk)
+ cksum = strtol(chk + 7, NULL, 10);
+ }
+
+ if (!cksum || cksum == -1) {
+ LOG(("[ext_yahoo_got_picture] Resetting avatar."));
+ DBWriteContactSettingDword(hContact, m_szModuleName, "PictCK", 0);
+
+ reset_avatar(hContact);
+ } else {
+ if (pic_url == NULL) {
+ LOG(("[ext_yahoo_got_picture] WARNING: Empty URL for avatar?"));
+ return;
+ }
+
+ TCHAR z[1024];
+ GetAvatarFileName(hContact, z, 1024, DBGetContactSettingByte(hContact, m_szModuleName,"AvatarType", 0));
+
+ if (DBGetContactSettingDword(hContact, m_szModuleName,"PictCK", 0) != cksum || _taccess( z, 0 ) != 0 ) {
+
+ DebugLog("[ext_yahoo_got_picture] Checksums don't match or avatar file is missing. Current: %d, New: %d",(int)DBGetContactSettingDword(hContact, m_szModuleName,"PictCK", 0), cksum);
+
+ struct avatar_info *avt = ( avatar_info* )malloc(sizeof(struct avatar_info));
+ avt->who = strdup(who);
+ avt->pic_url = strdup(pic_url);
+ avt->cksum = cksum;
+
+ YForkThread(&CYahooProto::recv_avatarthread, avt);
+ }
+ }
+
+ break;
+ case 3:
+ /*
+ * Our Avatar is not good anymore? Need to re-upload??
+ */
+ /* who, pic_url, cksum */
+ {
+ int mcksum=0;
+ DBVARIANT dbv;
+
+ /* need to send avatar info */
+ if (!GetByte( "ShowAvatars", 1 )) {
+ LOG(("[ext_yahoo_got_picture] We are not using/showing avatars!"));
+ yahoo_send_picture_update(m_id, who, 0); // no avatar (disabled)
+ return;
+ }
+
+ LOG(("[ext_yahoo_got_picture] Getting ready to send info!"));
+ /* need to read CheckSum */
+ mcksum = GetDword("AvatarHash", 0);
+ if (mcksum == 0) {
+ /* this should NEVER Happen??? */
+ LOG(("[ext_yahoo_got_picture] No personal checksum? and Invalidate?!"));
+ yahoo_send_picture_update(m_id, who, 0); // no avatar (disabled)
+ return;
+ }
+
+ LOG(("[ext_yahoo_got_picture] My Checksum: %d", mcksum));
+
+ if (!DBGetContactSettingString(NULL, m_szModuleName, "AvatarURL", &dbv)){
+ if (lstrcmpiA(pic_url, dbv.pszVal) == 0) {
+ DBVARIANT dbv2;
+ /*time_t ts;
+ DWORD ae;*/
+
+ if (mcksum != cksum)
+ LOG(("[ext_yahoo_got_picture] WARNING: Checksums don't match!"));
+
+ /*time(&ts);
+ ae = GetDword("AvatarExpires", 0);
+
+ if (ae != 0 && ae > (ts - 300)) {
+ LOG(("[ext_yahoo_got_picture] Current Time: %lu Expires: %lu ", ts, ae));
+ LOG(("[ext_yahoo_got_picture] We just reuploaded! Stop screwing with Yahoo FT. "));
+
+ // don't leak stuff
+ DBFreeVariant(&dbv);
+
+ break;
+ }*/
+
+ LOG(("[ext_yahoo_got_picture] Buddy: %s told us this is bad??Expired??. Re-uploading", who));
+ DBDeleteContactSetting(NULL, m_szModuleName, "AvatarURL");
+
+ if (!DBGetContactSettingTString(NULL, m_szModuleName, "AvatarFile", &dbv2)) {
+ DBWriteContactSettingString(NULL, m_szModuleName, "AvatarInv", who);
+ SendAvatar(dbv2.ptszVal);
+ DBFreeVariant(&dbv2);
+ } else {
+ LOG(("[ext_yahoo_got_picture] No Local Avatar File??? "));
+ }
+ } else {
+ LOG(("[ext_yahoo_got_picture] URL doesn't match? Tell them the right thing!!!"));
+ yahoo_send_picture_info(m_id, who, 2, dbv.pszVal, mcksum);
+ }
+ // don't leak stuff
+ DBFreeVariant(&dbv);
+ } else {
+ LOG(("[ext_yahoo_got_picture] no AvatarURL?"));
+ }
+ }
+ break;
+ default:
+ LOG(("[ext_yahoo_got_picture] Unknown request/packet type exiting!"));
+ }
+
+ LOG(("ext_yahoo_got_picture exiting"));
+}
+
+void CYahooProto::ext_got_picture_checksum(const char *me, const char *who, int cksum)
+{
+ HANDLE hContact = 0;
+
+ LOG(("ext_yahoo_got_picture_checksum for %s checksum: %d", who, cksum));
+
+ hContact = getbuddyH(who);
+ if (hContact == NULL) {
+ LOG(("Buddy Not Found. Skipping avatar update"));
+ return;
+ }
+
+ /* Last thing check the checksum and request new one if we need to */
+ if (!cksum || cksum == -1) {
+ DBWriteContactSettingDword(hContact, m_szModuleName, "PictCK", 0);
+
+ reset_avatar(hContact);
+ }
+ else {
+ if (DBGetContactSettingDword(hContact, m_szModuleName,"PictCK", 0) != cksum) {
+ // Now save the new checksum. No rush requesting new avatar yet.
+ DBWriteContactSettingDword(hContact, m_szModuleName, "PictCK", cksum);
+
+ // Need to delete the Avatar File!!
+ TCHAR szFile[MAX_PATH];
+ GetAvatarFileName(hContact, szFile, sizeof szFile, 0);
+ DeleteFile(szFile);
+
+ // Reset the avatar and cleanup.
+ reset_avatar(hContact);
+
+ // Request new avatar here... (might also want to check the sharing status?)
+
+ if (GetByte( "ShareAvatar", 0 ) == 2)
+ request_avatar(who);
+ }
+ }
+}
+
+void CYahooProto::ext_got_picture_update(const char *me, const char *who, int buddy_icon)
+{
+ HANDLE hContact = 0;
+
+ LOG(("ext_got_picture_update for %s buddy_icon: %d", who, buddy_icon));
+
+ hContact = getbuddyH(who);
+ if (hContact == NULL) {
+ LOG(("Buddy Not Found. Skipping avatar update"));
+ return;
+ }
+
+ DBWriteContactSettingByte(hContact, m_szModuleName, "AvatarType", buddy_icon);
+
+ /* Last thing check the checksum and request new one if we need to */
+ reset_avatar(hContact);
+}
+
+void CYahooProto::ext_got_picture_status(const char *me, const char *who, int buddy_icon)
+{
+ HANDLE hContact = 0;
+
+ LOG(("ext_yahoo_got_picture_status for %s buddy_icon: %d", who, buddy_icon));
+
+ hContact = getbuddyH(who);
+ if (hContact == NULL) {
+ LOG(("Buddy Not Found. Skipping avatar update"));
+ return;
+ }
+
+ DBWriteContactSettingByte(hContact, m_szModuleName, "AvatarType", buddy_icon);
+
+ /* Last thing check the checksum and request new one if we need to */
+ reset_avatar(hContact);
+}
+
+void CYahooProto::ext_got_picture_upload(const char *me, const char *url,unsigned int ts)
+{
+ int cksum = 0;
+ DBVARIANT dbv;
+
+ LOG(("[ext_yahoo_got_picture_upload] url: %s timestamp: %d", url, ts));
+
+ if (!url) {
+ LOG(("[ext_yahoo_got_picture_upload] Problem with upload?"));
+ return;
+ }
+
+
+ cksum = GetDword("TMPAvatarHash", 0);
+ if (cksum != 0) {
+ LOG(("[ext_yahoo_got_picture_upload] Updating Checksum to: %d", cksum));
+ SetDword("AvatarHash", cksum);
+ DBDeleteContactSetting(NULL, m_szModuleName, "TMPAvatarHash");
+
+ // This is only meant for message sessions, but we don't got those in miranda yet
+ //YAHOO_bcast_picture_checksum(cksum);
+ yahoo_send_picture_checksum(m_id, NULL, cksum);
+
+ // need to tell the stupid Yahoo that our icon updated
+ //YAHOO_bcast_picture_update(2);
+ }else
+ cksum = GetDword("AvatarHash", 0);
+
+ SetString(NULL, "AvatarURL", url);
+ //YAHOO_SetDword("AvatarExpires", ts);
+
+ if (!DBGetContactSettingString(NULL, m_szModuleName, "AvatarInv", &dbv) ){
+ LOG(("[ext_yahoo_got_picture_upload] Buddy: %s told us this is bad??", dbv.pszVal));
+
+ LOG(("[ext_yahoo_got_picture] Sending url: %s checksum: %d to '%s'!", url, cksum, dbv.pszVal));
+ //void yahoo_send_picture_info(int id, const char *me, const char *who, const char *pic_url, int cksum)
+ yahoo_send_picture_info(m_id, dbv.pszVal, 2, url, cksum);
+
+ DBDeleteContactSetting(NULL, m_szModuleName, "AvatarInv");
+ DBFreeVariant(&dbv);
+ }
+}
+
+void CYahooProto::ext_got_avatar_share(int buddy_icon)
+{
+ LOG(("[ext_yahoo_got_avatar_share] buddy icon: %d", buddy_icon));
+
+ SetByte( "ShareAvatar", buddy_icon );
+}
+
+void CYahooProto::reset_avatar(HANDLE hContact)
+{
+ LOG(("[YAHOO_RESET_AVATAR]"));
+
+ ProtoBroadcastAck(m_szModuleName, hContact, ACKTYPE_AVATAR, ACKRESULT_STATUS, NULL, 0);
+}
+
+void CYahooProto::request_avatar(const char* who)
+{
+ time_t last_chk, cur_time;
+ HANDLE hContact = 0;
+ //char szFile[MAX_PATH];
+
+ if (!GetByte( "ShowAvatars", 1 )) {
+ LOG(("Avatars disabled, but available for: %s", who));
+ return;
+ }
+
+ hContact = getbuddyH(who);
+
+ if (!hContact)
+ return;
+
+ /*GetAvatarFileName(hContact, szFile, sizeof szFile, DBGetContactSettingByte(hContact, m_szModuleName,"AvatarType", 0));
+ DeleteFile(szFile);*/
+
+ time(&cur_time);
+ last_chk = DBGetContactSettingDword(hContact, m_szModuleName, "PictLastCheck", 0);
+
+ /*
+ * time() - in seconds ( 60*60 = 1 hour)
+ */
+ if (DBGetContactSettingDword(hContact, m_szModuleName,"PictCK", 0) == 0 ||
+ last_chk == 0 || (cur_time - last_chk) > 60) {
+
+ DBWriteContactSettingDword(hContact, m_szModuleName, "PictLastCheck", (DWORD)cur_time);
+
+ LOG(("Requesting Avatar for: %s", who));
+ yahoo_request_buddy_avatar(m_id, who);
+ } else {
+ LOG(("Avatar Not Available for: %s Last Check: %ld Current: %ld (Flood Check in Effect)", who, last_chk, cur_time));
+ }
+}
+
+void CYahooProto::InitCustomFolders(void)
+{
+ if ( InitCstFldRan ) return;
+
+ InitCstFldRan = true;
+ if ( ServiceExists( MS_FOLDERS_REGISTER_PATH ))
+ {
+ TCHAR AvatarsFolder[MAX_PATH];
+ TCHAR *tmpPath = Utils_ReplaceVarsT( _T("%miranda_avatarcache%"));
+ mir_sntprintf(AvatarsFolder, MAX_PATH, _T("%s\\") _T(TCHAR_STR_PARAM), tmpPath, m_szModuleName);
+ hYahooAvatarsFolder = FoldersRegisterCustomPathT(m_szModuleName, "Avatars", AvatarsFolder);
+ mir_free(tmpPath);
+ }
+}
+
+void CYahooProto::GetAvatarFileName(HANDLE hContact, TCHAR* pszDest, int cbLen, int type)
+{
+ size_t tPathLen;
+
+ InitCustomFolders();
+
+ TCHAR* path = ( TCHAR* )alloca( sizeof(TCHAR)*( cbLen+1 ));
+ if ( hYahooAvatarsFolder != NULL && !FoldersGetCustomPathT( hYahooAvatarsFolder, path, (int)cbLen, _T("")))
+ {
+ _tcscpy( pszDest, path );
+ tPathLen = _tcslen( pszDest );
+ } else {
+ TCHAR *tmpPath = Utils_ReplaceVarsT( _T("%miranda_avatarcache%"));
+ tPathLen = mir_sntprintf(pszDest, cbLen, _T("%s\\") _T(TCHAR_STR_PARAM), tmpPath, m_szModuleName);
+ mir_free(tmpPath);
+ }
+
+ if ( _taccess(pszDest, 0))
+ YAHOO_CallService(MS_UTILS_CREATEDIRTREET, 0, (LPARAM)pszDest);
+
+ if (hContact != NULL) {
+ int ck_sum = DBGetContactSettingDword(hContact, m_szModuleName,"PictCK", 0);
+ tPathLen += mir_sntprintf(pszDest + tPathLen, cbLen - tPathLen, _T("\\%lX"), ck_sum);
+ } else {
+ tPathLen += mir_sntprintf(pszDest + tPathLen, cbLen - tPathLen, _T("\\") _T(TCHAR_STR_PARAM) _T(" avatar"), m_szModuleName);
+ }
+
+ mir_sntprintf(pszDest + tPathLen, cbLen - tPathLen, _T("%s"), type == 1 ? _T(".swf") : _T(".png"));
+}
+
+INT_PTR __cdecl CYahooProto::GetAvatarInfo(WPARAM wParam,LPARAM lParam)
+{
+ PROTO_AVATAR_INFORMATIONT* AI = ( PROTO_AVATAR_INFORMATIONT* )lParam;
+ DBVARIANT dbv;
+ int avtType;
+
+ if (!DBGetContactSettingString(AI->hContact, m_szModuleName, YAHOO_LOGINID, &dbv)) {
+ DebugLog("[YAHOO_GETAVATARINFO] For: %s", dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }else {
+ DebugLog("[YAHOO_GETAVATARINFO]");
+ }
+
+ if (!GetByte( "ShowAvatars", 1 ) || !m_bLoggedIn) {
+ DebugLog("[YAHOO_GETAVATARINFO] %s", m_bLoggedIn ? "We are not using/showing avatars!" : "We are not logged in. Can't load avatars now!");
+
+ return GAIR_NOAVATAR;
+ }
+
+ avtType = DBGetContactSettingByte(AI->hContact, m_szModuleName,"AvatarType", 0);
+ DebugLog("[YAHOO_GETAVATARINFO] Avatar Type: %d", avtType);
+
+ if ( avtType != 2) {
+ if (avtType != 0)
+ DebugLog("[YAHOO_GETAVATARINFO] Not handling this type yet!");
+
+ return GAIR_NOAVATAR;
+ }
+
+ if (DBGetContactSettingDword(AI->hContact, m_szModuleName,"PictCK", 0) == 0)
+ return GAIR_NOAVATAR;
+
+ GetAvatarFileName(AI->hContact, AI->filename, SIZEOF(AI->filename), DBGetContactSettingByte(AI->hContact, m_szModuleName,"AvatarType", 0));
+ AI->format = PA_FORMAT_PNG;
+ DebugLog("[YAHOO_GETAVATARINFO] filename: %s", AI->filename);
+
+ if (_taccess( AI->filename, 0 ) == 0 )
+ return GAIR_SUCCESS;
+
+ if (( wParam & GAIF_FORCE ) != 0 && AI->hContact != NULL ) {
+ /* need to request it again? */
+ if (GetDword(AI->hContact, "PictLoading", 0) != 0 &&
+ (time(NULL) - GetDword(AI->hContact, "PictLastCheck", 0) < 500)) {
+ DebugLog("[YAHOO_GETAVATARINFO] Waiting for avatar to load!");
+ return GAIR_WAITFOR;
+ } else if ( m_bLoggedIn ) {
+ DBVARIANT dbv;
+
+ if (!DBGetContactSettingString(AI->hContact, m_szModuleName, YAHOO_LOGINID, &dbv)) {
+ DebugLog("[YAHOO_GETAVATARINFO] Requesting avatar!");
+
+ request_avatar(dbv.pszVal);
+ DBFreeVariant(&dbv);
+
+ return GAIR_WAITFOR;
+ } else {
+ DebugLog("[YAHOO_GETAVATARINFO] Can't retrieve user id?!");
+ }
+ }
+ }
+
+ DebugLog("[YAHOO_GETAVATARINFO] NO AVATAR???");
+ return GAIR_NOAVATAR;
+}
+
+/*
+ * --=[ AVS / LoadAvatars API/Services ]=--
+ */
+INT_PTR __cdecl CYahooProto::GetAvatarCaps(WPARAM wParam, LPARAM lParam)
+{
+ int res = 0;
+
+ switch (wParam) {
+ case AF_MAXSIZE:
+ LOG(("[YahooGetAvatarCaps] AF_MAXSIZE"));
+
+ ((POINT*)lParam)->x = 96;
+ ((POINT*)lParam)->y = 96;
+
+ break;
+
+ case AF_PROPORTION:
+ LOG(("[YahooGetAvatarCaps] AF_PROPORTION"));
+
+ res = PIP_NONE;
+ break;
+
+ case AF_FORMATSUPPORTED:
+ LOG(("[YahooGetAvatarCaps] AF_FORMATSUPPORTED"));
+ res = lParam == PA_FORMAT_PNG;
+ break;
+
+ case AF_ENABLED:
+ LOG(("[YahooGetAvatarCaps] AF_ENABLED"));
+
+ res = (GetByte( "ShowAvatars", 1 )) ? 1 : 0;
+ break;
+
+ case AF_DONTNEEDDELAYS:
+ res = 1; /* don't need to delay avatar loading */
+ break;
+
+ case AF_MAXFILESIZE:
+ res = 0; /* no max filesize for now */
+ break;
+
+ case AF_DELAYAFTERFAIL:
+ res = 15 * 60 * 1000; /* 15 mins */
+ break;
+
+ default:
+ LOG(("[YahooGetAvatarCaps] Unknown: %d", wParam));
+ }
+
+ return res;
+}
+
+/*
+Service: /GetMyAvatar
+wParam=(char *)Buffer to file name
+lParam=(int)Buffer size
+return=0 on success, else on error
+*/
+INT_PTR __cdecl CYahooProto::GetMyAvatar(WPARAM wParam, LPARAM lParam)
+{
+ TCHAR *buffer = ( TCHAR* )wParam;
+ int size = (int)lParam;
+
+ DebugLog("[YahooGetMyAvatar]");
+
+ if (buffer == NULL || size <= 0)
+ return -1;
+
+ if (!GetByte( "ShowAvatars", 1 ))
+ return -2;
+
+ DBVARIANT dbv;
+ int ret = -3;
+
+ if (GetDword("AvatarHash", 0)){
+ if (!DBGetContactSettingTString(NULL, m_szModuleName, "AvatarFile", &dbv)){
+ if (_taccess(dbv.ptszVal, 0) == 0){
+ lstrcpyn(buffer, dbv.ptszVal, size-1);
+ buffer[size-1] = '\0';
+
+ ret = 0;
+ }
+ DBFreeVariant(&dbv);
+ }
+ }
+
+ return ret;
+}
+
+/*
+#define PS_SETMYAVATAR "/SetMyAvatar"
+wParam=0
+lParam=(const char *)Avatar file name
+return=0 for sucess
+*/
+
+INT_PTR __cdecl CYahooProto::SetMyAvatar(WPARAM wParam, LPARAM lParam)
+{
+ TCHAR* tszFile = ( TCHAR* )lParam;
+ TCHAR tszMyFile[MAX_PATH+1];
+
+ GetAvatarFileName(NULL, tszMyFile, MAX_PATH, 2);
+
+ if (tszFile == NULL) {
+ DebugLog("[Deleting Avatar Info]");
+
+ /* remove ALL our Avatar Info Keys */
+ DBDeleteContactSetting(NULL, m_szModuleName, "AvatarFile");
+ DBDeleteContactSetting(NULL, m_szModuleName, "AvatarHash");
+ DBDeleteContactSetting(NULL, m_szModuleName, "AvatarURL");
+ DBDeleteContactSetting(NULL, m_szModuleName, "AvatarTS");
+
+ /* Send a Yahoo packet saying we don't got an avatar anymore */
+ yahoo_send_picture_status(m_id, 0);
+
+ SetByte("ShareAvatar",0);
+
+ DeleteFile(tszMyFile);
+ } else {
+ DWORD dwPngSize, dw;
+ BYTE* pResult;
+ unsigned int hash;
+ HANDLE hFile;
+
+ hFile = CreateFile(tszFile,
+ GENERIC_READ,
+ FILE_SHARE_READ|FILE_SHARE_WRITE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
+ 0 );
+
+ if ( hFile == INVALID_HANDLE_VALUE )
+ return 1;
+
+ dwPngSize = GetFileSize( hFile, NULL );
+ if (( pResult = ( BYTE* )malloc( dwPngSize )) == NULL )
+ return 2;
+
+ ReadFile( hFile, pResult, dwPngSize, &dw, NULL );
+ CloseHandle( hFile );
+
+ hFile = CreateFile(tszMyFile,
+ GENERIC_WRITE,
+ FILE_SHARE_WRITE,
+ NULL,
+ OPEN_ALWAYS,
+ FILE_ATTRIBUTE_NORMAL, 0);
+ if ( hFile == INVALID_HANDLE_VALUE )
+ return 1;
+
+ WriteFile( hFile, pResult, dwPngSize, &dw, NULL );
+ SetEndOfFile( hFile);
+ CloseHandle( hFile );
+
+ hash = YAHOO_avt_hash(( const char* )pResult, dwPngSize);
+ free( pResult );
+
+ if ( hash ) {
+ LOG(("[YAHOO_SetAvatar] File: '%s' CK: %d", tszMyFile, hash));
+
+ /* now check and make sure we don't reupload same thing over again */
+ if (hash != GetDword("AvatarHash", 0)) {
+ SetStringT(NULL, "AvatarFile", tszMyFile);
+ DBWriteContactSettingDword(NULL, m_szModuleName, "TMPAvatarHash", hash);
+
+ /* Set Sharing to ON if it's OFF */
+ if (GetByte( "ShareAvatar", 0 ) != 2) {
+ SetByte( "ShareAvatar", 2 );
+ yahoo_send_picture_status(m_id, 2);
+ }
+
+ SendAvatar(tszMyFile);
+ }
+ else LOG(("[YAHOO_SetAvatar] Same checksum and avatar on YahooFT. Not Reuploading."));
+ } }
+
+ return 0;
+}
+
+/*
+ * --=[ ]=--
+ */
diff --git a/protocols/Yahoo/avatar.h b/protocols/Yahoo/avatar.h
new file mode 100644
index 0000000000..57bf6e6e8f
--- /dev/null
+++ b/protocols/Yahoo/avatar.h
@@ -0,0 +1,60 @@
+/*
+ * $Id: avatar.h 8461 2008-10-23 14:39:20Z gena01 $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+#ifndef _YAHOO_AVATAR_H_
+#define _YAHOO_AVATAR_H_
+
+#include <m_avatars.h>
+
+void YAHOO_request_avatar(const char* who);
+void GetAvatarFileName(HANDLE hContact, char* pszDest, int cbLen, int type);
+
+void YAHOO_SendAvatar(const char *szFile);
+
+void YAHOO_set_avatar(int buddy_icon);
+
+int YAHOO_SaveBitmapAsAvatar( HBITMAP hBitmap, const char* szFileName );
+
+HBITMAP YAHOO_StretchBitmap( HBITMAP hBitmap );
+
+void yahoo_reset_avatar(HANDLE hContact);
+
+HBITMAP YAHOO_SetAvatar(const char *szFile);
+
+void YAHOO_get_avatar(const char *who, const char *pic_url, long cksum);
+
+/**
+ * AVS Services - loadavatars.dll uses these to get the info from us
+ */
+int YahooGetAvatarCaps(WPARAM wParam, LPARAM lParam);
+
+int YahooGetAvatarInfo(WPARAM wParam,LPARAM lParam);
+
+int YahooGetMyAvatar(WPARAM wParam, LPARAM lParam);
+
+int YahooSetMyAvatar(WPARAM wParam, LPARAM lParam);
+
+/**
+ * Callbacks for libyahoo2
+ */
+void ext_yahoo_got_picture(int id, const char *me, const char *who, const char *pic_url, int cksum, int type);
+
+void ext_yahoo_got_picture_checksum(int id, const char *me, const char *who, int cksum);
+
+void ext_yahoo_got_picture_update(int id, const char *me, const char *who, int buddy_icon);
+
+void ext_yahoo_got_picture_status(int id, const char *me, const char *who, int buddy_icon);
+
+void ext_yahoo_got_picture_upload(int id, const char *me, const char *url,unsigned int ts);
+
+void ext_yahoo_got_avatar_share(int id, int buddy_icon);
+#endif
diff --git a/protocols/Yahoo/chat.cpp b/protocols/Yahoo/chat.cpp
new file mode 100644
index 0000000000..c60a0cec8c
--- /dev/null
+++ b/protocols/Yahoo/chat.cpp
@@ -0,0 +1,72 @@
+/*
+ * $Id: chat.cpp 9334 2009-04-04 21:56:36Z gena01 $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+#include "yahoo.h"
+#include <m_protosvc.h>
+#include <m_langpack.h>
+#include <m_message.h>
+
+/* Conference handlers */
+void ext_yahoo_got_conf_invite(int id, const char *me, const char *who, const char *room, const char *msg, YList *members)
+{
+ char z[1024];
+ _snprintf(z, sizeof(z), Translate("[miranda] Got conference invite to room: %s with msg: %s"), room ?room:"", msg ?msg:"");
+ LOG(("[ext_yahoo_got_conf_invite] %s", z));
+ GETPROTOBYID( id )->ext_got_im("me", who, 0, z, 0, 0, 1, -1);
+
+ yahoo_conference_decline(id, NULL, members, room, Translate("I am sorry, but i can't join your conference since this feature is not currently implemented in my client."));
+}
+
+void ext_yahoo_conf_userdecline(int id, const char *me, const char *who, const char *room, const char *msg)
+{
+}
+
+void ext_yahoo_conf_userjoin(int id, const char *me, const char *who, const char *room)
+{
+}
+
+void ext_yahoo_conf_userleave(int id, const char *me, const char *who, const char *room)
+{
+}
+
+void ext_yahoo_conf_message(int id, const char *me, const char *who, const char *room, const char *msg, int utf8)
+{
+}
+
+/* chat handlers */
+void ext_yahoo_chat_cat_xml(int id, const char *xml)
+{
+}
+
+void ext_yahoo_chat_join(int id, const char *me, const char *room, const char * topic, YList *members, int fd)
+{
+}
+
+void ext_yahoo_chat_userjoin(int id, const char *me, const char *room, struct yahoo_chat_member *who)
+{
+}
+
+void ext_yahoo_chat_userleave(int id, const char *me, const char *room, const char *who)
+{
+}
+void ext_yahoo_chat_message(int id, const char *me, const char *who, const char *room, const char *msg, int msgtype, int utf8)
+{
+}
+
+void ext_yahoo_chat_yahoologout(int id, const char *me)
+{
+ LOG(("got chat logout"));
+}
+void ext_yahoo_chat_yahooerror(int id, const char *me)
+{
+ LOG(("got chat error"));
+}
diff --git a/protocols/Yahoo/chat.h b/protocols/Yahoo/chat.h
new file mode 100644
index 0000000000..c56fa435c7
--- /dev/null
+++ b/protocols/Yahoo/chat.h
@@ -0,0 +1,42 @@
+/*
+ * $Id: chat.h 9334 2009-04-04 21:56:36Z gena01 $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+#ifndef _YAHOO_CHAT_H_
+#define _YAHOO_CHAT_H_
+
+/* Conference handlers */
+void ext_yahoo_got_conf_invite(int id, const char *me, const char *who, const char *room, const char *msg, YList *members);
+
+void ext_yahoo_conf_userdecline(int id, const char *me, const char *who, const char *room, const char *msg);
+
+void ext_yahoo_conf_userjoin(int id, const char *me, const char *who, const char *room);
+
+void ext_yahoo_conf_userleave(int id, const char *me, const char *who, const char *room);
+
+void ext_yahoo_conf_message(int id, const char *me, const char *who, const char *room, const char *msg, int utf8);
+
+/* chat handlers */
+void ext_yahoo_chat_cat_xml(int id, const char *xml);
+
+void ext_yahoo_chat_join(int id, const char *me, const char *room, const char * topic, YList *members, int fd);
+
+void ext_yahoo_chat_userjoin(int id, const char *me, const char *room, struct yahoo_chat_member *who);
+
+void ext_yahoo_chat_userleave(int id, const char *me, const char *room, const char *who);
+
+void ext_yahoo_chat_message(int id, const char *me, const char *who, const char *room, const char *msg, int msgtype, int utf8);
+
+void ext_yahoo_chat_yahoologout(int id, const char *me);
+
+void ext_yahoo_chat_yahooerror(int id, const char *me);
+
+#endif
diff --git a/protocols/Yahoo/file_transfer.cpp b/protocols/Yahoo/file_transfer.cpp
new file mode 100644
index 0000000000..c18ef4c22b
--- /dev/null
+++ b/protocols/Yahoo/file_transfer.cpp
@@ -0,0 +1,908 @@
+/*
+ * $Id: file_transfer.cpp 13893 2011-10-23 19:29:28Z borkra $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+#include <time.h>
+#include <sys/stat.h>
+
+#include "yahoo.h"
+#include <m_protosvc.h>
+#include "file_transfer.h"
+
+YList *file_transfers=NULL;
+
+static y_filetransfer* new_ft(CYahooProto* ppro, int id, HANDLE hContact, const char *who, const char *msg,
+ const char *url, const char *ft_token, int y7, YList *fs, int sending)
+{
+ yahoo_file_info * fi;
+ int i=0;
+ YList *l=fs;
+
+ LOG(("[new_ft] id: %d, who: %s, msg: %s, ft_token: %s, y7: %d, sending: %d", id, who, msg, ft_token, y7, sending));
+
+ y_filetransfer* ft = (y_filetransfer*) calloc(1, sizeof(y_filetransfer));
+ ft->ppro = ppro;
+ ft->id = id;
+ ft->who = strdup(who);
+ ft->hWaitEvent = INVALID_HANDLE_VALUE;
+
+ ft->hContact = hContact;
+ ft->files = fs;
+
+ ft->url = (url == NULL) ? NULL : strdup(url);
+ ft->ftoken = (ft_token == NULL) ? NULL : strdup(ft_token);
+ ft->msg = (msg != NULL) ? strdup(msg) : strdup("[no description given]");
+
+ ft->cancel = 0;
+ ft->y7 = y7;
+
+ ft->hWaitEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
+
+ ft->pfts.cbSize = sizeof(PROTOFILETRANSFERSTATUS);
+ ft->pfts.hContact = hContact;
+ ft->pfts.flags = PFTS_TCHAR;
+ ft->pfts.flags |= (sending != 0 ) ? PFTS_SENDING : PFTS_RECEIVING;
+
+ ft->pfts.tszWorkingDir = NULL;
+ ft->pfts.currentFileTime = 0;
+
+ ft->pfts.totalFiles = y_list_length(fs);
+
+ ft->pfts.ptszFiles = (TCHAR**) mir_calloc(ft->pfts.totalFiles * sizeof(TCHAR *));
+ ft->pfts.totalBytes = 0;
+
+ while(l) {
+ fi = ( yahoo_file_info* )l->data;
+
+ ft->pfts.ptszFiles[i++] = mir_utf8decodeT(fi->filename);
+ ft->pfts.totalBytes += fi->filesize;
+
+ l=l->next;
+ }
+
+ ft->pfts.currentFileNumber = 0;
+
+ fi = ( yahoo_file_info* )fs->data;
+ ft->pfts.tszCurrentFile = _tcsdup(ft->pfts.ptszFiles[ft->pfts.currentFileNumber]);
+ ft->pfts.currentFileSize = fi->filesize;
+
+ file_transfers = y_list_prepend(file_transfers, ft);
+
+ LOG(("[/new_ft]"));
+
+ return ft;
+}
+
+y_filetransfer* find_ft(const char *ft_token, const char *who)
+{
+ YList *l;
+ y_filetransfer* f;
+ LOG(("[find_ft] Searching for: %s", ft_token));
+
+ for(l = file_transfers; l; l = y_list_next(l)) {
+ f = (y_filetransfer* )l->data;
+ if (lstrcmpA(f->ftoken, ft_token) == 0 && lstrcmpA(f->who, who) == 0) {
+ LOG(("[find_ft] Got it!"));
+ return f;
+ }
+ }
+
+ LOG(("[find_ft] FT not found?"));
+ return NULL;
+}
+
+static void free_ft(y_filetransfer* ft)
+{
+ YList *l;
+ int i;
+
+ LOG(("[free_ft] token: %s", ft->ftoken));
+
+ for(l = file_transfers; l; l = y_list_next(l)) {
+ if (l->data == ft){
+ LOG(("[free_ft] Ft found and removed from the list"));
+ file_transfers = y_list_remove_link(file_transfers, l);
+ y_list_free_1(l);
+ break;
+ }
+ }
+
+ if ( ft->hWaitEvent != INVALID_HANDLE_VALUE )
+ CloseHandle( ft->hWaitEvent );
+
+ FREE(ft->who);
+ FREE(ft->msg);
+ FREE(ft->url);
+ FREE(ft->ftoken);
+ FREE(ft->relay);
+
+ LOG(("[free_ft] About to free the File List."));
+
+ while(ft->files) {
+ YList *tmp = ft->files;
+ yahoo_file_info * c = ( yahoo_file_info* )ft->files->data;
+ FREE(c->filename);
+ FREE(c);
+ ft->files = y_list_remove_link(ft->files, ft->files);
+ y_list_free_1(tmp);
+ }
+
+ LOG(("[free_ft] About to free PFTS."));
+
+ for (i=0; i< ft->pfts.totalFiles; i++)
+ mir_free(ft->pfts.ptszFiles[i]);
+
+ mir_free(ft->pfts.ptszFiles);
+ FREE(ft->pfts.tszCurrentFile);
+ FREE(ft->pfts.tszWorkingDir);
+ FREE(ft);
+
+ LOG(("[/free_ft]"));
+}
+
+static void upload_file(int id, int fd, int error, void *data)
+{
+ y_filetransfer *sf = (y_filetransfer*) data;
+ struct yahoo_file_info *fi = (struct yahoo_file_info *)sf->files->data;
+ char buf[1024];
+ unsigned long size = 0;
+ DWORD dw = 0;
+ int rw = 0;
+
+ if (fd < 0) {
+ LOG(("[get_fd] Connect Failed!"));
+ error = 1;
+ }
+
+ if(!error) {
+ HANDLE myhFile = CreateFile(sf->pfts.tszCurrentFile,
+ GENERIC_READ,
+ FILE_SHARE_READ|FILE_SHARE_WRITE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
+ 0);
+
+ if(myhFile !=INVALID_HANDLE_VALUE) {
+ DWORD lNotify = GetTickCount();
+
+ LOG(("proto: %s, hContact: %p", sf->ppro->m_szModuleName, sf->hContact));
+
+ LOG(("Sending file: %s", fi->filename));
+ //ProtoBroadcastAck(m_szModuleName, sf->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTING, sf, 0);
+ //ProtoBroadcastAck(m_szModuleName, sf->hContact, ACKTYPE_FILE, ACKRESULT_NEXTFILE, sf, 0);
+ ProtoBroadcastAck(sf->ppro->m_szModuleName, sf->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTED, sf, 0);
+ //ProtoBroadcastAck(m_szModuleName, sf->hContact, ACKTYPE_FILE, ACKRESULT_SENTREQUEST, sf, 0);
+ //ProtoBroadcastAck(m_szModuleName, sf->hContact, ACKTYPE_FILE, ACKRESULT_INITIALISING, sf, 0);
+
+ do {
+ ReadFile(myhFile, buf, sizeof(buf), &dw, NULL);
+
+ if (dw) {
+ rw = Netlib_Send((HANDLE)fd, buf, dw, MSG_NODUMP);
+
+ if (rw < 1) {
+ LOG(("Upload Failed. Send error? Got: %d", rw));
+ error = 1;
+ break;
+ } else
+ size += rw;
+
+ if(GetTickCount() >= lNotify + 500 || rw < 1024 || size == fi->filesize) {
+ LOG(("DOING UI Notify. Got %lu/%lu", size, fi->filesize));
+ sf->pfts.totalProgress = size;
+ sf->pfts.currentFileProgress = size;
+
+ ProtoBroadcastAck(sf->ppro->m_szModuleName, sf->hContact, ACKTYPE_FILE, ACKRESULT_DATA, sf, (LPARAM) & sf->pfts);
+ lNotify = GetTickCount();
+ }
+
+ }
+
+ if (sf->cancel) {
+ LOG(("Upload Cancelled! "));
+ error = 1;
+ break;
+ }
+ } while ( rw > 0 && dw > 0 && !error);
+
+ CloseHandle(myhFile);
+
+ sf->pfts.totalProgress = size;
+ sf->pfts.currentFileProgress = size;
+
+ ProtoBroadcastAck(sf->ppro->m_szModuleName, sf->hContact, ACKTYPE_FILE, ACKRESULT_DATA, sf, (LPARAM) & sf->pfts);
+
+ }
+ }
+
+ if (fd > 0) {
+ int tr = 0;
+
+ do {
+ rw = Netlib_Recv((HANDLE)fd, buf, sizeof(buf), 0);
+ LOG(("Got: %d bytes", rw));
+
+ if (tr == 0) {
+ //"HTTP/1.1 999" 12
+ // 012345678901
+ if (rw > 12) {
+ if (buf[9] != '2' || buf[10] != '0' || buf[11] != '0') {
+ LOG(("File Transfer Failed: %c%c%c", buf[9], buf[10], buf[11]));
+ error=1;
+ }
+ }
+ }
+ tr +=rw;
+ } while (rw > 0);
+
+ Netlib_CloseHandle((HANDLE)fd);
+ }
+
+ LOG(("File send complete!"));
+
+ if (! error) {
+ sf->pfts.currentFileNumber++;
+
+ if (sf->pfts.currentFileNumber >= sf->pfts.totalFiles) {
+ ProtoBroadcastAck(sf->ppro->m_szModuleName, sf->hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, sf, 0);
+ } else {
+ YList *l;
+ struct yahoo_file_info * fi;
+
+ // Do Next file
+ FREE(sf->pfts.tszCurrentFile);
+
+ l = sf->files;
+
+ fi = ( yahoo_file_info* )l->data;
+ FREE(fi->filename);
+ FREE(fi);
+
+ sf->files = y_list_remove_link(sf->files, l);
+ y_list_free_1(l);
+
+ // need to move to the next file on the list and fill the file information
+ fi = ( yahoo_file_info* )sf->files->data;
+ sf->pfts.tszCurrentFile = _tcsdup(sf->pfts.ptszFiles[sf->pfts.currentFileNumber]);
+ sf->pfts.currentFileSize = fi->filesize;
+ sf->pfts.currentFileProgress = 0;
+
+ ProtoBroadcastAck(sf->ppro->m_szModuleName, sf->hContact, ACKTYPE_FILE, ACKRESULT_NEXTFILE, sf, 0);
+ LOG(("Waiting for next file request packet..."));
+ }
+
+ } else {
+ ProtoBroadcastAck(sf->ppro->m_szModuleName, sf->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, sf, 0);
+ }
+}
+
+static void dl_file(int id, int fd, int error, const char *filename, unsigned long size, void *data)
+{
+ y_filetransfer *sf = (y_filetransfer*) data;
+ struct yahoo_file_info *fi = (struct yahoo_file_info *)sf->files->data;
+ char buf[1024];
+ unsigned long rsize = 0;
+ DWORD dw, c;
+
+ if (fd < 0) {
+ LOG(("[get_url] Connect Failed!"));
+
+ if (sf->ftoken != NULL) {
+ LOG(("[get_url] DC Detected: asking sender to upload to Yahoo FileServers!"));
+ yahoo_ftdc_deny(id, sf->who, fi->filename, sf->ftoken, 3);
+ }
+
+ error = 1;
+ }
+
+ if(!error) {
+ HANDLE myhFile;
+ TCHAR filefull[MAX_PATH];
+
+ /*
+ * We need FULL Path for File Resume to work properly!!!
+ *
+ * Don't rely on workingDir to be right, since it's not used to check if file exists.
+ */
+ mir_sntprintf(filefull, MAX_PATH, _T("%s\\%s"), sf->pfts.tszWorkingDir, sf->pfts.tszCurrentFile);
+ FREE(sf->pfts.tszCurrentFile);
+ sf->pfts.tszCurrentFile = _tcsdup(filefull);
+
+ ResetEvent(sf->hWaitEvent);
+
+ if ( sf->ppro->SendBroadcast( sf->hContact, ACKTYPE_FILE, ACKRESULT_FILERESUME, sf, ( LPARAM )&sf->pfts )) {
+ WaitForSingleObject( sf->hWaitEvent, INFINITE );
+
+ LOG(("[dl_file] Got action: %ld", sf->action));
+
+ switch(sf->action){
+ case FILERESUME_RENAME:
+ case FILERESUME_OVERWRITE:
+ case FILERESUME_RESUME:
+ // no action needed at this point, just break out of the switch statement
+ break;
+
+ case FILERESUME_CANCEL :
+ sf->cancel = 1;
+ break;
+
+ case FILERESUME_SKIP :
+ default:
+ sf->cancel = 2;
+ break;
+ }
+ }
+
+
+
+ if (! sf->cancel) {
+
+ myhFile = CreateFile(sf->pfts.tszCurrentFile,
+ GENERIC_WRITE,
+ FILE_SHARE_WRITE,
+ NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
+
+ if(myhFile !=INVALID_HANDLE_VALUE) {
+ DWORD lNotify = GetTickCount();
+
+ SetEndOfFile(myhFile);
+
+ LOG(("proto: %s, hContact: %p", sf->ppro->m_szModuleName, sf->hContact));
+
+ ProtoBroadcastAck(sf->ppro->m_szModuleName, sf->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTED, sf, 0);
+
+ do {
+ dw = Netlib_Recv((HANDLE)fd, buf, 1024, MSG_NODUMP);
+
+ if (dw > 0) {
+ WriteFile(myhFile, buf, dw, &c, NULL);
+ rsize += dw;
+ sf->pfts.totalProgress += dw;
+ sf->pfts.currentFileProgress += dw;
+
+ if(GetTickCount() >= lNotify + 500 || dw <= 0 || rsize == size) {
+
+ LOG(("DOING UI Notify. Got %lu/%lu", rsize, size));
+
+ ProtoBroadcastAck(sf->ppro->m_szModuleName, sf->hContact, ACKTYPE_FILE, ACKRESULT_DATA, sf, (LPARAM) & sf->pfts);
+ lNotify = GetTickCount();
+ }
+
+ } else {
+ LOG(("Recv Failed! Socket Error?"));
+ error = 1;
+ break;
+ }
+
+ if (sf->cancel) {
+ LOG(("Recv Cancelled! "));
+ error = 1;
+ break;
+ }
+ } while ( dw > 0 && rsize < size);
+
+ while (dw > 0 && ! sf->cancel && ! error) {
+ dw = Netlib_Recv((HANDLE)fd, buf, 1024, MSG_NODUMP);
+ LOG(("Ack."));
+ }
+
+ ProtoBroadcastAck(sf->ppro->m_szModuleName, sf->hContact, ACKTYPE_FILE, ACKRESULT_DATA, sf, (LPARAM) & sf->pfts);
+
+ LOG(("[Finished DL] Got %lu/%lu", rsize, size));
+ CloseHandle(myhFile);
+
+ } else {
+ LOG(("Can not open file for writing: %s", buf));
+ error = 1;
+ }
+
+ }
+ }
+
+ if (fd > 0) {
+ LOG(("Closing connection: %d", fd));
+ Netlib_CloseHandle((HANDLE)fd);
+
+ if (sf->cancel || error) {
+ /* abort FT transfer */
+ yahoo_ft7dc_abort(id, sf->who, sf->ftoken);
+ }
+ }
+
+ if (! error) {
+ sf->pfts.currentFileNumber++;
+
+ LOG(("File %d/%d download complete!", sf->pfts.currentFileNumber, sf->pfts.totalFiles));
+
+ if (sf->pfts.currentFileNumber >= sf->pfts.totalFiles) {
+ ProtoBroadcastAck(sf->ppro->m_szModuleName, sf->hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, sf, 0);
+ } else {
+ YList *l;
+ struct yahoo_file_info * fi;
+
+ // Do Next file
+ yahoo_ft7dc_nextfile(id, sf->who, sf->ftoken);
+ FREE(sf->pfts.tszCurrentFile);
+
+ l = sf->files;
+
+ fi = ( yahoo_file_info* )l->data;
+ FREE(fi->filename);
+ FREE(fi);
+
+ sf->files = y_list_remove_link(sf->files, l);
+ y_list_free_1(l);
+
+ // need to move to the next file on the list and fill the file information
+ fi = ( yahoo_file_info* )sf->files->data;
+ sf->pfts.tszCurrentFile = _tcsdup(sf->pfts.ptszFiles[sf->pfts.currentFileNumber]);
+ sf->pfts.currentFileSize = fi->filesize;
+ sf->pfts.currentFileProgress = 0;
+
+ ProtoBroadcastAck(sf->ppro->m_szModuleName, sf->hContact, ACKTYPE_FILE, ACKRESULT_NEXTFILE, sf, 0);
+ }
+ } else {
+ LOG(("File download failed!"));
+
+ ProtoBroadcastAck(sf->ppro->m_szModuleName, sf->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, sf, 0);
+ }
+}
+
+//=======================================================
+//File Transfer
+//=======================================================
+void __cdecl CYahooProto::recv_filethread(void *psf)
+{
+ y_filetransfer *sf = ( y_filetransfer* )psf;
+ struct yahoo_file_info *fi = (struct yahoo_file_info *)sf->files->data;
+
+ ProtoBroadcastAck(m_szModuleName, sf->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTING, sf, 0);
+
+ DebugLog("[yahoo_recv_filethread] who: %s, msg: %s, filename: %s ", sf->who, sf->msg, fi->filename);
+
+
+ yahoo_get_url_handle(m_id, sf->url, &dl_file, sf);
+
+ if (sf->pfts.currentFileNumber >= sf->pfts.totalFiles)
+ free_ft(sf);
+ else
+ DebugLog("[yahoo_recv_filethread] More files coming?");
+}
+
+void CYahooProto::ext_got_file(const char *me, const char *who, const char *url, long expires, const char *msg, const char *fname, unsigned long fesize, const char *ft_token, int y7)
+{
+ HANDLE hContact;
+ char *szBlob;
+ y_filetransfer *ft;
+ char fn[1024];
+ struct yahoo_file_info *fi;
+ YList *files=NULL;
+
+ LOG(("[ext_yahoo_got_file] ident:%s, who: %s, url: %s, expires: %lu, msg: %s, fname: %s, fsize: %lu ftoken: %s y7: %d", me, who, url, expires, msg, fname, fesize, ft_token == NULL ? "NULL" : ft_token, y7));
+
+ hContact = getbuddyH(who);
+ if (hContact == NULL)
+ hContact = add_buddy(who, who, 0 /* NO FT for other IMs */, PALF_TEMPORARY);
+
+ ZeroMemory(fn, 1024);
+
+ if (fname != NULL)
+ lstrcpynA(fn, fname, 1024);
+ else {
+ char *start, *end;
+
+ /* based on how gaim does this */
+ start = ( char* )strrchr(url, '/');
+ if (start)
+ start++;
+
+ end = ( char* )strrchr(url, '?');
+
+ if (start && *start && end) {
+ lstrcpynA(fn, start, end-start+1);
+ } else
+ lstrcpyA(fn, "filename.ext");
+ }
+
+ fi = y_new(struct yahoo_file_info,1);
+ fi->filename = strdup(fn);
+ fi->filesize = fesize;
+
+ files = y_list_append(files, fi);
+
+ ft = new_ft(this, m_id, hContact, who, msg, url, ft_token, y7, files, 0 /* downloading */);
+ if (ft == NULL) {
+ DebugLog("SF IS NULL!!!");
+ return;
+ }
+
+ // blob is DWORD(*ft), ASCIIZ(filenames), ASCIIZ(description)
+ szBlob = (char *) malloc(sizeof(DWORD) + lstrlenA(fn) + lstrlenA(ft->msg) + 2);
+ *((PDWORD) szBlob) = 0;
+ strcpy(szBlob + sizeof(DWORD), fn);
+ strcpy(szBlob + sizeof(DWORD) + lstrlenA(fn) + 1, ft->msg);
+
+ PROTORECVEVENT pre;
+ pre.flags = PREF_UTF;
+ pre.timestamp = (DWORD)time(NULL);
+ pre.szMessage = szBlob;
+ pre.lParam = (LPARAM)ft;
+
+ CCSDATA ccs;
+ ccs.szProtoService = PSR_FILE;
+ ccs.hContact = hContact;
+ ccs.wParam = 0;
+ ccs.lParam = (LPARAM) & pre;
+ CallService(MS_PROTO_CHAINRECV, 0, (LPARAM) & ccs);
+ free(szBlob);
+}
+
+void CYahooProto::ext_got_files(const char *me, const char *who, const char *ft_token, int y7, YList* files)
+{
+ HANDLE hContact;
+ char *szBlob;
+ y_filetransfer *ft;
+ YList *f;
+ char fn[4096];
+ int fc = 0;
+
+ LOG(("[ext_yahoo_got_files] ident:%s, who: %s, ftoken: %s ", me, who, ft_token == NULL ? "NULL" : ft_token));
+
+ hContact = getbuddyH(who);
+ if (hContact == NULL)
+ hContact = add_buddy(who, who, 0 /* NO FT for other IMs */, PALF_TEMPORARY);
+
+ ft = new_ft(this, m_id, hContact, who, NULL, NULL, ft_token, y7, files, 0 /* downloading */);
+ if (ft == NULL) {
+ DebugLog("SF IS NULL!!!");
+ return;
+ }
+
+ fn[0] = '\0';
+ for (f=files; f; f = y_list_next(f)) {
+ char z[1024];
+ struct yahoo_file_info *fi = (struct yahoo_file_info *) f->data;
+
+ snprintf(z, 1024, "%s (%lu)\r\n", fi->filename, fi->filesize);
+ lstrcatA(fn, z);
+ fc++;
+ }
+
+ if (fc > 1) {
+ /* multiple files */
+
+ }
+
+ // blob is DWORD(*ft), ASCIIZ(filenames), ASCIIZ(description)
+ szBlob = (char *) malloc(sizeof(DWORD) + lstrlenA(fn) + 2);
+ *((PDWORD) szBlob) = 0;
+ strcpy(szBlob + sizeof(DWORD), fn);
+ strcpy(szBlob + sizeof(DWORD) + lstrlenA(fn) + 1, "");
+
+ PROTORECVEVENT pre;
+ pre.flags = PREF_UTF;
+ pre.timestamp = (DWORD)time(NULL);
+ pre.szMessage = szBlob;
+ pre.lParam = (LPARAM)ft;
+
+ CCSDATA ccs;
+ ccs.szProtoService = PSR_FILE;
+ ccs.hContact = ft->hContact;
+ ccs.wParam = 0;
+ ccs.lParam = (LPARAM)&pre;
+ CallService(MS_PROTO_CHAINRECV, 0, (LPARAM) & ccs);
+ free(szBlob);
+}
+
+void CYahooProto::ext_got_file7info(const char *me, const char *who, const char *url, const char *fname, const char *ft_token)
+{
+ y_filetransfer *ft;
+
+ LOG(("[ext_yahoo_got_file7info] ident:%s, who: %s, url: %s, fname: %s, ft_token: %s", me, who, url, fname, ft_token));
+
+ ft = find_ft(ft_token, who);
+
+ if (ft == NULL) {
+ LOG(("ERROR: Can't find the token: %s in my file transfers list...", ft_token));
+ return;
+ }
+
+ ProtoBroadcastAck(m_szModuleName, ft->hContact, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, (HANDLE) 1, 0);
+
+ FREE(ft->url);
+
+ ft->url = strdup(url);
+
+ YForkThread(&CYahooProto::recv_filethread, ft);
+}
+
+void ext_yahoo_send_file7info(int id, const char *me, const char *who, const char *ft_token)
+{
+ y_filetransfer *ft;
+ yahoo_file_info *fi;
+
+ char *c;
+ LOG(("[ext_yahoo_send_file7info] id: %i, ident:%s, who: %s, ft_token: %s", id, me, who, ft_token));
+
+ ft = find_ft(ft_token, who);
+
+ if (ft == NULL) {
+ LOG(("ERROR: Can't find the token: %s in my file transfers list...", ft_token));
+ return;
+ }
+
+ fi = (yahoo_file_info *) ft->files->data;
+
+ c = strrchr(fi->filename, '\\');
+ if (c != NULL ) {
+ c++;
+ } else {
+ c = fi->filename;
+ }
+
+ LOG(("Resolving relay.msg.yahoo.com..."));
+ PHOSTENT he = gethostbyname("relay.msg.yahoo.com");
+
+ if (he) {
+ ft->relay = strdup( inet_ntoa(*( PIN_ADDR )he->h_addr_list[0]) );
+ LOG(("Got Relay IP: %s", ft->relay));
+ } else {
+ ft->relay = strdup( "98.136.112.33" );
+ LOG(("DNS Lookup failed. Using Relay IP: %s", ft->relay));
+ }
+
+ yahoo_send_file7info(id, me, who, ft_token, c, ft->relay );
+}
+
+struct _sfs{
+ char *me;
+ char *token;
+ y_filetransfer *sf;
+};
+
+void CYahooProto::ext_ft7_send_file(const char *me, const char *who, const char *filename, const char *token, const char *ft_token)
+{
+ y_filetransfer *sf;
+ struct _sfs *s;
+
+ LOG(("[ext_yahoo_send_file7info] ident:%s, who: %s, ft_token: %s", me, who, ft_token));
+
+ sf = find_ft(ft_token, who);
+
+ if (sf == NULL) {
+ LOG(("ERROR: Can't find the token: %s in my file transfers list...", ft_token));
+ return;
+ }
+
+ s = (struct _sfs *) malloc( sizeof( struct _sfs ));
+
+ s->me = strdup(me);
+ s->token = strdup(token);
+ s->sf = sf;
+
+ YForkThread(&CYahooProto::send_filethread, s);
+}
+
+/**************** Send File ********************/
+
+void __cdecl CYahooProto::send_filethread(void *psf)
+{
+ struct _sfs *s = ( struct _sfs * )psf;
+ y_filetransfer *sf = s->sf;
+ struct yahoo_file_info *fi = (struct yahoo_file_info *)sf->files->data;
+
+ ProtoBroadcastAck(m_szModuleName, sf->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTING, sf, 0);
+
+ LOG(("who %s, msg: %s, filename: %s filesize: %ld", sf->who, sf->msg, fi->filename, fi->filesize));
+
+ yahoo_send_file_y7(sf->id, s->me, sf->who, sf->relay, fi->filesize, s->token, &upload_file, sf);
+
+ FREE(s->me);
+ FREE(s->token);
+ FREE(s);
+
+ if (sf->pfts.currentFileNumber >= sf->pfts.totalFiles) {
+ free_ft(sf);
+ } else {
+ DebugLog("[yahoo_send_filethread] More files coming?");
+ }
+
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+// SendFile - sends a file
+
+HANDLE __cdecl CYahooProto::SendFile( HANDLE hContact, const PROTOCHAR* szDescription, PROTOCHAR** ppszFiles )
+{
+ DBVARIANT dbv;
+ y_filetransfer *sf;
+
+ LOG(("[YahooSendFile]"));
+
+ if ( !m_bLoggedIn )
+ return 0;
+
+ /*DebugLog("Getting Files");
+
+ if ( ppszFiles[1] != NULL ){
+ MessageBoxA(NULL, "YAHOO protocol allows only one file to be sent at a time", "Yahoo", MB_OK | MB_ICONINFORMATION);
+ return 0;
+ }
+
+ DebugLog("Getting Yahoo ID");
+ */
+
+ if (!DBGetContactSettingString(hContact, m_szModuleName, YAHOO_LOGINID, &dbv)) {
+ long tFileSize = 0;
+ struct _stat statbuf;
+ struct yahoo_file_info *fi;
+ YList *fs=NULL;
+ int i=0;
+ char *s;
+
+ while (ppszFiles[i] != NULL) {
+ if ( _tstat( ppszFiles[i], &statbuf ) == 0 )
+ tFileSize = statbuf.st_size;
+
+ fi = y_new(struct yahoo_file_info,1);
+
+ /**
+ * Need to use regular memory allocator/deallocator, since this is how things are build w/ libyahoo2
+ */
+ s = mir_utf8encodeT(ppszFiles[i]);
+ fi->filename = strdup(s);
+ mir_free(s);
+
+ fi->filesize = tFileSize;
+
+ fs = y_list_append(fs, fi);
+ i++;
+ }
+
+ sf = new_ft(this, m_id, hContact, dbv.pszVal, ( char* )szDescription,
+ NULL, NULL, 0, fs, 1 /* sending */);
+
+ DBFreeVariant(&dbv);
+
+ if (sf == NULL) {
+ DebugLog("SF IS NULL!!!");
+ return 0;
+ }
+
+ LOG(("who: %s, msg: %s, # files: %d", sf->who, sf->msg, i));
+ //mir_forkthread(yahoo_send_filethread, sf);
+
+ sf->ftoken=yahoo_ft7dc_send(m_id, sf->who, fs);
+
+ LOG(("Exiting SendRequest..."));
+
+ return sf;
+ }
+
+ LOG(("[/YahooSendFile]"));
+
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// FileAllow - starts a file transfer
+
+HANDLE __cdecl CYahooProto::FileAllow( HANDLE /*hContact*/, HANDLE hTransfer, const PROTOCHAR* szPath )
+{
+ y_filetransfer *ft = (y_filetransfer *)hTransfer;
+ size_t len;
+
+ DebugLog("[YahooFileAllow]");
+
+ //LOG(LOG_INFO, "[%s] Requesting file from %s", ft->cookie, ft->user);
+ ft->pfts.tszWorkingDir = _tcsdup( szPath );
+
+ len = _tcslen(ft->pfts.tszWorkingDir) - 1;
+ if (ft->pfts.tszWorkingDir[len] == '\\')
+ ft->pfts.tszWorkingDir[len] = 0;
+
+ if (ft->y7) {
+ DebugLog("[YahooFileAllow] Trying to relay Y7 transfer.");
+ //void yahoo_ft7dc_accept(int id, const char *buddy, const char *ft_token);
+ yahoo_ft7dc_accept(ft->id, ft->who, ft->ftoken);
+
+ return hTransfer;
+ }
+
+ YForkThread(&CYahooProto::recv_filethread, ft);
+ return hTransfer;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// FileCancel - cancels a file transfer
+
+int __cdecl CYahooProto::FileCancel( HANDLE /*hContact*/, HANDLE hTransfer )
+{
+ DebugLog("[YahooFileCancel]");
+
+ y_filetransfer* ft = (y_filetransfer*)hTransfer;
+
+ if (! (ft->pfts.flags & PFTS_SENDING) && ! ft->cancel) {
+ /* abort FT transfer */
+ yahoo_ft7dc_abort(ft->id, ft->who, ft->ftoken);
+ }
+
+ if ( ft->hWaitEvent != INVALID_HANDLE_VALUE )
+ SetEvent( ft->hWaitEvent );
+
+ ft->action = FILERESUME_CANCEL;
+ ft->cancel = 1;
+
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// FileDeny - denies a file transfer
+
+int __cdecl CYahooProto::FileDeny( HANDLE /*hContact*/, HANDLE hTransfer, const PROTOCHAR* )
+{
+ /* deny file receive request.. just ignore it! */
+ y_filetransfer *ft = (y_filetransfer *)hTransfer;
+
+ DebugLog("[YahooFileDeny]");
+
+ if ( !m_bLoggedIn || ft == NULL ) {
+ DebugLog("[YahooFileDeny] Not logged-in or some other error!");
+ return 1;
+ }
+
+ if (ft->y7) {
+ DebugLog("[YahooFileDeny] Y7 Transfer detected.");
+ //void yahoo_ft7dc_accept(int id, const char *buddy, const char *ft_token);
+ yahoo_ft7dc_deny(ft->id, ft->who, ft->ftoken);
+ return 0;
+ }
+
+ if (ft->ftoken != NULL) {
+ struct yahoo_file_info *fi = (struct yahoo_file_info *)ft->files->data;
+
+ DebugLog("[YahooFileDeny] DC Detected: Denying File Transfer!");
+ yahoo_ftdc_deny(m_id, ft->who, fi->filename, ft->ftoken, 2);
+ }
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// FileResume - processes file renaming etc
+
+int __cdecl CYahooProto::FileResume( HANDLE hTransfer, int* action, const PROTOCHAR** szFilename )
+{
+ y_filetransfer *ft = (y_filetransfer *)hTransfer;
+
+ DebugLog("[YahooFileResume] Action: %d", *action);
+
+ if ( !m_bLoggedIn || ft == NULL ) {
+ DebugLog("[YahooFileResume] Not loggedin or some other error!");
+ return 1;
+ }
+
+ ft->action = *action;
+
+ DebugLog("[YahooFileResume] Action: %d", *action);
+
+ if ( *action == FILERESUME_RENAME ) {
+ DebugLog("[YahooFileResume] Renamed file!");
+
+ FREE(ft->pfts.tszCurrentFile);
+ ft->pfts.tszCurrentFile = _tcsdup( *szFilename );
+ }
+
+ SetEvent( ft->hWaitEvent );
+ return 0;
+}
+
diff --git a/protocols/Yahoo/file_transfer.h b/protocols/Yahoo/file_transfer.h
new file mode 100644
index 0000000000..f33d7cd046
--- /dev/null
+++ b/protocols/Yahoo/file_transfer.h
@@ -0,0 +1,50 @@
+/*
+ * $Id: file_transfer.h 11130 2010-01-13 22:49:25Z gena01@gmail.com $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+#ifndef _YAHOO_FILE_TRANSFER_H_
+#define _YAHOO_FILE_TRANSFER_H_
+
+#define FILERESUME_CANCEL 11
+
+typedef struct {
+ CYahooProto* ppro;
+ int id;
+ char *who;
+ char *msg;
+ char *ftoken;
+ char *relay;
+ HANDLE hContact;
+ int cancel;
+ char *url;
+ HANDLE hWaitEvent;
+ DWORD action;
+ int y7;
+ YList *files;
+ PROTOFILETRANSFERSTATUS pfts;
+} y_filetransfer;
+
+/* libyahoo2 callback(s) */
+void ext_yahoo_got_file(int id, const char *me, const char *who, const char *url, long expires, const char *msg, const char *fname, unsigned long fesize, const char *ft_token, int y7);
+void ext_yahoo_got_files(int id, const char *me, const char *who, const char *ft_token, int y7, YList *files);
+void ext_yahoo_got_file7info(int id, const char *me, const char *who, const char *url, const char *fname, const char *ft_token);
+void ext_yahoo_send_file7info(int id, const char *me, const char *who, const char *ft_token);
+void ext_yahoo_ft7_send_file(int id, const char *me, const char *who, const char *filename, const char *token, const char *ft_token);
+
+/* service functions */
+int YahooFileAllow(WPARAM wParam,LPARAM lParam);
+int YahooFileDeny(WPARAM wParam, LPARAM lParam);
+int YahooFileResume(WPARAM wParam, LPARAM lParam);
+int YahooFileCancel(WPARAM wParam, LPARAM lParam);
+int YahooSendFile(WPARAM wParam, LPARAM lParam);
+int YahooRecvFile(WPARAM wParam, LPARAM lParam);
+
+#endif
diff --git a/protocols/Yahoo/http_gateway.cpp b/protocols/Yahoo/http_gateway.cpp
new file mode 100644
index 0000000000..bd24b3eb8c
--- /dev/null
+++ b/protocols/Yahoo/http_gateway.cpp
@@ -0,0 +1,84 @@
+/*
+ * $Id: http_gateway.cpp 9232 2009-03-26 18:11:02Z ghazan $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+
+#include "yahoo.h"
+
+#ifdef HTTP_GATEWAY
+
+int YAHOO_httpGatewayInit(HANDLE hConn, NETLIBOPENCONNECTION *nloc, NETLIBHTTPREQUEST *nlhr)
+{
+ NETLIBHTTPPROXYINFO nlhpi;
+
+ DebugLog("YAHOO_httpGatewayInit!!!");
+
+ ZeroMemory(&nlhpi, sizeof(nlhpi) );
+ nlhpi.cbSize = sizeof(nlhpi);
+ nlhpi.szHttpPostUrl = "http://shttp.msg.yahoo.com/notify/";
+
+ //CallService( MS_NETLIB_SETPOLLINGTIMEOUT, (WPARAM) hConn, 15 );
+
+ return CallService(MS_NETLIB_SETHTTPPROXYINFO, (WPARAM)hConn, (LPARAM)&nlhpi);
+}
+
+int YAHOO_httpGatewayWrapSend(HANDLE hConn, PBYTE buf, int len, int flags, MIRANDASERVICE pfnNetlibSend)
+{
+ DebugLog("YAHOO_httpGatewayWrapSend!!! Len: %d", len);
+
+ if (len == 0 && m_id > 0) { // we need to send something!!!
+ int n;
+ char *z = yahoo_webmessenger_idle_packet(m_id, &n);
+ int ret = 0;
+
+ if (z != NULL) {
+ DebugLog("YAHOO_httpGatewayWrapSend!!! Got Len: %d", n);
+ NETLIBBUFFER tBuf = { ( char* )z, n, flags };
+ ret = pfnNetlibSend(( LPARAM )hConn, (WPARAM) &tBuf );
+ FREE(z);
+ } else {
+ DebugLog("YAHOO_httpGatewayWrapSend!!! GOT NULL???");
+ }
+
+ return ret;
+ } else {
+ NETLIBBUFFER tBuf = { ( char* )buf, len, flags };
+
+ return pfnNetlibSend(( LPARAM )hConn, (WPARAM) &tBuf );
+ }
+}
+
+PBYTE YAHOO_httpGatewayUnwrapRecv(NETLIBHTTPREQUEST *nlhr, PBYTE buf, int len, int *outBufLen, void *(*NetlibRealloc)(void *, size_t))
+{
+ DebugLog("YAHOO_httpGatewayUnwrapRecv!!! Len: %d", len);
+
+ DebugLog("Got headers: %d", nlhr->headersCount);
+ /* we need to get the first 4 bytes! */
+ if (len < 4)
+ return NULL;
+
+ ylad->rpkts = buf[0] + buf[1] *256;
+ DebugLog("Got packets: %d", ylad->rpkts);
+
+ if (len == 4){
+ *outBufLen = 0;
+ return buf;
+ } else if ( (buf[4] == 'Y') && (buf[5] == 'M') && (buf[6] == 'S') && (buf[7] == 'G') ) {
+ MoveMemory( buf, buf + 4, len - 4);
+ *outBufLen = len-4;// we take off 4 bytes from the beginning
+
+ return buf;
+ } else
+ return NULL; /* Break connection, something went wrong! */
+
+}
+
+#endif
diff --git a/protocols/Yahoo/http_gateway.h b/protocols/Yahoo/http_gateway.h
new file mode 100644
index 0000000000..43aa4c1809
--- /dev/null
+++ b/protocols/Yahoo/http_gateway.h
@@ -0,0 +1,24 @@
+/*
+ * $Id: http_gateway.h 3541 2006-08-18 21:18:33Z gena01 $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+
+#ifndef _YAHOO_HTTP_GATEWAY_H_
+#define _YAHOO_HTTP_GATEWAY_H_
+
+#define HTTP_PROXY_VERSION 0x0443
+
+int YAHOO_httpGatewayInit(HANDLE hConn, NETLIBOPENCONNECTION *nloc, NETLIBHTTPREQUEST *nlhr);
+int YAHOO_httpGatewayWrapSend(HANDLE hConn, PBYTE buf, int len, int flags, MIRANDASERVICE pfnNetlibSend);
+PBYTE YAHOO_httpGatewayUnwrapRecv(NETLIBHTTPREQUEST *nlhr, PBYTE buf, int bufLen, int *outBufLen, void *(*NetlibRealloc)(void *, size_t));
+
+#endif
+
diff --git a/protocols/Yahoo/icolib.cpp b/protocols/Yahoo/icolib.cpp
new file mode 100644
index 0000000000..7f87f2c890
--- /dev/null
+++ b/protocols/Yahoo/icolib.cpp
@@ -0,0 +1,86 @@
+/*
+ * $Id: util.c 3936 2006-10-02 06:58:19Z ghazan $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+#include "yahoo.h"
+#include <m_langpack.h>
+#include <win2k.h>
+#include "m_icolib.h"
+
+#include "resource.h"
+
+struct
+{
+ const char* szDescr;
+ const char* szName;
+ int defIconID;
+}
+static iconList[] = {
+ { LPGEN("Main"), "yahoo", IDI_YAHOO },
+ { LPGEN("Mail"), "mail", IDI_INBOX },
+ { LPGEN("Profile"), "profile", IDI_PROFILE },
+ { LPGEN("Refresh"), "refresh", IDI_REFRESH },
+ { LPGEN("Address Book"), "yab", IDI_YAB },
+ { LPGEN("Set Status"), "set_status", IDI_SET_STATUS },
+ { LPGEN("Calendar"), "calendar", IDI_CALENDAR }
+};
+
+HANDLE hIconLibItem[SIZEOF(iconList)];
+
+void CYahooProto::IconsInit( void )
+{
+ TCHAR szFile[MAX_PATH];
+ char szSectionName[100];
+
+ mir_snprintf(szSectionName, sizeof(szSectionName), "%s/%s", LPGEN("Protocols"), LPGEN("YAHOO"));
+ GetModuleFileName(hInstance, szFile, SIZEOF(szFile));
+
+ SKINICONDESC sid = {0};
+ sid.cbSize = sizeof(SKINICONDESC);
+ sid.ptszDefaultFile = szFile;
+ sid.pszSection = szSectionName;
+ sid.flags = SIDF_PATH_TCHAR;
+
+ for ( int i = 0; i < SIZEOF(iconList); i++ ) {
+ char szSettingName[100];
+ mir_snprintf( szSettingName, sizeof( szSettingName ), "YAHOO_%s", iconList[i].szName );
+
+ sid.pszName = szSettingName;
+ sid.pszDescription = (char* )iconList[i].szDescr;
+ sid.iDefaultIndex = -iconList[i].defIconID;
+ hIconLibItem[i] = (HANDLE)CallService(MS_SKIN2_ADDICON, 0, (LPARAM)&sid);
+ }
+}
+
+HICON CYahooProto::LoadIconEx( const char* name, bool big )
+{
+ char szSettingName[100];
+
+ mir_snprintf( szSettingName, sizeof( szSettingName ), "YAHOO_%s", name );
+
+ return ( HICON )CallService( MS_SKIN2_GETICON, big, (LPARAM)szSettingName );
+}
+
+HANDLE CYahooProto::GetIconHandle(int iconId)
+{
+ for (unsigned i=0; i < SIZEOF(iconList); i++)
+ if (iconList[i].defIconID == iconId)
+ return hIconLibItem[i];
+
+ return NULL;
+}
+
+void CYahooProto::ReleaseIconEx(const char* name, bool big)
+{
+ char szSettingName[100];
+ mir_snprintf(szSettingName, sizeof(szSettingName), "YAHOO_%s", name);
+ YAHOO_CallService(big ? MS_SKIN2_RELEASEICONBIG : MS_SKIN2_RELEASEICON, 0, (LPARAM)szSettingName);
+}
diff --git a/protocols/Yahoo/icos/address_book.ico b/protocols/Yahoo/icos/address_book.ico
new file mode 100644
index 0000000000..ce04d3bbc2
--- /dev/null
+++ b/protocols/Yahoo/icos/address_book.ico
Binary files differ
diff --git a/protocols/Yahoo/icos/calendar.ico b/protocols/Yahoo/icos/calendar.ico
new file mode 100644
index 0000000000..031e45de03
--- /dev/null
+++ b/protocols/Yahoo/icos/calendar.ico
Binary files differ
diff --git a/protocols/Yahoo/icos/inbox.ico b/protocols/Yahoo/icos/inbox.ico
new file mode 100644
index 0000000000..e101d8550e
--- /dev/null
+++ b/protocols/Yahoo/icos/inbox.ico
Binary files differ
diff --git a/protocols/Yahoo/icos/invite.ico b/protocols/Yahoo/icos/invite.ico
new file mode 100644
index 0000000000..94c37db75e
--- /dev/null
+++ b/protocols/Yahoo/icos/invite.ico
Binary files differ
diff --git a/protocols/Yahoo/icos/profile.ico b/protocols/Yahoo/icos/profile.ico
new file mode 100644
index 0000000000..715b7a1bec
--- /dev/null
+++ b/protocols/Yahoo/icos/profile.ico
Binary files differ
diff --git a/protocols/Yahoo/icos/refresh.ico b/protocols/Yahoo/icos/refresh.ico
new file mode 100644
index 0000000000..3eba98d2b3
--- /dev/null
+++ b/protocols/Yahoo/icos/refresh.ico
Binary files differ
diff --git a/protocols/Yahoo/icos/set_status.ico b/protocols/Yahoo/icos/set_status.ico
new file mode 100644
index 0000000000..988091f1bf
--- /dev/null
+++ b/protocols/Yahoo/icos/set_status.ico
Binary files differ
diff --git a/protocols/Yahoo/icos/yahoo.ico b/protocols/Yahoo/icos/yahoo.ico
new file mode 100644
index 0000000000..2713d70e0d
--- /dev/null
+++ b/protocols/Yahoo/icos/yahoo.ico
Binary files differ
diff --git a/protocols/Yahoo/ignore.cpp b/protocols/Yahoo/ignore.cpp
new file mode 100644
index 0000000000..3a0a6f2cdb
--- /dev/null
+++ b/protocols/Yahoo/ignore.cpp
@@ -0,0 +1,66 @@
+/*
+ * $Id$
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+#include "yahoo.h"
+#include "ignore.h"
+
+const YList* CYahooProto::GetIgnoreList(void)
+{
+ if (m_id < 1)
+ return NULL;
+
+ return yahoo_get_ignorelist(m_id);
+}
+
+void CYahooProto::IgnoreBuddy(const char *buddy, int ignore)
+{
+ if (m_id < 1)
+ return;
+
+ yahoo_ignore_buddy(m_id, buddy, ignore);
+ //yahoo_get_list(m_id);
+}
+
+
+int CYahooProto::BuddyIgnored(const char *who)
+{
+ const YList *l = GetIgnoreList();
+ while (l != NULL) {
+ struct yahoo_buddy *b = (struct yahoo_buddy *) l->data;
+
+ if (lstrcmpiA(b->id, who) == 0) {
+ //LOG(("User '%s' on our Ignore List. Dropping Message.", who));
+ return 1;
+ }
+ l = l->next;
+ }
+
+ return 0;
+}
+
+void CYahooProto::ext_got_ignore(YList * igns)
+{
+ YList *l = igns;
+
+ LOG(("[ext_yahoo_got_ignore] Got Ignore List"));
+
+ while (l != NULL) {
+ struct yahoo_buddy *b = (struct yahoo_buddy *) l->data;
+
+ YAHOO_DEBUGLOG("[ext_yahoo_got_ignore] Buddy: %s", b->id );
+
+ l = l->next;
+ }
+
+ YAHOO_DEBUGLOG("[ext_yahoo_got_ignore] End Of Ignore List");
+}
+
diff --git a/protocols/Yahoo/ignore.h b/protocols/Yahoo/ignore.h
new file mode 100644
index 0000000000..e8d3ede800
--- /dev/null
+++ b/protocols/Yahoo/ignore.h
@@ -0,0 +1,16 @@
+/*
+ * $Id$
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+#ifndef _YAHOO_IGNORE_H_
+#define _YAHOO_IGNORE_H_
+
+#endif
diff --git a/protocols/Yahoo/im.cpp b/protocols/Yahoo/im.cpp
new file mode 100644
index 0000000000..455a545b74
--- /dev/null
+++ b/protocols/Yahoo/im.cpp
@@ -0,0 +1,277 @@
+/*
+ * $Id: im.cpp 12307 2010-08-11 21:49:46Z Michael.Kunz@s2005.TU-Chemnitz.de $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+
+#include "yahoo.h"
+#include <m_langpack.h>
+#include <m_protosvc.h>
+
+#include "avatar.h"
+#include "im.h"
+#include "ignore.h"
+
+void CYahooProto::send_msg(const char *id, int protocol, const char *msg, int utf8)
+{
+ LOG(("[send_msg] Who: %s: protocol: %d Msg: '%s', utf: %d", id, protocol, msg, utf8));
+
+ int buddy_icon = (GetDword("AvatarHash", 0) != 0) ? 2: 0;
+ yahoo_send_im(m_id, NULL, id, protocol, msg, utf8, buddy_icon);
+}
+
+void CYahooProto::ext_got_im(const char *me, const char *who, int protocol, const char *msg,
+ long tm, int stat, int utf8, int buddy_icon,
+ const char *seqn, int sendn)
+{
+ char *umsg;
+ const char *c = msg;
+ int oidx = 0;
+ CCSDATA ccs;
+ PROTORECVEVENT pre;
+ HANDLE hContact;
+
+
+ LOG(("YAHOO_GOT_IM id:%s %s: %s (len: %d) tm:%lu stat:%i utf8:%i buddy_icon: %i", me, who, msg, lstrlenA(msg), tm, stat, utf8, buddy_icon));
+
+ if(stat == 2) {
+ char z[1024];
+
+ snprintf(z, sizeof z, "Error sending message to %s", who);
+ LOG((z));
+ ShowError(Translate("Yahoo Error"), z);
+ return;
+ }
+
+ if(!msg) {
+ LOG(("Empty Incoming Message, exiting."));
+ return;
+ }
+
+ if (GetByte( "IgnoreUnknown", 0 )) {
+
+ /*
+ * Check our buddy list to see if we have it there. And if it's not on the list then we don't accept any IMs.
+ */
+ if (getbuddyH(who) == NULL) {
+ LOG(("Ignoring unknown user messages. User '%s'. Dropping Message.", who));
+ return;
+ }
+ }
+
+ if ( BuddyIgnored( who )) {
+ LOG(("User '%s' on our Ignore List. Dropping Message.", who));
+ return;
+ }
+
+ // make a bigger buffer for \n -> \r\n conversion (x2)
+ umsg = (char *) alloca(lstrlenA(msg) * 2 + 1);
+
+ while ( *c != '\0') {
+ // Strip the font tag
+ if (!_strnicmp(c,"<font ",6) || !_strnicmp(c,"</font>",6) ||
+ // strip the fade tag
+ !_strnicmp(c, "<FADE ",6) || !_strnicmp(c,"</FADE>",7) ||
+ // strip the alternate colors tag
+ !_strnicmp(c, "<ALT ",5) || !_strnicmp(c, "</ALT>",6)){
+ while ((*c++ != '>') && (*c != '\0'));
+ } else
+ // strip ANSI color combination
+ if ((*c == 0x1b) && (*(c+1) == '[')){
+ while ((*c++ != 'm') && (*c != '\0'));
+ } else
+
+ if (*c != '\0'){
+ umsg[oidx++] = *c;
+
+ /* Adding \r to \r\n conversion */
+ if (*c == '\r' && *(c + 1) != '\n')
+ umsg[oidx++] = '\n';
+
+ c++;
+ }
+ }
+
+ umsg[oidx++]= '\0';
+
+ /* Need to strip off formatting stuff first. Then do all decoding/converting */
+ LOG(("%s: %s", who, umsg));
+
+ //if(!strcmp(umsg, "<ding>"))
+ // :P("\a");
+
+ ccs.szProtoService = PSR_MESSAGE;
+ ccs.hContact = hContact = add_buddy(who, who, protocol, PALF_TEMPORARY);
+ //SetWord(hContact, "yprotoid", protocol);
+ Set_Protocol(hContact, protocol);
+
+ ccs.wParam = 0;
+ ccs.lParam = (LPARAM) &pre;
+ pre.flags = (utf8) ? PREF_UTF : 0;
+
+ if (tm) {
+ HANDLE hEvent = (HANDLE)CallService(MS_DB_EVENT_FINDLAST, (WPARAM)hContact, 0);
+
+ if (hEvent) { // contact has events
+ DBEVENTINFO dbei;
+ DWORD dummy;
+
+ dbei.cbSize = sizeof (DBEVENTINFO);
+ dbei.pBlob = (BYTE*)&dummy;
+ dbei.cbBlob = 2;
+ if (!CallService(MS_DB_EVENT_GET, (WPARAM)hEvent, (LPARAM)&dbei))
+ // got that event, if newer than ts then reset to current time
+ if ((DWORD)tm < dbei.timestamp) tm = (long)time(NULL);
+ }
+
+ pre.timestamp = (DWORD)time(NULL);
+
+ if ((DWORD)tm < pre.timestamp)
+ pre.timestamp = tm;
+
+ } else
+ pre.timestamp = (DWORD)time(NULL);
+
+ pre.szMessage = umsg;
+ pre.lParam = 0;
+
+ // Turn off typing
+ CallService(MS_PROTO_CONTACTISTYPING, (WPARAM) hContact, PROTOTYPE_CONTACTTYPING_OFF);
+ CallService(MS_PROTO_CHAINRECV, 0, (LPARAM) & ccs);
+
+ // ack the message we just got
+ if (seqn)
+ yahoo_send_im_ack(m_id, me, who, seqn, sendn);
+
+ if (buddy_icon < 0) return;
+
+ //?? Don't generate floods!!
+ DBWriteContactSettingByte(hContact, m_szModuleName, "AvatarType", (BYTE)buddy_icon);
+ if (buddy_icon != 2) {
+ reset_avatar(hContact);
+ } else if (DBGetContactSettingDword(hContact, m_szModuleName,"PictCK", 0) == 0) {
+ /* request the buddy image */
+ request_avatar(who);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// SendMessage - sends a message
+
+void __cdecl CYahooProto::im_sendacksuccess(HANDLE hContact)
+{
+ ProtoBroadcastAck(m_szModuleName, hContact, ACKTYPE_MESSAGE, ACKRESULT_SUCCESS, (HANDLE) 1, 0);
+}
+
+void __cdecl CYahooProto::im_sendackfail(HANDLE hContact)
+{
+ SleepEx(1000, TRUE);
+ ProtoBroadcastAck(m_szModuleName, hContact, ACKTYPE_MESSAGE, ACKRESULT_FAILED, (HANDLE) 1,
+ (LPARAM) Translate("The message send timed out."));
+}
+
+void __cdecl CYahooProto::im_sendackfail_longmsg(HANDLE hContact)
+{
+ SleepEx(1000, TRUE);
+ ProtoBroadcastAck(m_szModuleName, hContact, ACKTYPE_MESSAGE, ACKRESULT_FAILED, (HANDLE) 1,
+ (LPARAM)Translate("Message is too long: Yahoo messages are limited by 800 UTF8 chars"));
+}
+
+int __cdecl CYahooProto::SendMsg( HANDLE hContact, int flags, const char* pszSrc )
+{
+ DBVARIANT dbv;
+ char *msg;
+ int bANSI;
+
+ bANSI = 0;/*GetByte( "DisableUTF8", 0 );*/
+
+ if (!m_bLoggedIn) {/* don't send message if we not connected! */
+ YForkThread( &CYahooProto::im_sendackfail, hContact );
+ return 1;
+ }
+
+ if (bANSI)
+ /* convert to ANSI */
+ msg = ( char* )pszSrc;
+ else if ( flags & PREF_UNICODE )
+ /* convert to utf8 */
+ msg = mir_utf8encodeW(( wchar_t* )&pszSrc[ strlen(pszSrc)+1 ] );
+ else if ( flags & PREF_UTF )
+ msg = mir_strdup(( char* )pszSrc );
+ else
+ msg = mir_utf8encode(( char* )pszSrc );
+
+ if (lstrlenA(msg) > 800) {
+ YForkThread( &CYahooProto::im_sendackfail_longmsg, hContact );
+ return 1;
+ }
+
+ if (!DBGetContactSettingString( hContact, m_szModuleName, YAHOO_LOGINID, &dbv)) {
+ send_msg(dbv.pszVal, GetWord( hContact, "yprotoid", 0), msg, (!bANSI) ? 1 : 0);
+
+ if (!bANSI)
+ mir_free(msg);
+
+ YForkThread( &CYahooProto::im_sendacksuccess, hContact );
+
+ DBFreeVariant(&dbv);
+ return 1;
+ }
+
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// RecvMsg
+
+int __cdecl CYahooProto::RecvMsg( HANDLE hContact, PROTORECVEVENT* pre )
+{
+ DBDeleteContactSetting(hContact, "CList", "Hidden");
+
+ // NUDGES
+ if( !lstrcmpA(pre->szMessage, "<ding>") && ServiceExists("NUDGE/Send")){
+ DebugLog("[YahooRecvMessage] Doing Nudge Service!");
+ NotifyEventHooks(hYahooNudge, (WPARAM)hContact, pre->timestamp);
+ return 0;
+ }
+
+ CCSDATA ccs = { hContact, PSR_MESSAGE, 0, ( LPARAM )pre };
+ return CallService( MS_PROTO_RECVMSG, 0, ( LPARAM )&ccs );
+}
+
+//=======================================================
+//Send a nudge
+//=======================================================
+
+INT_PTR __cdecl CYahooProto::SendNudge(WPARAM wParam, LPARAM lParam)
+{
+ HANDLE hContact = (HANDLE) wParam;
+
+ DebugLog("[YAHOO_SENDNUDGE]");
+
+ if (!m_bLoggedIn) {/* don't send nudge if we not connected! */
+ YForkThread( &CYahooProto::im_sendackfail, hContact );
+ return 1;
+ }
+
+ DBVARIANT dbv;
+ if (!DBGetContactSettingString(hContact, m_szModuleName, YAHOO_LOGINID, &dbv)) {
+ send_msg(dbv.pszVal, GetWord(hContact, "yprotoid", 0), "<ding>", 0);
+ DBFreeVariant(&dbv);
+
+ YForkThread( &CYahooProto::im_sendacksuccess, hContact );
+ return 1;
+ }
+
+ return 0;
+}
+
+
+
diff --git a/protocols/Yahoo/im.h b/protocols/Yahoo/im.h
new file mode 100644
index 0000000000..4fa6be16c8
--- /dev/null
+++ b/protocols/Yahoo/im.h
@@ -0,0 +1,25 @@
+/*
+ * $Id: im.h 8594 2008-11-25 14:05:22Z gena01 $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+#ifndef _YAHOO_IM_H_
+#define _YAHOO_IM_H_
+
+void ext_yahoo_got_im(int id, const char *me, const char *who, int protocol,
+ const char *msg, long tm, int stat, int utf8, int buddy_icon,
+ const char *seqn, int sendn);
+
+int YahooSendNudge(WPARAM wParam, LPARAM lParam);
+int YahooRecvMessage(WPARAM wParam, LPARAM lParam);
+int YahooSendMessageW(WPARAM wParam, LPARAM lParam);
+int YahooSendMessage(WPARAM wParam, LPARAM lParam);
+
+#endif
diff --git a/protocols/Yahoo/libyahoo2/Docs/AUTHORS b/protocols/Yahoo/libyahoo2/Docs/AUTHORS
new file mode 100644
index 0000000000..2cc592900c
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/Docs/AUTHORS
@@ -0,0 +1,10 @@
+libyahoo2: library for Yahoo! Messenger new protocol
+
+Philip S Tellis <philip . tellis AT gmx . net> Maintainer
+Steve McAndrewSmith <steve AT finalge . org> Code cleanups
+Michaël Kamp <miksun AT users . sourceforge . net> Webcam Support
+Wayne Parrott <wayne_p AT pacific . net . au> Yahoo Chat
+Doug Davis <dougd AT airmail . net> Various Patches
+Konstantin Klyagin <konst AT konst . org. ua> Yahoo Search
+
+libyahoo2 is derivative of gaim: http://gaim.sourceforge.net/
diff --git a/protocols/Yahoo/libyahoo2/Docs/COPYING b/protocols/Yahoo/libyahoo2/Docs/COPYING
new file mode 100644
index 0000000000..fbdd65f6f8
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/Docs/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/protocols/Yahoo/libyahoo2/Docs/ChangeLog b/protocols/Yahoo/libyahoo2/Docs/ChangeLog
new file mode 100644
index 0000000000..ecf16131c5
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/Docs/ChangeLog
@@ -0,0 +1,280 @@
+* Fri Jan 16 2003 Alan Humpherys
+- remove_handler also takes client_id
+
+* Wed Jan 14 2003 Doug Davis
+- fix auth
+
+* Mon Dec 29 2003 Philip Tellis 0.7.3
+- up version number
+
+* Thu Dec 25 2003 Philip Tellis
+- asynchronous writes as well (might break file send)
+- better support for webcam broadcast
+- webcam images sent in chunks rather than as a single image
+- check for EAGAIN on send, defer if it is returned
+- add handler returns a tag, which is passed to remove handler to remove it
+- api has changed
+
+* Wed Dec 10 2003 Philip Tellis
+- initialise some unintialised variables
+
+* Tue Dec 9 2003 Philip Tellis
+- Yahoo Search - by Konstantin Klyagin - centericq
+
+* Tue Dec 9 2003 Philip Tellis
+- Typing notification fix from Gena01
+- Don't send VERIFY as first packet, since we don't know what do
+do if it fails anyway.
+TODO revert when we figure this out
+
+* Wed Oct 22 2003 Philip Tellis
+- Identify failed login because of incorrect username
+
+* Wed Oct 8 2003 Philip Tellis
+- Fix bug with double processing of format string in error logging
+- log_level no longer global, use yahoo_get_log_level() instead (was
+only used internally)
+
+* Tue Sep 30 2003 Doug Davis
+- chat room logout and error code
+
+* Tue Sep 30 2003 Philip
+- fix for auth to work with big endian machines too
+
+* Mon Sep 29 2003 Philip
+- attribute new auth to Cerulean studios (which is where gaim got it from)
+
+* Sun Sep 28 2003 Philip 0.7.2-2
+- made yahoo_init do what it did before, and renamed the new yahoo_init
+to yahoo_init_with_attributes. This should help not break old code.
+
+* Sun Sep 28 2003 Philip
+- changed g_malloc0 to malloc - thanks to Pixador
+
+* Sun Sep 28 2003 Philip 0.7.2
+- Auth fixed by Sean Egan (gaim).
+
+* Sat Sep 27 2003 Philip
+- Added more fallback ports
+- Fix crash in process_auth
+
+* Wed Sep 24 2003 Philip
+- Messenger host name changed to scs.msg.yahoo.com
+
+* Mon Sep 22 2003 Philip
+- Forgot a strdup
+
+* Sat Sep 20 2003 Philip
+- Support protocol 0x0b
+
+* Sat Sep 20 2003 Philip
+- Formatting fixes and yahoo_list memory management fixes
+
+* Sat Sep 20 2003 Philip
+- No more extern vars (almost)
+- yahoo_init now takes optional key/value pairs to set server settings
+see the README or yahoo2.h for full details
+- These variables no longer need to be exported from the sourcefile that
+uses the library
+
+* Fri Sep 12 2003 Philip 0.7.1
+- configure checks for socket library and won't build sample client
+if not found
+
+* Thu Sep 11 2003 Philip
+- Up version number to 0x0a so that we don't get blocked
+
+* Thu Jun 5 2003 Philip
+- fix a bunch of memory leaks
+
+* Sun May 25 2003 Philip
+- Add option to disable building sample client
+
+* Sat May 24 2003 Philip 0.7.0-1
+- Fix configure error because of old missing script in distribution
+
+* Mon May 19 2003 Philip (version 0.7.0)
+- Update README
+- release 0.7.0
+
+* Tue May 6 2003 Mik
+- fixes for webcam uploading
+- extra callback for closing connection
+
+* Thu May 1 2003 Philip
+- allow closing of webcam connections
+- more reliable finding of webcam connections
+
+* Thu May 1 2003 Philip
+- send who's images along with webcam image
+
+* Thu May 1 2003 Philip
+- get idle time from server
+- changes to webcam support to not require the user to worry about keys and
+servers
+
+* Sun Apr 20 2003 Philip
+- fixes for multiple connects and bugs introduced when adding async connects
+
+* Sat Apr 19 2003 Philip
+- Add asynchronous connects
+- Each `id' represents a single login session and everything to do with it
+- add_handler and yahoo_(read|write)_ready take a void * data argument
+- possibly introduce many bugs :D
+
+* Thu Apr 10 2003 Wayne
+- Added callback for the list of chatrooms
+
+* Thu Mar 29 2003 Wayne
+- Added basic support for pulling down the list of chatrooms
+
+* Mon Mar 24 2003 Mik
+- Seperate webcam struct to public and private data
+- Rename webcam struct to yahoo_webcam
+
+* Fri Mar 21 2003 Philip
+- Don't dereference yd after it has been freed
+
+* Fri Mar 21 2003 Mik
+- Clean up webcam data when yahoo data is cleaned up
+- Added connection type to webcam
+- Removed static for callbacks in sample_client
+
+* Wed Mar 19 2003 Mik
+- Added perliminary webcam upload support
+- Added descriptions for the webcam functions
+
+* Tue Mar 18 2003 Wayne Parrott
+- Added preliminary yahoo chat support
+
+* Sun Mar 16 2003 Philip
+- Fixed double deletion problem with yab
+- Fixed memory leak with non-pager connections
+
+* Fri Mar 14 2003 Philip
+- Announce login success earlier
+
+* Thu Mar 13 2003 Mik
+- Add preliminary webcam support
+
+* Thu Mar 6 2003 Philip
+- Remove requests for unnecessary data in addressbook code
+
+* Tue Mar 4 2003 Philip
+- Fix read past end of string in yahoo_getyab
+
+* Wed Feb 19 2003 Philip (version 0.6.3)
+- Make dist depend on libyahoo2.spec and libyahoo2.pc
+- Change version number to 0.6.3
+
+* Thu Feb 13 2003 Philip
+- added check for null connection when reading from socket.
+thanks to Alan Humpherys
+
+* Thu Feb 6 2003 Philip
+- renamed yahoo_add_yab to yahoo_set_yab
+
+* Wed Feb 5 2003 Philip
+- Support for modifying an address book entry
+
+* Mon Jan 27 2003 Philip
+- Support for adding address book entry on the server
+
+* Thu Jan 24 2003 Philip
+- Download address book from server and fill in real_name field
+of yahoo_buddy
+
+* Tue Jan 21 2003 Philip
+- Added CHAT service codes from yach
+- Fixed the problem with Offline UTF-8 encoded messages
+it no longer sends an extra bell
+- Implemented group renaming
+
+* Sat Jan 18 2003 Philip
+- utf-8 encoding/decoding functions are in yahoo_util
+- detect whether it is utf-8 or not from utf-8 flag in message
+
+* Wed Jan 15 2003 Philip
+- added utf-8 decode to conference messages too. I need to move this into
+a separate function
+
+* Tue Jan 14 2003 Philip
+- changed the accent character hack to proper UTF-8 decode supplied by Alan
+
+* Mon Jan 13 2003 Philip Tellis
+- sample client handles accented characters correctly.
+
+* Thu Dec 18 2002 Philip Tellis
+- sample client now handles sending of bell with ^G and sounding of bell
+when it receives it
+
+* Tue Dec 10 2002 Philip Tellis (version 0.6.2)
+- Added some prototypes for snprintf, strdup and vsnprintf (when compiling
+with -ansi -pedantic and without glib
+- Updated version number for release
+
+* Mon Dec 9 2002 Philip Tellis
+- Changed u_char to unsigned char
+- Fixed yahoo_get16 and yahoo_get32 to work with big endian systems also
+
+* Tue Nov 19 2002 Philip Tellis
+- Added code to process a voice chat invite. Doesn't do anything.
+
+* Mon Nov 18 2002 Philip Tellis
+- Multiple offline messages are now received correctly
+- Memory leaks cleaned up
+- Check for glib-2 as well as glib-1
+- dropped port 21 from port scan
+- Added a spec file for RPM
+
+* Sat Nov 16 2002 Rodney Dawes
+- Make libyahoo2 versioned
+- Add a pkgconfig file
+- Install headers in $(pkgincludedir)
+- Make yahoo sample client a noinst program
+- Require autoconf >= 2.50
+- Cleanups in configure.ac
+
+* Wed Nov 13 2002 Philip Tellis
+- libyahoo2 now automatically scans ports 21, 23, 25 and 80 if it cannot
+connect on the default port.
+
+* Wed Nov 06 2002 Philip Tellis
+- added protocol documentation
+
+* Tue Nov 05 2002 Philip Tellis
+- compiles with -ansi and -pedantic
+
+* Sat Oct 19 2002 Philip Tellis
+- no longer strip colour/style codes from messages
+- added colour entry for any colour to yahoo2_types.h (Nelson Ferreira)
+
+
+* Fri Oct 18 2002 Philip Tellis (version 0.6.1)
+- fixed segfault on some weird notification packets
+- fixes for conference add invite
+- identity support for conferences
+
+- sample console client can handle conferencing
+
+* Wed Oct 9 2002 Philip Tellis (version 0.6)
+- Removed glib dependencies. Will use glib only if available
+- Configure time option --with-struct-callbacks to use a callback struct
+instead of callback functions (see yahoo2_callbacks.h and the README)
+- Code cleanups by Steve McAndrewSmith
+- Get identities from server
+- Activate/Deactivate identities
+- Use identities when sending messages
+- Fixed buffer overflow in key/value pair reading
+
+- sample console client no longer requires gtk!
+
+* Mon Jul 22 2002 Philip Tellis (version 0.5)
+- Added basic documentation to README
+- Several minor code fixes and cleanups
+
+* Sat Jul 20 2002 Philip Tellis (version 0.5.cvs)
+This is an initial public release as a separate library
+I'll put a feature list in later.
+0.5 is just a random version number, I figure it's got half the features
+of where it should be when complete.
diff --git a/protocols/Yahoo/libyahoo2/Docs/NEWS b/protocols/Yahoo/libyahoo2/Docs/NEWS
new file mode 100644
index 0000000000..e4021883a1
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/Docs/NEWS
@@ -0,0 +1,88 @@
+* 29-Dec-2003
+
+Releasing 0.7.3 with some new features thanks to Konst, Doug and Gena
+
+* 9-Dec-2003
+
+Well, we now have contributions from the CenterICQ and Miranda IM teams.
+Good going methinks.
+
+* 28-Sep-2003
+
+Releasing 0.7.2 with the new auth code. Fixed by gaim.
+
+* 12-Sep-2003
+
+Releasing 0.7.1 which has a newer protocol version number. This should hold
+for a while.
+
+* 19-May-2003
+
+Released 0.7. It has webcam support, yahoo chat support and a new connection
+handling system. Asynchronous connects are also possible.
+
+* 18-Mar-2003
+
+Michaël Kamp has added Webcam support, and Wayne Parrott has started on Yahoo
+Chat support. Things are starting to move.
+
+Welcome to these two new members of the team.
+
+
+* 19-Feb-2003
+
+Released 0.6.3 - no real changes from 11th Feb.
+
+
+* 11-Feb-2003
+
+Added address book support. Rodney Dawes helped make the library
+versioned. I've also added the htdocs to CVS to make updates easier.
+0.6.2 should come out Real Soon Now.
+
+The mailing list has been alive for a while. There's been some good
+discussions.
+
+Also added documentation for the YMSG-9 protocol and the Addressbook
+structure.
+
+libyahoo2 is used in Ayttm - a fork of everybuddy.
+
+There have been requests for a Java version/wrapper. Any volunteers?
+
+
+* 18-Oct-2002
+
+This is a service release, mainly to fix the segfault on certain error
+notification packets.
+
+
+* 9-Oct-2002
+
+0.6 has been released. Also just found out that libyahoo2 is also used in
+GNUYahoo
+
+
+* 28-Sep-2002
+
+Well, I added documentation some time ago. It's in the README file. I
+suppose people have found it.
+
+The good news now is that libyahoo2 is being used in many clients, the
+bad news is that there's very little discussion on the mailing list.
+
+From what has been reported to me, and what I've heard, it seems that
+libyahoo2 is being used in Everybuddy, Fire, Proteus, Kopete, centericq.
+
+
+Hope to come out with 0.6 Real Soon Now.
+
+
+* 20-Jul-2002
+
+Umm, ok, it's been in everybuddy for a few months, and now I'm releasing
+it as a separate project.
+
+libyahoo2 has its own life now.
+
+Philip
diff --git a/protocols/Yahoo/libyahoo2/Docs/README b/protocols/Yahoo/libyahoo2/Docs/README
new file mode 100644
index 0000000000..281de5c7c3
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/Docs/README
@@ -0,0 +1,442 @@
+README for libyahoo2
+====================
+
+* Using the library
+
+Ok, here's a short, quick intro on how to use the library.
+Full documentation will come later.
+
+First include the two headers.
+
+#include <libyahoo2/yahoo2.h>
+#include <libyahoo2/yahoo2_callbacks.h>
+
+
+yahoo2.h contains functions that you can call. The data structures used
+are defined in yahoo2_types.h, which is included by yahoo2.h
+
+yahoo2_callbacks.h contains prototypes for functions that you *must*
+implement. *All* these functions must be implemented by your code. You
+can choose at configure time whether these are implemented as callback
+functions or as a callback structure.
+
+If compiled as a callback structure, you must call yahoo_register_callbacks
+before doing anything else.
+
+What each function is supposed to do and return is documented in
+yahoo2_callbacks.h
+
+
+
+Ok, assuming you've implemented all those functions to do what they're
+supposed to do, this is the process flow:
+
+1. Login
+
+Before logging in, you must initialise the connection by calling yahoo_init
+and passing the username and password of the account. yahoo_init returns
+a connection id that will be used to identify this connection for all other
+calls.
+
+You may use yahoo_init_with_attributes if you need to set any server settings.
+
+int yahoo_init(const char *username, const char *password);
+int yahoo_init_with_attributes(const char *username, const char *password, ...);
+
+The optional parameters to init are key/value pairs that specify server
+settings to use. This list must be NULL terminated - even if the list is
+empty. If a parameter isn't set, a default value will be used. Parameter
+keys are strings, parameter values are either strings or ints, depending on
+the key. Values passed in are copied, so you can use const/auto/static/
+pointers/whatever you want. Parameters are:
+
+ NAME TYPE DEFAULT DESCRIPTION
+ ------------------- ------- --------------------------- --------------
+ pager_host char * scs.msg.yahoo.com
+
+ pager_port int 5050
+
+ filetransfer_host char * filetransfer.msg.yahoo.com
+
+ filetransfer_port int 80
+
+ webcam_host char * webcam.yahoo.com
+
+ webcam_port int 5100
+
+ webcam_description char * "" Webcam description
+
+ local_host char * "" local IP address
+ regardless of whether
+ you're behind a
+ firewall or not
+
+ conn_type int Y_WCM_DSL see yahoo2_types.h
+
+
+You should set at least local_host if you intend to use webcams
+yahoo_init uses default values for all of the above.
+
+Remember to close the connection by calling yahoo_close when you no longer
+need it. This will free all resources allocated to the connection.
+
+void yahoo_close(int id);
+
+After initialising, you may call yahoo_login, with the id and the initial
+login status.
+
+void yahoo_login(int id, int initial);
+
+The initial status is one of enum yahoo_status (NOTE, only INVISIBLE and
+ONLINE are known to work at all times).
+
+When the login procedure is complete, the library will call
+ext_yahoo_login_response with a status code. See yahoo2_types for an
+enumeration of these codes.
+
+The buddy list and cookies will not be available at the time when
+ext_yahoo_login_response is called. You should wait for ext_yahoo_got_buddies
+and ext_yahoo_got_cookies.
+
+
+2. Buddies and Addressbook
+
+When the library receives the buddy list from the server, it will call
+ext_yahoo_got_buddies with the buddy list as a parameter. The library
+will call ext_yahoo_got_ignore when it receives the ignore list.
+
+- To get the buddy list at any other time, make a call to yahoo_get_buddylist,
+and use the return value of that call.
+
+- Similarly, for the ignorelist, call yahoo_get_ignorelist.
+
+These lists will be returned from the library's cache. To force a reload
+from the server, make a call to yahoo_get_list.
+
+Buddy nicknames and other contact information is stored in your yahoo address
+book. To retrieve this information, call yahoo_get_yab. call yahoo_set_yab
+to create or modify an addressbook entry. Call these functions only after
+ext_yahoo_got_cookies has been called.
+
+- To refresh the status of all buddies, make a call to yahoo_refresh.
+
+- To add a buddy, call yahoo_add_buddy:
+void yahoo_add_buddy(id, char *who, char *group);
+
+You can add a buddy to multiple groups by calling this function once for
+each group.
+
+- To remove a buddy, call yahoo_remove_buddy:
+void yahoo_remove_buddy(id, char *who, char *group);
+
+Remove buddy removes the buddy from the specified group. To completely
+remove a buddy, call this function for all groups that the buddy is in.
+
+- If a buddy adds you, and you do nothing, that buddy is accpeted (that's the
+way the protocol works). If you want to reject the buddy, make a call to
+yahoo_reject_buddy:
+
+void yahoo_reject_buddy(id, char * who, char *msg);
+
+where msg is the rejection message.
+
+- To change a buddy's group, call yahoo_change_buddy_group:
+void yahoo_change_buddy_group(id, char * who, char *old_group, char *new_group);
+
+- To ignore/unignore a buddy, call yahoo_ignore_buddy:
+void yahoo_ignore_buddy(id, char *who, int unignore);
+
+If unignore is TRUE, the buddy is unignored, if it is FALSE, the buddy is
+ignored.
+
+- You can also rename a group with:
+void yahoo_group_rename(id, char *old_group, char *new_group);
+
+
+
+
+3. Sending an IM
+
+To send an IM, make a call to yahoo_send_im
+
+void yahoo_send_im(int id, char * from, char *who, char *what, int utf8);
+
+id is the id that the connection is identified with, who is who you want
+to message, what is the message to be sent.
+
+The parameter from is the identity that you want to use to send the message.
+If this is NULL, your default identity will be used.
+
+utf8 is a boolean field that specifies whether the message you're sending
+has been encoded in utf8 or not. libyahoo2 will not do the encoding
+for you - you have to do it yourself.
+
+You may use the utility functions y_str_to_utf8 and y_utf8_to_str in
+yahoo_util to do this encoding. You must free the pointers returned by
+these functions.
+
+UTF8 encoding may also be used in messages received. It is not sent or
+received for invitations/rejection messages.
+
+You can also send typing notifications with yahoo_send_typing.
+
+
+4. Changing your status
+
+To change your status on the server, call yahoo_set_away.
+
+void yahoo_set_away(id, enum yahoo_status status, char *msg, int away);
+
+id is the identifying id, status is your new status.
+msg is a custom status message in case status == YAHOO_STATUS_CUSTOM
+and away is a flag that says whether the custom message is an away message
+or just a regular signature (this affects the kind of icon against your
+name in the official Yahoo Messenger client).
+
+
+5. Conferencing
+
+To start a conference, call yahoo_conference_invite with a list of initial
+members, the room name, and a welcome message.
+
+To add more people to the conference after it has started, call
+yahoo_conference_addinvite.
+
+If someone adds you to the conference, you can either accept by calling
+yahoo_conference_logon, or decline by calling yahoo_conference_decline
+
+You can log off from the conference by calling yahoo_conference_logoff.
+
+Send a message by calling yahoo_conference_message.
+
+The parameter from is the identity that you want to use to send the message.
+If this is NULL, your default identity will be used.
+
+NOTE: Except for yahoo_conference_addinvite, all conference functions take
+the list of members as an argument.
+
+Have a look at yahoo2_callbacks.h for conference callbacks. Beware that
+there's a chance you could get a conf_userjoin even before you get an
+invitation to that conference.
+
+
+6. File Transfer
+
+To send a file, call yahoo_send_file(id, who, msg, name, size).
+
+This will set up the initial file send connection and return a unix file
+descriptor that you must write to. You then write the file's contents to
+this fd.
+
+Receiving a file is similar. You will receive a call to ext_yahoo_got_file
+with the file's url as one of the parameters. When you are ready to start
+downloading the file, make a call to yahoo_get_url_handle:
+
+ fd = yahoo_get_url_handle(id, url, &fname, &fsize);
+
+fname and fsize are used to store the file's name and size
+
+Yahoo's file transfer is implemented using HTTP. It can either be peer
+to peer or via the yahoo file transfer servers. The latter is used in
+case a peer to peer connection cannot be set up - for example, in the
+case of a firewall.
+
+libyahoo2 supports both types of file transfer for receiving, but only
+sends files using the yahoo file transfer server.
+
+If anyone's interested in implementing peer to peer file send, this is
+how it happens.
+
+First a PEERTOPEER packet is sent to check if it is possible. This will
+mark the connection between these two hosts as p2p compatible. No further
+PEERTOPEER packets will be sent between these two hosts for the duration
+that the connection is alive.
+
+After the first P2P packet, the initiater will start an HTTP server on
+some port (really any port), and send the url across to the other end.
+
+After this, the first host will always play the part of the server for
+all file transfers. If a transfer is from the server, it uses GET, if
+it is from the client to the server, it uses POST. There is no encoding
+used for POST.
+
+You'll still have to study it a bit, but IMO the major complexity is in
+putting a http server in the lib, and whether we want to do that.
+
+
+7. Webcam
+
+To make a request for a webcam feed, call yahoo_webcam_get_feed with the
+user's yahoo id. You call this function in response to someone's webcam
+invitation as well.
+
+void yahoo_webcam_get_feed(int id, const char *who);
+
+The response may take a while as there's a lot of work done from the time
+you make a request till the time you start receiving a feed. There is
+no feedback from the library during this time. The function returns
+immediately.
+
+To close an open feed, simply call yahoo_webcam_close_feed
+
+void yahoo_webcam_close_feed(int id, const char *who);
+
+NOTE: it is possible to have two open webcam feeds with a single user
+if you open a second without closing the first. Results are unpredictable
+if you call close on a non-unique id/who combination.
+
+Webcam broadcast has not been fully tested.
+
+To invite a user to view your webcam, call yahoo_webcam_invite with the
+user's yahoo_id
+
+void yahoo_webcam_invite(int id, const char *who);
+
+To close this user's connection, call yahoo_webcam_close_feed. To
+accept/reject a request from a user to view your webcam, call
+yahoo_webcam_accept_viewer:
+
+void yahoo_webcam_accept_viewer(int id, const char *who, int accept);
+
+accept may be 1 or 0.
+
+Consult yahoo2_callbacks for the callbacks that are called on webcam
+events.
+
+You will require to be able to decode jpeg2000 images to view the webcam
+feed. You could use a library like GraphicsMagick (BSD Licence) or jasper
+(possibly non-Free) to do this.
+
+8. Yahoo Chat
+
+To retrieve a list of yahoo chatrooms, call yahoo_get_chatrooms. The
+response callback will return the xml for the chatrooms. You must parse
+this yourself.
+
+To log in to a chat room, call yahoo_chat_logon, and to log off, call
+yahoo_chat_logoff. To send a chat message, call yahoo_chat_message.
+
+Chatting is similar to conferencing. Consult yahoo2_callbacks.h for the
+list of chat callbacks.
+
+
+9. Callbacks
+
+The library may request you to register io handlers using ext_yahoo_add_handler.
+Whenever an input condition occurs, you must call one of the callback functions.
+For a read condition, call yahoo_read_ready, for a write condition, call
+yahoo_write_ready.
+
+ext_yahoo_connect_async is an asynchronous connect call. It will register a
+callback function that must be called when the connect completes. This
+callback is of type yahoo_connect_callback. Consult yahoo2_callbacks.h for
+full details on what your async connect should return.
+
+You must also call yahoo_keepalive at regular intervals (10 minutes?) to keep
+the connection alive.
+
+
+10. Identities
+
+libyahoo2 will now get your identities from the server (if you don't know
+what that is, then you aren't using it). Use yahoo_get_identities to get
+your list of identities. libyahoo2 will also call ext_got_identities when
+it first gets the list of identities.
+
+To activate/deactivate an identity, call yahoo_set_identity_status:
+ yahoo_set_identity_status(id, char * identity, int active);
+
+If active is non-zero, activate the identity, else deactivate it.
+
+If you try to activate/deactivate an identity that isn't yours, you'll
+get a call back to ext_yahoo_error with a custom error message. This
+message is from the yahoo servers. Don't complain to me about it. I
+know it sucks that we can't do translation of these strings.
+
+
+11. Search
+
+To search for contacts, use the two functions:
+
+ yahoo_search(id, type, text, gender, agerange, photo, yahoo_only);
+and
+ yahoo_search_again(id, int start);
+
+The first is used for a first time search. Check yahoo2_types.h for
+valid values for each of the parameters. text is a text string to
+search for.
+
+The search results are returned through ext_yahoo_got_search_result.
+
+Results are limited to 20 per query, so if you want to continue the
+search, call yahoo_search_again to get 20 more results. You may
+specify the start value, or use -1 to just get the next 20 results.
+
+
+12. Other functions
+
+You can call yahoo_get_cookie to get the cookies for your connection. I
+think these can be used when starting a browser to get information from
+the yahoo servers. See the comments in yahoo2.h for more information.
+
+You can also call yahoo_urldecode and yahoo_urlencode utility functions
+to url decode/encode a given string. This will be useful for getting the
+filename from a url in the file receive code.
+
+
+* Platforms
+
+libyahoo2 is known to compile on:
+ - Debian 2.2 (linux 2.4) i386, Alpha, PPC RS/6000 and Sparc Ultra60
+ - Redhat 6.0, 7.1 and 7.3 (linux 2.2 and 2.4)
+ - MacOS X 10.1 PPC - G4
+ - FreeBSD 4.6-Stable
+ - Sun Solaris (8)
+
+Thanks to Sourceforge's compile farms for letting me test it there
+
+* Copyright
+
+libyahoo2 is Copyright (C) 2002-2004 Philip S Tellis
+Portions of this code was taken and adapted from the yahoo module for
+gaim released under the GNU GPL. This code is also released under the
+GNU GPL.
+
+This code is derivitive of Gaim <http://gaim.sourceforge.net>
+copyright (C) 1998-1999, Mark Spencer <markster@marko.net>
+ 1998-1999, Adam Fritzler <afritz@marko.net>
+ 1998-2002, Rob Flynn <rob@marko.net>
+ 2000-2002, Eric Warmenhoven <eric@warmenhoven.org>
+ 2001-2002, Brian Macke <macke@strangelove.net>
+ 2001, Anand Biligiri S <abiligiri@users.sf.net>
+ 2001, Valdis Kletnieks
+ 2002, Sean Egan <bj91704@binghamton.edu>
+ 2002, Toby Gray <toby.gray@ntlworld.com>
+
+This library also uses code from other libraries, namely:
+ Portions from libfaim copyright 1998, 1999 Adam Fritzler
+ <afritz@auk.cx>
+ Portions of Sylpheed copyright 2000-2002 Hiroyuki Yamamoto
+ <hiro-y@kcn.ne.jp>
+
+
+* Licence
+
+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.
+
+You should have received a copy of the GNU General Public License
+along with this program in the file named Copying; if not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+MA 02111-1307 USA
+
+
+* Warranty
+
+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.
+
diff --git a/protocols/Yahoo/libyahoo2/Docs/TODO b/protocols/Yahoo/libyahoo2/Docs/TODO
new file mode 100644
index 0000000000..f005ec9bf2
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/Docs/TODO
@@ -0,0 +1,8 @@
+Changing user profiles
+Voice Chat
+Video Chat
+
+
+Bugs:
+Check which pointers are freed by the lib and which must be freed by the
+client, and document these.
diff --git a/protocols/Yahoo/libyahoo2/Docs/ymsg-9.txt b/protocols/Yahoo/libyahoo2/Docs/ymsg-9.txt
new file mode 100644
index 0000000000..d017013d7d
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/Docs/ymsg-9.txt
@@ -0,0 +1,326 @@
+Yahoo Messenger Protocol v 9
+----------------------------
+
+The Yahoo Messenger Protocol is an application layer protocol running most
+of the time over TCP, but in some cases over HTTP as well. Throughout
+this document, we will speak about the YMSG packets, after stripping out
+any other protocol data, but will mention this other data if it is of
+relevance.
+
+This document is incomplete. For anything not mentioned here, refer to the
+source of libyahoo2.
+
+
+1. The YMSG packet structure
+
+The YMSG packet structure is as follows:
+
+(each byte is represented by 5 spaces in the following diagram,
+including the | at the end)
+
+ <------- 4B -------><------- 4B -------><---2B--->
+ +-------------------+-------------------+---------+
+ | Y M S G | version | pkt_len |
+ +---------+---------+---------+---------+---------+
+ | service | status | session_id |
+ +---------+-------------------+-------------------+
+ | |
+ : D A T A :
+ | 0 - 65535* |
+ +-------------------------------------------------+
+
+
+* 65535 is the theoretical limit, since the length field is two bytes
+long. Practically though, the data section does not exceed about 1000
+bytes.
+
+All numeric fields are stored in network byte order. i.e. Most
+significant byte first.
+
+YMSG - The first four bytes of all packets are always YMSG - the
+ protocol name.
+
+version - The next four bytes are for the protocol version number.
+ For version 9, these are 0x09 0x00 0x00 0x00
+ NOTE: The last three bytes of this may just be padding bytes.
+
+pkt_len - A two byte value, in network byte order, stating how many bytes
+ are in the _data_ section of the packet. In practice, this
+ value does not exceed about 1000.
+
+service - This is an opcode that tells the client/server what kind of
+ service is requested/being responded to. There are 45 known
+ services. See the services section of this document for a
+ full listing.
+
+status - In case of a response from the server, indicates the status
+ of the request (success/failure/etc.). For a request, it is 0
+ in most cases, except for packets that set the user's status
+ (set status, typing notify, etc.)
+
+session - The session id is used primarily when connecting through a HTTP
+id proxy. It is set in all cases, but has no effect in a direct
+ connection. When the client sends the first packet, it is 0,
+ the server responds with a session id that is used by the client
+ and the server in all further packets. The server may change
+ the session id, in which case the client must use the new
+ session id henceforth.
+
+DATA - The data section is pkt_len bytes long and consists of a series
+ of key/value pairs. All keys are numeric strings. The packet
+ contains their numeric values in the ASCII character set. e.g.
+ 1 == 0x31, 21 == 0x32 0x31
+
+ The maximum number of digits in a key is unknown, although keys
+ of up to three digits have been seen.
+
+ Every key and value is terminated by a two byte sequence of
+ 0xc0 0x80. Some keys may have empty values.
+
+ The actual keys sent, and their meanings depend on the service
+ in use.
+
+ e.g. The packet data to send an instant message looks like this:
+
+ 0x30 0xc080 yahoo_id 0xc080 0x31 0xc080 active_id 0xc080 0x35
+ 0xc080 recipient_id 0xc080 0x3134 0xc080 message_text 0xc080
+
+ The 0xc080 byte sequence is a separator. The values 0x30, 0x31,
+ 0x35 and 0x3134 are the keys. Convert them to their ASCII
+ equivalents and you get 0, 1, 5, 14 (0x3134 == 0x31 0x34)
+
+
+2. Services
+
+There are 45 known services at the moment, although more may exist. All
+known services are listed below along with the hex values that they
+correspond to. Any service without a hex value is one more than the
+previous value. i.e. YAHOO_SERVICE_LOGOFF=0x02 and
+YAHOO_SERVICE_ISBACK=0x04.
+
+ YAHOO_SERVICE_LOGON = 0x01
+ YAHOO_SERVICE_LOGOFF
+ YAHOO_SERVICE_ISAWAY
+ YAHOO_SERVICE_ISBACK
+ YAHOO_SERVICE_IDLE = 0x05
+ YAHOO_SERVICE_MESSAGE
+ YAHOO_SERVICE_IDACT
+ YAHOO_SERVICE_IDDEACT
+ YAHOO_SERVICE_MAILSTAT
+ YAHOO_SERVICE_USERSTAT = 0x0a
+ YAHOO_SERVICE_NEWMAIL
+ YAHOO_SERVICE_CHATINVITE
+ YAHOO_SERVICE_CALENDAR
+ YAHOO_SERVICE_NEWPERSONALMAIL
+ YAHOO_SERVICE_NEWCONTACT = 0x0f
+ YAHOO_SERVICE_ADDIDENT = 0x10
+ YAHOO_SERVICE_ADDIGNORE
+ YAHOO_SERVICE_PING
+ YAHOO_SERVICE_GROUPRENAME
+ YAHOO_SERVICE_SYSMESSAGE = 0x14
+ YAHOO_SERVICE_PASSTHROUGH2 = 0x16
+ YAHOO_SERVICE_CONFINVITE = 0x18
+ YAHOO_SERVICE_CONFLOGON
+ YAHOO_SERVICE_CONFDECLINE = 0x1a
+ YAHOO_SERVICE_CONFLOGOFF
+ YAHOO_SERVICE_CONFADDINVITE
+ YAHOO_SERVICE_CONFMSG
+ YAHOO_SERVICE_CHATLOGON
+ YAHOO_SERVICE_CHATLOGOFF = 0x1f
+ YAHOO_SERVICE_CHATMSG = 0x20
+ YAHOO_SERVICE_GAMELOGON = 0x28
+ YAHOO_SERVICE_GAMELOGOFF
+ YAHOO_SERVICE_GAMEMSG = 0x2a
+ YAHOO_SERVICE_FILETRANSFER = 0x46
+ YAHOO_SERVICE_VOICECHAT = 0x4a
+ YAHOO_SERVICE_NOTIFY = 0x4b
+ YAHOO_SERVICE_P2PFILEXFER = 0x4d
+ YAHOO_SERVICE_PEERTOPEER = 0x4f
+ YAHOO_SERVICE_AUTHRESP = 0x54
+ YAHOO_SERVICE_LIST = 0x55
+ YAHOO_SERVICE_AUTH = 0x57
+ YAHOO_SERVICE_ADDBUDDY = 0x83
+ YAHOO_SERVICE_REMBUDDY = 0x84
+ YAHOO_SERVICE_IGNORECONTACT = 0x85
+ YAHOO_SERVICE_REJECTCONTACT = 0x86
+
+Most of the service codes should be self explanatory. Those that aren't
+are listed here:
+
+IDACT/IDDEACT - activate/deactivate an identity
+NOTIFY - typing/game notification
+FILETRASNFER - transfer a file using the yahoo filetransfer server as an
+ intermediate
+P2PFILEXFER - transfer a file between two peers, yahoo server not used
+PEERTOPEER - check if peer to peer connections are possible
+AUTH - Send initial login packet (username), response contains
+ challenge string
+AUTHRESP - Send response to challenge string, or, if received from
+ server, contains reason for login failure
+LOGON/LOGOFF - a buddy logged in/out
+
+
+3. Status codes
+
+The status code is a four byte value. Most status codes are two bytes
+long. The status codes (in decimal except for offline and typing) are:
+
+ YAHOO_STATUS_AVAILABLE = 0
+ YAHOO_STATUS_BRB
+ YAHOO_STATUS_BUSY
+ YAHOO_STATUS_NOTATHOME
+ YAHOO_STATUS_NOTATDESK
+ YAHOO_STATUS_NOTINOFFICE = 5
+ YAHOO_STATUS_ONPHONE
+ YAHOO_STATUS_ONVACATION
+ YAHOO_STATUS_OUTTOLUNCH
+ YAHOO_STATUS_STEPPEDOUT = 9
+ YAHOO_STATUS_INVISIBLE = 12
+ YAHOO_STATUS_CUSTOM = 99
+ YAHOO_STATUS_IDLE = 999
+ YAHOO_STATUS_OFFLINE = 0x5a55aa56
+ YAHOO_STATUS_TYPING = 0x16
+
+You may choose either AVAILABLE or INVISIBLE as your initial login status.
+TYPING is used only when sending a TYPING notification packet.
+
+
+4. Session states
+
+A Yahoo session has two states, Authentication and Messaging.
+
+4.1. Authentication
+
+The session starts in the authentication state. The client sends the username
+to the server. The server responds with a challenge string. The client
+responds to this challenge with two response strings. If authentication is
+successful, the connection goes into the messaging state, else, an error
+response is sent back.
+
+4.2. Messaging state
+
+After successful authentication, the session goes into the messaging state.
+The server sends the buddy list, ignore list, identity list and a list of
+cookies to the client. These might all be sent in a single packet. It then
+sends the list of online buddies along with their status codes. All this is
+sent without the client requesting anything.
+
+At this time, any offline messages are also delivered to the client.
+
+In the messaging state, a client may send/receive messages, join conferences,
+send/receive files, change state, etc.
+
+Messaging state is terminated when the user goes offline by sending a LOGOFF
+packet.
+
+
+5. Requests
+
+5.1. Authentication
+
+The first packet sent from the client is the authentication request
+packet. This consists of the user's yahoo id, or any identity
+corresponding to that yahoo id. The AUTH packet has one key/value pair.
+
+ service: YAHOO_SERVICE_AUTH
+ status: YAHOO_STATUS_AVAILABLE
+
+ 1: yahoo_id
+
+The server responds with a Challenge string. The client then hashes the
+username and password with this challenge string, and sends it back as an
+AUTH_RESP packet.
+
+ service: YAHOO_SERVICE_AUTHRESP
+ status: initial login status
+
+ 0: yahoo_id
+ 6: response_string_1
+ 96: response_string_2
+ 1: active_id
+
+
+5.2. Sending a message
+
+ service: YAHOO_SERVICE_MESSAGE
+ status: 0
+
+ 0: yahoo_id
+ 1: active_id
+ 5: recipient_id
+ 14: message to send
+
+5.3. Send typing start/stop notification
+
+ service: YAHOO_SERVICE_NOTIFY
+ status: YAHOO_STATUS_TYPING
+
+ 4: active_id
+ 5: recipient_id
+ 13: 1 or 0 depending on whether this is a typing start or stop
+ packet
+ 14: <space>
+ 49: TYPING /* The literal string */
+
+5.4. Set status
+
+ service: YAHOO_SERVICE_ISBACK or YAHOO_SERVICE_ISAWAY
+ status: the status to set to
+
+ 10: status_code
+ if custom_status:
+ 19: custom away message
+ 47: 0 or 1 depending on whether it is away or not
+
+
+5.5. Logoff
+
+ service: YAHOO_SERVICE_LOGOFF
+ status: YAHOO_STATUS_AVAILABLE
+
+ no key value pairs
+
+5.6. Keep alive - sent every 20 minutes
+
+ service: YAHOO_SERVICE_PING
+ status: YAHOO_STATUS_AVAILABLE
+
+ no key value pairs
+
+5.7. Add buddy
+
+ service: YAHOO_SERVICE_ADDBUDDY
+ status: YAHOO_STATUS_AVAILABLE
+
+ 1: yahoo_id
+ 7: buddy_to_add
+ 65: group to add to
+
+5.8. Remove buddy
+
+ service: YAHOO_SERVICE_REMBUDDY
+ status: YAHOO_STATUS_AVAILABLE
+
+ 1: yahoo_id
+ 7: buddy_to_remove
+ 65: group to remove from
+
+
+5.9. Reject buddy add
+
+ service: YAHOO_SERVICE_REJECTCONTACT
+ status: YAHOO_STATUS_AVAILABLE
+
+ 1: yahoo_id
+ 7: buddy_to_reject
+ 14: reject message
+
+
+-----------------------------------------------------------------------
+
+What? Is that all?
+
+ Use the source Luke!
+
+-----------------------------------------------------------------------
+
diff --git a/protocols/Yahoo/libyahoo2/config.h b/protocols/Yahoo/libyahoo2/config.h
new file mode 100644
index 0000000000..c512971fa6
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/config.h
@@ -0,0 +1,71 @@
+/*
+ * $Id: config.h 9339 2009-04-05 00:15:32Z gena01 $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+
+#ifndef _YAHOO_CONFIG_H_
+#define _YAHOO_CONFIG_H_
+
+#define HAVE_STRING_H 1
+#define STDC_HEADERS 1
+#define HAVE_STRCHR 1
+#define HAVE_MEMCPY 1
+
+#define PACKAGE "libyahoo2"
+#define VERSION "0.7.5"
+
+#include <m_stdhdr.h>
+
+#include <windows.h>
+#include <stdio.h>
+
+#define strlen lstrlenA
+#define strcat lstrcatA
+#define strcmp lstrcmpA
+#define strcpy lstrcpyA
+
+#ifdef _MSC_VER
+
+#define strncasecmp strnicmp
+
+#define wsnprintf _wsnprintf
+#define snprintf _snprintf
+#define vsnprintf _vsnprintf
+
+#endif
+
+#define USE_STRUCT_CALLBACKS
+
+#define write(a,b,c) send(a,b,c,0)
+#define read(a,b,c) recv(a,b,c,0)
+
+#include <newpluginapi.h>
+#include <m_netlib.h>
+#define close(a) Netlib_CloseHandle((HANDLE)a)
+
+/*
+ * Need to handle MD5 through Miranda. otherwise just include some md5.h implementation instead
+ */
+#include <m_utils.h>
+
+#define md5_byte_t mir_md5_byte_t
+#define md5_state_t mir_md5_state_t
+
+#define md5_init(A) md5i.md5_init(A)
+#define md5_append(A,B,C) md5i.md5_append(A,B,C)
+#define md5_finish(A,B) md5i.md5_finish(A,B)
+
+#define sha1_ctx mir_sha1_ctx
+#define sha1_init(A) sha1i.sha1_init(A)
+#define sha1_append(A,B,C) sha1i.sha1_append(A,B,C)
+#define sha1_finish(A,B) sha1i.sha1_finish(A,B)
+
+#endif
diff --git a/protocols/Yahoo/libyahoo2/crypt.c b/protocols/Yahoo/libyahoo2/crypt.c
new file mode 100644
index 0000000000..d84ecd0644
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/crypt.c
@@ -0,0 +1,205 @@
+/* One way encryption based on MD5 sum.
+ Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+/* warmenhoven took this file and made it work with the md5.[ch] we
+ * already had. isn't that lovely. people should just use linux or
+ * freebsd, crypt works properly on those systems. i hate solaris */
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#if HAVE_STRING_H
+# include <string.h>
+#elif HAVE_STRINGS_H
+# include <strings.h>
+#endif
+
+#include <stdlib.h>
+#include "yahoo_util.h"
+
+/* Define our magic string to mark salt for MD5 "encryption"
+ replacement. This is meant to be the same as for other MD5 based
+ encryption implementations. */
+static const char md5_salt_prefix[] = "$1$";
+
+/* Table with characters for base64 transformation. */
+static const char b64t[65] =
+"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+char *yahoo_crypt(char *key, char *salt)
+{
+ char *buffer = NULL;
+ int buflen = 0;
+ int needed = 3 + strlen (salt) + 1 + 26 + 1;
+
+ md5_byte_t alt_result[16];
+ md5_state_t ctx;
+ md5_state_t alt_ctx;
+ int salt_len;
+ int key_len;
+ int cnt;
+ char *cp;
+
+ if (buflen < needed) {
+ buflen = needed;
+ if ((buffer = (char*)realloc(buffer, buflen)) == NULL)
+ return NULL;
+ }
+
+ /* Find beginning of salt string. The prefix should normally always
+ be present. Just in case it is not. */
+ if (strncmp (md5_salt_prefix, salt, sizeof (md5_salt_prefix) - 1) == 0)
+ /* Skip salt prefix. */
+ salt += sizeof (md5_salt_prefix) - 1;
+
+ salt_len = (int)MIN (strcspn (salt, "$"), 8);
+ key_len = (int)strlen (key);
+
+ /* Prepare for the real work. */
+ md5_init(&ctx);
+
+ /* Add the key string. */
+ md5_append(&ctx, (md5_byte_t *)key, (int)key_len);
+
+ /* Because the SALT argument need not always have the salt prefix we
+ add it separately. */
+ md5_append(&ctx, (md5_byte_t *)md5_salt_prefix, sizeof (md5_salt_prefix) - 1);
+
+ /* The last part is the salt string. This must be at most 8
+ characters and it ends at the first `$' character (for
+ compatibility which existing solutions). */
+ md5_append(&ctx, (md5_byte_t *)salt, (int)salt_len);
+
+ /* Compute alternate MD5 sum with input KEY, SALT, and KEY. The
+ final result will be added to the first context. */
+ md5_init(&alt_ctx);
+
+ /* Add key. */
+ md5_append(&alt_ctx, (md5_byte_t *)key, key_len);
+
+ /* Add salt. */
+ md5_append(&alt_ctx, (md5_byte_t *)salt, salt_len);
+
+ /* Add key again. */
+ md5_append(&alt_ctx, (md5_byte_t *)key, key_len);
+
+ /* Now get result of this (16 bytes) and add it to the other
+ context. */
+ md5_finish(&alt_ctx, alt_result);
+
+ /* Add for any character in the key one byte of the alternate sum. */
+ for (cnt = key_len; cnt > 16; cnt -= 16)
+ md5_append(&ctx, alt_result, 16);
+ md5_append(&ctx, alt_result, cnt);
+
+ /* For the following code we need a NUL byte. */
+ alt_result[0] = '\0';
+
+ /* The original implementation now does something weird: for every 1
+ bit in the key the first 0 is added to the buffer, for every 0
+ bit the first character of the key. This does not seem to be
+ what was intended but we have to follow this to be compatible. */
+ for (cnt = key_len; cnt > 0; cnt >>= 1)
+ md5_append(&ctx, (cnt & 1) != 0 ? alt_result : (md5_byte_t *)key, 1);
+
+ /* Create intermediate result. */
+ md5_finish(&ctx, alt_result);
+
+ /* Now comes another weirdness. In fear of password crackers here
+ comes a quite long loop which just processes the output of the
+ previous round again. We cannot ignore this here. */
+ for (cnt = 0; cnt < 1000; ++cnt) {
+ /* New context. */
+ md5_init(&ctx);
+
+ /* Add key or last result. */
+ if ((cnt & 1) != 0)
+ md5_append(&ctx, (md5_byte_t *)key, key_len);
+ else
+ md5_append(&ctx, alt_result, 16);
+
+ /* Add salt for numbers not divisible by 3. */
+ if (cnt % 3 != 0)
+ md5_append(&ctx, (md5_byte_t *)salt, salt_len);
+
+ /* Add key for numbers not divisible by 7. */
+ if (cnt % 7 != 0)
+ md5_append(&ctx, (md5_byte_t *)key, key_len);
+
+ /* Add key or last result. */
+ if ((cnt & 1) != 0)
+ md5_append(&ctx, alt_result, 16);
+ else
+ md5_append(&ctx, (md5_byte_t *)key, key_len);
+
+ /* Create intermediate result. */
+ md5_finish(&ctx, alt_result);
+ }
+
+ /* Now we can construct the result string. It consists of three
+ parts. */
+
+ strncpy(buffer, md5_salt_prefix, MAX (0, buflen));
+ cp = buffer + strlen(buffer);
+ buflen -= sizeof (md5_salt_prefix);
+
+ strncpy(cp, salt, MIN (buflen, salt_len));
+ cp = cp + strlen(cp);
+ buflen -= MIN (buflen, salt_len);
+
+ if (buflen > 0) {
+ *cp++ = '$';
+ --buflen;
+ }
+
+#define b64_from_24bit(B2, B1, B0, N) \
+ do { \
+ unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0); \
+ int n = (N); \
+ while (n-- > 0 && buflen > 0) { \
+ *cp++ = b64t[w & 0x3f]; \
+ --buflen; \
+ w >>= 6; \
+ }\
+ } while (0)
+
+ b64_from_24bit (alt_result[0], alt_result[6], alt_result[12], 4);
+ b64_from_24bit (alt_result[1], alt_result[7], alt_result[13], 4);
+ b64_from_24bit (alt_result[2], alt_result[8], alt_result[14], 4);
+ b64_from_24bit (alt_result[3], alt_result[9], alt_result[15], 4);
+ b64_from_24bit (alt_result[4], alt_result[10], alt_result[5], 4);
+ b64_from_24bit (0, 0, alt_result[11], 2);
+ if (buflen <= 0) {
+ FREE(buffer);
+ } else
+ *cp = '\0'; /* Terminate the string. */
+
+ /* Clear the buffer for the intermediate result so that people
+ attaching to processes or reading core dumps cannot get any
+ information. We do it in this way to clear correct_words[]
+ inside the MD5 implementation as well. */
+ md5_init(&ctx);
+ md5_finish(&ctx, alt_result);
+ memset (&ctx, '\0', sizeof (ctx));
+ memset (&alt_ctx, '\0', sizeof (alt_ctx));
+
+ return buffer;
+}
diff --git a/protocols/Yahoo/libyahoo2/libyahoo2.c b/protocols/Yahoo/libyahoo2/libyahoo2.c
new file mode 100644
index 0000000000..e118a76d18
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/libyahoo2.c
@@ -0,0 +1,6662 @@
+/*
+ * libyahoo2: libyahoo2.c
+ *
+ * Some code copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net>
+ *
+ * Yahoo Search copyright (C) 2003, Konstantin Klyagin <konst AT konst.org.ua>
+ *
+ * Much of this code was taken and adapted from the yahoo module for
+ * gaim released under the GNU GPL. This code is also released under the
+ * GNU GPL.
+ *
+ * This code is derivitive of Gaim <http://gaim.sourceforge.net>
+ * copyright (C) 1998-1999, Mark Spencer <markster@marko.net>
+ * 1998-1999, Adam Fritzler <afritz@marko.net>
+ * 1998-2002, Rob Flynn <rob@marko.net>
+ * 2000-2002, Eric Warmenhoven <eric@warmenhoven.org>
+ * 2001-2002, Brian Macke <macke@strangelove.net>
+ * 2001, Anand Biligiri S <abiligiri@users.sf.net>
+ * 2001, Valdis Kletnieks
+ * 2002, Sean Egan <bj91704@binghamton.edu>
+ * 2002, Toby Gray <toby.gray@ntlworld.com>
+ *
+ * This library also uses code from other libraries, namely:
+ * Portions from libfaim copyright 1998, 1999 Adam Fritzler
+ * <afritz@auk.cx>
+ * Portions of Sylpheed copyright 2000-2002 Hiroyuki Yamamoto
+ * <hiro-y@kcn.ne.jp>
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef _WIN32
+# include <unistd.h>
+#endif
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#if STDC_HEADERS
+# include <string.h>
+#else
+# if !HAVE_STRCHR
+# define strchr index
+# define strrchr rindex
+# endif
+char *strchr (), *strrchr ();
+# if !HAVE_MEMCPY
+# define memcpy(d, s, n) bcopy ((s), (d), (n))
+# define memmove(d, s, n) bcopy ((s), (d), (n))
+# endif
+#endif
+
+#include <sys/types.h>
+
+#include <stdlib.h>
+#include <ctype.h>
+#include <time.h>
+#include <malloc.h>
+
+#include "yahoo2.h"
+#include "yahoo_httplib.h"
+#include "yahoo_util.h"
+
+#include "yahoo2_callbacks.h"
+#include "yahoo_debug.h"
+
+#ifdef USE_STRUCT_CALLBACKS
+struct yahoo_callbacks *yc=NULL;
+
+void yahoo_register_callbacks(struct yahoo_callbacks * tyc)
+{
+ yc = tyc;
+}
+
+#define YAHOO_CALLBACK(x) yc->x
+#else
+#define YAHOO_CALLBACK(x) x
+#endif
+
+struct yahoo_pair {
+ int key;
+ char *value;
+};
+
+struct yahoo_packet {
+ unsigned short int service;
+ int status;
+ unsigned int id;
+ YList *hash;
+};
+
+struct yahoo_search_state {
+ int lsearch_type;
+ char *lsearch_text;
+ int lsearch_gender;
+ int lsearch_agerange;
+ int lsearch_photo;
+ int lsearch_yahoo_only;
+ int lsearch_nstart;
+ int lsearch_nfound;
+ int lsearch_ntotal;
+};
+
+struct data_queue {
+ unsigned char *queue;
+ int len;
+};
+
+struct yahoo_input_data {
+ struct yahoo_data *yd;
+ struct yahoo_webcam *wcm;
+ struct yahoo_webcam_data *wcd;
+ struct yahoo_search_state *ys;
+
+ int fd;
+ enum yahoo_connection_type type;
+
+ unsigned char *rxqueue;
+ int rxlen;
+ int read_tag;
+
+ YList *txqueues;
+ int write_tag;
+};
+
+/* default values for servers */
+static const char pager_host[] = "scs.msg.yahoo.com";
+static const int pager_port = 5050;
+static const int fallback_ports[]={80, 23, 25, 20, 119, 8001, 8002, 5050, 0};
+static const char filetransfer_host[]="filetransfer.msg.yahoo.com";
+static const int filetransfer_port=80;
+static const char webcam_host[]="webcam.yahoo.com";
+static const int webcam_port=5100;
+static const char webcam_description[]="";
+static char local_host[]="";
+static int conn_type=Y_WCM_DSL;
+static const char login_host[]="login.yahoo.com";
+static char profile_url[] = "http://profiles.yahoo.com/";
+
+typedef struct {
+ int key;
+ char *name;
+}value_string;
+
+static int yahoo_send_data(int fd, const char *data, int len);
+
+int yahoo_log_message(char * fmt, ...)
+{
+ char out[1024];
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(out, sizeof(out), fmt, ap);
+ va_end(ap);
+ return YAHOO_CALLBACK(ext_yahoo_log)("%s", out);
+}
+
+int yahoo_connect(char * host, int port, int type)
+{
+ return YAHOO_CALLBACK(ext_yahoo_connect)(host, port, type);
+}
+
+static enum yahoo_log_level log_level = YAHOO_LOG_NONE;
+
+enum yahoo_log_level yahoo_get_log_level()
+{
+ return log_level;
+}
+
+int yahoo_set_log_level(enum yahoo_log_level level)
+{
+ enum yahoo_log_level l = log_level;
+ log_level = level;
+ return l;
+}
+
+static const value_string ymsg_service_vals[] = {
+ {YAHOO_SERVICE_LOGON, "Pager Logon"},
+ {YAHOO_SERVICE_LOGOFF, "Pager Logoff"},
+ {YAHOO_SERVICE_ISAWAY, "Is Away"},
+ {YAHOO_SERVICE_ISBACK, "Is Back"},
+ {YAHOO_SERVICE_IDLE, "Idle"},
+ {YAHOO_SERVICE_MESSAGE, "Message"},
+ {YAHOO_SERVICE_IDACT, "Activate Identity"},
+ {YAHOO_SERVICE_IDDEACT, "Deactivate Identity"},
+ {YAHOO_SERVICE_MAILSTAT, "Mail Status"},
+ {YAHOO_SERVICE_USERSTAT, "User Status"},
+ {YAHOO_SERVICE_NEWMAIL, "New Mail"},
+ {YAHOO_SERVICE_CHATINVITE, "Chat Invitation"},
+ {YAHOO_SERVICE_CALENDAR, "Calendar Reminder"},
+ {YAHOO_SERVICE_NEWPERSONALMAIL, "New Personals Mail"},
+ {YAHOO_SERVICE_NEWCONTACT, "New Friend"},
+ {YAHOO_SERVICE_ADDIDENT, "Add Identity"},
+ {YAHOO_SERVICE_ADDIGNORE, "Add Ignore"},
+ {YAHOO_SERVICE_PING, "Ping"},
+ {YAHOO_SERVICE_GOTGROUPRENAME, "Got Group Rename"},
+ {YAHOO_SERVICE_SYSMESSAGE, "System Message"},
+ {YAHOO_SERVICE_SKINNAME, "YAHOO_SERVICE_SKINNAME"},
+ {YAHOO_SERVICE_PASSTHROUGH2, "Passthrough 2"},
+ {YAHOO_SERVICE_CONFINVITE, "Conference Invitation"},
+ {YAHOO_SERVICE_CONFLOGON, "Conference Logon"},
+ {YAHOO_SERVICE_CONFDECLINE, "Conference Decline"},
+ {YAHOO_SERVICE_CONFLOGOFF, "Conference Logoff"},
+ {YAHOO_SERVICE_CONFADDINVITE, "Conference Additional Invitation"},
+ {YAHOO_SERVICE_CONFMSG, "Conference Message"},
+ {YAHOO_SERVICE_CHATLOGON, "Chat Logon"},
+ {YAHOO_SERVICE_CHATLOGOFF, "Chat Logoff"},
+ {YAHOO_SERVICE_CHATMSG, "Chat Message"},
+ {YAHOO_SERVICE_GAMELOGON, "Game Logon"},
+ {YAHOO_SERVICE_GAMELOGOFF, "Game Logoff"},
+ {YAHOO_SERVICE_GAMEMSG, "Game Message"},
+ {YAHOO_SERVICE_FILETRANSFER, "File Transfer"},
+ {YAHOO_SERVICE_VOICECHAT, "Voice Chat"},
+ {YAHOO_SERVICE_NOTIFY, "Notify"},
+ {YAHOO_SERVICE_VERIFY, "Verify"},
+ {YAHOO_SERVICE_P2PFILEXFER, "P2P File Transfer"},
+ {YAHOO_SERVICE_PEERTOPEER, "Peer To Peer"},
+ {YAHOO_SERVICE_WEBCAM, "WebCam"},
+ {YAHOO_SERVICE_AUTHRESP, "Authentication Response"},
+ {YAHOO_SERVICE_LIST, "List"},
+ {YAHOO_SERVICE_AUTH, "Authentication"},
+ {YAHOO_SERVICE_ADDBUDDY, "Add Buddy"},
+ {YAHOO_SERVICE_REMBUDDY, "Remove Buddy"},
+ {YAHOO_SERVICE_IGNORECONTACT, "Ignore Contact"},
+ {YAHOO_SERVICE_REJECTCONTACT, "Reject Contact"},
+ {YAHOO_SERVICE_GROUPRENAME, "Group Rename"},
+ {YAHOO_SERVICE_KEEPALIVE, "Keep Alive"},
+ {YAHOO_SERVICE_CHATONLINE, "Chat Online"},
+ {YAHOO_SERVICE_CHATGOTO, "Chat Goto"},
+ {YAHOO_SERVICE_CHATJOIN, "Chat Join"},
+ {YAHOO_SERVICE_CHATLEAVE, "Chat Leave"},
+ {YAHOO_SERVICE_CHATEXIT, "Chat Exit"},
+ {YAHOO_SERVICE_CHATADDINVITE, "Chat Invite"},
+ {YAHOO_SERVICE_CHATLOGOUT, "Chat Logout"},
+ {YAHOO_SERVICE_CHATPING, "Chat Ping"},
+ {YAHOO_SERVICE_COMMENT, "Comment"},
+ {YAHOO_SERVICE_GAME_INVITE,"Game Invite"},
+ {YAHOO_SERVICE_STEALTH_PERM, "Stealth Permanent"},
+ {YAHOO_SERVICE_STEALTH_SESSION, "Stealth Session"},
+ {YAHOO_SERVICE_AVATAR,"Avatar"},
+ {YAHOO_SERVICE_PICTURE_CHECKSUM,"Picture Checksum"},
+ {YAHOO_SERVICE_PICTURE,"Picture"},
+ {YAHOO_SERVICE_PICTURE_UPDATE,"Picture Update"},
+ {YAHOO_SERVICE_PICTURE_UPLOAD,"Picture Upload"},
+ {YAHOO_SERVICE_YAB_UPDATE,"Yahoo Address Book Update"},
+ {YAHOO_SERVICE_Y6_VISIBLE_TOGGLE, "Y6 Visibility Toggle"},
+ {YAHOO_SERVICE_Y6_STATUS_UPDATE, "Y6 Status Update"},
+ {YAHOO_SERVICE_PICTURE_SHARING, "Picture Sharing Status"},
+ {YAHOO_SERVICE_VERIFY_ID_EXISTS, "Verify ID Exists"},
+ {YAHOO_SERVICE_AUDIBLE, "Audible"},
+ {YAHOO_SERVICE_Y7_CONTACT_DETAILS,"Y7 Contact Details"},
+ {YAHOO_SERVICE_Y7_CHAT_SESSION, "Y7 Chat Session"},
+ {YAHOO_SERVICE_Y7_AUTHORIZATION,"Y7 Buddy Authorization"},
+ {YAHOO_SERVICE_Y7_FILETRANSFER,"Y7 File Transfer"},
+ {YAHOO_SERVICE_Y7_FILETRANSFERINFO,"Y7 File Transfer Information"},
+ {YAHOO_SERVICE_Y7_FILETRANSFERACCEPT,"Y7 File Transfer Accept"},
+ {YAHOO_SERVICE_Y7_MINGLE, "Y7 360 Mingle"},
+ {YAHOO_SERVICE_Y7_CHANGE_GROUP, "Y7 Change Group"},
+ {YAHOO_SERVICE_Y8_STATUS_UPDATE, "Y8 Buddy Status Update"},
+ {YAHOO_SERVICE_Y8_LIST, "Y8 Buddy List"},
+ {YAHOO_SERVICE_Y9_MESSAGE_ACK, "Y9 Message Ack"},
+ {YAHOO_SERVICE_Y9_PINGBOX_LIST, "Y9 Pingbox List"},
+ {YAHOO_SERVICE_Y9_PINGBOX_GUEST_STATUS, "Y9 Pingbox Guest Status"},
+ {YAHOO_SERVICE_Y9_PINGBOX_NA, "Y9 Pingbox ???"},
+ {YAHOO_SERVICE_WEBLOGIN, "Web Login"},
+ {YAHOO_SERVICE_SMS_MSG, "SMS Message"},
+ {YAHOO_SERVICE_Y7_DISCONNECTED, "Y7 Disconnected"},
+ {0, NULL}
+};
+
+static const value_string ymsg_status_vals[] = {
+ {YPACKET_STATUS_DISCONNECTED,"Disconnected"},
+ {YPACKET_STATUS_DEFAULT,""},
+ {YPACKET_STATUS_SERVERACK,"Server Ack"},
+ {YPACKET_STATUS_GAME,"Playing Game"},
+ {YPACKET_STATUS_AWAY, "Away"},
+ {YPACKET_STATUS_CONTINUED,"More Packets??"},
+ {YPACKET_STATUS_NOTIFY, "Notify"},
+ {YPACKET_STATUS_WEBLOGIN,"Web Login"},
+ {YPACKET_STATUS_OFFLINE,"Offline"},
+ {0, NULL}
+};
+
+static const value_string packet_keys[]={
+ { 0, "identity" },
+ { 1, "ID" },
+ { 2, "id?" },
+ { 3, "my id"},
+ { 4, "ID/Nick"},
+ { 5, "To"},
+ { 6, "auth token 1"},
+ { 7, "Buddy" },
+ { 8, "# buddies"},
+ { 9, "# mails"},
+ { 10, "state"},
+ { 11, "session"},
+ { 12, "reverse ip? [gaim]"},
+ { 13, "stat/location"}, // bitnask: 0 = pager, 1 = chat, 2 = game
+ { 14, "ind/msg"},
+ { 15, "time"},
+ { 16, "Error msg"},
+ { 17, "chat"},
+ { 18, "subject/topic?"},
+ { 19, "custom msg"},
+ { 20, "url"},
+ { 24, "session timestamp"},
+ { 27, "filename"},
+ { 28, "filesize"},
+ { 31, "visibility?"},
+ { 38, "expires"},
+ { 42, "email"},
+ { 43, "email who"},
+ { 47, "away"},
+ { 49, "service"},
+ { 50, "conf host"},
+ { 52, "conf invite"},
+ { 53, "conf logon"},
+ { 54, "conf decline"},
+ { 55, "conf unavail"},
+ { 56, "conf logoff"},
+ { 57, "conf room"},
+ { 58, "conf joinmsg"},
+ { 59, "cookies"},
+ { 60, "SMS/Mobile"},
+ { 61, "Cookie?"},
+ { 63, "imvironment name;num"},
+ { 64, "imvironment enabled/avail"},
+ { 65, "group"},
+ { 66, "login status"},
+ { 73, "user name"},
+ { 87, "buds/groups"},
+ { 88, "ignore list"},
+ { 89, "identities"},
+ { 91, "pingbox nick"},
+ { 92, "pingbox id"},
+ { 94, "auth seed"},
+ { 96, "auth token 2"},
+ { 97, "utf8"},
+ {104, "room name"},
+ {105, "chat topic"},
+ {108, "chat nbuddies"},
+ {109, "chat from"},
+ {110, "chat age"},
+ {113, "chat attrs"},
+ {117, "chat msg"},
+ {124, "chat msg type"},
+ {128, "chat room category?"},
+ {129, "chat room serial 2"},
+ {130, "first join/chat room cookie"},
+ {135, "YIM version"},
+ {137, "idle time"},
+ {138, "idle?"},
+ {142, "chat location"},
+ {143, "ping interval (mins)"},
+ {144, "keep-alive interval (mins)"},
+ {185, "stealth/hide?"},
+ {192, "Pictures/Buddy Icons"},
+ {197, "Avatars"},
+ {203, "YAB data?"},
+ {206, "display image type"},
+ {213, "share avatar type"},
+ {216, "first name"},
+ {219, "cookie separator?"},
+ {222, "FT7 Service"},
+ {223, "authorized?"},
+ {230, "the audible, in foo.bar.baz format"},
+ {231, "audible text"},
+ {232, "weird number (md5 hash?) [audible]"},
+ {241, "protocol"},
+ {244, "client version"},
+ {249, "FT7 Op"},
+ {250, "FT7 Relay Host"},
+ {251, "File Preview?"},
+ {254, "last name"},
+ {265, "FT7 Token"},
+ {266, "FT7 # Files"},
+ {267, "FT7 Preview"},
+ {317, "Stealth"},
+ {430, "Seq #"},
+ {450, "Retry"},
+ {1002, "YIM6+"},
+ {10093, "YIM7 (sets it to 4)"},
+ {10097, "Region (SMS?)"},
+ { -1, "" }
+};
+
+const char *dbg_key(int key)
+{
+ int i=0;
+
+ while ((packet_keys[i].key >=0) && (packet_keys[i].key != key) )
+ i++;
+
+ if (packet_keys[i].key != key)
+ return NULL;
+ else
+ return packet_keys[i].name;
+}
+
+const char *dbg_service(int key)
+{
+ int i=0;
+
+ while ((ymsg_service_vals[i].key > 0) && (ymsg_service_vals[i].key != key) )
+ i++;
+
+ if (ymsg_service_vals[i].key != key)
+ return NULL;
+ else
+ return ymsg_service_vals[i].name;
+}
+
+const char *dbg_status(int key)
+{
+ int i;
+
+ for (i = 0; ymsg_status_vals[i].name != NULL; i++ ) {
+ if (ymsg_status_vals[i].key == key)
+ return ymsg_status_vals[i].name;
+ }
+
+ return NULL;
+}
+
+static struct yahoo_server_settings* _yahoo_default_server_settings()
+{
+ struct yahoo_server_settings *yss = y_new0(struct yahoo_server_settings, 1);
+
+ yss->pager_host = strdup(pager_host);
+ yss->pager_port = pager_port;
+ yss->filetransfer_host = strdup(filetransfer_host);
+ yss->filetransfer_port = filetransfer_port;
+ yss->webcam_host = strdup(webcam_host);
+ yss->webcam_port = webcam_port;
+ yss->webcam_description = strdup(webcam_description);
+ yss->local_host = strdup(local_host);
+ yss->conn_type = conn_type;
+ yss->pic_cksum = -1;
+ yss->login_host = strdup(login_host);
+
+ return yss;
+}
+
+static struct yahoo_server_settings * _yahoo_assign_server_settings(va_list ap)
+{
+ struct yahoo_server_settings *yss = _yahoo_default_server_settings();
+ char *key;
+ char *svalue;
+ int nvalue;
+
+ while(1) {
+ key = va_arg(ap, char *);
+ if(key == NULL)
+ break;
+
+ if(!strcmp(key, "pager_host")) {
+ svalue = va_arg(ap, char *);
+ free(yss->pager_host);
+ yss->pager_host = strdup(svalue);
+ } else if(!strcmp(key, "pager_port")) {
+ nvalue = va_arg(ap, int);
+ yss->pager_port = nvalue;
+ } else if(!strcmp(key, "filetransfer_host")) {
+ svalue = va_arg(ap, char *);
+ free(yss->filetransfer_host);
+ yss->filetransfer_host = strdup(svalue);
+ } else if(!strcmp(key, "filetransfer_port")) {
+ nvalue = va_arg(ap, int);
+ yss->filetransfer_port = nvalue;
+ } else if(!strcmp(key, "webcam_host")) {
+ svalue = va_arg(ap, char *);
+ free(yss->webcam_host);
+ yss->webcam_host = strdup(svalue);
+ } else if(!strcmp(key, "webcam_port")) {
+ nvalue = va_arg(ap, int);
+ yss->webcam_port = nvalue;
+ } else if(!strcmp(key, "webcam_description")) {
+ svalue = va_arg(ap, char *);
+ free(yss->webcam_description);
+ yss->webcam_description = strdup(svalue);
+ } else if(!strcmp(key, "local_host")) {
+ svalue = va_arg(ap, char *);
+ free(yss->local_host);
+ yss->local_host = strdup(svalue);
+ } else if(!strcmp(key, "conn_type")) {
+ nvalue = va_arg(ap, int);
+ yss->conn_type = nvalue;
+ } else if(!strcmp(key, "picture_checksum")) {
+ nvalue = va_arg(ap, int);
+ yss->pic_cksum = nvalue;
+ } else if(!strcmp(key, "web_messenger")) {
+ nvalue = va_arg(ap, int);
+ yss->web_messenger = nvalue;
+ } else if(!strcmp(key, "login_host")) {
+ svalue = va_arg(ap, char *);
+ free(yss->login_host);
+ yss->login_host = strdup(svalue);
+ } else {
+ WARNING(("Unknown key passed to yahoo_init, "
+ "perhaps you didn't terminate the list "
+ "with NULL"));
+ }
+ }
+
+ return yss;
+}
+
+static void yahoo_free_server_settings(struct yahoo_server_settings *yss)
+{
+ if(!yss)
+ return;
+
+ free(yss->pager_host);
+ free(yss->filetransfer_host);
+ free(yss->webcam_host);
+ free(yss->webcam_description);
+ free(yss->local_host);
+ free(yss->login_host);
+ free(yss);
+}
+
+static YList *conns=NULL;
+static YList *inputs=NULL;
+static int last_id=0;
+
+static void add_to_list(struct yahoo_data *yd)
+{
+ conns = y_list_prepend(conns, yd);
+}
+static struct yahoo_data * find_conn_by_id(int id)
+{
+ YList *l;
+ for(l = conns; l; l = y_list_next(l)) {
+ struct yahoo_data *yd = (struct yahoo_data *) l->data;
+ if(yd->client_id == id)
+ return yd;
+ }
+ return NULL;
+}
+static void del_from_list(struct yahoo_data *yd)
+{
+ conns = y_list_remove(conns, yd);
+}
+
+/* call repeatedly to get the next one */
+/*
+static struct yahoo_input_data * find_input_by_id(int id)
+{
+ YList *l;
+ for(l = inputs; l; l = y_list_next(l)) {
+ struct yahoo_input_data *yid = l->data;
+ if(yid->yd->client_id == id)
+ return yid;
+ }
+ return NULL;
+}
+*/
+
+static struct yahoo_input_data * find_input_by_id_and_webcam_user(int id, const char * who)
+{
+ YList *l;
+ LOG(("find_input_by_id_and_webcam_user"));
+ for(l = inputs; l; l = y_list_next(l)) {
+ struct yahoo_input_data *yid = (struct yahoo_input_data *) l->data;
+ if(yid->type == YAHOO_CONNECTION_WEBCAM && yid->yd->client_id == id
+ && yid->wcm &&
+ ((who && yid->wcm->user && !strcmp(who, yid->wcm->user)) ||
+ !(yid->wcm->user && !who)))
+ return yid;
+ }
+ return NULL;
+}
+
+static struct yahoo_input_data * find_input_by_id_and_type(int id, enum yahoo_connection_type type)
+{
+ YList *l;
+
+ //LOG(("[find_input_by_id_and_type] id: %d, type: %d", id, type));
+ for(l = inputs; l; l = y_list_next(l)) {
+ struct yahoo_input_data *yid = (struct yahoo_input_data *)l->data;
+ if(yid->type == type && yid->yd->client_id == id) {
+ //LOG(("[find_input_by_id_and_type] Got it!!!"));
+ return yid;
+ }
+ }
+ return NULL;
+}
+
+static struct yahoo_input_data * find_input_by_id_and_fd(int id, int fd)
+{
+ YList *l;
+ LOG(("find_input_by_id_and_fd"));
+ for(l = inputs; l; l = y_list_next(l)) {
+ struct yahoo_input_data *yid = (struct yahoo_input_data *) l->data;
+
+ if(yid->fd == fd && yid->yd->client_id == id)
+ return yid;
+ }
+ return NULL;
+}
+
+static int count_inputs_with_id(int id)
+{
+ int c=0;
+ YList *l;
+ LOG(("counting %d", id));
+ for(l = inputs; l; l = y_list_next(l)) {
+ struct yahoo_input_data *yid = (struct yahoo_input_data *) l->data;
+ if(yid->yd->client_id == id)
+ c++;
+ }
+ LOG(("%d", c));
+ return c;
+}
+
+
+extern char *yahoo_crypt(char *, char *);
+
+/* Free a buddy list */
+static void yahoo_free_buddies(YList * list)
+{
+ YList *l;
+
+ for(l = list; l; l = l->next)
+ {
+ struct yahoo_buddy *bud = (struct yahoo_buddy *) l->data;
+ if(!bud)
+ continue;
+
+ FREE(bud->group);
+ FREE(bud->id);
+ FREE(bud->real_name);
+ if(bud->yab_entry) {
+ FREE(bud->yab_entry->fname);
+ FREE(bud->yab_entry->lname);
+ FREE(bud->yab_entry->nname);
+ FREE(bud->yab_entry->id);
+ FREE(bud->yab_entry->email);
+ FREE(bud->yab_entry->hphone);
+ FREE(bud->yab_entry->wphone);
+ FREE(bud->yab_entry->mphone);
+ FREE(bud->yab_entry);
+ }
+ FREE(bud);
+ l->data = bud = NULL;
+ }
+
+ y_list_free(list);
+}
+
+/* Free an identities list */
+static void yahoo_free_identities(YList * list)
+{
+ while (list) {
+ YList *n = list;
+ FREE(list->data);
+ list = y_list_remove_link(list, list);
+ y_list_free_1(n);
+ }
+}
+
+/* Free webcam data */
+static void yahoo_free_webcam(struct yahoo_webcam *wcm)
+{
+ if (wcm) {
+ FREE(wcm->user);
+ FREE(wcm->server);
+ FREE(wcm->key);
+ FREE(wcm->description);
+ FREE(wcm->my_ip);
+ }
+ FREE(wcm);
+}
+
+static void yahoo_free_data(struct yahoo_data *yd)
+{
+ FREE(yd->user);
+ FREE(yd->password);
+ FREE(yd->pw_token);
+ FREE(yd->cookie_y);
+ FREE(yd->cookie_t);
+ FREE(yd->cookie_c);
+ FREE(yd->cookie_b);
+ FREE(yd->login_cookie);
+ FREE(yd->login_id);
+ FREE(yd->rawstealthlist);
+ FREE(yd->ygrp);
+
+ yahoo_free_buddies(yd->buddies);
+ yahoo_free_buddies(yd->ignore);
+ yahoo_free_identities(yd->identities);
+
+ yahoo_free_server_settings(yd->server_settings);
+
+ FREE(yd);
+}
+
+#define YAHOO_PACKET_HDRLEN (4 + 2 + 2 + 2 + 2 + 4 + 4)
+
+static struct yahoo_packet *yahoo_packet_new(enum yahoo_service service,
+ enum ypacket_status status, int id)
+{
+ struct yahoo_packet *pkt = y_new0(struct yahoo_packet, 1);
+
+ pkt->service = service;
+ pkt->status = status;
+ pkt->id = id;
+
+ return pkt;
+}
+
+static void yahoo_packet_hash(struct yahoo_packet *pkt, int key, const char *value)
+{
+ struct yahoo_pair *pair = y_new0(struct yahoo_pair, 1);
+ pair->key = key;
+ pair->value = strdup(value);
+ pkt->hash = y_list_append(pkt->hash, pair);
+}
+
+static void yahoo_packet_hash_int(struct yahoo_packet *pkt, int key, int value)
+{
+ char c[128];
+
+ snprintf(c, 128, "%d", value);
+ yahoo_packet_hash(pkt, key, c);
+}
+
+
+
+static int yahoo_packet_length(struct yahoo_packet *pkt)
+{
+ YList *l;
+
+ int len = 0;
+
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ int tmp = pair->key;
+ do {
+ tmp /= 10;
+ len++;
+ } while (tmp);
+ len += 2;
+ len += strlen(pair->value);
+ len += 2;
+ }
+
+ return len;
+}
+
+#define yahoo_put16(buf, data) ( \
+ (*(buf) = (unsigned char)((data)>>8)&0xff), \
+ (*((buf)+1) = (unsigned char)(data)&0xff), \
+ 2)
+#define yahoo_get16(buf) ((((*(buf))&0xff)<<8) + ((*((buf)+1)) & 0xff))
+#define yahoo_put32(buf, data) ( \
+ (*((buf)) = (unsigned char)((data)>>24)&0xff), \
+ (*((buf)+1) = (unsigned char)((data)>>16)&0xff), \
+ (*((buf)+2) = (unsigned char)((data)>>8)&0xff), \
+ (*((buf)+3) = (unsigned char)(data)&0xff), \
+ 4)
+#define yahoo_get32(buf) ((((*(buf) )&0xff)<<24) + \
+ (((*((buf)+1))&0xff)<<16) + \
+ (((*((buf)+2))&0xff)<< 8) + \
+ (((*((buf)+3))&0xff)))
+
+static void yahoo_packet_read(struct yahoo_packet *pkt, unsigned char *data, int len)
+{
+ int pos = 0, zl;
+ char z[100];
+
+ snprintf(z, sizeof(z), "-=[ %s (0x%02x) ", dbg_service(pkt->service), pkt->service);
+
+ if (pkt->status != 0)
+ snprintf(z, sizeof(z), "%s, %s (%d)", z, dbg_status(pkt->status),pkt->status);
+
+ if (len != 0)
+ snprintf(z, sizeof(z), "%s Length: %d", z, len);
+
+ snprintf(z, sizeof(z), "%s ]=-", z);
+
+ zl = strlen(z);
+ DEBUG_MSG1((z));
+
+ while (pos + 1 < len) {
+ char *key, *value = NULL;
+ int accept;
+ int x;
+
+ struct yahoo_pair *pair = y_new0(struct yahoo_pair, 1);
+
+ key = (char *) malloc(len + 1);
+ x = 0;
+ while (pos + 1 < len) {
+ if (data[pos] == 0xc0 && data[pos + 1] == 0x80)
+ break;
+ key[x++] = data[pos++];
+ }
+ key[x] = 0;
+ pos += 2;
+ pair->key = strtol(key, NULL, 10);
+ free(key);
+
+ accept = x;
+
+ if (pos + 1 > len) {
+ /* Malformed packet! (Truncated--garbage or something) */
+ accept = 0;
+ }
+
+ /* if x is 0 there was no key, so don't accept it */
+ if (accept)
+ value = (char *) malloc(len - pos + 1);
+ x = 0;
+ while (pos + 1 < len) {
+ if (data[pos] == 0xc0 && data[pos + 1] == 0x80)
+ break;
+ if (accept)
+ value[x++] = data[pos++];
+ }
+ if (accept)
+ value[x] = 0;
+ pos += 2;
+ if (accept) {
+ pair->value = strdup(value);
+ FREE(value);
+ pkt->hash = y_list_append(pkt->hash, pair);
+
+ DEBUG_MSG1(("Key: (%5d) %-25s Value: '%s'", pair->key, dbg_key(pair->key), pair->value));
+ } else {
+ FREE(pair);
+ }
+ }
+
+ for (pos = 0; pos < zl; pos++) z[pos] = '-';
+ z[pos] = '\0';
+ DEBUG_MSG1((z));
+}
+
+static void yahoo_packet_write(struct yahoo_packet *pkt, unsigned char *data)
+{
+ YList *l;
+ int pos = 0;
+
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ unsigned char buf[100];
+
+ snprintf((char *)buf, sizeof(buf), "%d", pair->key);
+ strcpy((char *)data + pos, (char *)buf);
+ pos += strlen((char *)buf);
+ data[pos++] = 0xc0;
+ data[pos++] = 0x80;
+
+ strcpy((char *)data + pos, pair->value);
+ pos += strlen(pair->value);
+ data[pos++] = 0xc0;
+ data[pos++] = 0x80;
+ }
+}
+
+static void yahoo_dump_unhandled(struct yahoo_packet *pkt)
+{
+ YList *l;
+
+ NOTICE(("Service: %s (0x%02x)\tStatus: %s (%d)", dbg_service(pkt->service),pkt->service, dbg_status(pkt->status), pkt->status));
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+
+ NOTICE(("\t%d => %s", pair->key, pair->value));
+ }
+}
+
+
+static void yahoo_packet_dump(unsigned char *data, int len)
+{
+ if(yahoo_get_log_level() >= YAHOO_LOG_DEBUG) {
+ char z[4096], t[10];
+ int i;
+
+ z[0]='\0';
+
+ for (i = 0; i < len; i++) {
+ if ((i % 8 == 0) && i)
+ //YAHOO_CALLBACK(ext_yahoo_log)(" ");
+ lstrcatA(z, " ");
+ if ((i % 16 == 0) && i)
+ lstrcatA(z, "\n");
+
+ wsprintfA(t, "%02x ", data[i]);
+ lstrcatA(z, t);
+ }
+ lstrcatA(z, "\n");
+ YAHOO_CALLBACK(ext_yahoo_log)(z);
+
+ z[0]='\0';
+ for (i = 0; i < len; i++) {
+ if ((i % 8 == 0) && i)
+ //YAHOO_CALLBACK(ext_yahoo_log)(" ");
+ lstrcatA(z, " ");
+ if ((i % 16 == 0) && i)
+ //YAHOO_CALLBACK(ext_yahoo_log)("\n");
+ lstrcatA(z, "\n");
+ if (isprint(data[i])) {
+ //YAHOO_CALLBACK(ext_yahoo_log)(" %c ", data[i]);
+ wsprintfA(t, " %c ", data[i]);
+ lstrcatA(z, t);
+ } else
+ //YAHOO_CALLBACK(ext_yahoo_log)(" . ");
+ lstrcatA(z, " . ");
+ }
+ //YAHOO_CALLBACK(ext_yahoo_log)("\n");
+ lstrcatA(z, "\n");
+ YAHOO_CALLBACK(ext_yahoo_log)(z);
+ }
+}
+
+static const char base64digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789._";
+
+static void to_y64(unsigned char *out, const unsigned char *in, int inlen)
+/* raw bytes in quasi-big-endian order to base 64 string (NUL-terminated) */
+{
+ for (; inlen >= 3; inlen -= 3)
+ {
+ *out++ = base64digits[in[0] >> 2];
+ *out++ = base64digits[((in[0]<<4) & 0x30) | (in[1]>>4)];
+ *out++ = base64digits[((in[1]<<2) & 0x3c) | (in[2]>>6)];
+ *out++ = base64digits[in[2] & 0x3f];
+ in += 3;
+ }
+ if (inlen > 0)
+ {
+ unsigned char fragment;
+
+ *out++ = base64digits[in[0] >> 2];
+ fragment = (in[0] << 4) & 0x30;
+ if (inlen > 1)
+ fragment |= in[1] >> 4;
+ *out++ = base64digits[fragment];
+ *out++ = (inlen < 2) ? '-'
+ : base64digits[(in[1] << 2) & 0x3c];
+ *out++ = '-';
+ }
+ *out = '\0';
+}
+
+static void yahoo_add_to_send_queue(struct yahoo_input_data *yid, void *data, int length)
+{
+ struct data_queue *tx = y_new0(struct data_queue, 1);
+ tx->queue = y_new0(unsigned char, length);
+ tx->len = length;
+ memcpy(tx->queue, data, length);
+
+ yid->txqueues = y_list_append(yid->txqueues, tx);
+
+ if(!yid->write_tag)
+ yid->write_tag=YAHOO_CALLBACK(ext_yahoo_add_handler)(yid->yd->client_id, yid->fd, YAHOO_INPUT_WRITE, yid);
+}
+
+static void yahoo_send_packet(struct yahoo_input_data *yid, struct yahoo_packet *pkt, int extra_pad)
+{
+ int pktlen = yahoo_packet_length(pkt);
+ int len = YAHOO_PACKET_HDRLEN + pktlen;
+ unsigned char *data;
+ int pos = 0;
+
+ if (yid->fd < 0)
+ return;
+
+ data = y_new0(unsigned char, len + 1);
+
+ memcpy(data + pos, "YMSG", 4); pos += 4;
+ pos += yahoo_put16(data + pos, YAHOO_PROTO_VER); /* version [latest 12 0x000c] */
+ pos += yahoo_put16(data + pos, 0x0000); /* HIWORD pkt length??? */
+ pos += yahoo_put16(data + pos, pktlen + extra_pad); /* LOWORD pkt length? */
+ pos += yahoo_put16(data + pos, pkt->service); /* service */
+ pos += yahoo_put32(data + pos, pkt->status); /* status [4bytes] */
+ pos += yahoo_put32(data + pos, pkt->id); /* session [4bytes] */
+
+ yahoo_packet_write(pkt, data + pos);
+
+ //yahoo_packet_dump(data, len);
+ DEBUG_MSG1(("Sending Packet:"));
+
+ yahoo_packet_read(pkt, data + pos, len - pos);
+
+ if( yid->type == YAHOO_CONNECTION_FT ||
+ ( yid->type == YAHOO_CONNECTION_PAGER &&
+ ( pkt->service == YAHOO_SERVICE_KEEPALIVE ||
+ pkt->service == YAHOO_SERVICE_PING ||
+ pkt->service == YAHOO_SERVICE_LOGOFF) )
+ ) {
+ yahoo_send_data(yid->fd, (const char *)data, len);
+ } else {
+ yahoo_add_to_send_queue(yid, data, len);
+ }
+
+ FREE(data);
+}
+
+static void yahoo_packet_free(struct yahoo_packet *pkt)
+{
+ while (pkt->hash) {
+ struct yahoo_pair *pair = (struct yahoo_pair *)pkt->hash->data;
+ YList *tmp;
+ FREE(pair->value);
+ FREE(pair);
+ tmp = pkt->hash;
+ pkt->hash = y_list_remove_link(pkt->hash, pkt->hash);
+ y_list_free_1(tmp);
+ }
+ FREE(pkt);
+}
+
+static int yahoo_send_data(int fd, const char *data, int len)
+{
+ int ret;
+ int e;
+
+ if (fd < 0)
+ return -1;
+
+ //yahoo_packet_dump(data, len);
+
+ do {
+ ret = write(fd, data, len);
+ } while(ret == -1 && errno==EINTR);
+ e=errno;
+
+ if (ret == -1) {
+ LOG(("wrote data: ERR %s", strerror(errno)));
+ } /*else {
+ LOG(("wrote data: OK"));
+ }*/
+
+ errno=e;
+ return ret;
+}
+
+void yahoo_close(int id)
+{
+ struct yahoo_data *yd = find_conn_by_id(id);
+ if(!yd)
+ return;
+
+ del_from_list(yd);
+
+ yahoo_free_data(yd);
+ if(id == last_id)
+ last_id--;
+}
+
+static void yahoo_input_close(struct yahoo_input_data *yid)
+{
+ inputs = y_list_remove(inputs, yid);
+
+ LOG(("yahoo_input_close(read)"));
+ YAHOO_CALLBACK(ext_yahoo_remove_handler)(yid->yd->client_id, yid->read_tag);
+ LOG(("yahoo_input_close(write)"));
+ YAHOO_CALLBACK(ext_yahoo_remove_handler)(yid->yd->client_id, yid->write_tag);
+ yid->read_tag = yid->write_tag = 0;
+ if(yid->fd)
+ close(yid->fd);
+ yid->fd = 0;
+ FREE(yid->rxqueue);
+ if(count_inputs_with_id(yid->yd->client_id) == 0) {
+ LOG(("closing %d", yid->yd->client_id));
+ yahoo_close(yid->yd->client_id);
+ }
+ yahoo_free_webcam(yid->wcm);
+ if(yid->wcd)
+ FREE(yid->wcd);
+ if(yid->ys) {
+ FREE(yid->ys->lsearch_text);
+ FREE(yid->ys);
+ }
+ FREE(yid);
+}
+
+static int is_same_bud(const void * a, const void * b)
+{
+ const struct yahoo_buddy *subject = (struct yahoo_buddy *) a;
+ const struct yahoo_buddy *object = (struct yahoo_buddy *) b;
+
+ return strcmp(subject->id, object->id) && ( subject->protocol == object->protocol );
+}
+
+char * getcookie(char *rawcookie)
+{
+ char * cookie=NULL;
+ char * tmpcookie;
+ char * cookieend;
+
+ if (strlen(rawcookie) < 2)
+ return NULL;
+
+ tmpcookie = strdup(rawcookie+2);
+ cookieend = strchr(tmpcookie, ';');
+
+ if(cookieend)
+ *cookieend = '\0';
+
+ cookie = strdup(tmpcookie);
+ FREE(tmpcookie);
+ /* cookieend=NULL; not sure why this was there since the value is not preserved in the stack -dd */
+
+ return cookie;
+}
+
+static char * getlcookie(char *cookie)
+{
+ char *tmp;
+ char *tmpend;
+ char *login_cookie = NULL;
+
+ tmpend = strstr(cookie, "n=");
+ if(tmpend) {
+ tmp = strdup(tmpend+2);
+ tmpend = strchr(tmp, '&');
+ if(tmpend)
+ *tmpend='\0';
+ login_cookie = strdup(tmp);
+ FREE(tmp);
+ }
+
+ return login_cookie;
+}
+
+static void yahoo_process_notify(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ char *msg = NULL;
+ char *from = NULL;
+ char *to = NULL;
+ int stat = 0;
+ int accept = 0;
+ int protocol = 0;
+ char *ind = NULL;
+ YList *l;
+
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ if (pair->key == 4)
+ from = pair->value;
+ if (pair->key == 5)
+ to = pair->value;
+ if (pair->key == 49)
+ msg = pair->value;
+ if (pair->key == 13)
+ stat = atoi(pair->value);
+ if (pair->key == 14)
+ ind = pair->value;
+ if (pair->key == 16) { /* status == -1 */
+ NOTICE((pair->value));
+ return;
+ }
+ if (pair->key == 241)
+ protocol = atoi(pair->value);
+ }
+
+ if (!msg)
+ return;
+
+ if (!strncasecmp(msg, "TYPING", strlen("TYPING")))
+ YAHOO_CALLBACK(ext_yahoo_typing_notify)(yd->client_id, to, from, protocol, stat);
+ else if (!strncasecmp(msg, "GAME", strlen("GAME")))
+ YAHOO_CALLBACK(ext_yahoo_game_notify)(yd->client_id, to, from, stat, ind);
+ else if (!strncasecmp(msg, "WEBCAMINVITE", strlen("WEBCAMINVITE")))
+ {
+ if (!strcmp(ind, " ")) {
+ YAHOO_CALLBACK(ext_yahoo_webcam_invite)(yd->client_id, to, from);
+ } else {
+ accept = atoi(ind);
+ /* accept the invitation (-1 = deny 1 = accept) */
+ if (accept < 0)
+ accept = 0;
+ YAHOO_CALLBACK(ext_yahoo_webcam_invite_reply)(yd->client_id, to, from, accept);
+ }
+ }
+ else
+ LOG(("Got unknown notification: %s", msg));
+}
+
+static void yahoo_process_filetransfer(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ char *from=NULL;
+ char *to=NULL;
+ char *msg=NULL;
+ char *url=NULL;
+ long expires=0;
+
+ char *service=NULL;
+ char *ft_token=NULL;
+ char *filename=NULL;
+ unsigned long filesize=0L;
+
+ YList *l;
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ if (pair->key == 4)
+ from = pair->value;
+ if (pair->key == 5)
+ to = pair->value;
+ if (pair->key == 14)
+ msg = pair->value;
+ if (pair->key == 20)
+ url = pair->value;
+ if (pair->key == 38)
+ expires = atol(pair->value);
+
+ if (pair->key == 27)
+ filename = pair->value;
+
+ if (pair->key == 28)
+ filesize = atol(pair->value);
+
+ if (pair->key == 49)
+ service = pair->value;
+
+ if (pair->key == 53)
+ ft_token = pair->value;
+ }
+
+ if(pkt->service == YAHOO_SERVICE_P2PFILEXFER) {
+ if(strcmp("FILEXFER", service) != 0) {
+ WARNING(("unhandled service 0x%02x", pkt->service));
+ yahoo_dump_unhandled(pkt);
+ return;
+ }
+ }
+
+ if(msg) {
+ char *tmp;
+ tmp = strchr(msg, '\006');
+ if(tmp)
+ *tmp = '\0';
+ }
+ if(url && from)
+ YAHOO_CALLBACK(ext_yahoo_got_file)(yd->client_id, to, from, url, expires, msg, filename, filesize, ft_token, 0);
+ else if (strcmp(from, "FILE_TRANSFER_SYSTEM") == 0 && msg != NULL)
+ YAHOO_CALLBACK(ext_yahoo_system_message)(yd->client_id, to, from, msg);
+}
+
+static void yahoo_process_filetransfer7(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ char *from=NULL;
+ char *to=NULL;
+
+ int service=0;
+ char *ft_token=NULL;
+ char *filename=NULL;
+ unsigned long filesize=0L;
+
+ struct yahoo_file_info *fi;
+ YList *l, *files=NULL;
+
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ switch (pair->key) {
+ case 4: /* from */
+ from = pair->value;
+ break;
+
+ case 5: /* to */
+ to = pair->value;
+ break;
+
+ case 222: /* Services:
+ 1 - dl
+ 2 - cancel
+ 3 - send
+ */
+ service = atol(pair->value);
+ break;
+
+ case 265: /* this is the FT token for this batch/session */
+ ft_token = pair->value;
+ break;
+
+
+ case 27: /* filename */
+ filename = pair->value;
+ break;
+
+ case 28: /* file size */
+ filesize = atol(pair->value);
+ break;
+
+ case 301: /* file terminator token usually set to 268 */
+ fi = y_new0(struct yahoo_file_info, 1);
+ fi->filename = strdup(filename);
+ fi->filesize = filesize;
+
+ files = y_list_append(files, fi);
+ break;
+ }
+ }
+
+ switch (service) {
+ case 1: // FT7
+ YAHOO_CALLBACK(ext_yahoo_got_files)(yd->client_id, to, from, ft_token, service, files);
+ break;
+ case 2: // FT7 Cancelled
+ break;
+ case 3: // FT7 Send Files
+ YAHOO_CALLBACK(ext_yahoo_send_file7info)(yd->client_id, to, from, ft_token);
+ break;
+ case 4: // FT7 Declined
+
+ break;
+ }
+}
+
+char *yahoo_decode(const char *t)
+{
+ /*
+ * Need to process URL ??? we get sent \002 style thingies.. which need to be decoded
+ * and then urlencoded?
+ *
+ * Thanks GAIM for the code...
+ */
+ char y[1024];
+ char *n;
+ const char *end, *p;
+ int i, k;
+
+ n = y;
+ end = t + lstrlenA(t);
+
+ for (p = t; p < end; p++, n++) {
+ if (*p == '\\') {
+ if (p[1] >= '0' && p[1] <= '7') {
+ p += 1;
+ for (i = 0, k = 0; k < 3; k += 1) {
+ char c = p[k];
+ if (c < '0' || c > '7') break;
+ i *= 8;
+ i += c - '0';
+ }
+ *n = i;
+ p += k - 1;
+ } else { /* bug 959248 */
+ /* If we see a \ not followed by an octal number,
+ * it means that it is actually a \\ with one \
+ * already eaten by some unknown function.
+ * This is arguably broken.
+ *
+ * I think wing is wrong here, there is no function
+ * called that I see that could have done it. I guess
+ * it is just really sending single \'s. That's yahoo
+ * for you.
+ */
+ *n = *p;
+ }
+ }
+ else
+ *n = *p;
+ }
+
+ *n = '\0';
+
+ return yahoo_urlencode(y);
+}
+
+static void yahoo_process_filetransfer7info(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ char *from=NULL;
+ char *to=NULL;
+ int service=0;
+ char *ft_token=NULL;
+ char *filename=NULL;
+ char *host = NULL;
+ char *token = NULL;
+ unsigned long filesize=0L;
+
+ /**
+ TODO: Need to process FileTransfer7Info Disconnected Status.
+
+ It doesn't send service but sends Status (66) = -1
+ [10:56:02 YAHOO] Key: ( 1) ID Value: 'xxx'
+ [10:56:02 YAHOO] Key: ( 4) ID/Nick Value: 'xxx'
+ [10:56:02 YAHOO] Key: ( 5) To Value: 'xxxxxxx'
+ [10:56:02 YAHOO] Key: ( 66) login status Value: '-1'
+ [10:56:02 YAHOO] Key: ( 251) (null) Value: 'likQolabUXpDajoIdTZKPw--AsM.A7RnMpJwfZjQmIm.SZea2CCIGPAjF0DTHjizENuccwdZueaEuA13irqIIdAJcPOT24yWnwwvIHYqcMg4foLt0LA-'
+ [10:56:02 YAHOO] Key: ( 265) FT7 Token Value: '$t$1vTZy4AzepDkGzJoMBg$$'
+
+ */
+
+ YList *l;
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ switch (pair->key) {
+ case 4:
+ from = pair->value;
+ break;
+ case 5:
+ to = pair->value;
+ break;
+ case 27:
+ filename = pair->value;
+ break;
+
+ case 28:
+ filesize = atol(pair->value);
+ break;
+
+ case 249:
+ service = atol(pair->value);
+ break;
+ case 250:
+ host = pair->value;
+ break;
+ case 251:
+ token = pair->value;
+ break;
+ case 265:
+ ft_token = pair->value;
+ break;
+ }
+ }
+
+ switch (service) {
+ case 1: // P2P
+ //YAHOO_CALLBACK(ext_yahoo_got_file)(yd->client_id, to, from, url, expires, msg, filename, filesize, ft_token, 1);
+ {
+ /*
+ * From Kopete: deny P2P
+ */
+ struct yahoo_packet *pkt1 = NULL;
+
+ LOG(("[yahoo_process_filetransfer7info] Got File info, Denying P2P."));
+
+ pkt1 = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFERACCEPT, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt1, 1, yd->user);
+ yahoo_packet_hash(pkt1, 5, from);
+ yahoo_packet_hash(pkt1,265, ft_token);
+ yahoo_packet_hash(pkt1,66, "-3");
+
+ yahoo_send_packet(yid, pkt1, 0);
+ yahoo_packet_free(pkt1);
+
+ }
+ break;
+ case 3: // Relay
+ {
+ char url[1024];
+ char *t;
+
+ /*
+ * From Kopete: accept the info?
+ */
+ struct yahoo_packet *pkt1 = NULL;
+
+ LOG(("[yahoo_process_filetransfer7info] Got File info, Relaying FT."));
+
+ pkt1 = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFERACCEPT, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt1, 1, yd->user);
+ yahoo_packet_hash(pkt1, 5, from);
+ yahoo_packet_hash(pkt1,265, ft_token);
+ yahoo_packet_hash(pkt1,27, filename);
+ yahoo_packet_hash(pkt1,249, "3"); // use reflection server
+ yahoo_packet_hash(pkt1,251, token);
+
+ yahoo_send_packet(yid, pkt1, 0);
+ yahoo_packet_free(pkt1);
+
+ t = yahoo_decode(token);
+ sprintf(url,"http://%s/relay?token=%s&sender=%s&recver=%s", host, t, from, to);
+
+ YAHOO_CALLBACK(ext_yahoo_got_file7info)(yd->client_id, to, from, url, filename, ft_token);
+
+ FREE(t);
+ }
+ break;
+ }
+}
+static void yahoo_process_filetransfer7accept(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ char *from=NULL;
+ char *to=NULL;
+ int service=0;
+ char *ft_token=NULL;
+ char *filename=NULL;
+ char *token=NULL;
+
+ /**
+ TODO: Need to process FileTransfer7Info Disconnected Status.
+
+ It doesn't send service but sends Status (66) = -1
+ [10:56:02 YAHOO] Key: ( 1) ID Value: 'xxx'
+ [10:56:02 YAHOO] Key: ( 4) ID/Nick Value: 'xxx'
+ [10:56:02 YAHOO] Key: ( 5) To Value: 'xxxxxxx'
+ [10:56:02 YAHOO] Key: ( 66) login status Value: '-1'
+ [10:56:02 YAHOO] Key: ( 251) (null) Value: 'likQolabUXpDajoIdTZKPw--AsM.A7RnMpJwfZjQmIm.SZea2CCIGPAjF0DTHjizENuccwdZueaEuA13irqIIdAJcPOT24yWnwwvIHYqcMg4foLt0LA-'
+ [10:56:02 YAHOO] Key: ( 265) FT7 Token Value: '$t$1vTZy4AzepDkGzJoMBg$$'
+
+ */
+
+ YList *l;
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+
+ switch (pair->key) {
+ case 4:
+ from = pair->value;
+ break;
+ case 5:
+ to = pair->value;
+ break;
+ case 27:
+ filename = pair->value;
+ break;
+
+ case 249:
+ service = atol(pair->value);
+ break;
+
+ case 251:
+ token = pair->value;
+ break;
+
+ case 265:
+ ft_token = pair->value;
+ break;
+
+ case 66: // login status = -1 Disconnected/Failed Transfer.
+ break;
+
+ case 271: // 271 = 1 "Next File"
+ YAHOO_CALLBACK(ext_yahoo_send_file7info)(yd->client_id, to, from, ft_token);
+ break;
+ }
+ }
+
+ switch (service) {
+ case 1: // P2P
+
+ break;
+
+ case 3: // Relay
+ YAHOO_CALLBACK(ext_yahoo_ft7_send_file)(yd->client_id, to, from, filename, token, ft_token);
+ break;
+ }
+}
+
+
+static void yahoo_process_conference(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ char *msg = NULL;
+ char *host = NULL;
+ char *who = NULL;
+ char *room = NULL;
+ char *id = NULL;
+ int utf8 = 0;
+ YList *members = NULL;
+ YList *l;
+
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+
+ if (pair->key == 50)
+ host = pair->value;
+
+ if (pair->key == 52) { /* invite */
+ members = y_list_append(members, strdup(pair->value));
+ }
+ if (pair->key == 53) /* logon */
+ who = pair->value;
+ if (pair->key == 54) /* decline */
+ who = pair->value;
+ if (pair->key == 55) /* unavailable (status == 2) */
+ who = pair->value;
+ if (pair->key == 56) /* logoff */
+ who = pair->value;
+
+ if (pair->key == 57)
+ room = pair->value;
+
+ if (pair->key == 58) /* join message */
+ msg = pair->value;
+ if (pair->key == 14) /* decline/conf message */
+ msg = pair->value;
+
+ if (pair->key == 13)
+ ;
+ if (pair->key == 16) /* error */
+ msg = pair->value;
+
+ if (pair->key == 1) /* my id */
+ id = pair->value;
+ if (pair->key == 3) /* message sender */
+ who = pair->value;
+
+ if (pair->key == 97)
+ utf8 = atoi(pair->value);
+ }
+
+ if(!room)
+ return;
+
+ if(host) {
+ for(l = members; l; l = l->next) {
+ char * w = (char *) l->data;
+ if(!strcmp(w, host))
+ break;
+ }
+ if(!l)
+ members = y_list_append(members, strdup(host));
+ }
+ /* invite, decline, join, left, message -> status == 1 */
+
+ switch(pkt->service) {
+ case YAHOO_SERVICE_CONFINVITE:
+ if(pkt->status == 2)
+ ;
+ else if(members)
+ YAHOO_CALLBACK(ext_yahoo_got_conf_invite)(yd->client_id, id, host, room, msg, members);
+ else if(msg)
+ YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, msg, 0, E_CONFNOTAVAIL);
+ break;
+ case YAHOO_SERVICE_CONFADDINVITE:
+ if(pkt->status == 2)
+ ;
+ else
+ YAHOO_CALLBACK(ext_yahoo_got_conf_invite)(yd->client_id, id, host, room, msg, members);
+ break;
+ case YAHOO_SERVICE_CONFDECLINE:
+ if(who)
+ YAHOO_CALLBACK(ext_yahoo_conf_userdecline)(yd->client_id, id, who, room, msg);
+ break;
+ case YAHOO_SERVICE_CONFLOGON:
+ if(who)
+ YAHOO_CALLBACK(ext_yahoo_conf_userjoin)(yd->client_id, id, who, room);
+ break;
+ case YAHOO_SERVICE_CONFLOGOFF:
+ if(who)
+ YAHOO_CALLBACK(ext_yahoo_conf_userleave)(yd->client_id, id, who, room);
+ break;
+ case YAHOO_SERVICE_CONFMSG:
+ if(who)
+ YAHOO_CALLBACK(ext_yahoo_conf_message)(yd->client_id, id, who, room, msg, utf8);
+ break;
+ }
+}
+
+static void yahoo_process_chat(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ char *msg = NULL;
+ char *id = NULL;
+ char *who = NULL;
+ char *room = NULL;
+ char *topic = NULL;
+ YList *members = NULL;
+ struct yahoo_chat_member *currentmember = NULL;
+ int msgtype = 1;
+ int utf8 = 0;
+ int firstjoin = 0;
+ int membercount = 0;
+ int chaterr=0;
+ YList *l;
+
+ yahoo_dump_unhandled(pkt);
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+
+ if (pair->key == 1) {
+ /* My identity */
+ id = pair->value;
+ }
+
+ if (pair->key == 104) {
+ /* Room name */
+ room = pair->value;
+ }
+
+ if (pair->key == 105) {
+ /* Room topic */
+ topic = pair->value;
+ }
+
+ if (pair->key == 108) {
+ /* Number of members in this packet */
+ membercount = atoi(pair->value);
+ }
+
+ if (pair->key == 109) {
+ /* message sender */
+ who = pair->value;
+
+ if (pkt->service == YAHOO_SERVICE_CHATJOIN) {
+ currentmember = y_new0(struct yahoo_chat_member, 1);
+ currentmember->id = strdup(pair->value);
+ members = y_list_append(members, currentmember);
+ }
+ }
+
+ if (pair->key == 110) {
+ /* age */
+ if (pkt->service == YAHOO_SERVICE_CHATJOIN)
+ currentmember->age = atoi(pair->value);
+ }
+
+ if (pair->key == 113) {
+ /* attribs */
+ if (pkt->service == YAHOO_SERVICE_CHATJOIN)
+ currentmember->attribs = atoi(pair->value);
+ }
+
+ if (pair->key == 141) {
+ /* alias */
+ if (pkt->service == YAHOO_SERVICE_CHATJOIN)
+ currentmember->alias = strdup(pair->value);
+ }
+
+ if (pair->key == 142) {
+ /* location */
+ if (pkt->service == YAHOO_SERVICE_CHATJOIN)
+ currentmember->location = strdup(pair->value);
+ }
+
+
+ if (pair->key == 130) {
+ /* first join */
+ firstjoin = 1;
+ }
+
+ if (pair->key == 117) {
+ /* message */
+ msg = pair->value;
+ }
+
+ if (pair->key == 124) {
+ /* Message type */
+ msgtype = atoi(pair->value);
+ }
+ if (pair->key == 114) {
+ /* message error not sure what all the pair values mean */
+ /* but -1 means no session in room */
+ chaterr= atoi(pair->value);
+ }
+ }
+
+ if(!room) {
+ if (pkt->service == YAHOO_SERVICE_CHATLOGOUT) { /* yahoo originated chat logout */
+ YAHOO_CALLBACK(ext_yahoo_chat_yahoologout)(yid->yd->client_id, id);
+ return ;
+ }
+ if (pkt->service == YAHOO_SERVICE_COMMENT && chaterr) {
+ YAHOO_CALLBACK(ext_yahoo_chat_yahooerror)(yid->yd->client_id, id);
+ return;
+ }
+
+ WARNING(("We didn't get a room name, ignoring packet"));
+ return;
+ }
+
+ switch(pkt->service) {
+ case YAHOO_SERVICE_CHATJOIN:
+ if(y_list_length(members) != membercount) {
+ WARNING(("Count of members doesn't match No. of members we got"));
+ }
+ if(firstjoin && members) {
+ YAHOO_CALLBACK(ext_yahoo_chat_join)(yid->yd->client_id, id, room, topic, members, yid->fd);
+ } else if(who) {
+ if(y_list_length(members) != 1) {
+ WARNING(("Got more than 1 member on a normal join"));
+ }
+ /* this should only ever have one, but just in case */
+ while(members) {
+ YList *n = members->next;
+ currentmember = (struct yahoo_chat_member *) members->data;
+ YAHOO_CALLBACK(ext_yahoo_chat_userjoin)(yid->yd->client_id, id, room, currentmember);
+ y_list_free_1(members);
+ members=n;
+ }
+ }
+ break;
+ case YAHOO_SERVICE_CHATEXIT:
+ if(who) {
+ YAHOO_CALLBACK(ext_yahoo_chat_userleave)(yid->yd->client_id, id, room, who);
+ }
+ break;
+ case YAHOO_SERVICE_COMMENT:
+ if(who) {
+ YAHOO_CALLBACK(ext_yahoo_chat_message)(yid->yd->client_id, id, who, room, msg, msgtype, utf8);
+ }
+ break;
+ }
+}
+
+static void yahoo_process_message(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ YList *l;
+ YList * messages = NULL;
+
+ struct m {
+ int i_31;
+ int i_32;
+ char *to;
+ char *from;
+ long tm;
+ char *msg;
+ int utf8;
+ int buddy_icon;
+ int protocol;
+ char *seqn;
+ int sendn;
+ } *message = y_new0(struct m, 1);
+
+ message->buddy_icon = -1; // no info
+ message->utf8 = 1 ; // default value for utf-8. (Seems a ton of clients/pingbox/etc.. don't send this)
+
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+
+ /* so it seems that key == 1 is not used when receiving messages and causes
+ problems for mobile IMs? This has been reported in the forum and this patch
+ was provided by Bryan Aldrich */
+ switch (pair->key) {
+ /*case 1: */
+ case 4:
+ if(!message->from)
+ message->from = pair->value;
+
+ break;
+
+ case 5:
+ message->to = pair->value;
+ break;
+
+ case 15:
+ message->tm = strtol(pair->value, NULL, 10);
+ break;
+
+ case 206:
+ message->buddy_icon = atoi(pair->value);
+ break;
+
+ case 97:
+ message->utf8 = atoi(pair->value);
+ break;
+
+ /* user message */ /* sys message */
+ case 14:
+ case 16:
+ message->msg = pair->value;
+ break;
+
+ case 31:
+ if(message->i_31) {
+ messages = y_list_append(messages, message);
+ message = y_new0(struct m, 1);
+ }
+ message->i_31 = atoi(pair->value);
+ break;
+
+ case 32:
+ message->i_32 = atoi(pair->value);
+ break;
+
+ case 241:
+ message->protocol = strtol(pair->value, NULL, 10);
+ break;
+
+ case 429: /* message sequence # */
+ message->seqn = pair->value;
+ break;
+
+ case 450: /* attempt # */
+ message->sendn = atoi(pair->value);
+ break;
+
+
+ /*default:
+ LOG(("yahoo_process_message: status: %d, key: %d, value: %s",
+ pkt->status, pair->key, pair->value));
+ */
+ }
+ }
+
+ messages = y_list_append(messages, message);
+
+ for (l = messages; l; l=l->next) {
+ message = (struct m*) l->data;
+ if (pkt->service == YAHOO_SERVICE_SYSMESSAGE) {
+ YAHOO_CALLBACK(ext_yahoo_system_message)(yd->client_id, message->to,
+ message->from, message->msg);
+ } else if (pkt->status <= 2 || pkt->status == 5) {
+ YAHOO_CALLBACK(ext_yahoo_got_im)(yd->client_id, message->to, message->from,
+ message->protocol, message->msg, message->tm,
+ pkt->status, message->utf8, message->buddy_icon,
+ message->seqn, message->sendn);
+ } else if (pkt->status == YPACKET_STATUS_DISCONNECTED) {
+ YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, message->msg, 0, E_SYSTEM);
+ }
+ free(message);
+ }
+
+ y_list_free(messages);
+}
+
+static void yahoo_process_logon(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ YList *l;
+ struct yahoo_data *yd = yid->yd;
+ char *name = NULL;
+ int state = 0, away = 0, idle = 0, mobile = 0, cksum = 0, buddy_icon = -1, protocol = 0,
+ client_version = 0, utf8 = 1;
+ char *msg = NULL;
+
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+
+ switch (pair->key) {
+ case 0: /* we won't actually do anything with this */
+ //NOTICE(("key %d:%s", pair->key, pair->value));
+ break;
+ case 1: /* we don't get the full buddy list here. */
+ if (!yd->logged_in) {
+ yd->logged_in = TRUE;
+
+ if(yd->current_status == YAHOO_STATUS_OFFLINE)
+ yd->current_status = yd->initial_status;
+
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_OK, NULL);
+ }
+ break;
+ case 7: /* the current buddy */
+ if (name != NULL) {
+ YAHOO_CALLBACK(ext_yahoo_status_logon)(yd->client_id, name, protocol, state, msg, away, idle, mobile, cksum, buddy_icon, client_version, utf8);
+ msg = NULL;
+ utf8 = 1;
+ protocol = client_version = cksum = state = away = idle = mobile = 0;
+ buddy_icon = -1;
+ }
+ name = pair->value;
+ break;
+ case 8: /* how many online buddies we have */
+ //NOTICE(("key %d:%s", pair->key, pair->value));
+ break;
+ case 10: /* state */
+ state = strtol(pair->value, NULL, 10);
+ break;
+ case 11: /* this is the buddy's session id */
+ //NOTICE(("key %d:%s", pair->key, pair->value));
+ break;
+ case 13: /* bitmask, bit 0 = pager, bit 1 = chat, bit 2 = game */
+ if (strtol(pair->value, NULL, 10) == 0) {
+ //YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, name, 0, YAHOO_STATUS_OFFLINE, NULL, 1, 0, 0);
+ //name = NULL;
+ state = YAHOO_STATUS_OFFLINE;
+ //break;
+ }
+ break;
+ case 16: /* Custom error message */
+ YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, pair->value, 0, E_CUSTOM);
+ break;
+ case 17: /* in chat? */
+ break;
+ case 19: /* custom status message */
+ msg = pair->value;
+ break;
+ case 24: /* session timestamp */
+ yd->session_timestamp = atol(pair->value);
+ break;
+ case 47: /* is it an away message or not */
+ away = atoi(pair->value);
+ break;
+ case 60: /* SMS -> 1 MOBILE USER */
+ /* sometimes going offline makes this 2, but invisible never sends it */
+ //NOTICE(("key %d:%s", pair->key, pair->value));
+ if (atoi(pair->value) > 0 )
+ mobile = 1;
+ break;
+
+ case 97: /* utf8 */
+ utf8 = atoi(pair->value);
+ break;
+
+ case 137: /* Idle: seconds */
+ idle = atoi(pair->value);
+ break;
+ case 138: /* Idle: Flag
+ * 0: Use the 137 key to see how long
+ * 1: not-idle
+ */
+
+ idle = 0;
+ break;
+
+ case 192: /* Pictures aka BuddyIcon checksum*/
+ cksum = strtol(pair->value, NULL, 10);
+ break;
+
+ case 197: /* avatar base64 encodded [Ignored by Gaim?] */
+ /*avatar = pair->value;*/
+ break;
+
+ case 213: /* Pictures aka BuddyIcon type 0-none, 1-avatar, 2-picture*/
+ buddy_icon = strtol(pair->value, NULL, 10);
+ break;
+
+ case 244: /* client version number. Yahoo Client Detection */
+ client_version = strtol(pair->value, NULL, 10);
+ break;
+
+ case 241: /* protocol */
+ protocol = strtol(pair->value, NULL, 10);
+ break;
+
+ default:
+ //WARNING(("unknown status key %d:%s", pair->key, pair->value));
+ break;
+ }
+ }
+
+ if (name != NULL)
+ YAHOO_CALLBACK(ext_yahoo_status_logon)(yd->client_id, name, protocol, state, msg, away, idle, mobile, cksum, buddy_icon, client_version, utf8);
+
+}
+
+static void yahoo_process_status(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ YList *l;
+ struct yahoo_data *yd = yid->yd;
+ char *name = NULL;
+ int state = YAHOO_STATUS_AVAILABLE;
+ int away = 0, idle = 0, mobile = 0, protocol = 0, utf8 = 1;
+ int login_status=YAHOO_LOGIN_LOGOFF;
+ char *msg = NULL;
+ char *errmsg = NULL;
+
+ /*if (pkt->service == YAHOO_SERVICE_LOGOFF && pkt->status == YAHOO_STATUS_DISCONNECTED) {
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_DUPL, NULL);
+ return;
+ }*/
+
+ if (pkt->service == YAHOO_SERVICE_LOGOFF)
+ state = YAHOO_STATUS_OFFLINE;
+
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+
+ switch (pair->key) {
+ case 0: /* we won't actually do anything with this */
+ NOTICE(("key %d:%s", pair->key, pair->value));
+ break;
+ case 1: /* we don't get the full buddy list here. */
+ if (!yd->logged_in) {
+ yd->logged_in = TRUE;
+ if(yd->current_status == YAHOO_STATUS_OFFLINE)
+ yd->current_status = yd->initial_status;
+
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_OK, NULL);
+ }
+ break;
+ case 8: /* how many online buddies we have */
+ NOTICE(("key %d:%s", pair->key, pair->value));
+ break;
+ case 7: /* the current buddy */
+ if (name != NULL) {
+ YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, name, protocol, state, msg, away, idle, mobile, utf8);
+ msg = NULL;
+ utf8 = 1;
+ protocol = away = idle = mobile = 0;
+ state = (pkt->service == YAHOO_SERVICE_LOGOFF) ? YAHOO_STATUS_OFFLINE : YAHOO_STATUS_AVAILABLE;
+ }
+ name = pair->value;
+
+ /*if (pkt->service == YAHOO_SERVICE_LOGOFF) {
+ YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, name, protocol, YAHOO_STATUS_OFFLINE, NULL, 0, 0, 0);
+ name = NULL;
+ }*/
+ break;
+ case 10: /* state */
+ state = strtol(pair->value, NULL, 10);
+ break;
+ case 19: /* custom status message */
+ msg = pair->value;
+ break;
+ case 47: /* is it an away message or not */
+ away = atoi(pair->value);
+ break;
+ case 137: /* seconds idle */
+ idle = atoi(pair->value);
+ break;
+ case 138: /* either we're not idle, or we are but won't say how long */
+ /* thanx Gaim.. I am seeing 138 -> 1. so don't do idle at all for miranda
+ since we don't have idle w/o time :( */
+ idle = 0;
+ break;
+ case 11: /* this is the buddy's session id */
+ NOTICE(("key %d:%s", pair->key, pair->value));
+ break;
+ case 17: /* in chat? */
+ break;
+ case 13: /* bitmask, bit 0 = pager, bit 1 = chat, bit 2 = game */
+ /*if (pkt->service == YAHOO_SERVICE_LOGOFF || strtol(pair->value, NULL, 10) == 0) {
+ YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, name, protocol, YAHOO_STATUS_OFFLINE, NULL, 0, 0, 0);
+ name = NULL;
+ break;
+ }*/
+ if (strtol(pair->value, NULL, 10) == 0)
+ state = YAHOO_STATUS_OFFLINE;
+ break;
+ case 60: /* SMS -> 1 MOBILE USER */
+ /* sometimes going offline makes this 2, but invisible never sends it */
+ NOTICE(("key %d:%s", pair->key, pair->value));
+ if (atoi(pair->value) > 0 )
+ mobile = 1;
+ break;
+ case 16: /* Custom error message */
+ errmsg = pair->value;
+ break;
+ case 241: /* protocol */
+ protocol = strtol(pair->value, NULL, 10);
+ break;
+ case 66: /* login status */
+ {
+ int i = atoi(pair->value);
+
+ switch(i) {
+ case 42: /* duplicate login */
+ login_status = YAHOO_LOGIN_DUPL;
+ break;
+ case 28: /* session expired */
+
+ break;
+ }
+ }
+ break;
+ case 97: /* utf-8 ? */
+ utf8 = strtol(pair->value, NULL, 10);
+ break;
+
+ default:
+ //WARNING(("unknown status key %d:%s", pair->key, pair->value));
+ break;
+ }
+ }
+
+ if (name != NULL)
+ YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, name, protocol, state, msg, away, idle, mobile, utf8);
+ else if (pkt->service == YAHOO_SERVICE_LOGOFF && pkt->status == YPACKET_STATUS_DISCONNECTED)
+ //
+ //Key: Error msg (16) Value: 'Session expired. Please relogin'
+ //Key: login status (66) Value: '28'
+ //
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, login_status, NULL);
+ else if (errmsg != NULL)
+ YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, errmsg, 0, E_CUSTOM);
+ else if (pkt->service == YAHOO_SERVICE_LOGOFF && pkt->status == YAHOO_STATUS_AVAILABLE && pkt->hash == NULL)
+ // Server Acking our Logoff (close connection)
+ yahoo_input_close(yid);
+}
+
+static void yahoo_process_list(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ YList *l;
+ char *fname = NULL, *lname = NULL, *nick = NULL;
+
+ /* we could be getting multiple packets here */
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+
+ switch(pair->key) {
+
+ case 89: /* identities */
+ {
+ char **identities = y_strsplit(pair->value, ",", -1);
+ int i;
+ for(i=0; identities[i]; i++)
+ yd->identities = y_list_append(yd->identities,
+ strdup(identities[i]));
+ y_strfreev(identities);
+ }
+
+ break;
+ case 59: /* cookies */
+ if(pair->value[0]=='Y') {
+ FREE(yd->cookie_y);
+ FREE(yd->login_cookie);
+
+ yd->cookie_y = getcookie(pair->value);
+ yd->login_cookie = getlcookie(yd->cookie_y);
+
+ } else if(pair->value[0]=='T') {
+ FREE(yd->cookie_t);
+ yd->cookie_t = getcookie(pair->value);
+
+ } else if(pair->value[0]=='C') {
+ FREE(yd->cookie_c);
+ yd->cookie_c = getcookie(pair->value);
+ }
+
+ break;
+ case 3: /* my id */
+ nick = pair->value;
+ break;
+ case 90: /* 1 */
+ case 100: /* 0 */
+ case 101: /* NULL */
+ case 102: /* NULL */
+ case 93: /* 86400/1440 */
+ break;
+ case 213: /* my current avatar setting */
+ {
+ int buddy_icon = strtol(pair->value, NULL, 10);
+
+ YAHOO_CALLBACK(ext_yahoo_got_avatar_share)(yd->client_id, buddy_icon);
+ }
+ break;
+ case 217: /*??? Seems like last key */
+
+ break;
+
+ case 216: /* Firat Name */
+ fname = pair->value;
+ break;
+
+ case 254: /* Last Name */
+ lname = pair->value;
+ break;
+ }
+ }
+
+ YAHOO_CALLBACK(ext_yahoo_got_identities)(yd->client_id, nick, fname, lname, yd->identities);
+
+ /* we could be getting multiple packets here */
+ if (pkt->status != 0) /* Thanks for the fix GAIM */
+ return;
+
+ if(yd->cookie_y && yd->cookie_t && yd->cookie_c)
+ YAHOO_CALLBACK(ext_yahoo_got_cookies)(yd->client_id);
+
+ /*** We login at the very end of the packet communication */
+ if (!yd->logged_in) {
+ yd->logged_in = TRUE;
+
+ if(yd->current_status == YAHOO_STATUS_OFFLINE)
+ yd->current_status = yd->initial_status;
+
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_OK, NULL);
+ }
+}
+
+static void yahoo_process_y8_list(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ YList *l;
+ struct yahoo_buddy *bud=NULL;
+
+ /* we could be getting multiple packets here */
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+
+ switch(pair->key) {
+ case 302:
+ /* This is always 318 before a group, 319 before the first s/n in a group, 320 before any ignored s/n.
+ * It is not sent for s/n's in a group after the first.
+ * All ignored s/n's are listed last, so when we see a 320 we clear the group and begin marking the
+ * s/n's as ignored. It is always followed by an identical 300 key.
+ */
+ if (pair->value && !strcmp(pair->value, "320")) {
+ /* No longer in any group; this indicates the start of the ignore list. */
+ FREE(yd->ygrp);
+ }
+
+ break;
+ case 301: /* This is 319 before all s/n's in a group after the first. It is followed by an identical 300. */
+ break;
+ case 300: /* This is 318 before a group, 319 before any s/n in a group, and 320 before any ignored s/n. */
+ break;
+ case 65: /* This is the group */
+ FREE(yd->ygrp);
+ yd->ygrp = strdup(pair->value);
+ break;
+ case 7: /* buddy's s/n */
+ /**
+ * Need to add the buddy to one of several lists
+ */
+ bud = y_new0(struct yahoo_buddy, 1);
+ bud->id = strdup(pair->value);
+
+ if (yd->ygrp) {
+ bud->group = strdup(yd->ygrp);
+
+ yd->buddies = y_list_append(yd->buddies, bud);
+ } else {
+ yd->ignore = y_list_append(yd->ignore, bud);
+ }
+
+ break;
+ case 241: /* another protocol user */
+ if (bud) {
+ bud->protocol = strtol(pair->value, NULL, 10);
+ }
+ break;
+
+ case 223: /* Auth request pending */
+ if (bud) {
+ bud->auth = strtol(pair->value, NULL, 10);
+ }
+ break;
+
+ case 59: /* somebody told cookies come here too, but im not sure */
+ break;
+
+ case 317: /* Stealth Setting */
+ if (bud && (strtol(pair->value, NULL, 10) == 2)) {
+ //f->presence = YAHOO_PRESENCE_PERM_OFFLINE;
+ bud->stealth = 2;
+ }
+
+ break;
+ }
+ }
+
+ /* we could be getting multiple packets here */
+ if (pkt->status != 0)
+ return;
+
+ if(yd->buddies) {
+ YAHOO_CALLBACK(ext_yahoo_got_buddies)(yd->client_id, yd->buddies);
+ }
+
+ if(yd->ignore) {
+ YAHOO_CALLBACK(ext_yahoo_got_ignore)(yd->client_id, yd->ignore);
+ }
+
+
+}
+
+static void yahoo_process_verify(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ struct yahoo_server_settings *yss = yd->server_settings;
+
+ if(pkt->status != 0x01) {
+ DEBUG_MSG(("expected status: 0x01, got: %d", pkt->status));
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_LOCK, "");
+ return;
+ }
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH, YPACKET_STATUS_DEFAULT, 0);
+ yahoo_packet_hash(pkt, 1, yd->user);
+ //NOTICE(("web messenger: %d", yss->web_messenger));
+ if (yss->web_messenger) {
+ yahoo_packet_hash(pkt, 0, yd->user);
+ yahoo_packet_hash(pkt, 24, "0");
+ }
+ //NOTICE(("Sending initial packet"));
+
+ yahoo_send_packet(yid, pkt, 0);
+
+ yahoo_packet_free(pkt);
+
+}
+
+/*
+ * New Yahoo 9.x auth protocol
+ */
+static void yahoo_process_auth_0x0f(struct yahoo_input_data *yid, const char *seed, const char *sn)
+{
+ struct yahoo_packet *pack = NULL;
+ struct yahoo_data *yd = yid->yd;
+ struct yahoo_server_settings *yss;
+
+ char *crumb=NULL;
+ char *response = NULL;
+ char url[1024];
+ char *c, *t;
+ md5_byte_t result[16];
+ md5_state_t ctx;
+ unsigned char *magic_hash = (unsigned char*) malloc(50); /* this one is like 26 bytes? */
+ int i;
+
+ /**
+ case 2: Totally Cracked... Yay.. no more crypt tables.. just need some SSL magic.
+
+ Thanks to: http://shinkaiho.com/?p=32
+
+ login.yahoo.com:443
+
+*chal is returned from ymsg connection
+GET /config/pwtoken_get?src=ymsgr&ts=1195577375&login=user&passwd=pass&chal=chal HTTP/1.1
+
+*token is the ymsgr value returned from the above request
+GET /config/pwtoken_login?src=ymsgr&ts=1195577376&token=token HTTP/1.1
+
+*crumb is returned from the above request along with ymsg cookie
+307 field is crumb + chal md5ed (16 bytes dont convert to hex) then base64ed
+
+ **/
+ yss = yd->server_settings;
+
+ if (yd->pw_token == NULL ) {
+
+ c = yahoo_urlencode(yd->password);
+
+ _snprintf(url, sizeof(url), "/config/pwtoken_get?src=ymsgr&login=%s&passwd=%s", sn, c);
+ response = YAHOO_CALLBACK(ext_yahoo_send_https_request)(yd, yss->login_host, url);
+
+ FREE(c);
+
+ if (response == NULL) {
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_SOCK, NULL);
+ return; // fail for now
+ }
+
+ LOG(("Got response:\n%s", response));
+
+ if (!isdigit(response[0])) {
+ LOG(("Non numeric status code received."));
+
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_SOCK, NULL);
+ return; // fail for now
+ }
+
+ i = atoi(response);
+
+ if (i != 0) {
+ /**
+ * Some Error Code, we need to process it here
+ */
+
+ switch (i) {
+ case 1212: /* Invalid ID or password. Please try again. */
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_PASSWD, NULL);
+ break;
+
+ case 1213:
+ /* security lock from too many failed login attempts */
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_LOCK, "Yahoo! website");
+ break;
+
+ case 1235: /* This ID is not yet taken */
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_UNAME, NULL);
+ break;
+
+ case 1221:
+ c = strstr(response,"url=");
+
+ if (c != NULL) {
+ t = c + 6;
+
+ while ( (*c) != '\0' && (*c) != '\r' && (*c) != '\n') c++;
+
+ i = c - t;
+
+ if (i > 1000)
+ i = 1000;
+
+ strncpy(url, t, i);
+ url[i] = '\0';
+ } else {
+ url[0] = '\0';
+ }
+
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_LOCK, url);
+ break;
+
+ case 1214:
+ case 1236: /* indicates a lock of some description */
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_LOCK, "Yahoo! website");
+ break;
+
+
+ case 100: /* Required field missing */
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_PASSWD, NULL);
+ break;
+
+ default:
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_SOCK, NULL);
+ break;
+ }
+
+ FREE(response);
+ return;
+ }
+ /*
+ 0 - status code. See: http://www.carbonize.co.uk/ymsg16.html
+ ymsgr=<YToken>
+ partnerid=<???>
+ */
+ c = strstr(response,"ymsgr=");
+
+ if (c != NULL) {
+ t = c + 6;
+
+ while ( (*c) != '\0' && (*c) != '\r' && (*c) != '\n') c++;
+
+ yd->pw_token = (char *) malloc(c - t + 1);
+
+ memcpy(yd->pw_token, t, c - t);
+ yd->pw_token[c - t] = '\0';
+
+ LOG(("Got Token: %s", yd->pw_token));
+ }
+
+ FREE(response);
+
+ if (yd->pw_token == NULL) {
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_PASSWD, NULL);
+ return; // fail for now
+ }
+ }
+
+ //_snprintf(url, sizeof(url), "/config/pwtoken_login?src=ymsgr&token=%s&ext_err=1",token);
+ _snprintf(url, sizeof(url), "/config/pwtoken_login?src=ymsgr&token=%s",yd->pw_token);
+
+ /*
+ 0
+ crumb=hN3LKzv4Ho.
+ Y=v=1&n=11nh9j9k4vpm8&l=64d0xxtsqqt/o&p=m270ar7013000000&jb=33|47|&r=bt&lg=us&intl=us&np=1; path=/; domain=.yahoo.com
+ T=z=xUvdFBxaEeFBfOaVlmk3RSXNDMxBjU2MjQyNjFPNTE-&a=QAE&sk=DAAWDRZBoXexNr&d=c2wBTXpRMkFUSXhOVE0xTVRZNE1qWS0BYQFRQUUBenoBeFV2ZEZCZ1dBAXRpcAFNSVlVN0Q-; path=/; domain=.yahoo.com
+ cookievalidfor=86400
+
+ */
+ response = YAHOO_CALLBACK(ext_yahoo_send_https_request)(yd, yss->login_host, url);
+
+ if (response == NULL) {
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_SOCK, NULL);
+ return; // fail for now
+ }
+
+ LOG(("Got response:\n%s", response));
+
+ if (!isdigit(response[0])) {
+ LOG(("Non numeric status code received."));
+
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_SOCK, NULL);
+ return; // fail for now
+ }
+
+ i = atoi(response);
+
+ if (i != 0) {
+ /**
+ * Some Error Code, we need to process it here
+ */
+
+ switch (i) {
+
+ case 100: /* Required field missing???? */
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_SOCK, NULL);
+ break;
+
+ default:
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_SOCK, NULL);
+ break;
+ }
+
+ FREE(response);
+ return;
+ }
+
+ c = strstr(response,"crumb=");
+ if (c != NULL) {
+ t = c + 6;
+
+ while ( (*c) != '\0' && (*c) != '\r' && (*c) != '\n') c++;
+
+ crumb = (char *) _alloca(c - t + 1);
+
+ memcpy(crumb, t, c - t);
+ crumb[c - t] = '\0';
+
+ LOG(("Got crumb: %s", crumb));
+ } else
+ goto LBL_FAILED;
+
+ c = strstr(response,"Y=");
+ if (c != NULL) {
+ t = c + 2;
+
+ while ( (*c) != '\0' && (*c) != '\r' && (*c) != '\n') c++;
+
+ FREE(yd->cookie_y);
+ yd->cookie_y = (char *) malloc(c - t + 1);
+
+ memcpy(yd->cookie_y, t, c - t);
+ yd->cookie_y[c - t] = '\0';
+
+ LOG(("Got Y Cookie: %s", yd->cookie_y));
+ } else
+ goto LBL_FAILED;
+
+ c = strstr(response,"T=");
+ if (c != NULL) {
+ t = c + 2;
+
+ while ( (*c) != '\0' && (*c) != '\r' && (*c) != '\n') c++;
+
+ yd->cookie_t = (char *) malloc(c - t + 1);
+
+ memcpy(yd->cookie_t, t, c - t);
+ yd->cookie_t[c - t] = '\0';
+
+ LOG(("Got T Cookie: %s", yd->cookie_t));
+ } else {
+LBL_FAILED:
+ FREE(response);
+
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_PASSWD, "At stage 2");
+ return;
+ }
+
+ FREE(response);
+
+ pack = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP, (yd->initial_status == YAHOO_STATUS_INVISIBLE) ?YPACKET_STATUS_INVISIBLE:YPACKET_STATUS_WEBLOGIN, 0);
+/*
+ AuthResp, WebLogin
+ 0: id
+ 1: id
+ 277: v=....
+ 278: z=...
+ 307: <from above>
+ 244: 4194239
+ 2: id
+ 2: 1
+ 59: B\tvalue
+ 98: us
+ 135: 9.0.0.1912
+*/
+ /*
+ 277:v=1&n=11nh9j9k4vpm8&l=64d0xxtsqqt/o&p=m270ar7013000000&jb=33|47|&r=bt&lg=us&intl=us&np=1; path=/; domain=.yahoo.com
+ 278:z=xUvdFBxaEeFBfOaVlmk3RSXNDMxBjU2MjQyNjFPNTE-&a=QAE&sk=DAAWDRZBoXexNr&d=c2wBTXpRMkFUSXhOVE0xTVRZNE1qWS0BYQFRQUUBenoBeFV2ZEZCZ1dBAXRpcAFNSVlVN0Q-; path=/; domain=.yahoo.com
+ 307:VATg29jzHSXlp_2LL7J4Fw--
+ */
+ md5_init(&ctx);
+
+ md5_append(&ctx, (md5_byte_t *)crumb, strlen(crumb));
+ md5_append(&ctx, (md5_byte_t *)seed, strlen(seed));
+ md5_finish(&ctx, result);
+
+ to_y64(magic_hash, result, 16);
+ LOG(("Y64 Hash: %s", magic_hash));
+
+ yahoo_packet_hash(pack, 1, sn);
+ yahoo_packet_hash(pack, 0, sn);
+
+ yahoo_packet_hash(pack, 277, yd->cookie_y);
+ yahoo_packet_hash(pack, 278, yd->cookie_t);
+ yahoo_packet_hash(pack, 307, (const char *)magic_hash);
+ free(magic_hash);
+
+ yahoo_packet_hash(pack, 244, "4194239"); // Yahoo 9.0
+
+ yahoo_packet_hash(pack, 2, sn);
+ yahoo_packet_hash(pack, 2, "1");
+
+ yahoo_packet_hash(pack, 135, "9.0.0.2162");
+
+ yahoo_send_packet(yid, pack, 0);
+ yahoo_packet_free(pack);
+}
+
+static void yahoo_process_auth(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ char *seed = NULL;
+ char *sn = NULL;
+ YList *l = pkt->hash;
+ int m = 0;
+
+ while (l) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+
+ switch (pair->key){
+ case 94:
+ seed = pair->value;
+ break;
+ case 1:
+ sn = pair->value;
+ break;
+ case 13:
+ m = atoi(pair->value);
+ break;
+ }
+ l = l->next;
+ }
+
+ if (!seed || !sn) {
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yid->yd->client_id, YAHOO_LOGIN_SOCK, NULL);
+ return;
+ }
+
+ switch (m) {
+ case 2:
+ yahoo_process_auth_0x0f(yid, seed, sn);
+ break;
+ default:
+ /* call error */
+ WARNING(("unknown auth type %d", m));
+ //yahoo_process_auth_0x0b(yid, seed, sn);
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yid->yd->client_id, YAHOO_LOGIN_SOCK, NULL);
+ break;
+ }
+}
+
+static void yahoo_process_auth_resp(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ char *login_id;
+ char *handle;
+ char *url=NULL;
+ int login_status=-1;
+
+ YList *l;
+
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ if (pair->key == 0)
+ login_id = pair->value;
+ else if (pair->key == 1)
+ handle = pair->value;
+ else if (pair->key == 20)
+ url = pair->value;
+ else if (pair->key == 66)
+ login_status = atoi(pair->value);
+ }
+
+ if(pkt->status == YPACKET_STATUS_DISCONNECTED) {
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, login_status, url);
+ /* yahoo_logoff(yd->client_id);*/
+ }
+}
+
+static void yahoo_process_mail(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ char *who = NULL;
+ char *email = NULL;
+ char *subj = NULL;
+ int count = 0;
+ YList *l;
+
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ if (pair->key == 9)
+ count = strtol(pair->value, NULL, 10);
+ else if (pair->key == 43)
+ who = pair->value;
+ else if (pair->key == 42)
+ email = pair->value;
+ else if (pair->key == 18)
+ subj = pair->value;
+ else
+ LOG(("key: %d => value: '%s'", pair->key, pair->value));
+ }
+
+ if (email && subj) {
+ char from[1024];
+
+ if (who) {
+ snprintf(from, sizeof(from), "\"%s\" <%s>", who, email);
+ } else {
+ snprintf(from, sizeof(from), "%s", email);
+ }
+
+ YAHOO_CALLBACK(ext_yahoo_mail_notify)(yd->client_id, from, subj, count);
+ } else {
+ YAHOO_CALLBACK(ext_yahoo_mail_notify)(yd->client_id, NULL, NULL, count);
+ }
+}
+
+static void yahoo_buddy_added_us(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ char *id = NULL;
+ char *who = NULL;
+ char *msg = NULL;
+ long tm = 0L;
+ YList *l;
+ int protocol = 0;
+
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ switch (pair->key) {
+ case 1:
+ id = pair->value;
+ break;
+ case 3:
+ who = pair->value;
+ break;
+ case 14:
+ msg = pair->value;
+ break;
+ case 15:
+ tm = strtol(pair->value, NULL, 10);
+ break;
+
+ case 241:
+ protocol = strtol(pair->value, NULL, 10);
+ break;
+
+ default:
+ LOG(("key: %d => value: '%s'", pair->key, pair->value));
+ }
+ }
+
+ YAHOO_CALLBACK(ext_yahoo_contact_added)(yd->client_id, id, who, NULL, NULL, msg, protocol);
+}
+
+static void yahoo_buddy_denied_our_add(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ char *who = NULL;
+ char *msg = NULL;
+ YList *l;
+
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ switch (pair->key) {
+ case 3:
+ who = pair->value;
+ break;
+ case 14:
+ msg = pair->value;
+ break;
+ default:
+ LOG(("key: %d => value: '%s'", pair->key, pair->value));
+ }
+ }
+
+ YAHOO_CALLBACK(ext_yahoo_rejected)(yd->client_id, who, msg);
+}
+
+static void yahoo_process_contact(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ switch (pkt->status) {
+ case 1:
+ yahoo_process_status(yid, pkt);
+ return;
+ case 3:
+ yahoo_buddy_added_us(yid, pkt);
+ break;
+ case 7:
+ yahoo_buddy_denied_our_add(yid, pkt);
+ break;
+ default:
+ LOG(("Unknown status value: '%d'", pkt->status));
+ }
+
+}
+
+static void yahoo_process_authorization(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ char *who = NULL,
+ *msg = NULL,
+ *fname = NULL,
+ *lname = NULL,
+ *id = NULL;
+ int state = 0, utf8 = 0, protocol = 0;
+ YList *l;
+
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ switch (pair->key) {
+ case 4: /* who added us */
+ who = pair->value;
+ break;
+
+ case 5: /* our identity */
+ id = pair->value;
+ break;
+
+ case 13: /* which type of request this is */
+ state = strtol(pair->value, NULL, 10);
+ break;
+
+ case 14: /* was there a message ? */
+ msg = pair->value;
+ break;
+
+ case 97: /* Unicode flag? */
+ utf8 = strtol(pair->value, NULL, 10);
+ break;
+
+ case 216: /* first name */
+ fname = pair->value;
+ break;
+
+ case 241:
+ protocol = strtol(pair->value, NULL, 10);
+ break;
+
+ case 254: /* last name */
+ lname = pair->value;
+ break;
+
+ default:
+ LOG(("key: %d => value: '%s'", pair->key, pair->value));
+ }
+ }
+
+ switch (state) {
+ case 1: /* Authorization Accepted */
+
+ break;
+ case 2: /* Authorization Denied */
+ YAHOO_CALLBACK(ext_yahoo_rejected)(yd->client_id, who, msg);
+ break;
+ default: /* Authorization Request? */
+ YAHOO_CALLBACK(ext_yahoo_contact_added)(yd->client_id, id, who, fname, lname, msg, protocol);
+
+ }
+
+}
+
+static void yahoo_process_buddyadd(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ char *who = NULL;
+ char *where = NULL;
+ int status = 0, auth = 0, protocol = 0;
+ char *me = NULL;
+
+ struct yahoo_buddy *bud=NULL;
+
+ YList *l;
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+
+ switch (pair->key){
+ case 1:
+ me = pair->value;
+ break;
+ case 7:
+ who = pair->value;
+ break;
+ case 65:
+ where = pair->value;
+ break;
+ case 66:
+ status = strtol(pair->value, NULL, 10);
+ break;
+
+ case 223:
+ auth = strtol(pair->value, NULL, 10);
+ break;
+
+ case 241:
+ protocol = strtol(pair->value, NULL, 10);
+ break;
+
+ default:
+ DEBUG_MSG(("unknown key: %d = %s", pair->key, pair->value));
+ }
+ }
+
+ //yahoo_dump_unhandled(pkt);
+
+ if(!who)
+ return;
+ if(!where)
+ where = "Unknown";
+
+ bud = y_new0(struct yahoo_buddy, 1);
+ bud->id = strdup(who);
+ bud->group = strdup(where);
+ bud->real_name = NULL;
+ bud->protocol = protocol;
+
+ yd->buddies = y_list_append(yd->buddies, bud);
+
+ YAHOO_CALLBACK(ext_yahoo_buddy_added)(yd->client_id, me, who, where, status, auth);
+/* YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, who, status, NULL, (status==YAHOO_STATUS_AVAILABLE?0:1)); */
+}
+
+static void yahoo_process_buddydel(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ char *who = NULL;
+ char *where = NULL;
+ int unk_66 = 0, protocol = 0;
+ char *me = NULL;
+ struct yahoo_buddy *bud;
+
+ YList *buddy;
+
+ YList *l;
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+
+ switch (pair->key) {
+ case 1:
+ me = pair->value;
+ break;
+
+ case 7:
+ who = pair->value;
+ break;
+
+ case 65:
+ where = pair->value;
+ break;
+
+ case 66:
+ unk_66 = strtol(pair->value, NULL, 10);
+ break;
+
+ case 241:
+ protocol = strtol(pair->value, NULL, 10);
+ break;
+
+ default:
+ DEBUG_MSG(("unknown key: %d = %s", pair->key, pair->value));
+ }
+ }
+
+ if(!who || !where)
+ return;
+
+ bud = y_new0(struct yahoo_buddy, 1);
+ bud->id = strdup(who);
+ bud->group = strdup(where);
+ bud->protocol = protocol;
+
+ buddy = y_list_find_custom(yd->buddies, bud, is_same_bud);
+
+ FREE(bud->id);
+ FREE(bud->group);
+ FREE(bud);
+
+ if(buddy) {
+ bud = (struct yahoo_buddy *) buddy->data;
+ yd->buddies = y_list_remove_link(yd->buddies, buddy);
+ y_list_free_1(buddy);
+
+ FREE(bud->id);
+ FREE(bud->group);
+ FREE(bud->real_name);
+ FREE(bud);
+
+ bud=NULL;
+ }
+}
+static void yahoo_process_yahoo7_change_group(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ char *who = NULL;
+ char *me = NULL;
+ char *old_group = NULL;
+ char *new_group = NULL;
+
+ YList *l;
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+
+ switch (pair->key){
+ case 1:
+ me = pair->value;
+ break;
+ case 7:
+ who = pair->value;
+ break;
+ case 224:
+ old_group = pair->value;
+ break;
+ case 264:
+ new_group = pair->value;
+ break;
+ }
+ }
+
+ YAHOO_CALLBACK(ext_yahoo_buddy_group_changed)(yd->client_id, me, who, old_group, new_group);
+}
+
+static void yahoo_process_ignore(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ struct yahoo_data *yd = yid->yd;
+ char *who = NULL;
+ int status = 0;
+ char *me = NULL;
+ int un_ignore = 0;
+
+ YList *l;
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ if (pair->key == 0)
+ who = pair->value;
+ if (pair->key == 1)
+ me = pair->value;
+ if (pair->key == 13) /* 1 == ignore, 2 == unignore */
+ un_ignore = strtol(pair->value, NULL, 10);
+ if (pair->key == 66)
+ status = strtol(pair->value, NULL, 10);
+ }
+
+
+ /*
+ * status
+ * 0 - ok
+ * 2 - already in ignore list, could not add
+ * 3 - not in ignore list, could not delete
+ * 12 - is a buddy, could not add
+ */
+
+ if(status) {
+ YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, who, 0, status);
+ } else {
+ /* we adding or removing to the ignore list */
+ if (un_ignore == 1) { /* ignore */
+ struct yahoo_buddy *bud = y_new0(struct yahoo_buddy, 1);
+
+ bud->id = strdup(who);
+ bud->group = NULL;
+ bud->real_name = NULL;
+
+ yd->ignore = y_list_append(yd->ignore, bud);
+
+ } else { /* unignore */
+ YList *buddy;
+
+ buddy = yd->ignore;
+
+ while (buddy) {
+ struct yahoo_buddy *b = (struct yahoo_buddy *) buddy->data;
+
+ if (lstrcmpiA(b->id, who) == 0)
+ break;
+
+ buddy = buddy->next;
+ }
+
+ if(buddy) {
+ struct yahoo_buddy *bud = (struct yahoo_buddy *) buddy->data;
+
+ yd->ignore = y_list_remove_link(yd->ignore, buddy);
+ y_list_free_1(buddy);
+
+ FREE(bud->id);
+ FREE(bud->group);
+ FREE(bud->real_name);
+ FREE(bud);
+
+ bud=NULL;
+ }
+ }
+ }
+}
+
+static void yahoo_process_stealth(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ //struct yahoo_data *yd = yid->yd;
+ char *who = NULL;
+ int status = 0;
+
+ YList *l;
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+
+ if (pair->key == 7)
+ who = pair->value;
+
+ if (pair->key == 31)
+ status = strtol(pair->value, NULL, 10);
+ }
+
+ NOTICE(("got %s stealth info for %s with value: %d", pkt->service == YAHOO_SERVICE_STEALTH_PERM ? "permanent": "session" , who, status == 1));
+}
+
+static void yahoo_process_voicechat(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ char *who = NULL;
+ char *me = NULL;
+ char *room = NULL;
+ char *voice_room = NULL;
+
+ YList *l;
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+
+ if (pair->key == 4)
+ who = pair->value;
+ if (pair->key == 5)
+ me = pair->value;
+ if (pair->key == 13)
+ voice_room=pair->value;
+ if (pair->key == 57)
+ room=pair->value;
+ }
+
+ NOTICE(("got voice chat invite from %s in %s to identity %s", who, room, me));
+ /*
+ * send: s:0 1:me 5:who 57:room 13:1
+ * ???? s:4 5:who 10:99 19:-1615114531
+ * gotr: s:4 5:who 10:99 19:-1615114615
+ * ???? s:1 5:me 4:who 57:room 13:3room
+ * got: s:1 5:me 4:who 57:room 13:1room
+ * rej: s:0 1:me 5:who 57:room 13:3
+ * rejr: s:4 5:who 10:99 19:-1617114599
+ */
+}
+
+static void yahoo_process_picture(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ char *who = NULL;
+ char *me = NULL;
+ char *pic_url = NULL;
+ int cksum = 0;
+ int type = 0;
+
+ YList *l;
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+
+ /* based on GAIM code */
+ switch (pair->key) {
+ case 1:
+ case 4:
+ who = pair->value;
+ break;
+ case 5:
+ me = pair->value;
+ break;
+ case 13:
+ type = strtol(pair->value, NULL, 10);
+ break;
+ case 20:
+ pic_url=pair->value;
+ break;
+ case 192:
+ cksum = strtol(pair->value, NULL, 10);
+ break;
+ } /*switch */
+
+ }
+ NOTICE(("got picture packet"));
+ YAHOO_CALLBACK(ext_yahoo_got_picture)(yid->yd->client_id, me, who, pic_url, cksum, type);
+}
+
+void yahoo_send_picture_info(int id, const char *who, int type, const char *pic_url, int cksum)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+ struct yahoo_server_settings *yss;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+ yss = yd->server_settings;
+ pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE, YPACKET_STATUS_DEFAULT, yd->session_id);
+
+ yahoo_packet_hash(pkt, 1, yd->user);
+ //yahoo_packet_hash(pkt, 4, yd->user);
+ yahoo_packet_hash(pkt, 5, who);
+
+ yahoo_packet_hash_int(pkt, 13, type);
+
+ yahoo_packet_hash(pkt, 20, pic_url);
+
+ yahoo_packet_hash_int(pkt, 192, cksum);
+ yahoo_send_packet(yid, pkt, 0);
+
+ if (yss->web_messenger) {
+ yahoo_packet_hash(pkt, 0, yd->user);
+ yahoo_packet_hash_int(pkt, 24, yd->session_timestamp);
+ }
+
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_send_picture_update(int id, const char *who, int type)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+ struct yahoo_server_settings *yss;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+ yss = yd->server_settings;
+ pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE_UPDATE, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 5, who);
+
+ yahoo_packet_hash_int(pkt, 206, type);
+ yahoo_send_packet(yid, pkt, 0);
+
+ if (yss->web_messenger) {
+ yahoo_packet_hash(pkt, 0, yd->user);
+ yahoo_packet_hash_int(pkt, 24, yd->session_timestamp);
+ }
+
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_send_picture_checksum(int id, const char *who, int cksum)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+ struct yahoo_server_settings *yss;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+ yss = yd->server_settings;
+ pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE_CHECKSUM, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, yd->user);
+
+ if (who)
+ yahoo_packet_hash(pkt, 5, who); // ?
+
+ yahoo_packet_hash(pkt, 212, "1"); // ?
+
+ yahoo_packet_hash_int(pkt, 192, cksum); // checksum
+ yahoo_send_packet(yid, pkt, 0);
+
+ if (yss->web_messenger) {
+ yahoo_packet_hash(pkt, 0, yd->user);
+ yahoo_packet_hash_int(pkt, 24, yd->session_timestamp);
+ }
+
+ yahoo_packet_free(pkt);
+
+ /* weird YIM7 sends another packet! See picture_status below*/
+}
+
+void yahoo_send_picture_status(int id, int buddy_icon)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+ struct yahoo_server_settings *yss;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+ yss = yd->server_settings;
+ pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE_SHARING, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 3, yd->user);
+
+ yahoo_packet_hash_int(pkt, 213, buddy_icon);
+
+ if (yss->web_messenger) {
+ yahoo_packet_hash(pkt, 0, yd->user);
+ yahoo_packet_hash_int(pkt, 24, yd->session_timestamp);
+ }
+
+ yahoo_send_packet(yid, pkt, 0);
+
+ yahoo_packet_free(pkt);
+}
+
+static void yahoo_process_picture_checksum(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ char *who = NULL;
+ char *me = NULL;
+ int cksum = 0;
+
+ YList *l;
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ if (pair->key == 4)
+ who = pair->value;
+ if (pair->key == 5)
+ me = pair->value;
+ if (pair->key == 192)
+ cksum = strtol(pair->value, NULL, 10);
+
+ }
+ NOTICE(("got picture_checksum packet"));
+ YAHOO_CALLBACK(ext_yahoo_got_picture_checksum)(yid->yd->client_id, me, who, cksum);
+}
+
+static void yahoo_process_picture_update(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ char *who = NULL;
+ char *me = NULL;
+ int buddy_icon = -1;
+
+ YList *l;
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *)l->data;
+ if (pair->key == 4)
+ who = pair->value;
+ if (pair->key == 5)
+ me = pair->value;
+ if (pair->key == 206)
+ buddy_icon = strtol(pair->value, NULL, 10);
+
+ }
+ NOTICE(("got picture_update packet"));
+ YAHOO_CALLBACK(ext_yahoo_got_picture_update)(yid->yd->client_id, me, who, buddy_icon);
+}
+
+static void yahoo_process_picture_upload(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ char *url = NULL;
+ char *me = NULL;
+ unsigned int ts = 0;
+
+ YList *l;
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *)l->data;
+ switch (pair->key){
+ case 5: /* our id */
+ me = pair->value;
+ break;
+ case 27: /* filename on our computer */
+ break;
+ case 20: /* url at yahoo */
+ url = pair->value;
+ break;
+ case 38: /* timestamp */
+ ts = strtol(pair->value, NULL, 10);
+ break;
+ }
+ }
+ NOTICE(("[yahoo_process_picture_upload]"));
+
+ YAHOO_CALLBACK(ext_yahoo_got_picture_upload)(yid->yd->client_id, me, url, ts);
+}
+
+static void yahoo_process_picture_status(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ char *who = NULL;
+ char *me = NULL;
+ int buddy_icon = -1;
+
+ YList *l;
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ switch (pair->key){
+ case 5: /* our id */
+ me = pair->value;
+ break;
+ case 4: /* who is notifying all */
+ who = pair->value;
+ break;
+ case 213: /* picture = 0-none, 1-?, 2=picture */
+ buddy_icon = strtol(pair->value, NULL, 10);
+ break;
+ }
+ }
+ NOTICE(("[yahoo_process_picture_status]"));
+ if (who) // sometimes we just get a confirmation without the WHO.(ack on our avt update)
+ YAHOO_CALLBACK(ext_yahoo_got_picture_status)(yid->yd->client_id, me, who, buddy_icon);
+}
+
+static void yahoo_process_audible(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ char *who = NULL;
+ char *me = NULL;
+ char *aud_hash=NULL;
+ char *msg = NULL;
+ char *aud = NULL;
+
+ YList *l;
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ switch (pair->key){
+ case 5: /* our id */
+ me = pair->value;
+ break;
+ case 4: /* who is notifying all */
+ who = pair->value;
+ break;
+ case 230: /* file class name
+ GAIM: the audible, in foo.bar.baz format
+
+ Actually this is the filename.
+ Full URL:
+
+ http://us.dl1.yimg.com/download.yahoo.com/dl/aud/us/aud.swf
+
+ where aud in foo.bar.baz format
+ */
+ aud = pair->value;
+ break;
+ case 231: /*audible text*/
+ msg = pair->value;
+ break;
+ case 232: /* weird number (md5 hash?) */
+ aud_hash = pair->value;
+ break;
+ }
+ }
+ NOTICE(("[yahoo_process_audible]"));
+ if (who) // sometimes we just get a confirmation without the WHO.(ack on our send/update)
+ YAHOO_CALLBACK(ext_yahoo_got_audible)(yid->yd->client_id, me, who, aud, msg, aud_hash);
+}
+
+static void yahoo_process_calendar(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ char *msg = NULL;
+ char *url = NULL;
+ int svc = -1, type = -1;
+
+ YList *l;
+
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ switch (pair->key){
+ case 20: /* url to calendar reminder/event */
+ if (pair->value[0] != '\0')
+ url = pair->value;
+ break;
+ case 21: /* type? number seems to be 0? */
+ type = atol(pair->value);
+ break;
+ case 14: /* index msg/title ? */
+ if (pair->value[0] != '\0')
+ msg = pair->value;
+ break;
+ case 13: /* service # ? */
+ svc = atol(pair->value);
+ break;
+ }
+ }
+
+ if (url) // sometimes we just get a reminder w/o the URL
+ YAHOO_CALLBACK(ext_yahoo_got_calendar)(yid->yd->client_id, url, type, msg, svc);
+}
+
+
+static void yahoo_process_ping(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ char *errormsg = NULL;
+
+ YList *l;
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ if (pair->key == 16)
+ errormsg = pair->value;
+ }
+
+ NOTICE(("got ping packet"));
+ YAHOO_CALLBACK(ext_yahoo_got_ping)(yid->yd->client_id, errormsg);
+}
+
+static void yahoo_process_yab_update(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ char *who=NULL,*yentry=NULL;
+ int svc=0;
+ YList *l;
+
+ /*
+ [15:42:00 YAHOO] Yahoo Service: (null) (0xc4) Status: YAHOO_STATUS_AVAILABLE (0)
+[15:42:00 YAHOO]
+[15:42:00 YAHOO] libyahoo2/libyahoo2.c:900: debug:
+[15:42:00 YAHOO] [Reading packet] len: 309
+[15:42:00 YAHOO]
+[15:42:00 YAHOO] Key: To (5) Value: 'xxxxxxx'
+[15:42:00 YAHOO]
+[15:42:00 YAHOO] Key: (null) (203) Value: '<?xml version="1.0" encoding="ISO-8859-1"?>
+ <ab k="aaaaaaa" cc="1" ec="1" rs="OK"><ct e="1" id="1" mt="1147894756" cr="1090811437" fn="ZZZ" ln="XXX"
+ e0="aaaa@yahoo.com" nn="AAAA" ca="Unfiled" yi="xxxxxxx" pr="0" cm="Some personal notes here."
+ imm="xxxxxx@hotmail.com"/></ab>'
+[15:42:00 YAHOO]
+[15:42:00 YAHOO] Key: stat/location (13) Value: '1'
+
+ */
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ switch (pair->key) {
+ case 5: /* who */
+ who = pair->value;
+ break;
+ case 203: /* yab entry */
+ yentry = pair->value;
+ break;
+ case 13: /* type of update */
+ svc = atoi(pair->value);
+ }
+ }
+
+ NOTICE(("got YAB Update packet"));
+ //YAHOO_CALLBACK(ext_yahoo_got_ping)(yid->yd->client_id, errormsg);
+}
+
+static void _yahoo_webcam_get_server_connected(int fd, int error, void *d)
+{
+ struct yahoo_input_data *yid = (struct yahoo_input_data *) d;
+ char *who = yid->wcm->user;
+ char *data = NULL;
+ char *packet = NULL;
+ unsigned char magic_nr[] = {0, 1, 0};
+ unsigned char header_len = 8;
+ unsigned int len = 0;
+ unsigned int pos = 0;
+
+ if(error || fd <= 0) {
+ FREE(who);
+ FREE(yid);
+ return;
+ }
+
+ yid->fd = fd;
+ inputs = y_list_prepend(inputs, yid);
+
+ /* send initial packet */
+ if (who)
+ data = strdup("<RVWCFG>");
+ else
+ data = strdup("<RUPCFG>");
+ yahoo_add_to_send_queue(yid, data, strlen(data));
+ FREE(data);
+
+ /* send data */
+ if (who)
+ {
+ data = strdup("g=");
+ data = y_string_append(data, who);
+ data = y_string_append(data, "\r\n");
+ } else {
+ data = strdup("f=1\r\n");
+ }
+ len = strlen(data);
+ packet = y_new0(char, header_len + len);
+ packet[pos++] = header_len;
+ memcpy(packet + pos, magic_nr, sizeof(magic_nr));
+ pos += sizeof(magic_nr);
+ pos += yahoo_put32(packet + pos, len);
+ memcpy(packet + pos, data, len);
+ pos += len;
+ yahoo_add_to_send_queue(yid, packet, pos);
+ FREE(packet);
+ FREE(data);
+
+ yid->read_tag=YAHOO_CALLBACK(ext_yahoo_add_handler)(yid->yd->client_id, fd, YAHOO_INPUT_READ, yid);
+}
+
+static void yahoo_webcam_get_server(struct yahoo_input_data *y, char *who, char *key)
+{
+ struct yahoo_input_data *yid = y_new0(struct yahoo_input_data, 1);
+ struct yahoo_server_settings *yss = y->yd->server_settings;
+
+ yid->type = YAHOO_CONNECTION_WEBCAM_MASTER;
+ yid->yd = y->yd;
+ yid->wcm = y_new0(struct yahoo_webcam, 1);
+ yid->wcm->user = who?strdup(who):NULL;
+ yid->wcm->direction = who?YAHOO_WEBCAM_DOWNLOAD:YAHOO_WEBCAM_UPLOAD;
+ yid->wcm->key = strdup(key);
+
+ YAHOO_CALLBACK(ext_yahoo_connect_async)(yid->yd->client_id, yss->webcam_host, yss->webcam_port, yid->type,
+ _yahoo_webcam_get_server_connected, yid);
+
+}
+
+static YList *webcam_queue=NULL;
+static void yahoo_process_webcam_key(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ char *me = NULL;
+ char *key = NULL;
+ char *who = NULL;
+
+ YList *l;
+ yahoo_dump_unhandled(pkt);
+ for (l = pkt->hash; l; l = l->next) {
+ struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
+ if (pair->key == 5)
+ me = pair->value;
+ if (pair->key == 61)
+ key=pair->value;
+ }
+
+ l = webcam_queue;
+ if(!l)
+ return;
+
+ who = (char *) l->data;
+ webcam_queue = y_list_remove_link(webcam_queue, webcam_queue);
+ y_list_free_1(l);
+ yahoo_webcam_get_server(yid, who, key);
+ FREE(who);
+}
+
+static void yahoo_packet_process(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
+{
+ //DEBUG_MSG(("yahoo_packet_process: 0x%02x", pkt->service));
+ switch (pkt->service)
+ {
+ case YAHOO_SERVICE_LOGON:
+ case YAHOO_SERVICE_Y8_STATUS_UPDATE:
+ yahoo_process_logon(yid, pkt);
+ break;
+ case YAHOO_SERVICE_USERSTAT:
+ case YAHOO_SERVICE_LOGOFF:
+ case YAHOO_SERVICE_ISAWAY:
+ case YAHOO_SERVICE_ISBACK:
+ case YAHOO_SERVICE_GAMELOGON:
+ case YAHOO_SERVICE_GAMELOGOFF:
+ case YAHOO_SERVICE_IDACT:
+ case YAHOO_SERVICE_IDDEACT:
+ case YAHOO_SERVICE_Y6_STATUS_UPDATE:
+ yahoo_process_status(yid, pkt);
+ break;
+ case YAHOO_SERVICE_NOTIFY:
+ yahoo_process_notify(yid, pkt);
+ break;
+ case YAHOO_SERVICE_MESSAGE:
+ case YAHOO_SERVICE_GAMEMSG:
+ case YAHOO_SERVICE_SYSMESSAGE:
+ yahoo_process_message(yid, pkt);
+ break;
+ case YAHOO_SERVICE_NEWMAIL:
+ yahoo_process_mail(yid, pkt);
+ break;
+ case YAHOO_SERVICE_NEWCONTACT:
+ yahoo_process_contact(yid, pkt);
+ break;
+ case YAHOO_SERVICE_LIST:
+ yahoo_process_list(yid, pkt);
+ break;
+ case YAHOO_SERVICE_VERIFY:
+ yahoo_process_verify(yid, pkt);
+ break;
+ case YAHOO_SERVICE_AUTH:
+ yahoo_process_auth(yid, pkt);
+ break;
+ case YAHOO_SERVICE_AUTHRESP:
+ yahoo_process_auth_resp(yid, pkt);
+ break;
+ case YAHOO_SERVICE_CONFINVITE:
+ case YAHOO_SERVICE_CONFADDINVITE:
+ case YAHOO_SERVICE_CONFDECLINE:
+ case YAHOO_SERVICE_CONFLOGON:
+ case YAHOO_SERVICE_CONFLOGOFF:
+ case YAHOO_SERVICE_CONFMSG:
+ yahoo_process_conference(yid, pkt);
+ break;
+ case YAHOO_SERVICE_CHATONLINE:
+ case YAHOO_SERVICE_CHATGOTO:
+ case YAHOO_SERVICE_CHATJOIN:
+ case YAHOO_SERVICE_CHATLEAVE:
+ case YAHOO_SERVICE_CHATEXIT:
+ case YAHOO_SERVICE_CHATLOGOUT:
+ case YAHOO_SERVICE_CHATPING:
+ case YAHOO_SERVICE_COMMENT:
+ yahoo_process_chat(yid, pkt);
+ break;
+ case YAHOO_SERVICE_P2PFILEXFER:
+ case YAHOO_SERVICE_FILETRANSFER:
+ yahoo_process_filetransfer(yid, pkt);
+ break;
+ case YAHOO_SERVICE_ADDBUDDY:
+ yahoo_process_buddyadd(yid, pkt);
+ break;
+ case YAHOO_SERVICE_REMBUDDY:
+ yahoo_process_buddydel(yid, pkt);
+ break;
+ case YAHOO_SERVICE_IGNORECONTACT:
+ yahoo_process_ignore(yid, pkt);
+ break;
+ case YAHOO_SERVICE_STEALTH_PERM:
+ case YAHOO_SERVICE_STEALTH_SESSION:
+ yahoo_process_stealth(yid, pkt);
+ break;
+ case YAHOO_SERVICE_VOICECHAT:
+ yahoo_process_voicechat(yid, pkt);
+ break;
+ case YAHOO_SERVICE_WEBCAM:
+ yahoo_process_webcam_key(yid, pkt);
+ break;
+ case YAHOO_SERVICE_PING:
+ yahoo_process_ping(yid, pkt);
+ break;
+ case YAHOO_SERVICE_PICTURE:
+ yahoo_process_picture(yid, pkt);
+ break;
+ case YAHOO_SERVICE_PICTURE_CHECKSUM:
+ yahoo_process_picture_checksum(yid, pkt);
+ break;
+ case YAHOO_SERVICE_PICTURE_UPDATE:
+ yahoo_process_picture_update(yid, pkt);
+ break;
+ case YAHOO_SERVICE_PICTURE_UPLOAD:
+ yahoo_process_picture_upload(yid, pkt);
+ break;
+ case YAHOO_SERVICE_YAB_UPDATE:
+ yahoo_process_yab_update(yid, pkt);
+ break;
+ case YAHOO_SERVICE_PICTURE_SHARING:
+ yahoo_process_picture_status(yid, pkt);
+ break;
+ case YAHOO_SERVICE_AUDIBLE:
+ yahoo_process_audible(yid, pkt);
+ break;
+ case YAHOO_SERVICE_CALENDAR:
+ yahoo_process_calendar(yid, pkt);
+ break;
+ case YAHOO_SERVICE_Y7_AUTHORIZATION:
+ yahoo_process_authorization(yid, pkt);
+ break;
+ case YAHOO_SERVICE_Y7_FILETRANSFER:
+ yahoo_process_filetransfer7(yid, pkt);
+ break;
+ case YAHOO_SERVICE_Y7_FILETRANSFERINFO:
+ yahoo_process_filetransfer7info(yid, pkt);
+ break;
+ case YAHOO_SERVICE_Y7_FILETRANSFERACCEPT:
+ /*
+ * We need to parse this packet
+ *
+ * Abort is signalled via status = -1 and 66 login status = -1 with FT_TOKEN
+ */
+ yahoo_process_filetransfer7accept(yid, pkt);
+ break;
+ case YAHOO_SERVICE_Y7_CHANGE_GROUP:
+ yahoo_process_yahoo7_change_group(yid, pkt);
+ break;
+ case YAHOO_SERVICE_Y8_LIST:
+ yahoo_process_y8_list(yid, pkt);
+ break;
+ case YAHOO_SERVICE_IDLE:
+ case YAHOO_SERVICE_MAILSTAT:
+ case YAHOO_SERVICE_CHATINVITE:
+ case YAHOO_SERVICE_NEWPERSONALMAIL:
+ case YAHOO_SERVICE_ADDIDENT:
+ case YAHOO_SERVICE_ADDIGNORE:
+ case YAHOO_SERVICE_GOTGROUPRENAME:
+ case YAHOO_SERVICE_GROUPRENAME:
+ case YAHOO_SERVICE_PASSTHROUGH2:
+ case YAHOO_SERVICE_CHATLOGON:
+ case YAHOO_SERVICE_CHATLOGOFF:
+ case YAHOO_SERVICE_CHATMSG:
+ case YAHOO_SERVICE_REJECTCONTACT:
+ case YAHOO_SERVICE_PEERTOPEER:
+ WARNING(("unhandled service 0x%02x", pkt->service));
+ //yahoo_dump_unhandled(pkt);
+ break;
+ default:
+ WARNING(("unknown service 0x%02x", pkt->service));
+ //yahoo_dump_unhandled(pkt);
+ break;
+ }
+}
+
+static struct yahoo_packet * yahoo_getdata(struct yahoo_input_data * yid)
+{
+ struct yahoo_packet *pkt;
+ struct yahoo_data *yd = yid->yd;
+ int pos = 0;
+ int pktlen;
+
+ if(!yd)
+ return NULL;
+
+ DEBUG_MSG(("rxlen is %d", yid->rxlen));
+ if (yid->rxlen < YAHOO_PACKET_HDRLEN) {
+ DEBUG_MSG(("len < YAHOO_PACKET_HDRLEN"));
+ return NULL;
+ }
+
+ /*DEBUG_MSG(("Dumping Packet Header:"));
+ yahoo_packet_dump(yid->rxqueue + pos, YAHOO_PACKET_HDRLEN);
+ DEBUG_MSG(("--- Done Dumping Packet Header ---"));*/
+ {
+ char *buf = (char *)(yid->rxqueue + pos);
+
+ if (buf[0] != 'Y' || buf[1] != 'M' || buf[2] != 'S' || buf[3] != 'G') {
+ DEBUG_MSG(("Not a YMSG packet?"));
+ return NULL;
+ }
+ }
+ pos += 4; /* YMSG */
+ pos += 2;
+ pos += 2;
+
+ pktlen = yahoo_get16(yid->rxqueue + pos); pos += 2;
+ DEBUG_MSG(("%d bytes to read, rxlen is %d", pktlen, yid->rxlen));
+
+ if (yid->rxlen < (YAHOO_PACKET_HDRLEN + pktlen)) {
+ DEBUG_MSG(("len < YAHOO_PACKET_HDRLEN + pktlen"));
+ return NULL;
+ }
+
+ //LOG(("reading packet"));
+ //yahoo_packet_dump(yid->rxqueue, YAHOO_PACKET_HDRLEN + pktlen);
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_LOGON, YPACKET_STATUS_DEFAULT, 0);
+
+ pkt->service = yahoo_get16(yid->rxqueue + pos); pos += 2;
+ pkt->status = yahoo_get32(yid->rxqueue + pos); pos += 4;
+ pkt->id = yahoo_get32(yid->rxqueue + pos); pos += 4;
+
+ yd->session_id = pkt->id;
+
+ yahoo_packet_read(pkt, yid->rxqueue + pos, pktlen);
+
+ yid->rxlen -= YAHOO_PACKET_HDRLEN + pktlen;
+ //DEBUG_MSG(("rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue));
+ if (yid->rxlen>0) {
+ unsigned char *tmp = (unsigned char *) y_memdup(yid->rxqueue + YAHOO_PACKET_HDRLEN
+ + pktlen, yid->rxlen);
+ FREE(yid->rxqueue);
+ yid->rxqueue = tmp;
+ //DEBUG_MSG(("new rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue));
+ } else {
+ //DEBUG_MSG(("freed rxqueue == %p", yid->rxqueue));
+ FREE(yid->rxqueue);
+ }
+
+ return pkt;
+}
+
+static void yahoo_yab_read(struct yab *yab, unsigned char *d, int len)
+{
+ char *st, *en;
+ char *data = (char *)d;
+ data[len]='\0';
+
+ DEBUG_MSG(("Got yab: %s", data));
+ st = en = strstr(data, "userid=\"");
+ if(st) {
+ st += strlen("userid=\"");
+ en = strchr(st, '"'); *en++ = '\0';
+ yab->id = yahoo_xmldecode(st);
+ }
+
+ st = strstr(en, "fname=\"");
+ if(st) {
+ st += strlen("fname=\"");
+ en = strchr(st, '"'); *en++ = '\0';
+ yab->fname = yahoo_xmldecode(st);
+ }
+
+ st = strstr(en, "lname=\"");
+ if(st) {
+ st += strlen("lname=\"");
+ en = strchr(st, '"'); *en++ = '\0';
+ yab->lname = yahoo_xmldecode(st);
+ }
+
+ st = strstr(en, "nname=\"");
+ if(st) {
+ st += strlen("nname=\"");
+ en = strchr(st, '"'); *en++ = '\0';
+ yab->nname = yahoo_xmldecode(st);
+ }
+
+ st = strstr(en, "email=\"");
+ if(st) {
+ st += strlen("email=\"");
+ en = strchr(st, '"'); *en++ = '\0';
+ yab->email = yahoo_xmldecode(st);
+ }
+
+ st = strstr(en, "hphone=\"");
+ if(st) {
+ st += strlen("hphone=\"");
+ en = strchr(st, '"'); *en++ = '\0';
+ yab->hphone = yahoo_xmldecode(st);
+ }
+
+ st = strstr(en, "wphone=\"");
+ if(st) {
+ st += strlen("wphone=\"");
+ en = strchr(st, '"'); *en++ = '\0';
+ yab->wphone = yahoo_xmldecode(st);
+ }
+
+ st = strstr(en, "mphone=\"");
+ if(st) {
+ st += strlen("mphone=\"");
+ en = strchr(st, '"'); *en++ = '\0';
+ yab->mphone = yahoo_xmldecode(st);
+ }
+
+ st = strstr(en, "dbid=\"");
+ if(st) {
+ st += strlen("dbid=\"");
+ en = strchr(st, '"'); *en++ = '\0';
+ yab->dbid = atoi(st);
+ }
+}
+
+static struct yab * yahoo_getyab(struct yahoo_input_data *yid)
+{
+ struct yab *yab = NULL;
+ int pos = 0, end=0;
+ struct yahoo_data *yd = yid->yd;
+
+ if(!yd)
+ return NULL;
+
+ //DEBUG_MSG(("rxlen is %d", yid->rxlen));
+
+ if(yid->rxlen <= strlen("<record"))
+ return NULL;
+
+ /* start with <record */
+ while(pos < yid->rxlen-strlen("<record")+1
+ && memcmp(yid->rxqueue + pos, "<record", strlen("<record")))
+ pos++;
+
+ if(pos >= yid->rxlen-1)
+ return NULL;
+
+ end = pos+2;
+ /* end with /> */
+ while(end < yid->rxlen-strlen("/>")+1 && memcmp(yid->rxqueue + end, "/>", strlen("/>")))
+ end++;
+
+ if(end >= yid->rxlen-1)
+ return NULL;
+
+ yab = y_new0(struct yab, 1);
+ yahoo_yab_read(yab, yid->rxqueue + pos, end+2-pos);
+
+
+ yid->rxlen -= end+1;
+ //DEBUG_MSG(("rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue));
+ if (yid->rxlen>0) {
+ unsigned char *tmp = (unsigned char *) y_memdup(yid->rxqueue + end + 1, yid->rxlen);
+ FREE(yid->rxqueue);
+ yid->rxqueue = tmp;
+ //DEBUG_MSG(("new rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue));
+ } else {
+ //DEBUG_MSG(("freed rxqueue == %p", yid->rxqueue));
+ FREE(yid->rxqueue);
+ }
+
+
+ return yab;
+}
+
+static char * yahoo_getwebcam_master(struct yahoo_input_data *yid)
+{
+ unsigned int pos=0;
+ int len=0;
+ unsigned int status=0;
+ char *server=NULL;
+ struct yahoo_data *yd = yid->yd;
+
+ if(!yid || !yd)
+ return NULL;
+
+ DEBUG_MSG(("rxlen is %d", yid->rxlen));
+
+ len = yid->rxqueue[pos++];
+ if (yid->rxlen < len)
+ return NULL;
+
+ /* extract status (0 = ok, 6 = webcam not online) */
+ status = yid->rxqueue[pos++];
+
+ if (status == 0)
+ {
+ pos += 2; /* skip next 2 bytes */
+ server = (char *) y_memdup(yid->rxqueue+pos, 16);
+ pos += 16;
+ }
+ else if (status == 6)
+ {
+ YAHOO_CALLBACK(ext_yahoo_webcam_closed)
+ (yd->client_id, yid->wcm->user, 4);
+ }
+
+ /* skip rest of the data */
+
+ yid->rxlen -= len;
+ DEBUG_MSG(("rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue));
+ if (yid->rxlen>0) {
+ unsigned char *tmp = (unsigned char *) y_memdup(yid->rxqueue + pos, yid->rxlen);
+ FREE(yid->rxqueue);
+ yid->rxqueue = tmp;
+ DEBUG_MSG(("new rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue));
+ } else {
+ DEBUG_MSG(("freed rxqueue == %p", yid->rxqueue));
+ FREE(yid->rxqueue);
+ }
+
+ return server;
+}
+
+static int yahoo_get_webcam_data(struct yahoo_input_data *yid)
+{
+ unsigned char reason=0;
+ int pos=0;
+ int begin=0;
+ int end=0;
+ unsigned int closed=0;
+ unsigned char header_len=0;
+ char *who;
+ int connect=0;
+ struct yahoo_data *yd = yid->yd;
+
+ if(!yd)
+ return -1;
+
+ if(!yid->wcm || !yid->wcd || !yid->rxlen)
+ return -1;
+
+ DEBUG_MSG(("rxlen is %d", yid->rxlen));
+
+ /* if we are not reading part of image then read header */
+ if (!yid->wcd->to_read)
+ {
+ header_len=yid->rxqueue[pos++];
+ yid->wcd->packet_type=0;
+
+ if (yid->rxlen < header_len)
+ return 0;
+
+ if (header_len >= 8)
+ {
+ reason = yid->rxqueue[pos++];
+ /* next 2 bytes should always be 05 00 */
+ pos += 2;
+ yid->wcd->data_size = yahoo_get32(yid->rxqueue + pos);
+ pos += 4;
+ yid->wcd->to_read = yid->wcd->data_size;
+ }
+ if (header_len >= 13)
+ {
+ yid->wcd->packet_type = yid->rxqueue[pos++];
+ yid->wcd->timestamp = yahoo_get32(yid->rxqueue + pos);
+ pos += 4;
+ }
+
+ /* skip rest of header */
+ pos = header_len;
+ }
+
+ begin = pos;
+ pos += yid->wcd->to_read;
+ if (pos > yid->rxlen) pos = yid->rxlen;
+
+ /* if it is not an image then make sure we have the whole packet */
+ if (yid->wcd->packet_type != 0x02) {
+ if ((pos - begin) != yid->wcd->data_size) {
+ yid->wcd->to_read = 0;
+ return 0;
+ } else {
+ yahoo_packet_dump(yid->rxqueue + begin, pos - begin);
+ }
+ }
+
+ DEBUG_MSG(("packet type %.2X, data length %d", yid->wcd->packet_type,
+ yid->wcd->data_size));
+
+ /* find out what kind of packet we got */
+ switch (yid->wcd->packet_type)
+ {
+ case 0x00:
+ /* user requests to view webcam (uploading) */
+ if (yid->wcd->data_size &&
+ yid->wcm->direction == YAHOO_WEBCAM_UPLOAD) {
+ end = begin;
+ while (end <= yid->rxlen &&
+ yid->rxqueue[end++] != 13);
+ if (end > begin)
+ {
+ who = (char *) y_memdup(yid->rxqueue + begin, end - begin);
+ who[end - begin - 1] = 0;
+ YAHOO_CALLBACK(ext_yahoo_webcam_viewer)(yd->client_id, who + 2, 2);
+ FREE(who);
+ }
+ }
+
+ if (yid->wcm->direction == YAHOO_WEBCAM_DOWNLOAD) {
+ /* timestamp/status field */
+ /* 0 = declined viewing permission */
+ /* 1 = accepted viewing permission */
+ if (yid->wcd->timestamp == 0) {
+ YAHOO_CALLBACK(ext_yahoo_webcam_closed)(yd->client_id, yid->wcm->user, 3);
+ }
+ }
+ break;
+ case 0x01: /* status packets?? */
+ /* timestamp contains status info */
+ /* 00 00 00 01 = we have data?? */
+ break;
+ case 0x02: /* image data */
+ YAHOO_CALLBACK(ext_yahoo_got_webcam_image)(yd->client_id,
+ yid->wcm->user, yid->rxqueue + begin,
+ yid->wcd->data_size, pos - begin,
+ yid->wcd->timestamp);
+ break;
+ case 0x05: /* response packets when uploading */
+ if (!yid->wcd->data_size) {
+ YAHOO_CALLBACK(ext_yahoo_webcam_data_request)(yd->client_id, yid->wcd->timestamp);
+ }
+ break;
+ case 0x07: /* connection is closing */
+ switch(reason)
+ {
+ case 0x01: /* user closed connection */
+ closed = 1;
+ break;
+ case 0x0F: /* user cancelled permission */
+ closed = 2;
+ break;
+ }
+ YAHOO_CALLBACK(ext_yahoo_webcam_closed)(yd->client_id, yid->wcm->user, closed);
+ break;
+ case 0x0C: /* user connected */
+ case 0x0D: /* user disconnected */
+ if (yid->wcd->data_size) {
+ who = (char *) y_memdup(yid->rxqueue + begin, pos - begin + 1);
+ who[pos - begin] = 0;
+ if (yid->wcd->packet_type == 0x0C)
+ connect=1;
+ else
+ connect=0;
+ YAHOO_CALLBACK(ext_yahoo_webcam_viewer)(yd->client_id, who, connect);
+ FREE(who);
+ }
+ break;
+ case 0x13: /* user data */
+ /* i=user_ip (ip of the user we are viewing) */
+ /* j=user_ext_ip (external ip of the user we */
+ /* are viewing) */
+ break;
+ case 0x17: /* ?? */
+ break;
+ }
+ yid->wcd->to_read -= pos - begin;
+
+ yid->rxlen -= pos;
+ DEBUG_MSG(("rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue));
+ if (yid->rxlen>0) {
+ unsigned char *tmp = (unsigned char *) y_memdup(yid->rxqueue + pos, yid->rxlen);
+ FREE(yid->rxqueue);
+ yid->rxqueue = tmp;
+ DEBUG_MSG(("new rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue));
+ } else {
+ DEBUG_MSG(("freed rxqueue == %p", yid->rxqueue));
+ FREE(yid->rxqueue);
+ }
+
+ /* If we read a complete packet return success */
+ if (!yid->wcd->to_read)
+ return 1;
+
+ return 0;
+}
+
+int yahoo_write_ready(int id, int fd, void *data)
+{
+ struct yahoo_input_data *yid = (struct yahoo_input_data *) data;
+ int len;
+ struct data_queue *tx;
+
+ LOG(("write callback: id=%d fd=%d data=%p", id, fd, data));
+ if(!yid || !yid->txqueues)
+ return -2;
+
+ tx = (struct data_queue *) yid->txqueues->data;
+ LOG(("writing %d bytes", tx->len));
+ len = yahoo_send_data(fd, (const char *)tx->queue, MIN(1024, tx->len));
+
+ if(len == -1 && errno == EAGAIN)
+ return 1;
+
+ if(len <= 0) {
+ int e = errno;
+ DEBUG_MSG(("len == %d (<= 0)", len));
+ while(yid->txqueues) {
+ YList *l=yid->txqueues;
+ tx = (struct data_queue *) l->data;
+ free(tx->queue);
+ free(tx);
+ yid->txqueues = y_list_remove_link(yid->txqueues, yid->txqueues);
+ y_list_free_1(l);
+ }
+ LOG(("yahoo_write_ready(%d, %d) len < 0", id, fd));
+ YAHOO_CALLBACK(ext_yahoo_remove_handler)(id, yid->write_tag);
+ yid->write_tag = 0;
+ errno=e;
+ return 0;
+ }
+
+
+ tx->len -= len;
+ //LOG(("yahoo_write_ready(%d, %d) tx->len: %d, len: %d", id, fd, tx->len, len));
+ if(tx->len > 0) {
+ unsigned char *tmp = (unsigned char *) y_memdup(tx->queue + len, tx->len);
+ FREE(tx->queue);
+ tx->queue = tmp;
+ } else {
+ YList *l=yid->txqueues;
+ free(tx->queue);
+ free(tx);
+ yid->txqueues = y_list_remove_link(yid->txqueues, yid->txqueues);
+ y_list_free_1(l);
+ if(!yid->txqueues) {
+ //LOG(("yahoo_write_ready(%d, %d) !txqueues", id, fd));
+ YAHOO_CALLBACK(ext_yahoo_remove_handler)(id, yid->write_tag);
+ yid->write_tag = 0;
+ }
+ }
+
+ return 1;
+}
+
+static void yahoo_process_pager_connection(struct yahoo_input_data *yid, int over)
+{
+ struct yahoo_packet *pkt;
+ struct yahoo_data *yd = yid->yd;
+ int id = yd->client_id;
+
+ if(over)
+ return;
+
+ while (find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER)
+ && (pkt = yahoo_getdata(yid)) != NULL) {
+
+ yahoo_packet_process(yid, pkt);
+
+ yahoo_packet_free(pkt);
+ }
+}
+
+static void yahoo_process_ft_connection(struct yahoo_input_data *yid, int over)
+{
+}
+
+static void yahoo_process_chatcat_connection(struct yahoo_input_data *yid, int over)
+{
+ if(over)
+ return;
+
+ if (strstr((char*)yid->rxqueue+(yid->rxlen-20), "</content>")) {
+ YAHOO_CALLBACK(ext_yahoo_chat_cat_xml)(yid->yd->client_id, (char*)yid->rxqueue);
+ }
+}
+
+static void yahoo_process_yab_connection(struct yahoo_input_data *yid, int over)
+{
+ struct yahoo_data *yd = yid->yd;
+ struct yab *yab;
+ YList *buds;
+ //int changed=0;
+ int id = yd->client_id;
+ BOOL yab_used = FALSE;
+
+ LOG(("yahoo_process_yab_connection(over = %d) ", over));
+ if(over) {
+ YAHOO_CALLBACK(ext_yahoo_got_buddies)(yd->client_id, yd->buddies);
+ return;
+ }
+
+ while(find_input_by_id_and_type(id, YAHOO_CONNECTION_YAB)
+ && (yab = yahoo_getyab(yid)) != NULL) {
+ if(!yab->id)
+ continue;
+
+ //changed=1;
+ yab_used = FALSE;
+ for(buds = yd->buddies; buds; buds=buds->next) {
+ struct yahoo_buddy * bud = (struct yahoo_buddy *) buds->data;
+
+ if(!strcmp(bud->id, yab->id)) {
+ yab_used = TRUE;
+ bud->yab_entry = yab;
+ if(yab->nname) {
+ bud->real_name = strdup(yab->nname);
+ } else if(yab->fname && yab->lname) {
+ bud->real_name = y_new0(char,
+ strlen(yab->fname)+
+ strlen(yab->lname)+2
+ );
+ sprintf(bud->real_name, "%s %s",
+ yab->fname, yab->lname);
+ } else if(yab->fname) {
+ bud->real_name = strdup(yab->fname);
+ }
+ break; /* for */
+ }
+ }
+
+ if (!yab_used)
+ {
+ //need to free the yab entry
+ FREE(yab->fname);
+ FREE(yab->lname);
+ FREE(yab->nname);
+ FREE(yab->id);
+ FREE(yab->email);
+ FREE(yab->hphone);
+ FREE(yab->wphone);
+ FREE(yab->mphone);
+ FREE(yab);
+ }
+
+ }
+
+ //if(changed)
+ // YAHOO_CALLBACK(ext_yahoo_got_buddies)(yd->client_id, yd->buddies);
+}
+
+static void yahoo_process_search_connection(struct yahoo_input_data *yid, int over)
+{
+ struct yahoo_found_contact *yct=NULL;
+ char *p = (char *)yid->rxqueue, *np, *cp;
+ int k, n;
+ int start=0, found=0, total=0;
+ YList *contacts=NULL;
+ struct yahoo_input_data *pyid;
+
+ LOG(("[yahoo_process_search_connection] over:%d", over));
+
+ pyid = find_input_by_id_and_type(yid->yd->client_id, YAHOO_CONNECTION_PAGER);
+
+ if(!over || !pyid) {
+ LOG(("yahoo_process_search_connection] ?? Not Done yet? Waiting for more packets!"));
+ return;
+ }
+
+ if(p && (p=strstr(p, "\r\n\r\n"))) {
+ p += 4;
+
+ for(k = 0; (p = strchr(p, 4)) && (k < 4); k++) {
+ p++;
+ n = atoi(p);
+ switch(k) {
+ case 0: found = pyid->ys->lsearch_nfound = n; break;
+ case 2: start = pyid->ys->lsearch_nstart = n; break;
+ case 3: total = pyid->ys->lsearch_ntotal = n; break;
+ }
+ }
+
+ if(p)
+ p++;
+
+ k=0;
+ while(p && *p) {
+ cp = p;
+ np = strchr(p, 4);
+
+ if(!np)
+ break;
+ *np = 0;
+ p = np+1;
+
+ switch(k++) {
+ case 1:
+ if(strlen(cp) > 2 && y_list_length(contacts) < total) {
+ yct = y_new0(struct yahoo_found_contact, 1);
+ contacts = y_list_append(contacts, yct);
+ yct->id = cp+2;
+ } else {
+ *p = 0;
+ }
+ break;
+ case 2:
+ yct->online = !strcmp(cp, "2") ? 1 : 0;
+ break;
+ case 3:
+ yct->gender = cp;
+ break;
+ case 4:
+ yct->age = atoi(cp);
+ break;
+ case 5:
+ if(cp != "\005")
+ yct->location = cp;
+ k = 0;
+ break;
+ }
+ }
+ }
+
+ YAHOO_CALLBACK(ext_yahoo_got_search_result)(yid->yd->client_id, found, start, total, contacts);
+
+ while(contacts) {
+ YList *node = contacts;
+ contacts = y_list_remove_link(contacts, node);
+ free(node->data);
+ y_list_free_1(node);
+ }
+}
+
+static void _yahoo_webcam_connected(int fd, int error, void *d)
+{
+ struct yahoo_input_data *yid = (struct yahoo_input_data *) d;
+ struct yahoo_webcam * wcm = yid->wcm;
+ struct yahoo_data * yd = yid->yd;
+ char conn_type[100];
+ char *data=NULL;
+ char *packet=NULL;
+ unsigned char magic_nr[] = {1, 0, 0, 0, 1};
+ unsigned header_len=0;
+ unsigned int len=0;
+ unsigned int pos=0;
+
+ if(error || fd <= 0) {
+ FREE(yid);
+ return;
+ }
+
+ yid->fd = fd;
+ inputs = y_list_prepend(inputs, yid);
+
+ LOG(("Connected"));
+ /* send initial packet */
+ switch (wcm->direction)
+ {
+ case YAHOO_WEBCAM_DOWNLOAD:
+ data = strdup("<REQIMG>");
+ break;
+ case YAHOO_WEBCAM_UPLOAD:
+ data = strdup("<SNDIMG>");
+ break;
+ default:
+ return;
+ }
+ yahoo_add_to_send_queue(yid, data, strlen(data));
+ FREE(data);
+
+ /* send data */
+ switch (wcm->direction)
+ {
+ case YAHOO_WEBCAM_DOWNLOAD:
+ header_len = 8;
+ data = strdup("a=2\r\nc=us\r\ne=21\r\nu=");
+ data = y_string_append(data, yd->user);
+ data = y_string_append(data, "\r\nt=");
+ data = y_string_append(data, wcm->key);
+ data = y_string_append(data, "\r\ni=");
+ data = y_string_append(data, wcm->my_ip);
+ data = y_string_append(data, "\r\ng=");
+ data = y_string_append(data, wcm->user);
+ data = y_string_append(data, "\r\no=w-2-5-1\r\np=");
+ snprintf(conn_type, sizeof(conn_type), "%d", wcm->conn_type);
+ data = y_string_append(data, conn_type);
+ data = y_string_append(data, "\r\n");
+ break;
+ case YAHOO_WEBCAM_UPLOAD:
+ header_len = 13;
+ data = strdup("a=2\r\nc=us\r\nu=");
+ data = y_string_append(data, yd->user);
+ data = y_string_append(data, "\r\nt=");
+ data = y_string_append(data, wcm->key);
+ data = y_string_append(data, "\r\ni=");
+ data = y_string_append(data, wcm->my_ip);
+ data = y_string_append(data, "\r\no=w-2-5-1\r\np=");
+ snprintf(conn_type, sizeof(conn_type), "%d", wcm->conn_type);
+ data = y_string_append(data, conn_type);
+ data = y_string_append(data, "\r\nb=");
+ data = y_string_append(data, wcm->description);
+ data = y_string_append(data, "\r\n");
+ break;
+ }
+
+ len = strlen(data);
+ packet = y_new0(char, header_len + len);
+ packet[pos++] = header_len;
+ packet[pos++] = 0;
+ switch (wcm->direction)
+ {
+ case YAHOO_WEBCAM_DOWNLOAD:
+ packet[pos++] = 1;
+ packet[pos++] = 0;
+ break;
+ case YAHOO_WEBCAM_UPLOAD:
+ packet[pos++] = 5;
+ packet[pos++] = 0;
+ break;
+ }
+
+ pos += yahoo_put32(packet + pos, len);
+ if (wcm->direction == YAHOO_WEBCAM_UPLOAD)
+ {
+ memcpy(packet + pos, magic_nr, sizeof(magic_nr));
+ pos += sizeof(magic_nr);
+ }
+ memcpy(packet + pos, data, len);
+ yahoo_add_to_send_queue(yid, packet, header_len + len);
+ FREE(packet);
+ FREE(data);
+
+ yid->read_tag=YAHOO_CALLBACK(ext_yahoo_add_handler)(yid->yd->client_id, yid->fd, YAHOO_INPUT_READ, yid);
+}
+
+static void yahoo_webcam_connect(struct yahoo_input_data *y)
+{
+ struct yahoo_webcam *wcm = y->wcm;
+ struct yahoo_input_data *yid;
+ struct yahoo_server_settings *yss;
+
+ if (!wcm || !wcm->server || !wcm->key)
+ return;
+
+ yid = y_new0(struct yahoo_input_data, 1);
+ yid->type = YAHOO_CONNECTION_WEBCAM;
+ yid->yd = y->yd;
+
+ /* copy webcam data to new connection */
+ yid->wcm = y->wcm;
+ y->wcm = NULL;
+
+ yss = y->yd->server_settings;
+
+ yid->wcd = y_new0(struct yahoo_webcam_data, 1);
+
+ LOG(("Connecting to: %s:%d", wcm->server, wcm->port));
+ YAHOO_CALLBACK(ext_yahoo_connect_async)(y->yd->client_id, wcm->server, wcm->port, yid->type,
+ _yahoo_webcam_connected, yid);
+
+}
+
+static void yahoo_process_webcam_master_connection(struct yahoo_input_data *yid, int over)
+{
+ char* server;
+ struct yahoo_server_settings *yss;
+
+ if(over)
+ return;
+
+ server = yahoo_getwebcam_master(yid);
+
+ if (server)
+ {
+ yss = yid->yd->server_settings;
+ yid->wcm->server = strdup(server);
+ yid->wcm->port = yss->webcam_port;
+ yid->wcm->conn_type = yss->conn_type;
+ yid->wcm->my_ip = strdup(yss->local_host);
+ if (yid->wcm->direction == YAHOO_WEBCAM_UPLOAD)
+ yid->wcm->description = strdup(yss->webcam_description);
+ yahoo_webcam_connect(yid);
+ FREE(server);
+ }
+}
+
+static void yahoo_process_webcam_connection(struct yahoo_input_data *yid, int over)
+{
+ int id = yid->yd->client_id;
+ int fd = yid->fd;
+
+ if(over)
+ return;
+
+ /* as long as we still have packets available keep processing them */
+ while (find_input_by_id_and_fd(id, fd)
+ && yahoo_get_webcam_data(yid) == 1);
+}
+
+static void (*yahoo_process_connection[])(struct yahoo_input_data *, int over) = {
+ yahoo_process_pager_connection,
+ yahoo_process_ft_connection,
+ yahoo_process_yab_connection,
+ yahoo_process_webcam_master_connection,
+ yahoo_process_webcam_connection,
+ yahoo_process_chatcat_connection,
+ yahoo_process_search_connection
+};
+
+int yahoo_read_ready(int id, int fd, void *data)
+{
+ struct yahoo_input_data *yid = (struct yahoo_input_data *) data;
+ struct yahoo_server_settings *yss;
+ char buf[4096];
+ int len;
+
+ //LOG(("read callback: id=%d fd=%d data=%p", id, fd, data));
+ if(!yid)
+ return -2;
+
+
+ do {
+ len = read(fd, buf, sizeof(buf));
+
+ //LOG(("read callback: id=%d fd=%d len=%d", id, fd, len));
+
+ } while(len == -1 && errno == EINTR);
+
+ if(len == -1 && errno == EAGAIN) /* we'll try again later */
+ return 1;
+
+ if (len <= 0) {
+ int e = errno;
+ DEBUG_MSG(("len == %d (<= 0)", len));
+
+ if(yid->type == YAHOO_CONNECTION_PAGER) {
+
+ if (yid->yd) {
+ // need this to handle live connection with web_messenger set
+ yss = yid->yd->server_settings;
+
+ if (yss && yss->web_messenger && len == 0)
+ return 1; // try again later.. just nothing here yet
+ }
+
+ YAHOO_CALLBACK(ext_yahoo_error)(yid->yd->client_id, "Connection closed by server", 1, E_CONNECTION);
+ }
+
+ yahoo_process_connection[yid->type](yid, 1);
+ yahoo_input_close(yid);
+
+ /* no need to return an error, because we've already fixed it */
+ if(len == 0)
+ return 1;
+
+ errno=e;
+ LOG(("read error: %s", strerror(errno)));
+ return -1;
+ }
+
+ yid->rxqueue = y_renew(unsigned char, yid->rxqueue, len + yid->rxlen + 1);
+ memcpy(yid->rxqueue + yid->rxlen, buf, len);
+ yid->rxlen += len;
+ yid->rxqueue[yid->rxlen] = 0; // zero terminate
+
+ yahoo_process_connection[yid->type](yid, 0);
+
+ return len;
+}
+
+int yahoo_init_with_attributes(const char *username, const char *password, const char *pw_token, ...)
+{
+ va_list ap;
+ struct yahoo_data *yd;
+ char *c;
+
+ yd = y_new0(struct yahoo_data, 1);
+
+ if(!yd)
+ return 0;
+
+ yd->user = strdup(username);
+
+ /* we need to strip out @yahoo.com in case a user enters full e-mail address.
+ NOTE: Not sure what other domains to strip out as well
+ */
+ c = strstr(yd->user, "@yahoo.com");
+
+ if (c != NULL)
+ (*c) = '\0';
+
+ /**
+ * Lower case it in case a user uses different/mixed case
+ */
+ strlwr(yd->user);
+
+ yd->password = strdup(password);
+ yd->pw_token = (pw_token != NULL && pw_token[0] != '\0') ? strdup(pw_token) : NULL;
+
+ yd->initial_status = YAHOO_STATUS_OFFLINE;
+ yd->current_status = YAHOO_STATUS_OFFLINE;
+
+ yd->client_id = ++last_id;
+
+ add_to_list(yd);
+
+ va_start(ap, pw_token);
+ yd->server_settings = _yahoo_assign_server_settings(ap);
+ va_end(ap);
+
+ yd->ignore = yd->buddies = NULL;
+ yd->ygrp = NULL;
+
+ return yd->client_id;
+}
+
+int yahoo_init(const char *username, const char *password, const char *pw_token)
+{
+ return yahoo_init_with_attributes(username, password, pw_token, NULL);
+}
+
+struct connect_callback_data {
+ struct yahoo_data *yd;
+ int tag;
+ int i;
+ int type;
+};
+
+static void yahoo_connected(int fd, int error, void *data)
+{
+ struct connect_callback_data *ccd = (struct connect_callback_data *) data;
+ struct yahoo_data *yd = ccd->yd;
+ struct yahoo_packet *pkt;
+ struct yahoo_input_data *yid;
+ struct yahoo_server_settings *yss = yd->server_settings;
+
+ if(error) {
+ if(ccd->type == YAHOO_CONNECTION_PAGER && fallback_ports[ccd->i]) {
+ int tag;
+ yss->pager_port = fallback_ports[ccd->i++];
+
+ LOG(("[yahoo_connected] Trying port %d", yss->pager_port));
+
+ tag = YAHOO_CALLBACK(ext_yahoo_connect_async)(yd->client_id, yss->pager_host, yss->pager_port,
+ ccd->type, yahoo_connected, ccd);
+
+ if(tag > 0)
+ ccd->tag=tag;
+ } else {
+ LOG(("[yahoo_connected] No More ports or wrong type?"));
+
+ FREE(ccd);
+ YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_SOCK, NULL);
+ }
+ return;
+ }
+
+ FREE(ccd);
+
+ /* fd < 0 && error == 0 means connect was cancelled */
+ if(fd < 0)
+ return;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_VERIFY, YPACKET_STATUS_DEFAULT, 0);
+
+ yid = y_new0(struct yahoo_input_data, 1);
+ yid->yd = yd;
+ yid->fd = fd;
+ inputs = y_list_prepend(inputs, yid);
+
+ yahoo_send_packet(yid, pkt, 0);
+
+ yahoo_packet_free(pkt);
+
+ yid->read_tag=YAHOO_CALLBACK(ext_yahoo_add_handler)(yid->yd->client_id, yid->fd, YAHOO_INPUT_READ, yid);
+}
+
+void yahoo_login(int id, enum yahoo_status initial)
+{
+ struct yahoo_data *yd = find_conn_by_id(id);
+ struct connect_callback_data *ccd;
+ struct yahoo_server_settings *yss;
+
+ LOG(("[yahoo_login] id: %d, initial status: %d", id, initial));
+
+ if(!yd)
+ return;
+
+ yss = yd->server_settings;
+
+ yd->initial_status = initial;
+
+ ccd = y_new0(struct connect_callback_data, 1);
+ ccd->yd = yd;
+ ccd->type = YAHOO_CONNECTION_PAGER;
+ YAHOO_CALLBACK(ext_yahoo_connect_async)(yd->client_id, yss->pager_host, yss->pager_port, YAHOO_CONNECTION_PAGER,
+ yahoo_connected, ccd);
+}
+
+
+int yahoo_get_fd(int id)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ if(!yid)
+ return 0;
+ else
+ return yid->fd;
+}
+
+void yahoo_send_im(int id, const char *from, const char *who, int protocol, const char *msg, int utf8, int buddy_icon)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_packet *pkt = NULL;
+ struct yahoo_data *yd;
+ struct yahoo_server_settings *yss;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+ yss = yd->server_settings;
+ pkt = yahoo_packet_new(YAHOO_SERVICE_MESSAGE, YPACKET_STATUS_OFFLINE, yd->session_id);
+
+ if(from && strcmp(from, yd->user))
+ yahoo_packet_hash(pkt, 0, yd->user);
+ yahoo_packet_hash(pkt, 1, from?from:yd->user);
+ yahoo_packet_hash(pkt, 5, who);
+
+ if(utf8)
+ yahoo_packet_hash(pkt, 97, "1");
+
+ yahoo_packet_hash(pkt, 14, msg);
+
+
+ /* GAIM does doodle so they allow/enable imvironments (that get rejected?)
+ 63 - imvironment string;11
+ 64 - imvironment enabled/allowed
+ 0 - enabled imwironment ;0 - no imvironment
+ 2 - disabled '' - empty cause we don;t do these
+ */
+ yahoo_packet_hash(pkt, 63, ""); /* imvironment name; or ;0 (doodle;11)*/
+ yahoo_packet_hash(pkt, 64, "2");
+
+ //if (!yss->web_messenger) {
+ //yahoo_packet_hash(pkt, 1002, "1"); /* YIM6+ */
+ /*
+ * So yahoo swallows the packet if I sent this now?? WTF?? Taking it out
+ */
+ //yahoo_packet_hash(pkt, 10093, "4"); /* YIM7? */
+ //}
+
+ yahoo_packet_hash_int(pkt, 206, buddy_icon); /* buddy_icon, 0 = none, 1=avatar?, 2=picture */
+
+ if (protocol != 0)
+ yahoo_packet_hash_int(pkt, 241, protocol);
+
+ if (yss->web_messenger) {
+ yahoo_packet_hash(pkt, 0, yd->user);
+ yahoo_packet_hash_int(pkt, 24, yd->session_timestamp);
+ }
+
+ yahoo_send_packet(yid, pkt, 0);
+
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_send_typing(int id, const char *from, const char *who, int protocol, int typ)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+ struct yahoo_server_settings *yss;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+ yss = yd->server_settings;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_NOTIFY, YPACKET_STATUS_NOTIFY, yd->session_id);
+
+ yahoo_packet_hash(pkt, 49, "TYPING");
+ yahoo_packet_hash(pkt, 1, from?from:yd->user);
+ yahoo_packet_hash(pkt, 14, " ");
+ yahoo_packet_hash(pkt, 13, typ ? "1" : "0");
+ yahoo_packet_hash(pkt, 5, who);
+
+ if (protocol != 0)
+ yahoo_packet_hash_int(pkt, 241, protocol);
+
+ if (yss->web_messenger) {
+ yahoo_packet_hash(pkt, 0, yd->user);
+ yahoo_packet_hash_int(pkt, 24, yd->session_timestamp);
+ //} else {
+ //yahoo_packet_hash(pkt, 1002, "1"); /* YIM6+ */
+ //yahoo_packet_hash(pkt, 10093, "4"); /* YIM7+ */
+ }
+
+ yahoo_send_packet(yid, pkt, 0);
+
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_set_away(int id, enum yahoo_status state, const char *msg, int away)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+ struct yahoo_server_settings *yss;
+ //int service;
+ enum yahoo_status cs;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+
+ //if (yd->current_status == state && state != YAHOO_STATUS_CUSTOM)
+ // return;
+
+ cs = yd->current_status;
+ yss = yd->server_settings;
+
+ if (state == YAHOO_STATUS_INVISIBLE) {
+ pkt = yahoo_packet_new(YAHOO_SERVICE_Y6_VISIBLE_TOGGLE, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 13, "2");
+ yd->current_status = state;
+ } else {
+ LOG(("yahoo_set_away: state: %d, msg: %s, away: %d", state, msg, away));
+
+ if (msg) {
+ yd->current_status = YAHOO_STATUS_CUSTOM;
+ } else {
+ yd->current_status = state;
+ }
+
+ //if (yd->current_status == YAHOO_STATUS_AVAILABLE)
+ // service = YAHOO_SERVICE_ISBACK;
+ //else
+ // service = YAHOO_SERVICE_ISAWAY;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_Y6_STATUS_UPDATE, YPACKET_STATUS_DEFAULT, yd->session_id);
+ if ((away == 2) && (yd->current_status == YAHOO_STATUS_AVAILABLE)) {
+ //pkt = yahoo_packet_new(YAHOO_SERVICE_ISAWAY, YAHOO_STATUS_BRB, yd->session_id);
+ yahoo_packet_hash(pkt, 10, "999");
+ yahoo_packet_hash(pkt, 47, "2");
+ }else {
+ //pkt = yahoo_packet_new(YAHOO_SERVICE_YAHOO6_STATUS_UPDATE, YAHOO_STATUS_AVAILABLE, yd->session_id);
+ yahoo_packet_hash_int(pkt, 10, yd->current_status);
+
+ if (yd->current_status == YAHOO_STATUS_CUSTOM) {
+ yahoo_packet_hash(pkt, 19, msg);
+ yahoo_packet_hash(pkt, 97, "1");
+ yahoo_packet_hash(pkt, 47, (away == 2)? "2": (away) ?"1":"0");
+ yahoo_packet_hash(pkt, 187, "0"); // ???
+ } else {
+ yahoo_packet_hash(pkt, 19, "");
+ yahoo_packet_hash(pkt, 97, "1");
+ //yahoo_packet_hash(pkt, 47, (away == 2)? "2": (away) ?"1":"0");
+ }
+
+
+
+ }
+ }
+ if (yss->web_messenger) {
+ yahoo_packet_hash(pkt, 0, yd->user);
+ yahoo_packet_hash_int(pkt, 24, yd->session_timestamp);
+ }
+
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+
+ if (cs == YAHOO_STATUS_INVISIBLE && state != YAHOO_STATUS_INVISIBLE){
+ pkt = yahoo_packet_new(YAHOO_SERVICE_Y6_VISIBLE_TOGGLE, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 13, "1");
+ yd->current_status = state;
+
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+ }
+}
+
+void yahoo_set_stealth(int id, const char *buddy, int protocol, int add)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+ //int service;
+ //char s[4];
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_STEALTH_PERM, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 31, add ? "1" : "2"); /*visibility? */
+ yahoo_packet_hash(pkt, 13, "2"); // function/service
+
+ yahoo_packet_hash(pkt, 302, "319");
+ yahoo_packet_hash(pkt, 300, "319");
+
+ yahoo_packet_hash(pkt, 7, buddy);
+
+ if (protocol != 0)
+ yahoo_packet_hash_int(pkt, 241, protocol);
+
+ yahoo_packet_hash(pkt, 301, "319");
+ yahoo_packet_hash(pkt, 303, "319");
+
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_logoff(int id)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+
+ if(!yid)
+ return;
+ yd = yid->yd;
+
+ LOG(("yahoo_logoff: current status: %d", yd->current_status));
+
+ if(yd->current_status != YAHOO_STATUS_OFFLINE) {
+ struct yahoo_server_settings *yss = yd->server_settings;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_LOGOFF, YPACKET_STATUS_DEFAULT, yd->session_id);
+
+ if (yss->web_messenger) {
+ yahoo_packet_hash(pkt, 0, yd->user);
+ yahoo_packet_hash_int(pkt, 24, yd->session_timestamp);
+ }
+
+ yd->current_status = YAHOO_STATUS_OFFLINE;
+
+ if (pkt) {
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+ }
+ }
+
+
+/* do {
+ yahoo_input_close(yid);
+ } while((yid = find_input_by_id(id)));*/
+
+}
+
+void yahoo_get_list(int id)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+
+ if(!yid)
+ return;
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_LIST, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, yd->user);
+ if (pkt) {
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+ }
+}
+
+static void _yahoo_http_connected(int id, int fd, int error, void *data)
+{
+ struct yahoo_input_data *yid = (struct yahoo_input_data *) data;
+ if(fd <= 0) {
+ inputs = y_list_remove(inputs, yid);
+ FREE(yid);
+ return;
+ }
+
+ yid->fd = fd;
+ yid->read_tag=YAHOO_CALLBACK(ext_yahoo_add_handler)(yid->yd->client_id, fd, YAHOO_INPUT_READ, yid);
+}
+
+void yahoo_get_yab(int id)
+{
+ struct yahoo_data *yd = find_conn_by_id(id);
+ struct yahoo_input_data *yid;
+ char url[1024];
+ char buff[1024];
+
+ if(!yd)
+ return;
+
+ yid = y_new0(struct yahoo_input_data, 1);
+ yid->yd = yd;
+ yid->type = YAHOO_CONNECTION_YAB;
+
+ snprintf(url, 1024, "http://insider.msg.yahoo.com/ycontent/?ab2=0");
+
+ snprintf(buff, sizeof(buff), "Y=%s; T=%s",
+ yd->cookie_y, yd->cookie_t);
+
+ inputs = y_list_prepend(inputs, yid);
+
+ //yahoo_http_get(yid->yd->client_id, url, buff,
+ // _yahoo_http_connected, yid);
+ YAHOO_CALLBACK(ext_yahoo_send_http_request)(yid->yd->client_id, YAHOO_CONNECTION_YAB, "GET", url, buff, 0,
+ _yahoo_http_connected, yid);
+}
+
+void yahoo_set_yab(int id, struct yab * yab)
+{
+ struct yahoo_data *yd = find_conn_by_id(id);
+ struct yahoo_input_data *yid;
+ char url[1024];
+ char buff[1024];
+ char *temp;
+ int size = sizeof(url)-1;
+
+ if(!yd)
+ return;
+
+ yid = y_new0(struct yahoo_input_data, 1);
+ yid->type = YAHOO_CONNECTION_YAB;
+ yid->yd = yd;
+
+ strncpy(url, "http://insider.msg.yahoo.com/ycontent/?addab2=0", size);
+
+ if(yab->dbid) {
+ /* change existing yab */
+ char tmp[32];
+ strncat(url, "&ee=1&ow=1&id=", size - strlen(url));
+ snprintf(tmp, sizeof(tmp), "%d", yab->dbid);
+ strncat(url, tmp, size - strlen(url));
+ }
+
+ if(yab->fname) {
+ strncat(url, "&fn=", size - strlen(url));
+ temp = yahoo_urlencode(yab->fname);
+ strncat(url, temp, size - strlen(url));
+ free(temp);
+ }
+ if(yab->lname) {
+ strncat(url, "&ln=", size - strlen(url));
+ temp = yahoo_urlencode(yab->lname);
+ strncat(url, temp, size - strlen(url));
+ free(temp);
+ }
+ strncat(url, "&yid=", size - strlen(url));
+ temp = yahoo_urlencode(yab->id);
+ strncat(url, temp, size - strlen(url));
+ free(temp);
+ if(yab->nname) {
+ strncat(url, "&nn=", size - strlen(url));
+ temp = yahoo_urlencode(yab->nname);
+ strncat(url, temp, size - strlen(url));
+ free(temp);
+ }
+ if(yab->email) {
+ strncat(url, "&e=", size - strlen(url));
+ temp = yahoo_urlencode(yab->email);
+ strncat(url, temp, size - strlen(url));
+ free(temp);
+ }
+ if(yab->hphone) {
+ strncat(url, "&hp=", size - strlen(url));
+ temp = yahoo_urlencode(yab->hphone);
+ strncat(url, temp, size - strlen(url));
+ free(temp);
+ }
+ if(yab->wphone) {
+ strncat(url, "&wp=", size - strlen(url));
+ temp = yahoo_urlencode(yab->wphone);
+ strncat(url, temp, size - strlen(url));
+ free(temp);
+ }
+ if(yab->mphone) {
+ strncat(url, "&mp=", size - strlen(url));
+ temp = yahoo_urlencode(yab->mphone);
+ strncat(url, temp, size - strlen(url));
+ free(temp);
+ }
+ strncat(url, "&pp=0", size - strlen(url));
+
+ snprintf(buff, sizeof(buff), "Y=%s; T=%s",
+ yd->cookie_y, yd->cookie_t);
+
+ inputs = y_list_prepend(inputs, yid);
+
+// yahoo_http_get(yid->yd->client_id, url, buff,
+// _yahoo_http_connected, yid);
+
+ YAHOO_CALLBACK(ext_yahoo_send_http_request)(yid->yd->client_id, YAHOO_CONNECTION_YAB, "GET", url, buff, 0,
+ _yahoo_http_connected, yid);
+}
+
+void yahoo_set_identity_status(int id, const char * identity, int active)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+
+ if(!yid)
+ return;
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(active?YAHOO_SERVICE_IDACT:YAHOO_SERVICE_IDDEACT,
+ YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 3, identity);
+ if (pkt) {
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+ }
+}
+
+void yahoo_refresh(int id)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+
+ if(!yid)
+ return;
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_USERSTAT, YPACKET_STATUS_DEFAULT, yd->session_id);
+ if (pkt) {
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+ }
+}
+
+void yahoo_send_ping(int id)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt=NULL;
+ if(!yid)
+ return;
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_PING, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_keepalive(int id)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt=NULL;
+ if(!yid)
+ return;
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_KEEPALIVE, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 0, yd->user);
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_chat_keepalive (int id)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type (id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+
+ if (!yid)
+ return;
+
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new (YAHOO_SERVICE_CHATPING, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_send_packet (yid, pkt, 0);
+ yahoo_packet_free (pkt);
+}
+
+void yahoo_add_buddy(int id, const char *fname, const char *lname, const char *who, int protocol, const char *group, const char *msg)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt;
+
+ if(!yid)
+ return;
+ yd = yid->yd;
+
+ if (!yd->logged_in)
+ return;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 14, (msg != NULL) ? msg : "");
+ yahoo_packet_hash(pkt, 65, group);
+ yahoo_packet_hash(pkt, 97, "1");
+
+ if (fname != NULL)
+ yahoo_packet_hash(pkt, 216, fname);
+
+ if (lname != NULL)
+ yahoo_packet_hash(pkt, 254, lname);
+
+ yahoo_packet_hash(pkt, 1, yd->user); // identity with which we are adding the user.
+ yahoo_packet_hash(pkt, 302, "319");
+ yahoo_packet_hash(pkt, 300, "319");
+ yahoo_packet_hash(pkt, 7, who);
+ //yahoo_packet_hash(pkt, 334, "0");
+
+ if (protocol != 0){
+ yahoo_packet_hash_int(pkt, 241, protocol);
+ }
+
+ yahoo_packet_hash(pkt, 301, "319");
+ yahoo_packet_hash(pkt, 303, "319");
+
+
+ /* YIM7 does something weird here:
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 14, msg != NULL ? msg : "");
+ yahoo_packet_hash(pkt, 65, group);
+ yahoo_packet_hash(pkt, 97, 1); ?????
+ yahoo_packet_hash(pkt, 216, "First Name");???
+ yahoo_packet_hash(pkt, 254, "Last Name");???
+ yahoo_packet_hash(pkt, 7, who);
+
+ Server Replies with:
+ 1: ID
+ 66: 0
+ 7: who
+ 65: group
+ 223: 1 ??
+ */
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_remove_buddy(int id, const char *who, int protocol, const char *group)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+
+ if(!yid)
+ return;
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_REMBUDDY, YPACKET_STATUS_DEFAULT, yd->session_id);
+
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 7, who);
+ yahoo_packet_hash(pkt, 65, group);
+ //yahoo_packet_hash(pkt, 66, "0"); // Yahoo 9.0 does login status 0?? What for?
+
+ if (protocol != 0)
+ yahoo_packet_hash_int(pkt, 241, protocol);
+
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_accept_buddy(int id, const char *who, int protocol)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt;
+
+ if(!yid)
+ return;
+ yd = yid->yd;
+
+ if (!yd->logged_in)
+ return;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_AUTHORIZATION, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 5, who);
+
+ if (protocol != 0)
+ yahoo_packet_hash_int(pkt, 241, protocol);
+
+ yahoo_packet_hash(pkt, 13, "1"); // Accept Authorization
+
+ // Y8 also send 334: 0 - I guess that's the protocol stuff
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_reject_buddy(int id, const char *who, int protocol, const char *msg)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt;
+
+ if(!yid)
+ return;
+ yd = yid->yd;
+
+ if (!yd->logged_in)
+ return;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_AUTHORIZATION, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 5, who);
+ yahoo_packet_hash(pkt, 13, "2"); // Reject Authorization
+
+ if (msg != NULL)
+ yahoo_packet_hash(pkt, 14, msg);
+
+ if (protocol != 0)
+ yahoo_packet_hash_int(pkt, 241, protocol);
+
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_ignore_buddy(int id, const char *who, int unignore)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt;
+
+ if(!yid)
+ return;
+ yd = yid->yd;
+
+ if (!yd->logged_in)
+ return;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_IGNORECONTACT, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 7, who);
+ yahoo_packet_hash(pkt, 13, unignore?"2":"1");
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_change_buddy_group(int id, const char *who, const char *old_group, const char *new_group)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+
+ if(!yid)
+ return;
+ yd = yid->yd;
+
+ /*pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 7, who);
+ yahoo_packet_hash(pkt, 14, "");
+ yahoo_packet_hash(pkt, 65, new_group);
+ yahoo_packet_hash(pkt, 97, "1");
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_REMBUDDY, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 7, who);
+ yahoo_packet_hash(pkt, 65, old_group);
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);*/
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_CHANGE_GROUP, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 302, "240"); //???
+ yahoo_packet_hash(pkt, 300, "240"); //???
+ yahoo_packet_hash(pkt, 7, who);
+ yahoo_packet_hash(pkt, 224, old_group);
+ yahoo_packet_hash(pkt, 264, new_group);
+ yahoo_packet_hash(pkt, 301, "240"); //???
+ yahoo_packet_hash(pkt, 303, "240"); //???
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_group_rename(int id, const char *old_group, const char *new_group)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+
+ if(!yid)
+ return;
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_GROUPRENAME, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 65, old_group);
+ yahoo_packet_hash(pkt, 67, new_group);
+
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_conference_addinvite(int id, const char * from, const char *who, const char *room, const YList * members, const char *msg)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt;
+
+ if(!yid)
+ return;
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_CONFADDINVITE, YPACKET_STATUS_DEFAULT, yd->session_id);
+
+ yahoo_packet_hash(pkt, 1, (from?from:yd->user));
+ yahoo_packet_hash(pkt, 51, who);
+ yahoo_packet_hash(pkt, 57, room);
+ yahoo_packet_hash(pkt, 58, msg);
+ yahoo_packet_hash(pkt, 13, "0");
+ for(; members; members = members->next) {
+ yahoo_packet_hash(pkt, 52, (char *)members->data);
+ yahoo_packet_hash(pkt, 53, (char *)members->data);
+ }
+ /* 52, 53 -> other members? */
+
+ yahoo_send_packet(yid, pkt, 0);
+
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_conference_invite(int id, const char * from, YList *who, const char *room, const char *msg)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt;
+
+ if(!yid)
+ return;
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_CONFINVITE, YPACKET_STATUS_DEFAULT, yd->session_id);
+
+ yahoo_packet_hash(pkt, 1, (from?from:yd->user));
+ yahoo_packet_hash(pkt, 50, yd->user);
+ for(; who; who = who->next) {
+ yahoo_packet_hash(pkt, 52, (char *)who->data);
+ }
+ yahoo_packet_hash(pkt, 57, room);
+ yahoo_packet_hash(pkt, 58, msg);
+ yahoo_packet_hash(pkt, 13, "0");
+
+ yahoo_send_packet(yid, pkt, 0);
+
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_conference_logon(int id, const char *from, YList *who, const char *room)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_CONFLOGON, YPACKET_STATUS_DEFAULT, yd->session_id);
+
+ yahoo_packet_hash(pkt, 1, (from?from:yd->user));
+
+ yahoo_packet_hash(pkt, 57, room);
+
+ for(; who; who = who->next) {
+ yahoo_packet_hash(pkt, 3, (char *)who->data);
+ }
+
+ yahoo_send_packet(yid, pkt, 0);
+
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_conference_decline(int id, const char * from, YList *who, const char *room, const char *msg)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt;
+
+ if(!yid)
+ return;
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_CONFDECLINE, YPACKET_STATUS_DEFAULT, yd->session_id);
+
+ yahoo_packet_hash(pkt, 1, (from?from:yd->user));
+ for(; who; who = who->next) {
+ yahoo_packet_hash(pkt, 3, (char *)who->data);
+ }
+ yahoo_packet_hash(pkt, 57, room);
+ yahoo_packet_hash(pkt, 14, msg);
+
+ yahoo_send_packet(yid, pkt, 0);
+
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_conference_logoff(int id, const char * from, YList *who, const char *room)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt;
+
+ if(!yid)
+ return;
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_CONFLOGOFF, YPACKET_STATUS_DEFAULT, yd->session_id);
+
+ yahoo_packet_hash(pkt, 1, (from?from:yd->user));
+ for(; who; who = who->next) {
+ yahoo_packet_hash(pkt, 3, (char *)who->data);
+ }
+ yahoo_packet_hash(pkt, 57, room);
+
+ yahoo_send_packet(yid, pkt, 0);
+
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_conference_message(int id, const char * from, YList *who, const char *room, const char *msg, int utf8)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt;
+
+ if(!yid)
+ return;
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_CONFMSG, YPACKET_STATUS_DEFAULT, yd->session_id);
+
+ yahoo_packet_hash(pkt, 1, (from?from:yd->user));
+ for(; who; who = who->next) {
+ yahoo_packet_hash(pkt, 53, (char *)who->data);
+ }
+ yahoo_packet_hash(pkt, 57, room);
+ yahoo_packet_hash(pkt, 14, msg);
+
+ if(utf8)
+ yahoo_packet_hash(pkt, 97, "1");
+
+ yahoo_send_packet(yid, pkt, 0);
+
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_get_chatrooms(int id, int chatroomid)
+{
+ struct yahoo_data *yd = find_conn_by_id(id);
+ struct yahoo_input_data *yid;
+ char url[1024];
+ char buff[1024];
+
+ if(!yd)
+ return;
+
+ yid = y_new0(struct yahoo_input_data, 1);
+ yid->yd = yd;
+ yid->type = YAHOO_CONNECTION_CHATCAT;
+
+ if (chatroomid == 0) {
+ snprintf(url, 1024, "http://insider.msg.yahoo.com/ycontent/?chatcat=0");
+ } else {
+ snprintf(url, 1024, "http://insider.msg.yahoo.com/ycontent/?chatroom_%d=0",chatroomid);
+ }
+
+ snprintf(buff, sizeof(buff), "Y=%s; T=%s", yd->cookie_y, yd->cookie_t);
+
+ inputs = y_list_prepend(inputs, yid);
+
+ //yahoo_http_get(yid->yd->client_id, url, buff, _yahoo_http_connected, yid);
+ YAHOO_CALLBACK(ext_yahoo_send_http_request)(yid->yd->client_id, YAHOO_CONNECTION_CHATCAT, "GET", url, buff, 0,
+ _yahoo_http_connected, yid);
+
+}
+
+void yahoo_chat_logon(int id, const char *from, const char *room, const char *roomid)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_CHATONLINE, YPACKET_STATUS_DEFAULT, yd->session_id);
+
+ yahoo_packet_hash(pkt, 1, (from?from:yd->user));
+ yahoo_packet_hash(pkt, 109, yd->user);
+ yahoo_packet_hash(pkt, 6, "abcde");
+
+ yahoo_send_packet(yid, pkt, 0);
+
+ yahoo_packet_free(pkt);
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_CHATJOIN, YPACKET_STATUS_DEFAULT, yd->session_id);
+
+ yahoo_packet_hash(pkt, 1, (from?from:yd->user));
+ yahoo_packet_hash(pkt, 104, room);
+ yahoo_packet_hash(pkt, 129, roomid);
+ yahoo_packet_hash(pkt, 62, "2"); /* ??? */
+
+ yahoo_send_packet(yid, pkt, 0);
+
+ yahoo_packet_free(pkt);
+}
+
+
+void yahoo_chat_message(int id, const char *from, const char *room, const char *msg, const int msgtype, const int utf8)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_COMMENT, YPACKET_STATUS_DEFAULT, yd->session_id);
+
+ yahoo_packet_hash(pkt, 1, (from?from:yd->user));
+ yahoo_packet_hash(pkt, 104, room);
+ yahoo_packet_hash(pkt, 117, msg);
+
+ yahoo_packet_hash_int(pkt, 124, msgtype);
+
+ if(utf8)
+ yahoo_packet_hash(pkt, 97, "1");
+
+ yahoo_send_packet(yid, pkt, 0);
+
+ yahoo_packet_free(pkt);
+}
+
+
+void yahoo_chat_logoff(int id, const char *from)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_CHATLOGOUT, YPACKET_STATUS_DEFAULT, yd->session_id);
+
+ yahoo_packet_hash(pkt, 1, (from?from:yd->user));
+
+ yahoo_send_packet(yid, pkt, 0);
+
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_webcam_close_feed(int id, const char *who)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_webcam_user(id, who);
+
+ if(yid)
+ yahoo_input_close(yid);
+}
+
+void yahoo_webcam_get_feed(int id, const char *who)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt;
+
+ if(!yid)
+ return;
+
+ /*
+ * add the user to the queue. this is a dirty hack, since
+ * the yahoo server doesn't tell us who's key it's returning,
+ * we have to just hope that it sends back keys in the same
+ * order that we request them.
+ * The queue is popped in yahoo_process_webcam_key
+ */
+ webcam_queue = y_list_append(webcam_queue, who?strdup(who):NULL);
+
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_WEBCAM, YPACKET_STATUS_DEFAULT, yd->session_id);
+
+ yahoo_packet_hash(pkt, 1, yd->user);
+ if (who != NULL)
+ yahoo_packet_hash(pkt, 5, who);
+ yahoo_send_packet(yid, pkt, 0);
+
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_webcam_send_image(int id, unsigned char *image, unsigned int length, unsigned int timestamp)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_WEBCAM);
+ unsigned char *packet;
+ unsigned char header_len = 13;
+ unsigned int pos = 0;
+
+ if (!yid)
+ return;
+
+ packet = y_new0(unsigned char, header_len);
+
+ packet[pos++] = header_len;
+ packet[pos++] = 0;
+ packet[pos++] = 5; /* version byte?? */
+ packet[pos++] = 0;
+ pos += yahoo_put32(packet + pos, length);
+ packet[pos++] = 2; /* packet type, image */
+ pos += yahoo_put32(packet + pos, timestamp);
+ yahoo_add_to_send_queue(yid, packet, header_len);
+ FREE(packet);
+
+ if (length)
+ yahoo_add_to_send_queue(yid, image, length);
+}
+
+void yahoo_webcam_accept_viewer(int id, const char* who, int accept)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_WEBCAM);
+ char *packet = NULL;
+ char *data = NULL;
+ unsigned char header_len = 13;
+ unsigned int pos = 0;
+ unsigned int len = 0;
+
+ if (!yid)
+ return;
+
+ data = strdup("u=");
+ data = y_string_append(data, (char*)who);
+ data = y_string_append(data, "\r\n");
+ len = strlen(data);
+
+ packet = y_new0(char, header_len + len);
+ packet[pos++] = header_len;
+ packet[pos++] = 0;
+ packet[pos++] = 5; /* version byte?? */
+ packet[pos++] = 0;
+ pos += yahoo_put32(packet + pos, len);
+ packet[pos++] = 0; /* packet type */
+ pos += yahoo_put32(packet + pos, accept);
+ memcpy(packet + pos, data, len);
+ FREE(data);
+ yahoo_add_to_send_queue(yid, packet, header_len + len);
+ FREE(packet);
+}
+
+void yahoo_webcam_invite(int id, const char *who)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_packet *pkt;
+
+ if(!yid)
+ return;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_NOTIFY, YPACKET_STATUS_NOTIFY, yid->yd->session_id);
+
+ yahoo_packet_hash(pkt, 49, "WEBCAMINVITE");
+ yahoo_packet_hash(pkt, 14, " ");
+ yahoo_packet_hash(pkt, 13, "0");
+ yahoo_packet_hash(pkt, 1, yid->yd->user);
+ yahoo_packet_hash(pkt, 5, who);
+ yahoo_send_packet(yid, pkt, 0);
+
+ yahoo_packet_free(pkt);
+}
+
+static void yahoo_search_internal(int id, int t, const char *text, int g, int ar, int photo, int yahoo_only, int startpos, int total)
+{
+ struct yahoo_data *yd = find_conn_by_id(id);
+ struct yahoo_input_data *yid;
+ char url[1024];
+ char buff[1024];
+ char *ctext, *p;
+
+ if(!yd)
+ return;
+
+ yid = y_new0(struct yahoo_input_data, 1);
+ yid->yd = yd;
+ yid->type = YAHOO_CONNECTION_SEARCH;
+
+ /*
+ age range
+ .ar=1 - 13-18, 2 - 18-25, 3 - 25-35, 4 - 35-50, 5 - 50-70, 6 - 70+
+ */
+
+ snprintf(buff, sizeof(buff), "&.sq=%%20&.tt=%d&.ss=%d", total, startpos);
+
+ ctext = strdup(text);
+ while((p = strchr(ctext, ' ')))
+ *p = '+';
+
+ snprintf(url, 1024, "http://profiles.yahoo.com/?.oc=m&.kw=%s&.sb=%d&.g=%d&.ar=0%s%s%s",
+ ctext, t, g, photo ? "&.p=y" : "", yahoo_only ? "&.pg=y" : "",
+ startpos ? buff : "");
+
+ FREE(ctext);
+
+ snprintf(buff, sizeof(buff), "Y=%s; T=%s", yd->cookie_y, yd->cookie_t);
+ //snprintf(buff, sizeof(buff), "Y=%s; T=%s; C=%s", yd->cookie_y, yd->cookie_t, yd->cookie_c);
+
+ inputs = y_list_prepend(inputs, yid);
+// yahoo_http_get(yid->yd->client_id, url, buff, _yahoo_http_connected, yid);
+ YAHOO_CALLBACK(ext_yahoo_send_http_request)(yid->yd->client_id, YAHOO_CONNECTION_SEARCH, "GET", url, buff, 0,
+ _yahoo_http_connected, yid);
+
+}
+
+void yahoo_search(int id, enum yahoo_search_type t, const char *text, enum yahoo_search_gender g, enum yahoo_search_agerange ar,
+ int photo, int yahoo_only)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_search_state *yss;
+
+ if(!yid)
+ return;
+
+ if(!yid->ys)
+ yid->ys = y_new0(struct yahoo_search_state, 1);
+
+ yss = yid->ys;
+
+ FREE(yss->lsearch_text);
+ yss->lsearch_type = t;
+ yss->lsearch_text = strdup(text);
+ yss->lsearch_gender = g;
+ yss->lsearch_agerange = ar;
+ yss->lsearch_photo = photo;
+ yss->lsearch_yahoo_only = yahoo_only;
+
+ yahoo_search_internal(id, t, text, g, ar, photo, yahoo_only, 0, 0);
+}
+
+void yahoo_search_again(int id, int start)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_search_state *yss;
+
+ if(!yid || !yid->ys)
+ return;
+
+ yss = yid->ys;
+
+ if(start == -1)
+ start = yss->lsearch_nstart + yss->lsearch_nfound;
+
+ yahoo_search_internal(id, yss->lsearch_type, yss->lsearch_text,
+ yss->lsearch_gender, yss->lsearch_agerange,
+ yss->lsearch_photo, yss->lsearch_yahoo_only,
+ start, yss->lsearch_ntotal);
+}
+
+struct send_file_data {
+ struct yahoo_packet *pkt;
+ yahoo_get_fd_callback callback;
+ void *user_data;
+};
+
+static void _yahoo_send_file_connected(int id, int fd, int error, void *data)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_FT);
+ struct send_file_data *sfd = (struct send_file_data *) data;
+ struct yahoo_packet *pkt = sfd->pkt;
+ char buff[1024];
+
+ if(fd <= 0) {
+ sfd->callback(id, fd, error, sfd->user_data);
+ FREE(sfd);
+ yahoo_packet_free(pkt);
+ inputs = y_list_remove(inputs, yid);
+ FREE(yid);
+ return;
+ }
+
+ yid->fd = fd;
+ yahoo_send_packet(yid, pkt, 4); /* we pad with 4 chars that follow bellow */
+ yahoo_packet_free(pkt);
+
+ /* 4 magic padding chars that we need to send */
+ buff[0] = 0x32;
+ buff[1] = 0x39;
+ buff[2] = 0xc0;
+ buff[3] = 0x80;
+
+ write(yid->fd, buff, 4);
+
+ /* YAHOO_CALLBACK(ext_yahoo_add_handler)(nyd->fd, YAHOO_INPUT_READ); */
+
+ sfd->callback(id, fd, error, sfd->user_data);
+ FREE(sfd);
+ inputs = y_list_remove(inputs, yid);
+ /*
+ while(yahoo_tcp_readline(buff, sizeof(buff), nyd->fd) > 0) {
+ if(!strcmp(buff, ""))
+ break;
+ }
+
+ */
+ yahoo_input_close(yid);
+}
+
+void yahoo_send_file(int id, const char *who, const char *msg,
+ const char *name, unsigned long size,
+ yahoo_get_fd_callback callback, void *data)
+{
+ struct yahoo_data *yd = find_conn_by_id(id);
+ struct yahoo_input_data *yid;
+ struct yahoo_server_settings *yss;
+ struct yahoo_packet *pkt = NULL;
+ char size_str[10];
+ long content_length=0;
+ char buff[1024];
+ char url[255];
+ struct send_file_data *sfd;
+ const char *s;
+
+ if(!yd)
+ return;
+
+ yss = yd->server_settings;
+
+ yid = y_new0(struct yahoo_input_data, 1);
+ yid->yd = yd;
+ yid->type = YAHOO_CONNECTION_FT;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANSFER, YPACKET_STATUS_DEFAULT, yd->session_id);
+
+ snprintf(size_str, sizeof(size_str), "%lu", size);
+
+ yahoo_packet_hash(pkt, 0, yd->user);
+ yahoo_packet_hash(pkt, 5, who);
+ yahoo_packet_hash(pkt, 14, msg);
+
+ s = strrchr(name, '\\');
+ if (s == NULL)
+ s = name;
+ else
+ s++;
+
+ yahoo_packet_hash(pkt, 27, s);
+ yahoo_packet_hash(pkt, 28, size_str);
+
+ content_length = YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt);
+
+ snprintf(url, sizeof(url), "http://%s:%d/notifyft",
+ yss->filetransfer_host, yss->filetransfer_port);
+ snprintf((char *)buff, sizeof(buff), "Y=%s; T=%s; B=%s;",
+ yd->cookie_y, yd->cookie_t, yd->cookie_b);
+ inputs = y_list_prepend(inputs, yid);
+
+ sfd = y_new0(struct send_file_data, 1);
+ sfd->pkt = pkt;
+ sfd->callback = callback;
+ sfd->user_data = data;
+// yahoo_http_post(yid->yd->client_id, url, (char *)buff, content_length+4+size,
+ //_yahoo_send_file_connected, sfd);
+ YAHOO_CALLBACK(ext_yahoo_send_http_request)(yid->yd->client_id, YAHOO_CONNECTION_FT, "POST", url, buff, content_length+4+size,
+ _yahoo_send_file_connected, sfd);
+}
+
+void yahoo_send_file_y7(int id, const char *from, const char *to, const char *relay_ip,
+ unsigned long size, const char* token, yahoo_get_fd_callback callback, void *data)
+{
+ struct yahoo_data *yd = find_conn_by_id(id);
+ struct yahoo_input_data *yid;
+ struct yahoo_server_settings *yss;
+ char buff[1024];
+ char url[255];
+ char *s;
+
+ if(!yd)
+ return;
+
+ yss = yd->server_settings;
+
+ yid = y_new0(struct yahoo_input_data, 1);
+ yid->yd = yd;
+ yid->type = YAHOO_CONNECTION_FT;
+
+ s = yahoo_decode(token);
+ snprintf(url, sizeof(url), "http://%s/relay?token=%s&sender=%s&recver=%s", relay_ip, s, from, to);
+
+ FREE(s);
+
+ snprintf((char *)buff, sizeof(buff), "Y=%s; T=%s; B=%s;",
+ yd->cookie_y, yd->cookie_t, yd->cookie_b);
+ inputs = y_list_prepend(inputs, yid);
+
+ YAHOO_CALLBACK(ext_yahoo_send_http_request)(yid->yd->client_id, YAHOO_CONNECTION_FT, "POST", url, buff, size, callback, data);
+}
+
+
+void yahoo_send_avatar(int id, const char *name, unsigned long size,
+ yahoo_get_fd_callback callback, void *data)
+{
+ struct yahoo_data *yd = find_conn_by_id(id);
+ struct yahoo_input_data *yid;
+ struct yahoo_server_settings *yss;
+ struct yahoo_packet *pkt = NULL;
+ char size_str[10];
+ long content_length=0;
+ char buff[1024];
+ char url[255];
+ struct send_file_data *sfd;
+ const char *s;
+
+ if(!yd)
+ return;
+
+ yss = yd->server_settings;
+
+ yid = y_new0(struct yahoo_input_data, 1);
+ yid->yd = yd;
+ yid->type = YAHOO_CONNECTION_FT;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE_UPLOAD, YPACKET_STATUS_DEFAULT, yd->session_id);
+ /* 1 = me, 38 = expire time(?), 0 = me, 28 = size, 27 = filename, 14 = NULL, 29 = data */
+ snprintf(size_str, sizeof(size_str), "%lu", size);
+
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 38, "604800"); /* time to expire */
+ yahoo_packet_hash(pkt, 0, yd->user);
+
+ s = strrchr(name, '\\');
+ if (s == NULL)
+ s = name;
+ else
+ s++;
+ yahoo_packet_hash(pkt, 28, size_str);
+ yahoo_packet_hash(pkt, 27, s);
+ yahoo_packet_hash(pkt, 14, "");
+
+ content_length = YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt);
+
+ //snprintf(url, sizeof(url), "http://%s:%d/notifyft", yss->filetransfer_host, yss->filetransfer_port);
+ if (yss->filetransfer_port != 80) {
+ snprintf(url, sizeof(url), "http://%s:%d/notifyft", yss->filetransfer_host, yss->filetransfer_port);
+ } else {
+ snprintf(url, sizeof(url), "http://%s/notifyft", yss->filetransfer_host);
+ }
+
+ //snprintf((char *)buff, sizeof(buff), "Y=%s; T=%s; B=%s;", yd->cookie_y, yd->cookie_t, yd->cookie_b);
+ snprintf((char *)buff, sizeof(buff), "T=%s; Y=%s", yd->cookie_t, yd->cookie_y);
+
+ inputs = y_list_prepend(inputs, yid);
+
+ sfd = y_new0(struct send_file_data, 1);
+ sfd->pkt = pkt;
+ sfd->callback = callback;
+ sfd->user_data = data;
+// yahoo_http_post(yid->yd->client_id, url, (char *)buff, content_length+4+size,
+// _yahoo_send_file_connected, sfd);
+ YAHOO_CALLBACK(ext_yahoo_send_http_request)(yid->yd->client_id, YAHOO_CONNECTION_FT, "POST", url, buff, content_length+4+size,
+ _yahoo_send_file_connected, sfd);
+}
+
+enum yahoo_status yahoo_current_status(int id)
+{
+ struct yahoo_data *yd = find_conn_by_id(id);
+
+ if(!yd)
+ return YAHOO_STATUS_OFFLINE;
+
+ return yd->current_status;
+}
+
+const YList * yahoo_get_buddylist(int id)
+{
+ struct yahoo_data *yd = find_conn_by_id(id);
+ if(!yd)
+ return NULL;
+ return yd->buddies;
+}
+
+const YList * yahoo_get_ignorelist(int id)
+{
+ struct yahoo_data *yd = find_conn_by_id(id);
+ if(!yd)
+ return NULL;
+ return yd->ignore;
+}
+
+const YList * yahoo_get_identities(int id)
+{
+ struct yahoo_data *yd = find_conn_by_id(id);
+ if(!yd)
+ return NULL;
+ return yd->identities;
+}
+
+const char * yahoo_get_cookie(int id, const char *which)
+{
+ struct yahoo_data *yd = find_conn_by_id(id);
+ if(!yd)
+ return NULL;
+ if(!strncasecmp(which, "y", 1))
+ return yd->cookie_y;
+ if(!strncasecmp(which, "t", 1))
+ return yd->cookie_t;
+ if(!strncasecmp(which, "c", 1))
+ return yd->cookie_c;
+ if(!strncasecmp(which, "login", 5))
+ return yd->login_cookie;
+ if(!strncasecmp(which, "b", 1))
+ return yd->cookie_b;
+ return NULL;
+}
+
+const char * yahoo_get_pw_token(int id)
+{
+ struct yahoo_data *yd = find_conn_by_id(id);
+ if(!yd)
+ return NULL;
+
+ return yd->pw_token;
+}
+
+void yahoo_get_url_handle(int id, const char *url,
+ yahoo_get_url_handle_callback callback, void *data)
+{
+ struct yahoo_data *yd = find_conn_by_id(id);
+ if(!yd)
+ return;
+
+ yahoo_get_url_fd(id, url, yd, callback, data);
+}
+
+const char * yahoo_get_profile_url( void )
+{
+ return profile_url;
+}
+
+void yahoo_request_buddy_avatar(int id, const char *buddy)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+ struct yahoo_server_settings *yss;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+ yss = yd->server_settings;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 5, buddy);
+ yahoo_packet_hash(pkt, 13, "1");
+
+ if (yss->web_messenger) {
+ yahoo_packet_hash(pkt, 0, yd->user);
+ yahoo_packet_hash_int(pkt, 24, yd->session_timestamp);
+ }
+
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_ftdc_deny(int id, const char *buddy, const char *filename, const char *ft_token, int command)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_P2PFILEXFER, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 5, buddy);
+ yahoo_packet_hash(pkt, 49, "FILEXFER");
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 13, (command == 2) ? "2" : "3");
+ yahoo_packet_hash(pkt, 27, filename);
+ yahoo_packet_hash(pkt, 53, ft_token);
+
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+
+}
+
+void yahoo_ft7dc_accept(int id, const char *buddy, const char *ft_token)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFER, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 5, buddy);
+ yahoo_packet_hash(pkt,265, ft_token);
+ yahoo_packet_hash(pkt,222, "3");
+
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+
+}
+
+void yahoo_ft7dc_deny(int id, const char *buddy, const char *ft_token)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFER, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 5, buddy);
+ yahoo_packet_hash(pkt,265, ft_token);
+ yahoo_packet_hash(pkt,222, "4");
+
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+
+}
+
+void yahoo_ft7dc_abort(int id, const char *buddy, const char *ft_token)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFERACCEPT, YPACKET_STATUS_DISCONNECTED, yd->session_id);
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 5, buddy);
+ yahoo_packet_hash(pkt,265, ft_token);
+ yahoo_packet_hash(pkt,66, "-1");
+
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+
+}
+
+void yahoo_ft7dc_relay(int id, const char *buddy, const char *ft_token)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFERACCEPT, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 5, buddy);
+ yahoo_packet_hash(pkt,265, ft_token);
+ yahoo_packet_hash(pkt,66, "-3");
+
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+
+}
+
+void yahoo_ft7dc_nextfile(int id, const char *buddy, const char *ft_token)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFERACCEPT, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 5, buddy);
+ yahoo_packet_hash(pkt,265, ft_token);
+ yahoo_packet_hash(pkt,271, "1");
+
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+
+}
+
+char *yahoo_ft7dc_send(int id, const char *buddy, YList *files)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+ char ft_token[32]; // we only need 23 chars actually
+ YList *l=files;
+ md5_byte_t result[16];
+ md5_state_t ctx;
+
+ if(!yid)
+ return NULL;
+
+ md5_init(&ctx);
+ md5_append(&ctx, (md5_byte_t *)buddy, strlen(buddy));
+
+ snprintf(ft_token, 32, "%lu", time(NULL));
+ md5_append(&ctx, (md5_byte_t *)ft_token, strlen(ft_token));
+ md5_finish(&ctx, result);
+ to_y64((unsigned char *)ft_token, result, 16);
+
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFER, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, yd->user);
+ yahoo_packet_hash(pkt, 5, buddy);
+ yahoo_packet_hash(pkt,222, "1");
+ yahoo_packet_hash(pkt,265, ft_token);
+
+ yahoo_packet_hash_int(pkt,266, y_list_length(files)); // files
+
+ yahoo_packet_hash(pkt,302, "268");
+ yahoo_packet_hash(pkt,300, "268");
+
+ while (l) {
+ struct yahoo_file_info * fi = (struct yahoo_file_info *) l->data;
+ char *c = strrchr(fi->filename, '\\');
+
+ if (c != NULL) {
+ c++;
+ } else {
+ c = fi->filename;
+ }
+
+ yahoo_packet_hash(pkt, 27, c);
+ yahoo_packet_hash_int(pkt, 28, fi->filesize);
+
+ if (l->next) {
+ yahoo_packet_hash(pkt,301, "268");
+ yahoo_packet_hash(pkt,300, "268");
+ }
+
+ l = l->next;
+ }
+
+ yahoo_packet_hash(pkt, 301, "268");
+ yahoo_packet_hash(pkt, 303, "268");
+
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+
+ return strdup(ft_token);
+}
+
+void yahoo_send_file7info(int id, const char *me, const char *who, const char *ft_token, const char* filename,
+ const char *relay_ip)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+
+ if(!yid)
+ return;
+
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFERINFO, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, me);
+ yahoo_packet_hash(pkt, 5, who);
+ yahoo_packet_hash(pkt,265, ft_token);
+ yahoo_packet_hash(pkt,27, filename);
+ yahoo_packet_hash(pkt,249, "3");
+ yahoo_packet_hash(pkt,250, relay_ip);
+
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+
+}
+
+unsigned char *yahoo_webmessenger_idle_packet(int id, int *len)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+ int pktlen;
+ unsigned char *data;
+ int pos = 0;
+ int web_messenger = 1;
+
+ if(!yid) {
+ DEBUG_MSG(("NO Yahoo Input Data???"));
+ return NULL;
+ }
+
+ yd = yid->yd;
+
+ DEBUG_MSG(("[yahoo_webmessenger_idle_packet] Session: %ld", yd->session_timestamp));
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_IDLE, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 0, yd->user);
+
+ yahoo_packet_hash_int(pkt, 24, yd->session_timestamp);
+
+ pktlen = yahoo_packet_length(pkt);
+ (*len) = YAHOO_PACKET_HDRLEN + pktlen;
+ data = y_new0(unsigned char, (*len) + 1);
+
+ memcpy(data + pos, "YMSG", 4); pos += 4;
+ pos += yahoo_put16(data + pos, web_messenger ? YAHOO_WEBMESSENGER_PROTO_VER : YAHOO_PROTO_VER); /* version [latest 12 0x000c */
+ pos += yahoo_put16(data + pos, 0x0000); /* HIWORD pkt length??? */
+ pos += yahoo_put16(data + pos, pktlen); /* LOWORD pkt length? */
+ pos += yahoo_put16(data + pos, pkt->service); /* service */
+ pos += yahoo_put32(data + pos, pkt->status); /* status [4bytes] */
+ pos += yahoo_put32(data + pos, pkt->id); /* session [4bytes] */
+
+ yahoo_packet_write(pkt, data + pos);
+
+ //yahoo_packet_dump(data, len);
+ DEBUG_MSG(("Sending Idle Packet:"));
+
+ yahoo_packet_read(pkt, data + pos, (*len) - pos);
+
+
+ return data;
+}
+
+void yahoo_send_idle_packet(int id)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+
+ if(!yid) {
+ DEBUG_MSG(("NO Yahoo Input Data???"));
+ return;
+ }
+
+ yd = yid->yd;
+
+ DEBUG_MSG(("[yahoo_send_idle_packet] Session: %ld", yd->session_timestamp));
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_IDLE, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 0, yd->user);
+
+ yahoo_packet_hash_int(pkt, 24, yd->session_timestamp);
+
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+}
+
+void yahoo_send_im_ack(int id, const char *me, const char *buddy, const char *seqn, int sendn)
+{
+ struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
+ struct yahoo_data *yd;
+ struct yahoo_packet *pkt = NULL;
+
+ DEBUG_MSG(("[yahoo_send_im_ack] My Id: %s, Buddy: %s, Seq #: %s, Retry: %d", me, buddy, seqn, sendn));
+
+ if(!yid) {
+ DEBUG_MSG(("NO Yahoo Input Data???"));
+ return;
+ }
+
+ yd = yid->yd;
+
+ pkt = yahoo_packet_new(YAHOO_SERVICE_Y9_MESSAGE_ACK, YPACKET_STATUS_DEFAULT, yd->session_id);
+ yahoo_packet_hash(pkt, 1, (me != NULL) ? me : yd->user);
+ yahoo_packet_hash(pkt, 5, buddy);
+
+ yahoo_packet_hash(pkt, 302, "430");
+ yahoo_packet_hash(pkt, 430, seqn);
+ yahoo_packet_hash(pkt, 303, "430");
+ yahoo_packet_hash_int(pkt, 450, sendn);
+ //yahoo_packet_hash_int(pkt, 24, yd->session_timestamp);
+
+ yahoo_send_packet(yid, pkt, 0);
+ yahoo_packet_free(pkt);
+}
+
+
diff --git a/protocols/Yahoo/libyahoo2/yahoo2.h b/protocols/Yahoo/libyahoo2/yahoo2.h
new file mode 100644
index 0000000000..66d5e364eb
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/yahoo2.h
@@ -0,0 +1,230 @@
+/*
+ * libyahoo2: yahoo2.h
+ *
+ * Copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#ifndef YAHOO2_H
+#define YAHOO2_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "yahoo2_types.h"
+
+/* returns the socket descriptor for a given pager connection. shouldn't be needed */
+int yahoo_get_fd(int id);
+
+/* says how much logging to do */
+/* see yahoo2_types.h for the different values */
+int yahoo_set_log_level(enum yahoo_log_level level);
+enum yahoo_log_level yahoo_get_log_level( void );
+
+/* these functions should be self explanatory */
+/* who always means the buddy you're acting on */
+/* id is the successful value returned by yahoo_init */
+
+
+/* init returns a connection id used to identify the connection hereon */
+/* or 0 on failure */
+/* you must call init before calling any other function */
+/*
+ * The optional parameters to init are key/value pairs that specify
+ * server settings to use. This list must be NULL terminated - even
+ * if the list is empty. If a parameter isn't set, a default value
+ * will be used. Parameter keys are strings, parameter values are
+ * either strings or ints, depending on the key. Values passed in
+ * are copied, so you can use const/auto/static/pointers/whatever
+ * you want. Parameters are:
+ * NAME TYPE DEFAULT
+ * pager_host char * scs.msg.yahoo.com
+ * pager_port int 5050
+ * filetransfer_host char * filetransfer.msg.yahoo.com
+ * filetransfer_port int 80
+ * webcam_host char * webcam.yahoo.com
+ * webcam_port int 5100
+ * webcam_description char * ""
+ * local_host char * ""
+ * conn_type int Y_WCM_DSL
+ *
+ * You should set at least local_host if you intend to use webcams
+ */
+int yahoo_init_with_attributes(const char *username, const char *password, const char *pw_token, ...);
+
+/* yahoo_init does the same as yahoo_init_with_attributes, assuming defaults
+ * for all attributes */
+int yahoo_init(const char *username, const char *password, const char *pw_token);
+
+/* retrieve the pw_token that's currently setup for this id if any
+ */
+const char * yahoo_get_pw_token(int id);
+
+/* release all resources held by this session */
+/* you need to call yahoo_close for a session only if
+ * yahoo_logoff is never called for it (ie, it was never logged in) */
+void yahoo_close(int id);
+/* login logs in to the server */
+/* initial is of type enum yahoo_status. see yahoo2_types.h */
+void yahoo_login(int id, enum yahoo_status initial);
+void yahoo_logoff(int id);
+/* reloads status of all buddies */
+void yahoo_refresh(int id);
+/* activates/deactivates an identity */
+void yahoo_set_identity_status(int id, const char * identity, int active);
+/* regets the entire buddy list from the server */
+void yahoo_get_list(int id);
+/* download buddy contact information from your yahoo addressbook */
+void yahoo_get_yab(int id);
+/* add/modify an address book entry. if yab->dbid is set, it will */
+/* modify that entry else it creates a new entry */
+void yahoo_set_yab(int id, struct yab * yab);
+void yahoo_send_ping(int id);
+void yahoo_keepalive(int id);
+void yahoo_chat_keepalive(int id);
+
+/* from is the identity you're sending from. if NULL, the default is used */
+/* utf8 is whether msg is a utf8 string or not. */
+void yahoo_send_im(int id, const char *from, const char *who, int protocol, const char *msg, int utf8, int buddy_icon);
+/* if type is true, send typing notice, else send stopped typing notice */
+void yahoo_send_typing(int id, const char *from, const char *who, int protocol, int typ);
+
+/* used to set away/back status. */
+/* away says whether the custom message is an away message or a sig */
+void yahoo_set_away(int id, enum yahoo_status state, const char *msg, int away);
+void yahoo_set_stealth(int id, const char *buddy, int protocol, int add);
+
+void yahoo_add_buddy(int id, const char *fname, const char *lname, const char *who, int protocol, const char *group, const char *msg);
+void yahoo_remove_buddy(int id, const char *who, int protocol, const char *group);
+void yahoo_accept_buddy(int id, const char *who, int protocol);
+void yahoo_reject_buddy(int id, const char *who, int protocol, const char *msg);
+/* if unignore is true, unignore, else ignore */
+void yahoo_ignore_buddy(int id, const char *who, int unignore);
+void yahoo_change_buddy_group(int id, const char *who, const char *old_group, const char *new_group);
+void yahoo_group_rename(int id, const char *old_group, const char *new_group);
+
+void yahoo_conference_invite(int id, const char * from, YList *who, const char *room, const char *msg);
+void yahoo_conference_addinvite(int id, const char * from, const char *who, const char *room, const YList * members, const char *msg);
+void yahoo_conference_decline(int id, const char * from, YList *who, const char *room, const char *msg);
+void yahoo_conference_message(int id, const char * from, YList *who, const char *room, const char *msg, int utf8);
+void yahoo_conference_logon(int id, const char * from, YList *who, const char *room);
+void yahoo_conference_logoff(int id, const char * from, YList *who, const char *room);
+
+/* Get a list of chatrooms */
+void yahoo_get_chatrooms(int id,int chatroomid);
+/* join room with specified roomname and roomid */
+void yahoo_chat_logon(int id, const char *from, const char *room, const char *roomid);
+/* Send message "msg" to room with specified roomname, msgtype is 1-normal message or 2-/me mesage */
+void yahoo_chat_message(int id, const char *from, const char *room, const char *msg, const int msgtype, const int utf8);
+/* Log off chat */
+void yahoo_chat_logoff(int id, const char *from);
+
+/* requests a webcam feed */
+/* who is the person who's webcam you would like to view */
+/* if who is null, then you're the broadcaster */
+void yahoo_webcam_get_feed(int id, const char *who);
+void yahoo_webcam_close_feed(int id, const char *who);
+
+/* sends an image when uploading */
+/* image points to a JPEG-2000 image, length is the length of the image */
+/* in bytes. The timestamp is the time in milliseconds since we started the */
+/* webcam. */
+void yahoo_webcam_send_image(int id, unsigned char *image, unsigned int length, unsigned int timestamp);
+
+/* this function should be called if we want to allow a user to watch the */
+/* webcam. Who is the user we want to accept. */
+/* Accept user (accept = 1), decline user (accept = 0) */
+void yahoo_webcam_accept_viewer(int id, const char* who, int accept);
+
+/* send an invitation to a user to view your webcam */
+void yahoo_webcam_invite(int id, const char *who);
+
+/* will set up a connection and initiate file transfer.
+ * callback will be called with the fd that you should write
+ * the file data to
+ */
+void yahoo_send_file(int id, const char *who, const char *msg, const char *name, unsigned long size,
+ yahoo_get_fd_callback callback, void *data);
+
+void yahoo_send_avatar(int id, const char *name, unsigned long size,
+ yahoo_get_fd_callback callback, void *data);
+
+/* send a search request
+ */
+void yahoo_search(int id, enum yahoo_search_type t, const char *text, enum yahoo_search_gender g, enum yahoo_search_agerange ar,
+ int photo, int yahoo_only);
+
+/* continue last search
+ * should be called if only (start+found >= total)
+ *
+ * where the above three are passed to ext_yahoo_got_search_result
+ */
+void yahoo_search_again(int id, int start);
+
+/* returns a socket fd to a url for downloading a file. */
+void yahoo_get_url_handle(int id, const char *url,
+ yahoo_get_url_handle_callback callback, void *data);
+
+/* these should be called when input is available on a fd */
+/* registered by ext_yahoo_add_handler */
+/* if these return negative values, errno may be set */
+int yahoo_read_ready(int id, int fd, void *data);
+int yahoo_write_ready(int id, int fd, void *data);
+
+/* utility functions. these do not hit the server */
+enum yahoo_status yahoo_current_status(int id);
+const YList * yahoo_get_buddylist(int id);
+const YList * yahoo_get_ignorelist(int id);
+const YList * yahoo_get_identities(int id);
+/* 'which' could be y, t, c or login. This may change in later versions. */
+const char * yahoo_get_cookie(int id, const char *which);
+
+/* returns the url used to get user profiles - you must append the user id */
+/* as of now this is http://profiles.yahoo.com/ */
+/* You'll have to do urlencoding yourself, but see yahoo_httplib.h first */
+const char * yahoo_get_profile_url( void );
+
+void yahoo_request_buddy_avatar(int id, const char *buddy);
+void yahoo_send_picture_checksum(int id, const char* who, int cksum);
+void yahoo_send_picture_info(int id, const char *who, int type, const char *pic_url, int cksum);
+void yahoo_send_picture_status(int id, int buddy_icon);
+void yahoo_send_picture_update(int id, const char *who, int type);
+
+void yahoo_ftdc_deny(int id, const char *buddy, const char *filename, const char *ft_token, int command);
+void yahoo_ft7dc_accept(int id, const char *buddy, const char *ft_token);
+void yahoo_ft7dc_deny(int id, const char *buddy, const char *ft_token);
+void yahoo_ft7dc_relay(int id, const char *buddy, const char *ft_token);
+void yahoo_ft7dc_abort(int id, const char *buddy, const char *ft_token);
+void yahoo_ft7dc_nextfile(int id, const char *buddy, const char *ft_token);
+char *yahoo_ft7dc_send(int id, const char *buddy, YList *files);
+void yahoo_send_file7info(int id, const char *me, const char *who, const char *ft_token, const char* filename,
+ const char *relay_ip);
+void yahoo_send_file_y7(int id, const char *from, const char *to, const char *relay_ip,
+ unsigned long size, const char* ft_token, yahoo_get_fd_callback callback, void *data);
+unsigned char *yahoo_webmessenger_idle_packet(int id, int* len);
+void yahoo_send_idle_packet(int id);
+void yahoo_send_im_ack(int id, const char *me, const char *buddy, const char *seqn, int sendn);
+#include "yahoo_httplib.h"
+
+char * getcookie(char *rawcookie);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/protocols/Yahoo/libyahoo2/yahoo2_callbacks.h b/protocols/Yahoo/libyahoo2/yahoo2_callbacks.h
new file mode 100644
index 0000000000..b6a01346cb
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/yahoo2_callbacks.h
@@ -0,0 +1,891 @@
+/*
+ * libyahoo2: yahoo2_callbacks.h
+ *
+ * Copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * The functions in this file *must* be defined in your client program
+ * If you want to use a callback structure instead of direct functions,
+ * then you must define USE_STRUCT_CALLBACKS in all files that #include
+ * this one.
+ *
+ * Register the callback structure by calling yahoo_register_callbacks -
+ * declared in this file and defined in libyahoo2.c
+ */
+
+
+#ifndef YAHOO2_CALLBACKS_H
+#define YAHOO2_CALLBACKS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "yahoo2_types.h"
+
+/*
+ * yahoo2_callbacks.h
+ *
+ * Callback interface for libyahoo2
+ */
+
+typedef enum {
+ YAHOO_INPUT_READ = 1 << 0,
+ YAHOO_INPUT_WRITE = 1 << 1,
+ YAHOO_INPUT_EXCEPTION = 1 << 2
+} yahoo_input_condition;
+
+/*
+ * A callback function called when an asynchronous connect completes.
+ *
+ * Params:
+ * fd - The file descriptor that has been connected, or -1 on error
+ * error - The value of errno set by the call to connect or 0 if no error
+ * Set both fd and error to 0 if the connect was cancelled by the
+ * user
+ * callback_data - the callback_data passed to the ext_yahoo_connect_async
+ * function
+ */
+typedef void (*yahoo_connect_callback)(int fd, int error, void *callback_data);
+
+
+/*
+ * The following functions need to be implemented in the client
+ * interface. They will be called by the library when each
+ * event occurs.
+ */
+
+/*
+ * should we use a callback structure or directly call functions
+ * if you want the structure, you *must* define USE_STRUCT_CALLBACKS
+ * both when you compile the library, and when you compile your code
+ * that uses the library
+ */
+
+#ifdef USE_STRUCT_CALLBACKS
+#define YAHOO_CALLBACK_TYPE(x) (*x)
+struct yahoo_callbacks {
+#else
+#define YAHOO_CALLBACK_TYPE(x) x
+#endif
+
+/*
+ * Name: ext_yahoo_login_response
+ * Called when the login process is complete
+ * Params:
+ * id - the id that identifies the server connection
+ * succ - enum yahoo_login_status
+ * url - url to reactivate account if locked
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_login_response)(int id, int succ, const char *url);
+
+
+/*
+ * Name: ext_yahoo_got_buddies
+ * Called when the contact list is got from the server
+ * Params:
+ * id - the id that identifies the server connection
+ * buds - the buddy list
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_buddies)(int id, YList * buds);
+
+
+/*
+ * Name: ext_yahoo_got_buddies
+ * Called when the contact list is got from the server
+ * Params:
+ * id - the id that identifies the server connection
+ * stealthlist - a string representing buddy ids to hide from
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_stealthlist)(int id, char *stealthlist);
+
+
+/*
+ * Name: ext_yahoo_got_avatar_share
+ * Called when the contact list is got from the server
+ * Params:
+ * id - the id that identifies the server connection
+ * buddyIcon - current setting of how we sharing avatars
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_avatar_share)(int id, int buddy_icon);
+
+
+/*
+ * Name: ext_yahoo_got_ignore
+ * Called when the ignore list is got from the server
+ * Params:
+ * id - the id that identifies the server connection
+ * igns - the ignore list
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_ignore)(int id, YList * igns);
+
+
+/*
+ * Name: ext_yahoo_got_identities
+ * Called when the contact list is got from the server
+ * Params:
+ * id - the id that identifies the server connection
+ * ids - the identity list
+ * fname - first name
+ * lname - last name
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_identities)(int id, const char *nick, const char *fname, const char *lname, YList *ids);
+
+
+/*
+ * Name: ext_yahoo_got_cookies
+ * Called when the cookie list is got from the server
+ * Params:
+ * id - the id that identifies the server connection
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_cookies)(int id);
+
+
+/*
+ * Name: ext_yahoo_got_ping
+ * Called when the ping packet is received from the server
+ * Params:
+ * id - the id that identifies the server connection
+ * errormsg - optional error message
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_ping)(int id, const char *errormsg);
+
+
+/*
+ * Name: ext_yahoo_status_logon
+ * Called when remote user's status changes to online.
+ * Params:
+ * id - the id that identifies the server connection
+ * who - the handle of the remote user
+ * protocol - protocol id of the buddy.
+ * stat - status code (enum yahoo_status)
+ * msg - the message if stat == YAHOO_STATUS_CUSTOM
+ * away - whether the contact is away or not (YAHOO_STATUS_CUSTOM)
+ * idle - this is the number of seconds he is idle [if he is idle]
+ * mobile - this is set for mobile users/buddies
+ * cksum - picture checksum [avatar support]
+ * buddy_icon - avatar type
+ * client_version - client version # (Yahoo sends some long numbers for different clients)
+ * utf8 - status message is utf8? (1 = yes)
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_status_logon)(int id, const char *who, int protocol, int stat, const char *msg, int away, int idle, int mobile, int cksum, int buddy_icon, long client_version, int utf8);
+
+
+/*
+ * Name: ext_yahoo_status_changed
+ * Called when remote user's status changes.
+ * Params:
+ * id - the id that identifies the server connection
+ * who - the handle of the remote user
+ * protocol - protocol id of the buddy.
+ * stat - status code (enum yahoo_status)
+ * msg - the message if stat == YAHOO_STATUS_CUSTOM
+ * away - whether the contact is away or not (YAHOO_STATUS_CUSTOM)
+ * idle - this is the number of seconds he is idle [if he is idle]
+ * mobile - this is set for mobile users/buddies
+ * utf8 - is the status UTF-8 (1 = yes)
+ * TODO: add support for pager, chat, and game states
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_status_changed)(int id, const char *who, int protocol, int stat, const char *msg, int away, int idle, int mobile, int utf8);
+
+
+/*
+ * Name: ext_yahoo_got_picture
+ * Called when we request picture URL.
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity of mine being notified
+ * who - the handle of the remote user
+ * pic_url - URL to the buddy icon
+ * cksum - checksum
+ * type - type of packet (recv/send)
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_picture)(int id, const char *me, const char *who, const char *pic_url, int cksum, int type);
+
+
+/*
+ * Name: ext_yahoo_got_picture_checksum
+ * Called when our buddy changes his/hers buddy icon
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity of mine being notified
+ * who - the handle of the remote user
+ * cksum - checksum
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_picture_checksum)(int id, const char *me, const char *who, int cksum);
+
+
+/*
+ * Name: ext_yahoo_got_picture_update
+ * Called when our buddy shares or stops sharing pictures with us.
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity of mine being notified
+ * who - the handle of the remote user
+ * cksum - checksum
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_picture_update)(int id, const char *me, const char *who, int buddy_icon);
+
+
+/*
+ * Name: ext_yahoo_got_picture_upload
+ * Called when we just uploaded a picture to Yahoo File Servers
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity of mine being notified
+ * who - the handle of the remote user
+ * cksum - checksum
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_picture_upload)(int id, const char *me, const char *url, unsigned int ts);
+
+
+/*
+ * Name: ext_yahoo_got_picture_status (Apparently this is also a GLOBAL Notification.)
+ * GF Personal Notes: 2 Notifications?? 1 for Checksum, 1 for Global? To shut it off too?
+ * Called when our buddy shares or stops sharing pictures with us.
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity of mine being notified
+ * who - the handle of the remote user
+ * cksum - checksum
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_picture_status)(int id, const char *me, const char *who, int buddy_icon);
+
+
+/*
+ * Name: ext_yahoo_got_im
+ * Called when remote user sends you a message.
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity the message was sent to
+ * who - the handle of the remote user
+ * protocol - protocol id of the buddy.
+ * msg - the message - NULL if stat == 2
+ * tm - timestamp of message if offline
+ * stat - message status - 0
+ * 1
+ * 2 == error sending message
+ * 5
+ * utf8 - whether the message is encoded as utf8 or not
+ * buddy_icon - whether the buddy has buddy_icon set or not.
+ * seqn - message sequence #
+ * sendn - this is the try #. (starts from 0 and tries to re-send the message)
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_im)(int id, const char *me, const char *who, int protocol, const char *msg, long tm, int stat, int utf8, int buddy_icon, const char* seqn, int sendn);
+
+
+/*
+ * Name: ext_yahoo_got_audible
+ * Called when our buddy send an audible to us.
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity of mine being notified
+ * who - the handle of the remote user
+ * aud - audible sent (filename?)
+ * msg - audible message
+ * aud_hash - md5 hash?
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_audible)(int id, const char *me, const char *who, const char *aud, const char *msg, const char *aud_hash);
+
+
+/*
+ * Name: ext_yahoo_got_calendar
+ * Called when our buddy send an audible to us.
+ * Params:
+ * id - the id that identifies the server connection
+ * url - the URL to the calendar reminder
+ * type - type of request?
+ * msg - string/description
+ * svc - service?
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_calendar)(int id, const char *url, int type, const char *msg, int svc);
+
+
+/*
+ * Name: ext_yahoo_got_conf_invite
+ * Called when remote user sends you a conference invitation.
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity the invitation was sent to
+ * who - the user inviting you
+ * room - the room to join
+ * msg - the message
+ * members - the initial members of the conference (null terminated list)
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_conf_invite)(int id, const char *me, const char *who, const char *room, const char *msg, YList *members);
+
+
+/*
+ * Name: ext_yahoo_conf_userdecline
+ * Called when someone declines to join the conference.
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity in the conference
+ * who - the user who has declined
+ * room - the room
+ * msg - the declining message
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_conf_userdecline)(int id, const char *me, const char *who, const char *room, const char *msg);
+
+
+/*
+ * Name: ext_yahoo_conf_userjoin
+ * Called when someone joins the conference.
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity in the conference
+ * who - the user who has joined
+ * room - the room joined
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_conf_userjoin)(int id, const char *me, const char *who, const char *room);
+
+
+/*
+ * Name: ext_yahoo_conf_userleave
+ * Called when someone leaves the conference.
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity in the conference
+ * who - the user who has left
+ * room - the room left
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_conf_userleave)(int id, const char *me, const char *who, const char *room);
+
+
+/*
+ * Name: ext_yahoo_chat_cat_xml
+ * Called when ?
+ * Params:
+ * id - the id that identifies the server connection
+ * xml - ?
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_cat_xml)(int id, const char *xml);
+
+
+/*
+ * Name: ext_yahoo_chat_join
+ * Called when joining the chatroom.
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity in the chatroom
+ * room - the room joined, used in all other chat calls, freed by
+ * library after call
+ * topic - the topic of the room, freed by library after call
+ * members - the initial members of the chatroom (null terminated YList
+ * of yahoo_chat_member's) Must be freed by the client
+ * fd - the socket where the connection is coming from (for tracking)
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_join)(int id, const char *me, const char *room, const char *topic, YList *members, int fd);
+
+
+/*
+ * Name: ext_yahoo_chat_userjoin
+ * Called when someone joins the chatroom.
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity in the chatroom
+ * room - the room joined
+ * who - the user who has joined, Must be freed by the client
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_userjoin)(int id, const char *me, const char *room, struct yahoo_chat_member *who);
+
+
+/*
+ * Name: ext_yahoo_chat_userleave
+ * Called when someone leaves the chatroom.
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity in the chatroom
+ * room - the room left
+ * who - the user who has left (Just the User ID)
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_userleave)(int id, const char *me, const char *room, const char *who);
+
+
+/*
+ * Name: ext_yahoo_chat_message
+ * Called when someone messages in the chatroom.
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity in the chatroom
+ * room - the room
+ * who - the user who messaged (Just the user id)
+ * msg - the message
+ * msgtype - 1 = Normal message
+ * 2 = /me type message
+ * utf8 - whether the message is utf8 encoded or not
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_message)(int id, const char *me, const char *who, const char *room, const char *msg, int msgtype, int utf8);
+
+
+/*
+ *
+ * Name: ext_yahoo_chat_yahoologout
+ * called when yahoo disconnects your chat session
+ * Note this is called whenver a disconnect happens, client or server
+ * requested. Care should be taken to make sure you know the origin
+ * of the disconnect request before doing anything here (auto-join's etc)
+ * Params:
+ * id - the id that identifies this connection
+ * me - the identity in the chatroom
+ * Returns:
+ * nothing.
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_yahoologout)(int id, const char *me);
+
+
+/*
+ *
+ * Name: ext_yahoo_chat_yahooerror
+ * called when yahoo sends back an error to you
+ * Note this is called whenver chat message is sent into a room
+ * in error (fd not connected, room doesn't exists etc)
+ * Care should be taken to make sure you know the origin
+ * of the error before doing anything about it.
+ * Params:
+ * id - the id that identifies this connection
+ * me - the identity in the chatroom
+ * Returns:
+ * nothing.
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_yahooerror)(int id, const char *me);
+
+
+/*
+ * Name: ext_yahoo_conf_message
+ * Called when someone messages in the conference.
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity the conf message was sent to
+ * who - the user who messaged
+ * room - the room
+ * msg - the message
+ * utf8 - whether the message is utf8 encoded or not
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_conf_message)(int id, const char *me, const char *who, const char *room, const char *msg, int utf8);
+
+
+/*
+ * Name: ext_yahoo_got_file
+ * Called when someone sends you a file
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity the file was sent to
+ * who - the user who sent the file
+ * url - the file url
+ * expires - the expiry date of the file on the server (timestamp)
+ * msg - the message
+ * fname- the file name if direct transfer
+ * fsize- the file size if direct transfer
+ * ftoken - file token
+ * y7 - flag signalling y7 transfer
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_file)(int id, const char *me, const char *who, const char *url, long expires, const char *msg, const char *fname, unsigned long fesize, const char *ft_token, int y7);
+
+
+/*
+ * Name: ext_yahoo_got_files
+ * Called when someone sends you a file(s)
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity the file was sent to
+ * who - the user who sent the file
+ * ftoken - file token
+ * y7 - flag signalling y7 transfer
+ * files - YList of files containing "struct yahoo_file_info" records
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_files)(int id, const char *me, const char *who, const char *ft_token, int y7, YList *files);
+
+
+/*
+ * Name: ext_yahoo_got_file7info
+ * Called when someone sends you a file
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity the file was sent to
+ * who - the user who sent the file
+ * url - the file url
+ * expires - the expiry date of the file on the server (timestamp)
+ * msg - the message
+ * fname- the file name if direct transfer
+ * fsize- the file size if direct transfer
+ * ftoken - file token
+ * y7 - flag signalling y7 transfer
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_file7info)(int id, const char *me, const char *who, const char *url, const char *fname, const char *ft_token);
+
+/*
+ * Name: ext_yahoo_got_file7info
+ * Called when someone sends you a file
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity the file was sent to
+ * who - the user who sent the file
+ * ftoken - file token
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_send_file7info)(int id, const char *me, const char *who, const char *ft_token);
+
+/*
+ * Name: ext_yahoo_ft7_send_file
+ * Called when someone sends you a file
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the identity the file was sent to
+ * who - the user who sent the file
+ * ftoken - file token
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_ft7_send_file)(int id, const char *me, const char *who, const char *filename, const char *token, const char *ft_token);
+
+/*
+ * Name: ext_yahoo_contact_added
+ * Called when a contact adds you to their list
+ * Params:
+ * id - the id that identifies the server connection
+ * myid - the identity he was added to
+ * who - who was added
+ * msg - any message sent
+ * protocol - protocol id of the buddy.
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_contact_added)(int id, const char *myid, const char *who, const char *fname, const char *lname, const char *msg, int protocol);
+
+
+/*
+ * Name: ext_yahoo_buddy_group_changed
+ * Called when a buddy is moved from one group into another
+ * Params:
+ * id - the id that identifies the server connection
+ * myid - the identity he was added to
+ * who - who was added
+ * from_group
+ * to_group
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_buddy_group_changed)(int id, char *myid, char *who, char *old_group, char *new_group);
+
+
+/*
+ * Name: ext_yahoo_buddy_added
+ * Called when a contact is added to our server list
+ * Params:
+ * id - the id that identifies the server connection
+ * myid - the identity he was added to
+ * who - who was added
+ * group - group buddy was added to
+ * status - status of the operation
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_buddy_added)(int id, char *myid, char *who, char *group, int status, int auth);
+
+
+/*
+ * Name: ext_yahoo_rejected
+ * Called when a contact rejects your add
+ * Params:
+ * id - the id that identifies the server connection
+ * who - who rejected you
+ * msg - any message sent
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_rejected)(int id, const char *who, const char *msg);
+
+
+/*
+ * Name: ext_yahoo_typing_notify
+ * Called when remote user starts or stops typing.
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the handle of the identity the notification is sent to
+ * who - the handle of the remote user
+ * protocol - protocol id of the buddy.
+ * stat - 1 if typing, 0 if stopped typing
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_typing_notify)(int id, const char *me, const char *who, int protocol, int stat);
+
+
+/*
+ * Name: ext_yahoo_game_notify
+ * Called when remote user starts or stops a game.
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the handle of the identity the notification is sent to
+ * who - the handle of the remote user
+ * stat - 1 if game, 0 if stopped gaming
+ * msg - game description and/or other text
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_game_notify)(int id, const char *me, const char *who, int stat, const char *msg);
+
+
+/*
+ * Name: ext_yahoo_mail_notify
+ * Called when you receive mail, or with number of messages
+ * Params:
+ * id - the id that identifies the server connection
+ * from - who the mail is from - NULL if only mail count
+ * subj - the subject of the mail - NULL if only mail count
+ * cnt - mail count - 0 if new mail notification
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_mail_notify)(int id, const char *from, const char *subj, int cnt);
+
+
+/*
+ * Name: ext_yahoo_system_message
+ * System message
+ * Params:
+ * id - the id that identifies the server connection
+ * me - the handle of the identity the notification is sent to
+ * who - the source of the system message (there are different types)
+ * msg - the message
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_system_message)(int id, const char *me, const char *who, const char *msg);
+
+
+/*
+ * Name: ext_yahoo_got_webcam_image
+ * Called when you get a webcam update
+ * An update can either be receiving an image, a part of an image or
+ * just an update with a timestamp
+ * Params:
+ * id - the id that identifies the server connection
+ * who - the user who's webcam we're viewing
+ * image - image data
+ * image_size - length of the image in bytes
+ * real_size - actual length of image data
+ * timestamp - milliseconds since the webcam started
+ *
+ * If the real_size is smaller then the image_size then only part of
+ * the image has been read. This function will keep being called till
+ * the total amount of bytes in image_size has been read. The image
+ * received is in JPEG-2000 Code Stream Syntax (ISO/IEC 15444-1).
+ * The size of the image will be either 160x120 or 320x240.
+ * Each webcam image contains a timestamp. This timestamp should be
+ * used to keep the image in sync since some images can take longer
+ * to transport then others. When image_size is 0 we can still receive
+ * a timestamp to stay in sync
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_webcam_image)(int id, const char * who,
+ const unsigned char *image, unsigned int image_size, unsigned int real_size,
+ unsigned int timestamp);
+
+
+/*
+ * Name: ext_yahoo_webcam_invite
+ * Called when you get a webcam invitation
+ * Params:
+ * id - the id that identifies the server connection
+ * me - identity the invitation is to
+ * from - who the invitation is from
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_webcam_invite)(int id, const char *me, const char *from);
+
+
+/*
+ * Name: ext_yahoo_webcam_invite_reply
+ * Called when you get a response to a webcam invitation
+ * Params:
+ * id - the id that identifies the server connection
+ * me - identity the invitation response is to
+ * from - who the invitation response is from
+ * accept - 0 (decline), 1 (accept)
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_webcam_invite_reply)(int id, const char *me, const char *from, int accept);
+
+
+/*
+ * Name: ext_yahoo_webcam_closed
+ * Called when the webcam connection closed
+ * Params:
+ * id - the id that identifies the server connection
+ * who - the user who we where connected to
+ * reason - reason why the connection closed
+ * 1 = user stopped broadcasting
+ * 2 = user cancelled viewing permission
+ * 3 = user declines permission
+ * 4 = user does not have webcam online
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_webcam_closed)(int id, const char *who, int reason);
+
+
+/*
+ * Name: ext_yahoo_got_search_result
+ * Called when the search result received from server
+ * Params:
+ * id - the id that identifies the server connection
+ * found - total number of results returned in the current result set
+ * start - offset from where the current result set starts
+ * total - total number of results available (start + found <= total)
+ * contacts - the list of results as a YList of yahoo_found_contact
+ * these will be freed after this function returns, so
+ * if you need to use the information, make a copy
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_got_search_result)(int id, int found, int start, int total, YList *contacts);
+
+
+/*
+ * Name: ext_yahoo_error
+ * Called on error.
+ * Params:
+ * id - the id that identifies the server connection
+ * err - the error message
+ * fatal- whether this error is fatal to the connection or not
+ * num - Which error is this
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_error)(int id, const char *err, int fatal, int num);
+
+
+/*
+ * Name: ext_yahoo_webcam_viewer
+ * Called when a viewer disconnects/connects/requests to connect
+ * Params:
+ * id - the id that identifies the server connection
+ * who - the viewer
+ * connect - 0=disconnect 1=connect 2=request
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_webcam_viewer)(int id, const char *who, int connect);
+
+
+/*
+ * Name: ext_yahoo_webcam_data_request
+ * Called when you get a request for webcam images
+ * Params:
+ * id - the id that identifies the server connection
+ * send - whether to send images or not
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_webcam_data_request)(int id, int send);
+
+
+/*
+ * Name: ext_yahoo_log
+ * Called to log a message.
+ * Params:
+ * fmt - the printf formatted message
+ * Returns:
+ * 0
+ */
+int YAHOO_CALLBACK_TYPE(ext_yahoo_log)(const char *fmt, ...);
+
+
+/*
+ * Name: ext_yahoo_add_handler
+ * Add a listener for the fd. Must call yahoo_read_ready
+ * when a YAHOO_INPUT_READ fd is ready and yahoo_write_ready
+ * when a YAHOO_INPUT_WRITE fd is ready.
+ * Params:
+ * id - the id that identifies the server connection
+ * fd - the fd on which to listen
+ * cond - the condition on which to call the callback
+ * data - callback data to pass to yahoo_*_ready
+ *
+ * Returns: a tag to be used when removing the handler
+ */
+unsigned int YAHOO_CALLBACK_TYPE(ext_yahoo_add_handler)(int id, int fd, yahoo_input_condition cond, void *data);
+
+
+/*
+ * Name: ext_yahoo_remove_handler
+ * Remove the listener for the fd.
+ * Params:
+ * id - the id that identifies the connection
+ * tag - the handler tag to remove
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_remove_handler)(int id, unsigned int tag);
+
+
+/*
+ * Name: ext_yahoo_connect
+ * Connect to a host:port
+ * Params:
+ * host - the host to connect to
+ * port - the port to connect on
+ * Returns:
+ * a unix file descriptor to the socket
+ */
+int YAHOO_CALLBACK_TYPE(ext_yahoo_connect)(const char *host, int port, int type);
+
+
+/*
+ * Name: ext_yahoo_connect_async
+ * Connect to a host:port asynchronously. This function should return
+ * immediately returing a tag used to identify the connection handler,
+ * or a pre-connect error (eg: host name lookup failure).
+ * Once the connect completes (successfully or unsuccessfully), callback
+ * should be called (see the signature for yahoo_connect_callback).
+ * The callback may safely be called before this function returns, but
+ * it should not be called twice.
+ * Params:
+ * id - the id that identifies this connection
+ * host - the host to connect to
+ * port - the port to connect on
+ * callback - function to call when connect completes
+ * callback_data - data to pass to the callback function
+ * Returns:
+ * a unix file descriptor to the socket
+ */
+int YAHOO_CALLBACK_TYPE(ext_yahoo_connect_async)(int id, const char *host, int port, int type,
+ yahoo_connect_callback callback, void *callback_data);
+
+/*
+ * Name: ext_yahoo_send_http_request
+ * This function opens a connection and sends the proper request for a specified resource
+ * by utilizing the provided method.
+ *
+ * This callback allows us to do proper proxy authentication on the user level. As well as
+ * possibly using some other routines for HTTP requests. (miranda has HTTP netlib api)
+ * Params:
+ * id - the id that identifies this connection
+ * method - HTTP method to use HEAD/GET/POST
+ * url - the URL that specifies the resource to reference
+ * cookies - cookies to send with the request
+ * content_length - the length of content to POST
+ * callback - function to call when connect completes
+ * callback_data - data to pass to the callback function
+ */
+void YAHOO_CALLBACK_TYPE(ext_yahoo_send_http_request)(int id, enum yahoo_connection_type type, const char *method, const char *url, const char *cookies, long content_length,
+ yahoo_get_fd_callback callback, void *callback_data);
+
+/*
+ * Name: ext_yahoo_send_https_request
+ * This function opens HTTPS connection and sends the proper request for a specified resource
+ * by utilizing the provided method.
+ *
+ * This callback allows us to do proper proxy authentication on the user level. As well as
+ * possibly using some other routines for HTTP requests. (miranda has HTTPS netlib api)
+ * Params:
+ * yd - yahoo_data *, allows HTTPS to read/write cookies
+ * host - host to use for the request
+ * path - the path that specifies the resource to reference
+ */
+
+char *YAHOO_CALLBACK_TYPE(ext_yahoo_send_https_request)(struct yahoo_data *yd, const char *host, const char *path);
+
+#ifdef USE_STRUCT_CALLBACKS
+};
+
+/*
+ * if using a callback structure, call yahoo_register_callbacks
+ * before doing anything else
+ */
+void yahoo_register_callbacks(struct yahoo_callbacks * tyc);
+
+#undef YAHOO_CALLBACK_TYPE
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/protocols/Yahoo/libyahoo2/yahoo2_types.h b/protocols/Yahoo/libyahoo2/yahoo2_types.h
new file mode 100644
index 0000000000..e0bcf9498c
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/yahoo2_types.h
@@ -0,0 +1,432 @@
+/*
+ * libyahoo2: yahoo2_types.h
+ *
+ * Copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#ifndef YAHOO2_TYPES_H
+#define YAHOO2_TYPES_H
+
+#include "yahoo_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum yahoo_service { /* these are easier to see in hex */
+ YAHOO_SERVICE_LOGON = 1,
+ YAHOO_SERVICE_LOGOFF,
+ YAHOO_SERVICE_ISAWAY,
+ YAHOO_SERVICE_ISBACK,
+ YAHOO_SERVICE_IDLE, /* 5 (placemarker) */
+ YAHOO_SERVICE_MESSAGE,
+ YAHOO_SERVICE_IDACT,
+ YAHOO_SERVICE_IDDEACT,
+ YAHOO_SERVICE_MAILSTAT,
+ YAHOO_SERVICE_USERSTAT, /* 0xa */
+ YAHOO_SERVICE_NEWMAIL,
+ YAHOO_SERVICE_CHATINVITE,
+ YAHOO_SERVICE_CALENDAR,
+ YAHOO_SERVICE_NEWPERSONALMAIL,
+ YAHOO_SERVICE_NEWCONTACT,
+ YAHOO_SERVICE_ADDIDENT, /* 0x10 */
+ YAHOO_SERVICE_ADDIGNORE,
+ YAHOO_SERVICE_PING,
+ YAHOO_SERVICE_GOTGROUPRENAME, /* < 1, 36(old), 37(new) */
+ YAHOO_SERVICE_SYSMESSAGE = 0x14,
+ YAHOO_SERVICE_SKINNAME = 0x15,
+ YAHOO_SERVICE_PASSTHROUGH2 = 0x16,
+ YAHOO_SERVICE_CONFINVITE = 0x18,
+ YAHOO_SERVICE_CONFLOGON,
+ YAHOO_SERVICE_CONFDECLINE,
+ YAHOO_SERVICE_CONFLOGOFF,
+ YAHOO_SERVICE_CONFADDINVITE,
+ YAHOO_SERVICE_CONFMSG,
+ YAHOO_SERVICE_CHATLOGON,
+ YAHOO_SERVICE_CHATLOGOFF,
+ YAHOO_SERVICE_CHATMSG = 0x20,
+ YAHOO_SERVICE_GAMELOGON = 0x28,
+ YAHOO_SERVICE_GAMELOGOFF,
+ YAHOO_SERVICE_GAMEMSG = 0x2a,
+ YAHOO_SERVICE_FILETRANSFER = 0x46,
+ YAHOO_SERVICE_VOICECHAT = 0x4A,
+ YAHOO_SERVICE_NOTIFY,
+ YAHOO_SERVICE_VERIFY,
+ YAHOO_SERVICE_P2PFILEXFER,
+ YAHOO_SERVICE_PEERTOPEER = 0x4F, /* Checks if P2P possible */
+ YAHOO_SERVICE_WEBCAM,
+ YAHOO_SERVICE_AUTHRESP = 0x54,
+ YAHOO_SERVICE_LIST,
+ YAHOO_SERVICE_AUTH = 0x57,
+ YAHOO_SERVICE_AUTHBUDDY = 0x6d,
+ YAHOO_SERVICE_ADDBUDDY = 0x83,
+ YAHOO_SERVICE_REMBUDDY,
+ YAHOO_SERVICE_IGNORECONTACT, /* > 1, 7, 13 < 1, 66, 13, 0*/
+ YAHOO_SERVICE_REJECTCONTACT,
+ YAHOO_SERVICE_GROUPRENAME = 0x89, /* > 1, 65(new), 66(0), 67(old) */
+ YAHOO_SERVICE_KEEPALIVE = 0x8A, /* 0 - id and that's it?? */
+ YAHOO_SERVICE_CHATONLINE = 0x96, /* > 109(id), 1, 6(abcde) < 0,1*/
+ YAHOO_SERVICE_CHATGOTO,
+ YAHOO_SERVICE_CHATJOIN, /* > 1 104-room 129-1600326591 62-2 */
+ YAHOO_SERVICE_CHATLEAVE,
+ YAHOO_SERVICE_CHATEXIT = 0x9b,
+ YAHOO_SERVICE_CHATADDINVITE = 0x9d,
+ YAHOO_SERVICE_CHATLOGOUT = 0xa0,
+ YAHOO_SERVICE_CHATPING,
+ YAHOO_SERVICE_COMMENT = 0xa8,
+ YAHOO_SERVICE_GAME_INVITE = 0xb7,
+ YAHOO_SERVICE_STEALTH_PERM = 0xb9,
+ YAHOO_SERVICE_STEALTH_SESSION = 0xba,
+ YAHOO_SERVICE_AVATAR = 0xbc,
+ YAHOO_SERVICE_PICTURE_CHECKSUM = 0xbd,
+ YAHOO_SERVICE_PICTURE = 0xbe,
+ YAHOO_SERVICE_PICTURE_UPDATE = 0xc1,
+ YAHOO_SERVICE_PICTURE_UPLOAD = 0xc2,
+ YAHOO_SERVICE_YAB_UPDATE = 0xc4,
+ YAHOO_SERVICE_Y6_VISIBLE_TOGGLE = 0xc5, /* YMSG13, key 13: 2 = invisible, 1 = visible */
+ YAHOO_SERVICE_Y6_STATUS_UPDATE = 0xc6, /* YMSG13 */
+ YAHOO_SERVICE_PICTURE_SHARING = 0xc7, /* YMSG13, key 213: 0 = none, 1 = avatar, 2 = picture */
+ YAHOO_SERVICE_VERIFY_ID_EXISTS = 0xc8,
+ YAHOO_SERVICE_AUDIBLE = 0xd0,
+ YAHOO_SERVICE_Y7_PHOTO_SHARING = 0xd2,
+ YAHOO_SERVICE_Y7_CONTACT_DETAILS = 0xd3,/* YMSG13 */
+ YAHOO_SERVICE_Y7_CHAT_SESSION = 0xd4,
+ YAHOO_SERVICE_Y7_AUTHORIZATION = 0xd6, /* YMSG13 */
+ YAHOO_SERVICE_Y7_FILETRANSFER = 0xdc, /* YMSG13 */
+ YAHOO_SERVICE_Y7_FILETRANSFERINFO, /* YMSG13 */
+ YAHOO_SERVICE_Y7_FILETRANSFERACCEPT, /* YMSG13 */
+ YAHOO_SERVICE_Y7_MINGLE = 0xe1, /* YMSG13 */
+ YAHOO_SERVICE_Y7_CHANGE_GROUP = 0xe7, /* YMSG13 */
+ YAHOO_SERVICE_Y8_STATUS_UPDATE = 0xf0, /* YMSG15 */
+ YAHOO_SERVICE_Y8_LIST = 0Xf1, /* YMSG15 */
+ YAHOO_SERVICE_Y9_MESSAGE_ACK = 0Xfb, /* YMSG16 */
+ YAHOO_SERVICE_Y9_PINGBOX_LIST = 0Xfc, /* YMSG16 */
+ YAHOO_SERVICE_Y9_PINGBOX_GUEST_STATUS = 0Xfd, /* YMSG16 */
+ YAHOO_SERVICE_Y9_PINGBOX_NA = 0Xfd, /* YMSG16 */
+ YAHOO_SERVICE_WEBLOGIN = 0x0226,
+ YAHOO_SERVICE_SMS_MSG = 0x02ea,
+ YAHOO_SERVICE_Y7_DISCONNECTED = 0x07d1 /* YMSG15, saw this for Auth Failed and ping flood/ban */
+};
+
+enum yahoo_status {
+ YAHOO_STATUS_AVAILABLE = 0,
+ YAHOO_STATUS_BRB,
+ YAHOO_STATUS_BUSY,
+ YAHOO_STATUS_NOTATHOME,
+ YAHOO_STATUS_NOTATDESK,
+ YAHOO_STATUS_NOTINOFFICE,
+ YAHOO_STATUS_ONPHONE,
+ YAHOO_STATUS_ONVACATION,
+ YAHOO_STATUS_OUTTOLUNCH,
+ YAHOO_STATUS_STEPPEDOUT,
+ YAHOO_STATUS_INVISIBLE = 12,
+ YAHOO_STATUS_CUSTOM = 99,
+ YAHOO_STATUS_IDLE = 999,
+// YAHOO_STATUS_WEBLOGIN = 0x5a55aa55,
+ YAHOO_STATUS_OFFLINE = 0x5a55aa56 /* don't ask */
+};
+
+enum ypacket_status {
+ YPACKET_STATUS_DISCONNECTED = -1,
+ YPACKET_STATUS_DEFAULT = 0,
+ YPACKET_STATUS_SERVERACK = 1,
+ YPACKET_STATUS_GAME = 0x2,
+ YPACKET_STATUS_AWAY = 0x4,
+ YPACKET_STATUS_CONTINUED = 0x5,
+ YPACKET_STATUS_INVISIBLE = 12,
+ YPACKET_STATUS_NOTIFY = 0x16, /* TYPING */
+ YPACKET_STATUS_WEBLOGIN = 0x5a55aa55,
+ YPACKET_STATUS_OFFLINE = 0x5a55aa56
+};
+
+#define YAHOO_STATUS_GAME 0x2 /* Games don't fit into the regular status model */
+
+enum yahoo_login_status {
+ YAHOO_LOGIN_OK = 0,
+ YAHOO_LOGIN_LOGOFF = 1,
+ YAHOO_LOGIN_UNAME = 3,
+ YAHOO_LOGIN_PASSWD = 13,
+ YAHOO_LOGIN_LOCK = 14,
+ YAHOO_LOGIN_DUPL = 99,
+ YAHOO_LOGIN_SOCK = -1
+};
+
+enum yahoo_im_protocols {
+ YAHOO_IM_YAHOO = 0,
+ YAHOO_IM_LCS = 1,
+ YAHOO_IM_MSN = 2,
+ YAHOO_IM_SAMETIME = 9
+};
+
+enum yahoo_error {
+ E_UNKNOWN = -1,
+ E_CONNECTION = -2,
+ E_SYSTEM = -3,
+ E_CUSTOM = 0,
+
+ /* responses from ignore buddy */
+ E_IGNOREDUP = 2,
+ E_IGNORENONE = 3,
+ E_IGNORECONF = 12,
+
+ /* conference */
+ E_CONFNOTAVAIL = 20
+};
+
+enum yahoo_log_level {
+ YAHOO_LOG_NONE = 0,
+ YAHOO_LOG_FATAL,
+ YAHOO_LOG_ERR,
+ YAHOO_LOG_WARNING,
+ YAHOO_LOG_NOTICE,
+ YAHOO_LOG_INFO,
+ YAHOO_LOG_DEBUG
+};
+
+/* Yahoo Protocol versions. Thanks to GAIM devs.*/
+//#define YAHOO_WEBMESSENGER_PROTO_VER 0x0065
+#define YAHOO_WEBMESSENGER_PROTO_VER 0x000D
+//#define YAHOO_PROTO_VER 0x000c
+
+/*
+ Yahoo Protocol Versions and Client mappings
+ 11 Yahoo 5.0
+ 12 Yahoo 6.0
+ 13 Yahoo 7.0
+ 14 Yahoo 7.5
+ 15 Yahoo 8.0
+
+ per some post:
+Messenger
+
+Version 5.6
+YMSG11, 12
+
+6.0
+YMSG12
+
+Version 7.0
+YMSG12 and YMSG13
+
+Version 7.5
+YMSG14 Encrypted
+
+Version 8.0
+YMSG15 Encrypted
+
+ */
+//#define YAHOO_PROTO_VER 0x000d
+
+// Yahoo 8.1 uses protocol 15 (0x0F)
+// Yahoo 9.0 uses protocol 16 (0x10)
+//#define YAHOO_PROTO_VER 0x000F
+#define YAHOO_PROTO_VER 0x0010
+
+/* Yahoo style/color directives */
+#define YAHOO_COLOR_BLACK "\033[30m"
+#define YAHOO_COLOR_BLUE "\033[31m"
+#define YAHOO_COLOR_LIGHTBLUE "\033[32m"
+#define YAHOO_COLOR_GRAY "\033[33m"
+#define YAHOO_COLOR_GREEN "\033[34m"
+#define YAHOO_COLOR_PINK "\033[35m"
+#define YAHOO_COLOR_PURPLE "\033[36m"
+#define YAHOO_COLOR_ORANGE "\033[37m"
+#define YAHOO_COLOR_RED "\033[38m"
+#define YAHOO_COLOR_OLIVE "\033[39m"
+#define YAHOO_COLOR_ANY "\033[#"
+#define YAHOO_STYLE_ITALICON "\033[2m"
+#define YAHOO_STYLE_ITALICOFF "\033[x2m"
+#define YAHOO_STYLE_BOLDON "\033[1m"
+#define YAHOO_STYLE_BOLDOFF "\033[x1m"
+#define YAHOO_STYLE_UNDERLINEON "\033[4m"
+#define YAHOO_STYLE_UNDERLINEOFF "\033[x4m"
+#define YAHOO_STYLE_URLON "\033[lm"
+#define YAHOO_STYLE_URLOFF "\033[xlm"
+
+enum yahoo_connection_type {
+ YAHOO_CONNECTION_PAGER=0,
+ YAHOO_CONNECTION_FT,
+ YAHOO_CONNECTION_YAB,
+ YAHOO_CONNECTION_WEBCAM_MASTER,
+ YAHOO_CONNECTION_WEBCAM,
+ YAHOO_CONNECTION_CHATCAT,
+ YAHOO_CONNECTION_SEARCH
+};
+
+enum yahoo_webcam_direction_type {
+ YAHOO_WEBCAM_DOWNLOAD=0,
+ YAHOO_WEBCAM_UPLOAD
+};
+
+enum yahoo_stealth_visibility_type {
+ YAHOO_STEALTH_DEFAULT = 0,
+ YAHOO_STEALTH_ONLINE,
+ YAHOO_STEALTH_PERM_OFFLINE
+};
+
+/* chat member attribs */
+#define YAHOO_CHAT_MALE 0x8000
+#define YAHOO_CHAT_FEMALE 0x10000
+#define YAHOO_CHAT_DUNNO 0x400
+#define YAHOO_CHAT_WEBCAM 0x10
+
+enum yahoo_webcam_conn_type { Y_WCM_DIALUP, Y_WCM_DSL, Y_WCM_T1 };
+
+struct yahoo_webcam {
+ int direction; /* Uploading or downloading */
+ int conn_type; /* 0=Dialup, 1=DSL/Cable, 2=T1/Lan */
+
+ char *user; /* user we are viewing */
+ char *server; /* webcam server to connect to */
+ int port; /* webcam port to connect on */
+ char *key; /* key to connect to the server with */
+ char *description; /* webcam description */
+ char *my_ip; /* own ip number */
+};
+
+struct yahoo_webcam_data {
+ int data_size;
+ int to_read;
+ unsigned int timestamp;
+ unsigned char packet_type;
+};
+
+struct yahoo_server_settings {
+ char *pager_host;
+ int pager_port;
+ char *filetransfer_host;
+ int filetransfer_port;
+ char *webcam_host;
+ int webcam_port;
+ char *webcam_description;
+ char *local_host;
+ int conn_type;
+ int pic_cksum;
+ int web_messenger;
+ char *login_host;
+};
+
+struct yahoo_data {
+ char *user;
+ char *password;
+ char *pw_token;
+
+ char *cookie_y;
+ char *cookie_t;
+ char *cookie_c;
+ char *cookie_b;
+ char *login_cookie;
+
+ YList *buddies;
+ YList *ignore;
+ YList *identities;
+ char *login_id;
+
+ enum yahoo_status current_status;
+ enum yahoo_status initial_status;
+ int logged_in;
+
+ int session_id;
+
+ int client_id;
+ long session_timestamp;
+
+ char *rawbuddylist;
+ char *rawstealthlist;
+ char *ignorelist;
+ char *ygrp;
+
+ struct yahoo_server_settings *server_settings;
+};
+
+struct yab {
+ char *id;
+ char *fname;
+ char *lname;
+ char *nname;
+ char *email;
+ char *hphone;
+ char *wphone;
+ char *mphone;
+ int dbid;
+};
+
+struct yahoo_buddy {
+ char *group;
+ char *id;
+ char *real_name;
+ int protocol;
+ int stealth;
+ int auth;
+ struct yab *yab_entry;
+};
+
+enum yahoo_search_type {
+ YAHOO_SEARCH_KEYWORD = 0,
+ YAHOO_SEARCH_YID,
+ YAHOO_SEARCH_NAME
+};
+
+enum yahoo_search_gender {
+ YAHOO_GENDER_NONE = 0,
+ YAHOO_GENDER_MALE,
+ YAHOO_GENDER_FEMALE
+};
+
+enum yahoo_search_agerange {
+ YAHOO_AGERANGE_NONE = 0
+};
+
+struct yahoo_found_contact {
+ char *id;
+ char *gender;
+ char *location;
+ int age;
+ int online;
+};
+
+/*
+ * Function pointer to be passed to http get/post and send file
+ */
+typedef void (*yahoo_get_fd_callback)(int id, int fd, int error, void *data);
+
+/*
+ * Function pointer to be passed to yahoo_get_url_handle
+ */
+typedef void (*yahoo_get_url_handle_callback)(int id, int fd, int error,
+ const char *filename, unsigned long size, void *data);
+
+
+struct yahoo_chat_member {
+ char *id;
+ int age;
+ int attribs;
+ char *alias;
+ char *location;
+};
+
+struct yahoo_file_info {
+ char *filename;
+ unsigned long filesize;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/protocols/Yahoo/libyahoo2/yahoo_debug.h b/protocols/Yahoo/libyahoo2/yahoo_debug.h
new file mode 100644
index 0000000000..b9d048b53d
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/yahoo_debug.h
@@ -0,0 +1,58 @@
+/*
+ * libyahoo2: yahoo_debug.h
+ *
+ * Copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#if defined( _MSC_VER )
+ int yahoo_log_message(char *fmt, ...);
+#else
+ int yahoo_log_message(char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
+#endif
+
+/*
+#define NOTICE(x) if(yahoo_get_log_level() >= YAHOO_LOG_NOTICE) { yahoo_log_message x; yahoo_log_message("\n"); }
+
+#define LOG(x) if(yahoo_get_log_level() >= YAHOO_LOG_INFO) { yahoo_log_message("%s:%d: ", __FILE__, __LINE__); \
+ yahoo_log_message x; \
+ yahoo_log_message("\n"); }
+
+#define WARNING(x) if(yahoo_get_log_level() >= YAHOO_LOG_WARNING) { yahoo_log_message("%s:%d: warning: ", __FILE__, __LINE__); \
+ yahoo_log_message x; \
+ yahoo_log_message("\n"); }
+
+#define DEBUG_MSG(x) if(yahoo_get_log_level() >= YAHOO_LOG_DEBUG) { yahoo_log_message("%s:%d: debug: ", __FILE__, __LINE__); \
+ yahoo_log_message x; \
+ yahoo_log_message("\n"); }
+*/
+#define NOTICE(x) if(yahoo_get_log_level() >= YAHOO_LOG_NOTICE) { yahoo_log_message x; yahoo_log_message(" "); }
+
+#define LOG(x) if(yahoo_get_log_level() >= YAHOO_LOG_INFO) { yahoo_log_message("%s:%d: ", __FILE__, __LINE__); \
+ yahoo_log_message x; \
+ yahoo_log_message(" "); }
+
+#define WARNING(x) if(yahoo_get_log_level() >= YAHOO_LOG_WARNING) { yahoo_log_message("%s:%d: warning: ", __FILE__, __LINE__); \
+ yahoo_log_message x; \
+ yahoo_log_message(" "); }
+
+#define DEBUG_MSG(x) if(yahoo_get_log_level() >= YAHOO_LOG_DEBUG) { yahoo_log_message("%s:%d: debug: ", __FILE__, __LINE__); \
+ yahoo_log_message x; \
+ yahoo_log_message(" "); }
+
+#define DEBUG_MSG1(x) if(yahoo_get_log_level() >= YAHOO_LOG_DEBUG) { \
+ yahoo_log_message x; }
diff --git a/protocols/Yahoo/libyahoo2/yahoo_httplib.c b/protocols/Yahoo/libyahoo2/yahoo_httplib.c
new file mode 100644
index 0000000000..39b33fa2e1
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/yahoo_httplib.c
@@ -0,0 +1,455 @@
+/*
+ * libyahoo2: yahoo_httplib.c
+ *
+ * Copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if STDC_HEADERS
+# include <string.h>
+#else
+# if !HAVE_STRCHR
+# define strchr index
+# define strrchr rindex
+# endif
+char *strchr (), *strrchr ();
+# if !HAVE_MEMCPY
+# define memcpy(d, s, n) bcopy ((s), (d), (n))
+# define memmove(d, s, n) bcopy ((s), (d), (n))
+# endif
+#endif
+
+
+#include <errno.h>
+
+/* special check for MSVC compiler */
+#ifndef _MSC_VER
+#ifndef __GNUC__
+ #include <unistd.h>
+#endif
+#endif
+
+#include <ctype.h>
+#include "yahoo2.h"
+#include "yahoo2_callbacks.h"
+#include "yahoo_httplib.h"
+#include "yahoo_util.h"
+
+#include "yahoo_debug.h"
+
+#ifdef USE_STRUCT_CALLBACKS
+extern struct yahoo_callbacks *yc;
+#define YAHOO_CALLBACK(x) yc->x
+#else
+#define YAHOO_CALLBACK(x) x
+#endif
+
+extern enum yahoo_log_level log_level;
+
+int yahoo_tcp_readline(char *ptr, int maxlen, int fd)
+{
+ int n, rc;
+ char c;
+
+ for (n = 1; n < maxlen; n++) {
+
+ do {
+ rc = read(fd, &c, 1);
+ } while(rc == -1 && (errno == EINTR || errno == EAGAIN)); /* this is bad - it should be done asynchronously */
+
+ if (rc == 1) {
+ if(c == '\r') /* get rid of \r */
+ continue;
+ *ptr = c;
+ if (c == '\n')
+ break;
+ ptr++;
+ } else if (rc == 0) {
+ if (n == 1)
+ return (0); /* EOF, no data */
+ else
+ break; /* EOF, w/ data */
+ } else {
+ return -1;
+ }
+ }
+
+ *ptr = 0;
+ return (n);
+}
+
+int url_to_host_port_path(const char *url, char *host, int *port, char *path)
+{
+ char *urlcopy=NULL;
+ char *slash=NULL;
+ char *colon=NULL;
+
+ /*
+ * http://hostname
+ * http://hostname/
+ * http://hostname/path
+ * http://hostname/path:foo
+ * http://hostname:port
+ * http://hostname:port/
+ * http://hostname:port/path
+ * http://hostname:port/path:foo
+ */
+
+ if(strstr(url, "http://") == url) {
+ urlcopy = strdup(url+7);
+ } else {
+ WARNING(("Weird url - unknown protocol: %s", url));
+ return 0;
+ }
+
+ slash = strchr(urlcopy, '/');
+ colon = strchr(urlcopy, ':');
+
+ if(!colon || (slash && slash < colon)) {
+ *port = 80;
+ } else {
+ *colon = 0;
+ *port = atoi(colon+1);
+ }
+
+ if(!slash) {
+ strcpy(path, "/");
+ } else {
+ strcpy(path, slash);
+ *slash = 0;
+ }
+
+ strcpy(host, urlcopy);
+
+ FREE(urlcopy);
+
+ return 1;
+}
+
+static int isurlchar(unsigned char c)
+{
+ return (isalnum(c) || '-' == c || '_' == c);
+}
+
+char *yahoo_urlencode(const char *instr)
+{
+ int ipos=0, bpos=0;
+ char *str = NULL;
+ int len = strlen(instr);
+
+ if(!(str = y_new(char, 3*len + 1) ))
+ return "";
+
+ while(instr[ipos]) {
+ while(isurlchar(instr[ipos]))
+ str[bpos++] = instr[ipos++];
+ if(!instr[ipos])
+ break;
+
+ snprintf(&str[bpos], 4, "%%%.2x", instr[ipos]);
+ bpos+=3;
+ ipos++;
+ }
+ str[bpos]='\0';
+
+ /* free extra alloc'ed mem. */
+ len = strlen(str);
+ str = y_renew(char, str, len+1);
+
+ return (str);
+}
+
+char *yahoo_urldecode(const char *instr)
+{
+ int ipos=0, bpos=0;
+ char *str = NULL;
+ char entity[3]={0,0,0};
+ unsigned dec;
+ int len = strlen(instr);
+
+ if(!(str = y_new(char, len+1) ))
+ return "";
+
+ while(instr[ipos]) {
+ while(instr[ipos] && instr[ipos]!='%')
+ if(instr[ipos]=='+') {
+ str[bpos++]=' ';
+ ipos++;
+ } else
+ str[bpos++] = instr[ipos++];
+ if(!instr[ipos])
+ break;
+
+ if(instr[ipos+1] && instr[ipos+2]) {
+ ipos++;
+ entity[0]=instr[ipos++];
+ entity[1]=instr[ipos++];
+ sscanf(entity, "%2x", &dec);
+ str[bpos++] = (char)dec;
+ } else {
+ str[bpos++] = instr[ipos++];
+ }
+ }
+ str[bpos]='\0';
+
+ /* free extra alloc'ed mem. */
+ len = strlen(str);
+ str = y_renew(char, str, len+1);
+
+ return (str);
+}
+
+char *yahoo_xmldecode(const char *instr)
+{
+ int ipos=0, bpos=0, epos=0;
+ char *str = NULL;
+ char entity[4]={0,0,0,0};
+ char *entitymap[5][2]={
+ {"amp;", "&"},
+ {"quot;", "\""},
+ {"lt;", "<"},
+ {"gt;", "<"},
+ {"nbsp;", " "}
+ };
+ unsigned dec;
+ int len = strlen(instr);
+
+ if(!(str = y_new(char, len+1) ))
+ return "";
+
+ while(instr[ipos]) {
+ while(instr[ipos] && instr[ipos]!='&')
+ if(instr[ipos]=='+') {
+ str[bpos++]=' ';
+ ipos++;
+ } else
+ str[bpos++] = instr[ipos++];
+ if(!instr[ipos] || !instr[ipos+1])
+ break;
+ ipos++;
+
+ if(instr[ipos] == '#') {
+ ipos++;
+ epos=0;
+ while(instr[ipos] != ';')
+ entity[epos++]=instr[ipos++];
+ sscanf(entity, "%u", &dec);
+ str[bpos++] = (char)dec;
+ ipos++;
+ } else {
+ int i;
+ for (i=0; i<5; i++)
+ if(!strncmp(instr+ipos, entitymap[i][0],
+ strlen(entitymap[i][0]))) {
+ str[bpos++] = entitymap[i][1][0];
+ ipos += strlen(entitymap[i][0]);
+ break;
+ }
+ }
+ }
+ str[bpos]='\0';
+
+ /* free extra alloc'ed mem. */
+ len = strlen(str);
+ str = y_renew(char, str, len+1);
+
+ return (str);
+}
+
+typedef void (*http_connected)(int id, int fd, int error);
+
+struct callback_data {
+ int id;
+ yahoo_get_fd_callback callback;
+ char *request;
+ void *user_data;
+};
+
+static void connect_complete(int fd, int error, void *data)
+{
+ struct callback_data *ccd = (struct callback_data *) data;
+
+ if(error == 0 && fd > 0)
+ write(fd, ccd->request, strlen(ccd->request));
+
+ FREE(ccd->request);
+ ccd->callback(ccd->id, fd, error, ccd->user_data);
+ FREE(ccd);
+}
+
+static void yahoo_send_http_request(int id, char *host, int port, char *request,
+ yahoo_get_fd_callback callback, void *data)
+{
+ struct callback_data *ccd=y_new0(struct callback_data, 1);
+ ccd->callback = callback;
+ ccd->id = id;
+ ccd->request = strdup(request);
+ ccd->user_data = data;
+
+ YAHOO_CALLBACK(ext_yahoo_connect_async)(id, host, port, YAHOO_CONNECTION_FT, connect_complete, ccd);
+}
+
+void yahoo_http_post(int id, const char *url, const char *cookies, long content_length,
+ yahoo_get_fd_callback callback, void *data)
+{
+ char host[255];
+ int port = 80;
+ char path[255];
+ char ck[2048];
+ char buff[4096];
+
+ if(!url_to_host_port_path(url, host, &port, path))
+ return;
+
+ if (cookies == NULL || cookies[0] == '\0')
+ ck[0] = '\0';
+ else
+ snprintf(ck, sizeof(ck), "Cookie: %s\r\n", cookies);
+
+ snprintf(buff, sizeof(buff),
+ "POST %s HTTP/1.0\r\n"
+ "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\n"
+ "Pragma: no-cache\r\n"
+ "Host: %s\r\n"
+ "Content-Length: %ld\r\n"
+ "%s"
+ "\r\n",
+ path,
+ host, content_length,
+ ck);
+
+ yahoo_send_http_request(id, host, port, buff, callback, data);
+}
+
+void yahoo_http_get(int id, const char *url, const char *cookies,
+ yahoo_get_fd_callback callback, void *data)
+{
+ char host[255];
+ int port = 80;
+ char path[255];
+ char ck[2048];
+ char buff[4096];
+
+ if(!url_to_host_port_path(url, host, &port, path))
+ return;
+
+ if (cookies == NULL || cookies[0] == '\0')
+ ck[0] = '\0';
+ else
+ snprintf(ck, sizeof(ck), "Cookie: %s\r\n", cookies);
+
+ snprintf(buff, sizeof(buff),
+ "GET %s HTTP/1.0\r\n"
+ "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\n"
+ "Pragma: no-cache\r\n"
+ "Host: %s\r\n"
+ "%s"
+ "\r\n",
+ path, host, ck);
+
+ yahoo_send_http_request(id, host, port, buff, callback, data);
+}
+
+struct url_data {
+ yahoo_get_url_handle_callback callback;
+ void *user_data;
+};
+
+static void yahoo_got_url_fd(int id, int fd, int error, void *data)
+{
+ char *tmp=NULL;
+ char buff[1024];
+ unsigned long filesize=0;
+ char *filename=NULL;
+ int n;
+
+ struct url_data *ud = (struct url_data *) data;
+
+ if(error || fd < 0) {
+ ud->callback(id, fd, error, filename, filesize, ud->user_data);
+ FREE(ud);
+ return;
+ }
+
+ while((n=yahoo_tcp_readline(buff, sizeof(buff), fd)) > 0) {
+ LOG(("Read:%s:\n", buff));
+ if(!strcmp(buff, ""))
+ break;
+
+ if( !strncasecmp(buff, "Content-length:",
+ strlen("Content-length:")) ) {
+ tmp = strrchr(buff, ' ');
+ if(tmp)
+ filesize = atol(tmp);
+ }
+
+ if( !strncasecmp(buff, "Content-disposition:",
+ strlen("Content-disposition:")) ) {
+ tmp = strstr(buff, "name=");
+ if(tmp) {
+ tmp+=strlen("name=");
+ if(tmp[0] == '"') {
+ char *tmp2;
+ tmp++;
+ tmp2 = strchr(tmp, '"');
+ if(tmp2)
+ *tmp2 = '\0';
+ } else {
+ char *tmp2;
+ tmp2 = strchr(tmp, ';');
+ if(!tmp2)
+ tmp2 = strchr(tmp, '\r');
+ if(!tmp2)
+ tmp2 = strchr(tmp, '\n');
+ if(tmp2)
+ *tmp2 = '\0';
+ }
+
+ filename = strdup(tmp);
+ }
+ }
+ }
+
+ LOG(("n == %d\n", n));
+ LOG(("Calling callback, filename:%s, size: %ld\n", filename, filesize));
+ ud->callback(id, fd, error, filename, filesize, ud->user_data);
+ FREE(ud);
+ FREE(filename);
+}
+
+void yahoo_get_url_fd(int id, const char *url, const struct yahoo_data *yd,
+ yahoo_get_url_handle_callback callback, void *data)
+{
+ char buff[1024];
+ struct url_data *ud = y_new0(struct url_data, 1);
+
+ //buff[0]='\0'; /*don't send them our cookies!! */
+ snprintf(buff, sizeof(buff), "Y=%s; T=%s; B=%s", yd->cookie_y, yd->cookie_t, yd->cookie_b);
+
+ ud->callback = callback;
+ ud->user_data = data;
+// yahoo_http_get(id, url, buff, yahoo_got_url_fd, ud);
+ YAHOO_CALLBACK(ext_yahoo_send_http_request)(id, YAHOO_CONNECTION_FT, "GET", url, buff, 0, yahoo_got_url_fd, ud);
+}
+
diff --git a/protocols/Yahoo/libyahoo2/yahoo_httplib.h b/protocols/Yahoo/libyahoo2/yahoo_httplib.h
new file mode 100644
index 0000000000..1698928928
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/yahoo_httplib.h
@@ -0,0 +1,49 @@
+/*
+ * libyahoo2: yahoo_httplib.h
+ *
+ * Copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#ifndef YAHOO_HTTPLIB_H
+#define YAHOO_HTTPLIB_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "yahoo2_types.h"
+
+char *yahoo_urlencode(const char *instr);
+char *yahoo_urldecode(const char *instr);
+char *yahoo_xmldecode(const char *instr);
+
+int yahoo_tcp_readline(char *ptr, int maxlen, int fd);
+void yahoo_http_post(int id, const char *url, const char *cookies, long size,
+ yahoo_get_fd_callback callback, void *data);
+void yahoo_http_get(int id, const char *url, const char *cookies,
+ yahoo_get_fd_callback callback, void *data);
+void yahoo_get_url_fd(int id, const char *url, const struct yahoo_data *yd,
+ yahoo_get_url_handle_callback callback, void *data);
+
+int url_to_host_port_path(const char *url, char *host, int *port, char *path);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/protocols/Yahoo/libyahoo2/yahoo_list.c b/protocols/Yahoo/libyahoo2/yahoo_list.c
new file mode 100644
index 0000000000..ae7e86b9c6
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/yahoo_list.c
@@ -0,0 +1,236 @@
+/*
+ * yahoo_list.c: linked list routines
+ *
+ * Some code copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net>
+ * Other code copyright Meredydd Luff <meredydd AT everybuddy.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Some of this code was borrowed from elist.c in the eb-lite sources
+ *
+ */
+
+#include <stdlib.h>
+
+#include "yahoo_list.h"
+
+YList *y_list_append(YList * list, void *data)
+{
+ YList *n;
+ YList *new_list = (YList *) malloc(sizeof(YList));
+ YList *attach_to = NULL;
+
+ new_list->next = NULL;
+ new_list->data = data;
+
+ for (n = list; n != NULL; n = n->next) {
+ attach_to = n;
+ }
+
+ if (attach_to == NULL) {
+ new_list->prev = NULL;
+ return new_list;
+ } else {
+ new_list->prev = attach_to;
+ attach_to->next = new_list;
+ return list;
+ }
+}
+
+YList *y_list_prepend(YList * list, void *data)
+{
+ YList *n = (YList *) malloc(sizeof(YList));
+
+ n->next = list;
+ n->prev = NULL;
+ n->data = data;
+ if (list)
+ list->prev = n;
+
+ return n;
+}
+
+YList *y_list_concat(YList * list, YList * add)
+{
+ YList *l;
+
+ if(!list)
+ return add;
+
+ if(!add)
+ return list;
+
+ for (l = list; l->next; l = l->next)
+ ;
+
+ l->next = add;
+ add->prev = l;
+
+ return list;
+}
+
+YList *y_list_remove(YList * list, void *data)
+{
+ YList *n;
+
+ for (n = list; n != NULL; n = n->next) {
+ if (n->data == data) {
+ list=y_list_remove_link(list, n);
+ y_list_free_1(n);
+ break;
+ }
+ }
+
+ return list;
+}
+
+/* Warning */
+/* link MUST be part of list */
+/* caller must free link using y_list_free_1 */
+YList *y_list_remove_link(YList * list, const YList * link)
+{
+ if (!link)
+ return list;
+
+ if (link->next)
+ link->next->prev = link->prev;
+ if (link->prev)
+ link->prev->next = link->next;
+
+ if (link == list)
+ list = link->next;
+
+ return list;
+}
+
+int y_list_length(const YList * list)
+{
+ int retval = 0;
+ const YList *n = list;
+
+ for (n = list; n != NULL; n = n->next) {
+ retval++;
+ }
+
+ return retval;
+}
+
+/* well, you could just check for list == NULL, but that would be
+ * implementation dependent
+ */
+int y_list_empty(const YList * list)
+{
+ if(!list)
+ return 1;
+ else
+ return 0;
+}
+
+int y_list_singleton(const YList * list)
+{
+ if(!list || list->next)
+ return 0;
+ return 1;
+}
+
+YList *y_list_copy(YList * list)
+{
+ YList *n;
+ YList *copy = NULL;
+
+ for (n = list; n != NULL; n = n->next) {
+ copy = y_list_append(copy, n->data);
+ }
+
+ return copy;
+}
+
+void y_list_free_1(YList * list)
+{
+ free(list);
+}
+
+void y_list_free(YList * list)
+{
+ YList *n = list;
+
+ while (n != NULL) {
+ YList *next = n->next;
+ free(n);
+ n = next;
+ }
+}
+
+YList *y_list_find(YList * list, const void *data)
+{
+ YList *l;
+ for (l = list; l && l->data != data; l = l->next)
+ ;
+
+ return l;
+}
+
+void y_list_foreach(YList * list, YListFunc fn, void * user_data)
+{
+ for (; list; list = list->next)
+ fn(list->data, user_data);
+}
+
+YList *y_list_find_custom(YList * list, const void *data, YListCompFunc comp)
+{
+ YList *l;
+ for (l = list; l; l = l->next)
+ if (comp(l->data, data) == 0)
+ return l;
+
+ return NULL;
+}
+
+YList *y_list_nth(YList * list, int n)
+{
+ int i=n;
+ for ( ; list && i; list = list->next, i--)
+ ;
+
+ return list;
+}
+
+YList *y_list_insert_sorted(YList * list, void *data, YListCompFunc comp)
+{
+ YList *l, *n, *prev = NULL;
+ if (!list)
+ return y_list_append(list, data);
+
+ n = (YList *) malloc(sizeof(YList));
+ n->data = data;
+ for (l = list; l && comp(l->data, n->data) <= 0; l = l->next)
+ prev = l;
+
+ if (l) {
+ n->prev = l->prev;
+ l->prev = n;
+ } else
+ n->prev = prev;
+
+ n->next = l;
+
+ if(n->prev) {
+ n->prev->next = n;
+ return list;
+ } else {
+ return n;
+ }
+
+}
diff --git a/protocols/Yahoo/libyahoo2/yahoo_list.h b/protocols/Yahoo/libyahoo2/yahoo_list.h
new file mode 100644
index 0000000000..abb2c647cd
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/yahoo_list.h
@@ -0,0 +1,74 @@
+/*
+ * yahoo_list.h: linked list routines
+ *
+ * Some code copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net>
+ * Other code copyright Meredydd Luff <meredydd AT everybuddy.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * This is a replacement for the GList. It only provides functions that
+ * we use in Ayttm. Thanks to Meredyyd from everybuddy dev for doing
+ * most of it.
+ */
+
+#ifndef __YLIST_H__
+#define __YLIST_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _YList {
+ struct _YList *next;
+ struct _YList *prev;
+ void *data;
+} YList;
+
+typedef int (*YListCompFunc) (const void *, const void *);
+typedef void (*YListFunc) (void *, void *);
+
+YList *y_list_append(YList * list, void *data);
+YList *y_list_prepend(YList * list, void *data);
+YList *y_list_remove_link(YList * list, const YList * link);
+YList *y_list_remove(YList * list, void *data);
+
+YList *y_list_insert_sorted(YList * list, void * data, YListCompFunc comp);
+
+YList *y_list_copy(YList * list);
+
+YList *y_list_concat(YList * list, YList * add);
+
+YList *y_list_find(YList * list, const void *data);
+YList *y_list_find_custom(YList * list, const void *data, YListCompFunc comp);
+
+YList *y_list_nth(YList * list, int n);
+
+void y_list_foreach(YList * list, YListFunc fn, void *user_data);
+
+void y_list_free_1(YList * list);
+void y_list_free(YList * list);
+int y_list_length(const YList * list);
+int y_list_empty(const YList * list);
+int y_list_singleton(const YList * list);
+
+#define y_list_next(list) list->next
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/protocols/Yahoo/libyahoo2/yahoo_util.c b/protocols/Yahoo/libyahoo2/yahoo_util.c
new file mode 100644
index 0000000000..a2de75c050
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/yahoo_util.c
@@ -0,0 +1,161 @@
+/*
+ * libyahoo2: yahoo_util.c
+ *
+ * Copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#if STDC_HEADERS
+# include <string.h>
+#else
+# if !HAVE_STRCHR
+# define strchr index
+# define strrchr rindex
+# endif
+char *strchr (), *strrchr ();
+# if !HAVE_MEMCPY
+# define memcpy(d, s, n) bcopy ((s), (d), (n))
+# define memmove(d, s, n) bcopy ((s), (d), (n))
+# endif
+#endif
+
+#include "yahoo_util.h"
+
+char * y_string_append(char * string, char * append)
+{
+ int size = strlen(string) + strlen(append) + 1;
+ char * new_string = y_renew(char, string, size);
+
+ if(new_string == NULL) {
+ new_string = y_new(char, size);
+ strcpy(new_string, string);
+ FREE(string);
+ }
+
+ strcat(new_string, append);
+
+ return new_string;
+}
+
+/*char * y_str_to_utf8(const char *in)
+{
+ unsigned int n, i = 0;
+ char *result = NULL;
+
+ if(in == NULL || *in == '\0')
+ return "";
+
+ result = y_new(char, strlen(in) * 2 + 1);
+
+ // convert a string to UTF-8 Format
+ for (n = 0; n < strlen(in); n++) {
+ unsigned char c = (unsigned char)in[n];
+
+ if (c < 128) {
+ result[i++] = (char) c;
+ } else {
+ result[i++] = (char) ((c >> 6) | 192);
+ result[i++] = (char) ((c & 63) | 128);
+ }
+ }
+ result[i] = '\0';
+ return result;
+}
+
+char * y_utf8_to_str(const char *in)
+{
+ int i = 0;
+ unsigned int n;
+ char *result = NULL;
+
+ if(in == NULL || *in == '\0')
+ return "";
+
+ result = y_new(char, strlen(in) + 1);
+
+ // convert a string from UTF-8 Format
+ for (n = 0; n < strlen(in); n++) {
+ unsigned char c = in[n];
+
+ if (c < 128) {
+ result[i++] = (char) c;
+ } else {
+ result[i++] = (c << 6) | (in[++n] & 63);
+ }
+ }
+ result[i] = '\0';
+ return result;
+} */
+
+#if !HAVE_GLIB
+
+void y_strfreev(char ** vector)
+{
+ char **v;
+ for(v = vector; *v; v++) {
+ FREE(*v);
+ }
+ FREE(vector);
+}
+
+char ** y_strsplit(char * str, char * sep, int nelem)
+{
+ char ** vector;
+ char *s, *p;
+ int i=0;
+ int l = strlen(sep);
+ if(nelem <= 0) {
+ char * s;
+ nelem=0;
+ if (*str) {
+ for(s=strstr(str, sep); s; s=strstr(s+l, sep),nelem++)
+ ;
+ if(strcmp(str+strlen(str)-l, sep))
+ nelem++;
+ }
+ }
+
+ vector = y_new(char *, nelem + 1);
+
+ for(p=str, s=strstr(p,sep); i<nelem && s; p=s+l, s=strstr(p,sep), i++) {
+ int len = s-p;
+ vector[i] = y_new(char, len+1);
+ strncpy(vector[i], p, len);
+ vector[i][len] = '\0';
+ }
+
+ if(i<nelem && *str) /* str didn't end with sep, and str isn't empty */
+ vector[i++] = strdup(p);
+
+ vector[i] = NULL;
+
+ return vector;
+}
+
+void * y_memdup(const void * addr, int n)
+{
+ void * new_chunk = malloc(n);
+ if(new_chunk)
+ memcpy(new_chunk, addr, n);
+ return new_chunk;
+}
+
+#endif
diff --git a/protocols/Yahoo/libyahoo2/yahoo_util.h b/protocols/Yahoo/libyahoo2/yahoo_util.h
new file mode 100644
index 0000000000..b6a22dea47
--- /dev/null
+++ b/protocols/Yahoo/libyahoo2/yahoo_util.h
@@ -0,0 +1,109 @@
+/*
+ * libyahoo2: yahoo_util.h
+ *
+ * Copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#ifndef __YAHOO_UTIL_H__
+#define __YAHOO_UTIL_H__
+
+#if HAVE_GLIB
+# include <glib.h>
+
+# define FREE(x) if(x) {g_free(x); x=NULL;}
+
+# define y_new g_new
+# define y_new0 g_new0
+# define y_renew g_renew
+
+# define y_memdup g_memdup
+# define y_strsplit g_strsplit
+# define y_strfreev g_strfreev
+# ifndef strdup
+# define strdup g_strdup
+# endif
+# ifndef strncasecmp
+# define strncasecmp g_strncasecmp
+# define strcasecmp g_strcasecmp
+# endif
+
+# define snprintf g_snprintf
+# define vsnprintf g_vsnprintf
+
+#else
+
+# include <stdlib.h>
+# include <stdarg.h>
+
+# define FREE(x) if(x) {free(x); x=NULL;}
+
+# define y_new(type, n) (type *)malloc(sizeof(type) * (n))
+# define y_new0(type, n) (type *)calloc((n), sizeof(type))
+# define y_renew(type, mem, n) (type *)realloc(mem, n)
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+void * y_memdup(const void * addr, int n);
+char ** y_strsplit(char * str, char * sep, int nelem);
+void y_strfreev(char ** vector);
+
+#ifndef _WIN32
+int strncasecmp(const char * s1, const char * s2, size_t n);
+int strcasecmp(const char * s1, const char * s2);
+
+char * strdup(const char *s);
+
+int snprintf(char *str, size_t size, const char *format, ...);
+int vsnprintf(char *str, size_t size, const char *format, va_list ap);
+#endif
+
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef MIN
+#define MIN(x,y) ((x)<(y)?(x):(y))
+#endif
+
+#ifndef MAX
+#define MAX(x,y) ((x)>(y)?(x):(y))
+#endif
+
+/*
+ * The following three functions return newly allocated memory.
+ * You must free it yourself
+ */
+char * y_string_append(char * str, char * append);
+/*char * y_str_to_utf8(const char * in);
+char * y_utf8_to_str(const char * in);*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/protocols/Yahoo/links.cpp b/protocols/Yahoo/links.cpp
new file mode 100644
index 0000000000..8af33e94b3
--- /dev/null
+++ b/protocols/Yahoo/links.cpp
@@ -0,0 +1,184 @@
+/*
+ * $Id: services.c 5376 2007-05-07 16:13:18Z gena01 $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+
+#include "yahoo.h"
+
+#include "m_addcontact.h"
+#include "m_message.h"
+#include "m_assocmgr.h"
+
+#include "resource.h"
+
+static HANDLE hServiceParseLink;
+
+static int SingleHexToDecimal(TCHAR c)
+{
+ if (c >= '0' && c <= '9') return c - '0';
+ if (c >= 'a' && c <= 'f') return c - 'a' + 10;
+ if (c >= 'A' && c <= 'F') return c - 'A' + 10;
+ return -1;
+}
+
+static void url_decode(TCHAR* str)
+{
+ TCHAR* s = str, *d = str;
+
+ while(*s)
+ {
+ if (*s == '%')
+ {
+ int digit1 = SingleHexToDecimal(s[1]);
+ if (digit1 != -1)
+ {
+ int digit2 = SingleHexToDecimal(s[2]);
+ if (digit2 != -1)
+ {
+ s += 3;
+ *d++ = (TCHAR)((digit1 << 4) | digit2);
+ continue;
+ }
+ }
+ }
+ *d++ = *s++;
+ }
+
+ *d = 0;
+}
+
+static char* get_buddy(TCHAR ** arg)
+{
+ TCHAR *buf = *arg;
+
+ TCHAR *tok = _tcschr(buf, '&'); /* first token */
+ if (tok) *tok = 0;
+
+ if (!buf[0]) return NULL;
+ url_decode(buf);
+
+ *arg = tok ? tok + 1 : NULL;
+
+ return mir_t2a(buf);
+}
+
+
+/*
+ add user: ymsgr:addfriend?ID
+ send message: ymsgr:sendim?ID&m=MESSAGE
+ add chatroom: ymsgr:chat?ROOM
+*/
+static INT_PTR ServiceParseYmsgrLink(WPARAM wParam, LPARAM lParam)
+{
+ TCHAR *arg = (TCHAR*)lParam;
+ if (arg == NULL) return 1; /* sanity check */
+
+ /* skip leading prefix */
+ arg = _tcschr(arg, ':');
+ if (arg == NULL) return 1; /* parse failed */
+
+ for (++arg; *arg == '/'; ++arg) {}
+
+ if (g_instances.getCount() == 0) return 0;
+
+ CYahooProto *proto = g_instances[0];
+ for (int i = 0; i < g_instances.getCount(); ++i)
+ {
+ if (g_instances[i]->m_iStatus > ID_STATUS_OFFLINE)
+ {
+ proto = g_instances[i];
+ break;
+ }
+ }
+ if (!proto) return 1;
+
+ /* add a contact to the list */
+ if (!_tcsnicmp(arg, _T("addfriend?"), 10))
+ {
+ arg += 10;
+
+ char *id = get_buddy(&arg);
+ if (!id) return 1;
+
+ if (proto->getbuddyH(id) == NULL) /* does not yet check if id is current user */
+ {
+ ADDCONTACTSTRUCT acs = {0};
+ PROTOSEARCHRESULT psr = {0};
+
+ acs.handleType = HANDLE_SEARCHRESULT;
+ acs.szProto = proto->m_szModuleName;
+ acs.psr = &psr;
+
+ psr.cbSize = sizeof(PROTOSEARCHRESULT);
+ psr.id = (TCHAR*)id;
+ CallService(MS_ADDCONTACT_SHOW, 0, (LPARAM)&acs);
+ }
+
+ mir_free(id);
+ return 0;
+ }
+ /* send a message to a contact */
+ else if (!_tcsnicmp(arg, _T("sendim?"), 7))
+ {
+ arg += 7;
+
+ char *id = get_buddy(&arg);
+ if (!id) return 1;
+
+ TCHAR *msg = NULL;
+
+ while (arg)
+ {
+ if (!_tcsnicmp(arg, _T("m="), 2))
+ {
+ msg = arg + 2;
+ url_decode(msg);
+ break;
+ }
+
+ arg = _tcschr(arg + 1, '&'); /* first token */
+ if (arg) *arg = 0;
+ }
+
+ HANDLE hContact = proto->add_buddy(id, id, 0, PALF_TEMPORARY); /* ensure contact is on list */
+ if (hContact)
+ CallService(MS_MSG_SENDMESSAGET, (WPARAM)hContact, (LPARAM)msg);
+
+ mir_free(id);
+ return 0;
+ }
+ /* open a chatroom */
+ else if (!_tcsnicmp(arg, _T("chat?"), 5))
+ {
+ arg += 5;
+
+// char *id = get_buddy(&arg);
+// if (!id) return 1;
+
+ /* not yet implemented (rm contains name of chatroom)*/
+ return 0;
+ }
+ return 1; /* parse failed */
+}
+
+void YmsgrLinksInit(void)
+{
+ static const char szService[] = "YAHOO/ParseYmsgrLink";
+
+ hServiceParseLink = CreateServiceFunction(szService, ServiceParseYmsgrLink);
+ AssocMgr_AddNewUrlTypeT("ymsgr:", TranslateT("YAHOO Link Protocol"), hInstance, IDI_YAHOO, szService, 0);
+}
+
+void YmsgrLinksUninit(void)
+{
+ DestroyServiceFunction(hServiceParseLink);
+ CallService(MS_ASSOCMGR_REMOVEURLTYPE, 0, (LPARAM)"ymsgr:");
+}
diff --git a/protocols/Yahoo/m_assocmgr.h b/protocols/Yahoo/m_assocmgr.h
new file mode 100644
index 0000000000..4e15168643
--- /dev/null
+++ b/protocols/Yahoo/m_assocmgr.h
@@ -0,0 +1,301 @@
+/*
+
+'File Association Manager'-Plugin for
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright (C) 2005-2007 H. Herkenrath
+
+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 (AssocMgr-License.txt); if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#ifndef M_ASSOCMGR_H__
+#define M_ASSOCMGR_H__
+
+#if defined (_MSC_VER) && (_MSC_VER >= 1020)
+ #pragma once
+#endif
+
+#if !defined(_TCHAR_DEFINED)
+ #include <tchar.h>
+#endif
+
+#if defined(_MSC_VER)
+#pragma warning(push) /* save warning settings */
+#pragma warning(disable:4201) /* nonstandard extension used : nameless struct/union */
+#endif
+
+/*
+ File Association Manager v0.1.1.0
+*/
+
+/* interface id */
+#if !defined(MIID_ASSOCMGR)
+ #define MIID_ASSOCMGR {0xa05b56c0,0xcf7b,0x4389,{0xa1,0xe9,0xf1,0x3d,0xb9,0x36,0xe,0xf1}}
+#endif
+#if !defined(MIID_AUTORUN)
+ #define MIID_AUTORUN {0xeb0465e2,0xceee,0x11db,{0x83,0xef,0xc1,0xbf,0x55,0xd8,0x95,0x93}}
+#endif
+
+/* Add a new file type v0.1.0.0+
+Add a new file type to be registered with Windows.
+You probably want to call this event when
+ME_SYSTEM_MODULESLOADED is fired.
+ wParam=0
+ lParam=(LPARAM)(FILETYPEDESC*)ftd
+Returns 0 on success, nonzero otherwise.
+*/
+#define MS_ASSOCMGR_ADDNEWFILETYPE "AssocMgr/AddNewFileType"
+
+typedef struct {
+ int cbSize; // set to sizeof(FILETYPEDESC), in bytes
+ union {
+ const char *pszDescription; // description for options dialog and in registry.
+ const TCHAR *ptszDescription; // please Translate(), use singular form here.
+ const WCHAR *pwszDescription;
+ };
+ HINSTANCE hInstance; // instance of the calling module and where the icon
+ // resource is located.
+ // always be sure you set this to your own hInstance even if
+ // you use the generic default icon
+
+ UINT nIconResID; // resource id of an icon to use for the file type.
+ // this icon should contain icons of all sizes and color depths
+ // needed by Windows.
+ // set this to 0 to use the generic 'miranda file' icon
+ // provided by assocmgr.
+
+ const char *pszService; // service to call when a file is opened
+ // this service will be called with lParam set to
+ // the file name being opened including path.
+ // it can be assumed that the provided file name
+ // is always the long path name.
+ // return zero on suceess, nonzero on error.
+ // Note: set this to NULL to pass the file name as
+ // commandline argument to miranda32.exe (db file).
+
+ DWORD flags; // see FTDF_* flags below
+
+ const char *pszFileExt; // file extension, e.g. ".ext"
+ // first character must be a dot, assumed to be all lower case.
+ // may only consist of ascii characters.
+
+ const char *pszMimeType; // MIME type of the file, e.g. "application/x-icq"
+ // may only consist of ascii characters.
+ union {
+ const char *pszVerbDesc; // description for the open verb e.g. "&Install".
+ const TCHAR *ptszVerbDesc; // set this to NULL to use the default description.
+ const WCHAR *pwszVerbDesc; // include an ampersand (&) character for a mnemonic key.
+ }; // please Translate().
+} FILETYPEDESC;
+
+#define FTDF_UNICODE 0x0001 // pszDescription and pszVerbDesc in struct are Unicode.
+ // the specified service is called with Unicode parameters.
+
+#define FTDF_DEFAULTDISABLED 0x0002 // file type is not registered by default, it needs to be
+ // enabled explicitly on the options page.
+
+#define FTDF_BROWSERAUTOOPEN 0x0004 // tells the browser to download and open the file directly
+ // without prompt (currently IE and Opera6+) - be careful!
+ // use only in conjunction with pszMimeType set.
+ // this tells Windows that open can be safely invoked for
+ // downloaded files.
+ // Note that this flag may create a security risk,
+ // because downloaded files could contain malicious content.
+ // you need to protect against such an exploit.
+
+#define FTDF_ISTEXT 0x0008 // tells Windows that this file can be opened
+ // as a text file using e.g Notepad.
+ // only has an effect on Windows XP and higher.
+
+#define FTDF_ISSHORTCUT 0x0010 // file type behaves as shortcut, this means a
+ // small overlay arrow is applied and the extension is never shown
+
+#if defined(_UNICODE)
+ #define FTDF_TCHAR FTDF_UNICODE // strings in struct are WCHAR*, service accepts WCHAR*
+#else
+ #define FTDF_TCHAR 0 // strings in struct are char*, service accepts char*
+#endif
+
+#if !defined(ASSOCMGR_NOHELPERFUNCTIONS)
+__inline static int AssocMgr_AddNewFileType(const char *ext,const char *mime,const char *desc,const char *verb,HINSTANCE hinst,UINT iconid,const char *service,DWORD flags)
+{
+ FILETYPEDESC ftd;
+ ftd.cbSize=sizeof(FILETYPEDESC);
+ ftd.pszFileExt=ext;
+ ftd.pszMimeType=mime;
+ ftd.pszDescription=desc;
+ ftd.pszVerbDesc=verb;
+ ftd.hInstance=hinst;
+ ftd.nIconResID=iconid;
+ ftd.pszService=service;
+ ftd.flags=flags&~FTDF_UNICODE;
+ return CallService(MS_ASSOCMGR_ADDNEWFILETYPE,0,(LPARAM)&ftd);
+}
+__inline static int AssocMgr_AddNewFileTypeW(const char *ext,const char *mime,const WCHAR *desc,const WCHAR *verb,HINSTANCE hinst,UINT iconid,const char *service,DWORD flags)
+{
+ FILETYPEDESC ftd;
+ ftd.cbSize=sizeof(FILETYPEDESC);
+ ftd.pszFileExt=ext;
+ ftd.pszMimeType=mime;
+ ftd.pwszDescription=desc;
+ ftd.pwszVerbDesc=verb;
+ ftd.hInstance=hinst;
+ ftd.nIconResID=iconid;
+ ftd.pszService=service;
+ ftd.flags=flags|FTDF_UNICODE;
+ return CallService(MS_ASSOCMGR_ADDNEWFILETYPE,0,(LPARAM)&ftd);
+}
+#if defined(_UNICODE)
+ #define AssocMgr_AddNewFileTypeT AssocMgr_AddNewFileTypeW
+#else
+ #define AssocMgr_AddNewFileTypeT AssocMgr_AddNewFileType
+#endif
+#endif
+
+/* Remove a file type v0.1.0.0+
+Remove a file type registered previously using
+MS_ASSOCMGR_ADDNEWFILETYPE.
+This removes all settings in database and in registry
+associated with the file type.
+ wParam=0
+ lParam=(WPARAM)(char*)pszFileExt
+Returns 0 on success, nonzero otherwise.
+*/
+#define MS_ASSOCMGR_REMOVEFILETYPE "AssocMgr/RemoveFileType"
+
+/* Add a new url protocol type v0.1.0.0+
+Add a new url type to be registered with Windows.
+You probably want to call this event when
+ME_SYSTEM_MODULESLOADED is fired.
+ wParam=0
+ lParam=(LPARAM)(URLTYPEDESC*)utd
+Returns 0 on success, nonzero otherwise.
+*/
+#define MS_ASSOCMGR_ADDNEWURLTYPE "AssocMgr/AddNewUrlType"
+
+typedef struct {
+ int cbSize; // set to sizeof(URLTYPEDESC), in bytes
+ union {
+ const char *pszDescription; // description for options dialog and in registry.
+ const TCHAR *ptszDescription; // please Translate(), use singular form here.
+ const WCHAR *pwszDescription;
+ };
+ HINSTANCE hInstance; // instance of the calling module and where the icon
+ // resource is located.
+ // always be sure you set this to your own hInstance even if
+ // you use the generic default icon
+
+ UINT nIconResID; // resource id of an icon to use for the url type.
+ // only a small one (16x16) is needed by Windows,
+ // e.g. proto icon as used in Miranda.
+ // set this to 0 to use the default miranda icon.
+
+ const char *pszService; // service to call when a url is opened (can't be NULL)
+ // this service will be called with lParam set to
+ // the url being opened including the prefix.
+ // return zero on suceess, nonzero on error.
+
+ DWORD flags; // see UTDF_* flags below
+
+ const char *pszProtoPrefix; // protocol prefix, e.g. "http:"
+ // last character must be a colon, assumed to be all lower case.
+ // may only consist of ascii characters.
+} URLTYPEDESC;
+
+#define UTDF_UNICODE 0x0001 // pszDescription in struct is Unicode.
+ // the specified service is called with Unicode parameters.
+
+#define UTDF_DEFAULTDISABLED 0x0002 // url type is not registered by default, it needs to be
+ // enabled explicitly on the options page.
+#if defined(_UNICODE)
+ #define UTDF_TCHAR UTDF_UNICODE // strings in struct are WCHAR*, service accepts WCHAR*
+#else
+ #define UTDF_TCHAR 0 // strings in struct are char*, service accepts char*
+#endif
+
+#if !defined(ASSOCMGR_NOHELPERFUNCTIONS)
+static int __inline AssocMgr_AddNewUrlType(const char *prefix,const char *desc,HINSTANCE hinst,UINT iconid,const char *service,DWORD flags)
+{
+ URLTYPEDESC utd;
+ utd.cbSize=sizeof(URLTYPEDESC);
+ utd.pszProtoPrefix=prefix;
+ utd.pszDescription=desc;
+ utd.hInstance=hinst;
+ utd.nIconResID=iconid;
+ utd.pszService=service;
+ utd.flags=flags&~UTDF_UNICODE;
+ return CallService(MS_ASSOCMGR_ADDNEWURLTYPE,0,(LPARAM)&utd);
+}
+static int __inline AssocMgr_AddNewUrlTypeW(const char *prefix,const WCHAR *desc,HINSTANCE hinst,UINT iconid,const char *service,DWORD flags)
+{
+ URLTYPEDESC utd;
+ utd.cbSize=sizeof(URLTYPEDESC);
+ utd.pszProtoPrefix=prefix;
+ utd.pwszDescription=desc;
+ utd.hInstance=hinst;
+ utd.nIconResID=iconid;
+ utd.pszService=service;
+ utd.flags=flags|UTDF_UNICODE;
+ return CallService(MS_ASSOCMGR_ADDNEWURLTYPE,0,(LPARAM)&utd);
+}
+#if defined(_UNICODE)
+ #define AssocMgr_AddNewUrlTypeT AssocMgr_AddNewUrlTypeW
+#else
+ #define AssocMgr_AddNewUrlTypeT AssocMgr_AddNewUrlType
+#endif
+#endif
+
+/* Remove an url protocol type v0.1.0.0+
+Remove an url registered previously using
+MS_ASSOCMGR_ADDNEWURLTYPE.
+This removes all settings in database and in registry
+associated with the url type.
+ wParam=0
+ lParam=(WPARAM)(char*)pszProtoPrefix
+Returns 0 on success, nonzero otherwise.
+*/
+#define MS_ASSOCMGR_REMOVEURLTYPE "AssocMgr/RemoveUrlType"
+
+/* utility which should be moved as service into m_netlib.h (MS_NETLIB_URLENCODE already exists) */
+#if defined(MoveMemory) && defined(lstrlen)
+static __inline char *Netlib_UrlDecode(char *str)
+{
+ char *psz=str;
+ for(;*psz;++psz)
+ switch(*psz) {
+ case '+':
+ *psz=' ';
+ break;
+ case '%':
+ if(!psz[1] || !psz[2]) break;
+ MoveMemory(psz,&psz[1],2);
+ psz[2]=0;
+ *psz=(char)strtol(psz,NULL,16);
+ MoveMemory(&psz[1],&psz[3],lstrlenA(&psz[3])+1);
+ break;
+ }
+ return str;
+}
+#endif
+
+#if defined(_MSC_VER)
+#pragma warning(pop) /* restore warning settings */
+#endif
+
+#ifndef ASSOCMGR_NOSETTINGS
+#define SETTING_ONLYWHILERUNNING_DEFAULT 0
+#endif
+
+#endif // M_ASSOCMGR_H \ No newline at end of file
diff --git a/protocols/Yahoo/m_folders.h b/protocols/Yahoo/m_folders.h
new file mode 100644
index 0000000000..ed373ae555
--- /dev/null
+++ b/protocols/Yahoo/m_folders.h
@@ -0,0 +1,282 @@
+/*
+Custom profile folders plugin for Miranda IM
+
+Copyright © 2005 Cristian Libotean
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#ifndef M_CUSTOM_FOLDERS_H
+#define M_CUSTOM_FOLDERS_H
+
+#define FOLDERS_API 501 //dunno why it's here but it is :)
+
+#define PROFILE_PATH "%profile_path%"
+#define CURRENT_PROFILE "%current_profile%"
+#define MIRANDA_PATH "%miranda_path%"
+#define PLUGINS_PATH "%miranda_path%" "\\plugins"
+
+#define TO_WIDE(x) L ## x
+
+#define PROFILE_PATHW L"%profile_path%"
+#define CURRENT_PROFILEW L"%current_profile%"
+#define MIRANDA_PATHW L"%miranda_path%"
+
+#define FOLDER_AVATARS PROFILE_PATH "\\" CURRENT_PROFILE "\\avatars"
+#define FOLDER_VCARDS PROFILE_PATH "\\" CURRENT_PROFILE "\\vcards"
+#define FOLDER_LOGS PROFILE_PATH "\\" CURRENT_PROFILE "\\logs"
+#define FOLDER_RECEIVED_FILES PROFILE_PATH "\\" CURRENT_PROFILE "\\received files"
+#define FOLDER_DOCS MIRANDA_PATH "\\" "docs"
+
+#define FOLDER_CONFIG PLUGINS_PATH "\\" "config"
+
+#define FOLDER_SCRIPTS MIRANDA_PATH "\\" "scripts"
+
+#define FOLDER_UPDATES MIRANDA_PATH "\\" "updates"
+
+#define FOLDER_CUSTOMIZE MIRANDA_PATH "\\" "customize"
+#define FOLDER_CUSTOMIZE_SOUNDS FOLDER_CUSTOMIZE "\\sounds"
+#define FOLDER_CUSTOMIZE_ICONS FOLDER_CUSTOMIZE "\\icons"
+#define FOLDER_CUSTOMIZE_SMILEYS FOLDER_CUSTOMIZE "\\smileys"
+#define FOLDER_CUSTOMIZE_SKINS FOLDER_CUSTOMIZE "\\skins"
+#define FOLDER_CUSTOMIZE_THEMES FOLDER_CUSTOMIZE "\\themes"
+
+
+#define FOLDERS_NAME_MAX_SIZE 64 //maximum name and section size
+
+#define FF_UNICODE 0x00000001
+
+#if defined (UNICODE)
+ #define FF_TCHAR FF_UNICODE
+#else
+ #define FF_TCHAR 0
+#endif
+
+typedef struct{
+ int cbSize; //size of struct
+ char szSection[FOLDERS_NAME_MAX_SIZE]; //section name, if it doesn't exist it will be created otherwise it will just add this entry to it
+ char szName[FOLDERS_NAME_MAX_SIZE]; //entry name - will be shown in options
+ union{
+ const char *szFormat; //default string format. Fallback string in case there's no entry in the database for this folder. This should be the initial value for the path, users will be able to change it later.
+ const wchar_t *szFormatW; //String is dup()'d so you can free it later. If you set the unicode string don't forget to set the flag accordingly.
+ const TCHAR *szFormatT;
+ };
+ DWORD flags; //FF_* flags
+} FOLDERSDATA;
+
+/*Folders/Register/Path service
+ wParam - not used, must be 0
+ lParam - (LPARAM) (const FOLDERDATA *) - Data structure filled with
+ the necessary information.
+ Returns a handle to the registered path or 0 on error.
+ You need to use this to call the other services.
+*/
+#define MS_FOLDERS_REGISTER_PATH "Folders/Register/Path"
+
+/*Folders/Get/PathSize service
+ wParam - (WPARAM) (int) - handle to registered path
+ lParam - (LPARAM) (int *) - pointer to the variable that receives the size of the path
+ string (not including the null character). Depending on the flags set when creating the path
+ it will either call strlen() or wcslen() to get the length of the string.
+ Returns the size of the buffer.
+*/
+#define MS_FOLDERS_GET_SIZE "Folders/Get/PathSize"
+
+typedef struct{
+ int cbSize;
+ int nMaxPathSize; //maximum size of buffer. This represents the number of characters that can be copied to it (so for unicode strings you don't send the number of bytes but the length of the string).
+ union{
+ char *szPath; //pointer to the buffer that receives the path without the last "\\"
+ wchar_t *szPathW; //unicode version of the buffer.
+ TCHAR *szPathT;
+ };
+} FOLDERSGETDATA;
+
+/*Folders/Get/Path service
+ wParam - (WPARAM) (int) - handle to registered path
+ lParam - (LPARAM) (FOLDERSGETDATA *) pointer to a FOLDERSGETDATA that has all the relevant fields filled.
+ Should return 0 on success, or nonzero otherwise.
+*/
+#define MS_FOLDERS_GET_PATH "Folders/Get/Path"
+
+typedef struct{
+ int cbSize;
+ union{
+ char **szPath; //address of a string variable (char *) or (wchar_t*) where the path should be stored (the last \ won't be copied).
+ wchar_t **szPathW; //unicode version of string.
+ TCHAR **szPathT;
+ };
+} FOLDERSGETALLOCDATA;
+
+/*Folders/GetRelativePath/Alloc service
+ wParam - (WPARAM) (int) - Handle to registered path
+ lParam - (LPARAM) (FOLDERSALLOCDATA *) data
+ This service is the same as MS_FOLDERS_GET_PATH with the difference that this service
+ allocates the needed space for the buffer. It uses miranda's memory functions for that and you need
+ to use those to free the resulting buffer.
+ Should return 0 on success, or nonzero otherwise. Currently it only returns 0.
+*/
+#define MS_FOLDERS_GET_PATH_ALLOC "Folders/Get/Path/Alloc"
+
+
+/*Folders/On/Path/Changed
+ wParam - (WPARAM) 0
+ lParam - (LPARAM) 0
+ Triggered when the folders change, you should reget the paths you registered.
+*/
+#define ME_FOLDERS_PATH_CHANGED "Folders/On/Path/Changed"
+
+#ifndef FOLDERS_NO_HELPER_FUNCTIONS
+
+#ifndef M_UTILS_H__
+#error The helper functions require that m_utils.h be included in the project. Please include that file if you want to use the helper functions. If you don''t want to use the functions just define FOLDERS_NO_HELPER_FUNCTIONS.
+#endif
+//#include "../../../include/newpluginapi.h"
+
+__inline static HANDLE FoldersRegisterCustomPath(const char *section, const char *name, const char *defaultPath)
+{
+ FOLDERSDATA fd = {0};
+ if (!ServiceExists(MS_FOLDERS_REGISTER_PATH)) return 0;
+ fd.cbSize = sizeof(FOLDERSDATA);
+ strncpy(fd.szSection, section, FOLDERS_NAME_MAX_SIZE);
+ fd.szSection[FOLDERS_NAME_MAX_SIZE - 1] = '\0';
+ strncpy(fd.szName, name, FOLDERS_NAME_MAX_SIZE);
+ fd.szName[FOLDERS_NAME_MAX_SIZE - 1] = '\0';
+ fd.szFormat = defaultPath;
+ return (HANDLE) CallService(MS_FOLDERS_REGISTER_PATH, 0, (LPARAM) &fd);
+}
+
+__inline static HANDLE FoldersRegisterCustomPathW(const char *section, const char *name, const wchar_t *defaultPathW)
+{
+ FOLDERSDATA fd = {0};
+ if (!ServiceExists(MS_FOLDERS_REGISTER_PATH)) return 0;
+ fd.cbSize = sizeof(FOLDERSDATA);
+ strncpy(fd.szSection, section, FOLDERS_NAME_MAX_SIZE);
+ fd.szSection[FOLDERS_NAME_MAX_SIZE - 1] = '\0'; //make sure it's NULL terminated
+ strncpy(fd.szName, name, FOLDERS_NAME_MAX_SIZE);
+ fd.szName[FOLDERS_NAME_MAX_SIZE - 1] = '\0'; //make sure it's NULL terminated
+ fd.szFormatW = defaultPathW;
+ fd.flags = FF_UNICODE;
+ return (HANDLE) CallService(MS_FOLDERS_REGISTER_PATH, 0, (LPARAM) &fd);
+}
+
+__inline static INT_PTR FoldersGetCustomPath(HANDLE hFolderEntry, char *path, const int size, const char *notFound)
+{
+ FOLDERSGETDATA fgd = {0};
+ INT_PTR res;
+ fgd.cbSize = sizeof(FOLDERSGETDATA);
+ fgd.nMaxPathSize = size;
+ fgd.szPath = path;
+ res = CallService(MS_FOLDERS_GET_PATH, (WPARAM) hFolderEntry, (LPARAM) &fgd);
+ if (res)
+ {
+ char buffer[MAX_PATH];
+ CallService(MS_UTILS_PATHTOABSOLUTE, (WPARAM) notFound, (LPARAM) buffer);
+ mir_snprintf(path, size, "%s", buffer);
+ }
+
+ return res;
+}
+
+__inline static int FoldersGetCustomPathW(HANDLE hFolderEntry, wchar_t *pathW, const int count, const wchar_t *notFoundW)
+{
+ FOLDERSGETDATA fgd = {0};
+ INT_PTR res;
+ fgd.cbSize = sizeof(FOLDERSGETDATA);
+ fgd.nMaxPathSize = count;
+ fgd.szPathW = pathW;
+ res = CallService(MS_FOLDERS_GET_PATH, (WPARAM) hFolderEntry, (LPARAM) &fgd);
+ if (res)
+ {
+ wcsncpy(pathW, notFoundW, count);
+ pathW[count - 1] = '\0';
+ }
+
+ return res;
+}
+
+__inline static INT_PTR FoldersGetCustomPathEx(HANDLE hFolderEntry, char *path, const int size, char *notFound, char *fileName)
+{
+ FOLDERSGETDATA fgd = {0};
+ INT_PTR res;
+ fgd.cbSize = sizeof(FOLDERSGETDATA);
+ fgd.nMaxPathSize = size;
+ fgd.szPath = path;
+ res = CallService(MS_FOLDERS_GET_PATH, (WPARAM) hFolderEntry, (LPARAM) &fgd);
+ if (res)
+ {
+ char buffer[MAX_PATH];
+ CallService(MS_UTILS_PATHTOABSOLUTE, (WPARAM) notFound, (LPARAM) buffer);
+ mir_snprintf(path, size, "%s", buffer);
+ }
+ if (strlen(path) > 0)
+ {
+ strcat(path, "\\");
+ }
+ else{
+ path[0] = '\0';
+ }
+
+ if (fileName)
+ {
+ strcat(path, fileName);
+ }
+
+ return res;
+}
+
+__inline static INT_PTR FoldersGetCustomPathExW(HANDLE hFolderEntry, wchar_t *pathW, const int count, wchar_t *notFoundW, wchar_t *fileNameW)
+{
+ FOLDERSGETDATA fgd = {0};
+ INT_PTR res;
+ fgd.cbSize = sizeof(FOLDERSGETDATA);
+ fgd.nMaxPathSize = count;
+ fgd.szPathW = pathW;
+ res = CallService(MS_FOLDERS_GET_PATH, (WPARAM) hFolderEntry, (LPARAM) &fgd);
+ if (res)
+ {
+ wcsncpy(pathW, notFoundW, count);
+ pathW[count - 1] = '\0';
+ }
+
+ if (wcslen(pathW) > 0)
+ {
+ wcscat(pathW, L"\\");
+ }
+ else{
+ pathW[0] = L'\0';
+ }
+
+ if (fileNameW)
+ {
+ wcscat(pathW, fileNameW);
+ }
+
+ return res;
+}
+
+# ifdef _UNICODE
+# define FoldersGetCustomPathT FoldersGetCustomPathW
+# define FoldersGetCustomPathExT FoldersGetCustomPathExW
+# define FoldersRegisterCustomPathT FoldersRegisterCustomPathW
+#else
+# define FoldersGetCustomPathT FoldersGetCustomPath
+# define FoldersGetCustomPathExT FoldersGetCustomPath
+# define FoldersRegisterCustomPathT FoldersRegisterCustomPath
+#endif
+
+#endif
+
+#endif //M_CUSTOM_FOLDERS_H
diff --git a/protocols/Yahoo/main.cpp b/protocols/Yahoo/main.cpp
new file mode 100644
index 0000000000..7c53c2f1df
--- /dev/null
+++ b/protocols/Yahoo/main.cpp
@@ -0,0 +1,198 @@
+/*
+ * $Id: main.cpp 13596 2011-04-15 19:07:23Z george.hazan $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+#include "yahoo.h"
+#include "http_gateway.h"
+#include "version.h"
+#include "resource.h"
+
+#include <m_langpack.h>
+
+/*
+ * Global Variables
+ */
+HINSTANCE hInstance;
+PLUGINLINK* pluginLink;
+
+HANDLE g_hNetlibUser;
+
+MM_INTERFACE mmi;
+UTF8_INTERFACE utfi;
+MD5_INTERFACE md5i;
+LIST_INTERFACE li;
+int hLangpack;
+
+PLUGININFOEX pluginInfo={
+ sizeof(PLUGININFOEX),
+#ifdef YAHOO_CVSBUILD
+ "Yahoo Protocol Beta/Nightly",
+#else
+ "Yahoo Protocol",
+#endif
+ __VERSION_DWORD,
+ "Yahoo Protocol support via libyahoo2 library. [Built: "__DATE__" "__TIME__"]",
+ "Gennady Feldman",
+ "gena01@miranda-im.org",
+ "© 2003-2010 Gennady Feldman, Laurent Marechal",
+ "http://www.miranda-im.org",
+ UNICODE_AWARE, //not transient
+ 0, //DEFMOD_PROTOCOLYAHOO - no core yahoo protocol
+ #if defined( _UNICODE )
+ {0xaa7bfea, 0x1fc7, 0x45f0, {0x90, 0x6e, 0x2a, 0x46, 0xb6, 0xe1, 0x19, 0xcf}} // {0AA7BFEA-1FC7-45f0-906E-2A46B6E119CF}
+ #else
+ {0x6151b6e6, 0x3a7b, 0x45e6, {0x9a, 0x51, 0x18, 0x72, 0xc1, 0x7b, 0x5, 0xa9}} // {6151B6E6-3A7B-45e6-9A51-1872C17B05A9}
+ #endif
+};
+
+void YmsgrLinksInit(void);
+void YmsgrLinksUninit(void);
+
+/*
+ * WINAPI DllMain - main entry point into a DLL
+ * Parameters:
+ * HINSTANCE hinst,
+ * DWORD fdwReason,
+ * LPVOID lpvReserved
+ * Returns :
+ * BOOL
+ *
+ */
+extern "C" BOOL WINAPI DllMain(HINSTANCE hinst,DWORD /*fdwReason*/,LPVOID /*lpvReserved*/)
+{
+ hInstance = hinst;
+ return TRUE;
+}
+
+/*
+ * Load - loads plugin into memory
+ */
+
+//=====================================================
+// Name : Load
+// Parameters: PLUGINLINK *link
+// Returns : int
+// Description : Called when plugin is loaded into Miranda
+//=====================================================
+
+static int CompareProtos( const CYahooProto* p1, const CYahooProto* p2 )
+{
+ return lstrcmp(p1->m_tszUserName, p2->m_tszUserName);
+}
+
+LIST<CYahooProto> g_instances( 1, CompareProtos );
+
+static CYahooProto* yahooProtoInit( const char* pszProtoName, const TCHAR* tszUserName )
+{
+ CYahooProto* ppro = new CYahooProto( pszProtoName, tszUserName );
+
+ g_instances.insert( ppro );
+
+ return ppro;
+}
+
+static int yahooProtoUninit( CYahooProto* ppro )
+{
+ g_instances.remove( ppro );
+ delete ppro;
+
+ return 0;
+}
+
+extern "C" int __declspec(dllexport)Load(PLUGINLINK *link)
+{
+ pluginLink = link;
+
+ /**
+ * Grab the interface handles (through pluginLink)
+ */
+ int i = mir_getLI( &li );
+
+ if (i) {
+ MessageBox(NULL, _T("Can not retrieve the core List Interface."), _T("Yahoo Plugin Load Failed"), MB_ICONERROR | MB_OK);
+ return 1;
+ }
+
+ mir_getMMI( &mmi );
+ mir_getUTFI( &utfi );
+ mir_getMD5I( &md5i );
+ mir_getLP( &pluginInfo );
+
+ PROTOCOLDESCRIPTOR pd = { 0 };
+ pd.cbSize = sizeof(pd);
+ pd.szName = "YAHOO";
+ pd.type = PROTOTYPE_PROTOCOL;
+ pd.fnInit = ( pfnInitProto )yahooProtoInit;
+ pd.fnUninit = ( pfnUninitProto )yahooProtoUninit;
+ CallService( MS_PROTO_REGISTERMODULE, 0, ( LPARAM )&pd );
+
+ NETLIBUSER nlu = {0};
+ nlu.cbSize = sizeof(nlu);
+ nlu.flags = NUF_TCHAR | NUF_OUTGOING | NUF_HTTPCONNS;
+ nlu.szSettingsModule = "YAHOO/libyahoo2";
+ nlu.ptszDescriptiveName = TranslateT("YAHOO plugin HTTP connections");
+ g_hNetlibUser = ( HANDLE )YAHOO_CallService( MS_NETLIB_REGISTERUSER, 0, ( LPARAM )&nlu );
+
+ YmsgrLinksInit();
+ /**
+ * Register LibYahoo2 callback functions
+ */
+ register_callbacks();
+
+ return 0;
+}
+
+/*
+ * Unload - Unloads plugin
+ * Parameters: void
+ */
+
+extern "C" int __declspec(dllexport) Unload(void)
+{
+ LOG(( "Unload" ));
+
+ YmsgrLinksUninit();
+ Netlib_CloseHandle( g_hNetlibUser );
+ g_instances.destroy();
+ return 0;
+}
+
+/*
+ * MirandaPluginInfoEx - Sets plugin info
+ * Parameters: (DWORD mirandaVersion)
+ */
+extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion)
+{
+ /*
+ * This requires the latest trunk... [md5, sha, etc..]
+ */
+ if (mirandaVersion < MIRANDA_VERSION_CORE ) {
+ MessageBoxA( NULL,
+ "Yahoo plugin cannot be loaded. It requires Miranda IM " MIRANDA_VERSION_CORE_STRING " or later.",
+ "Yahoo",
+ MB_OK|MB_ICONWARNING|MB_SETFOREGROUND|MB_TOPMOST );
+
+ return NULL;
+ }
+
+ return &pluginInfo;
+}
+
+/*
+ * MirandaPluginInterfaces - Notifies the core of interfaces implemented
+ * Parameters: none
+ */
+static const MUUID interfaces[] = {MIID_PROTOCOL, MIID_LAST};
+
+extern "C" __declspec(dllexport) const MUUID* MirandaPluginInterfaces(void)
+{
+ return interfaces;
+}
diff --git a/protocols/Yahoo/options.cpp b/protocols/Yahoo/options.cpp
new file mode 100644
index 0000000000..764fe0c56e
--- /dev/null
+++ b/protocols/Yahoo/options.cpp
@@ -0,0 +1,397 @@
+/*
+ * $Id: options.cpp 12038 2010-06-21 16:46:22Z gena01 $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+
+#include "yahoo.h"
+#include "resource.h"
+
+#include <shlwapi.h>
+
+#include <m_langpack.h>
+#include <m_utils.h>
+#include <m_options.h>
+#include <m_popup.h>
+
+#include "ignore.h"
+
+/*
+ * DlgProcYahooOpts - Account Options Dialog
+ */
+static INT_PTR CALLBACK DlgProcYahooOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ DBVARIANT dbv;
+ CYahooProto* ppro = (CYahooProto*)GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
+
+ switch ( msg ) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault( hwndDlg );
+
+ ppro = (CYahooProto*)lParam;
+ SetWindowLongPtr( hwndDlg, GWLP_USERDATA, lParam );
+
+ if ( !ppro->GetString( YAHOO_LOGINID, &dbv )) {
+ SetDlgItemTextA(hwndDlg,IDC_HANDLE,dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+
+ if ( !ppro->GetString( "Nick", &dbv )) {
+ SetDlgItemTextA(hwndDlg,IDC_NICK,dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+
+ if ( !ppro->GetString( YAHOO_PASSWORD, &dbv )) {
+ //bit of a security hole here, since it's easy to extract a password from an edit box
+ YAHOO_CallService( MS_DB_CRYPT_DECODESTRING, strlen( dbv.pszVal )+1, ( LPARAM )dbv.pszVal );
+ SetDlgItemTextA( hwndDlg, IDC_PASSWORD, dbv.pszVal );
+ DBFreeVariant( &dbv );
+ }
+
+ //SetButtonCheck( hwndDlg, IDC_DISABLE_UTF8, ppro->GetByte( "DisableUTF8", 0 ));
+ SetButtonCheck( hwndDlg, IDC_USE_YAB, ppro->GetByte( "UseYAB", 1 ));
+ SetButtonCheck( hwndDlg, IDC_SHOW_AVATARS, ppro->GetByte( "ShowAvatars", 1 ));
+ SetButtonCheck( hwndDlg, IDC_MAIL_AUTOLOGIN, ppro->GetByte( "MailAutoLogin", 1 ));
+ SetButtonCheck( hwndDlg, IDC_DISABLEYAHOOMAIL, !ppro->GetByte( "DisableYahoomail", 0 ));
+ SetButtonCheck( hwndDlg, IDC_SHOW_ERRORS, ppro->GetByte( "ShowErrors", 1 ));
+
+ return TRUE;
+
+ case WM_COMMAND:
+
+ switch ( LOWORD( wParam )) {
+ case IDC_NEWYAHOOACCOUNTLINK:
+ YAHOO_CallService( MS_UTILS_OPENURL, 1,
+ ppro->GetByte( "YahooJapan", 0 ) ?
+ (LPARAM)"http://edit.yahoo.co.jp/config/eval_register" :
+ (LPARAM)"http://edit.yahoo.com/config/eval_register" );
+ return TRUE;
+
+ //case IDC_DISABLE_UTF8:
+ case IDC_USE_YAB:
+ case IDC_SHOW_AVATARS:
+ case IDC_MAIL_AUTOLOGIN:
+ case IDC_SHOW_ERRORS:
+ case IDC_DISABLEYAHOOMAIL:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ }
+
+ if ( HIWORD( wParam ) == EN_CHANGE && ( HWND )lParam == GetFocus())
+ switch( LOWORD( wParam )) {
+ case IDC_HANDLE:
+ case IDC_PASSWORD:
+ case IDC_NICK:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ }
+
+ break;
+
+ case WM_NOTIFY:
+
+ if (((LPNMHDR)lParam)->code == (UINT) PSN_APPLY ) {
+ BOOL reconnectRequired = FALSE;
+
+ char str[128];
+ GetDlgItemTextA( hwndDlg, IDC_HANDLE, str, sizeof( str ));
+ dbv.pszVal = NULL;
+
+ if ( ppro->GetString( YAHOO_LOGINID, &dbv ) || lstrcmpA( str, dbv.pszVal ))
+ reconnectRequired = TRUE;
+
+ if ( dbv.pszVal != NULL )
+ DBFreeVariant( &dbv );
+
+ ppro->SetString( YAHOO_LOGINID, str );
+
+ GetDlgItemTextA( hwndDlg, IDC_PASSWORD, str, sizeof( str ));
+ YAHOO_CallService( MS_DB_CRYPT_ENCODESTRING, sizeof( str ),( LPARAM )str );
+ dbv.pszVal = NULL;
+ if ( ppro->GetString( YAHOO_PASSWORD, &dbv ) || lstrcmpA( str, dbv.pszVal ))
+ reconnectRequired = TRUE;
+ if ( dbv.pszVal != NULL )
+ DBFreeVariant( &dbv );
+
+ ppro->SetString( YAHOO_PASSWORD, str );
+ GetDlgItemTextA( hwndDlg, IDC_NICK, str, sizeof( str ));
+
+
+ if (str[0] == '\0') {
+ /* Check for empty Nick, if so delete the key in the DB */
+ DBDeleteContactSetting( NULL, ppro->m_szModuleName, "Nick" );
+ } else {
+ /* otherwise save the new Nick */
+ ppro->SetString( "Nick", str );
+ }
+
+ //ppro->SetByte("DisableUTF8", ( BYTE )IsDlgButtonChecked( hwndDlg, IDC_DISABLE_UTF8 ));
+ ppro->SetByte("UseYAB", ( BYTE )IsDlgButtonChecked( hwndDlg, IDC_USE_YAB ));
+ ppro->SetByte("ShowAvatars", ( BYTE )IsDlgButtonChecked( hwndDlg, IDC_SHOW_AVATARS ));
+ ppro->SetByte("MailAutoLogin", ( BYTE )IsDlgButtonChecked( hwndDlg, IDC_MAIL_AUTOLOGIN ));
+ ppro->SetByte("DisableYahoomail", ( BYTE )!IsDlgButtonChecked( hwndDlg, IDC_DISABLEYAHOOMAIL ));
+ ppro->SetByte("ShowErrors", ( BYTE )IsDlgButtonChecked( hwndDlg, IDC_SHOW_ERRORS ));
+
+ if (reconnectRequired ) {
+ DBDeleteContactSetting(NULL, ppro->m_szModuleName, YAHOO_PWTOKEN);
+ }
+
+ /*if ( restartRequired )
+ MessageBoxA( hwndDlg, Translate( "The changes you have made require you to restart Miranda IM before they take effect"), Translate("YAHOO Options"), MB_OK );
+ else */
+ if ( reconnectRequired && ppro->m_bLoggedIn )
+ MessageBoxA( hwndDlg, Translate( "The changes you have made require you to reconnect to the Yahoo network before they take effect"), Translate("YAHOO Options"), MB_OK );
+
+ return TRUE;
+ }
+
+ break;
+ }
+ return FALSE;
+}
+
+/*
+ * DlgProcYahooOpts - Connection Options Dialog
+ */
+static INT_PTR CALLBACK DlgProcYahooOptsConn(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ DBVARIANT dbv;
+ CYahooProto* ppro = (CYahooProto*)GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
+
+ switch ( msg ) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault( hwndDlg );
+
+ ppro = ( CYahooProto* )lParam;
+ SetWindowLongPtr( hwndDlg, GWLP_USERDATA, lParam );
+
+ if ( !ppro->GetString( YAHOO_LOGINSERVER, &dbv )){
+ SetDlgItemTextA( hwndDlg, IDC_LOGINSERVER, dbv.pszVal );
+ DBFreeVariant( &dbv );
+ }
+ else SetDlgItemTextA( hwndDlg, IDC_LOGINSERVER,
+ ppro->GetByte( "YahooJapan", 0 )
+ ? YAHOO_DEFAULT_JAPAN_LOGIN_SERVER
+ : YAHOO_DEFAULT_LOGIN_SERVER );
+
+ SetDlgItemInt( hwndDlg, IDC_YAHOOPORT, ppro->GetWord( NULL, YAHOO_LOGINPORT, YAHOO_DEFAULT_PORT ), FALSE );
+
+ SetButtonCheck( hwndDlg, IDC_YAHOO_JAPAN, ppro->GetByte( "YahooJapan", 0 ) );
+ return TRUE;
+
+ case WM_COMMAND:
+ switch ( LOWORD( wParam )) {
+ case IDC_RESETSERVER:
+ SetDlgItemTextA( hwndDlg, IDC_LOGINSERVER, YAHOO_DEFAULT_LOGIN_SERVER );
+ SetDlgItemInt( hwndDlg, IDC_YAHOOPORT, YAHOO_DEFAULT_PORT, FALSE );
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+
+ case IDC_YAHOO_JAPAN:
+ SetDlgItemTextA( hwndDlg, IDC_LOGINSERVER,
+ (IsDlgButtonChecked(hwndDlg,IDC_YAHOO_JAPAN)==BST_CHECKED) ?
+ YAHOO_DEFAULT_JAPAN_LOGIN_SERVER :
+ YAHOO_DEFAULT_LOGIN_SERVER );
+ // fall through and enable apply button
+
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ }
+
+ if ( HIWORD( wParam ) == EN_CHANGE && ( HWND )lParam == GetFocus())
+ switch( LOWORD( wParam )) {
+ case IDC_LOGINSERVER:
+ case IDC_YAHOOPORT:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ }
+
+ break;
+
+ case WM_NOTIFY:
+ if (((LPNMHDR)lParam)->code == PSN_APPLY )
+ {
+ BOOL reconnectRequired = FALSE/*, restartRequired = FALSE*/;
+ char str[128];
+ DBVARIANT dbv;
+ int port;
+
+ GetDlgItemTextA( hwndDlg, IDC_LOGINSERVER, str, sizeof( str ));
+
+ if ( ppro->GetString( YAHOO_LOGINSERVER, &dbv ) || lstrcmpA( str, dbv.pszVal ))
+ reconnectRequired = TRUE;
+
+ if ( dbv.pszVal != NULL )
+ DBFreeVariant( &dbv );
+
+ ppro->SetString( YAHOO_LOGINSERVER, str );
+
+ port = GetDlgItemInt( hwndDlg, IDC_YAHOOPORT, NULL, FALSE );
+ if ( ppro->GetWord(NULL, YAHOO_LOGINPORT, -1) != port)
+ reconnectRequired = TRUE;
+
+ ppro->SetWord( NULL, YAHOO_LOGINPORT, port);
+
+ ppro->SetByte("YahooJapan", ( BYTE )IsDlgButtonChecked( hwndDlg, IDC_YAHOO_JAPAN ));
+
+ /*if ( restartRequired )
+ MessageBoxA( hwndDlg, Translate( "The changes you have made require you to restart Miranda IM before they take effect"), Translate("YAHOO Options"), MB_OK );
+ else */
+ if ( reconnectRequired && ppro->m_bLoggedIn )
+ MessageBoxA( hwndDlg, Translate( "The changes you have made require you to reconnect to the Yahoo network before they take effect"), Translate("YAHOO Options"), MB_OK );
+
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+/*
+ * DlgProcYahooOpts - Connection Options Dialog
+ */
+static INT_PTR CALLBACK DlgProcYahooOptsIgnore(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ YList *l;
+ CYahooProto* ppro = (CYahooProto*)GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
+
+ switch ( msg ) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault( hwndDlg );
+
+ ppro = ( CYahooProto* )lParam;
+ SetWindowLongPtr( hwndDlg, GWLP_USERDATA, lParam );
+
+ if ( ppro->GetByte( "IgnoreUnknown", 0 )) {
+ CheckDlgButton(hwndDlg, IDC_OPT_IGN_UNKNOWN, 1);
+
+ EnableWindow( GetDlgItem(hwndDlg, IDC_IGN_ADD), 0);
+ EnableWindow( GetDlgItem(hwndDlg, IDC_IGN_REMOVE), 0);
+ EnableWindow( GetDlgItem(hwndDlg, IDC_YIGN_EDIT), 0);
+ EnableWindow( GetDlgItem(hwndDlg, IDC_YIGN_LIST), 0);
+ }
+ else CheckDlgButton(hwndDlg, IDC_OPT_IGN_LIST, 1);
+
+ /* show our current ignore list */
+ LOG(("[DlgProcYahooOptsIgnore] Grabbing current ignore list..."))
+ l = (YList *)ppro->GetIgnoreList();
+ while (l != NULL) {
+ struct yahoo_buddy *b = (struct yahoo_buddy *) l->data;
+
+ LOG(("[DlgProcYahooOptsIgnore] Buddy: %s", b->id ))
+ SendMessageA(GetDlgItem(hwndDlg,IDC_YIGN_LIST), LB_ADDSTRING, 0, (LPARAM)b->id);
+ l = l->next;
+ }
+ LOG(("[DlgProcYahooOptsIgnore] End of Ignore List..."))
+
+ return TRUE;
+
+ case WM_COMMAND:
+ switch ( LOWORD( wParam )) {
+ case IDC_OPT_IGN_UNKNOWN:
+ case IDC_OPT_IGN_LIST:
+ if (( HWND )lParam != GetFocus()) return 0;
+
+ EnableWindow( GetDlgItem(hwndDlg, IDC_IGN_ADD), LOWORD( wParam ) == IDC_OPT_IGN_LIST);
+ EnableWindow( GetDlgItem(hwndDlg, IDC_IGN_REMOVE), LOWORD( wParam ) == IDC_OPT_IGN_LIST);
+ EnableWindow( GetDlgItem(hwndDlg, IDC_YIGN_EDIT), LOWORD( wParam ) == IDC_OPT_IGN_LIST);
+ EnableWindow( GetDlgItem(hwndDlg, IDC_YIGN_LIST), LOWORD( wParam ) == IDC_OPT_IGN_LIST);
+
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+
+ case IDC_IGN_ADD:
+ if (!ppro->m_bLoggedIn)
+ MessageBoxA(hwndDlg, Translate("You need to be connected to Yahoo to add to Ignore List."), Translate("Yahoo Ignore"), MB_OK| MB_ICONINFORMATION);
+ else {
+ char id[128];
+ int i = GetDlgItemTextA( hwndDlg, IDC_YIGN_EDIT, id, sizeof( id ));
+
+ if (i < 3) {
+ MessageBoxA(hwndDlg, Translate("Please enter a valid buddy name to ignore."), Translate("Yahoo Ignore"), MB_OK| MB_ICONINFORMATION);
+ break;
+ }
+
+ i = SendMessageA(GetDlgItem(hwndDlg,IDC_YIGN_LIST), LB_FINDSTRINGEXACT,(WPARAM) -1, (LPARAM)id);
+ if (i != LB_ERR ) {
+ MessageBoxA(hwndDlg, Translate("The buddy is already on your ignore list. "), Translate("Yahoo Ignore"), MB_OK | MB_ICONINFORMATION);
+ break;
+ }
+ ppro->IgnoreBuddy(id, 0);
+ SendMessageA(GetDlgItem(hwndDlg,IDC_YIGN_LIST), LB_ADDSTRING, 0, (LPARAM)id);
+ SetDlgItemTextA( hwndDlg, IDC_YIGN_EDIT, "" );
+ }
+ break;
+
+ case IDC_IGN_REMOVE:
+ {
+ int i;
+ char id[128];
+
+ if (!ppro->m_bLoggedIn) {
+ MessageBoxA(hwndDlg, Translate("You need to be connected to Yahoo to remove from the Ignore List."), Translate("Yahoo Ignore"), MB_OK| MB_ICONINFORMATION);
+ break;
+ }
+
+ i = SendMessage(GetDlgItem(hwndDlg,IDC_YIGN_LIST), LB_GETCURSEL, 0, 0);
+ if (i == LB_ERR) {
+ MessageBoxA(hwndDlg, Translate("Please select a buddy on the ignore list to remove."), Translate("Yahoo Ignore"), MB_OK| MB_ICONINFORMATION);
+ break;
+ }
+
+ SendMessageA(GetDlgItem(hwndDlg,IDC_YIGN_LIST), LB_GETTEXT, i, (LPARAM)id);
+
+ ppro->IgnoreBuddy(id, 1);
+ SendMessage(GetDlgItem(hwndDlg,IDC_YIGN_LIST), LB_DELETESTRING, i, 0);
+ }
+ }
+ break;
+
+ case WM_NOTIFY:
+ if (((LPNMHDR)lParam)->code == PSN_APPLY ) {
+ ppro->SetByte("IgnoreUnknown", ( BYTE )IsDlgButtonChecked( hwndDlg, IDC_OPT_IGN_UNKNOWN ));
+ return TRUE;
+ }
+ break;
+ }
+
+ return FALSE;
+}
+
+/*
+ * YahooOptInit - initialize/register our Options w/ Miranda.
+ */
+
+INT_PTR __cdecl CYahooProto::OnOptionsInit(WPARAM wParam,LPARAM lParam)
+{
+ OPTIONSDIALOGPAGE odp = { 0 };
+
+ odp.cbSize = sizeof(odp);
+ odp.position = -790000000;
+ odp.hInstance = hInstance;
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_YAHOO);
+ odp.ptszTitle = m_tszUserName;
+ odp.flags = ODPF_BOLDGROUPS|ODPF_TCHAR|ODPF_DONTTRANSLATE;
+ odp.ptszGroup = LPGENT("Network");
+ odp.ptszTab = LPGENT("Account");
+ odp.pfnDlgProc = DlgProcYahooOpts;
+ odp.dwInitParam = LPARAM(this);
+ YAHOO_CallService( MS_OPT_ADDPAGE, wParam,( LPARAM )&odp );
+
+ odp.ptszTab = LPGENT("Connection");
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_YAHOO_CONNECTION);
+ odp.pfnDlgProc = DlgProcYahooOptsConn;
+ YAHOO_CallService( MS_OPT_ADDPAGE, wParam,( LPARAM )&odp );
+
+ odp.ptszTab = LPGENT("Ignore List");
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_YAHOO_IGNORE);
+ odp.pfnDlgProc = DlgProcYahooOptsIgnore;
+ YAHOO_CallService( MS_OPT_ADDPAGE, wParam,( LPARAM )&odp );
+
+ return 0;
+}
diff --git a/protocols/Yahoo/options.h b/protocols/Yahoo/options.h
new file mode 100644
index 0000000000..d707509ec8
--- /dev/null
+++ b/protocols/Yahoo/options.h
@@ -0,0 +1,22 @@
+/*
+ * $Id: options.h 8425 2008-10-15 16:02:48Z gena01 $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+#ifndef _YAHOO_SEARCH_H_
+#define _YAHOO_SEARCH_H_
+
+BOOL CALLBACK DlgProcYahooOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+BOOL CALLBACK DlgProcYahooOptsConn(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+BOOL CALLBACK DlgProcYahooOptsIgnore(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+//BOOL CALLBACK DlgProcYahooPopUpOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+int YahooOptInit(WPARAM wParam,LPARAM lParam);
+
+#endif
diff --git a/protocols/Yahoo/proto.cpp b/protocols/Yahoo/proto.cpp
new file mode 100644
index 0000000000..2aad750efa
--- /dev/null
+++ b/protocols/Yahoo/proto.cpp
@@ -0,0 +1,933 @@
+/*
+ * $Id: proto.cpp 13497 2011-03-25 04:55:36Z borkra $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+
+#include "yahoo.h"
+
+#include <shlwapi.h>
+#include <win2k.h>
+
+#include <m_idle.h>
+#include <m_options.h>
+#include <m_skin.h>
+#include <m_userinfo.h>
+
+#include "resource.h"
+#include "file_transfer.h"
+
+#ifdef _MSC_VER
+ #pragma warning(disable:4355)
+#endif
+
+CYahooProto::CYahooProto( const char* aProtoName, const TCHAR* aUserName ) :
+ m_bLoggedIn( FALSE ), poll_loop( 0 )
+{
+ m_iVersion = 2;
+ m_tszUserName = mir_tstrdup( aUserName );
+ m_szModuleName = mir_strdup( aProtoName );
+
+ m_startStatus = ID_STATUS_ONLINE;
+ m_connections = NULL;
+ m_connection_tags = 0;
+
+ logoff_buddies();
+
+ SkinAddNewSoundExT("mail", m_tszUserName, LPGENT("New E-mail available in Inbox"));
+
+ LoadYahooServices();
+ IconsInit();
+ InitCustomFolders();
+}
+
+CYahooProto::~CYahooProto()
+{
+ if (m_bLoggedIn)
+ logout();
+
+ DebugLog("Logged out");
+
+ DestroyHookableEvent(hYahooNudge);
+
+ MenuUninit();
+
+ mir_free( m_szModuleName );
+ mir_free( m_tszUserName );
+
+ FREE(m_startMsg);
+ FREE(m_pw_token);
+
+ Netlib_CloseHandle( m_hNetlibUser );
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// OnModulesLoadedEx - performs hook registration
+
+//static COLORREF crCols[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
+
+INT_PTR CYahooProto::OnModulesLoadedEx( WPARAM, LPARAM )
+{
+ YHookEvent( ME_USERINFO_INITIALISE, &CYahooProto::OnUserInfoInit );
+ YHookEvent( ME_IDLE_CHANGED, &CYahooProto::OnIdleEvent);
+ YHookEvent( ME_CLIST_PREBUILDCONTACTMENU, &CYahooProto::OnPrebuildContactMenu );
+
+ TCHAR tModuleDescr[ 100 ];
+ mir_sntprintf(tModuleDescr, SIZEOF(tModuleDescr), TranslateT( "%s plugin connections" ), m_tszUserName);
+
+ NETLIBUSER nlu = {0};
+ nlu.cbSize = sizeof(nlu);
+#ifdef HTTP_GATEWAY
+ nlu.flags = NUF_OUTGOING | NUF_HTTPGATEWAY| NUF_HTTPCONNS | NUF_TCHAR;
+#else
+ nlu.flags = NUF_OUTGOING | NUF_HTTPCONNS | NUF_TCHAR;
+#endif
+ nlu.szSettingsModule = m_szModuleName;
+ nlu.ptszDescriptiveName = tModuleDescr;
+
+#ifdef HTTP_GATEWAY
+ // Here comes the Gateway Code!
+ nlu.szHttpGatewayHello = NULL;
+ nlu.szHttpGatewayUserAgent = "User-Agent: Mozilla/4.01 [en] (Win95; I)";
+ nlu.pfnHttpGatewayInit = YAHOO_httpGatewayInit;
+ nlu.pfnHttpGatewayBegin = NULL;
+ nlu.pfnHttpGatewayWrapSend = YAHOO_httpGatewayWrapSend;
+ nlu.pfnHttpGatewayUnwrapRecv = YAHOO_httpGatewayUnwrapRecv;
+#endif
+
+ m_hNetlibUser = ( HANDLE )YAHOO_CallService( MS_NETLIB_REGISTERUSER, 0, ( LPARAM )&nlu );
+ MenuContactInit();
+
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// AddToList - adds a contact to the contact list
+
+HANDLE CYahooProto::AddToList( int flags, PROTOSEARCHRESULT* psr )
+{
+ DebugLog("[YahooAddToList] Flags: %d", flags);
+
+ if (!m_bLoggedIn){
+ DebugLog("[YahooAddToList] WARNING: WE ARE OFFLINE!");
+ return 0;
+ }
+
+ if (psr == NULL || psr->cbSize != sizeof( PROTOSEARCHRESULT )) {
+ DebugLog("[YahooAddToList] Empty data passed?");
+ return 0;
+ }
+
+ char *id = psr->flags & PSR_UNICODE ? mir_utf8encodeW((wchar_t*)psr->id) : mir_utf8encode((char*)psr->id);
+ HANDLE hContact = getbuddyH(id);
+ if (hContact != NULL) {
+ if (DBGetContactSettingByte(hContact, "CList", "NotOnList", 0)) {
+ DebugLog("[YahooAddToList] Temporary Buddy:%s already on our buddy list", id);
+ //return 0;
+ } else {
+ DebugLog("[YahooAddToList] Buddy:%s already on our buddy list", id);
+ mir_free(id);
+ return 0;
+ }
+ } else if (flags & PALF_TEMPORARY ) { /* not on our list */
+ DebugLog("[YahooAddToList] Adding Temporary Buddy:%s ", id);
+ }
+
+ int protocol = psr->reserved[0];
+ DebugLog("Adding buddy:%s", id);
+ hContact = add_buddy(id, id, protocol, flags);
+ mir_free(id);
+ return hContact;
+}
+
+HANDLE __cdecl CYahooProto::AddToListByEvent( int flags, int /*iContact*/, HANDLE hDbEvent )
+{
+ DBEVENTINFO dbei;
+ HANDLE hContact;
+
+ DebugLog("[YahooAddToListByEvent]");
+ if ( !m_bLoggedIn )
+ return 0;
+
+ memset( &dbei, 0, sizeof( dbei ));
+ dbei.cbSize = sizeof( dbei );
+
+ if (( dbei.cbBlob = YAHOO_CallService( MS_DB_EVENT_GETBLOBSIZE, ( LPARAM )hDbEvent, 0 )) == -1 ) {
+ DebugLog("[YahooAddToListByEvent] ERROR: Can't get blob size.");
+ return 0;
+ }
+
+ DebugLog("[YahooAddToListByEvent] Got blob size: %lu", dbei.cbBlob);
+ dbei.pBlob = ( PBYTE )_alloca( dbei.cbBlob );
+ if ( YAHOO_CallService( MS_DB_EVENT_GET, ( WPARAM )hDbEvent, ( LPARAM )&dbei )) {
+ DebugLog("[YahooAddToListByEvent] ERROR: Can't get event.");
+ return 0;
+ }
+
+ if ( dbei.eventType != EVENTTYPE_AUTHREQUEST ) {
+ DebugLog("[YahooAddToListByEvent] ERROR: Not an authorization request.");
+ return 0;
+ }
+
+ if ( strcmp( dbei.szModule, m_szModuleName )) {
+ DebugLog("[YahooAddToListByEvent] ERROR: Not Yahoo protocol.");
+ return 0;
+ }
+
+ //Adds a contact to the contact list given an auth, added or contacts event
+//wParam=MAKEWPARAM(flags,iContact)
+//lParam=(LPARAM)(HANDLE)hDbEvent
+//Returns a HANDLE to the new contact, or NULL on failure
+//hDbEvent must be either EVENTTYPE_AUTHREQ or EVENTTYPE_ADDED
+//flags are the same as for PS_ADDTOLIST.
+//iContact is only used for contacts events. It is the 0-based index of the
+//contact in the event to add. There is no way to add two or more contacts at
+//once, you should just do lots of calls.
+
+ /* TYPE ADDED
+ blob is: uin(DWORD), hcontact(HANDLE), nick(ASCIIZ), first(ASCIIZ),
+ last(ASCIIZ), email(ASCIIZ)
+
+ TYPE AUTH REQ
+ blob is: uin(DWORD), hcontact(HANDLE), nick(ASCIIZ), first(ASCIIZ),
+ last(ASCIIZ), email(ASCIIZ), reason(ASCIIZ)
+ */
+ memcpy(&hContact,( char* )( dbei.pBlob + sizeof( DWORD ) ), sizeof(HANDLE));
+
+ if (hContact != NULL) {
+ DebugLog("Temp Buddy found at: %p ", hContact);
+ } else
+ DebugLog("hContact NULL???");
+
+ return hContact;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// AuthAllow - processes the successful authorization
+
+int CYahooProto::Authorize( HANDLE hdbe )
+{
+ DebugLog("[YahooAuthAllow]");
+ if ( !m_bLoggedIn ) {
+ DebugLog("[YahooAuthAllow] Not Logged In!");
+ return 1;
+ }
+
+ DBEVENTINFO dbei;
+ memset( &dbei, 0, sizeof( dbei ));
+ dbei.cbSize = sizeof( dbei );
+ if (( dbei.cbBlob = YAHOO_CallService( MS_DB_EVENT_GETBLOBSIZE, ( WPARAM )hdbe, 0 )) == -1 )
+ return 1;
+
+ dbei.pBlob = ( PBYTE )_alloca( dbei.cbBlob );
+ if ( YAHOO_CallService( MS_DB_EVENT_GET, ( WPARAM )hdbe, ( LPARAM )&dbei ))
+ return 1;
+
+ if ( dbei.eventType != EVENTTYPE_AUTHREQUEST )
+ return 1;
+
+ if ( strcmp( dbei.szModule, m_szModuleName ))
+ return 1;
+
+ HANDLE hContact;
+ memcpy(&hContact,( char* )( dbei.pBlob + sizeof( DWORD ) ), sizeof(HANDLE));
+
+ /* Need to remove the buddy from our Miranda Lists */
+ DBVARIANT dbv;
+ if (hContact != NULL && !DBGetContactSettingString( hContact, m_szModuleName, YAHOO_LOGINID, &dbv )){
+ DebugLog("Accepting buddy:%s", dbv.pszVal);
+ accept(dbv.pszVal, GetWord(hContact, "yprotoid", 0));
+ DBFreeVariant(&dbv);
+ }
+
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// AuthDeny - handles the unsuccessful authorization
+
+int CYahooProto::AuthDeny( HANDLE hdbe, const TCHAR* reason )
+{
+ DebugLog("[YahooAuthDeny]");
+ if ( !m_bLoggedIn )
+ return 1;
+
+ DBEVENTINFO dbei;
+ memset( &dbei, 0, sizeof( dbei ));
+ dbei.cbSize = sizeof( dbei );
+
+ if (( dbei.cbBlob = YAHOO_CallService( MS_DB_EVENT_GETBLOBSIZE, ( WPARAM )hdbe, 0 )) == -1 ){
+ DebugLog("[YahooAuthDeny] ERROR: Can't get blob size");
+ return 1;
+ }
+
+ dbei.pBlob = ( PBYTE )alloca( dbei.cbBlob );
+ if ( YAHOO_CallService( MS_DB_EVENT_GET, ( WPARAM )hdbe, ( LPARAM )&dbei )){
+ DebugLog("YahooAuthDeny - Can't get db event!");
+ return 1;
+ }
+
+ if ( dbei.eventType != EVENTTYPE_AUTHREQUEST ){
+ DebugLog("YahooAuthDeny - not Authorization event");
+ return 1;
+ }
+
+ if ( strcmp( dbei.szModule, m_szModuleName )){
+ DebugLog("YahooAuthDeny - wrong module?");
+ return 1;
+ }
+
+ HANDLE hContact;
+ memcpy(&hContact,( char* )( dbei.pBlob + sizeof( DWORD ) ), sizeof(HANDLE));
+
+ /* Need to remove the buddy from our Miranda Lists */
+ DBVARIANT dbv;
+ if (hContact != NULL && !DBGetContactSettingString( hContact, m_szModuleName, YAHOO_LOGINID, &dbv )){
+ char *u_reason;
+
+ u_reason = mir_utf8encodeT(reason);
+
+ DebugLog("Rejecting buddy:%s msg: %s", dbv.pszVal, u_reason);
+ reject(dbv.pszVal, GetWord(hContact, "yprotoid", 0), u_reason);
+ DBFreeVariant(&dbv);
+ YAHOO_CallService( MS_DB_CONTACT_DELETE, (WPARAM) hContact, 0);
+
+ mir_free(u_reason);
+ }
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// PSR_AUTH
+
+int __cdecl CYahooProto::AuthRecv( HANDLE hContact, PROTORECVEVENT* pre )
+{
+ DebugLog("[YahooRecvAuth] ");
+ DBDeleteContactSetting(hContact,"CList","Hidden");
+
+ DBEVENTINFO dbei = { 0 };
+ dbei.cbSize = sizeof(dbei);
+ dbei.szModule = m_szModuleName;
+ dbei.timestamp = pre->timestamp;
+ dbei.flags = pre->flags & (PREF_CREATEREAD?DBEF_READ:0);
+ dbei.flags |= (pre->flags & PREF_UTF) ? DBEF_UTF : 0;
+ dbei.eventType = EVENTTYPE_AUTHREQUEST;
+
+ /* Just copy the Blob from PSR_AUTH event. */
+ dbei.cbBlob = pre->lParam;
+ dbei.pBlob = (PBYTE)pre->szMessage;
+
+ CallService(MS_DB_EVENT_ADD,(WPARAM)NULL,(LPARAM)&dbei);
+
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// PSS_AUTHREQUEST
+
+int __cdecl CYahooProto::AuthRequest( HANDLE hContact, const TCHAR* msg )
+{
+ DebugLog("[YahooSendAuthRequest]");
+
+ if (hContact && m_bLoggedIn) {
+ if (hContact) {
+ DBVARIANT dbv;
+ if (!DBGetContactSettingString(hContact, m_szModuleName, YAHOO_LOGINID, &dbv )) {
+ char *u_msg;
+
+ u_msg = mir_utf8encodeT(msg);
+ DebugLog("Adding buddy:%s Auth:%s", dbv.pszVal, u_msg);
+ AddBuddy( dbv.pszVal, GetWord(hContact, "yprotoid", 0), "miranda", u_msg );
+ SetString(hContact, "YGroup", "miranda");
+ DBFreeVariant( &dbv );
+
+ mir_free(u_msg);
+ return 0; // Success
+ }
+ }
+ }
+
+ return 1; // Failure
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// ChangeInfo
+
+HANDLE __cdecl CYahooProto::ChangeInfo( int /*iInfoType*/, void* )
+{
+ return NULL;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// GetCaps - return protocol capabilities bits
+
+DWORD_PTR __cdecl CYahooProto::GetCaps( int type, HANDLE /*hContact*/ )
+{
+ int ret = 0;
+ switch ( type ) {
+ case PFLAGNUM_1:
+ ret = PF1_IM | PF1_ADDED | PF1_AUTHREQ | PF1_MODEMSGRECV | PF1_MODEMSGSEND | PF1_BASICSEARCH |
+ PF1_EXTSEARCH | PF1_FILESEND | PF1_FILERECV| PF1_VISLIST | PF1_SERVERCLIST ;
+ break;
+
+ case PFLAGNUM_2:
+ ret = PF2_ONLINE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_ONTHEPHONE |
+ PF2_OUTTOLUNCH | PF2_INVISIBLE | PF2_LIGHTDND /*| PF2_HEAVYDND*/;
+ break;
+
+ case PFLAGNUM_3:
+ ret = PF2_ONLINE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_ONTHEPHONE |
+ PF2_OUTTOLUNCH | PF2_LIGHTDND ;
+ break;
+
+ case PFLAGNUM_4:
+ ret = PF4_FORCEAUTH | PF4_FORCEADDED | PF4_SUPPORTTYPING | PF4_SUPPORTIDLE
+ |PF4_AVATARS | PF4_OFFLINEFILES | PF4_IMSENDUTF | PF4_IMSENDOFFLINE /* for Meta plugin*/;
+ break;
+ case PFLAG_UNIQUEIDTEXT:
+ ret = (DWORD_PTR) Translate("ID");
+ break;
+ case PFLAG_UNIQUEIDSETTING:
+ ret = (DWORD_PTR) YAHOO_LOGINID;
+ break;
+ case PFLAG_MAXLENOFMESSAGE:
+ ret = 800; /* STUPID YAHOO!!! */
+ break;
+ }
+ return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// GetIcon - loads an icon for the contact list
+
+HICON __cdecl CYahooProto::GetIcon( int iconIndex )
+{
+ if (LOWORD(iconIndex) == PLI_PROTOCOL)
+ {
+ if (iconIndex & PLIF_ICOLIBHANDLE)
+ return (HICON)GetIconHandle(IDI_YAHOO);
+
+ bool big = (iconIndex & PLIF_SMALL) == 0;
+ HICON hIcon = LoadIconEx("yahoo", big);
+
+ if (iconIndex & PLIF_ICOLIB)
+ return hIcon;
+
+ hIcon = CopyIcon(hIcon);
+ ReleaseIconEx("yahoo", big);
+ return hIcon;
+ }
+ return NULL;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// GetInfo - retrieves a contact info
+
+void __cdecl CYahooProto::get_info_thread(HANDLE hContact)
+{
+ SleepEx(500, TRUE);
+ ProtoBroadcastAck(m_szModuleName, hContact, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, (HANDLE) 1, 0);
+}
+
+int __cdecl CYahooProto::GetInfo( HANDLE hContact, int /*infoType*/ )
+{
+ YForkThread(&CYahooProto::get_info_thread, hContact);
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// SearchByEmail - searches the contact by its e-mail
+
+HANDLE __cdecl CYahooProto::SearchByEmail( const PROTOCHAR* email )
+{
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// SearchByName - searches the contact by its first or last name, or by a nickname
+
+HANDLE __cdecl CYahooProto::SearchByName( const PROTOCHAR* nick, const PROTOCHAR* firstName, const PROTOCHAR* lastName )
+{
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// RecvContacts
+
+int __cdecl CYahooProto::RecvContacts( HANDLE /*hContact*/, PROTORECVEVENT* )
+{
+ return 1;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// RecvFile
+
+int __cdecl CYahooProto::RecvFile( HANDLE hContact, PROTORECVFILET* evt )
+{
+ DBDeleteContactSetting(hContact, "CList", "Hidden");
+
+ CCSDATA ccs = { hContact, PSR_FILE, 0, ( LPARAM )evt };
+ return CallService( MS_PROTO_RECVFILE, 0, ( LPARAM )&ccs );
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// RecvUrl
+
+int __cdecl CYahooProto::RecvUrl( HANDLE /*hContact*/, PROTORECVEVENT* )
+{
+ return 1;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// SendContacts
+
+int __cdecl CYahooProto::SendContacts( HANDLE /*hContact*/, int /*flags*/, int /*nContacts*/, HANDLE* /*hContactsList*/ )
+{
+ return 1;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// SendUrl
+
+int __cdecl CYahooProto::SendUrl( HANDLE /*hContact*/, int /*flags*/, const char* /*url*/ )
+{
+ return 1;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// SetApparentMode - sets the visibility status
+
+int __cdecl CYahooProto::SetApparentMode( HANDLE hContact, int mode )
+{
+ if (mode && mode != ID_STATUS_OFFLINE)
+ return 1;
+
+ int oldMode = DBGetContactSettingWord(hContact, m_szModuleName, "ApparentMode", 0);
+ if (mode != oldMode)
+ DBWriteContactSettingWord(hContact, m_szModuleName, "ApparentMode", (WORD)mode);
+ return 1;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// SetStatus - sets the protocol status
+
+int __cdecl CYahooProto::SetStatus( int iNewStatus )
+{
+ LOG(("[SetStatus] New status %s", (char *) CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, iNewStatus, 0)));
+
+ if (iNewStatus == ID_STATUS_OFFLINE) {
+
+ logout();
+
+ } else if (!m_bLoggedIn) {
+ DBVARIANT dbv;
+ int err = 0;
+ char errmsg[80];
+
+ if (m_iStatus == ID_STATUS_CONNECTING)
+ return 0;
+
+ YAHOO_utils_logversion();
+
+ /*
+ * Load Yahoo ID from the database.
+ */
+ if (!GetString(YAHOO_LOGINID, &dbv)) {
+ if (lstrlenA(dbv.pszVal) > 0) {
+ lstrcpynA(m_yahoo_id, dbv.pszVal, 255);
+ } else
+ err++;
+ DBFreeVariant(&dbv);
+ } else {
+ ProtoBroadcastAck(m_szModuleName, NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_BADUSERID);
+ err++;
+ }
+
+ if (err) {
+ lstrcpynA(errmsg, Translate("Please enter your yahoo id in Options/Network/Yahoo"), 80);
+ } else {
+ if (!GetString(YAHOO_PASSWORD, &dbv)) {
+ CallService(MS_DB_CRYPT_DECODESTRING, lstrlenA(dbv.pszVal) + 1, (LPARAM) dbv.pszVal);
+ if (lstrlenA(dbv.pszVal) > 0) {
+ lstrcpynA(m_password, dbv.pszVal, 255);
+ } else
+ err++;
+
+ DBFreeVariant(&dbv);
+ } else {
+ ProtoBroadcastAck(m_szModuleName, NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_WRONGPASSWORD);
+ err++;
+ }
+
+ if (err)
+ lstrcpynA(errmsg, Translate("Please enter your yahoo password in Options/Network/Yahoo"), 80);
+ }
+
+ if (err != 0){
+ BroadcastStatus(ID_STATUS_OFFLINE);
+
+ ShowError(Translate("Yahoo Login Error"), errmsg);
+ return 0;
+ }
+
+ if (iNewStatus == ID_STATUS_OFFLINE)
+ iNewStatus = ID_STATUS_ONLINE;
+
+ FREE(m_pw_token); // No Token yet.
+
+ if (!GetString(YAHOO_PWTOKEN, &dbv)) {
+ if (lstrlenA(dbv.pszVal) > 0) {
+ m_pw_token = strdup(dbv.pszVal);
+ }
+
+ DBFreeVariant(&dbv);
+ }
+
+ //DBWriteContactSettingWord(NULL, m_szModuleName, "StartupStatus", status);
+ m_startStatus = iNewStatus;
+
+ //reset the unread email count. We'll get a new packet since we are connecting.
+ m_unreadMessages = 0;
+
+ BroadcastStatus(ID_STATUS_CONNECTING);
+
+ iNewStatus = (iNewStatus == ID_STATUS_INVISIBLE) ? YAHOO_STATUS_INVISIBLE: YAHOO_STATUS_AVAILABLE;
+ YForkThread(&CYahooProto::server_main, (void *)iNewStatus);
+ }
+ else if (iNewStatus == ID_STATUS_INVISIBLE){ /* other normal away statuses are set via setaway */
+ BroadcastStatus(iNewStatus);
+ set_status(m_iStatus,NULL,(m_iStatus != ID_STATUS_ONLINE) ? 1 : 0);
+ }
+ else {
+ /* clear out our message just in case, STUPID AA! */
+ FREE(m_startMsg);
+
+ /* now tell miranda that we are Online, don't tell Yahoo server yet though! */
+ BroadcastStatus(iNewStatus);
+ }
+
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// GetAwayMsg - returns a contact's away message
+
+void __cdecl CYahooProto::get_status_thread(HANDLE hContact)
+{
+ int l;
+ DBVARIANT dbv;
+ char *gm = NULL, *sm = NULL, *fm;
+
+ Sleep( 150 );
+
+ /* Check Yahoo Games Message */
+ if (! DBGetContactSettingString(( HANDLE )hContact, m_szModuleName, "YGMsg", &dbv )) {
+ gm = strdup(dbv.pszVal);
+
+ DBFreeVariant( &dbv );
+ }
+
+ if (! DBGetContactSettingString(hContact, "CList", "StatusMsg", &dbv )) {
+ if (lstrlenA(dbv.pszVal) >= 1)
+ sm = strdup(dbv.pszVal);
+
+ DBFreeVariant( &dbv );
+ } else {
+ WORD status = DBGetContactSettingWord(hContact, m_szModuleName, "YStatus", YAHOO_STATUS_OFFLINE);
+ sm = yahoo_status_code( yahoo_status( status ));
+ if (sm) sm = strdup(sm); /* we need this to go global FREE later */
+ }
+
+ l = 0;
+ if (gm)
+ l += lstrlenA(gm) + 3;
+
+ l += lstrlenA(sm) + 1;
+ fm = (char *) malloc(l);
+
+ fm[0] ='\0';
+ if (gm && lstrlenA(gm) > 0) {
+ /* BAH YAHOO SUCKS! WHAT A PAIN!
+ find first carriage return add status message then add the rest */
+ char *c = strchr(gm, '\r');
+
+ if (c != NULL) {
+ lstrcpynA(fm,gm, c - gm + 1);
+ fm[c - gm + 1] = '\0';
+ } else
+ lstrcpyA(fm, gm);
+
+ if (sm) {
+ lstrcatA(fm, ": ");
+ lstrcatA(fm, sm);
+ }
+
+ if (c != NULL)
+ lstrcatA(fm, c);
+ } else if (sm) {
+ lstrcatA(fm, sm);
+ }
+
+ FREE(sm);
+
+ SendBroadcast( hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, ( HANDLE )1, ( LPARAM ) fm );
+}
+
+HANDLE __cdecl CYahooProto::GetAwayMsg( HANDLE hContact )
+{
+ DebugLog("[YahooGetAwayMessage] ");
+
+ if (hContact && m_bLoggedIn) {
+ if (DBGetContactSettingWord(hContact, m_szModuleName, "Status", ID_STATUS_OFFLINE) == ID_STATUS_OFFLINE)
+ return 0; /* user offline, what Status message? */
+
+ YForkThread(&CYahooProto::get_status_thread, hContact);
+ return (HANDLE)1; //Success
+ }
+
+ return 0; // Failure
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// PSR_AWAYMSG
+
+int __cdecl CYahooProto::RecvAwayMsg( HANDLE /*hContact*/, int /*statusMode*/, PROTORECVEVENT* )
+{
+ return 1;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// PSS_AWAYMSG
+
+int __cdecl CYahooProto::SendAwayMsg( HANDLE /*hContact*/, HANDLE /*hProcess*/, const char* )
+{
+ return 1;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// SetAwayMsg - sets the away status message
+
+int __cdecl CYahooProto::SetAwayMsg( int status, const PROTOCHAR* msg )
+{
+ char *c = msg && msg[0] ? mir_utf8encodeT(msg) : NULL;
+
+ DebugLog("[YahooSetAwayMessage] Status: %s, Msg: %s",(char *) CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, status, 0), (char*) c);
+
+ if(!m_bLoggedIn){
+ if (m_iStatus == ID_STATUS_OFFLINE) {
+ DebugLog("[YahooSetAwayMessage] WARNING: WE ARE OFFLINE!");
+ mir_free(c);
+ return 1;
+ } else {
+ if (m_startMsg) free(m_startMsg);
+
+ m_startMsg = c ? strdup(c) : NULL;
+
+ mir_free(c);
+ return 0;
+ }
+ }
+
+ /* need to tell ALL plugins that we are changing status */
+ BroadcastStatus(status);
+
+ if (m_startMsg) free(m_startMsg);
+
+ /* now decide what we tell the server */
+ if (c != 0) {
+ m_startMsg = strdup(c);
+ if(status == ID_STATUS_ONLINE) {
+ set_status(YAHOO_CUSTOM_STATUS, c, 0);
+ } else if(status != ID_STATUS_INVISIBLE){
+ set_status(YAHOO_CUSTOM_STATUS, c, 1);
+ }
+ } else {
+ set_status(status, NULL, 0);
+ m_startMsg = NULL;
+ }
+
+ mir_free(c);
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// PS_GETMYAWAYMSG
+
+INT_PTR __cdecl CYahooProto::GetMyAwayMsg(WPARAM wParam, LPARAM lParam)
+{
+ if (!m_bLoggedIn || ! m_startMsg)
+ return 0;
+
+ if (lParam & SGMA_UNICODE) {
+ return (INT_PTR) mir_utf8decodeW(m_startMsg);
+ } else {
+ return (INT_PTR) mir_utf8decodeA(m_startMsg);
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// UserIsTyping - sends a UTN notification
+
+int __cdecl CYahooProto::UserIsTyping( HANDLE hContact, int type )
+{
+ if (!m_bLoggedIn)
+ return 0;
+
+ char *szProto = (char *) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if (szProto==NULL || strcmp(szProto, m_szModuleName))
+ return 0;
+
+ DBVARIANT dbv;
+ if (!DBGetContactSettingString(hContact, m_szModuleName, YAHOO_LOGINID, &dbv)) {
+ if (type == PROTOTYPE_SELFTYPING_OFF || type == PROTOTYPE_SELFTYPING_ON) {
+ sendtyping(dbv.pszVal, GetWord(hContact, "yprotoid", 0), type == PROTOTYPE_SELFTYPING_ON?1:0);
+ }
+ DBFreeVariant(&dbv);
+ }
+ return 0;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// OnEvent - maintain protocol events
+
+int __cdecl CYahooProto::OnEvent( PROTOEVENTTYPE eventType, WPARAM wParam, LPARAM lParam )
+{
+ switch( eventType ) {
+ case EV_PROTO_ONLOAD: return OnModulesLoadedEx( 0, 0 );
+ //case EV_PROTO_ONEXIT: return OnPreShutdown( 0, 0 );
+ case EV_PROTO_ONOPTIONS: return OnOptionsInit( wParam, lParam );
+
+ case EV_PROTO_ONMENU:
+ MenuMainInit();
+ break;
+
+ case EV_PROTO_ONRENAME:
+ if ( mainMenuRoot ) {
+ CLISTMENUITEM clmi = { 0 };
+ clmi.cbSize = sizeof( CLISTMENUITEM );
+ clmi.flags = CMIM_NAME | CMIF_TCHAR | CMIF_KEEPUNTRANSLATED;
+ clmi.ptszName = m_tszUserName;
+ YAHOO_CallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )mainMenuRoot, ( LPARAM )&clmi );
+ }
+ break;
+
+ case EV_PROTO_ONCONTACTDELETED:
+ return OnContactDeleted(wParam, lParam);
+
+ case EV_PROTO_DBSETTINGSCHANGED:
+ return OnSettingChanged(wParam, lParam);
+ }
+ return 1;
+}
+
+INT_PTR CALLBACK first_run_dialog(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ {
+ TranslateDialogDefault(hwndDlg);
+
+ CYahooProto* ppro = (CYahooProto*)lParam;
+ SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
+
+ DBVARIANT dbv;
+ if ( !ppro->GetString(YAHOO_LOGINID, &dbv))
+ {
+ SetDlgItemTextA(hwndDlg, IDC_HANDLE, dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+
+ if ( !ppro->GetString(YAHOO_PASSWORD, &dbv))
+ {
+ CallService(MS_DB_CRYPT_DECODESTRING, strlen(dbv.pszVal) + 1, (LPARAM) dbv.pszVal);
+ SetDlgItemTextA(hwndDlg, IDC_PASSWORD, dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+
+ SetButtonCheck( hwndDlg, IDC_YAHOO_JAPAN, ppro->GetByte( "YahooJapan", 0 ) );
+ return TRUE;
+ }
+
+ case WM_COMMAND:
+ if ( LOWORD( wParam ) == IDC_NEWYAHOOACCOUNTLINK ) {
+ CallService( MS_UTILS_OPENURL,
+ 1,
+ (( BYTE )IsDlgButtonChecked( hwndDlg, IDC_YAHOO_JAPAN ) == 1) ?
+ ( LPARAM ) "http://edit.yahoo.co.jp/config/eval_register" :
+ ( LPARAM ) "http://edit.yahoo.com/config/eval_register"
+ );
+ return TRUE;
+ }
+
+ if ( HIWORD( wParam ) == EN_CHANGE && ( HWND )lParam == GetFocus())
+ {
+ switch( LOWORD( wParam )) {
+ case IDC_HANDLE:
+ case IDC_PASSWORD:
+ case IDC_YAHOO_JAPAN:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ }
+ }
+ break;
+
+ case WM_NOTIFY:
+ if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY )
+ {
+ CYahooProto* ppro = (CYahooProto*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+ char str[128];
+ DBVARIANT dbv;
+ BOOL reconnectRequired = FALSE;
+
+ GetDlgItemTextA(hwndDlg, IDC_HANDLE, str, sizeof(str));
+
+ dbv.pszVal = NULL;
+
+ if ( ppro->GetString( YAHOO_LOGINID, &dbv ) || lstrcmpA( str, dbv.pszVal ))
+ reconnectRequired = TRUE;
+
+ if ( dbv.pszVal != NULL )
+ DBFreeVariant( &dbv );
+
+ ppro->SetString(YAHOO_LOGINID, str);
+ GetDlgItemTextA(hwndDlg, IDC_PASSWORD, str, sizeof(str));
+
+ dbv.pszVal = NULL;
+ if ( ppro->GetString( YAHOO_PASSWORD, &dbv ) || lstrcmpA( str, dbv.pszVal ))
+ reconnectRequired = TRUE;
+ if ( dbv.pszVal != NULL )
+ DBFreeVariant( &dbv );
+
+ if (reconnectRequired ) {
+ DBDeleteContactSetting(NULL, ppro->m_szModuleName, YAHOO_PWTOKEN);
+ }
+
+ CallService(MS_DB_CRYPT_ENCODESTRING, sizeof(str), (LPARAM) str);
+ ppro->SetString(YAHOO_PASSWORD, str);
+ ppro->SetByte("YahooJapan", ( BYTE )IsDlgButtonChecked( hwndDlg, IDC_YAHOO_JAPAN ));
+
+ if ( reconnectRequired && ppro->m_bLoggedIn )
+ MessageBoxA( hwndDlg, Translate( "The changes you have made require you to reconnect to the Yahoo network before they take effect"), Translate("YAHOO Options"), MB_OK );
+
+ return TRUE;
+ }
+ break;
+ }
+
+ return FALSE;
+}
+
+
+INT_PTR CYahooProto::SvcCreateAccMgrUI(WPARAM wParam, LPARAM lParam)
+{
+ return (INT_PTR)CreateDialogParam (hInstance, MAKEINTRESOURCE( IDD_YAHOOACCOUNT ),
+ (HWND)lParam, first_run_dialog, (LPARAM)this );
+}
+
diff --git a/protocols/Yahoo/proto.h b/protocols/Yahoo/proto.h
new file mode 100644
index 0000000000..bdcbf51a36
--- /dev/null
+++ b/protocols/Yahoo/proto.h
@@ -0,0 +1,329 @@
+/*
+ * $Id: proto.h 14181 2012-03-11 17:51:16Z george.hazan $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+
+#ifndef _YAHOO_PROTO_H_
+#define _YAHOO_PROTO_H_
+
+#include <m_protoint.h>
+
+struct CYahooProto;
+
+#ifdef __GNUC__
+extern "C"
+{
+ typedef void ( CYahooProto::*YThreadFunc )( void* );
+ typedef INT_PTR ( CYahooProto::*YEventFunc )( WPARAM, LPARAM );
+ typedef INT_PTR ( CYahooProto::*YServiceFunc )( WPARAM, LPARAM );
+ typedef INT_PTR ( CYahooProto::*YServiceFuncParam )( WPARAM, LPARAM, LPARAM );
+}
+#else
+ typedef void ( __cdecl CYahooProto::*YThreadFunc )( void* );
+ typedef INT_PTR ( __cdecl CYahooProto::*YEventFunc )( WPARAM, LPARAM );
+ typedef INT_PTR ( __cdecl CYahooProto::*YServiceFunc )( WPARAM, LPARAM );
+ typedef INT_PTR ( __cdecl CYahooProto::*YServiceFuncParam )( WPARAM, LPARAM, LPARAM );
+#endif
+
+struct CYahooProto : public PROTO_INTERFACE
+{
+ CYahooProto( const char*, const TCHAR* );
+ virtual ~CYahooProto();
+
+ __inline void* operator new( size_t size )
+ { return calloc( 1, size );
+ }
+ __inline void operator delete( void* p )
+ { free( p );
+ }
+
+ //====================================================================================
+ // PROTO_INTERFACE
+ //====================================================================================
+
+ virtual HANDLE __cdecl AddToList( int flags, PROTOSEARCHRESULT* psr );
+ virtual HANDLE __cdecl AddToListByEvent( int flags, int iContact, HANDLE hDbEvent );
+
+ virtual int __cdecl Authorize( HANDLE hContact );
+ virtual int __cdecl AuthDeny( HANDLE hContact, const TCHAR* szReason );
+ virtual int __cdecl AuthRecv( HANDLE hContact, PROTORECVEVENT* );
+ virtual int __cdecl AuthRequest( HANDLE hContact, const TCHAR* szMessage );
+
+ virtual HANDLE __cdecl ChangeInfo( int iInfoType, void* pInfoData );
+
+ virtual HANDLE __cdecl FileAllow( HANDLE hContact, HANDLE hTransfer, const PROTOCHAR* szPath );
+ virtual int __cdecl FileCancel( HANDLE hContact, HANDLE hTransfer );
+ virtual int __cdecl FileDeny( HANDLE hContact, HANDLE hTransfer, const PROTOCHAR* szReason );
+ virtual int __cdecl FileResume( HANDLE hTransfer, int* action, const PROTOCHAR** szFilename );
+
+ virtual DWORD_PTR __cdecl GetCaps( int type, HANDLE hContact = NULL );
+ virtual HICON __cdecl GetIcon( int iconIndex );
+ virtual int __cdecl GetInfo( HANDLE hContact, int infoType );
+
+ virtual HANDLE __cdecl SearchBasic( const PROTOCHAR* id );
+ virtual HANDLE __cdecl SearchByEmail( const PROTOCHAR* email );
+ virtual HANDLE __cdecl SearchByName( const PROTOCHAR* nick, const PROTOCHAR* firstName, const PROTOCHAR* lastName );
+ virtual HWND __cdecl SearchAdvanced( HWND owner );
+ virtual HWND __cdecl CreateExtendedSearchUI( HWND owner );
+
+ virtual int __cdecl RecvContacts( HANDLE hContact, PROTORECVEVENT* );
+ virtual int __cdecl RecvFile( HANDLE hContact, PROTORECVFILET* );
+ virtual int __cdecl RecvMsg( HANDLE hContact, PROTORECVEVENT* );
+ virtual int __cdecl RecvUrl( HANDLE hContact, PROTORECVEVENT* );
+
+ virtual int __cdecl SendContacts( HANDLE hContact, int flags, int nContacts, HANDLE* hContactsList );
+ virtual HANDLE __cdecl SendFile( HANDLE hContact, const PROTOCHAR* szDescription, PROTOCHAR** ppszFiles );
+ virtual int __cdecl SendMsg( HANDLE hContact, int flags, const char* msg );
+ virtual int __cdecl SendUrl( HANDLE hContact, int flags, const char* url );
+
+ virtual int __cdecl SetApparentMode( HANDLE hContact, int mode );
+ virtual int __cdecl SetStatus( int iNewStatus );
+
+ virtual HANDLE __cdecl GetAwayMsg( HANDLE hContact );
+ virtual int __cdecl RecvAwayMsg( HANDLE hContact, int mode, PROTORECVEVENT* evt );
+ virtual int __cdecl SendAwayMsg( HANDLE hContact, HANDLE hProcess, const char* msg );
+ virtual int __cdecl SetAwayMsg( int m_iStatus, const PROTOCHAR* msg );
+ virtual INT_PTR __cdecl GetMyAwayMsg(WPARAM wParam, LPARAM lParam);
+
+ virtual int __cdecl UserIsTyping( HANDLE hContact, int type );
+
+ virtual int __cdecl OnEvent( PROTOEVENTTYPE eventType, WPARAM wParam, LPARAM lParam );
+
+ //====| Events |======================================================================
+ INT_PTR __cdecl OnContactDeleted( WPARAM, LPARAM );
+ INT_PTR __cdecl OnIdleEvent( WPARAM, LPARAM );
+ INT_PTR __cdecl OnModulesLoadedEx( WPARAM, LPARAM );
+ INT_PTR __cdecl OnOptionsInit( WPARAM, LPARAM );
+ INT_PTR __cdecl OnSettingChanged( WPARAM, LPARAM );
+
+ INT_PTR __cdecl OnABCommand( WPARAM, LPARAM );
+ INT_PTR __cdecl OnCalendarCommand( WPARAM, LPARAM );
+ INT_PTR __cdecl OnEditMyProfile( WPARAM, LPARAM );
+ INT_PTR __cdecl OnGotoMailboxCommand( WPARAM, LPARAM );
+ INT_PTR __cdecl OnRefreshCommand( WPARAM, LPARAM );
+ INT_PTR __cdecl OnShowMyProfileCommand( WPARAM, LPARAM );
+ INT_PTR __cdecl OnShowProfileCommand( WPARAM, LPARAM );
+ INT_PTR __cdecl OnPrebuildContactMenu(WPARAM wParam,LPARAM lParam);
+
+ //====| Services |====================================================================
+ INT_PTR __cdecl SvcCreateAccMgrUI(WPARAM wParam, LPARAM lParam);
+ INT_PTR __cdecl GetUnreadEmailCount( WPARAM, LPARAM );
+ INT_PTR __cdecl SendNudge( WPARAM, LPARAM );
+ INT_PTR __cdecl SetMyAvatar( WPARAM, LPARAM );
+
+ void BroadcastStatus(int s);
+ void LoadYahooServices( void );
+ void MenuMainInit( void );
+ void MenuContactInit( void );
+ void MenuUninit( void );
+
+ //====| Data |========================================================================
+ BOOL m_bLoggedIn;
+ YList *m_connections;
+ unsigned int m_connection_tags;
+
+ char* m_startMsg;
+
+ // former ylad structure
+ char m_yahoo_id[255]; // user id (login)
+ char m_password[255]; // user password
+ char *m_pw_token; // yahoo token (login)
+ int m_id; // libyahoo id allocated for that proto instance
+ int m_fd; // socket descriptor
+ int m_status;
+ char* m_msg;
+ int m_rpkts;
+
+ //====| avatar.cpp |==================================================================
+ void __cdecl send_avt_thread(void *psf);
+ void __cdecl recv_avatarthread(void *pavt);
+
+ INT_PTR __cdecl GetAvatarInfo( WPARAM, LPARAM );
+ INT_PTR __cdecl GetAvatarCaps( WPARAM, LPARAM );
+ INT_PTR __cdecl GetMyAvatar( WPARAM, LPARAM );
+
+ void ext_got_picture(const char *me, const char *who, const char *pic_url, int cksum, int type);
+ void ext_got_picture_checksum(const char *me, const char *who, int cksum);
+ void ext_got_picture_update(const char *me, const char *who, int buddy_icon);
+ void ext_got_picture_status(const char *me, const char *who, int buddy_icon);
+ void ext_got_picture_upload(const char *me, const char *url, unsigned int ts);
+ void ext_got_avatar_share(int buddy_icon);
+
+ void reset_avatar(HANDLE hContact);
+ void request_avatar(const char* who);
+
+ void SendAvatar(const TCHAR *szFile);
+ void GetAvatarFileName(HANDLE hContact, TCHAR* pszDest, int cbLen, int type);
+
+ //====| filetransfer.cpp |============================================================
+ void __cdecl recv_filethread(void *psf);
+ void __cdecl send_filethread(void *psf);
+
+ void ext_got_file(const char *me, const char *who, const char *url, long expires, const char *msg, const char *fname, unsigned long fesize, const char *ft_token, int y7);
+ void ext_got_files(const char *me, const char *who, const char *ft_token, int y7, YList* files);
+ void ext_got_file7info(const char *me, const char *who, const char *url, const char *fname, const char *ft_token);
+ void ext_ft7_send_file(const char *me, const char *who, const char *filename, const char *token, const char *ft_token);
+
+ //====| icolib.cpp |==================================================================
+ void IconsInit( void );
+ HICON LoadIconEx(const char* name, bool big = false);
+ HANDLE GetIconHandle(int iconId);
+ void ReleaseIconEx(const char* name, bool big = false);
+
+ //====| ignore.cpp |==================================================================
+ const YList* GetIgnoreList(void);
+ void IgnoreBuddy(const char *buddy, int ignore);
+ int BuddyIgnored(const char *who);
+
+ void ext_got_ignore(YList * igns);
+
+ //====| im.cpp |======================================================================
+ void ext_got_im(const char *me, const char *who, int protocol, const char *msg, long tm, int stat, int utf8, int buddy_icon, const char *seqn=NULL, int sendn=0);
+
+ void send_msg(const char *id, int protocol, const char *msg, int utf8);
+
+ void __cdecl im_sendacksuccess(HANDLE hContact);
+ void __cdecl im_sendackfail(HANDLE hContact);
+ void __cdecl im_sendackfail_longmsg(HANDLE hContact);
+
+ //====| proto.cpp |===================================================================
+ void __cdecl get_status_thread(HANDLE hContact);
+ void __cdecl get_info_thread(HANDLE hContact);
+
+ //====| search.cpp |==================================================================
+ void __cdecl search_simplethread(void *snsearch);
+ void __cdecl searchadv_thread(void *pHWND);
+
+ void ext_got_search_result(int found, int start, int total, YList *contacts);
+
+ //====| server.cpp |==================================================================
+ void __cdecl server_main(void *empty);
+
+ //====| services.cpp |================================================================
+ void logoff_buddies();
+
+ void OpenURL(const char *url, int autoLogin);
+
+ INT_PTR __cdecl SetCustomStatCommand( WPARAM, LPARAM );
+
+ //====| user_info.cpp |===============================================================
+ INT_PTR __cdecl OnUserInfoInit( WPARAM wParam, LPARAM lParam );
+
+ //====| util.cpp |====================================================================
+ int GetByte( const char* valueName, int parDefltValue );
+ int SetByte( const char* valueName, int parValue );
+ int GetByte( HANDLE hContact, const char* valueName, int parDefltValue );
+ int SetByte( HANDLE hContact, const char* valueName, int parValue );
+
+ int GetString( const char* name, DBVARIANT* );
+ int GetString( HANDLE hContact, const char* name, DBVARIANT* );
+
+ void SetString( const char* name, const char* value );
+ void SetString( HANDLE hContact, const char* name, const char* value );
+ void SetStringT( HANDLE hContact, const char* name, const TCHAR* value );
+ DWORD SetStringUtf( HANDLE hContact, const char* valueName, const char* parValue );
+
+ DWORD GetDword( const char* valueName, DWORD parDefltValue );
+ DWORD SetDword( const char* valueName, DWORD parValue );
+ DWORD GetDword( HANDLE hContact, const char* valueName, DWORD parDefltValue );
+ DWORD SetDword( HANDLE hContact, const char* valueName, DWORD parValue );
+
+ WORD GetWord( HANDLE hContact, const char* valueName, int parDefltValue );
+ WORD SetWord( HANDLE hContact, const char* valueName, int parValue );
+
+ DWORD Set_Protocol( HANDLE hContact, int protocol );
+
+ int SendBroadcast( HANDLE hContact, int type, int result, HANDLE hProcess, LPARAM lParam );
+
+ int ShowNotification(const char *title, const char *info, DWORD flags);
+ void ShowError(const char *title, const char *buff);
+ int ShowPopup( const char* nickname, const char* msg, const char *szURL );
+
+ #ifdef __GNUC__
+ int DebugLog( const char *fmt, ... ) __attribute__ ((format(printf,2,3)));
+ #else
+ int DebugLog( const char *fmt, ... );
+ #endif
+
+ //====| yahoo.cpp |===================================================================
+ HANDLE add_buddy( const char *yahoo_id, const char *yahoo_name, int protocol, DWORD flags );
+ const char *find_buddy( const char *yahoo_id);
+ HANDLE getbuddyH(const char *yahoo_id);
+ void remove_buddy(const char *who, int protocol);
+
+ void logout();
+
+ void accept(const char *who, int protocol);
+ void reject(const char *who, int protocol, const char *msg);
+ void sendtyping(const char *who, int protocol, int stat);
+ void set_status(int myyahooStatus, char *msg, int away);
+ void stealth(const char *buddy, int add);
+
+ int ext_connect(const char *h, int p, int type);
+ int ext_connect_async(const char *host, int port, int type, yahoo_connect_callback callback, void *data);
+
+ void ext_send_http_request(enum yahoo_connection_type type, const char *method, const char *url, const char *cookies, long content_length, yahoo_get_fd_callback callback, void *callback_data);
+ char * ext_send_https_request(struct yahoo_data *yd, const char *host, const char *path);
+
+ void ext_status_changed(const char *who, int protocol, int stat, const char *msg, int away, int idle, int mobile, int utf8);
+ void ext_status_logon(const char *who, int protocol, int stat, const char *msg, int away, int idle, int mobile, int cksum, int buddy_icon, long client_version, int utf8);
+ void ext_got_audible(const char *me, const char *who, const char *aud, const char *msg, const char *aud_hash);
+ void ext_got_calendar(const char *url, int type, const char *msg, int svc);
+ void ext_got_stealth(char *stealthlist);
+ void ext_got_buddies(YList * buds);
+ void ext_rejected(const char *who, const char *msg);
+ void ext_buddy_added(char *myid, char *who, char *group, int status, int auth);
+ void ext_contact_added(const char *myid, const char *who, const char *fname, const char *lname, const char *msg, int protocol);
+ void ext_typing_notify(const char *me, const char *who, int protocol, int stat);
+ void ext_game_notify(const char *me, const char *who, int stat, const char *msg);
+ void ext_mail_notify(const char *from, const char *subj, int cnt);
+ void ext_system_message(const char *me, const char *who, const char *msg);
+ void ext_got_identities(const char *nick, const char *fname, const char *lname, YList * ids);
+ void ext_got_ping(const char *errormsg);
+ void ext_error(const char *err, int fatal, int num);
+ void ext_login_response(int succ, const char *url);
+ void ext_login(enum yahoo_status login_mode);
+
+ void AddBuddy( const char *who, int protocol, const char *group, const char *msg);
+
+ void YAHOO_utils_logversion();
+
+ unsigned int ext_add_handler(int fd, yahoo_input_condition cond, void *data);
+ void ext_remove_handler(unsigned int tag);
+
+private:
+ int m_startStatus;
+ int m_unreadMessages;
+
+ int poll_loop;
+ long lLastSend;
+
+ HANDLE hYahooNudge;
+ HANDLE m_hNetlibUser;
+
+ HGENMENU mainMenuRoot;
+ HGENMENU hShowProfileMenuItem;
+ HGENMENU menuItemsAll[ 7 ];
+
+ HANDLE hYahooAvatarsFolder;
+ bool InitCstFldRan;
+ void InitCustomFolders(void);
+
+ void YCreateService( const char* szService, YServiceFunc serviceProc );
+ void YCreateServiceParam( const char* szService, YServiceFuncParam serviceProc, LPARAM lParam );
+ HANDLE YCreateHookableEvent( const char* szService );
+ void YForkThread( YThreadFunc pFunc, void *param );
+ void YHookEvent( const char* szEvent, YEventFunc handler );
+};
+
+extern LIST<CYahooProto> g_instances;
+
+#endif
diff --git a/protocols/Yahoo/resource.h b/protocols/Yahoo/resource.h
new file mode 100644
index 0000000000..0e182c3c17
--- /dev/null
+++ b/protocols/Yahoo/resource.h
@@ -0,0 +1,91 @@
+/*
+ * $Id: resource.h 9837 2009-05-21 15:12:06Z gena01 $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+
+/*
+ * Resource Icons
+ */
+#define IDI_YAHOO 10101
+#define IDI_INBOX 10102
+#define IDI_PROFILE 10103
+#define IDI_REFRESH 10104
+#define IDI_YAB 10105
+#define IDI_SET_STATUS 10106
+#define IDI_CALENDAR 10107
+
+/*
+ * Options
+ */
+#define IDD_OPT_YAHOO 185
+#define IDD_YAHOOACCOUNT 190
+
+#define IDD_SETCUSTSTAT 186
+#define IDD_OPT_YAHOO_POPUP 187
+
+#define IDC_CUSTSTATBUSY 1000
+#define IDC_CUSTSTAT 1001
+#define IDC_STYAHOOGROUP 1002
+#define IDC_EDIT1 1003
+#define IDC_STIGNGROUP 1004
+#define IDC_USEWINCOLORS 1008
+#define IDC_YCHECKMAIL 1011
+#define IDC_YTNOTIF 1012
+#define IDC_PASSWORD 1020
+#define IDC_NICK 1021
+#define IDC_HANDLE 1022
+#define IDC_BGCOLOUR 1026
+#define IDC_TEXTCOLOUR 1028
+#define IDC_PREVIEW 1030
+#define IDC_DEBUG 1050
+#define IDC_POPUP_TIMEOUT 1051
+#define IDC_LOGINSERVER 1171
+#define IDC_YAHOOPORT 1174
+#define IDC_DISABLEYAHOOMAIL 1301
+#define IDC_NEWYAHOOACCOUNTLINK 1438
+#define IDC_RESETSERVER 1472
+#define IDC_DISABLE_UTF8 1476
+#define IDC_USE_YAB 1477
+#define IDC_SHOW_ERRORS 1478
+#define IDC_SHOW_AVATARS 1479
+#define IDC_MAIL_AUTOLOGIN 1480
+#define IDC_YAHOO_JAPAN 1481
+
+/*
+ * Ignore Options
+ */
+#define IDD_OPT_YAHOO_IGNORE 201
+#define IDC_YIGN_EDIT 202
+#define IDC_YIGN_LIST 203
+#define IDC_IGN_ADD 204
+#define IDC_IGN_REMOVE 205
+#define IDC_OPT_IGN_UNKNOWN 206
+#define IDC_OPT_IGN_LIST 207
+
+#define IDD_OPT_YAHOO_CONNECTION 301
+
+/*
+ * These are needed for Advanced Search
+ */
+#define IDD_SEARCHUSER 400
+#define IDC_SEARCH_ID 401
+#define IDC_SEARCH_PROTOCOL 402
+
+/*
+ *
+ */
+#define IDD_USER_INFO 500
+#define IDC_NFO_CLIENT 501
+
+/*
+ *
+ */
+#define IDC_STATIC -1
diff --git a/protocols/Yahoo/search.cpp b/protocols/Yahoo/search.cpp
new file mode 100644
index 0000000000..3f0bb3710a
--- /dev/null
+++ b/protocols/Yahoo/search.cpp
@@ -0,0 +1,207 @@
+/*
+ * $Id: search.cpp 11632 2010-04-24 12:32:03Z borkra $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+
+#include "yahoo.h"
+#include <m_protosvc.h>
+#include <m_langpack.h>
+
+#include "resource.h"
+
+////////////////////////////////////////////////////////////////////////////////////////
+// SearchBasic - searches the contact by UIN
+
+void __cdecl CYahooProto::search_simplethread(void *snsearch)
+{
+ TCHAR *id = (TCHAR *) snsearch;
+
+ if (lstrlen(id) < 4) {
+ SendBroadcast(NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE) 1, 0);
+ MessageBoxA(NULL, "Please enter a valid ID to search for.", "Search", MB_OK);
+ return;
+ }
+
+ TCHAR *c = _tcschr(id, '@');
+ if (c) *c = 0;
+
+ PROTOSEARCHRESULT psr = { 0 };
+ psr.cbSize = sizeof(psr);
+ psr.flags = PSR_TCHAR;
+ psr.id = (TCHAR*)_tcslwr(id);
+ psr.reserved[0] = YAHOO_IM_YAHOO;
+
+ SendBroadcast(NULL, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE) 1, (LPARAM) & psr);
+
+ //yahoo_search(m_id, YAHOO_SEARCH_YID, m, YAHOO_GENDER_NONE, YAHOO_AGERANGE_NONE, 0, 1);
+
+ SendBroadcast(NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE) 1, 0);
+}
+
+HANDLE __cdecl CYahooProto::SearchBasic( const TCHAR* nick )
+{
+ LOG(("[YahooBasicSearch] Searching for: %S", nick));
+
+ if ( !m_bLoggedIn )
+ return 0;
+
+ YForkThread(&CYahooProto::search_simplethread, _tcsdup( nick ));
+ return ( HANDLE )1;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// SearchAdvanced - searches the contact by UIN
+
+void CYahooProto::ext_got_search_result(int found, int start, int total, YList *contacts)
+{
+ struct yahoo_found_contact *yct=NULL;
+ int i=start;
+ YList *en=contacts;
+
+ LOG(("got search result: "));
+
+ LOG(("Found: %d", found));
+ LOG(("Start: %d", start));
+ LOG(("Total: %d", total));
+
+ PROTOSEARCHRESULT psr = { 0 };
+ psr.cbSize = sizeof(psr);
+ psr.flags = PSR_TCHAR;
+ psr.reserved[0] = YAHOO_IM_YAHOO;
+
+ while (en) {
+ yct = ( yahoo_found_contact* )en->data;
+
+ if (yct == NULL) {
+ LOG(("[%d] Empty record?",i++));
+ } else {
+ LOG(("[%d] id: '%s', online: %d, age: %d, sex: '%s', location: '%s'", i++, yct->id, yct->online, yct->age, yct->gender, yct->location));
+ psr.id = mir_utf8decodeT( yct->id );
+
+ if (yct->gender[0] != 5)
+ psr.firstName = mir_utf8decodeT( yct->gender );
+ else
+ psr.firstName = NULL;
+
+ TCHAR c[10];
+ if (yct->age > 0) {
+ _itot(yct->age, c,10);
+ psr.lastName = ( TCHAR* )c;
+ }
+ else
+ psr.lastName = NULL;
+
+ if (yct->location[0] != 5)
+ psr.email = mir_utf8decodeT( yct->location );
+ else
+ psr.email = NULL;
+
+ //void yahoo_search(int id, enum yahoo_search_type t, const char *text, enum yahoo_search_gender g, enum yahoo_search_agerange ar,
+ // int photo, int yahoo_only)
+
+ SendBroadcast(NULL, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE) 1, (LPARAM) & psr);
+
+ mir_free(psr.id);
+ mir_free(psr.firstName);
+ mir_free(psr.email);
+ }
+ en = y_list_next(en);
+ }
+ SendBroadcast(NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE) 1, 0);
+}
+
+/*
+ * This service function creates an advanced search dialog in Find/Add contacts Custom area.
+ *
+ * Returns: 0 on failure or HWND on success
+ */
+
+static INT_PTR CALLBACK YahooSearchAdvancedDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch ( msg ) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+
+ SendDlgItemMessageA(hwndDlg, IDC_SEARCH_PROTOCOL, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Yahoo! Messenger");
+ SendDlgItemMessageA(hwndDlg, IDC_SEARCH_PROTOCOL, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Lotus Sametime");
+ SendDlgItemMessageA(hwndDlg, IDC_SEARCH_PROTOCOL, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"LCS");
+ SendDlgItemMessageA(hwndDlg, IDC_SEARCH_PROTOCOL, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Windows Live (MSN)");
+
+ // select the first one
+ SendDlgItemMessage(hwndDlg, IDC_SEARCH_PROTOCOL, CB_SETCURSEL, 0, 0);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+HWND __cdecl CYahooProto::CreateExtendedSearchUI( HWND parent )
+{
+ if ( parent && hInstance )
+ return CreateDialogParam( hInstance, MAKEINTRESOURCE(IDD_SEARCHUSER), parent, YahooSearchAdvancedDlgProc, ( LPARAM )this );
+
+ return 0;
+}
+
+void __cdecl CYahooProto::searchadv_thread(void *pHWND)
+{
+ HWND hwndDlg = (HWND) pHWND;
+
+ TCHAR searchid[128];
+ GetDlgItemText(hwndDlg, IDC_SEARCH_ID, searchid, 128);
+
+ if (lstrlen(searchid) == 0) {
+ SendBroadcast(NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE) 1, 0);
+ MessageBoxA(NULL, "Please enter a valid ID to search for.", "Search", MB_OK);
+ return;
+ }
+
+ PROTOSEARCHRESULT psr = { 0 };
+ psr.cbSize = sizeof(psr);
+ psr.flags = PSR_TCHAR;
+ psr.id = _tcslwr(searchid);
+
+ int pid = SendDlgItemMessage(hwndDlg , IDC_SEARCH_PROTOCOL, CB_GETCURSEL, 0, 0);
+ switch (pid){
+ case 0: psr.firstName = _T("<Yahoo >"); pid = YAHOO_IM_YAHOO; break;
+ case 1: psr.firstName = _T("<Lotus Sametime>"); pid = YAHOO_IM_SAMETIME;break;
+ case 2: psr.firstName = _T("<LCS>"); pid = YAHOO_IM_LCS; break;
+ case 3: psr.firstName = _T("<Windows Live (MSN)>"); pid = YAHOO_IM_MSN; break;
+ }
+
+ psr.reserved[0] = pid;
+
+ /*
+ * Show this in results
+ */
+ SendBroadcast(NULL, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE) 1, (LPARAM) & psr);
+
+ /*
+ * Done searching.
+ */
+ SendBroadcast(NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE) 1, 0);
+}
+
+/*
+ * This service function does the advanced search
+ *
+ * Returns: 0 on failure or HWND on success
+ */
+
+HWND __cdecl CYahooProto::SearchAdvanced( HWND owner )
+{
+ LOG(("[YahooAdvancedSearch]"));
+
+ if ( !m_bLoggedIn )
+ return 0;
+
+ YForkThread( &CYahooProto::searchadv_thread, owner );
+ return ( HWND )1;
+}
diff --git a/protocols/Yahoo/search.h b/protocols/Yahoo/search.h
new file mode 100644
index 0000000000..38a76b39ef
--- /dev/null
+++ b/protocols/Yahoo/search.h
@@ -0,0 +1,24 @@
+/*
+ * $Id: search.h 8430 2008-10-15 16:49:25Z gena01 $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+#ifndef _YAHOO_SEARCH_H_
+#define _YAHOO_SEARCH_H_
+
+int YahooBasicSearch(WPARAM wParam,LPARAM lParam);
+void ext_yahoo_got_search_result(int id, int found, int start, int total, YList *contacts);
+
+/*
+ * Adding Advanced Search to Miranda
+ */
+int YahooCreateAdvancedSearchUI(WPARAM wParam, LPARAM lParam);
+int YahooAdvancedSearch(WPARAM wParam, LPARAM lParam);
+#endif
diff --git a/protocols/Yahoo/server.cpp b/protocols/Yahoo/server.cpp
new file mode 100644
index 0000000000..3f901e4149
--- /dev/null
+++ b/protocols/Yahoo/server.cpp
@@ -0,0 +1,224 @@
+/*
+ * $Id: server.cpp 9810 2009-05-19 01:43:22Z gena01 $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+#include "yahoo.h"
+#include <time.h>
+
+int PASCAL send(SOCKET s, const char FAR *buf, int len, int flags)
+{
+ int rlen = Netlib_Send((HANDLE)s, buf, len, 0);
+
+#ifdef HTTP_GATEWAY
+ if (iHTTPGateway)
+ lLastSend = time(NULL);
+#endif
+
+ if (rlen == SOCKET_ERROR) {
+ LOG(("SEND Error."));
+ return -1;
+ }
+
+ return len;
+}
+
+int PASCAL recv(SOCKET s, char FAR *buf, int len, int flags)
+{
+ int RecvResult = Netlib_Recv((HANDLE)s, buf, len, (len == 1) ? MSG_NODUMP : 0);
+
+ if (RecvResult == 0) {
+ LOG(("[recv] Connection closed gracefully."));
+ return 0;
+ }
+ if (RecvResult == SOCKET_ERROR) {
+ LOG(("[recv] Connection abortively closed"));
+ return -1;
+ }
+
+ return RecvResult;
+}
+
+void __cdecl CYahooProto::server_main(void *empty)
+{
+ enum yahoo_status status = (enum yahoo_status) (int)empty;
+ time_t lLastPing, lLastKeepAlive, t;
+ YList *l;
+ NETLIBSELECTEX nls = {0};
+ int recvResult, ridx = 0, widx = 0, i;
+
+ DebugLog("Server Thread Starting status: %d", status);
+
+ do_yahoo_debug=YAHOO_LOG_DEBUG;
+ yahoo_set_log_level(( yahoo_log_level )do_yahoo_debug);
+
+ poll_loop = 1; /* set this so we start looping */
+
+ ext_login(status);
+
+ lLastKeepAlive = lLastPing = time(NULL);
+
+ while (poll_loop) {
+ nls.cbSize = sizeof(nls);
+ nls.dwTimeout = 1000; // 1000 millis = 1 sec
+
+ FD_ZERO(&nls.hReadStatus);
+ FD_ZERO(&nls.hWriteStatus);
+ FD_ZERO(&nls.hExceptStatus);
+ nls.hExceptConns[0] = NULL;
+ ridx = 0; widx = 0;
+
+ for(l=m_connections; l; ) {
+ struct _conn *c = ( _conn * )l->data;
+ //LOG(("Connection tag:%d id:%d fd:%d remove:%d", c->tag, c->id, c->fd, c->remove));
+ if(c->remove) {
+ YList *n = y_list_next(l);
+ //LOG(("Removing id:%d fd:%d tag:%d", c->id, c->fd, c->tag));
+ m_connections = y_list_remove_link(m_connections, l);
+ y_list_free_1(l);
+ FREE(c);
+ l=n;
+ } else {
+ if(c->cond & YAHOO_INPUT_READ) {
+ //LOG(( "[YAHOO_INPUT_READ] Waiting on read. Tag: %d fd: %d", c->tag, c->fd ));
+ nls.hReadConns[ridx++] = (HANDLE)c->fd;
+ }
+
+ if(c->cond & YAHOO_INPUT_WRITE) {
+ //LOG(( "[YAHOO_INPUT_WRITE] Waiting on write. Tag: %d fd: %d", c->tag, c->fd ));
+ nls.hWriteConns[widx++] =(HANDLE) c->fd;
+ }
+
+ l = y_list_next(l);
+ }
+ }
+
+ //DebugLog("[Yahoo_Server] ridx:%d widx:%d", ridx, widx);
+
+ nls.hReadConns[ridx] = NULL;
+ nls.hWriteConns[widx] = NULL;
+
+ if (m_connections == NULL){
+ DebugLog("Last connection closed.");
+ break;
+ }
+ recvResult = CallService(MS_NETLIB_SELECTEX, (WPARAM) 0, (LPARAM)&nls);
+
+ /* Check for Miranda Exit Status */
+ if (Miranda_Terminated()) {
+ DebugLog("Miranda Exiting... stopping the loop.");
+ break;
+ }
+
+ /* do the timer check */
+ if (m_id > 0) {
+#ifdef HTTP_GATEWAY
+ //DebugLog("HTTPGateway: %d", iHTTPGateway);
+ if (!iHTTPGateway) {
+#endif
+ t = time(NULL);
+
+ if (m_bLoggedIn && t - lLastKeepAlive >= 60) {
+ LOG(("[TIMER] Sending a keep alive message"));
+ yahoo_keepalive(m_id);
+
+ lLastKeepAlive = t;
+ }
+
+ if (m_bLoggedIn && t - lLastPing >= 3600) {
+ LOG(("[TIMER] Sending ping"));
+ yahoo_send_ping(m_id);
+
+ lLastPing = t;
+ }
+
+#ifdef HTTP_GATEWAY
+ } else {
+ DebugLog("[SERVER] Got packets: %d", ylad->rpkts);
+
+ if ( m_bLoggedIn && ( (ylad->rpkts > 0 && (time(NULL) - lLastSend) >=3) ||
+ ( (time(NULL) - lLastSend) >= 13) ) ) {
+
+ LOG(("[TIMER] Sending an idle message..."));
+ yahoo_send_idle_packet(m_id);
+ }
+
+ //
+ // need to sleep, cause netlibselectex is too fast?
+ //
+ SleepEx(500, TRUE);
+ }
+#endif
+ }
+ /* do the timer check ends */
+
+ for(l = m_connections; l; l = y_list_next(l)) {
+ struct _conn *c = ( _conn * )l->data;
+
+ if (c->remove)
+ continue;
+
+ /* are we waiting for a Read request? */
+ if(c->cond & YAHOO_INPUT_READ) {
+
+ for (i = 0; i < ridx; i++) {
+ if ((HANDLE)c->fd == nls.hReadConns[i]) {
+ if (nls.hReadStatus[i]) {
+ //LOG(( "[YAHOO_INPUT_READ] Read Ready. Tag: %d fd: %d", c->tag, c->fd ));
+ yahoo_callback(c, YAHOO_INPUT_READ);
+ }
+ }//if c->fd=
+ }//for i = 0
+
+ }
+
+ /* are we waiting for a Write request? */
+ if(c->cond & YAHOO_INPUT_WRITE) {
+
+ for (i = 0; i < widx; i++) {
+ if ((HANDLE)c->fd == nls.hWriteConns[i]) {
+ if (nls.hWriteStatus[i]) {
+ //LOG(( "[YAHOO_INPUT_WRITE] Write ready. Tag: %d fd: %d", c->tag, c->fd ));
+ yahoo_callback(c, YAHOO_INPUT_WRITE);
+ }
+ } // if c->fd == nls
+ }// for i = 0
+
+ }
+
+
+ }// for l=connections
+
+ }
+ DebugLog("Exited loop");
+
+ /* cleanup the data stuff and close our connection handles */
+ while(m_connections) {
+ YList *tmp = m_connections;
+ struct _conn * c = ( _conn * )m_connections->data;
+ Netlib_CloseHandle((HANDLE)c->fd);
+ FREE(c);
+ m_connections = y_list_remove_link(m_connections, m_connections);
+ y_list_free_1(tmp);
+ }
+
+ yahoo_close(m_id);
+
+ m_bLoggedIn = FALSE;
+
+ m_status = YAHOO_STATUS_OFFLINE;
+ m_id = 0;
+
+ /* now set ourselves to offline */
+ BroadcastStatus(ID_STATUS_OFFLINE);
+ logoff_buddies();
+
+ DebugLog("Server thread ending");
+}
diff --git a/protocols/Yahoo/services.cpp b/protocols/Yahoo/services.cpp
new file mode 100644
index 0000000000..0245ca1d8d
--- /dev/null
+++ b/protocols/Yahoo/services.cpp
@@ -0,0 +1,577 @@
+/*
+ * $Id: services.cpp 14142 2012-03-09 21:11:27Z george.hazan $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+
+#include "yahoo.h"
+
+#include <m_protomod.h>
+#include <m_protosvc.h>
+#include <m_langpack.h>
+#include <m_skin.h>
+#include <m_utils.h>
+#include <m_options.h>
+#include <m_popup.h>
+#include <m_idle.h>
+
+#include "avatar.h"
+#include "resource.h"
+#include "file_transfer.h"
+#include "im.h"
+#include "search.h"
+
+void CYahooProto::logoff_buddies()
+{
+ //set all contacts to 'offline'
+ HANDLE hContact = ( HANDLE )YAHOO_CallService( MS_DB_CONTACT_FINDFIRST, 0, 0 );
+ while ( hContact != NULL )
+ {
+ if ( !lstrcmpA( m_szModuleName, ( char* )YAHOO_CallService( MS_PROTO_GETCONTACTBASEPROTO, ( WPARAM )hContact,0 ))) {
+ SetWord( hContact, "Status", ID_STATUS_OFFLINE );
+ SetDword(hContact, "IdleTS", 0);
+ SetDword(hContact, "PictLastCheck", 0);
+ SetDword(hContact, "PictLoading", 0);
+ DBDeleteContactSetting(hContact, "CList", "StatusMsg" );
+ DBDeleteContactSetting(hContact, m_szModuleName, "YMsg" );
+ DBDeleteContactSetting(hContact, m_szModuleName, "YGMsg" );
+ //DBDeleteContactSetting(hContact, m_szModuleName, "MirVer" );
+ }
+
+ hContact = ( HANDLE )YAHOO_CallService( MS_DB_CONTACT_FINDNEXT,( WPARAM )hContact, 0 );
+ }
+}
+
+//=======================================================
+//Broadcast the user status
+//=======================================================
+void CYahooProto::BroadcastStatus(int s)
+{
+ int oldStatus = m_iStatus;
+ if (oldStatus == s)
+ return;
+
+ //m_iStatus = s;
+ switch (s) {
+ case ID_STATUS_OFFLINE:
+ case ID_STATUS_CONNECTING:
+ case ID_STATUS_ONLINE:
+ case ID_STATUS_AWAY:
+ case ID_STATUS_NA:
+ case ID_STATUS_OCCUPIED:
+ case ID_STATUS_ONTHEPHONE:
+ case ID_STATUS_OUTTOLUNCH:
+ case ID_STATUS_INVISIBLE:
+ m_iStatus = s;
+ break;
+ case ID_STATUS_DND:
+ m_iStatus = ID_STATUS_OCCUPIED;
+ break;
+ default:
+ m_iStatus = ID_STATUS_ONLINE;
+ }
+
+ DebugLog("[yahoo_util_broadcaststatus] Old Status: %s (%d), New Status: %s (%d)",
+ NEWSTR_ALLOCA((char *) CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, oldStatus, 0)), oldStatus,
+ NEWSTR_ALLOCA((char *) CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, m_iStatus, 0)), m_iStatus);
+ ProtoBroadcastAck(m_szModuleName, NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE) oldStatus, (LPARAM)m_iStatus);
+}
+
+//=======================================================
+//Contact deletion event
+//=======================================================
+INT_PTR __cdecl CYahooProto::OnContactDeleted( WPARAM wParam, LPARAM lParam )
+{
+ DBVARIANT dbv;
+ HANDLE hContact = (HANDLE) wParam;
+
+ DebugLog("[YahooContactDeleted]");
+
+ if ( !m_bLoggedIn ) {//should never happen for Yahoo contacts
+ DebugLog("[YahooContactDeleted] We are not Logged On!!!");
+ return 0;
+ }
+
+ // he is not a permanent contact!
+ if (DBGetContactSettingByte(hContact, "CList", "NotOnList", 0) != 0) {
+ DebugLog("[YahooContactDeleted] Not a permanent buddy!!!");
+ return 0;
+ }
+
+ if ( !DBGetContactSettingString(hContact, m_szModuleName, YAHOO_LOGINID, &dbv )){
+ DebugLog("[YahooContactDeleted] Removing %s", dbv.pszVal);
+ remove_buddy(dbv.pszVal, GetWord(hContact, "yprotoid", 0));
+
+ DBFreeVariant( &dbv );
+ } else {
+ DebugLog("[YahooContactDeleted] Can't retrieve contact Yahoo ID");
+ }
+ return 0;
+}
+
+//=======================================================
+//Custom status message windows handling
+//=======================================================
+static INT_PTR CALLBACK DlgProcSetCustStat(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ DBVARIANT dbv;
+
+ switch (msg) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault( hwndDlg );
+ {
+ CYahooProto* ppro = ( CYahooProto* )lParam;
+ SetWindowLongPtr( hwndDlg, GWLP_USERDATA, lParam );
+
+ SendMessage( hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)ppro->LoadIconEx( "yahoo", true ) );
+ SendMessage( hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)ppro->LoadIconEx( "yahoo" ) );
+
+ if ( !DBGetContactSettingString( NULL, ppro->m_szModuleName, YAHOO_CUSTSTATDB, &dbv )) {
+ SetDlgItemTextA( hwndDlg, IDC_CUSTSTAT, dbv. pszVal );
+
+ EnableWindow( GetDlgItem( hwndDlg, IDOK ), lstrlenA(dbv.pszVal) > 0 );
+ DBFreeVariant( &dbv );
+ }
+ else {
+ SetDlgItemTextA( hwndDlg, IDC_CUSTSTAT, "" );
+ EnableWindow( GetDlgItem( hwndDlg, IDOK ), FALSE );
+ }
+
+ CheckDlgButton( hwndDlg, IDC_CUSTSTATBUSY, ppro->GetByte( "BusyCustStat", 0 ));
+ }
+ return TRUE;
+
+ case WM_COMMAND:
+ switch(wParam) {
+ case IDOK:
+ {
+ char str[ 255 + 1 ];
+ CYahooProto* ppro = ( CYahooProto* )GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
+
+ /* Get String from dialog */
+ GetDlgItemTextA( hwndDlg, IDC_CUSTSTAT, str, sizeof( str ));
+
+ /* Save it for later use */
+ ppro->SetString( YAHOO_CUSTSTATDB, str );
+ ppro->SetByte("BusyCustStat", ( BYTE )IsDlgButtonChecked( hwndDlg, IDC_CUSTSTATBUSY ));
+
+ /* set for Idle/AA */
+ if (ppro->m_startMsg) mir_free(ppro->m_startMsg);
+ ppro->m_startMsg = mir_strdup(str);
+
+ /* notify Server about status change */
+ ppro->set_status(YAHOO_CUSTOM_STATUS, str, ( BYTE )IsDlgButtonChecked( hwndDlg, IDC_CUSTSTATBUSY ));
+
+ /* change local/miranda status */
+ ppro->BroadcastStatus(( BYTE )IsDlgButtonChecked( hwndDlg, IDC_CUSTSTATBUSY ) ? ID_STATUS_AWAY : ID_STATUS_ONLINE);
+ }
+ case IDCANCEL:
+ DestroyWindow( hwndDlg );
+ break;
+ }
+
+ if ( HIWORD( wParam ) == EN_CHANGE && ( HWND )lParam == GetFocus()) {
+ if (LOWORD( wParam ) == IDC_CUSTSTAT) {
+ char str[ 255 + 1 ];
+
+ BOOL toSet;
+
+ toSet = GetDlgItemTextA( hwndDlg, IDC_CUSTSTAT, str, sizeof( str )) != 0;
+
+ EnableWindow( GetDlgItem( hwndDlg, IDOK ), toSet );
+ }
+ }
+ break; /* case WM_COMMAND */
+
+ case WM_CLOSE:
+ DestroyWindow( hwndDlg );
+ break;
+
+ case WM_DESTROY:
+ {
+ CYahooProto* ppro = ( CYahooProto* )GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
+ ppro->ReleaseIconEx("yahoo", true);
+ ppro->ReleaseIconEx("yahoo");
+ }
+ break;
+ }
+ return FALSE;
+}
+
+INT_PTR __cdecl CYahooProto::SetCustomStatCommand( WPARAM wParam, LPARAM lParam )
+{
+ if ( !m_bLoggedIn ) {
+ ShowNotification(Translate("Yahoo Error"), Translate("You need to be connected to set the custom message"), NIIF_ERROR);
+ return 0;
+ }
+
+ HWND hwndSetCustomStatus = CreateDialogParam(hInstance, MAKEINTRESOURCE( IDD_SETCUSTSTAT ), NULL, DlgProcSetCustStat, ( LPARAM )this );
+ SetForegroundWindow( hwndSetCustomStatus );
+ SetFocus( hwndSetCustomStatus );
+ ShowWindow( hwndSetCustomStatus, SW_SHOW );
+ return 0;
+}
+
+//=======================================================
+//Open URL
+//=======================================================
+void CYahooProto::OpenURL(const char *url, int autoLogin)
+{
+ char tUrl[ 4096 ];
+
+ DebugLog("[YahooOpenURL] url: %s Auto Login: %d", url, autoLogin);
+
+ if (autoLogin && GetByte( "MailAutoLogin", 0 ) && m_bLoggedIn && m_id > 0) {
+ char *y, *t, *u;
+
+ y = yahoo_urlencode(yahoo_get_cookie(m_id, "y"));
+ t = yahoo_urlencode(yahoo_get_cookie(m_id, "t"));
+ u = yahoo_urlencode(url);
+ _snprintf( tUrl, sizeof( tUrl ),
+ "http://msg.edit.yahoo.com/config/reset_cookies?&.y=Y=%s&.t=T=%s&.ver=2&.done=http%%3a//us.rd.yahoo.com/messenger/client/%%3f%s",
+ y, t, u);
+
+ FREE(y);
+ FREE(t);
+ FREE(u);
+ } else {
+ _snprintf( tUrl, sizeof( tUrl ), url );
+ }
+
+ DebugLog("[YahooOpenURL] url: %s Final URL: %s", url, tUrl);
+
+ CallService( MS_UTILS_OPENURL, TRUE, ( LPARAM )tUrl );
+}
+
+//=======================================================
+//Show buddy profile
+//=======================================================
+INT_PTR __cdecl CYahooProto::OnShowProfileCommand( WPARAM wParam, LPARAM lParam )
+{
+ char tUrl[ 4096 ];
+ DBVARIANT dbv;
+
+ /**
+ * We don't show profile for users using other IM clients through the IM server bridge
+ */
+ if (GetWord(( HANDLE )wParam, "yprotoid", 0) != 0) {
+ return 0;
+ }
+
+ if ( DBGetContactSettingString(( HANDLE )wParam, m_szModuleName, YAHOO_LOGINID, &dbv ))
+ return 0;
+
+ _snprintf( tUrl, sizeof( tUrl ), "http://profiles.yahoo.com/%s", dbv.pszVal );
+ DBFreeVariant( &dbv );
+
+ OpenURL(tUrl, 0);
+ return 0;
+}
+
+INT_PTR __cdecl CYahooProto::OnEditMyProfile( WPARAM wParam, LPARAM lParam )
+{
+ OpenURL("http://edit.yahoo.com/config/eval_profile", 1);
+ return 0;
+}
+
+//=======================================================
+//Show My profile
+//=======================================================
+INT_PTR __cdecl CYahooProto::OnShowMyProfileCommand( WPARAM wParam, LPARAM lParam )
+{
+ DBVARIANT dbv;
+
+ if ( GetString( YAHOO_LOGINID, &dbv ) != 0) {
+ ShowError(Translate("Yahoo Error"), Translate("Please enter your yahoo id in Options/Network/Yahoo"));
+ return 0;
+ }
+
+ char tUrl[ 4096 ];
+ _snprintf( tUrl, sizeof( tUrl ), "http://profiles.yahoo.com/%s", dbv.pszVal );
+ DBFreeVariant( &dbv );
+
+ OpenURL(tUrl, 0);
+ return 0;
+}
+
+//=======================================================
+//Show Goto mailbox
+//=======================================================
+INT_PTR __cdecl CYahooProto::OnGotoMailboxCommand( WPARAM wParam, LPARAM lParam )
+{
+ if (GetByte( "YahooJapan", 0 ))
+ OpenURL("http://mail.yahoo.co.jp/", 1);
+ else
+ OpenURL("http://mail.yahoo.com/", 1);
+
+ return 0;
+}
+
+INT_PTR __cdecl CYahooProto::OnABCommand( WPARAM wParam, LPARAM lParam )
+{
+ OpenURL("http://address.yahoo.com/yab/", 1);
+ return 0;
+}
+
+INT_PTR __cdecl CYahooProto::OnCalendarCommand( WPARAM wParam, LPARAM lParam )
+{
+ OpenURL("http://calendar.yahoo.com/", 1);
+ return 0;
+}
+
+//=======================================================
+//Refresh Yahoo
+//=======================================================
+INT_PTR __cdecl CYahooProto::OnRefreshCommand( WPARAM wParam, LPARAM lParam )
+{
+ if ( !m_bLoggedIn ){
+ ShowNotification(Translate("Yahoo Error"), Translate("You need to be connected to refresh your buddy list"), NIIF_ERROR);
+ return 0;
+ }
+
+ yahoo_refresh(m_id);
+ return 0;
+}
+
+INT_PTR __cdecl CYahooProto::OnIdleEvent(WPARAM wParam, LPARAM lParam)
+{
+ BOOL bIdle = (lParam & IDF_ISIDLE);
+
+ DebugLog("[YAHOO_IDLE_EVENT] Idle: %s", bIdle ?"Yes":"No");
+
+ if ( lParam & IDF_PRIVACY )
+ return 0; /* we support Privacy settings */
+
+ if (m_bLoggedIn) {
+ /* set me to idle or back */
+ if (m_iStatus == ID_STATUS_INVISIBLE)
+ DebugLog("[YAHOO_IDLE_EVENT] WARNING: INVISIBLE! Don't change my status!");
+ else
+ set_status(m_iStatus,m_startMsg,(bIdle) ? 2 : (m_iStatus == ID_STATUS_ONLINE) ? 0 : 1);
+ } else {
+ DebugLog("[YAHOO_IDLE_EVENT] WARNING: NOT LOGGED IN???");
+ }
+
+ return 0;
+}
+
+INT_PTR __cdecl CYahooProto::GetUnreadEmailCount(WPARAM wParam, LPARAM lParam)
+{
+ if ( !m_bLoggedIn )
+ return 0;
+
+ return m_unreadMessages;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
+void CYahooProto::MenuMainInit( void )
+{
+ char servicefunction[ 100 ];
+ lstrcpyA( servicefunction, m_szModuleName );
+ char* tDest = servicefunction + lstrlenA( servicefunction );
+
+ CLISTMENUITEM mi = { 0 };
+ mi.cbSize = sizeof( mi );
+ mi.pszService = servicefunction;
+
+ HGENMENU hRoot = MO_GetProtoRootMenu( m_szModuleName );
+ if ( hRoot == NULL ) {
+ mi.position = 500015000;
+ mi.hParentMenu = HGENMENU_ROOT;
+ mi.flags = CMIF_ICONFROMICOLIB | CMIF_ROOTPOPUP | CMIF_TCHAR | CMIF_KEEPUNTRANSLATED;
+ mi.icolibItem = GetIconHandle( IDI_YAHOO );
+ mi.ptszName = m_tszUserName;
+ hRoot = mainMenuRoot = ( HGENMENU )YAHOO_CallService( MS_CLIST_ADDPROTOMENUITEM, (WPARAM)0, (LPARAM)&mi);
+ }
+ else {
+ if ( mainMenuRoot )
+ YAHOO_CallService( MS_CLIST_REMOVEMAINMENUITEM, ( WPARAM )mainMenuRoot, 0 );
+ mainMenuRoot = NULL;
+ }
+
+ mi.flags = CMIF_ICONFROMICOLIB | CMIF_CHILDPOPUP;
+ mi.hParentMenu = hRoot;
+
+ // Show custom status menu
+ lstrcpyA( tDest, YAHOO_SET_CUST_STAT );
+ YCreateService( YAHOO_SET_CUST_STAT, &CYahooProto::SetCustomStatCommand );
+
+ mi.position = 290000;
+ mi.icolibItem = GetIconHandle( IDI_SET_STATUS );
+ mi.pszName = LPGEN( "Set &Custom Status" );
+
+ menuItemsAll[0] = ( HGENMENU )YAHOO_CallService( MS_CLIST_ADDPROTOMENUITEM, 0, (LPARAM)&mi );
+
+ // Edit My profile
+ lstrcpyA( tDest, YAHOO_EDIT_MY_PROFILE );
+ YCreateService( YAHOO_EDIT_MY_PROFILE, &CYahooProto::OnEditMyProfile );
+
+ mi.position = 290005;
+ mi.icolibItem = GetIconHandle( IDI_PROFILE );
+ mi.pszName = LPGEN( "&Edit My Profile" );
+ menuItemsAll[1] = ( HGENMENU )YAHOO_CallService( MS_CLIST_ADDPROTOMENUITEM, 0, ( LPARAM )&mi );
+
+ // Show My profile
+ lstrcpyA( tDest, YAHOO_SHOW_MY_PROFILE );
+ YCreateService( YAHOO_SHOW_MY_PROFILE, &CYahooProto::OnShowMyProfileCommand );
+
+ mi.position = 290006;
+ mi.icolibItem = GetIconHandle( IDI_PROFILE );
+ mi.pszName = LPGEN( "&My Profile" );
+ menuItemsAll[2] = ( HGENMENU ) YAHOO_CallService( MS_CLIST_ADDPROTOMENUITEM, 0, ( LPARAM )&mi );
+
+ // Show Yahoo mail
+ strcpy( tDest, YAHOO_YAHOO_MAIL );
+ YCreateService( YAHOO_YAHOO_MAIL, &CYahooProto::OnGotoMailboxCommand );
+
+ mi.position = 290010;
+ mi.icolibItem = GetIconHandle( IDI_INBOX );
+ mi.pszName = LPGEN( "&Yahoo Mail" );
+ menuItemsAll[3] = ( HGENMENU )YAHOO_CallService( MS_CLIST_ADDPROTOMENUITEM, 0, ( LPARAM )&mi );
+
+ // Show Address Book
+ strcpy( tDest, YAHOO_AB );
+ YCreateService( YAHOO_AB, &CYahooProto::OnABCommand );
+
+ mi.position = 290015;
+ mi.icolibItem = GetIconHandle( IDI_YAB );
+ mi.pszName = LPGEN( "&Address Book" );
+ menuItemsAll[4] = ( HGENMENU )YAHOO_CallService( MS_CLIST_ADDPROTOMENUITEM, 0, ( LPARAM )&mi );
+
+ // Show Calendar
+ strcpy( tDest, YAHOO_CALENDAR );
+ YCreateService( YAHOO_CALENDAR, &CYahooProto::OnCalendarCommand );
+
+ mi.position = 290017;
+ mi.icolibItem = GetIconHandle( IDI_CALENDAR );
+ mi.pszName = LPGEN( "&Calendar" );
+ menuItemsAll[5] = ( HGENMENU )YAHOO_CallService( MS_CLIST_ADDPROTOMENUITEM, 0, ( LPARAM )&mi );
+
+ // Show Refresh
+ /*strcpy( tDest, YAHOO_REFRESH );
+ YCreateService( YAHOO_REFRESH, &CYahooProto::OnRefreshCommand );
+
+ mi.position = 500090015;
+ mi.icolibItem = GetIconHandle( IDI_REFRESH );
+ mi.pszName = LPGEN( "&Refresh" );
+ menuItemsAll[6] = ( HGENMENU )YAHOO_CallService( MS_CLIST_ADDPROTOMENUITEM, 0, ( LPARAM )&mi );
+ */
+}
+
+void CYahooProto::MenuContactInit( void )
+{
+ char servicefunction[ 100 ];
+ lstrcpyA( servicefunction, m_szModuleName );
+ char* tDest = servicefunction + lstrlenA( servicefunction );
+
+ CLISTMENUITEM mi = { 0 };
+ mi.cbSize = sizeof( mi );
+ mi.flags = CMIF_ICONFROMICOLIB;
+ mi.pszService = servicefunction;
+ mi.pszContactOwner = m_szModuleName;
+
+ // Show Profile
+ strcpy( tDest, YAHOO_SHOW_PROFILE );
+ YCreateService( YAHOO_SHOW_PROFILE, &CYahooProto::OnShowProfileCommand );
+
+ mi.position = -2000006000;
+ mi.icolibItem = GetIconHandle( IDI_PROFILE );
+ mi.pszName = LPGEN( "&Show Profile" );
+ hShowProfileMenuItem = ( HGENMENU )YAHOO_CallService( MS_CLIST_ADDCONTACTMENUITEM, 0, ( LPARAM )&mi );
+
+}
+
+void CYahooProto::MenuUninit( void )
+{
+ if ( mainMenuRoot )
+ YAHOO_CallService( MS_CLIST_REMOVEMAINMENUITEM, ( WPARAM )mainMenuRoot, 0 );
+
+ YAHOO_CallService( MS_CLIST_REMOVECONTACTMENUITEM, ( WPARAM )hShowProfileMenuItem, 0 );
+}
+
+INT_PTR __cdecl CYahooProto::OnPrebuildContactMenu(WPARAM wParam, LPARAM)
+{
+ const HANDLE hContact = (HANDLE)wParam;
+ char *szProto;
+
+ CLISTMENUITEM mi = {0};
+ mi.cbSize = sizeof(mi);
+
+ szProto = ( char* )YAHOO_CallService( MS_PROTO_GETCONTACTBASEPROTO, (WPARAM) hContact, 0 );
+ if ( szProto == NULL || lstrcmpA( szProto, m_szModuleName )) {
+ DebugLog("[OnPrebuildContactMenu] Not a Yahoo Contact!!!");
+ return 0;
+ }
+
+ mi.flags = CMIM_FLAGS;
+
+ if (GetWord( hContact, "yprotoid", 0) != 0)
+ mi.flags |= CMIF_HIDDEN;
+
+ YAHOO_CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hShowProfileMenuItem, (LPARAM)&mi);
+
+ return 0;
+}
+
+
+//=======================================================================================
+// Load the yahoo service/plugin
+//=======================================================================================
+void CYahooProto::LoadYahooServices( void )
+{
+ char path[MAX_PATH];
+
+ //----| Events hooking |--------------------------------------------------------------
+ YHookEvent( ME_OPT_INITIALISE, &CYahooProto::OnOptionsInit );
+
+ //----| Create nudge event |----------------------------------------------------------
+ mir_snprintf( path, sizeof( path ), "%s/Nudge", m_szModuleName);
+ hYahooNudge = CreateHookableEvent( path );
+
+ //----| Service creation |------------------------------------------------------------
+ YCreateService( PS_CREATEACCMGRUI, &CYahooProto::SvcCreateAccMgrUI);
+
+ YCreateService( PS_GETAVATARINFOT, &CYahooProto::GetAvatarInfo );
+ YCreateService( PS_GETMYAVATART, &CYahooProto::GetMyAvatar );
+ YCreateService( PS_SETMYAVATART, &CYahooProto::SetMyAvatar );
+ YCreateService( PS_GETAVATARCAPS, &CYahooProto::GetAvatarCaps );
+
+ YCreateService( PS_GETMYAWAYMSG, &CYahooProto::GetMyAwayMsg);
+ YCreateService( YAHOO_SEND_NUDGE, &CYahooProto::SendNudge );
+
+ YCreateService( YAHOO_GETUNREAD_EMAILCOUNT, &CYahooProto::GetUnreadEmailCount);
+
+ //----| Set resident variables |------------------------------------------------------
+
+ mir_snprintf( path, sizeof( path ), "%s/Status", m_szModuleName );
+ CallService( MS_DB_SETSETTINGRESIDENT, TRUE, ( LPARAM )path );
+
+ mir_snprintf( path, sizeof( path ), "%s/YStatus", m_szModuleName );
+ CallService( MS_DB_SETSETTINGRESIDENT, TRUE, ( LPARAM )path );
+
+ mir_snprintf( path, sizeof( path ), "%s/YAway", m_szModuleName );
+ CallService( MS_DB_SETSETTINGRESIDENT, TRUE, ( LPARAM )path );
+
+ mir_snprintf( path, sizeof( path ), "%s/Mobile", m_szModuleName );
+ CallService( MS_DB_SETSETTINGRESIDENT, TRUE, ( LPARAM )path );
+
+ mir_snprintf( path, sizeof( path ), "%s/YGMsg", m_szModuleName );
+ CallService( MS_DB_SETSETTINGRESIDENT, TRUE, ( LPARAM )path );
+
+ mir_snprintf( path, sizeof( path ), "%s/IdleTS", m_szModuleName );
+ CallService( MS_DB_SETSETTINGRESIDENT, TRUE, ( LPARAM )path );
+
+ mir_snprintf( path, sizeof( path ), "%s/PictLastCheck", m_szModuleName );
+ CallService( MS_DB_SETSETTINGRESIDENT, TRUE, ( LPARAM )path );
+
+ mir_snprintf( path, sizeof( path ), "%s/PictLoading", m_szModuleName );
+ CallService( MS_DB_SETSETTINGRESIDENT, TRUE, ( LPARAM )path );
+}
diff --git a/protocols/Yahoo/user_info.cpp b/protocols/Yahoo/user_info.cpp
new file mode 100644
index 0000000000..b82d26a495
--- /dev/null
+++ b/protocols/Yahoo/user_info.cpp
@@ -0,0 +1,141 @@
+/*
+ * $Id: proto.cpp 9802 2009-05-18 03:03:48Z gena01 $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+
+#include "yahoo.h"
+
+#include <m_options.h>
+#include <m_skin.h>
+#include <m_userinfo.h>
+
+#include "resource.h"
+
+#include <commctrl.h>
+
+static INT_PTR CALLBACK YahooUserInfoDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam )
+{
+ switch ( msg ) {
+ case WM_INITDIALOG:
+ // lParam is hContact
+ TranslateDialogDefault( hwndDlg );
+
+ //SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadSkinnedIcon(SKINICON_OTHER_USERDETAILS));
+
+
+ break;
+
+ case WM_NOTIFY:
+ if (( ( LPNMHDR )lParam )->idFrom == 0 ) {
+ switch (( ( LPNMHDR )lParam )->code ) {
+ case PSN_PARAMCHANGED:
+ SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (( PSHNOTIFY* )lParam )->lParam );
+ break;
+ case PSN_INFOCHANGED:
+ {
+ CYahooProto* ppro = (CYahooProto*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+
+ if (!ppro)
+ break;
+
+ char* szProto;
+ HANDLE hContact = (HANDLE)((LPPSHNOTIFY)lParam)->lParam;
+
+ if (hContact == NULL) {
+ szProto = ppro->m_szModuleName;
+ } else {
+ szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ }
+
+ if (!szProto)
+ break;
+
+ if (hContact) {
+ DBVARIANT dbv;
+ char z[128];
+
+ if (ppro->GetString( hContact, YAHOO_LOGINID, &dbv ) == 0) {
+ strcpy(z, dbv.pszVal);
+ DBFreeVariant( &dbv );
+ } else {
+ strcpy(z, "???");
+ }
+
+ SetDlgItemTextA(hwndDlg, IDC_SEARCH_ID, z);
+
+ if (ppro->GetString( hContact, "Transport", &dbv ) == 0) {
+ strcpy(z, dbv.pszVal);
+ DBFreeVariant( &dbv );
+ } else {
+ strcpy(z, "Yahoo");
+ }
+
+ SetDlgItemTextA(hwndDlg, IDC_SEARCH_PROTOCOL, z);
+
+ if (ppro->GetString( hContact, "MirVer", &dbv ) == 0) {
+ strcpy(z, dbv.pszVal);
+ DBFreeVariant( &dbv );
+ } else {
+ strcpy(z, "???");
+ }
+
+ SetDlgItemTextA(hwndDlg, IDC_NFO_CLIENT, z);
+
+ } else {
+ }
+ }
+ break;
+ }
+ }
+ break;
+
+ case WM_CLOSE:
+ DestroyWindow(hwndDlg);
+ break;
+
+ case WM_DESTROY:
+
+ break;
+ }
+ return FALSE;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// OnInfoInit - initializes user info option dialogs
+
+INT_PTR __cdecl CYahooProto::OnUserInfoInit( WPARAM wParam, LPARAM lParam )
+{
+ //if ( !JCallService( MS_PROTO_ISPROTOCOLLOADED, 0, ( LPARAM )m_szModuleName ))
+ // return 0;
+
+ OPTIONSDIALOGPAGE odp = {0};
+ odp.cbSize = sizeof( odp );
+ odp.hInstance = hInstance;
+ odp.dwInitParam = ( LPARAM )this;
+
+ HANDLE hContact = ( HANDLE )lParam;
+ if ( hContact )
+ {
+ char* szProto = ( char* )CallService( MS_PROTO_GETCONTACTBASEPROTO, ( WPARAM ) hContact, 0 );
+ if ( szProto != NULL && !strcmp( szProto, m_szModuleName ))
+ {
+ odp.pfnDlgProc = YahooUserInfoDlgProc;
+ odp.position = -1900000000;
+ odp.pszTemplate = MAKEINTRESOURCEA( IDD_USER_INFO );
+ odp.pszTitle = m_szModuleName;
+ CallService( MS_USERINFO_ADDPAGE, wParam, ( LPARAM )&odp );
+
+ }
+ }
+
+ return 0;
+}
+
diff --git a/protocols/Yahoo/util.cpp b/protocols/Yahoo/util.cpp
new file mode 100644
index 0000000000..08844f22f8
--- /dev/null
+++ b/protocols/Yahoo/util.cpp
@@ -0,0 +1,370 @@
+/*
+ * $Id: util.cpp 13557 2011-04-09 02:26:58Z borkra $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+#include "yahoo.h"
+#include <windowsx.h>
+#include <m_popup.h>
+#include <m_protomod.h>
+#include <m_protosvc.h>
+#include <m_langpack.h>
+#include <m_skin.h>
+#include <m_utils.h>
+#include <m_options.h>
+
+#include "resource.h"
+
+void CYahooProto::YCreateService( const char* szService, YServiceFunc serviceProc )
+{
+ char str[ 255 ];
+ unsigned int len;
+
+ len = snprintf(str, sizeof(str), "%s%s", m_szModuleName, szService);
+
+ if (len >= sizeof(str) ) {
+ DebugLog("[YCreateService] Failed Registering Service: %s. Reason: buffer too small?", szService);
+ return;
+ }
+
+ ::CreateServiceFunctionObj( str, ( MIRANDASERVICEOBJ )*( void** )&serviceProc, this );
+}
+
+void CYahooProto::YForkThread( YThreadFunc pFunc, void *param )
+{
+ UINT lthreadID;
+
+ CloseHandle(( HANDLE )::mir_forkthreadowner(( pThreadFuncOwner ) *( void** )&pFunc, this, param, &lthreadID));
+}
+
+void CYahooProto::YHookEvent( const char* szEvent, YEventFunc handler )
+{
+ ::HookEventObj( szEvent, ( MIRANDAHOOKOBJ )*( void** )&handler, this );
+}
+
+INT_PTR __stdcall YAHOO_CallService( const char* szSvcName, WPARAM wParam, LPARAM lParam )
+{
+ return CallService( szSvcName, wParam, lParam );
+}
+
+int CYahooProto::DebugLog( const char *fmt, ... )
+{
+ char str[ 4096 ];
+ va_list vararg;
+ va_start( vararg, fmt );
+
+ int tBytes = _vsnprintf( str, sizeof( str ), fmt, vararg );
+ if ( tBytes > 0 )
+ str[ tBytes ] = 0;
+
+ va_end( vararg );
+
+ return CallService( MS_NETLIB_LOG, ( WPARAM )m_hNetlibUser, ( LPARAM )str );
+}
+
+extern HANDLE g_hNetlibUser;
+
+int DebugLog( const char *fmt, ... )
+{
+ char str[ 4096 ];
+ va_list vararg;
+ va_start( vararg, fmt );
+
+ int tBytes = _vsnprintf( str, sizeof( str ), fmt, vararg );
+ if ( tBytes > 0 )
+ str[ tBytes ] = 0;
+
+ va_end( vararg );
+
+ return CallService( MS_NETLIB_LOG, ( WPARAM )g_hNetlibUser, ( LPARAM )str );
+}
+
+int CYahooProto::GetByte( const char* valueName, int parDefltValue )
+{
+ return DBGetContactSettingByte( NULL, m_szModuleName, valueName, parDefltValue );
+}
+
+int CYahooProto::SetByte( const char* valueName, int parValue )
+{
+ return DBWriteContactSettingByte( NULL, m_szModuleName, valueName, parValue );
+}
+
+int CYahooProto::GetByte( HANDLE hContact, const char* valueName, int parDefltValue )
+{
+ return DBGetContactSettingByte( hContact, m_szModuleName, valueName, parDefltValue );
+}
+
+int CYahooProto::SetByte( HANDLE hContact, const char* valueName, int parValue )
+{
+ return DBWriteContactSettingByte( hContact, m_szModuleName, valueName, parValue );
+}
+
+
+DWORD CYahooProto::GetDword( HANDLE hContact, const char* valueName, DWORD parDefltValue )
+{
+ return DBGetContactSettingDword( hContact, m_szModuleName, valueName, parDefltValue );
+}
+
+DWORD CYahooProto::SetDword( const char* valueName, DWORD parValue )
+{
+ return DBWriteContactSettingDword( NULL, m_szModuleName, valueName, parValue);
+}
+
+DWORD CYahooProto::GetDword( const char* valueName, DWORD parDefltValue )
+{
+ return DBGetContactSettingDword( NULL, m_szModuleName, valueName, parDefltValue );
+}
+
+DWORD CYahooProto::SetDword( HANDLE hContact, const char* valueName, DWORD parValue )
+{
+ return DBWriteContactSettingDword( hContact, m_szModuleName, valueName, parValue);
+}
+
+
+WORD CYahooProto::SetWord( HANDLE hContact, const char* valueName, int parValue )
+{
+ return DBWriteContactSettingWord( hContact, m_szModuleName, valueName, parValue );
+}
+
+WORD CYahooProto::GetWord( HANDLE hContact, const char* valueName, int parDefltValue )
+{
+ return DBGetContactSettingWord( hContact, m_szModuleName, valueName, parDefltValue );
+}
+
+DWORD CYahooProto::Set_Protocol( HANDLE hContact, int protocol )
+{
+ char *s=NULL;
+
+ SetWord(hContact, "yprotoid", protocol);
+
+ switch (protocol) {
+ case YAHOO_IM_YAHOO: s = "Yahoo"; break; /* Yahoo, nothing special here */
+ case YAHOO_IM_MSN: s = "Windows Live (MSN)"; break;
+ case YAHOO_IM_LCS: s = "LCS"; break;
+ case YAHOO_IM_SAMETIME: s = "Lotus Sametime"; break;
+ }
+
+ if (protocol != YAHOO_IM_YAHOO)
+ SetString(hContact, "MirVer", s);
+
+ SetString(hContact, "Transport", s);
+ return 0;
+}
+
+int CYahooProto::SendBroadcast( HANDLE hContact, int type, int result, HANDLE hProcess, LPARAM lParam )
+{
+ ACKDATA ack;
+
+ ZeroMemory(&ack, sizeof(ack) );
+
+ ack.cbSize = sizeof( ACKDATA );
+ ack.szModule = m_szModuleName;
+ ack.hContact = hContact;
+ ack.type = type;
+ ack.result = result;
+ ack.hProcess = hProcess;
+ ack.lParam = lParam;
+ return YAHOO_CallService( MS_PROTO_BROADCASTACK, 0, ( LPARAM )&ack );
+}
+
+int CYahooProto::GetString( const char* name, DBVARIANT* result )
+{ return DBGetContactSettingString( NULL, m_szModuleName, name, result );
+}
+
+int CYahooProto::GetString( HANDLE hContact, const char* name, DBVARIANT* result )
+{ return DBGetContactSettingString( hContact, m_szModuleName, name, result );
+}
+
+void CYahooProto::SetString( const char* name, const char* value )
+{ DBWriteContactSettingString(NULL, m_szModuleName, name, value );
+}
+
+void CYahooProto::SetString( HANDLE hContact, const char* name, const char* value )
+{ DBWriteContactSettingString(hContact, m_szModuleName, name, value );
+}
+
+void CYahooProto::SetStringT( HANDLE hContact, const char* name, const TCHAR* value )
+{ DBWriteContactSettingTString(hContact, m_szModuleName, name, value );
+}
+
+DWORD CYahooProto::SetStringUtf( HANDLE hContact, const char* valueName, const char* parValue )
+{
+ return DBWriteContactSettingStringUtf( hContact, m_szModuleName, valueName, parValue );
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// Popups
+
+static int CALLBACK PopupWindowProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
+{
+ switch( message ) {
+ case WM_COMMAND:
+ DebugLog("[PopupWindowProc] WM_COMMAND");
+ if ( HIWORD( wParam ) == STN_CLICKED) {
+ char *szURL = (char *)PUGetPluginData( hWnd );
+ if ( szURL != NULL )
+ CallService( MS_UTILS_OPENURL, TRUE, ( LPARAM )szURL );
+
+ PUDeletePopUp( hWnd );
+ return 0;
+ }
+ break;
+
+ case WM_CONTEXTMENU:
+ DebugLog("[PopupWindowProc] WM_CONTEXTMENU");
+ PUDeletePopUp( hWnd );
+ return TRUE;
+
+ case UM_FREEPLUGINDATA:
+ DebugLog("[PopupWindowProc] UM_FREEPLUGINDATA");
+ {
+ char *szURL = (char *)PUGetPluginData( hWnd );
+ if ( szURL != NULL )
+ free(szURL);
+ }
+
+ return TRUE;
+ }
+
+ return DefWindowProc(hWnd, message, wParam, lParam);
+}
+
+int CYahooProto::ShowPopup( const char* nickname, const char* msg, const char *szURL )
+{
+ POPUPDATAEX ppd;
+
+ if ( !ServiceExists( MS_POPUP_ADDPOPUPEX ))
+ return 0;
+
+ ZeroMemory(&ppd, sizeof(ppd) );
+ lstrcpyA( ppd.lpzContactName, nickname );
+ lstrcpyA( ppd.lpzText, msg );
+
+ ppd.PluginWindowProc = ( WNDPROC )PopupWindowProc;
+
+ if (szURL != NULL) {
+ if (lstrcmpiA(szURL, "http://mail.yahoo.com") == 0) {
+ ppd.lchIcon = LoadIconEx( "mail" );
+ } else {
+ ppd.lchIcon = LoadIconEx( "calendar" );
+ }
+
+ ppd.PluginData = (void *) strdup( szURL );
+ } else {
+ ppd.lchIcon = LoadIconEx( "yahoo" );
+ }
+
+ DebugLog("[MS_POPUP_ADDPOPUPEX] Generating a popup for [%s] %s", nickname, msg);
+
+ YAHOO_CallService( MS_POPUP_ADDPOPUPEX, (WPARAM)&ppd, 0 );
+
+ return 1;
+}
+
+int CYahooProto::ShowNotification(const char *title, const char *info, DWORD flags)
+{
+ if (ServiceExists(MS_CLIST_SYSTRAY_NOTIFY)) {
+ MIRANDASYSTRAYNOTIFY err;
+ int ret;
+
+ err.szProto = m_szModuleName;
+ err.cbSize = sizeof(err);
+ err.szInfoTitle = (char *)title;
+ err.szInfo = (char *)info;
+ err.dwInfoFlags = flags;
+ err.uTimeout = 1000 * 3;
+ ret = CallService(MS_CLIST_SYSTRAY_NOTIFY, 0, (LPARAM) & err);
+
+ if (ret == 0)
+ return 1;
+ }
+
+ MessageBoxA(NULL, info, title, MB_OK | MB_ICONINFORMATION);
+ return 0;
+}
+
+void CYahooProto::ShowError(const char *title, const char *buff)
+{
+ if (GetByte( "ShowErrors", 1 ))
+ if (!ShowPopup(title, buff, NULL))
+ ShowNotification(title, buff, NIIF_ERROR);
+}
+
+INT_PTR __cdecl CYahooProto::OnSettingChanged(WPARAM wParam, LPARAM lParam)
+{
+ DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING *) lParam;
+
+ if ((HANDLE) wParam == NULL)
+ return 0;
+ if (!m_bLoggedIn)
+ return 0;
+
+ if (!strcmp(cws->szModule, "CList")) {
+ // A temporary contact has been added permanently
+ if (!strcmp(cws->szSetting, "NotOnList")) {
+ if (DBGetContactSettingByte((HANDLE) wParam, "CList", "Hidden", 0))
+ return 0;
+ if (cws->value.type == DBVT_DELETED || (cws->value.type == DBVT_BYTE && cws->value.bVal == 0)) {
+ DBVARIANT dbv;
+
+ if ( !DBGetContactSettingString( (HANDLE) wParam, m_szModuleName, YAHOO_LOGINID, &dbv )){
+ DebugLog("Adding Permanently %s to list.", dbv.pszVal);
+ AddBuddy(dbv.pszVal,GetWord((HANDLE) wParam, "yprotoid", 0), "miranda", NULL);
+ DBFreeVariant(&dbv);
+ }
+ }
+ }
+ }else if (!strcmp(cws->szModule, m_szModuleName) && !strcmp(cws->szSetting, "ApparentMode")) {
+ DBVARIANT dbv;
+
+ DebugLog("DB Setting changed. YAHOO user's visible setting changed.");
+
+ if ( !DBGetContactSettingString( (HANDLE) wParam, m_szModuleName, YAHOO_LOGINID, &dbv )){
+ int iAdd = (ID_STATUS_OFFLINE == DBGetContactSettingWord((HANDLE) wParam, m_szModuleName, "ApparentMode", 0));
+ stealth(dbv.pszVal, iAdd);
+ DBFreeVariant(&dbv);
+ }
+ }
+ return 0;
+}
+
+char* YAHOO_GetContactName( HANDLE hContact )
+{
+ return ( char* )YAHOO_CallService( MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM) hContact, 0 );
+}
+
+extern PLUGININFOEX pluginInfo;
+
+/*
+ * Thanks Robert for the following function. Copied from AIM plugin.
+ */
+void CYahooProto::YAHOO_utils_logversion()
+{
+ char str[256];
+
+#ifdef YAHOO_CVSBUILD
+ _snprintf(str, sizeof(str), "Yahoo v%d.%d.%d.%da (%s %s)", (pluginInfo.version >> 24) & 0xFF, (pluginInfo.version >> 16) & 0xFF,
+ (pluginInfo.version >> 8) & 0xFF, pluginInfo.version & 0xFF, __DATE__, __TIME__);
+#else
+ _snprintf(str, sizeof(str), "Yahoo v%d.%d.%d.%d", (pluginInfo.version >> 24) & 0xFF, (pluginInfo.version >> 16) & 0xFF,
+ (pluginInfo.version >> 8) & 0xFF, pluginInfo.version & 0xFF);
+#endif
+ DebugLog(str);
+#ifdef YAHOO_CVSBUILD
+ DebugLog("You are using a development version of Yahoo. Please make sure you are using the latest version before posting bug reports.");
+#endif
+}
+
+void SetButtonCheck(HWND hwndDlg, int CtrlID, BOOL bCheck)
+{
+ HWND hwndCtrl = GetDlgItem(hwndDlg, CtrlID);
+
+ Button_SetCheck(hwndCtrl, (bCheck)?BST_CHECKED:BST_UNCHECKED);
+}
diff --git a/protocols/Yahoo/version.h b/protocols/Yahoo/version.h
new file mode 100644
index 0000000000..f00f94bb7e
--- /dev/null
+++ b/protocols/Yahoo/version.h
@@ -0,0 +1,5 @@
+#include "../../include/m_version.h"
+
+#define __FILEVERSION_STRING MIRANDA_VERSION_FILEVERSION
+#define __VERSION_STRING MIRANDA_VERSION_STRING
+#define __VERSION_DWORD MIRANDA_VERSION_DWORD
diff --git a/protocols/Yahoo/version.rc b/protocols/Yahoo/version.rc
new file mode 100644
index 0000000000..88ea147f4f
--- /dev/null
+++ b/protocols/Yahoo/version.rc
@@ -0,0 +1,36 @@
+
+#include <windows.h>
+#include "version.h"
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION __FILEVERSION_STRING
+ PRODUCTVERSION __FILEVERSION_STRING
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "000004b0"
+ BEGIN
+ VALUE "CompanyName", "Gennady Feldman"
+ VALUE "FileDescription", "Miranda Yahoo plugin"
+ VALUE "FileVersion", __VERSION_STRING
+ VALUE "InternalName", "yahoo"
+ VALUE "LegalCopyright", "Copyright (C) 2003-2006 Gennady Feldman"
+ VALUE "OriginalFilename", "yahoo.dll"
+ VALUE "ProductName", "Miranda"
+ VALUE "ProductVersion", __VERSION_STRING
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0, 1200
+ END
+END
diff --git a/protocols/Yahoo/webcam.cpp b/protocols/Yahoo/webcam.cpp
new file mode 100644
index 0000000000..ce8759ba67
--- /dev/null
+++ b/protocols/Yahoo/webcam.cpp
@@ -0,0 +1,59 @@
+/*
+ * $Id: webcam.cpp 9228 2009-03-26 13:47:12Z ghazan $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+#include <time.h>
+#include <sys/stat.h>
+#include <malloc.h>
+#include <io.h>
+
+/*
+ * Miranda headers
+ */
+#include "yahoo.h"
+#include <m_protosvc.h>
+#include <m_langpack.h>
+#include <m_message.h>
+
+/* WEBCAM callbacks */
+void ext_yahoo_got_webcam_image(int id, const char *who,
+ const unsigned char *image, unsigned int image_size, unsigned int real_size,
+ unsigned int timestamp)
+{
+ LOG(("ext_yahoo_got_webcam_image"));
+}
+
+void ext_yahoo_webcam_viewer(int id, const char *who, int connect)
+{
+ LOG(("ext_yahoo_webcam_viewer"));
+}
+
+void ext_yahoo_webcam_closed(int id, const char *who, int reason)
+{
+ LOG(("ext_yahoo_webcam_closed"));
+}
+
+void ext_yahoo_webcam_data_request(int id, int send)
+{
+ LOG(("ext_yahoo_webcam_data_request"));
+}
+
+void ext_yahoo_webcam_invite(int id, const char *me, const char *from)
+{
+ LOG(("ext_yahoo_webcam_invite"));
+
+ GETPROTOBYID( id )->ext_got_im(me, from, 0, Translate("[miranda] Got webcam invite. (not currently supported)"), 0, 0, 0, -1);
+}
+
+void ext_yahoo_webcam_invite_reply(int id, const char *me, const char *from, int accept)
+{
+ LOG(("ext_yahoo_webcam_invite_reply"));
+}
diff --git a/protocols/Yahoo/webcam.h b/protocols/Yahoo/webcam.h
new file mode 100644
index 0000000000..c33b7c5781
--- /dev/null
+++ b/protocols/Yahoo/webcam.h
@@ -0,0 +1,31 @@
+/*
+ * $Id: webcam.h 3627 2006-08-28 16:11:15Z gena01 $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+#ifndef _YAHOO_WEBCAM_H_
+#define _YAHOO_WEBCAM_H_
+
+/* WEBCAM callbacks */
+void ext_yahoo_got_webcam_image(int id, const char *who,
+ const unsigned char *image, unsigned int image_size, unsigned int real_size,
+ unsigned int timestamp);
+
+void ext_yahoo_webcam_viewer(int id, const char *who, int connect);
+
+void ext_yahoo_webcam_closed(int id, const char *who, int reason);
+
+void ext_yahoo_webcam_data_request(int id, int send);
+
+void ext_yahoo_webcam_invite(int id, const char *me, const char *from);
+
+void ext_yahoo_webcam_invite_reply(int id, const char *me, const char *from, int accept);
+
+#endif
diff --git a/protocols/Yahoo/yahoo.cpp b/protocols/Yahoo/yahoo.cpp
new file mode 100644
index 0000000000..4383278e0d
--- /dev/null
+++ b/protocols/Yahoo/yahoo.cpp
@@ -0,0 +1,1845 @@
+/*
+ * $Id: yahoo.cpp 13557 2011-04-09 02:26:58Z borkra $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+
+/*
+ * Miranda headers
+ */
+#include "yahoo.h"
+#include <m_protosvc.h>
+#include <m_langpack.h>
+#include <m_skin.h>
+#include <m_popup.h>
+#include <m_message.h>
+
+#include "avatar.h"
+#include "chat.h"
+#include "webcam.h"
+#include "file_transfer.h"
+#include "im.h"
+#include "search.h"
+#include "ignore.h"
+
+typedef struct {
+ int id;
+ char *label;
+} yahoo_idlabel;
+
+typedef struct {
+ int id;
+ char *who;
+} yahoo_authorize_data;
+
+yahoo_idlabel yahoo_status_codes[] = {
+ {YAHOO_STATUS_AVAILABLE, ""},
+ {YAHOO_STATUS_BRB, "BRB"},
+ {YAHOO_STATUS_BUSY, "Busy"},
+ {YAHOO_STATUS_NOTATHOME, "Not At Home"},
+ {YAHOO_STATUS_NOTATDESK, "Not At my Desk"},
+ {YAHOO_STATUS_NOTINOFFICE, "Not In The Office"},
+ {YAHOO_STATUS_ONPHONE, "On The Phone"},
+ {YAHOO_STATUS_ONVACATION, "On Vacation"},
+ {YAHOO_STATUS_OUTTOLUNCH, "Out To Lunch"},
+ {YAHOO_STATUS_STEPPEDOUT, "Stepped Out"},
+ {YAHOO_STATUS_INVISIBLE, "Invisible"},
+ {YAHOO_STATUS_IDLE, "Idle"},
+ {YAHOO_STATUS_OFFLINE, "Offline"},
+ {YAHOO_STATUS_CUSTOM, "[Custom]"},
+// {YAHOO_STATUS_NOTIFY, "Notify"},
+ {0, NULL}
+};
+
+#define MAX_PREF_LEN 255
+
+int do_yahoo_debug = 0;
+#ifdef HTTP_GATEWAY
+int iHTTPGateway = 0;
+#endif
+extern int poll_loop;
+
+char * yahoo_status_code(enum yahoo_status s)
+{
+ int i;
+
+ for(i=0; yahoo_status_codes[i].label; i++)
+ if(yahoo_status_codes[i].id == s)
+ return yahoo_status_codes[i].label;
+
+ return "Unknown";
+}
+
+yahoo_status miranda_to_yahoo(int myyahooStatus)
+{
+ yahoo_status ret = YAHOO_STATUS_AVAILABLE;
+
+ switch (myyahooStatus) {
+ case ID_STATUS_OFFLINE:
+ ret = YAHOO_STATUS_OFFLINE;
+ break;
+
+ case ID_STATUS_FREECHAT:
+ case ID_STATUS_ONLINE:
+ ret = YAHOO_STATUS_AVAILABLE;
+ break;
+
+ case ID_STATUS_AWAY:
+ ret = YAHOO_STATUS_STEPPEDOUT;
+ break;
+
+ case ID_STATUS_NA:
+ ret = YAHOO_STATUS_BRB;
+ break;
+
+ case ID_STATUS_OCCUPIED:
+ ret = YAHOO_STATUS_BUSY;
+ break;
+
+ case ID_STATUS_DND:
+ ret = YAHOO_STATUS_BUSY;
+ break;
+
+ case ID_STATUS_ONTHEPHONE:
+ ret = YAHOO_STATUS_ONPHONE;
+ break;
+
+ case ID_STATUS_OUTTOLUNCH:
+ ret = YAHOO_STATUS_OUTTOLUNCH;
+ break;
+
+ case ID_STATUS_INVISIBLE:
+ ret = YAHOO_STATUS_INVISIBLE;
+ break;
+ }
+
+ return ret;
+}
+
+int yahoo_to_miranda_status(int m_iStatus, int away)
+{
+ int ret = ID_STATUS_OFFLINE;
+
+ switch (m_iStatus) {
+ case YAHOO_STATUS_AVAILABLE:
+ ret = ID_STATUS_ONLINE;
+ break;
+ case YAHOO_STATUS_BRB:
+ ret = ID_STATUS_NA;
+ break;
+ case YAHOO_STATUS_BUSY:
+ ret = ID_STATUS_OCCUPIED;
+ break;
+ case YAHOO_STATUS_ONPHONE:
+ ret = ID_STATUS_ONTHEPHONE;
+ break;
+ case YAHOO_STATUS_OUTTOLUNCH:
+ ret = ID_STATUS_OUTTOLUNCH;
+ break;
+ case YAHOO_STATUS_INVISIBLE:
+ ret = ID_STATUS_INVISIBLE;
+ break;
+ case YAHOO_STATUS_NOTATHOME:
+ case YAHOO_STATUS_NOTATDESK:
+ case YAHOO_STATUS_NOTINOFFICE:
+ case YAHOO_STATUS_ONVACATION:
+ case YAHOO_STATUS_STEPPEDOUT:
+ case YAHOO_STATUS_IDLE:
+ ret = ID_STATUS_AWAY;
+ break;
+ case YAHOO_STATUS_CUSTOM:
+ ret = (away ? ID_STATUS_AWAY:ID_STATUS_ONLINE);
+ break;
+ }
+ return ret;
+}
+
+void CYahooProto::set_status(int myyahooStatus, char *msg, int away)
+{
+ LOG(("[set_status] myyahooStatus: %d, msg: %s, away: %d", myyahooStatus, msg, away));
+
+ /* Safety check, don't dereference Invalid pointers */
+ if (m_id > 0) {
+
+ if (YAHOO_CUSTOM_STATUS != myyahooStatus)
+ yahoo_set_away(m_id, miranda_to_yahoo(myyahooStatus), msg, away);
+ else
+ yahoo_set_away(m_id, ( yahoo_status )YAHOO_CUSTOM_STATUS, msg, away);
+ }
+}
+
+void CYahooProto::stealth(const char *buddy, int add)
+{
+ LOG(("[stealth] buddy: %s, add: %d", buddy, add));
+
+ /* Safety check, don't dereference Invalid pointers */
+ if (m_id > 0)
+ yahoo_set_stealth(m_id, buddy, GetWord(getbuddyH(buddy), "yprotoid", 0), add);
+}
+
+void CYahooProto::remove_buddy(const char *who, int protocol)
+{
+ LOG(("[remove_buddy] Buddy: '%s' protocol: %d", who, protocol));
+
+ DBVARIANT dbv;
+ if ( DBGetContactSettingString( getbuddyH(who), m_szModuleName, "YGroup", &dbv )) {
+ LOG(("WARNING NO DATABASE GROUP using 'miranda'!"));
+ yahoo_remove_buddy(m_id, who, protocol, "miranda");
+ return;
+ }
+
+ yahoo_remove_buddy(m_id, who, protocol, dbv.pszVal);
+ DBFreeVariant( &dbv );
+}
+
+void CYahooProto::sendtyping(const char *who, int protocol, int stat)
+{
+ LOG(("[sendtyping] Sending Typing Notification to '%s' protocol: %d, state: %d", who, protocol, stat));
+ yahoo_send_typing(m_id, NULL, who, protocol, stat);
+}
+
+void CYahooProto::accept(const char *who, int protocol)
+{
+ yahoo_accept_buddy(m_id, who, protocol);
+}
+
+void CYahooProto::reject(const char *who, int protocol, const char *msg)
+{
+ yahoo_reject_buddy(m_id, who, protocol, msg);
+}
+
+void CYahooProto::logout()
+{
+ LOG(("[yahoo_logout]"));
+
+ if (m_bLoggedIn)
+ yahoo_logoff(m_id);
+
+ /* need to stop the server and close all the connections */
+ poll_loop = 0;
+}
+
+void CYahooProto::AddBuddy( const char *who, int protocol, const char *group, const char *msg)
+{
+ DBVARIANT dbv;
+ char *fname=NULL, *lname=NULL;
+
+ /* We adding a buddy to our list.
+ 2 Stages.
+ 1. We send add buddy packet.
+ 2. We get a packet back from the server confirming add.
+
+ No refresh needed. */
+
+ if ( !DBGetContactSettingString( NULL, m_szModuleName, "First Name", &dbv )){
+ fname = strdup(dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+
+ if ( !DBGetContactSettingString( NULL, m_szModuleName, "Last Name", &dbv )){
+ lname = strdup(dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+
+ yahoo_add_buddy(m_id, fname, lname, who, protocol, group, msg);
+
+ FREE(fname);
+ FREE(lname);
+}
+
+HANDLE CYahooProto::getbuddyH(const char *yahoo_id)
+{
+ char *szProto;
+ HANDLE hContact;
+
+ for ( hContact = ( HANDLE )YAHOO_CallService( MS_DB_CONTACT_FINDFIRST, 0, 0 );
+ hContact != NULL;
+ hContact = ( HANDLE )YAHOO_CallService( MS_DB_CONTACT_FINDNEXT, ( WPARAM )hContact, 0 ))
+ {
+ szProto = ( char* )YAHOO_CallService( MS_PROTO_GETCONTACTBASEPROTO, ( WPARAM )hContact, 0 );
+ if ( szProto != NULL && !lstrcmpA( szProto, m_szModuleName ))
+ {
+ DBVARIANT dbv;
+ if ( DBGetContactSettingString( hContact, m_szModuleName, YAHOO_LOGINID, &dbv ))
+ continue;
+
+ {
+ int tCompareResult = lstrcmpiA( dbv.pszVal, yahoo_id );
+ DBFreeVariant( &dbv );
+ if ( tCompareResult )
+ continue;
+ }
+
+ return hContact;
+ }
+ }
+
+ return NULL;
+}
+
+HANDLE CYahooProto::add_buddy( const char *yahoo_id, const char *yahoo_name, int protocol, DWORD flags )
+{
+ HANDLE hContact;
+ char *yid = strdup(yahoo_id);
+
+ strlwr(yid);
+
+ hContact = getbuddyH(yid);
+ if (hContact != NULL) {
+ LOG(("[add_buddy] Found buddy id: %s, handle: %p", yid, hContact));
+ if ( !( flags & PALF_TEMPORARY ) && DBGetContactSettingByte( hContact, "CList", "NotOnList", 1 ))
+ {
+ LOG(("[add_buddy] Making Perm id: %s, flags: %lu", yahoo_id, flags));
+ DBDeleteContactSetting( hContact, "CList", "NotOnList" );
+ DBDeleteContactSetting( hContact, "CList", "Hidden" );
+
+ }
+
+ FREE(yid);
+ return hContact;
+ }
+
+ //not already there: add
+ LOG(("[add_buddy] Adding buddy id: %s (Nick: %s), flags: %lu", yid, yahoo_name, flags));
+ hContact = ( HANDLE )YAHOO_CallService( MS_DB_CONTACT_ADD, 0, 0 );
+ YAHOO_CallService( MS_PROTO_ADDTOCONTACT, ( WPARAM )hContact,( LPARAM )m_szModuleName );
+ SetString( hContact, YAHOO_LOGINID, yid );
+ Set_Protocol( hContact, protocol );
+
+ if (lstrlenA(yahoo_name) > 0)
+ SetStringUtf( hContact, "Nick", yahoo_name );
+ else
+ SetStringUtf( hContact, "Nick", yahoo_id );
+
+ if (flags & PALF_TEMPORARY ) {
+ DBWriteContactSettingByte( hContact, "CList", "NotOnList", 1 );
+ DBWriteContactSettingByte( hContact, "CList", "Hidden", 1 );
+ }
+
+ FREE(yid);
+ return hContact;
+}
+
+const char* CYahooProto::find_buddy( const char *yahoo_id)
+{
+ static char nick[128];
+ HANDLE hContact;
+ DBVARIANT dbv;
+
+ hContact = getbuddyH(yahoo_id);
+ if (hContact != NULL) {
+ if ( DBGetContactSettingString( hContact, m_szModuleName, "Nick", &dbv ))
+ return NULL;
+
+ strncpy(nick, dbv.pszVal, 128);
+ DBFreeVariant( &dbv );
+ return nick;
+ }
+
+ return NULL;
+}
+
+/* Required handlers below */
+
+/* Other handlers */
+void CYahooProto::ext_status_changed(const char *who, int protocol, int stat, const char *msg, int away, int idle, int mobile, int utf8)
+{
+ HANDLE hContact = 0;
+ time_t idlets = 0;
+
+ YAHOO_DEBUGLOG("[ext_status_changed] %s (prot: %d) with msg %s utf8: %d, stat: %s (%d), away: %d, idle: %d seconds",
+ who,
+ protocol,
+ msg,
+ utf8,
+ (stat == 0) ? "Online" : yahoo_status_code( (yahoo_status)stat ),
+ stat,
+ away,
+ idle);
+
+ hContact = getbuddyH(who);
+ if (hContact == NULL) {
+ YAHOO_DEBUGLOG("Buddy Not Found. Adding...");
+ hContact = add_buddy(who, who, protocol, 0);
+/* } else {
+ YAHOO_DEBUGLOG("Buddy Found On My List! Buddy %p", hContact);*/
+ }
+
+ if (!mobile)
+ SetWord(hContact, "Status", yahoo_to_miranda_status(stat,away));
+ else
+ SetWord(hContact, "Status", ID_STATUS_ONTHEPHONE);
+
+ SetWord(hContact, "YStatus", stat);
+ SetWord(hContact, "YAway", away);
+ SetWord(hContact, "Mobile", mobile);
+
+ if(msg) {
+ YAHOO_DEBUGLOG("[ext_status_changed] %s custom message '%s'", who, msg);
+
+ if (utf8)
+ DBWriteContactSettingStringUtf( hContact, "CList", "StatusMsg", msg);
+ else
+ DBWriteContactSettingString( hContact, "CList", "StatusMsg", msg);
+ }
+ else DBDeleteContactSetting(hContact, "CList", "StatusMsg" );
+
+ if (stat == YAHOO_STATUS_OFFLINE) {
+ /*
+ * Delete the IdleTS if the user went offline
+ */
+ DBDeleteContactSetting(hContact, m_szModuleName, "IdleTS");
+ } else {
+ if ( (away == 2) || (stat == YAHOO_STATUS_IDLE) || (idle > 0)) {
+ /* TODO: set Idle=-1, because of key 138=1 and don't set idlets then */
+ if (stat > 0) {
+ YAHOO_DEBUGLOG("[ext_status_changed] %s idle for %d:%02d:%02d", who, idle/3600, (idle/60)%60, idle%60);
+
+ time(&idlets);
+ idlets -= idle;
+ }
+ }
+
+ DBWriteContactSettingDword(hContact, m_szModuleName, "IdleTS", idlets);
+ }
+
+ YAHOO_DEBUGLOG("[ext_status_changed] exiting");
+}
+
+void CYahooProto::ext_status_logon(const char *who, int protocol, int stat, const char *msg, int away, int idle, int mobile, int cksum, int buddy_icon, long client_version, int utf8)
+{
+ YAHOO_DEBUGLOG("[ext_status_logon] %s (prot: %d) with msg %s utf8: %d, (stat: %d, away: %d, idle: %d seconds, checksum: %d buddy_icon: %d client_version: %ld)", who, protocol, msg, utf8, stat, away, idle, cksum, buddy_icon, client_version);
+
+ ext_status_changed(who, protocol, stat, msg, away, idle, mobile, utf8);
+
+ HANDLE hContact = getbuddyH(who);
+ if (hContact == NULL) {
+ YAHOO_DEBUGLOG("[ext_status_logon] Can't find handle for %s??? PANIC!!!", who);
+ return;
+ }
+
+ /**
+ * We only do real client detection when using Yahoo client. Other option is to fill in the protocol info
+ */
+ if (protocol == 0) {
+ char *s = NULL;
+
+ switch (client_version & 0x7FFFBF) {
+ case 2:
+ s = "Yahoo Mobile";
+ break;
+
+ case 6:
+ s = "Yahoo PingBox";
+ break;
+
+ case 3075:
+ s = "Yahoo Web Messenger";
+ break;
+
+ case 35846:
+ s = "iPhone Y! Messenger"; // iPhone Y! Messenger 1.5
+ break;
+
+ case 262651:
+ s = "libyahoo2";
+ break;
+
+ case 262655:
+ s = "< Yahoo 6.x (Yahoo 5.x?)";
+ break;
+
+ case 278527:
+ s = "Yahoo 6.x";
+ break;
+
+ case 524223:
+ //Yahoo 7.4
+ //Yahoo 7.5
+ s = "Yahoo 7.x";
+ break;
+
+ case 888327:
+ s = "Yahoo 9.0 for Vista";
+ break;
+
+ case 822366: /* Yahoo! Messenger 2.1.37 by RIM */
+ s = "Yahoo for Blackberry";
+ break;
+
+ case 822543: /* ? "Yahoo Version 3.0 beta 1 (build 18274) OSX" */
+ case 1572799: /* 8.0.x ?? */
+ case 2097087: /* 8.1.0.195 */
+ s = "Yahoo 8.x";
+ break;
+
+ case 2088895:
+ case 4194239:
+ s = "Yahoo 9.0";
+ break;
+
+ case 8388543:
+ s = "Yahoo 10.0";
+ break;
+ }
+
+ if (s != NULL)
+ SetString( hContact, "MirVer", s);
+ else
+ DBDeleteContactSetting( hContact, m_szModuleName, "MirVer");
+
+ } else {
+ Set_Protocol(hContact, protocol);
+ }
+
+ /* Add the client_Version # to the contact DB entry */
+ DBWriteContactSettingDword( hContact, m_szModuleName, "ClientVersion", client_version);
+
+ /* Last thing check the checksum and request new one if we need to */
+ if (buddy_icon == -1) {
+ YAHOO_DEBUGLOG("[ext_status_logon] No avatar information in this packet? Not touching stuff!");
+ } else {
+ // we got some avatartype info
+ DBWriteContactSettingByte(hContact, m_szModuleName, "AvatarType", buddy_icon);
+
+ if (cksum == 0 || cksum == -1){
+ // no avatar
+ DBWriteContactSettingDword(hContact, m_szModuleName, "PictCK", 0);
+ } else if (DBGetContactSettingDword(hContact, m_szModuleName,"PictCK", 0) != cksum) {
+ //char szFile[MAX_PATH];
+
+ // Save new Checksum
+ DBWriteContactSettingDword(hContact, m_szModuleName, "PictCK", cksum);
+
+ // Need to delete the Avatar File!!
+ //GetAvatarFileName(hContact, szFile, sizeof szFile, 0);
+ //DeleteFile(szFile);
+ }
+
+ // Cleanup the type? and reset things...
+ reset_avatar(hContact);
+ }
+
+ YAHOO_DEBUGLOG("[ext_status_logon] exiting");
+}
+
+void CYahooProto::ext_got_audible(const char *me, const char *who, const char *aud, const char *msg, const char *aud_hash)
+{
+ /* aud = file class name
+ GAIM: the audible, in foo.bar.baz format
+
+ Actually this is the filename.
+ Full URL:
+
+ http://us.dl1.yimg.com/download.yahoo.com/dl/aud/us/aud.swf
+
+ where aud in foo.bar.baz format
+ */
+
+ LOG(("ext_got_audible for %s aud: %s msg:'%s' hash: %s", who, aud, msg, aud_hash));
+
+ HANDLE hContact = getbuddyH(who);
+ if (hContact == NULL) {
+ LOG(("Buddy Not Found. Skipping avatar update"));
+ return;
+ }
+
+ char z[1028];
+ mir_snprintf(z, sizeof(z), "[miranda-audible] %s", msg ?msg:"");
+ ext_got_im((char*)me, (char*)who, 0, z, 0, 0, 1, -1, NULL, 0);
+}
+
+void CYahooProto::ext_got_calendar(const char *url, int type, const char *msg, int svc)
+{
+ LOG(("[ext_got_calendar] URL:%s type: %d msg: %s svc: %d", url, type, msg, svc));
+
+ if (!ShowPopup( Translate("Calendar Reminder"), msg, url))
+ ShowNotification(Translate("Calendar Reminder"), msg, NIIF_INFO);
+}
+
+void CYahooProto::ext_got_stealth(char *stealthlist)
+{
+ char **s;
+ int found = 0;
+ char **stealth = NULL;
+ char *szProto;
+ HANDLE hContact;
+
+ LOG(("[ext_got_stealth] list: %s", stealthlist));
+
+ if (stealthlist)
+ stealth = y_strsplit(stealthlist, ",", -1);
+
+ for ( hContact = ( HANDLE )YAHOO_CallService( MS_DB_CONTACT_FINDFIRST, 0, 0 );
+ hContact != NULL;
+ hContact = ( HANDLE )YAHOO_CallService( MS_DB_CONTACT_FINDNEXT, ( WPARAM )hContact, 0 ))
+ {
+ szProto = ( char* )YAHOO_CallService( MS_PROTO_GETCONTACTBASEPROTO, ( WPARAM )hContact, 0 );
+ if ( szProto != NULL && !lstrcmpA( szProto, m_szModuleName )) {
+ DBVARIANT dbv;
+ if ( DBGetContactSettingString( hContact, m_szModuleName, YAHOO_LOGINID, &dbv ))
+ continue;
+
+ found = 0;
+
+ for(s = stealth; s && *s; s++) {
+
+ if (lstrcmpiA(*s, dbv.pszVal) == 0) {
+ YAHOO_DEBUGLOG("GOT id = %s", dbv.pszVal);
+ found = 1;
+ break;
+ }
+ }
+
+ /* Check the stealth list */
+ if (found) { /* we have him on our Stealth List */
+ YAHOO_DEBUGLOG("Setting STEALTH for id = %s", dbv.pszVal);
+ /* need to set the ApparentMode thingy */
+ if (ID_STATUS_OFFLINE != DBGetContactSettingWord(hContact, m_szModuleName, "ApparentMode", 0))
+ DBWriteContactSettingWord(hContact, m_szModuleName, "ApparentMode", (WORD) ID_STATUS_OFFLINE);
+
+ } else { /* he is not on the Stealth List */
+ //LOG(("Resetting STEALTH for id = %s", dbv.pszVal));
+ /* need to delete the ApparentMode thingy */
+ if (DBGetContactSettingWord(hContact, m_szModuleName, "ApparentMode", 0))
+ DBDeleteContactSetting(hContact, m_szModuleName, "ApparentMode");
+ }
+
+ DBFreeVariant( &dbv );
+ }
+ }
+}
+
+void CYahooProto::ext_got_buddies(YList * buds)
+{
+ LOG(("[ext_got_buddies] "));
+
+ if (buds == NULL) {
+ LOG(("No Buddies to work on!"));
+ return;
+ }
+
+ YAHOO_DEBUGLOG(("[ext_got_buddies] Walking buddy list..."));
+ for(; buds; buds = buds->next) {
+ HANDLE hContact;
+
+ yahoo_buddy *bud = ( yahoo_buddy* )buds->data;
+ if (bud == NULL) {
+ LOG(("[ext_got_buddies] EMPTY BUDDY LIST??"));
+ continue;
+ }
+
+ YAHOO_DEBUGLOG("[ext_got_buddies] id = %s, protocol = %d, group = %s, auth = %d", bud->id, bud->protocol, bud->group, bud->auth);
+
+ hContact = getbuddyH(bud->id);
+ if (hContact == NULL)
+ hContact = add_buddy(bud->id, (bud->real_name != NULL) ? bud->real_name : bud->id, bud->protocol, 0);
+
+ if (bud->protocol != 0)
+ Set_Protocol(hContact, bud->protocol);
+
+ if (bud->group)
+ SetString( hContact, "YGroup", bud->group);
+
+ if (bud->stealth) { /* we have him on our Stealth List */
+ YAHOO_DEBUGLOG("Setting STEALTH for id = %s", bud->id);
+ /* need to set the ApparentMode thingy */
+ if (ID_STATUS_OFFLINE != DBGetContactSettingWord(hContact, m_szModuleName, "ApparentMode", 0))
+ DBWriteContactSettingWord(hContact, m_szModuleName, "ApparentMode", (WORD) ID_STATUS_OFFLINE);
+
+ } else { /* he is not on the Stealth List */
+ //LOG(("Resetting STEALTH for id = %s", dbv.pszVal));
+ /* need to delete the ApparentMode thingy */
+ if (DBGetContactSettingWord(hContact, m_szModuleName, "ApparentMode", 0))
+ DBDeleteContactSetting(hContact, m_szModuleName, "ApparentMode");
+ }
+
+ //if (bud->auth)
+ // YAHOO_DEBUGLOG( "Auth request waiting for: %s", bud->id );
+ SetByte(hContact, "YAuth", bud->auth);
+
+ if (bud->real_name) {
+ YAHOO_DEBUGLOG("id = %s name = %s", bud->id, bud->real_name);
+ SetStringUtf( hContact, "Nick", bud->real_name);
+ }
+
+ if (bud->yab_entry) {
+ //LOG(("YAB_ENTRY"));
+
+ if (bud->yab_entry->fname)
+ SetStringUtf( hContact, "FirstName", bud->yab_entry->fname);
+
+ if (bud->yab_entry->lname)
+ SetStringUtf( hContact, "LastName", bud->yab_entry->lname);
+
+ if (bud->yab_entry->email)
+ SetString( hContact, "e-mail", bud->yab_entry->email);
+
+ if (bud->yab_entry->mphone)
+ SetString( hContact, "Cellular", bud->yab_entry->mphone);
+
+ if (bud->yab_entry->hphone)
+ SetString( hContact, "Phone", bud->yab_entry->hphone);
+
+ if (bud->yab_entry->wphone)
+ SetString( hContact, "CompanyPhone", bud->yab_entry->wphone);
+
+ SetWord( hContact, "YabID", bud->yab_entry->dbid);
+ }
+ }
+
+ YAHOO_DEBUGLOG(("[ext_got_buddies] buddy list Finished."));
+}
+
+void CYahooProto::ext_rejected(const char *who, const char *msg)
+{
+ LOG(("[ext_rejected] who: %s msg: %s", who, msg));
+
+ HANDLE hContact = getbuddyH(who);
+ if (hContact != NULL) {
+ /*
+ * Make sure the contact is temporary so we could delete it w/o extra traffic
+ */
+ DBWriteContactSettingByte( hContact, "CList", "NotOnList", 1 );
+ YAHOO_CallService( MS_DB_CONTACT_DELETE, (WPARAM) hContact, 0);
+ }
+ else LOG(("[ext_rejected] Buddy not on our buddy list"));
+
+ char buff[1024];
+ mir_snprintf(buff, sizeof(buff), Translate("%s has rejected your request and sent the following message:"), who);
+ MessageBoxA( NULL, msg, buff, MB_OK | MB_ICONINFORMATION );
+}
+
+void CYahooProto::ext_buddy_added(char *myid, char *who, char *group, int status, int auth)
+{
+ HANDLE hContact=getbuddyH(who);;
+
+ LOG(("[ext_buddy_added] %s authorized you as %s group: %s status: %d auth: %d", who, myid, group, status, auth));
+
+ switch (status) {
+ case 0: /* we are ok */
+ case 2: /* seems that we ok, not sure what this means.. we already on buddy list? */
+ case 40: /* When adding MSN Live contacts we get this one? */
+ DBDeleteContactSetting( hContact, "CList", "NotOnList" );
+ DBDeleteContactSetting( hContact, "CList", "Hidden" );
+ break;
+
+ case 1: /* invalid ID? */
+ case 3: /* invalid ID */
+ if (hContact != NULL) {
+ ShowPopup( "Invalid Contact", "The id you tried to add is invalid.", NULL);
+ /* Make it TEMP first, we don't want to send any extra packets for FALSE ids */
+ DBWriteContactSettingByte( hContact, "CList", "NotOnList", 1 );
+ YAHOO_CallService( MS_DB_CONTACT_DELETE, (WPARAM) hContact, 0);
+ }
+ break;
+
+ default:
+ /* ??? */
+ if (hContact != NULL) {
+ ShowPopup( "Invalid Contact", "Unknown Error??.", NULL);
+ /* Make it TEMP first, we don't want to send any extra packets for FALSE ids */
+ DBWriteContactSettingByte( hContact, "CList", "NotOnList", 1 );
+ YAHOO_CallService( MS_DB_CONTACT_DELETE, (WPARAM) hContact, 0);
+ }
+
+ break;
+ }
+}
+
+void CYahooProto::ext_contact_added(const char *myid, const char *who, const char *fname, const char *lname, const char *msg, int protocol)
+{
+ char nick[128];
+ BYTE *pCurBlob;
+ HANDLE hContact = NULL;
+ CCSDATA ccs = { 0 };
+ PROTORECVEVENT pre = { 0 };
+
+ /* NOTE: Msg is actually in UTF8 unless stated otherwise!! */
+ LOG(("[ext_contact_added] %s %s (%s:%d) added you as %s w/ msg '%s'", fname, lname, who, protocol, myid, msg));
+
+ if ( BuddyIgnored( who )) {
+ LOG(("User '%s' on our Ignore List. Dropping Authorization Request.", who));
+ return;
+ }
+
+ nick[0] = '\0';
+
+ if (lname != NULL) {
+ if (fname != NULL) {
+ mir_snprintf(nick, sizeof(nick), "%s %s", fname, lname);
+ } else {
+ mir_snprintf(nick, sizeof(nick), "%s", lname);
+ }
+ } else if (fname != NULL) {
+ mir_snprintf(nick, sizeof(nick), "%s", fname);
+ }
+
+ if (nick[0] == '\0')
+ mir_snprintf(nick, sizeof(nick), "%s", who);
+
+ hContact = add_buddy(who, nick, protocol, PALF_TEMPORARY);
+
+ if (lstrcmpA(nick, who) != 0)
+ SetStringUtf( hContact, "Nick", nick);
+
+ //SetWord(hContact, "yprotoid", protocol);
+ Set_Protocol(hContact, protocol);
+
+ ccs.szProtoService = PSR_AUTH;
+ ccs.hContact = hContact;
+ ccs.wParam = 0;
+ ccs.lParam = (LPARAM) &pre;
+ pre.flags = PREF_UTF;
+ pre.timestamp = time(NULL);
+
+ pre.lParam = sizeof(DWORD)+sizeof(HANDLE)+lstrlenA(who)+lstrlenA(nick)+5;
+
+ if (fname != NULL)
+ pre.lParam += lstrlenA(fname);
+
+ if (lname != NULL)
+ pre.lParam += lstrlenA(lname);
+
+ if (msg != NULL)
+ pre.lParam += lstrlenA(msg);
+
+ pCurBlob=(PBYTE)malloc(pre.lParam);
+ pre.szMessage = (char *)pCurBlob;
+
+ /*
+ Auth blob is: uin(DWORD),hcontact(HANDLE),nick(ASCIIZ),first(ASCIIZ),
+ last(ASCIIZ),email(ASCIIZ),reason(ASCIIZ)
+
+ blob is: 0(DWORD), hContact(HANDLE), nick(ASCIIZ), fname (ASCIIZ), lname (ASCIIZ), email(ASCIIZ), msg(ASCIIZ)
+
+ */
+
+ // UIN
+ *( PDWORD )pCurBlob = 0;
+ pCurBlob+=sizeof(DWORD);
+
+ // hContact
+ *( PHANDLE )pCurBlob = hContact;
+ pCurBlob+=sizeof(HANDLE);
+
+ // NICK
+ lstrcpyA((char *)pCurBlob, nick);
+
+ pCurBlob+=lstrlenA((char *)pCurBlob)+1;
+
+ // FIRST
+ lstrcpyA((char *)pCurBlob, (fname != NULL) ? fname : "");
+ pCurBlob+=lstrlenA((char *)pCurBlob)+1;
+
+ // LAST
+ lstrcpyA((char *)pCurBlob, (lname != NULL) ? lname : "");
+ pCurBlob+=lstrlenA((char *)pCurBlob)+1;
+
+ // E-mail
+ lstrcpyA((char *)pCurBlob,who);
+ pCurBlob+=lstrlenA((char *)pCurBlob)+1;
+
+ // Reason
+ lstrcpyA((char *)pCurBlob, (msg != NULL) ? msg : "" );
+
+ CallService(MS_PROTO_CHAINRECV,0,(LPARAM)&ccs);
+}
+
+void CYahooProto::ext_typing_notify(const char *me, const char *who, int protocol, int stat)
+{
+ LOG(("[ext_typing_notify] me: '%s' who: '%s' protocol: %d stat: %d ", me, who, protocol, stat));
+
+ HANDLE hContact = getbuddyH(who);
+
+ if (hContact)
+ CallService(MS_PROTO_CONTACTISTYPING, (WPARAM)hContact, (LPARAM)stat?10:0);
+}
+
+void CYahooProto::ext_game_notify(const char *me, const char *who, int stat, const char *msg)
+{
+ /* There's also game invite packet:
+ [17:36:44 YAHOO] libyahoo2/libyahoo2.c:3093: debug:
+[17:36:44 YAHOO] Yahoo Service: (null) (0xb7) Status: YAHOO_STATUS_BRB (1)
+[17:36:44 YAHOO]
+[17:36:44 YAHOO] libyahoo2/libyahoo2.c:863: debug:
+[17:36:44 YAHOO] [Reading packet] len: 88
+[17:36:44 YAHOO]
+[17:36:44 YAHOO] Key: From (4) Value: 'xxxxx'
+[17:36:44 YAHOO]
+[17:36:44 YAHOO] Key: To (5) Value: 'zxzxxx'
+[17:36:44 YAHOO]
+[17:36:44 YAHOO] Key: (null) (180) Value: 'pl'
+[17:36:44 YAHOO]
+[17:36:44 YAHOO] Key: (null) (183) Value: ''
+[17:36:44 YAHOO]
+[17:36:44 YAHOO] Key: (null) (181) Value: ''
+[17:36:44 YAHOO]
+[17:36:44 YAHOO] Key: session (11) Value: 'o8114ik_lixyxtdfrxbogw--'
+[17:36:44 YAHOO]
+[17:36:44 YAHOO] Key: stat/location (13) Value: '1'
+[17:36:44 YAHOO]
+[17:36:44 YAHOO] libyahoo2/libyahoo2.c:908: debug:
+[17:36:44 YAHOO] [Reading packet done]
+
+ */
+ LOG(("[ext_game_notify] me: %s, who: %s, stat: %d, msg: %s", me, who, stat, msg));
+ /* FIXME - Not Implemented - this informs you someone else is playing on Yahoo! Games */
+ /* Also Stubbed in Sample Client */
+ HANDLE hContact = getbuddyH(who);
+ if (!hContact)
+ return;
+
+ if (stat == 2)
+ SetString(hContact, "YGMsg", "");
+ else if (msg) {
+ const char *l = msg, *u = NULL;
+ char *z, *c;
+ int i = 0;
+
+ /* Parse and Set a custom Message
+ *
+ * Format: 1 [09] ygamesp [09] 1 [09] 0 [09] ante?room=yahoo_1078798506&follow=rrrrrrr
+ * [09] Yahoo! Poker\nRoom: Intermediate Lounge 2
+ *
+ * Sign-in:
+ * [17:13:42 YAHOO] [ext_yahoo_game_notify] id: 1, me: xxxxx, who: rrrrrrr,
+ * stat: 1, msg: 1 ygamesa 1 0 ante?room=yahoo_1043183792&follow=lotesdelere
+ * Yahoo! Backgammon Room: Social Lounge 12
+ *
+ * Sign-out:
+ * [17:18:38 YAHOO] [ext_yahoo_game_notify] id: 1, me: xxxxx, who: rrrrr,
+ * stat: 2, msg: 1 ygamesa 2
+ */
+ z = (char *) _alloca(lstrlenA(l) + 50);
+
+ z[0]='\0';
+ do{
+ c = ( char* )strchr(l, 0x09);
+ i++;
+ if (c != NULL) {
+ l = c;
+ l++;
+ if (i == 4)
+ u = l;
+ }
+ } while (c != NULL && i < 5);
+
+ if (c != NULL) {
+ // insert \r before \n
+ do{
+ c = ( char* )strchr(l, '\n');
+
+ if (c != NULL) {
+ (*c) = '\0';
+ lstrcatA(z, l);
+ lstrcatA(z, "\r\n");
+ l = c + 1;
+ } else {
+ lstrcatA(z, l);
+ }
+ } while (c != NULL);
+
+ lstrcatA(z, "\r\n\r\nhttp://games.yahoo.com/games/");
+ lstrcatA(z, u);
+ c = strchr(z, 0x09);
+ (*c) = '\0';
+ }
+
+ SetString(hContact, "YGMsg", z);
+
+ } else {
+ /* ? no information / reset custom message */
+ SetString(hContact, "YGMsg", "");
+ }
+}
+
+void CYahooProto::ext_mail_notify(const char *from, const char *subj, int cnt)
+{
+ LOG(("[ext_mail_notify] from: %s subject: %s count: %d", from, subj, cnt));
+
+ if (cnt > 0) {
+ SkinPlaySound("mail");
+
+ if (!GetByte( "DisableYahoomail", 0)) {
+ char z[MAX_SECONDLINE], title[MAX_CONTACTNAME];
+
+ if (from == NULL) {
+ snprintf(title, sizeof(title), "%s: %s", m_szModuleName, Translate("New Mail"));
+ snprintf(z, sizeof(z), Translate("You Have %i unread msgs"), cnt);
+ } else {
+ snprintf(title, sizeof(title), Translate("New Mail (%i msgs)"), cnt);
+ snprintf(z, sizeof(z), Translate("From: %s\nSubject: %s"), from, subj);
+ }
+
+ if(!ShowPopup( title, z, "http://mail.yahoo.com" ))
+ ShowNotification(title, z, NIIF_INFO);
+ }
+ }
+
+ m_unreadMessages = cnt;
+ SendBroadcast( NULL, ACKTYPE_EMAIL, ACKRESULT_STATUS, NULL, 0 );
+}
+
+void CYahooProto::ext_system_message(const char *me, const char *who, const char *msg)
+{
+ LOG(("[ext_system_message] System Message to: %s from: %s msg: %s", me, who, msg));
+
+ ShowPopup( (who != NULL) ? who : "Yahoo System Message", msg, NULL);
+}
+
+void CYahooProto::ext_got_identities(const char *nick, const char *fname, const char *lname, YList * ids)
+{
+ LOG(("[ext_got_identities] First Name: %s, Last Name: %s", fname, lname));
+
+ /* FIXME - Not implemented - Got list of Yahoo! identities */
+ /* We currently only use the default identity */
+ /* Also Stubbed in Sample Client */
+ SetString(NULL, "First Name", fname ? fname : "");
+ SetString(NULL, "Last Name", lname ? lname : "");
+}
+
+void __cdecl yahoo_get_yab_thread(void *psf)
+{
+ int id = (int)psf;
+
+ yahoo_get_yab(id);
+}
+
+
+void ext_yahoo_got_cookies(int id)
+{
+// char z[1024];
+
+ LOG(("[ext_got_cookies] id: %d", id));
+/* LOG(("Y Cookie: '%s'", yahoo_get_cookie(id, "y")));
+ LOG(("T Cookie: '%s'", yahoo_get_cookie(id, "t")));
+ LOG(("C Cookie: '%s'", yahoo_get_cookie(id, "c")));
+ LOG(("Login Cookie: '%s'", yahoo_get_cookie(id, "login")));
+
+ //wsprintfA(z, "Cookie: %s; C=%s; Y=%s; T=%s", Bcookie, yahoo_get_cookie(id, "c"), yahoo_get_cookie(id, "y"), yahoo_get_cookie(id, "t"));
+ //wsprintfA(z, "Cookie: %s; Y=%s", Bcookie, yahoo_get_cookie(id, "y"), yahoo_get_cookie(id, "t"));
+ wsprintfA(z, "Cookie: Y=%s; T=%s", yahoo_get_cookie(id, "y"), yahoo_get_cookie(id, "t"));
+ LOG(("Our Cookie: '%s'", z));
+ YAHOO_CallService(MS_NETLIB_SETSTICKYHEADERS, (WPARAM)hnuMain, (LPARAM)z);*/
+
+#ifdef HTTP_GATEWAY
+ if (iHTTPGateway) {
+ char z[1024];
+
+ // need to add Cookie header to our requests or we get booted w/ "Bad Cookie" message.
+ mir_snprintf(z, sizeof(z), "Cookie: Y=%s; T=%s; C=%s", yahoo_get_cookie(id, "y"),
+ yahoo_get_cookie(id, "t"), yahoo_get_cookie(id, "c"));
+ LOG(("Our Cookie: '%s'", z));
+ YAHOO_CallService(MS_NETLIB_SETSTICKYHEADERS, (WPARAM)hNetlibUser, (LPARAM)z);
+ }
+#endif
+
+}
+
+void CYahooProto::ext_got_ping(const char *errormsg)
+{
+ LOG(("[ext_got_ping]"));
+
+ if (errormsg) {
+ LOG(("[ext_got_ping] Error msg: %s", errormsg));
+ ShowError(Translate("Yahoo Ping Error"), errormsg);
+ return;
+ }
+
+ if (m_iStatus == ID_STATUS_CONNECTING) {
+ LOG(("[ext_got_ping] We are connecting. Checking for different status. Start: %d, Current: %d", m_startStatus, m_iStatus));
+ if (m_startStatus != m_iStatus) {
+ LOG(("[COOKIES] Updating Status to %d ", m_startStatus));
+
+ if (m_startStatus != ID_STATUS_INVISIBLE) {// don't generate a bogus packet for Invisible state
+ if (m_startMsg != NULL) {
+ set_status(YAHOO_STATUS_CUSTOM, m_startMsg, (m_startStatus != ID_STATUS_ONLINE) ? 1 : 0);
+ } else
+ set_status(m_startStatus, NULL, (m_startStatus != ID_STATUS_ONLINE) ? 1 : 0);
+ }
+
+ BroadcastStatus(m_startStatus);
+ m_bLoggedIn=TRUE;
+
+ /**
+ * Now load the YAB.
+ */
+ if (GetByte( "UseYAB", 1 )) {
+ LOG(("[ext_got_ping] GET YAB"));
+ if (m_iStatus != ID_STATUS_OFFLINE)
+ mir_forkthread(yahoo_get_yab_thread, (void *)m_id);
+ }
+
+ }
+ }
+}
+
+void CYahooProto::ext_login_response(int succ, const char *url)
+{
+ char buff[1024];
+
+ LOG(("[ext_login_response] succ: %d, url: %s", succ, url));
+
+ if(succ == YAHOO_LOGIN_OK) {
+ const char *c;
+
+ m_status = yahoo_current_status(m_id);
+ LOG(("logged in status-> %d", m_status));
+
+ c = yahoo_get_pw_token(m_id);
+
+ SetString(YAHOO_PWTOKEN, c);
+
+ LOG(("PW Token-> %s", c));
+ return;
+ }
+
+ if(succ == YAHOO_LOGIN_UNAME) {
+ snprintf(buff, sizeof(buff), Translate("Could not log into Yahoo service - username not recognised. Please verify that your username is correctly typed."));
+ ProtoBroadcastAck(m_szModuleName, NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_BADUSERID);
+ }
+ else if(succ == YAHOO_LOGIN_PASSWD) {
+ snprintf(buff, sizeof(buff), Translate("Could not log into Yahoo service - password incorrect. Please verify that your username and password are correctly typed."));
+ ProtoBroadcastAck(m_szModuleName, NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_WRONGPASSWORD);
+ }
+ else if(succ == YAHOO_LOGIN_LOCK) {
+ snprintf(buff, sizeof(buff), Translate("Could not log into Yahoo service. Your account has been locked.\nVisit %s to reactivate it."), url);
+ }
+ else if(succ == YAHOO_LOGIN_DUPL) {
+ snprintf(buff, sizeof(buff), Translate("You have been logged out of the yahoo service, possibly due to a duplicate login."));
+ ProtoBroadcastAck(m_szModuleName, NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_OTHERLOCATION);
+ }
+ else if(succ == YAHOO_LOGIN_LOGOFF) {
+ //snprintf(buff, sizeof(buff), Translate("You have been logged out of the yahoo service."));
+ //ProtoBroadcastAck(m_szModuleName, NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_OTHERLOCATION);
+ return; // we logged out.. so just sign-off..
+ }
+ else if(succ == -1) {
+ /// Can't Connect or got disconnected.
+ if (m_iStatus == ID_STATUS_CONNECTING)
+ snprintf(buff, sizeof(buff), Translate("Could not connect to the Yahoo service. Check your server/port and proxy settings."));
+ else
+ return;
+ }
+ else snprintf(buff, sizeof(buff),Translate("Could not log in, unknown reason: %d."), succ);
+
+ DBDeleteContactSetting(NULL, m_szModuleName, YAHOO_PWTOKEN);
+
+ YAHOO_DEBUGLOG("ERROR: %s", buff);
+
+ /*
+ * Show Error Message
+ */
+ ShowError(Translate("Yahoo Login Error"), buff);
+
+ /*
+ * Stop the server thread and let Server cleanup
+ */
+ poll_loop = 0;
+}
+
+void CYahooProto::ext_error(const char *err, int fatal, int num)
+{
+ char buff[1024];
+
+ LOG(("[ext_error] Error: fatal: %d, num: %d, err: %s", fatal, num, err));
+
+ switch(num) {
+ case E_UNKNOWN:
+ snprintf(buff, sizeof(buff), Translate("Unknown error %s"), err);
+ break;
+ case E_CUSTOM:
+ snprintf(buff, sizeof(buff), Translate("Custom error %s"), err);
+ break;
+ case E_CONFNOTAVAIL:
+ snprintf(buff, sizeof(buff), Translate("%s is not available for the conference"), err);
+ break;
+ case E_IGNOREDUP:
+ snprintf(buff, sizeof(buff), Translate("%s is already ignored"), err);
+ break;
+ case E_IGNORENONE:
+ snprintf(buff, sizeof(buff), Translate("%s is not in the ignore list"), err);
+ break;
+ case E_IGNORECONF:
+ snprintf(buff, sizeof(buff), Translate("%s is in buddy list - cannot ignore "), err);
+ break;
+ case E_SYSTEM:
+ snprintf(buff, sizeof(buff), Translate("System Error: %s"), err);
+ break;
+ case E_CONNECTION:
+ snprintf(buff, sizeof(buff), Translate("Server Connection Error: %s"), err);
+ YAHOO_DEBUGLOG("Error: %s", buff);
+ return;
+ }
+
+ YAHOO_DEBUGLOG("Error: %s", buff);
+
+ /*
+ * Show Error Message
+ */
+ ShowError(Translate("Yahoo Error"), buff);
+}
+
+extern HANDLE g_hNetlibUser;
+
+int CYahooProto::ext_connect(const char *h, int p, int type)
+{
+ LOG(("[ext_connect] %s:%d type: %d", h, p, type));
+
+ HANDLE hUser=m_hNetlibUser;
+ NETLIBOPENCONNECTION ncon = {0};
+ ncon.cbSize = sizeof(ncon);
+ ncon.flags = NLOCF_V2;
+ ncon.szHost = h;
+ ncon.wPort = p;
+ ncon.timeout = 5;
+
+ if (type != YAHOO_CONNECTION_PAGER) {
+ ncon.flags |= NLOCF_HTTP;
+ hUser = g_hNetlibUser;
+ }
+
+ HANDLE con = (HANDLE) CallService(MS_NETLIB_OPENCONNECTION, (WPARAM)hUser, (LPARAM)&ncon);
+ if (con == NULL) {
+ LOG(("ERROR: Connect Failed!"));
+ return -1;
+ }
+
+ LOG(("[ext_connect] Got: %d", (int)con));
+
+ return (int)con;
+}
+
+void CYahooProto::ext_send_http_request(enum yahoo_connection_type type, const char *method, const char *url,
+ const char *cookies, long content_length, yahoo_get_fd_callback callback, void *callback_data)
+{
+/* if (lstrcmpiA(method, "GET") == 0)
+ yahoo_http_get(id, url, cookies, callback, callback_data);
+ else if (lstrcmpiA(method, "POST") == 0)
+ yahoo_http_post(id, url, cookies, content_length, callback, callback_data);
+ else
+ LOG(("ERROR: Unknown method: %s", method));
+*/
+ NETLIBHTTPREQUEST nlhr={0};
+ NETLIBHTTPHEADER httpHeaders[5];
+ int fd, error = 0;
+ char host[255];
+ int port = 80, i=0;
+ char path[255];
+ char z[1024];
+
+ LOG(("[ext_send_http_request] type: %d, method: %s, url: %s, cookies: %s, content length: %ld",
+ type, method, url, cookies, content_length));
+
+ if(!url_to_host_port_path(url, host, &port, path))
+ return;
+
+ fd = ext_connect(host, port, type);
+
+ if (fd < 0) {
+ LOG(("[ext_send_http_request] Can't connect?? Exiting..."));
+ //return;
+ } else {
+ nlhr.cbSize=sizeof(nlhr);
+ nlhr.requestType=(lstrcmpiA(method, "GET") == 0) ? REQUEST_GET : REQUEST_POST;
+ nlhr.flags=NLHRF_DUMPASTEXT|NLHRF_HTTP11;
+ nlhr.szUrl=(char *)path;
+ nlhr.headers = httpHeaders;
+ nlhr.headersCount = 3;
+
+ if (cookies != NULL && cookies[0] != '\0') {
+ httpHeaders[i].szName = "Cookie";
+ httpHeaders[i].szValue = (char *)cookies;
+ nlhr.headersCount = 4;
+ i++;
+ }
+
+ httpHeaders[i].szName = "User-Agent";
+ httpHeaders[i].szValue = "Mozilla/4.0 (compatible; MSIE 5.5)";
+ i++;
+
+ httpHeaders[i].szName = "Host";
+ httpHeaders[i].szValue = host;
+ i++;
+
+ if (nlhr.requestType == REQUEST_POST) {
+ httpHeaders[nlhr.headersCount].szName="Content-Length";
+ mir_snprintf(z, 1024, "%d", content_length);
+ httpHeaders[nlhr.headersCount].szValue=z;
+
+ nlhr.headersCount++;
+ }
+
+ httpHeaders[i].szName = "Cache-Control";
+ httpHeaders[i].szValue = "no-cache";
+ i++;
+
+ error = CallService(MS_NETLIB_SENDHTTPREQUEST,(WPARAM)fd,(LPARAM)&nlhr);
+ }
+
+ callback(m_id, fd, error == SOCKET_ERROR, callback_data);
+}
+
+/*************************************
+ * Callback handling code starts here
+ */
+unsigned int CYahooProto::ext_add_handler(int fd, yahoo_input_condition cond, void *data)
+{
+ struct _conn *c = y_new0(struct _conn, 1);
+
+ c->tag = ++m_connection_tags;
+ c->id = m_id;
+ c->fd = fd;
+ c->cond = cond;
+ c->data = data;
+
+ LOG(("[ext_add_handler] fd:%d, id:%d, cond: %d, tag %d", fd, m_id, cond, c->tag));
+
+ m_connections = y_list_prepend(m_connections, c);
+
+ return c->tag;
+}
+
+void CYahooProto::ext_remove_handler(unsigned int tag)
+{
+ YList *l;
+
+ LOG(("[ext_remove_handler] id:%d tag:%d ", m_id, tag));
+
+ for(l = m_connections; l; l = y_list_next(l)) {
+ struct _conn *c = ( _conn* )l->data;
+ if(c->tag == tag) {
+ /* don't actually remove it, just mark it for removal */
+ /* we'll remove when we start the next poll cycle */
+ LOG(("Marking id:%d fd:%d tag:%d for removal", c->id, c->fd, c->tag));
+ c->remove = 1;
+ return;
+ }
+ }
+}
+
+struct connect_callback_data {
+ yahoo_connect_callback callback;
+ void * callback_data;
+ int id;
+ int tag;
+};
+
+void ext_yahoo_remove_handler(int id, unsigned int tag);
+
+static void connect_complete(void *data, int source, yahoo_input_condition condition)
+{
+ struct connect_callback_data *ccd = ( connect_callback_data* )data;
+ int error = 0;//, err_size = sizeof(error);
+ NETLIBSELECT tSelect = {0};
+
+ ext_yahoo_remove_handler(ccd->id, ccd->tag);
+
+ // We Need to read the Socket error
+ //getsockopt(source, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&err_size);
+
+ tSelect.cbSize = sizeof( tSelect );
+ //tSelect.dwTimeout = T->mGatewayTimeout * 1000;
+ tSelect.dwTimeout = 1;
+ tSelect.hReadConns[ 0 ] = ( HANDLE )source;
+ error = YAHOO_CallService( MS_NETLIB_SELECT, 0, ( LPARAM )&tSelect );
+
+ if(error) {
+ //close(source);
+ Netlib_CloseHandle((HANDLE)source);
+ source = -1;
+ }
+
+ LOG(("Connected fd: %d, error: %d", source, error));
+
+ ccd->callback(source, error, ccd->callback_data);
+ FREE(ccd);
+}
+
+void yahoo_callback(struct _conn *c, yahoo_input_condition cond)
+{
+ int ret=1;
+
+ //LOG(("[yahoo_callback] id: %d, fd: %d tag: %d", c->id, c->fd, c->tag));
+ if(c->id < 0) {
+ connect_complete(c->data, c->fd, cond);
+ } else if (c->fd > 0) {
+
+ if(cond & YAHOO_INPUT_READ)
+ ret = yahoo_read_ready(c->id, c->fd, c->data);
+ if(ret>0 && cond & YAHOO_INPUT_WRITE)
+ ret = yahoo_write_ready(c->id, c->fd, c->data);
+
+ if (ret == -1) {
+ LOG(("Yahoo read error (%d): %s", errno, strerror(errno)));
+ } else if(ret == 0)
+ LOG(("Yahoo read error: Server closed socket"));
+ }
+
+ //LOG(("[yahoo_callback] id: %d exiting...", c->id));
+}
+
+int CYahooProto::ext_connect_async(const char *host, int port, int type, yahoo_connect_callback callback, void *data)
+{
+ int err = 0, res;
+
+ LOG(("[ext_connect_async] %s:%d type: %d", host, port, type));
+
+ res = ext_connect(host, port, type);
+
+ LOG(("[ext_connect_async] %s:%d type: %d, result: %d", host, port, type, res));
+
+ if (type == YAHOO_CONNECTION_PAGER && res < 1) {
+ err = 1;
+ }
+
+ /*
+ * need to call the callback so we could handle the failure condition!!!
+ * fd = -1 in case of an error
+ */
+ callback(res, err, data);
+
+ /*
+ * Return proper thing: 0 - ok, -1 - failed, >0 - pending connect
+ */
+ return (res <= 0) ? -1 : 0;
+}
+/*
+ * Callback handling code ends here
+ ***********************************/
+char * CYahooProto::ext_send_https_request(struct yahoo_data *yd, const char *host, const char *path)
+{
+ NETLIBHTTPREQUEST nlhr={0},*nlhrReply;
+ char z[4096], *result=NULL;
+ int i;
+
+ wsprintfA(z, "https://%s%s", host, path);
+ nlhr.cbSize = sizeof(nlhr);
+ nlhr.requestType= REQUEST_GET;
+ nlhr.flags = NLHRF_HTTP11 | NLHRF_NODUMPSEND | NLHRF_DUMPASTEXT; /* Use HTTP/1.1 and don't dump the requests to the log */
+ nlhr.szUrl = z;
+
+ nlhr.headersCount = 3;
+ nlhr.headers=(NETLIBHTTPHEADER*)mir_alloc(sizeof(NETLIBHTTPHEADER)*(nlhr.headersCount+5));
+ nlhr.headers[0].szName = "User-Agent";
+ nlhr.headers[0].szValue = "Mozilla/4.0 (compatible; MSIE 5.5)";
+ nlhr.headers[1].szName = "Cache-Control";
+ nlhr.headers[1].szValue = "no-cache";
+ nlhr.headers[2].szName = "Connection";
+ nlhr.headers[2].szValue = "close"; /*"Keep-Alive";*/
+
+ nlhrReply=(NETLIBHTTPREQUEST*)CallService(MS_NETLIB_HTTPTRANSACTION,(WPARAM)g_hNetlibUser,(LPARAM)&nlhr);
+ if(nlhrReply) {
+
+ if (nlhrReply->resultCode == 200 && nlhrReply->pData != NULL) {
+ result = strdup(nlhrReply->pData);
+ } else {
+ LOG(("[ext_send_https_request] Got result code: %d, content length: %d", nlhrReply->resultCode, nlhrReply->dataLength));
+ }
+
+ LOG(("Got %d headers!", nlhrReply->headersCount));
+
+ for (i=0; i < nlhrReply->headersCount; i++) {
+ //LOG(("%s: %s", nlhrReply->headers[i].szName, nlhrReply->headers[i].szValue));
+
+ if (lstrcmpiA(nlhrReply->headers[i].szName, "Set-Cookie") == 0) {
+ //LOG(("Found Cookie... Yum yum..."));
+
+ if (nlhrReply->headers[i].szValue[0] == 'B' && nlhrReply->headers[i].szValue[1] == '=') {
+
+ FREE(yd->cookie_b);
+ yd->cookie_b = getcookie(nlhrReply->headers[i].szValue);
+
+ LOG(("Got B Cookie: %s", yd->cookie_b));
+ }
+ }
+ }
+
+ CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,(LPARAM)nlhrReply);
+ } else {
+ LOG(("No Response???"));
+ }
+
+ mir_free(nlhr.headers);
+
+ return result;
+}
+
+void CYahooProto::ext_login(enum yahoo_status login_mode)
+{
+ char host[128], fthost[128], login_host[128];
+ int port=0;
+ DBVARIANT dbv;
+#ifdef HTTP_GATEWAY
+ NETLIBUSERSETTINGS nlus = { 0 };
+#endif
+
+ LOG(("[ext_login]"));
+
+ host[0] = '\0';
+
+ /**
+ * Implementing Yahoo 9 2 Stage Login using their VIP server/services
+ */
+ NETLIBHTTPREQUEST nlhr={0},*nlhrReply;
+ char z[4096];
+
+ wsprintfA(z, "http://%s%s", GetByte("YahooJapan",0) != 0 ? "cs1.msg.vip.ogk.yahoo.co.jp" : "vcs.msg.yahoo.com", "/capacity");
+ nlhr.cbSize = sizeof(nlhr);
+ nlhr.requestType= REQUEST_GET;
+ nlhr.flags = NLHRF_HTTP11;
+ nlhr.szUrl = z;
+
+ nlhrReply=(NETLIBHTTPREQUEST*)CallService(MS_NETLIB_HTTPTRANSACTION,(WPARAM)g_hNetlibUser,(LPARAM)&nlhr);
+ if(nlhrReply) {
+ if (nlhrReply->resultCode == 200 && nlhrReply->pData != NULL) {
+ char *c = strstr(nlhrReply->pData,"CS_IP_ADDRESS=");
+
+ if (c != NULL) {
+ char *t = c;
+
+ while ( (*t) != '=') t++; /* scan until = */
+ t++;
+
+ while ( (*c) != '\0' && (*c) != '\r' && (*c) != '\n') c++;
+
+ memcpy(host, t, c - t);
+ host[c - t] = '\0';
+
+ LOG(("Got Host: %s", host));
+ }
+ } else {
+ LOG(( "Problem retrieving a response from VIP server." ));
+ }
+
+ CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,(LPARAM)nlhrReply);
+ }
+
+ if (host[0] == '\0') {
+ if (!GetString(YAHOO_LOGINSERVER, &dbv)) {
+ mir_snprintf(host, sizeof(host), "%s", dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ else {
+ snprintf(host, sizeof(host), "%s",
+ GetByte("YahooJapan",0) != 0 ? YAHOO_DEFAULT_JAPAN_LOGIN_SERVER :
+ YAHOO_DEFAULT_LOGIN_SERVER
+ );
+ }
+ }
+
+ lstrcpynA(fthost,GetByte("YahooJapan",0)?"filetransfer.msg.yahoo.co.jp":"filetransfer.msg.yahoo.com" , sizeof(fthost));
+ lstrcpynA(login_host,GetByte("YahooJapan",0)?"login.yahoo.co.jp":"login.yahoo.com" , sizeof(login_host));
+ port = DBGetContactSettingWord(NULL, m_szModuleName, YAHOO_LOGINPORT, YAHOO_DEFAULT_PORT);
+
+#ifdef HTTP_GATEWAY
+ nlus.cbSize = sizeof( nlus );
+ if (CallService(MS_NETLIB_GETUSERSETTINGS, (WPARAM) hNetlibUser, (LPARAM) &nlus) == 0) {
+ LOG(("ERROR: Problem retrieving miranda network settings!!!"));
+ }
+
+ iHTTPGateway = (nlus.useProxy && nlus.proxyType == PROXYTYPE_HTTP) ? 1:0;
+ LOG(("Proxy Type: %d HTTP Gateway: %d", nlus.proxyType, iHTTPGateway));
+#endif
+
+ m_id = yahoo_init_with_attributes(m_yahoo_id, m_password, m_pw_token,
+ "pager_host", host,
+ "pager_port", port,
+ "filetransfer_host", fthost,
+ "picture_checksum", GetDword("AvatarHash", -1),
+#ifdef HTTP_GATEWAY
+ "web_messenger", iHTTPGateway,
+#endif
+ "login_host", login_host,
+ NULL);
+
+ m_status = YAHOO_STATUS_OFFLINE;
+ yahoo_login(m_id, login_mode);
+
+ if (m_id <= 0) {
+ LOG(("Could not connect to Yahoo server. Please verify that you are connected to the net and the pager host and port are correctly entered."));
+ ShowError(Translate("Yahoo Login Error"), Translate("Could not connect to Yahoo server. Please verify that you are connected to the net and the pager host and port are correctly entered."));
+ return;
+ }
+
+ //rearm(&pingTimer, 600);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// stubs
+
+CYahooProto* __fastcall getProtoById( int id )
+{
+ for ( int i=0; i < g_instances.getCount(); i++ )
+ if ( g_instances[i]->m_id == id )
+ return g_instances[i];
+
+ return NULL;
+}
+
+unsigned int ext_yahoo_add_handler(int id, int fd, yahoo_input_condition cond, void *data)
+{
+ CYahooProto* ppro = getProtoById( id );
+ if ( ppro )
+ return ppro->ext_add_handler(fd, cond, data);
+
+ return 0;
+}
+
+void ext_yahoo_remove_handler(int id, unsigned int tag)
+{
+ GETPROTOBYID( id )->ext_remove_handler(tag);
+}
+
+void ext_yahoo_status_changed(int id, const char *who, int protocol, int stat, const char *msg, int away, int idle, int mobile, int utf8)
+{
+ GETPROTOBYID( id )->ext_status_changed(who, protocol, stat, msg, away, idle, mobile, utf8);
+}
+
+void ext_yahoo_status_logon(int id, const char *who, int protocol, int stat, const char *msg, int away, int idle, int mobile, int cksum, int buddy_icon, long client_version, int utf8)
+{
+ GETPROTOBYID( id )->ext_status_logon(who, protocol, stat, msg, away, idle, mobile, cksum, buddy_icon, client_version, utf8);
+}
+
+void ext_yahoo_got_audible(int id, const char *me, const char *who, const char *aud, const char *msg, const char *aud_hash)
+{
+ GETPROTOBYID( id )->ext_got_audible(me, who, aud, msg, aud_hash);
+}
+
+void ext_yahoo_got_calendar(int id, const char *url, int type, const char *msg, int svc)
+{
+ GETPROTOBYID( id )->ext_got_calendar(url, type, msg, svc);
+}
+
+void ext_yahoo_got_stealth(int id, char *stealthlist)
+{
+ GETPROTOBYID( id )->ext_got_stealth(stealthlist);
+}
+
+void ext_yahoo_got_buddies(int id, YList * buds)
+{
+ GETPROTOBYID( id )->ext_got_buddies(buds);
+}
+
+void ext_yahoo_rejected(int id, const char *who, const char *msg)
+{
+ GETPROTOBYID( id )->ext_rejected(who, msg);
+}
+
+void ext_yahoo_buddy_added(int id, char *myid, char *who, char *group, int status, int auth)
+{
+ GETPROTOBYID( id )->ext_buddy_added(myid, who, group, status, auth);
+}
+
+void ext_yahoo_buddy_group_changed(int id, char *myid, char *who, char *old_group, char *new_group)
+{
+ LOG(("[ext_yahoo_buddy_group_changed] %s has been moved from group: %s to: %s", who, old_group, new_group));
+}
+
+void ext_yahoo_contact_added(int id, const char *myid, const char *who, const char *fname, const char *lname, const char *msg, int protocol)
+{
+ GETPROTOBYID( id )->ext_contact_added(myid, who, fname, lname, msg, protocol);
+}
+
+void ext_yahoo_typing_notify(int id, const char *me, const char *who, int protocol, int stat)
+{
+ GETPROTOBYID( id )->ext_typing_notify(me, who, protocol, stat);
+}
+
+void ext_yahoo_game_notify(int id, const char *me, const char *who, int stat, const char *msg)
+{
+ GETPROTOBYID( id )->ext_game_notify(me, who, stat, msg);
+}
+
+void ext_yahoo_mail_notify(int id, const char *from, const char *subj, int cnt)
+{
+ GETPROTOBYID( id )->ext_mail_notify(from, subj, cnt);
+}
+
+void ext_yahoo_system_message(int id, const char *me, const char *who, const char *msg)
+{
+ GETPROTOBYID( id )->ext_system_message(me, who, msg);
+}
+
+void ext_yahoo_got_identities(int id, const char *nick, const char *fname, const char *lname, YList * ids)
+{
+ GETPROTOBYID( id )->ext_got_identities(nick, fname, lname, ids);
+}
+
+void ext_yahoo_got_ping(int id, const char *errormsg)
+{
+ GETPROTOBYID( id )->ext_got_ping(errormsg);
+}
+
+void ext_yahoo_error(int id, const char *err, int fatal, int num)
+{
+ GETPROTOBYID( id )->ext_error(err, fatal, num);
+}
+
+void ext_yahoo_login_response(int id, int succ, const char *url)
+{
+ GETPROTOBYID( id )->ext_login_response(succ, url);
+}
+
+void ext_yahoo_got_im(int id, const char *me, const char *who, int protocol, const char *msg, long tm, int stat, int utf8, int buddy_icon, const char *seqn, int sendn)
+{
+ GETPROTOBYID( id )->ext_got_im(me, who, protocol, msg, tm, stat, utf8, buddy_icon, seqn, sendn);
+}
+
+void ext_yahoo_got_search_result(int id, int found, int start, int total, YList *contacts)
+{
+ GETPROTOBYID( id )->ext_got_search_result(found, start, total, contacts);
+}
+
+void ext_yahoo_got_picture(int id, const char *me, const char *who, const char *pic_url, int cksum, int type)
+{
+ GETPROTOBYID( id )->ext_got_picture(me, who, pic_url, cksum, type);
+}
+
+void ext_yahoo_got_picture_checksum(int id, const char *me, const char *who, int cksum)
+{
+ GETPROTOBYID( id )->ext_got_picture_checksum(me, who, cksum);
+}
+
+void ext_yahoo_got_picture_update(int id, const char *me, const char *who, int buddy_icon)
+{
+ GETPROTOBYID( id )->ext_got_picture_update(me, who, buddy_icon);
+}
+
+void ext_yahoo_got_picture_status(int id, const char *me, const char *who, int buddy_icon)
+{
+ GETPROTOBYID( id )->ext_got_picture_status(me, who, buddy_icon);
+}
+
+void ext_yahoo_got_picture_upload(int id, const char *me, const char *url,unsigned int ts)
+{
+ GETPROTOBYID( id )->ext_got_picture_upload(me, url, ts);
+}
+
+void ext_yahoo_got_avatar_share(int id, int buddy_icon)
+{
+ GETPROTOBYID( id )->ext_got_avatar_share(buddy_icon);
+}
+
+void ext_yahoo_got_file(int id, const char *me, const char *who, const char *url, long expires, const char *msg, const char *fname, unsigned long fesize, const char *ft_token, int y7)
+{
+ GETPROTOBYID( id )->ext_got_file(me, who, url, expires, msg, fname, fesize, ft_token, y7);
+}
+
+void ext_yahoo_got_files(int id, const char *me, const char *who, const char *ft_token, int y7, YList* files)
+{
+ GETPROTOBYID( id )->ext_got_files(me, who, ft_token, y7, files);
+}
+
+void ext_yahoo_got_file7info(int id, const char *me, const char *who, const char *url, const char *fname, const char *ft_token)
+{
+ GETPROTOBYID( id )->ext_got_file7info(me, who, url, fname, ft_token);
+}
+
+void ext_yahoo_ft7_send_file(int id, const char *me, const char *who, const char *filename, const char *token, const char *ft_token)
+{
+ GETPROTOBYID( id )->ext_ft7_send_file(me, who, filename, token, ft_token);
+}
+
+int ext_yahoo_connect_async(int id, const char *host, int port, int type, yahoo_connect_callback callback, void *data)
+{
+ CYahooProto* ppro = getProtoById( id );
+ if ( ppro )
+ return ppro->ext_connect_async(host, port, type, callback, data);
+ return SOCKET_ERROR;
+}
+
+void ext_yahoo_send_http_request(int id, enum yahoo_connection_type type, const char *method, const char *url, const char *cookies, long content_length, yahoo_get_fd_callback callback, void *callback_data)
+{
+ GETPROTOBYID( id )->ext_send_http_request(type, method, url, cookies, content_length, callback, callback_data);
+}
+
+char *ext_yahoo_send_https_request(struct yahoo_data *yd, const char *host, const char *path)
+{
+ CYahooProto* ppro = getProtoById( yd->client_id );
+ if ( ppro )
+ return ppro->ext_send_https_request(yd, host, path);
+ return NULL;
+}
+
+void ext_yahoo_got_ignore(int id, YList * igns)
+{
+ GETPROTOBYID( id )->ext_got_ignore( igns );
+}
+
+void register_callbacks()
+{
+ static struct yahoo_callbacks yc;
+
+ yc.ext_yahoo_login_response = ext_yahoo_login_response;
+ yc.ext_yahoo_got_buddies = ext_yahoo_got_buddies;
+ yc.ext_yahoo_got_ignore = ext_yahoo_got_ignore;
+ yc.ext_yahoo_got_identities = ext_yahoo_got_identities;
+ yc.ext_yahoo_got_cookies = ext_yahoo_got_cookies;
+ yc.ext_yahoo_status_changed = ext_yahoo_status_changed;
+ yc.ext_yahoo_status_logon = ext_yahoo_status_logon;
+ yc.ext_yahoo_got_im = ext_yahoo_got_im;
+ yc.ext_yahoo_got_conf_invite = ext_yahoo_got_conf_invite;
+ yc.ext_yahoo_conf_userdecline = ext_yahoo_conf_userdecline;
+ yc.ext_yahoo_conf_userjoin = ext_yahoo_conf_userjoin;
+ yc.ext_yahoo_conf_userleave = ext_yahoo_conf_userleave;
+ yc.ext_yahoo_conf_message = ext_yahoo_conf_message;
+ yc.ext_yahoo_chat_cat_xml = ext_yahoo_chat_cat_xml;
+ yc.ext_yahoo_chat_join = ext_yahoo_chat_join;
+ yc.ext_yahoo_chat_userjoin = ext_yahoo_chat_userjoin;
+ yc.ext_yahoo_chat_userleave = ext_yahoo_chat_userleave;
+ yc.ext_yahoo_chat_message = ext_yahoo_chat_message;
+ yc.ext_yahoo_chat_yahoologout = ext_yahoo_chat_yahoologout;
+ yc.ext_yahoo_chat_yahooerror = ext_yahoo_chat_yahooerror;
+ yc.ext_yahoo_got_webcam_image = ext_yahoo_got_webcam_image;
+ yc.ext_yahoo_webcam_invite = ext_yahoo_webcam_invite;
+ yc.ext_yahoo_webcam_invite_reply = ext_yahoo_webcam_invite_reply;
+ yc.ext_yahoo_webcam_closed = ext_yahoo_webcam_closed;
+ yc.ext_yahoo_webcam_viewer = ext_yahoo_webcam_viewer;
+ yc.ext_yahoo_webcam_data_request = ext_yahoo_webcam_data_request;
+ yc.ext_yahoo_got_file = ext_yahoo_got_file;
+ yc.ext_yahoo_got_files = ext_yahoo_got_files;
+ yc.ext_yahoo_got_file7info = ext_yahoo_got_file7info;
+ yc.ext_yahoo_send_file7info = ext_yahoo_send_file7info;
+ yc.ext_yahoo_ft7_send_file = ext_yahoo_ft7_send_file;
+ yc.ext_yahoo_contact_added = ext_yahoo_contact_added;
+ yc.ext_yahoo_rejected = ext_yahoo_rejected;
+ yc.ext_yahoo_typing_notify = ext_yahoo_typing_notify;
+ yc.ext_yahoo_game_notify = ext_yahoo_game_notify;
+ yc.ext_yahoo_mail_notify = ext_yahoo_mail_notify;
+ yc.ext_yahoo_got_search_result = ext_yahoo_got_search_result;
+ yc.ext_yahoo_system_message = ext_yahoo_system_message;
+ yc.ext_yahoo_error = ext_yahoo_error;
+ yc.ext_yahoo_log = YAHOO_DEBUGLOG;
+ yc.ext_yahoo_add_handler = ext_yahoo_add_handler;
+ yc.ext_yahoo_remove_handler = ext_yahoo_remove_handler;
+ //yc.ext_yahoo_connect = ext_yahoo_connect; not needed in fact
+ yc.ext_yahoo_connect_async = ext_yahoo_connect_async;
+ yc.ext_yahoo_send_http_request = ext_yahoo_send_http_request;
+
+ yc.ext_yahoo_got_stealthlist = ext_yahoo_got_stealth;
+ yc.ext_yahoo_got_ping = ext_yahoo_got_ping;
+ yc.ext_yahoo_got_picture = ext_yahoo_got_picture;
+ yc.ext_yahoo_got_picture_checksum = ext_yahoo_got_picture_checksum;
+ yc.ext_yahoo_got_picture_update = ext_yahoo_got_picture_update;
+ yc.ext_yahoo_got_avatar_share = ext_yahoo_got_avatar_share;
+
+ yc.ext_yahoo_buddy_added = ext_yahoo_buddy_added;
+ yc.ext_yahoo_got_picture_upload = ext_yahoo_got_picture_upload;
+ yc.ext_yahoo_got_picture_status = ext_yahoo_got_picture_status;
+ yc.ext_yahoo_got_audible = ext_yahoo_got_audible;
+ yc.ext_yahoo_got_calendar = ext_yahoo_got_calendar;
+ yc.ext_yahoo_buddy_group_changed = ext_yahoo_buddy_group_changed;
+
+ yc.ext_yahoo_send_https_request = ext_yahoo_send_https_request;
+
+ yahoo_register_callbacks(&yc);
+}
diff --git a/protocols/Yahoo/yahoo.dev b/protocols/Yahoo/yahoo.dev
new file mode 100644
index 0000000000..4eb9281685
--- /dev/null
+++ b/protocols/Yahoo/yahoo.dev
@@ -0,0 +1,539 @@
+[Project]
+FileName=yahoo.dev
+Name=yahoo
+UnitCount=48
+Type=3
+Ver=1
+ObjFiles=
+Includes=
+Libs=
+PrivateResource=yahoo_private.rc
+ResourceIncludes=
+MakeIncludes=
+Compiler=-DBUILDING_DLL=1_@@_-DHAVE_CONFIG_H_@@_-DUSE_STRUCT_CALLBACKS_@@__@@_
+CppCompiler=
+Linker=--no-export-all-symbols --add-stdcall-alias_@@__@@_
+IsCpp=0
+Icon=
+ExeOutput=Build
+ObjectOutput=Build
+OverrideOutput=0
+OverrideOutputName=yahoo.dll
+HostApplication=
+Folders=Docs,Icones,LibYahoo2,LibYahoo2/Docs,"Yahoo Plugin"
+CommandLine=
+IncludeVersionInfo=0
+SupportXPThemes=0
+CompilerSet=0
+CompilerSettings=0000001000001000000
+UseCustomMakefile=0
+CustomMakefile=
+
+[VersionInfo]
+Major=0
+Minor=1
+Release=1
+Build=1
+LanguageID=1033
+CharsetID=1252
+CompanyName=
+FileVersion=
+FileDescription=Developed using the Dev-C++ IDE
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=
+AutoIncBuildNr=0
+
+[Unit9]
+FileName=services.c
+CompileCpp=0
+Folder=Yahoo Plugin
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit10]
+FileName=utf8.c
+CompileCpp=0
+Folder=Yahoo Plugin
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit11]
+FileName=utf8.h
+CompileCpp=0
+Folder=Yahoo Plugin
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit14]
+FileName=yahoo.h
+CompileCpp=0
+Folder=Yahoo Plugin
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit17]
+FileName=Docs\ReadMe.txt
+CompileCpp=0
+Folder=Docs
+Compile=0
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit18]
+FileName=Docs\ToCheck.txt
+CompileCpp=0
+Folder=Docs
+Compile=0
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit19]
+FileName=Docs\ToDo.txt
+CompileCpp=0
+Folder=Docs
+Compile=0
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit20]
+FileName=icos\inbox.ico
+CompileCpp=0
+Folder=Icones
+Compile=0
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit22]
+FileName=icos\yahoo.ico
+CompileCpp=0
+Folder=Icones
+Compile=0
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit23]
+FileName=libyahoo2\yahoo_httplib.h
+CompileCpp=0
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit24]
+FileName=libyahoo2\yahoo_list.c
+CompileCpp=0
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit25]
+FileName=libyahoo2\yahoo_list.h
+CompileCpp=0
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit26]
+FileName=libyahoo2\yahoo_util.c
+CompileCpp=0
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit27]
+FileName=libyahoo2\yahoo_util.h
+CompileCpp=0
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit29]
+FileName=libyahoo2\crypt.c
+CompileCpp=0
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit30]
+FileName=libyahoo2\libyahoo2.c
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+CompileCpp=0
+
+[Unit31]
+FileName=libyahoo2\md5.c
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+CompileCpp=0
+
+[Unit33]
+FileName=libyahoo2\sha.c
+CompileCpp=0
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit34]
+FileName=libyahoo2\sha.h
+CompileCpp=0
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit35]
+FileName=libyahoo2\yahoo2.h
+CompileCpp=0
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit36]
+FileName=libyahoo2\yahoo2_callbacks.h
+CompileCpp=0
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit1]
+FileName=http_gateway.c
+CompileCpp=0
+Folder=Yahoo Plugin
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit2]
+FileName=http_gateway.h
+CompileCpp=0
+Folder=Yahoo Plugin
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit3]
+FileName=main.c
+CompileCpp=0
+Folder=Yahoo Plugin
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit4]
+FileName=options.c
+CompileCpp=0
+Folder=Yahoo Plugin
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit5]
+FileName=pthread.c
+CompileCpp=0
+Folder=Yahoo Plugin
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit6]
+FileName=pthread.h
+CompileCpp=0
+Folder=Yahoo Plugin
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit7]
+FileName=resource.h
+CompileCpp=0
+Folder=Yahoo Plugin
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit8]
+FileName=server.c
+CompileCpp=0
+Folder=Yahoo Plugin
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit12]
+FileName=util.c
+CompileCpp=0
+Folder=Yahoo Plugin
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit13]
+FileName=yahoo.c
+CompileCpp=0
+Folder=Yahoo Plugin
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit15]
+FileName=Yahoo.rc
+Folder=Yahoo Plugin
+Compile=1
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit21]
+FileName=icos\invite.ico
+Folder=Icones
+Compile=0
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit28]
+FileName=libyahoo2\config.h
+CompileCpp=0
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit32]
+FileName=libyahoo2\md5.h
+CompileCpp=0
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit37]
+FileName=libyahoo2\yahoo2_types.h
+CompileCpp=0
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit38]
+FileName=libyahoo2\yahoo_debug.h
+CompileCpp=0
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit39]
+FileName=libyahoo2\yahoo_fn.c
+CompileCpp=0
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit40]
+FileName=libyahoo2\yahoo_fn.h
+CompileCpp=0
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit41]
+FileName=libyahoo2\yahoo_httplib.c
+CompileCpp=0
+Folder=LibYahoo2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit42]
+FileName=libyahoo2\Docs\AUTHORS
+CompileCpp=0
+Folder=LibYahoo2/Docs
+Compile=0
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit43]
+FileName=libyahoo2\Docs\ChangeLog
+CompileCpp=0
+Folder=LibYahoo2/Docs
+Compile=0
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit44]
+FileName=libyahoo2\Docs\COPYING
+Folder=LibYahoo2/Docs
+Compile=0
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit45]
+FileName=libyahoo2\Docs\NEWS
+Folder=LibYahoo2/Docs
+Compile=0
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit46]
+FileName=libyahoo2\Docs\README
+Folder=LibYahoo2/Docs
+Compile=0
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit47]
+FileName=libyahoo2\Docs\TODO
+Folder=LibYahoo2/Docs
+Compile=0
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit48]
+FileName=libyahoo2\Docs\ymsg-9.txt
+Folder=LibYahoo2/Docs
+Compile=0
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit49]
+FileName=libyahoo2\Docs\TODO
+Folder=LibYahoo2/Docs
+Compile=0
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit50]
+FileName=libyahoo2\Docs\ymsg-9.txt
+Folder=LibYahoo2/Docs
+Compile=0
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit16]
+FileName=Docs\Feature.txt
+Folder=Docs
+Compile=0
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
diff --git a/protocols/Yahoo/yahoo.h b/protocols/Yahoo/yahoo.h
new file mode 100644
index 0000000000..ec11ecb520
--- /dev/null
+++ b/protocols/Yahoo/yahoo.h
@@ -0,0 +1,155 @@
+/*
+ * $Id: yahoo.h 14085 2012-02-13 10:55:56Z george.hazan $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+#ifndef _YAHOO_YAHOO_H_
+#define _YAHOO_YAHOO_H_
+
+#define MIRANDA_VER 0x0A00
+
+extern "C"
+{
+ extern struct MD5_INTERFACE md5i;
+ extern struct tagPLUGINLINK* pluginLink;
+};
+
+#ifdef _MSC_VER
+ #define snprintf _snprintf
+#endif
+
+#include <m_stdhdr.h>
+
+#include <sys/stat.h>
+#include <io.h>
+#include <time.h>
+
+#include <windows.h>
+
+/*
+ * Yahoo Services
+ */
+#define USE_STRUCT_CALLBACKS
+
+#include "libyahoo2/yahoo2.h"
+#include "libyahoo2/yahoo2_callbacks.h"
+#include "libyahoo2/yahoo_util.h"
+
+extern "C"
+{
+ #include <newpluginapi.h>
+ #include <m_system.h>
+};
+
+#include <m_system_cpp.h>
+#include <m_database.h>
+#include <m_protomod.h>
+#include <m_netlib.h>
+#include <m_clist.h>
+#include <m_clistint.h>
+#include <m_protosvc.h>
+#include <m_protoint.h>
+#include <m_langpack.h>
+#include <win2k.h>
+
+//=======================================================
+// Definitions
+//=======================================================
+// Build is a cvs build
+//
+// If defined, the build will add cvs info to the plugin info
+#define YAHOO_CVSBUILD
+
+#define YAHOO_LOGINSERVER "LoginServer"
+#define YAHOO_LOGINPORT "LoginPort"
+#define YAHOO_LOGINID "yahoo_id"
+#define YAHOO_PASSWORD "Password"
+#define YAHOO_PWTOKEN "PWToken"
+#define YAHOO_CHECKMAIL "CheckMail"
+#define YAHOO_CUSTSTATDB "CustomStat"
+#define YAHOO_DEFAULT_PORT 5050
+#define YAHOO_DEFAULT_LOGIN_SERVER "mcs.msg.yahoo.com"
+#define YAHOO_DEFAULT_JAPAN_LOGIN_SERVER "cs.yahoo.co.jp"
+#define YAHOO_CUSTOM_STATUS 99
+
+#define YAHOO_DEBUGLOG DebugLog
+
+extern int do_yahoo_debug;
+
+#define LOG(x) if(do_yahoo_debug) { YAHOO_DEBUGLOG("%s:%d: ", __FILE__, __LINE__); \
+ YAHOO_DEBUGLOG x; \
+ YAHOO_DEBUGLOG(" ");}
+
+#define YAHOO_SET_CUST_STAT "/SetCustomStatCommand"
+#define YAHOO_EDIT_MY_PROFILE "/YahooEditMyProfileCommand"
+#define YAHOO_SHOW_PROFILE "/YahooShowProfileCommand"
+#define YAHOO_SHOW_MY_PROFILE "/YahooShowMyProfileCommand"
+#define YAHOO_YAHOO_MAIL "/YahooGotoMailboxCommand"
+#define YAHOO_REFRESH "/YahooRefreshCommand"
+#define YAHOO_AB "/YahooAddressBook"
+#define YAHOO_CALENDAR "/YahooCalendar"
+#define YAHOO_SEND_NUDGE "/SendNudge"
+#define YAHOO_GETUNREAD_EMAILCOUNT "/GetUnreadEmailCount"
+
+#define STYLE_DEFAULTBGCOLOUR RGB(173,206,247)
+
+#define LocalEventUnhook(hook) if(hook) UnhookEvent(hook)
+#define NEWSTR_ALLOCA(A) (A==NULL)?NULL:strcpy((char*)alloca(strlen(A)+1),A)
+
+struct _conn {
+ unsigned int tag;
+ int id;
+ int fd;
+ yahoo_input_condition cond;
+ void *data;
+ int remove;
+};
+
+#include "proto.h"
+
+//=======================================================
+// Defines
+//=======================================================
+extern HINSTANCE hInstance;
+
+#ifdef HTTP_GATEWAY
+extern int iHTTPGateway;
+#endif
+
+INT_PTR __stdcall YAHOO_CallService( const char* szSvcName, WPARAM wParam, LPARAM lParam );
+
+#define YAHOO_hasnotification() ServiceExists(MS_CLIST_SYSTRAY_NOTIFY)
+
+int YAHOO_util_dbsettingchanged(WPARAM wParam, LPARAM lParam);
+
+//Services.c
+int SetStatus(WPARAM wParam,LPARAM lParam);
+int GetStatus(WPARAM wParam,LPARAM lParam);
+
+yahoo_status miranda_to_yahoo(int myyahooStatus);
+
+void register_callbacks();
+char* YAHOO_GetContactName(HANDLE hContact);
+
+#ifdef __GNUC__
+ int DebugLog( const char *fmt, ... ) __attribute__ ((format (printf, 1, 2)));
+#else
+ int DebugLog( const char *fmt, ... );
+#endif
+
+void SetButtonCheck(HWND hwndDlg, int CtrlID, BOOL bCheck);
+
+char * yahoo_status_code(enum yahoo_status s);
+void yahoo_callback(struct _conn *c, yahoo_input_condition cond);
+
+CYahooProto* __fastcall getProtoById( int id );
+#define GETPROTOBYID(A) CYahooProto* ppro = getProtoById(A); if ( ppro ) ppro
+
+#endif
diff --git a/protocols/Yahoo/yahoo.mdsp b/protocols/Yahoo/yahoo.mdsp
new file mode 100644
index 0000000000..070f815f5a
--- /dev/null
+++ b/protocols/Yahoo/yahoo.mdsp
@@ -0,0 +1,145 @@
+[Project]
+name=Yahoo
+type=2
+defaultConfig=1
+
+
+[Debug]
+// compiler
+workingDirectory=
+arguments=
+intermediateFilesDirectory=Debug
+outputFilesDirectory=Debug
+compilerPreprocessor=
+extraCompilerOptions=-DHAVE_CONFIG_H -DUNICODE -D_UNICODE
+compilerIncludeDirectory=..\..\include
+noWarning=0
+defaultWarning=1
+allWarning=1
+extraWarning=0
+isoWarning=0
+warningsAsErrors=0
+debugType=1
+debugLevel=2
+exceptionEnabled=0
+runtimeTypeEnabled=0
+optimizeLevel=0
+
+// linker
+libraryPath=
+outputFilename=..\..\Bin\Release\Plugins\Yahoo.dll
+libraries=comdlg32,gdi32,wsock32
+extraLinkerOptions=
+ignoreStartupFile=0
+ignoreDefaultLibs=0
+stripExecutableFile=0
+
+// archive
+extraArchiveOptions=
+
+//resource
+resourcePreprocessor=
+resourceIncludeDirectory=
+extraResourceOptions=
+
+[Release]
+// compiler
+workingDirectory=
+arguments=
+intermediateFilesDirectory=Release
+outputFilesDirectory=Release
+compilerPreprocessor=
+extraCompilerOptions=-DHAVE_CONFIG_H -DUNICODE -D_UNICODE
+compilerIncludeDirectory=..\..\include
+noWarning=0
+defaultWarning=1
+allWarning=1
+extraWarning=0
+isoWarning=0
+warningAsErrors=0
+debugType=0
+debugLevel=1
+exceptionEnabled=0
+runtimeTypeEnabled=0
+optimizeLevel=2
+
+// linker
+libraryPath=
+outputFilename=..\..\Bin\Release\Plugins\Yahoo.dll
+libraries=comdlg32,gdi32,wsock32
+extraLinkerOptions=-Wl,-Map,Release\\yahoo.map
+ignoreStartupFile=0
+ignoreDefaultLibs=0
+stripExecutableFile=1
+
+// archive
+extraArchiveOptions=
+
+//resource
+resourcePreprocessor=
+resourceIncludeDirectory=
+extraResourceOptions=
+
+[Source]
+1=http_gateway.cpp
+2=main.cpp
+3=options.cpp
+4=server.cpp
+5=services.cpp
+6=util.cpp
+7=yahoo.cpp
+8=libyahoo2\crypt.c
+9=libyahoo2\libyahoo2.c
+10=libyahoo2\yahoo_httplib.c
+11=libyahoo2\yahoo_list.c
+12=libyahoo2\yahoo_util.c
+13=avatar.cpp
+14=chat.cpp
+15=webcam.cpp
+16=file_transfer.cpp
+17=im.cpp
+18=search.cpp
+19=icolib.cpp
+20=ignore.cpp
+21=proto.cpp
+22=user_info.cpp
+[Header]
+1=http_gateway.h
+2=resource.h
+3=yahoo.h
+4=libyahoo2\config.h
+5=libyahoo2\yahoo2.h
+6=libyahoo2\yahoo2_callbacks.h
+7=libyahoo2\yahoo2_types.h
+8=libyahoo2\yahoo_debug.h
+9=libyahoo2\yahoo_httplib.h
+10=libyahoo2\yahoo_list.h
+11=libyahoo2\yahoo_util.h
+12=version.h
+13=avatar.h
+14=chat.h
+15=webcam.h
+16=file_transfer.h
+17=im.h
+18=search.h
+19=options.h
+20=ignore.h
+21=proto.h
+22=m_folders.h
+[Resource]
+1=Yahoo.rc
+[Other]
+1=libyahoo2\Docs\AUTHORS
+2=libyahoo2\Docs\COPYING
+3=libyahoo2\Docs\ChangeLog
+4=libyahoo2\Docs\NEWS
+5=libyahoo2\Docs\README
+6=libyahoo2\Docs\TODO
+7=libyahoo2\Docs\ymsg-9.txt
+[History]
+yahoo.cpp,40909
+avatar.cpp,181
+..\MSN\msn_proto.cpp,6288
+..\MSN\msn_misc.cpp,7236
+file_transfer.cpp,1125
+libyahoo2\libyahoo2.c,82003